@hunsu/bridge 0.1.2 → 0.2.0-next.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +27 -0
- package/dist/cli.js +155 -69
- package/dist/index.d.ts +114 -1001
- package/dist/index.js +155 -7702
- package/package.json +16 -9
- package/dist/cli.d.ts +0 -2
- package/dist/execute/execute-model.d.ts +0 -50
- package/dist/execute/execute-model.js +0 -17
- package/dist/execute/execute-workflow.d.ts +0 -27
- package/dist/execute/execute-workflow.js +0 -65
- package/dist/execute/execution-plan.d.ts +0 -6
- package/dist/execute/execution-plan.js +0 -337
- package/src/cli.ts +0 -82
- package/src/execute/execute-model.ts +0 -72
- package/src/execute/execute-workflow.ts +0 -115
- package/src/execute/execution-plan.ts +0 -379
- package/src/index.ts +0 -9685
package/dist/cli.js
CHANGED
|
@@ -1,70 +1,156 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { startStudioBridge } from "./index.js";
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
return 0;
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
function
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
function
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
process.exitCode = code;
|
|
67
|
-
}).
|
|
68
|
-
console.error(error instanceof Error ? error.message : String(error));
|
|
69
|
-
|
|
70
|
-
});
|
|
2
|
+
var Le="[redacted]",sf=new Set(["hunsuBridgeToken","hunsuRelayToken","token","access_token","refresh_token","authorization","controlToken","bridgeControlToken","code","state"].map(e=>e.toLowerCase())),af=["hunsuBridgeToken","hunsuRelayToken","access_token","refresh_token","authorization","controlToken","bridgeControlToken","token","code","state"].join("|"),Wk=[af,"apiKey","accessToken","refreshToken","authToken","bridgeAuthToken","controlToken","bridgeControlToken","OPENAI_API_KEY","CODEX_ACCESS_TOKEN"].join("|"),Gk=/([?&])([^=&#\s"'<>\\]+)=([^&#\s"'<>\\]*)/giu,qk=new RegExp(`((?:%3f|%26)(?:${af})(?:%3d|=))((?:(?!%26|%23)[^\\s"'<>\\\\])+)`,"giu"),Vk=/("(?:[^"\\]*(?:token|secret|api.?key|authorization|credential|auth\.json|password|cookie)[^"\\]*)"\s*:\s*)("(?:\\.|[^"\\])*"|[^,}\]\s]+)/giu,Jk=new RegExp(`(^|[\\s,;])(${Wk})(\\s*=\\s*)(?:Bearer\\s+)?[^\\s,;&]+`,"gimu");function df(e){return e.replace(Gk,(t,r,n,o)=>{let i=Kk(n);return sf.has(i)?`${r}${n}=${ff(o)}`:t})}function xo(e){let t=zk(e);return t!==void 0?t:df(e).replace(qk,(r,n,o)=>`${n}${ff(o)}`).replace(/sk-[A-Za-z0-9_-]{10,}/gu,Le).replace(/\bhunsu_bridge_[A-Za-z0-9_-]+\b/giu,Le).replace(/\bhunsu_control_[A-Za-z0-9_-]+\b/giu,Le).replace(/(OPENAI_API_KEY|CODEX_ACCESS_TOKEN)(\s*=\s*)(?:"[^"]*"|'[^']*'|\S+)/giu,`$1$2${Le}`).replace(/~\/\.codex\/auth\.json/giu,Le).replace(Vk,`$1"${Le}"`).replace(Jk,(r,n,o,i)=>`${n}${o}${i}${Le}`).replace(/(Bearer\s+)(?!\[redacted\])[^\s,"'\\]+/giu,`$1${Le}`)}function Re(e){return Md(e,new WeakSet)}function or(e){uf(e,new WeakSet)}function Md(e,t){if(typeof e=="string")return xo(e);if(Array.isArray(e)){if(t.has(e))return"[circular]";t.add(e);let n=e.map((o,i)=>mf(e[i-1])?Le:Md(o,t));return t.delete(e),n}if(typeof e!="object"||e===null)return e;if(e instanceof Date)return e.toISOString();if(t.has(e))return"[circular]";t.add(e);let r={};for(let[n,o]of Object.entries(e))r[n]=lf(n,o)?Le:Md(o,t);return t.delete(e),r}function uf(e,t){if(typeof e=="string"){if(xo(e)!==e)throw _d();return}if(!(typeof e!="object"||e===null||e instanceof Date)&&!t.has(e)){t.add(e);for(let[r,[n,o]]of Object.entries(e).entries()){if(Array.isArray(e)&&mf(e[r-1])&&o!==Le||lf(n,o)&&o!==Le)throw _d();uf(o,t)}t.delete(e)}}function zk(e){let t=e.trim();if(!(!(t.startsWith("{")&&t.endsWith("}"))&&!(t.startsWith("[")&&t.endsWith("]"))))try{let r=JSON.parse(t);if(typeof r!="object"||r===null)return;let n=Re(r);return JSON.stringify(r)===JSON.stringify(n)?void 0:JSON.stringify(n)}catch{return}}function Kk(e){let t=e.replace(/^amp;/iu,"");try{return decodeURIComponent(t.replace(/\+/gu," ")).toLowerCase()}catch{return t.toLowerCase()}}function cf(e){return/token|secret|api.?key|authorization|credential|auth\.json|password|cookie/iu.test(e)}function lf(e,t){return!(e==="credentialsPresent"&&typeof t=="boolean")&&cf(e)}function mf(e){if(typeof e!="string"||!/^--?[^=]+$/u.test(e))return!1;let t=e.replace(/^--?/u,"").replace(/[-_]/gu,"");return cf(t)||sf.has(t.toLowerCase())}function ff(e){return Xk(e)?e:Le}function Xk(e){if(e.toLowerCase()===Le)return!0;try{return decodeURIComponent(e).toLowerCase()===Le}catch{return!1}}function _d(){return new Error("Diagnostics contain sensitive data.")}import{randomBytes as kB}from"node:crypto";import{mkdir as IB}from"node:fs/promises";import{isAbsolute as wB,resolve as EB}from"node:path";import{homedir as Yk}from"node:os";import{join as Qk,resolve as vf}from"node:path";var Co="127.0.0.1";var Zk="https://hunsu.app/studio",fs={bridgeApi:{name:"bridgeApi",defaultHost:Co,hostEnv:["HUNSU_BRIDGE_HOST","HOST"],defaultPort:19687,portEnv:["HUNSU_BRIDGE_PORT","PORT"],reserved:!1,allowPortZero:!0},studioWeb:{name:"studioWeb",defaultHost:Co,hostEnv:["HUNSU_WEB_HOST"],defaultPort:19688,portEnv:["HUNSU_WEB_PORT"],reserved:!1,allowPortZero:!1},agentPreview:{name:"agentPreview",defaultHost:Co,hostEnv:["HUNSU_AGENT_PREVIEW_HOST"],defaultPort:19673,portEnv:["HUNSU_AGENT_PREVIEW_PORT"],reserved:!0,allowPortZero:!1},relay:{name:"relay",defaultHost:Co,hostEnv:["HUNSU_RELAY_HOST"],defaultPort:19690,portEnv:["HUNSU_RELAY_PORT"],reserved:!1,allowPortZero:!0}};var eI=["read-only","workspace-write","danger-full-access"],tI=["never","on-request","on-failure","untrusted"],rI=["user","auto_review"],nI=["deterministic"];function le(e){return{ok:!0,value:e}}function Mt(e){return{ok:!1,error:e}}function Ht(e,t){return e.ok?le(t(e.value)):e}function et(e,t){return e.ok?t(e.value):e}function Pr(e){if(e.ok)return e.value;throw new Error(e.error.message)}function oI(e,t={}){let r=ps(fs.bridgeApi,e,t.overrides?.bridgeApi);if(!r.ok)return r;let n=ps(fs.studioWeb,e,t.overrides?.studioWeb);if(!n.ok)return n;let o=ps(fs.agentPreview,e,t.overrides?.agentPreview);if(!o.ok)return o;let i=ps(fs.relay,e,t.overrides?.relay);return i.ok?le({bridgeApi:r.value,studioWeb:n.value,agentPreview:o.value,relay:i.value}):i}function iI(e,t){return et(oI(e,t),r=>aI(r,t.activePortNames))}function hf(e){return Ht(dI(e,"HUNSU_WEB_URL",Zk),t=>({webUrl:t}))}function oe(){return process.env}function sI(e){return Ht(iI(e,{activePortNames:["bridgeApi"]}),t=>({bridgeApi:t.bridgeApi}))}function vs(e,t={}){let r=Rf(t.processEnv??e);return et(sI(e),({bridgeApi:n})=>et(SI(t.roadmapRegistryPath,e,"HUNSU_ROADMAP_REGISTRY_PATH",Qk(t.homeDir??Yk(),".config","hunsu","roadmaps.json"),t.cwd),o=>et(Nd(t.routeWorktreeRoot,e,"HUNSU_ROUTE_WORKTREE_ROOT",void 0,t.cwd),i=>et(Nd(t.actionWorktreeRoot,e,"HUNSU_ACTION_WORKTREE_ROOT",void 0,t.cwd),s=>et(gs(e,"HUNSU_BRIDGE_TEST_RUNNER",nI),a=>et(To(e,t.codexAppServer),d=>Ht(uI(e,t.codexThreadOptions),u=>({bridgeApi:n,processEnv:r,roadmapRegistryPath:o,routeWorktreeRoot:i,actionWorktreeRoot:s,testRunner:a,codexAppServer:d,codexThreadOptions:u}))))))))}function yf(e){return et(pI(e,["HUNSU_BRIDGE_AUTH_BASE_URL"],"https://hunsu.app"),t=>et(gI(e,["HUNSU_RELAY_PUBLIC_API_URL","HUNSU_RELAY_API_URL"]),r=>Ht(vI(e,["HUNSU_RELAY_PUBLIC_WS_URL","HUNSU_RELAY_WS_URL"],r?yI(`${r}/v1/device/connect`):void 0),n=>({authBaseUrl:t,relayApiUrl:r,relayWsUrl:n}))))}function aI(e,t){for(let r=0;r<t.length;r+=1){let n=e[t[r]];if(n.port!==0)for(let o=r+1;o<t.length;o+=1){let i=e[t[o]];if(!(i.port!==n.port||i.port===0)&&wI(n.host,i.host))return Mt({code:"port_conflict",message:`Hunsu port conflict: ${n.name} and ${i.name} both use ${n.host}:${n.port}.`,port:n.port})}}return le(e)}function hs(e){return`http://${e.host}:${e.port}`}function dI(e,t,r){let n=e[t];return Bd(n===void 0||n.trim()===""?r:n,t)}function To(e,t={}){let r=t.command??Wn(e,["HUNSU_CODEX_APP_SERVER_COMMAND"])?.value??"codex";return r.trim()===""?Mt({code:"missing_required_env",env:"HUNSU_CODEX_APP_SERVER_COMMAND",message:"Invalid HUNSU_CODEX_APP_SERVER_COMMAND: expected a non-empty command."}):Ht(RI(e,t.args),n=>({command:r,args:n,environment:Rf(t.environment??e)}))}function uI(e,t={}){return et(gs(e,"HUNSU_CODEX_SANDBOX_MODE",eI),r=>et(gs(e,"HUNSU_CODEX_APPROVAL_POLICY",tI),n=>et(gs(e,"HUNSU_CODEX_APPROVALS_REVIEWER",rI),o=>et(mI(e,"HUNSU_CODEX_NETWORK_ACCESS"),i=>Ht(II(e,"HUNSU_CODEX_ADDITIONAL_DIRECTORIES"),s=>({...r===void 0?{}:{sandboxMode:r},...n===void 0?{}:{approvalPolicy:n},...o===void 0?{}:{approvalsReviewer:o},...i===void 0?{}:{networkAccessEnabled:i},...s.length===0?{}:{additionalDirectories:s},...t}))))))}function ps(e,t,r){let n=r?.host!==void 0?{value:r.host,source:"override",env:void 0}:Wn(t,e.hostEnv)??{value:e.defaultHost,source:"default",env:void 0},o=r?.port!==void 0?Ht(Sf(r.port,e,void 0),i=>({value:i,source:"override",env:void 0})):cI(t,e);return Ht(o,i=>({name:e.name,host:n.value,hostSource:n.source,hostEnv:n.env,port:i.value,portSource:i.source,portEnv:i.env,reserved:e.reserved}))}function cI(e,t){let r=Wn(e,t.portEnv);return r?Ht(Sf(r.value,t,r.env),n=>({value:n,source:"env",env:r.env})):le({value:t.defaultPort,source:"default"})}function Sf(e,t,r){let n=typeof e=="number"?e:Number(e),o=t.allowPortZero?0:1;return!Number.isInteger(n)||n<o||n>65535?Mt({code:"invalid_port",env:r,portName:t.name,message:r?`Invalid ${r}: ${e}. Expected an integer port from ${o} to 65535.`:`Invalid ${t.name} port: ${e}. Expected an integer port from ${o} to 65535.`}):le(n)}function lI(e,t){return/^(1|true|yes|on)$/i.test(t)?le(!0):/^(0|false|no|off)$/i.test(t)?le(!1):Mt({code:"invalid_boolean",env:e,message:`Invalid ${e}: ${t}. Expected true, false, 1, 0, yes, no, on, or off.`})}function mI(e,t){let r=e[t];return r===void 0||r.trim()===""?le(void 0):lI(t,r)}function fI(e,t,r){return r.includes(t)?le(t):Mt({code:"invalid_enum",env:e,value:t,allowed:r,message:`Invalid ${e}: ${t}. Expected one of: ${r.join(", ")}.`})}function gs(e,t,r){let n=e[t];return n===void 0||n.trim()===""?le(void 0):fI(t,n,r)}function pI(e,t,r){let n=Wn(e,t);return Bd(n?.value??r,n?.env??t[0])}function gI(e,t,r){let n=Wn(e,t),o=n?.value??r;return o===void 0?le(void 0):Bd(o,n?.env??t[0])}function vI(e,t,r){let n=Wn(e,t),o=n?.value??r;return o===void 0?le(void 0):hI(o,n?.env??t[0])}function Bd(e,t){try{let r=new URL(e);if(r.protocol!=="http:"&&r.protocol!=="https:")throw new Error("Unsupported protocol");return le(r.toString().replace(/\/$/,""))}catch{return Mt({code:"invalid_url",env:t,value:e,message:t?`Invalid ${t}: ${e}. Expected an http or https URL.`:`Invalid URL: ${e}. Expected an http or https URL.`})}}function hI(e,t){try{let r=new URL(e);if(r.protocol!=="ws:"&&r.protocol!=="wss:")throw new Error("Unsupported protocol");return le(r.toString().replace(/\/$/,""))}catch{return Mt({code:"invalid_url",env:t,value:e,message:t?`Invalid ${t}: ${e}. Expected a ws or wss URL.`:`Invalid WebSocket URL: ${e}. Expected a ws or wss URL.`})}}function yI(e){let t=new URL(e);return t.protocol=t.protocol==="https:"?"wss:":"ws:",t.toString().replace(/\/$/,"")}function Nd(e,t,r,n,o){if(e!==void 0)return Hd(e,void 0,o);let i=t[r];return i!==void 0&&i.trim()!==""?Hd(i,r,o):n===void 0?le(void 0):Hd(n,void 0,o)}function SI(e,t,r,n,o){return Ht(Nd(e,t,r,n,o),i=>i??vf(o??".",n))}function Hd(e,t,r="."){return e.trim()===""||e.includes("\0")?Mt({code:"invalid_path",env:t,path:e,message:t?`Invalid ${t}: expected a non-empty filesystem path.`:"Invalid filesystem path: expected a non-empty path."}):le(vf(r,e))}function RI(e,t){if(t!==void 0)return le([...t]);let r=e.HUNSU_CODEX_APP_SERVER_ARGS;return r===void 0||r.trim()===""?le(["app-server","--stdio"]):r.trim().startsWith("[")?kI("HUNSU_CODEX_APP_SERVER_ARGS",r):le(r.split(/\s+/).filter(Boolean))}function kI(e,t){try{let r=JSON.parse(t);if(Array.isArray(r)&&r.every(n=>typeof n=="string"))return le(r)}catch{return Mt({code:"invalid_json",env:e,value:t,message:`Invalid ${e}: expected a JSON string array.`})}return Mt({code:"invalid_json",env:e,value:t,message:`Invalid ${e}: expected a JSON string array.`})}function II(e,t){let r=e[t];return le(r===void 0||r.trim()===""?[]:r.split(",").map(n=>n.trim()).filter(Boolean))}function Rf(e){let t={};for(let[r,n]of Object.entries(e))n!==void 0&&(t[r]=n);return t}function Wn(e,t){for(let r of t){let n=e[r];if(n!==void 0&&n.trim()!=="")return{value:n,source:"env",env:r}}}function wI(e,t){let r=pf(e),n=pf(t);return r===n||gf(r)||gf(n)}function pf(e){let t=e.trim().toLowerCase();return t==="localhost"?Co:t}function gf(e){return e==="0.0.0.0"||e==="::"||e==="[::]"}import{execFile as aT,spawn as dT}from"node:child_process";import{existsSync as G,mkdirSync as vt,mkdtempSync as uT,readFileSync as Xt,readdirSync as ji,realpathSync as cT,renameSync as lT,rmSync as Wi,statSync as Xr,writeFileSync as At}from"node:fs";import{createHash as Ge,randomBytes as mT,timingSafeEqual as fT}from"node:crypto";import{homedir as zt,tmpdir as ed}from"node:os";import{basename as bt,dirname as Qe,isAbsolute as Oi,join as H,normalize as Fl,relative as jl,resolve as Be}from"node:path";import{fileURLToPath as pT}from"node:url";import{promisify as gT}from"node:util";function l(e){return{ok:!0,value:e}}function S(e){return{ok:!1,error:e}}function k(e,t="text"){return typeof e!="string"||e.trim()===""?qn(t,`${t} must be a non-empty string`):l(e)}function ys(e){return ct(e,"title")}function Ss(e){return ct(e,"goal")}function kf(e,t="title"){return ct(e,t)}function If(e,t="acceptanceCriterion"){return ct(e,t)}function wf(e,t="constraint"){return ct(e,t)}function Ef(e,t="notes"){return ct(e,t)}function yt(e,t="summary"){return ct(e,t)}function Pf(e,t="evidence"){return ct(e,t)}function St(e,t="failureReason"){return ct(e,t)}function Af(e,t="risk"){return ct(e,t)}function rn(e,t="commit"){return ct(e,t)}function ke(e,t="teamName"){return ct(e,t)}function ir(e,t="number"){return!Number.isInteger(e)||Number(e)<1?qn(t,`${t} must be a positive integer`):l(e)}function bf(e,t="number"){return!Number.isInteger(e)||Number(e)<0?qn(t,`${t} must be a non-negative integer`):l(e)}function dt(e,t="array"){return e.length===0?qn(t,`${t} must include at least one item`):l(e)}function Gn(e,t="array"){return e.length!==1?qn(t,`${t} must include exactly one item`):l(e)}function tt(e,t){let r=k(e,t);return r.ok?/\s/.test(r.value)?qn(t,`${t} must not contain whitespace`):l(r.value):r}function rt(e){return tt(e,"requestId")}function ut(e){return tt(e,"destinationId")}function Ae(e){return tt(e,"moveId")}function Rt(e){return tt(e,"hunsuId")}function Do(e){return tt(e,"hunsuDraftId")}function Q(e){return tt(e,"lineId")}function he(e){return tt(e,"nodeId")}function xf(e){return tt(e,"artifactId")}function Cf(e){return tt(e,"artifactActionId")}function Ar(e){return tt(e,"skillDraftId")}function _o(e){return tt(e,"agentConversationHash")}function Tf(e){return tt(e,"executeId")}function nn(e){return tt(e,"worktreeHash")}function qn(e,t){return S({type:"PrimitiveValidationError",field:e,message:t})}function ct(e,t){let r=k(e,t);return r.ok?l(r.value):r}var Z=class extends Error{constructor(t){super(t),this.name="DomainInvariantError"}};function I(e){return S({type:"DomainWorkflowError",message:e})}function Mo(e){return{type:"DomainWorkflowError",message:e instanceof Error?e.message:String(e)}}function V(e){if(e.ok)return e.value;throw new Z(e.error.message)}function EI(e){return{kind:"direct",provider:{providerId:"codex",model:Od(e.model??"codex-default"),reasoningEffort:e.reasoningEffort??"default",serviceTier:e.serviceTier??"default",experimental:!0}}}function $d(e){let t=e.model??PI(e.modelSelection),r=e.reasoningEffort??AI(e.modelSelection),n=e.serviceTier??bI(e.modelSelection);return{...e,model:t,reasoningEffort:r,serviceTier:n,modelSelection:e.modelSelection??EI({model:t,reasoningEffort:r,serviceTier:n})}}function Df(e){return e.kind==="direct"?e.provider:void 0}function PI(e){return e?.kind==="direct"?Od(e.provider.model):Od("codex-default")}function AI(e){return e?.kind==="direct"?e.provider.reasoningEffort??"default":"default"}function bI(e){return e?.kind==="direct"?e.provider.serviceTier??"default":"default"}function Od(e){return V(k(e,"modelSelection.provider.model"))}var Rs=["default","minimal","low","medium","high","xhigh"],ks=["default","fast"],_f=["TEAM","DIRECTOR","SYSTEM"],Mf=["input","output","context","artifact","final_evidence"],Hf=["warn","block"],Nf=["majority","unanimous","weighted","coordinator_decides"],Bf=["pending","claimed","in_progress","reached","blocked","superseded","canceled"],Of=["initial-execute-team","initial-request","hunsu"],$f=["active","paused","complete","failed","abandoned"],Lf=["arrived","accident"],Uf=["draft","ready","confirmed","discarded"],Ff=["draft","accepted","discarded"],jf=["transcript","command-output","test-log","screenshot","diff-summary","note"],Wf=["host","check"],Gf=["move","commit","move-or-commit"];var Is="hunsu-template-v1";function Vn(e){return{engine:Is,template:e}}function on(e,t){if(typeof e!="object"||e===null||Array.isArray(e))return I(`${t} must be an object`);let r=e,n=new Set(["engine","template"]),o=Object.keys(r).filter(i=>!n.has(i));return o.length>0?I(`${t} has unsupported field: ${o[0]}`):"engine"in r?"template"in r?r.engine!==Is?I(`${t}.engine must be ${Is}`):typeof r.template!="string"?I(`${t}.template must be a string`):l({engine:Is,template:r.template}):I(`${t}.template is required`):I(`${t}.engine is required`)}function qf(e,t){let r=on(e,t);if(!r.ok)throw new Z(r.error.message)}function Ho(e,t){return qf(e,"promptTemplate"),e.template.replace(/\{\{\s*([A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*|\[[0-9]+\])*)\s*\}\}/g,(r,n)=>{let o=xI(t,n);if(o==null)throw new Z(`Prompt template value is unavailable: ${n}`);return Vf(o)})}function xI(e,t){let r=t.match(/[A-Za-z_$][\w$]*|\[[0-9]+\]/g);if(!r||r.join("").replace(/\]\[/g,"][")==="")return;let n=e;for(let o of r){if(o.startsWith("[")){let i=Number(o.slice(1,-1));if(!Array.isArray(n))return;n=n[i];continue}if(typeof n!="object"||n===null)return;n=n[o]}return n}function Vf(e){return typeof e=="string"?e:typeof e=="number"||typeof e=="boolean"?String(e):Array.isArray(e)?e.map(Vf).join(`
|
|
3
|
+
`):typeof e=="object"&&e!==null?JSON.stringify(e):""}var Es="Create a closure-free ExecutionPlan using the available Members.",Jf=["Discuss HUNSU changes conversationally and edit only decoded request files under .hunsu-request when a file-backed draft change is needed.","Help the user refine divergent Hunsu changes while preserving the current Execute result as the source of truth."].join(" "),Ud={kind:"read_only",network:"disabled"},Fd={policy:"never"},CI=["read_only","worktree_write","unrestricted"],TI=["disabled","enabled"],DI=["never","on_request"],_I=["user","auto_review"],MI="root-team";function No(e){return NI(e)}function sn(e,t="Harness"){let r=ae(e,t);if(!r.ok)return r;if(typeof r.value.rootTeamId!="string"||r.value.rootTeamId.trim()==="")return T(`${t}.rootTeamId must be a non-empty string`);if(!Array.isArray(r.value.executors))return T(`${t}.executors must be an array`);if(!Array.isArray(r.value.resources))return T(`${t}.resources must be an array`);let n=new Set;for(let[u,c]of r.value.executors.entries()){let m=KI(c,`${t}.executors[${u}]`);if(!m.ok)return m;let f=String(c.id);if(n.has(f))return T(`${t}.executors must not include duplicate Executor ${f}`);n.add(f)}if(!r.value.executors.find(u=>{let c=u;return c.id===r.value.rootTeamId&&c.kind==="team"}))return T(`${t}.rootTeamId must reference a Team Executor`);let i=new Map,s=new Map;for(let u of r.value.executors){let c=u,m=String(c.id),f=c.kind==="team"?"team":"member";i.set(m,f),f==="team"&&s.set(m,(c.members??[]).map(p=>String(p.executorId)))}for(let[u,c]of r.value.executors.entries()){let m=c;if(m.kind!=="team")continue;let f=m.members;for(let[p,g]of f.entries()){let v=String(g.executorId),A=i.get(v);if(!A)return T(`${t}.executors[${u}].members[${p}].executorId references unknown Executor ${g.executorId}`);if(g.visibleProfile.kind!==A)return T(`${t}.executors[${u}].members[${p}].visibleProfile.kind must match Executor ${v} kind ${A}`)}}let a=HI(s);if(a)return T(`${t}.executors must not contain cyclic Team Memberships: ${a.join(" -> ")}`);for(let[u,c]of r.value.resources.entries()){let m=rw(c,`${t}.resources[${u}]`);if(!m.ok)return m}let d=Kd(r.value.guardrails,`${t}.guardrails`);return d.ok?Array.isArray(r.value.artifactActions)?l(lt(r.value)):T(`${t}.artifactActions must be an array`):d}function HI(e){let t=new Set,r=new Set,n=[],o=i=>{if(t.has(i)){let s=n.indexOf(i);return[...n.slice(s),i]}if(!r.has(i)){t.add(i),n.push(i);for(let s of e.get(i)??[]){if(!e.has(s))continue;let a=o(s);if(a)return a}n.pop(),t.delete(i),r.add(i)}};for(let i of e.keys()){let s=o(i);if(s)return s}}function jd(e,t="Member"){let r=ae(e,t);if(!r.ok)return r;let n=ep(r.value,t);return n.ok?l(Cs(r.value)):n}function Bo(e,t="Manager"){let r=ae(e,t);if(!r.ok)return r;let n=zI(r.value,t);return n.ok?l(sw(r.value)):n}function NI(e){let t=ae(e,"Harness");if(!t.ok)return t;let r=qI(t.value);switch(r.kind){case"team_execution_plan":return ws({...r,kind:"team_execution_plan"},"team_execution_plan","maxAttemptCount");case"role_squad":return ws(r,"role_squad","maxRoundCount");case"council_vote":return iw(ze("council_vote.voteRule",r.voteRule,Nf),()=>ws(r,"council_vote","maxRoundCount"));case"court_debate":return ws(r,"court_debate","maxRoundCount");default:return T(`Unsupported Harness kind: ${String(r.kind)}`)}}function Wd(e){return e.kind==="team_execution_plan"}function Ps(e){return Wd(e)?l(e):S({type:"DomainWorkflowError",message:`Harness ${e.kind} is not executable yet`})}function Te(e="",t=[]){return{kind:"team_execution_plan",maxAttemptCount:V(ir(5,"team_execution_plan.maxAttemptCount")),team:{promptTemplate:Vn(e||Es)},members:[Je("azir","Plan briefly, then implement the focused goal in this repository.",t),Je("galio","Verify the completed work against the focused goal with concrete evidence.",[])]}}function Je(e,t="",r=[],n=Ud,o=Fd,i=[]){return{id:V(k(e,"executorId")),promptTemplate:Vn(t),skills:Ts(r),plugins:_s(i),model:V(k("codex-default","member.model")),reasoningEffort:"default",serviceTier:"default",execution:Oo(n),approval:$o(o)}}function Jn(e="manager.hunsu.default",t=Jf,r=[],n=[],o){return{id:V(k(e,"manager.id")),promptTemplate:Vn(t),skills:Ts(r),plugins:_s(n),...o?{modelSelection:JSON.parse(JSON.stringify(o))}:{}}}function Ke(e){let t=JSON.parse(JSON.stringify(e));return{...t,guardrails:t.guardrails?.map(r=>({...r})),members:t.members.map(Cs)}}function zf(e){let t=JSON.parse(JSON.stringify(e));return{...t,team:{promptTemplate:{...t.team.promptTemplate}},guardrails:t.guardrails?.map(r=>({...r}))}}function Kf(e){let t=Ke(e),{members:r,...n}=t;return zf(n)}function Nt(e,t=MI){let r=BI(t,"rootTeamId"),n=Kf(e),o=e.members.map(Cs),i=o.map(s=>({executorId:s.id,visibleProfile:LI(s)}));return{rootTeamId:r,executors:[{kind:"team",id:r,planner:{promptTemplate:{...n.team.promptTemplate},maxAttemptCount:"maxAttemptCount"in n?n.maxAttemptCount:void 0,guardrails:n.guardrails?.map(s=>({...s}))},members:i},...o.map($I)],resources:jI(o),guardrails:n.guardrails?.map(s=>({...s}))??[],artifactActions:[]}}function an(e,t=e.rootTeamId){let r=Xf(e,t);if(!r)throw new Z(`Harness does not define Team ${t}`);let n=r.members.map(i=>UI(e,i));return{kind:"team_execution_plan",maxAttemptCount:r.planner.maxAttemptCount??V(ir(5,"team.maxAttemptCount")),guardrails:r.planner.guardrails?.map(i=>({...i})),team:{promptTemplate:{...r.planner.promptTemplate}},members:n}}function br(e){return an(e,e.rootTeamId)}function lt(e){return{rootTeamId:e.rootTeamId,executors:e.executors.map(qd),resources:e.resources.map(GI),guardrails:e.guardrails.map(t=>({...t})),artifactActions:JSON.parse(JSON.stringify(e.artifactActions))}}function As(e,t){let r=e.executors.find(n=>n.id===t);return r?qd(r):void 0}function Xf(e,t){let r=e.executors.find(n=>n.id===t&&n.kind==="team");return r?qd(r):void 0}function Gd(e,t){let r=e.executors.find(n=>n.id===t&&n.kind==="member");return r?Qf(r):void 0}function bs(e){let t=$d(e.runtimePolicy);return{id:e.id,promptTemplate:{...e.promptTemplate},skills:e.resources.filter(r=>r.kind==="skill").map(r=>Ds(r.skill)),plugins:e.resources.filter(r=>r.kind==="plugin").map(r=>({...r.plugin})),...e.runtimePolicy.modelSelection?{modelSelection:t.modelSelection}:{},model:t.model,reasoningEffort:t.reasoningEffort,serviceTier:t.serviceTier,execution:Oo(t.execution),approval:$o(t.approval)}}function zn(e,t){return e.members.find(r=>r.id===t)?Cs(e.members.find(r=>r.id===t)):void 0}function BI(e,t){return V(k(e,t))}function OI(e){return{...e.modelSelection?{modelSelection:e.modelSelection}:{},model:e.model,reasoningEffort:e.reasoningEffort,serviceTier:e.serviceTier,execution:Oo(e.execution),approval:$o(e.approval)}}function Yf(e){return[...e.skills.map(t=>({kind:"skill",skill:Ds(t)})),...(e.plugins??[]).map(t=>({kind:"plugin",plugin:{...t}}))]}function $I(e){return{kind:"member",id:e.id,promptTemplate:{...e.promptTemplate},resources:Yf(e),runtimePolicy:OI(e)}}function LI(e){return{kind:"member",label:e.id,summary:V(k(e.promptTemplate.template||`Member ${e.id}`,"visibleProfile.summary")),capabilities:e.skills.map(t=>t.name)}}function UI(e,t){let r=e.executors.find(n=>n.id===t.executorId);if(!r)throw new Z(`Team Membership references unknown Executor ${t.executorId}`);return r.kind==="member"?bs(r):Je(r.id,FI(t.visibleProfile),[],Ud,Fd,[])}function FI(e){let t=e.capabilities?.length?`
|
|
4
|
+
Capabilities:
|
|
5
|
+
${e.capabilities.map(r=>`- ${r}`).join(`
|
|
6
|
+
`)}`:"";return[e.kind==="team"?"Composite Team Executor.":"Member Executor.",e.label?`Label: ${e.label}`:void 0,e.summary?`Summary: ${e.summary}`:void 0,t||void 0].filter(Boolean).join(`
|
|
7
|
+
`)}function jI(e){let t=[],r=new Set;for(let n of e)for(let o of Yf(n)){let i=WI(n.id,o);r.has(i)||(r.add(i),t.push({id:i,binding:o}))}return t}function WI(e,t){return t.kind==="skill"?`resource.${e}.skill.${t.skill.name}`:t.kind==="plugin"?`resource.${e}.plugin.${t.plugin.id}`:`resource.${e}.package.${t.lock.kind}.${t.lock.key}.${t.lock.version}`}function qd(e){return e.kind==="member"?{...Qf(e),packageLock:e.packageLock?{...e.packageLock}:void 0}:{...e,planner:{promptTemplate:{...e.planner.promptTemplate},maxAttemptCount:e.planner.maxAttemptCount,guardrails:e.planner.guardrails?.map(t=>({...t}))},members:e.members.map(t=>({executorId:t.executorId,visibleProfile:{...t.visibleProfile,capabilities:t.visibleProfile.capabilities?[...t.visibleProfile.capabilities]:void 0}})),packageLock:e.packageLock?{...e.packageLock}:void 0}}function Qf(e){let t=$d(e.runtimePolicy);return{kind:"member",id:e.id,promptTemplate:{...e.promptTemplate},resources:e.resources.map(Zf),runtimePolicy:{...e.runtimePolicy.modelSelection?{modelSelection:t.modelSelection}:{},model:t.model,reasoningEffort:t.reasoningEffort,serviceTier:t.serviceTier,execution:Oo(t.execution),approval:$o(t.approval)}}}function Zf(e){return e.kind==="skill"?{kind:"skill",skill:Ds(e.skill)}:e.kind==="plugin"?{kind:"plugin",plugin:{...e.plugin}}:{kind:"package",lock:{...e.lock}}}function GI(e){return{id:e.id,binding:Zf(e.binding),packageLock:e.packageLock?{...e.packageLock}:void 0}}function ws(e,t,r){for(let n of[op(e[r],`${t}.${r}`),Kd(e.guardrails,`${t}.guardrails`),VI(e.team,`${t}.team`),JI(e.members,`${t}.members`,!0)])if(!n.ok)return n;return l(Ke(e))}function qI(e){return e.kind==="team_execution_plan"?{...e,kind:"team_execution_plan"}:e}function Vd(e,t){let r=ae(e,t);if(!r.ok)return r;if(r.value.kind!=="local-snapshot"&&r.value.kind!=="local-root-installed"&&r.value.kind!=="registry-package"&&r.value.kind!=="skillMeta")return T(`${t}.kind must be local-snapshot, local-root-installed, registry-package, or skillMeta`);if(typeof r.value.name!="string"||r.value.name.trim()==="")return T(`${t}.name must be a non-empty string`);if(r.value.kind==="skillMeta"){let n=nw(r.value,["agent","kind","name","source"],t);return n.ok?typeof r.value.source!="string"||r.value.source.trim()===""?T(`${t}.source must be a non-empty string`):r.value.agent!=="codex"?T(`${t}.agent must be codex`):l(void 0):n}if(r.value.kind==="local-root-installed")return r.value.sourcePath!==void 0&&(typeof r.value.sourcePath!="string"||r.value.sourcePath.trim()==="")?T(`${t}.sourcePath must be a non-empty string when provided`):l(void 0);if(r.value.kind==="local-snapshot"){for(let n of["sourcePath","contentHash","snapshotRef"])if(typeof r.value[n]!="string"||r.value[n].trim()==="")return T(`${t}.${n} must be a non-empty string`);if(r.value.snapshotFiles!==void 0){if(!Array.isArray(r.value.snapshotFiles))return T(`${t}.snapshotFiles must be an array`);for(let[n,o]of r.value.snapshotFiles.entries()){let i=ae(o,`${t}.snapshotFiles[${n}]`);if(!i.ok)return i;if(typeof i.value.path!="string"||i.value.path.trim()==="")return T(`${t}.snapshotFiles[${n}].path must be a non-empty string`);if(typeof i.value.text!="string")return T(`${t}.snapshotFiles[${n}].text must be a string`)}}return l(void 0)}if(r.value.registryKind!=="apm")return T(`${t}.registryKind must be apm`);for(let n of["registry","package","version","integrity","contentHash"])if(typeof r.value[n]!="string"||r.value[n].trim()==="")return T(`${t}.${n} must be a non-empty string`);return aw(String(r.value.version))?r.value.snapshotFiles!==void 0?T(`${t}.snapshotFiles is not supported for registry-package skills`):l(void 0):T(`${t}.version must be an exact semver version`)}function Jd(e,t){let r=ae(e,t);return r.ok?r.value.kind!=="local-root-installed"?T(`${t}.kind must be local-root-installed`):typeof r.value.id!="string"||r.value.id.trim()===""?T(`${t}.id must be a non-empty string`):l(void 0):r}function VI(e,t){let r=ae(e,t);if(!r.ok)return r;let n=on(r.value.promptTemplate,`${t}.promptTemplate`);return n.ok?l(void 0):n}function JI(e,t,r){if(!Array.isArray(e))return T(`${t} must be an array`);if(r&&e.length===0)return T(`${t} must include at least one Member`);let n=new Set;for(let[o,i]of e.entries()){let s=ae(i,`${t}[${o}]`);if(!s.ok)return s;let a=ep(s.value,`${t}[${o}]`);if(!a.ok)return a;let d=String(s.value.id);if(n.has(d))return T(`${t} must not include duplicate Member ${d}`);n.add(d)}return l(void 0)}function ep(e,t){if(typeof e.id!="string"||e.id.trim()==="")return T(`${t}.id must be a non-empty string`);let r=on(e.promptTemplate,`${t}.promptTemplate`);if(!r.ok)return r;if(typeof e.model!="string"||e.model.trim()==="")return T(`${t}.model must be a non-empty string`);for(let n of[zd(e.modelSelection,`${t}.modelSelection`,!0),ze(`${t}.reasoningEffort`,e.reasoningEffort,Rs),e.serviceTier===void 0?l(void 0):ze(`${t}.serviceTier`,e.serviceTier,ks),rp(e.execution,`${t}.execution`),np(e.approval,`${t}.approval`)])if(!n.ok)return n;if(!Array.isArray(e.skills))return T(`${t}.skills must be an array`);for(let[n,o]of e.skills.entries()){let i=Vd(o,`${t}.skills[${n}]`);if(!i.ok)return i}if(e.plugins!==void 0){if(!Array.isArray(e.plugins))return T(`${t}.plugins must be an array`);for(let[n,o]of e.plugins.entries()){let i=Jd(o,`${t}.plugins[${n}]`);if(!i.ok)return i}}return l(void 0)}function zI(e,t){let r=ow(e,["id","plugins","promptTemplate","skills"],["modelSelection"],t);if(!r.ok)return r;if(typeof e.id!="string"||e.id.trim()==="")return T(`${t}.id must be a non-empty string`);let n=on(e.promptTemplate,`${t}.promptTemplate`);if(!n.ok)return n;let o=zd(e.modelSelection,`${t}.modelSelection`,!0);if(!o.ok)return o;if(!Array.isArray(e.skills))return T(`${t}.skills must be an array`);for(let[i,s]of e.skills.entries()){let a=Vd(s,`${t}.skills[${i}]`);if(!a.ok)return a}if(!Array.isArray(e.plugins))return T(`${t}.plugins must be an array`);for(let[i,s]of e.plugins.entries()){let a=Jd(s,`${t}.plugins[${i}]`);if(!a.ok)return a}return l(void 0)}function KI(e,t){let r=ae(e,t);return r.ok?r.value.kind==="team"?XI(r.value,t):r.value.kind==="member"?ew(r.value,t):T(`${t}.kind must be team or member`):r}function XI(e,t){if(typeof e.id!="string"||e.id.trim()==="")return T(`${t}.id must be a non-empty string`);let r=YI(e.planner,`${t}.planner`);if(!r.ok)return r;if(!Array.isArray(e.members))return T(`${t}.members must be an array`);let n=new Set;for(let[o,i]of e.members.entries()){let s=QI(i,`${t}.members[${o}]`);if(!s.ok)return s;let a=String(i.executorId);if(n.has(a))return T(`${t}.members must not include duplicate Membership ${a}`);n.add(a)}return xs(e.packageLock,`${t}.packageLock`)}function YI(e,t){let r=ae(e,t);if(!r.ok)return r;let n=on(r.value.promptTemplate,`${t}.promptTemplate`);if(!n.ok)return n;if(r.value.maxAttemptCount!==void 0){let o=op(r.value.maxAttemptCount,`${t}.maxAttemptCount`);if(!o.ok)return o}return Kd(r.value.guardrails,`${t}.guardrails`)}function QI(e,t){let r=ae(e,t);return r.ok?typeof r.value.executorId!="string"||r.value.executorId.trim()===""?T(`${t}.executorId must be a non-empty string`):ZI(r.value.visibleProfile,`${t}.visibleProfile`):r}function ZI(e,t){let r=ae(e,t);if(!r.ok)return r;let n=ze(`${t}.kind`,r.value.kind,["team","member"]);if(!n.ok)return n;for(let o of["label","summary"])if(r.value[o]!==void 0&&(typeof r.value[o]!="string"||String(r.value[o]).trim()===""))return T(`${t}.${o} must be a non-empty string when provided`);if(r.value.capabilities!==void 0){if(!Array.isArray(r.value.capabilities))return T(`${t}.capabilities must be an array`);for(let[o,i]of r.value.capabilities.entries())if(typeof i!="string"||i.trim()==="")return T(`${t}.capabilities[${o}] must be a non-empty string`)}return l(void 0)}function ew(e,t){if(typeof e.id!="string"||e.id.trim()==="")return T(`${t}.id must be a non-empty string`);let r=on(e.promptTemplate,`${t}.promptTemplate`);if(!r.ok)return r;if(!Array.isArray(e.resources))return T(`${t}.resources must be an array`);for(let[o,i]of e.resources.entries()){let s=tp(i,`${t}.resources[${o}]`);if(!s.ok)return s}let n=tw(e.runtimePolicy,`${t}.runtimePolicy`);return n.ok?xs(e.packageLock,`${t}.packageLock`):n}function tw(e,t){let r=ae(e,t);if(!r.ok)return r;let n=zd(r.value.modelSelection,`${t}.modelSelection`,!0);if(!n.ok)return n;let o=r.value.modelSelection!==void 0;if(r.value.model!==void 0&&(typeof r.value.model!="string"||r.value.model.trim()===""))return T(`${t}.model must be a non-empty string when provided`);if(r.value.model===void 0&&!o)return T(`${t}.modelSelection or ${t}.model must be provided`);for(let i of[r.value.reasoningEffort===void 0&&o?l(void 0):ze(`${t}.reasoningEffort`,r.value.reasoningEffort,Rs),r.value.serviceTier===void 0?l(void 0):ze(`${t}.serviceTier`,r.value.serviceTier,ks),rp(r.value.execution,`${t}.execution`),np(r.value.approval,`${t}.approval`)])if(!i.ok)return i;return l(void 0)}function zd(e,t,r=!1){if(e===void 0&&r)return l(void 0);let n=ae(e,t);if(!n.ok)return n;if(n.value.kind==="alias")return Ld(n.value.aliasId,`${t}.aliasId`);if(n.value.kind!=="direct")return T(`${t}.kind must be direct or alias`);let o=ae(n.value.provider,`${t}.provider`);if(!o.ok)return o;for(let i of[Ld(o.value.providerId,`${t}.provider.providerId`),Ld(o.value.model,`${t}.provider.model`),o.value.reasoningEffort===void 0?l(void 0):ze(`${t}.provider.reasoningEffort`,o.value.reasoningEffort,Rs),o.value.serviceTier===void 0?l(void 0):ze(`${t}.provider.serviceTier`,o.value.serviceTier,ks)])if(!i.ok)return i;if(o.value.experimental!==void 0&&typeof o.value.experimental!="boolean")return T(`${t}.provider.experimental must be a boolean when provided`);if(o.value.providerId==="codex"&&o.value.experimental!==!0){if(o.value.model==="gpt-5.5-thinking"&&o.value.reasoningEffort!=="high"&&o.value.reasoningEffort!=="xhigh")return T(`${t}.provider.reasoningEffort must be high or xhigh for gpt-5.5-thinking`);if(o.value.model==="gpt-5.5"&&(o.value.reasoningEffort==="minimal"||o.value.reasoningEffort==="xhigh"))return T(`${t}.provider.reasoningEffort is not supported for gpt-5.5`)}return l(void 0)}function Ld(e,t){return typeof e=="string"&&e.trim()!==""?l(void 0):T(`${t} must be a non-empty string`)}function rw(e,t){let r=ae(e,t);if(!r.ok)return r;if(typeof r.value.id!="string"||r.value.id.trim()==="")return T(`${t}.id must be a non-empty string`);let n=tp(r.value.binding,`${t}.binding`);return n.ok?xs(r.value.packageLock,`${t}.packageLock`):n}function tp(e,t){let r=ae(e,t);return r.ok?r.value.kind==="skill"?Vd(r.value.skill,`${t}.skill`):r.value.kind==="plugin"?Jd(r.value.plugin,`${t}.plugin`):r.value.kind==="package"?xs(r.value.lock,`${t}.lock`):T(`${t}.kind must be skill, plugin, or package`):r}function xs(e,t){if(e===void 0)return l(void 0);let r=ae(e,t);if(!r.ok)return r;for(let n of["origin","kind","key","version","integrity"])if(typeof r.value[n]!="string"||String(r.value[n]).trim()==="")return T(`${t}.${n} must be a non-empty string`);return l(void 0)}function rp(e,t){let r=ae(e,t);if(!r.ok)return r;let n=ze(`${t}.kind`,r.value.kind,CI);if(!n.ok)return n;let o=ze(`${t}.network`,r.value.network,TI);return o.ok?l(void 0):o}function np(e,t){let r=ae(e,t);if(!r.ok)return r;let n=ze(`${t}.policy`,r.value.policy,DI);if(!n.ok)return n;if(r.value.policy==="on_request"){let o=ze(`${t}.reviewer`,r.value.reviewer,_I);return o.ok?l(void 0):o}return"reviewer"in r.value?T(`${t}.reviewer is only allowed when policy is on_request`):l(void 0)}function Kd(e,t){if(e===void 0)return l(void 0);if(!Array.isArray(e))return T(`${t} must be an array`);for(let[r,n]of e.entries()){let o=ae(n,`${t}[${r}]`);if(!o.ok)return o;if(typeof o.value.name!="string"||o.value.name.trim()==="")return T(`${t}[${r}].name must be a non-empty string`);let i=ze(`${t}[${r}].scope`,o.value.scope,Mf);if(!i.ok)return i;if(typeof o.value.rule!="string"||o.value.rule.trim()==="")return T(`${t}[${r}].rule must be a non-empty string`);let s=ze(`${t}[${r}].severity`,o.value.severity,Hf);if(!s.ok)return s}return l(void 0)}function ae(e,t){return e&&typeof e=="object"&&!Array.isArray(e)?l(e):T(`${t} must be an object`)}function nw(e,t,r){let n=t.filter(i=>!(i in e));if(n.length>0)return T(`${r} is missing required keys: ${n.join(", ")}`);let o=Object.keys(e).filter(i=>!t.includes(i));return o.length>0?T(`${r} has unsupported keys: ${o.join(", ")}`):l(void 0)}function ow(e,t,r,n){let o=t.filter(a=>!(a in e));if(o.length>0)return T(`${n} is missing required keys: ${o.join(", ")}`);let i=[...t,...r],s=Object.keys(e).filter(a=>!i.includes(a));return s.length>0?T(`${n} has unsupported keys: ${s.join(", ")}`):l(void 0)}function op(e,t){return Number.isInteger(e)&&Number(e)>=1?l(void 0):T(`${t} must be a positive integer`)}function ze(e,t,r){return typeof t=="string"&&r.includes(t)?l(t):T(`${e} must be one of: ${r.join(", ")}`)}function iw(e,t){return e.ok?t():e}function T(e){return S({type:"DomainWorkflowError",message:e})}function Cs(e){let t={...e,promptTemplate:{...e.promptTemplate},skills:Ts(e.skills),plugins:_s(e.plugins??[]),execution:Oo(e.execution),approval:$o(e.approval)};return e.modelSelection&&(t.modelSelection=JSON.parse(JSON.stringify(e.modelSelection))),t}function sw(e){let t={...e,promptTemplate:{...e.promptTemplate},skills:Ts(e.skills),plugins:_s(e.plugins)};return e.modelSelection&&(t.modelSelection=JSON.parse(JSON.stringify(e.modelSelection))),t}function Oo(e){return{...e}}function $o(e){return{...e}}function Ts(e=[]){return e.map(Ds)}function Ds(e){return e.kind==="local-snapshot"?{...e,snapshotFiles:e.snapshotFiles?.map(t=>({...t}))}:{...e}}function _s(e=[]){return e.map(t=>({...t}))}function aw(e){return/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/.test(e)}function ip(e,t,r,n){let o=r==="initial-execute-team"||r==="initial-request"?"SYSTEM":"DIRECTOR";return{...t,requestId:e,status:"pending",source:r,createdBy:o,updatedBy:o,createdAt:n,updatedAt:n}}function Lo(e,t){return Ns(t.claimedBy)?e.status!=="pending"&&e.status!=="blocked"?me(`Destination ${e.id} cannot be claimed from status ${e.status}`):l({...Hs(e,t),status:"claimed",claimedBy:t.claimedBy}):me("Claim Destination requires claimedBy")}function Uo(e,t){return Ns(t.claimedBy)?e.status==="blocked"?me(`Destination ${e.id} cannot start work from status blocked`):tu(e)?me(`Destination ${e.id} cannot start work from status ${e.status}`):l({...Hs(e,t),status:"in_progress",claimedBy:t.claimedBy}):me("Start Destination work requires claimedBy")}function Fo(e,t){return Ns(t.blockedReason)?tu(e)?me(`Destination ${e.id} cannot be blocked from status ${e.status}`):l({...Hs(e,t),status:"blocked",claimedBy:"claimedBy"in e?e.claimedBy:void 0,blockedReason:t.blockedReason}):me("Block Destination requires blockedReason")}function jo(e,t){return Ns(t.reachedByMoveId)?tu(e)?me(`Destination ${e.id} cannot be reached from status ${e.status}`):l({...Hs(e,t),status:"reached",claimedBy:"claimedBy"in e?e.claimedBy:void 0,reachedByMoveId:t.reachedByMoveId}):me("Reach Destination requires reachedByMoveId")}function Wo(e){return e.status==="active"?l({...e,status:"paused"}):me(`Line ${e.id} cannot be paused from status ${e.status}`)}function Go(e){return e.status==="paused"?l({...e,status:"active"}):me(`Line ${e.id} cannot be resumed from status ${e.status}`)}function qo(e){return e.status==="active"||e.status==="paused"?l({...e,status:"complete"}):me(`Line ${e.id} cannot be completed from status ${e.status}`)}function Vo(e){return e.status==="active"||e.status==="paused"?l({...e,status:"abandoned"}):me(`Line ${e.id} cannot be abandoned from status ${e.status}`)}function sp(e){return e.status==="active"?l({...e,status:"failed"}):me(`Line ${e.id} cannot fail from status ${e.status}`)}function ap(e){return e.status==="active"?l(e):me(`TEAM line ${e.id} cannot continue from status ${e.status}`)}function Xd(e){let t=Gn(e.reachedDestinationIds,"reachedDestinationIds");if(!t.ok)return me("Arrived MOVE must reach exactly one Destination");let r=dt(e.evidence,"evidence");return r.ok?l({...e,outcome:"arrived",reachedDestinationIds:t.value,evidence:r.value}):me("Arrived MOVE requires evidence")}function Yd(e){let t=St(e.failureReason,"failureReason");if(!t.ok)return me("Accident MOVE requires failureReason");let r=dt(e.evidence,"evidence");return r.ok?l({...e,outcome:"accident",reachedDestinationIds:[],failureReason:t.value,evidence:r.value}):me("Accident MOVE requires evidence")}function Qd(e,t){return e.outcome==="accident"?{...e,...t,outcome:"accident",reachedDestinationIds:[],failureReason:e.failureReason}:{...e,...t,outcome:"arrived",reachedDestinationIds:e.reachedDestinationIds}}function Ms(e){return e.outcome==="accident"?Yd(e):Xd({...e,reachedDestinationIds:e.reachedDestinationIds})}function dp(e){return{...e,status:"draft"}}function Zd(e,t){return e.status!=="draft"?me(`Skill Draft ${e.id} cannot be accepted from status ${e.status}`):l({...e,status:"accepted",acceptedSnapshot:t})}function eu(e){return e.status!=="draft"?me(`Skill Draft ${e.id} cannot be discarded from status ${e.status}`):l({...e,status:"discarded"})}function Hs(e,t){let{claimedBy:r,reachedByMoveId:n,blockedReason:o,canceledReason:i,supersededByDestinationId:s,...a}=e;return{...a,updatedBy:t.updatedBy,updatedAt:t.updatedAt}}function tu(e){return e.status==="reached"||e.status==="canceled"||e.status==="superseded"}function Ns(e){return typeof e=="string"&&e.trim()!==""}function me(e){return S({type:"DomainModelError",message:e})}function W(e,t){return e&&typeof e=="object"&&!Array.isArray(e)?l(e):I(`${t} must be an object`)}function Ue(e,t){return Array.isArray(e)?l(e):I(`${t} must be an array`)}function Ie(e,t,r){return typeof t=="string"&&r.includes(t)?l(t):I(`${e} must be one of: ${r.join(", ")}`)}function ru(e,t){return Ie(t,e,_f)}function dw(e,t){return Ie(t,e,Of)}function uw(e,t){return typeof e=="number"&&Number.isFinite(e)?l(e):I(`${t} must be a finite number`)}function lp(e,t){return e===void 0?l(void 0):typeof e=="boolean"?l(e):I(`${t} must be a boolean`)}function Os(e,t){return Number.isInteger(e)&&Number(e)>=0?l(Number(e)):I(`${t} must be a non-negative integer`)}function Bt(e,t){return e===void 0?l(void 0):typeof e=="string"?l(e):I(`${t} must be a string`)}function de(e,t){if(e===void 0)return l(void 0);let r=k(e,t);return r.ok?l(r.value):I(r.error.message)}function nu(e,t){let r=k(e,t);return r.ok?l(r.value):I(r.error.message)}function K(e,t="at"){return Bt(e,t)}function cw(e,t){if(e===void 0)return l(void 0);let r=Ue(e,t);if(!r.ok)return r;let n=[];for(let o=0;o<r.value.length;o+=1){let i=h(k(r.value[o],`${t}[${o}]`));if(!i.ok)return i;n.push(i.value)}return l(n)}function lw(e,t){return e===void 0?l(void 0):uw(e,t)}function ou(e,t){let r=W(e,t);if(!r.ok)return r;let n=h(rt(r.value.id));if(!n.ok)return n;let o=h(ys(r.value.title));if(!o.ok)return o;let i=h(Ss(r.value.goal));if(!i.ok)return i;let s=ru(r.value.createdBy,`${t}.createdBy`);if(!s.ok)return s;let a=Bt(r.value.createdAt,`${t}.createdAt`);return a.ok?l({id:n.value,title:o.value,goal:i.value,createdBy:s.value,createdAt:a.value}):a}function $s(e,t){let r=W(e,t);if(!r.ok)return r;let n=h(ut(r.value.id));if(!n.ok)return n;let o=h(kf(r.value.title,`${t}.title`));if(!o.ok)return o;let i=mw(r.value.acceptanceCriteria,`${t}.acceptanceCriteria`);if(!i.ok)return i;let s=fw(r.value.constraints,`${t}.constraints`);if(!s.ok)return s;let a=lw(r.value.priority,`${t}.priority`);if(!a.ok)return a;let d=r.value.notes===void 0?l(void 0):h(Ef(r.value.notes,`${t}.notes`));return d.ok?l({id:n.value,title:o.value,acceptanceCriteria:i.value,constraints:s.value,priority:a.value,notes:d.value}):d}function Ls(e,t,r=!0){let n=Ue(e,t);if(!n.ok)return n;if(r){let s=h(dt(n.value,t));if(!s.ok)return s}let o=[];for(let s=0;s<n.value.length;s+=1){let a=$s(n.value[s],`${t}[${s}]`);if(!a.ok)return a;o.push(a.value)}let i=qs(o.map(s=>s.id),t,"DestinationId");return i.ok?l(o):i}function mw(e,t){if(e===void 0)return l(void 0);let r=Ue(e,t);if(!r.ok)return r;let n=[];for(let o=0;o<r.value.length;o+=1){let i=h(If(r.value[o],`${t}[${o}]`));if(!i.ok)return i;n.push(i.value)}return l(n)}function fw(e,t){if(e===void 0)return l(void 0);let r=Ue(e,t);if(!r.ok)return r;let n=[];for(let o=0;o<r.value.length;o+=1){let i=h(wf(r.value[o],`${t}[${o}]`));if(!i.ok)return i;n.push(i.value)}return l(n)}function pw(e,t){let r=W(e,t);if(!r.ok)return r;let n=$s(r.value,t);if(!n.ok)return n;let o=h(rt(r.value.requestId));if(!o.ok)return o;let i=dw(r.value.source,`${t}.source`);if(!i.ok)return i;let s=ru(r.value.createdBy,`${t}.createdBy`);if(!s.ok)return s;let a=ru(r.value.updatedBy,`${t}.updatedBy`);if(!a.ok)return a;let d=Ie(`${t}.status`,r.value.status,Bf);if(!d.ok)return d;let u=Bt(r.value.createdAt,`${t}.createdAt`);if(!u.ok)return u;let c=Bt(r.value.updatedAt,`${t}.updatedAt`);if(!c.ok)return c;let m={...n.value,requestId:o.value,source:i.value,createdBy:s.value,updatedBy:a.value,createdAt:u.value,updatedAt:c.value};switch(d.value){case"pending":return Dw(r.value,t,["claimedBy","reachedByMoveId","blockedReason","canceledReason","supersededByDestinationId"],m);case"claimed":case"in_progress":{let f=h(k(r.value.claimedBy,`${t}.claimedBy`));if(!f.ok)return f;let p=Kn(r.value,t,["reachedByMoveId","blockedReason","canceledReason","supersededByDestinationId"]);return p.ok?l({...m,status:d.value,claimedBy:f.value}):p}case"reached":{let f=h(Ae(r.value.reachedByMoveId));if(!f.ok)return f;let p=de(r.value.claimedBy,`${t}.claimedBy`);if(!p.ok)return p;let g=Kn(r.value,t,["blockedReason","canceledReason","supersededByDestinationId"]);return g.ok?l({...m,status:"reached",reachedByMoveId:f.value,claimedBy:p.value}):g}case"blocked":{let f=h(St(r.value.blockedReason,`${t}.blockedReason`));if(!f.ok)return f;let p=de(r.value.claimedBy,`${t}.claimedBy`);if(!p.ok)return p;let g=Kn(r.value,t,["reachedByMoveId","canceledReason","supersededByDestinationId"]);return g.ok?l({...m,status:"blocked",blockedReason:f.value,claimedBy:p.value}):g}case"superseded":{let f=h(ut(r.value.supersededByDestinationId));if(!f.ok)return f;let p=de(r.value.claimedBy,`${t}.claimedBy`);if(!p.ok)return p;let g=Kn(r.value,t,["reachedByMoveId","blockedReason","canceledReason"]);return g.ok?l({...m,status:"superseded",supersededByDestinationId:f.value,claimedBy:p.value}):g}case"canceled":{let f=h(St(r.value.canceledReason,`${t}.canceledReason`));if(!f.ok)return f;let p=de(r.value.claimedBy,`${t}.claimedBy`);if(!p.ok)return p;let g=Kn(r.value,t,["reachedByMoveId","blockedReason","supersededByDestinationId"]);return g.ok?l({...m,status:"canceled",canceledReason:f.value,claimedBy:p.value}):g}}}function mp(e,t){let r=Ue(e,t);if(!r.ok)return r;let n=[];for(let o=0;o<r.value.length;o+=1){let i=pw(r.value[o],`${t}[${o}]`);if(!i.ok)return i;n.push(i.value)}return l(n)}function Bs(e,t,r){let n=Ue(e,t);if(!n.ok)return n;if(r){let s=h(dt(n.value,t));if(!s.ok)return s}let o=[];for(let s=0;s<n.value.length;s+=1){let a=h(ut(n.value[s]));if(!a.ok)return a;o.push(a.value)}let i=qs(o,t,"DestinationId");return i.ok?l(o):i}function gw(e,t,r){let n=Ue(e,t);if(!n.ok)return n;if(r){let s=h(dt(n.value,t));if(!s.ok)return s}let o=[];for(let s=0;s<n.value.length;s+=1){let a=h(Ae(n.value[s]));if(!a.ok)return a;o.push(a.value)}let i=qs(o,t,"MoveId");return i.ok?l(o):i}function vw(e,t,r){let n=Ue(e,t);if(!n.ok)return n;if(r){let s=h(dt(n.value,t));if(!s.ok)return s}let o=[];for(let s=0;s<n.value.length;s+=1){let a=h(he(n.value[s]));if(!a.ok)return a;o.push(a.value)}let i=qs(o,t,"NodeId");return i.ok?r?h(dt(o,t)):l(o):i}function Us(e,t,r){let n=Ue(e,t);if(!n.ok)return n;if(r){let i=h(dt(n.value,t));if(!i.ok)return i}let o=[];for(let i=0;i<n.value.length;i+=1){let s=h(Pf(n.value[i],`${t}[${i}]`));if(!s.ok)return s;o.push(s.value)}return l(o)}function Fs(e,t){let r=Ue(e,t);if(!r.ok)return r;let n=[];for(let o=0;o<r.value.length;o+=1){let i=h(Af(r.value[o],`${t}[${o}]`));if(!i.ok)return i;n.push(i.value)}return l(n)}function hw(e,t){return e===void 0?l(void 0):Fs(e,t)}function fp(e,t){let r=W(e,t);if(!r.ok)return r;switch(r.value.type){case"destination":{let n=h(ut(r.value.id));return n.ok?l({type:"destination",id:n.value}):n}case"move":{let n=h(Ae(r.value.id));return n.ok?l({type:"move",id:n.value}):n}case"line":{let n=h(Q(r.value.id));return n.ok?l({type:"line",id:n.value}):n}case"node":{let n=h(he(r.value.id));return n.ok?l({type:"node",id:n.value}):n}default:return I(`${t}.type must be destination, move, line, or node`)}}function xr(e,t){if(e===void 0)return l(void 0);let r=W(e,t);if(!r.ok)return r;let n=Ie(`${t}.provider`,r.value.provider,["codex","local"]);if(!n.ok)return n;let o=h(_o(r.value.conversationHash));if(!o.ok)return o;let i=de(r.value.threadId,`${t}.threadId`);if(!i.ok)return i;let s=h(k(r.value.contextHash,`${t}.contextHash`));if(!s.ok)return s;let a=r.value.worktreeHash===void 0?l(void 0):h(nn(r.value.worktreeHash));if(!a.ok)return a;let d=h(k(r.value.startedAt,`${t}.startedAt`));if(!d.ok)return d;let u=de(r.value.endedAt,`${t}.endedAt`);if(!u.ok)return u;let c={conversationHash:o.value,contextHash:s.value,worktreeHash:a.value,startedAt:d.value};return n.value==="local"?i.value!==void 0?I(`${t}.threadId is only valid for codex conversations`):u.value===void 0?l({provider:"local",...c}):l({provider:"local",...c,endedAt:u.value}):u.value===void 0?l({provider:"codex",...c,threadId:i.value}):l({provider:"codex",...c,threadId:i.value,endedAt:u.value})}function js(e,t){if(e===void 0)return l(void 0);let r=W(e,t);if(!r.ok)return r;let n=h(nn(r.value.worktreeHash));if(!n.ok)return n;let o=h(k(r.value.path,`${t}.path`));if(!o.ok)return o;let i=h(k(r.value.branch,`${t}.branch`));if(!i.ok)return i;let s=h(k(r.value.baseRef,`${t}.baseRef`));if(!s.ok)return s;let a=h(k(r.value.createdAt,`${t}.createdAt`));if(!a.ok)return a;let d=de(r.value.removedAt,`${t}.removedAt`);if(!d.ok)return d;let u={worktreeHash:n.value,path:o.value,branch:i.value,baseRef:s.value,createdAt:a.value};return d.value===void 0?l(u):l({...u,removedAt:d.value})}function iu(e,t){let r=W(e,t);if(!r.ok)return r;let n=Ie(`${t}.kind`,r.value.kind,["local-snapshot","local-root-installed","registry-package","skillMeta"]);if(!n.ok)return n;let o=h(k(r.value.name,`${t}.name`));if(!o.ok)return o;if(n.value==="skillMeta"){let m=h(k(r.value.source,`${t}.source`));if(!m.ok)return m;let f=Ie(`${t}.agent`,r.value.agent,["codex"]);return f.ok?l({kind:"skillMeta",name:o.value,source:m.value,agent:f.value}):f}if(n.value==="local-root-installed"){let m=de(r.value.sourcePath,`${t}.sourcePath`);return m.ok?l({kind:"local-root-installed",name:o.value,sourcePath:m.value}):m}if(n.value==="local-snapshot"){let m=h(k(r.value.sourcePath,`${t}.sourcePath`));if(!m.ok)return m;let f=h(k(r.value.contentHash,`${t}.contentHash`));if(!f.ok)return f;let p=h(k(r.value.snapshotRef,`${t}.snapshotRef`));if(!p.ok)return p;let g=r.value.snapshotFiles===void 0?l(void 0):ww(r.value.snapshotFiles,`${t}.snapshotFiles`);return g.ok?l({kind:"local-snapshot",name:o.value,sourcePath:m.value,contentHash:f.value,snapshotRef:p.value,snapshotFiles:g.value}):g}let i=Ie(`${t}.registryKind`,r.value.registryKind,["apm"]);if(!i.ok)return i;let s=h(k(r.value.registry,`${t}.registry`));if(!s.ok)return s;let a=h(k(r.value.package,`${t}.package`));if(!a.ok)return a;let d=h(k(r.value.version,`${t}.version`));if(!d.ok)return d;if(!Ew(String(d.value)))return I(`${t}.version must be an exact semver version`);let u=h(k(r.value.integrity,`${t}.integrity`));if(!u.ok)return u;let c=h(k(r.value.contentHash,`${t}.contentHash`));return c.ok?r.value.snapshotFiles!==void 0?I(`${t}.snapshotFiles is not supported for registry-package skills`):l({kind:"registry-package",registryKind:i.value,name:o.value,registry:s.value,package:a.value,version:d.value,integrity:u.value,contentHash:c.value}):c}function Cr(e,t,r){if(e===void 0)return l(void 0);let n=W(e,t);if(!n.ok)return n;let o=h(k(n.value.origin,`${t}.origin`));if(!o.ok)return o;let i=Ie(`${t}.kind`,n.value.kind,["team","member","manager","skill"]);if(!i.ok)return i;if(r&&!r.includes(i.value))return I(`${t}.kind must be ${r.join(" or ")}`);let s=h(k(n.value.key,`${t}.key`));if(!s.ok)return s;let a=h(k(n.value.version,`${t}.version`));if(!a.ok)return a;let d=h(k(n.value.integrity,`${t}.integrity`));return d.ok?l({origin:o.value,kind:i.value,key:s.value,version:a.value,integrity:d.value}):d}function pp(e,t){if(e===void 0)return l([]);let r=Ue(e,t);if(!r.ok)return r;let n=[];for(let o=0;o<r.value.length;o+=1){let i=W(r.value[o],`${t}[${o}]`);if(!i.ok)return i;let s=h(k(i.value.executorId,`${t}[${o}].executorId`));if(!s.ok)return s;let a=Cr(i.value.lock,`${t}[${o}].lock`,["member"]);if(!a.ok)return a;if(!a.value)return I(`${t}[${o}].lock is required`);n.push({executorId:s.value,lock:a.value})}return l(n)}function gp(e,t){if(e===void 0)return l([]);let r=Ue(e,t);if(!r.ok)return r;let n=[];for(let o=0;o<r.value.length;o+=1){let i=W(r.value[o],`${t}[${o}]`);if(!i.ok)return i;let s=h(k(i.value.name,`${t}[${o}].name`));if(!s.ok)return s;let a=Cr(i.value.lock,`${t}[${o}].lock`,["skill"]);if(!a.ok)return a;if(!a.value)return I(`${t}[${o}].lock is required`);n.push({name:s.value,lock:a.value})}return l(n)}function Ws(e,t){let r=W(e,t);if(!r.ok)return r;let n=h(k(r.value.name,`${t}.name`));if(!n.ok)return n;let o=h(k(r.value.url,`${t}.url`));if(!o.ok)return o;let i=Ie(`${t}.transport`,r.value.transport,["http","ssh"]);if(!i.ok)return i;let s=de(r.value.identity,`${t}.identity`);return s.ok?l({name:n.value,url:o.value,transport:i.value,identity:s.value}):s}function Jo(e,t){let r=W(e,t);if(!r.ok)return r;let n=h(xf(r.value.id));if(!n.ok)return n;let o=Pw(r.value.owner,`${t}.owner`);if(!o.ok)return o;let i=Ie(`${t}.kind`,r.value.kind,jf);if(!i.ok)return i;let s=de(r.value.path,`${t}.path`);if(!s.ok)return s;let a=de(r.value.text,`${t}.text`);return a.ok?s.value===void 0&&a.value===void 0?I(`${t} must include path, text, or both`):s.value!==void 0&&a.value!==void 0?l({id:n.value,owner:o.value,kind:i.value,path:s.value,text:a.value}):s.value!==void 0?l({id:n.value,owner:o.value,kind:i.value,path:s.value}):l({id:n.value,owner:o.value,kind:i.value,text:a.value}):a}function vp(e,t){let r=W(e,t);if(!r.ok)return r;let n=h(Cf(r.value.id));if(!n.ok)return n;let o=h(k(r.value.title,`${t}.title`));if(!o.ok)return o;let i=Ie(`${t}.kind`,r.value.kind,Wf);if(!i.ok)return i;let s=Ie(`${t}.sourceScope`,r.value.sourceScope,Gf);if(!s.ok)return s;let a=Aw(r.value.env,`${t}.env`);if(!a.ok)return a;let d=bw(r.value.runner,`${t}.runner`);if(!d.ok)return d;let u=xw(r.value.aliases,`${t}.aliases`);if(!u.ok)return u;let c=yw(a.value,u.value,`${t}.env`);if(!c.ok)return c;let m=Cw(r.value.evidence,`${t}.evidence`);if(!m.ok)return m;let f=Os(r.value.displayOrder,`${t}.displayOrder`);return f.ok?i.value==="check"&&d.value.type!=="command"?I(`${t}.runner.type must be command for check actions`):l({id:n.value,title:o.value,kind:i.value,sourceScope:s.value,env:a.value,runner:d.value,aliases:u.value,evidence:m.value,displayOrder:f.value}):f}function yw(e,t,r){let n=new Set(Object.keys(t??{}));for(let[o,i]of Object.entries(e??{})){if("alias"in i&&!n.has(String(i.alias)))return I(`${r}.${o}.alias references unknown alias: ${i.alias}`);if("fromAliasUrl"in i&&!n.has(String(i.fromAliasUrl)))return I(`${r}.${o}.fromAliasUrl references unknown alias: ${i.fromAliasUrl}`)}return l(void 0)}function su(e,t){let r=W(e,t);if(!r.ok)return r;let n=h(Q(r.value.id));if(!n.ok)return n;let o=h(rt(r.value.requestId));if(!o.ok)return o;let i=r.value.teamName===void 0?l(void 0):h(ke(r.value.teamName,`${t}.teamName`));if(!i.ok)return i;let s=Ie(`${t}.status`,r.value.status,$f);if(!s.ok)return s;let a=gw(r.value.moveIds,`${t}.moveIds`,!1);if(!a.ok)return a;let d=h(he(r.value.rootNodeId));if(!d.ok)return d;let u=h(he(r.value.currentNodeId));if(!u.ok)return u;let c=vw(r.value.nodeIds,`${t}.nodeIds`,!0);if(!c.ok)return c;let m=wp(r.value.parentLineId);if(!m.ok)return m;let f=zo(r.value.forkedFromMoveId);if(!f.ok)return f;if(f.value!==void 0&&m.value===void 0)return I(`${t}.parentLineId is required when forkedFromMoveId is present`);let p={id:n.value,requestId:o.value,teamName:i.value,moveIds:a.value,rootNodeId:d.value,currentNodeId:u.value,nodeIds:c.value};if(m.value!==void 0){let v={...p,parentLineId:m.value,forkedFromMoveId:f.value};return cp(v,s.value)}return cp(p,s.value)}function hp(e,t){let r=W(e,t);if(!r.ok)return r;let n=h(Ar(r.value.id));if(!n.ok)return n;let o=h(k(r.value.name,`${t}.name`));if(!o.ok)return o;let i=de(r.value.sourcePath,`${t}.sourcePath`);if(!i.ok)return i;let s=h(k(r.value.draftPath,`${t}.draftPath`));if(!s.ok)return s;let a=Iw(r.value.createdFromNodeId);if(!a.ok)return a;let d=Bt(r.value.createdAt,`${t}.createdAt`);if(!d.ok)return d;let u=Ie(`${t}.status`,r.value.status,Ff);if(!u.ok)return u;let c={id:n.value,name:o.value,sourcePath:i.value,draftPath:s.value,createdFromNodeId:a.value,createdAt:d.value};switch(u.value){case"accepted":{let m=iu(r.value.acceptedSnapshot,`${t}.acceptedSnapshot`);return m.ok?l({...c,status:"accepted",acceptedSnapshot:m.value}):m}case"draft":return r.value.acceptedSnapshot!==void 0?I(`${t}.acceptedSnapshot is only valid for accepted Skill Drafts`):l({...c,status:"draft"});case"discarded":return r.value.acceptedSnapshot!==void 0?I(`${t}.acceptedSnapshot is only valid for accepted Skill Drafts`):l({...c,status:"discarded"})}}function yp(e,t,r){let n=W(e,t);if(!n.ok)return n;let o=h(Do(n.value.id));if(!o.ok)return o;let i=h(Q(n.value.sourceLineId));if(!i.ok)return i;let s=h(he(n.value.sourceNodeId));if(!s.ok)return s;let a=zo(n.value.sourceMoveId);if(!a.ok)return a;let d=fp(n.value.target,`${t}.target`);if(!d.ok)return d;let u=h(ke(n.value.newTeamName,`${t}.newTeamName`));if(!u.ok)return u;let c=h(yt(n.value.summary,`${t}.summary`));if(!c.ok)return c;let m=au(n.value.teamSnapshot,`${t}.teamSnapshot`,r);if(!m.ok)return m;let f=kp(n.value.changedFiles,`${t}.changedFiles`);if(!f.ok)return f;let p=Bt(n.value.createdAt,`${t}.createdAt`);if(!p.ok)return p;let g=Bt(n.value.updatedAt,`${t}.updatedAt`);if(!g.ok)return g;let v=Ie(`${t}.status`,n.value.status,Uf);if(!v.ok)return v;let A={id:o.value,sourceLineId:i.value,sourceNodeId:s.value,sourceMoveId:a.value,target:d.value,newTeamName:u.value,summary:c.value,teamSnapshot:m.value,changedFiles:f.value,createdAt:p.value,updatedAt:g.value};switch(v.value){case"ready":{let D=h(Rt(n.value.hunsuId));if(!D.ok)return D;let R=h(Q(n.value.newLineId));if(!R.ok)return R;if(n.value.conversationRef===void 0)return I(`${t}.conversationRef is required for ready HUNSU Drafts`);let P=xr(n.value.conversationRef,`${t}.conversationRef`);return P.ok?P.value?l({...A,status:"ready",hunsuId:D.value,newLineId:R.value,conversationRef:P.value}):I(`${t}.conversationRef is required for ready HUNSU Drafts`):P}case"confirmed":{let D=h(Rt(n.value.hunsuId));if(!D.ok)return D;let R=h(Q(n.value.newLineId));if(!R.ok)return R;if(n.value.conversationRef===void 0)return I(`${t}.conversationRef is required for confirmed HUNSU Drafts`);let P=xr(n.value.conversationRef,`${t}.conversationRef`);return P.ok?P.value?l({...A,status:"confirmed",hunsuId:D.value,newLineId:R.value,conversationRef:P.value}):I(`${t}.conversationRef is required for confirmed HUNSU Drafts`):P}case"draft":return n.value.hunsuId!==void 0||n.value.newLineId!==void 0||n.value.conversationRef!==void 0?I(`${t} draft status cannot carry hunsuId, newLineId, or conversationRef`):l({...A,status:"draft"});case"discarded":if(n.value.hunsuId!==void 0||n.value.newLineId!==void 0)return I(`${t} discarded status cannot carry hunsuId or newLineId`);if(n.value.conversationRef===void 0)return l({...A,status:"discarded"});let C=xr(n.value.conversationRef,`${t}.conversationRef`);return C.ok?l({...A,status:"discarded",conversationRef:C.value}):C}}function Sp(e,t,r){let n=W(e,t);if(!n.ok)return n;let o=h(Ae(n.value.id));if(!o.ok)return o;let i=h(Q(n.value.lineId));if(!i.ok)return i;let s=h(he(n.value.fromNodeId));if(!s.ok)return s;let a=h(he(n.value.toNodeId));if(!a.ok)return a;let d=n.value.teamName===void 0?l(void 0):h(ke(n.value.teamName,`${t}.teamName`));if(!d.ok)return d;let u=n.value.ordinal===void 0?l(void 0):Os(n.value.ordinal,`${t}.ordinal`);if(!u.ok)return u;let c=n.value.snapshot===void 0?l(void 0):au(n.value.snapshot,`${t}.snapshot`,r);if(!c.ok)return c;let m=kw(n.value.sourceHunsuId);if(!m.ok)return m;let f=Gs(n.value.executeId);if(!f.ok)return f;let p=xr(n.value.conversationRef,`${t}.conversationRef`);if(!p.ok)return p;let g=js(n.value.worktree,`${t}.worktree`);if(!g.ok)return g;let v=h(yt(n.value.summary,`${t}.summary`));if(!v.ok)return v;let A=h(rn(n.value.commit,`${t}.commit`));if(!A.ok)return A;let C=Us(n.value.evidence,`${t}.evidence`,!0);if(!C.ok)return C;let D=hw(n.value.risks,`${t}.risks`);if(!D.ok)return D;let R=Ie(`${t}.recordedBy`,n.value.recordedBy,["SYSTEM"]);if(!R.ok)return R;let P=Bt(n.value.recordedAt,`${t}.recordedAt`);if(!P.ok)return P;let L=Ie(`${t}.outcome`,n.value.outcome,Lf);if(!L.ok)return L;let q={id:o.value,lineId:i.value,fromNodeId:s.value,toNodeId:a.value,teamName:d.value,ordinal:u.value,snapshot:c.value,sourceHunsuId:m.value,executeId:f.value,conversationRef:p.value,worktree:g.value,summary:v.value,commit:A.value,evidence:C.value,risks:D.value,recordedBy:R.value,recordedAt:P.value};if(L.value==="arrived"){let y=Bs(n.value.reachedDestinationIds,`${t}.reachedDestinationIds`,!0);if(!y.ok)return y;let E=h(Gn(y.value,`${t}.reachedDestinationIds`));return E.ok?n.value.failureReason!==void 0?I(`${t}.failureReason is only valid for accident MOVEs`):l({...q,outcome:"arrived",reachedDestinationIds:E.value}):E}let ve=Bs(n.value.reachedDestinationIds,`${t}.reachedDestinationIds`,!1);if(!ve.ok)return ve;if(ve.value.length!==0)return I(`${t}.reachedDestinationIds must be empty for accident MOVEs`);let z=h(St(n.value.failureReason,`${t}.failureReason`));return z.ok?l({...q,outcome:"accident",reachedDestinationIds:[],failureReason:z.value}):z}function Rp(e,t,r){let n=W(e,t);if(!n.ok)return n;let o=h(Rt(n.value.id));if(!o.ok)return o;let i=Rw(n.value.hunsuDraftId);if(!i.ok)return i;let s=xr(n.value.conversationRef,`${t}.conversationRef`);if(!s.ok)return s;let a=h(Q(n.value.lineId));if(!a.ok)return a;let d=h(he(n.value.fromNodeId));if(!d.ok)return d;let u=h(he(n.value.toNodeId));if(!u.ok)return u;let c=fp(n.value.target,`${t}.target`);if(!c.ok)return c;let m=h(yt(n.value.summary,`${t}.summary`));if(!m.ok)return m;let f=n.value.newLineId===void 0?l(void 0):h(Q(n.value.newLineId));if(!f.ok)return f;let p=zo(n.value.sourceMoveId);if(!p.ok)return p;let g=n.value.newTeamName===void 0?l(void 0):h(ke(n.value.newTeamName,`${t}.newTeamName`));if(!g.ok)return g;let v=au(n.value.teamSnapshot,`${t}.teamSnapshot`,r);if(!v.ok)return v;let A=kp(n.value.changedFiles,`${t}.changedFiles`);if(!A.ok)return A;let C=Ie(`${t}.recordedBy`,n.value.recordedBy,["DIRECTOR"]);if(!C.ok)return C;let D=Bt(n.value.recordedAt,`${t}.recordedAt`);return D.ok?l({id:o.value,hunsuDraftId:i.value,conversationRef:s.value,lineId:a.value,fromNodeId:d.value,toNodeId:u.value,target:c.value,summary:m.value,newLineId:f.value,sourceMoveId:p.value,newTeamName:g.value,teamSnapshot:v.value,changedFiles:A.value,recordedBy:C.value,recordedAt:D.value}):D}function kp(e,t){let r=Ue(e,t);if(!r.ok)return r;if(r.value.length===0)return I(`${t} must contain at least one changed file`);let n=[];for(let o=0;o<r.value.length;o+=1){let i=Sw(r.value[o],`${t}[${o}]`);if(!i.ok)return i;n.push(i.value)}return l(n)}function Sw(e,t){let r=W(e,t);if(!r.ok)return r;let n=h(k(r.value.path,`${t}.path`));if(!n.ok)return n;let o=Ie(`${t}.kind`,r.value.kind,["added","updated","removed"]);if(!o.ok)return o;let i=h(yt(r.value.summary,`${t}.summary`));return i.ok?l({path:n.value,kind:o.value,summary:i.value}):i}function Ip(e,t,r){let n=W(e,t);if(!n.ok)return n;let o=h(he(n.value.id));if(!o.ok)return o;let i=h(rt(n.value.requestId));if(!i.ok)return i;let s=wp(n.value.lineId);if(!s.ok)return s;let a=n.value.teamName===void 0?l(void 0):h(ke(n.value.teamName,`${t}.teamName`));if(!a.ok)return a;let d=Os(n.value.ordinal,`${t}.ordinal`);if(!d.ok)return d;let u=mp(n.value.destinations,`${t}.destinations`);if(!u.ok)return u;let c=r(n.value.harness);if(!c.ok)return c;let m=Ep(n.value.harnessGraph,c.value,`${t}.harnessGraph`);if(!m.ok)return m;let f=Cr(n.value.harnessLock,`${t}.harnessLock`,["team"]);if(!f.ok)return f;let p=pp(n.value.executorPackageBindings,`${t}.executorPackageBindings`);if(!p.ok)return p;let g=gp(n.value.resourcePackageBindings,`${t}.resourcePackageBindings`);if(!g.ok)return g;let v=Ko(n.value.artifactActions??[],`${t}.artifactActions`);if(!v.ok)return v;let A=Tw(n.value.source,`${t}.source`);if(!A.ok)return A;let C=Bt(n.value.createdAt,`${t}.createdAt`);return C.ok?l({id:o.value,requestId:i.value,lineId:s.value,teamName:a.value,ordinal:d.value,destinations:u.value,harness:c.value,harnessGraph:m.value,harnessLock:f.value,executorPackageBindings:p.value,resourcePackageBindings:g.value,artifactActions:v.value,source:A.value,createdAt:C.value}):C}function Rw(e){return e===void 0?l(void 0):h(Do(e))}function kw(e){return e===void 0?l(void 0):h(Rt(e))}function zo(e){return e===void 0?l(void 0):h(Ae(e))}function wp(e){return e===void 0?l(void 0):h(Q(e))}function Iw(e){return e===void 0?l(void 0):h(he(e))}function Gs(e){return e===void 0?l(void 0):h(Tf(e))}function au(e,t,r){let n=W(e,t);if(!n.ok)return n;let o=h(ke(n.value.teamName,`${t}.teamName`));if(!o.ok)return o;let i=Os(n.value.moveOrdinal,`${t}.moveOrdinal`);if(!i.ok)return i;let s=mp(n.value.destinations,`${t}.destinations`);if(!s.ok)return s;let a=r(n.value.harness);if(!a.ok)return a;let d=Ep(n.value.harnessGraph,a.value,`${t}.harnessGraph`);if(!d.ok)return d;let u=Cr(n.value.harnessLock,`${t}.harnessLock`,["team"]);if(!u.ok)return u;let c=pp(n.value.executorPackageBindings,`${t}.executorPackageBindings`);if(!c.ok)return c;let m=gp(n.value.resourcePackageBindings,`${t}.resourcePackageBindings`);if(!m.ok)return m;let f=Ko(n.value.artifactActions??[],`${t}.artifactActions`);return f.ok?l({teamName:o.value,moveOrdinal:i.value,destinations:s.value,harness:a.value,harnessGraph:d.value,harnessLock:u.value,executorPackageBindings:c.value,resourcePackageBindings:m.value,artifactActions:f.value}):f}function Ep(e,t,r){return e===void 0?l(Nt(t)):sn(e,r)}function Ko(e,t){let r=Ue(e,t);if(!r.ok)return r;let n=[];for(let o=0;o<r.value.length;o+=1){let i=vp(r.value[o],`${t}[${o}]`);if(!i.ok)return i;if(n.some(s=>s.id===i.value.id))return I(`${t} contains duplicate ArtifactActionId: ${i.value.id}`);n.push(i.value)}return l(n)}function ww(e,t){let r=Ue(e,t);if(!r.ok)return r;let n=[];for(let o=0;o<r.value.length;o+=1){let i=W(r.value[o],`${t}[${o}]`);if(!i.ok)return i;let s=h(k(i.value.path,`${t}[${o}].path`));if(!s.ok)return s;let a=i.value.text;if(typeof a!="string")return I(`${t}[${o}].text must be a string`);n.push({path:s.value,text:a})}return l(n)}function Ew(e){return/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/.test(e)}function Pw(e,t){let r=W(e,t);if(!r.ok)return r;switch(r.value.type){case"move":{let n=h(Ae(r.value.id));return n.ok?l({type:"move",id:n.value}):n}case"hunsu":{let n=h(Rt(r.value.id));return n.ok?l({type:"hunsu",id:n.value}):n}case"line":{let n=h(Q(r.value.id));return n.ok?l({type:"line",id:n.value}):n}default:return I(`${t}.type must be move, hunsu, or line`)}}function Aw(e,t){if(e===void 0)return l(void 0);let r=W(e,t);if(!r.ok)return r;let n={};for(let[o,i]of Object.entries(r.value)){if(!/^[A-Za-z_][A-Za-z0-9_]*$/.test(o))return I(`${t}.${o} must be a valid environment variable name`);let s=W(i,`${t}.${o}`);if(!s.ok)return s;if(["default","value","required","alias","fromAliasUrl"].filter(d=>d in s.value).length!==1)return I(`${t}.${o} must declare exactly one of default, value, required, alias, or fromAliasUrl`);if("default"in s.value){let d=up(s.value.default,`${t}.${o}.default`);if(!d.ok)return d;n[o]={default:d.value}}else if("value"in s.value){let d=up(s.value.value,`${t}.${o}.value`);if(!d.ok)return d;n[o]={value:d.value}}else if("alias"in s.value){let d=h(k(s.value.alias,`${t}.${o}.alias`));if(!d.ok)return d;n[o]={alias:d.value}}else if("fromAliasUrl"in s.value){let d=h(k(s.value.fromAliasUrl,`${t}.${o}.fromAliasUrl`));if(!d.ok)return d;n[o]={fromAliasUrl:d.value}}else{if(s.value.required!==!0)return I(`${t}.${o}.required must be true`);let d=lp(s.value.secret,`${t}.${o}.secret`);if(!d.ok)return d;n[o]={required:!0,secret:d.value}}}return l(n)}function bw(e,t){let r=W(e,t);if(!r.ok)return r;switch(r.value.type){case"docker_compose":{let n=h(k(r.value.file,`${t}.file`));if(!n.ok)return n;let o=de(r.value.projectName,`${t}.projectName`);return o.ok?l({type:"docker_compose",file:n.value,projectName:o.value}):o}case"command":{let n=h(k(r.value.command,`${t}.command`));if(!n.ok)return n;let o=de(r.value.stopCommand,`${t}.stopCommand`);return o.ok?l({type:"command",command:n.value,stopCommand:o.value}):o}default:return I(`${t}.type must be docker_compose or command`)}}function xw(e,t){if(e===void 0)return l(void 0);let r=W(e,t);if(!r.ok)return r;let n={};for(let[o,i]of Object.entries(r.value)){if(!/^[A-Za-z][A-Za-z0-9_-]*$/.test(o))return I(`${t}.${o} must start with a letter and contain only letters, numbers, "_" or "-"`);let s=W(i,`${t}.${o}`);if(!s.ok)return s;let a="target"in s.value,d="service"in s.value,u="containerPort"in s.value;if(a&&(d||u||"healthPath"in s.value))return I(`${t}.${o} must not mix target with docker service fields`);if(a){let p=h(k(s.value.target,`${t}.${o}.target`));if(!p.ok)return p;n[o]={target:p.value};continue}if(!d||!u)return I(`${t}.${o} must declare either target or both service and containerPort`);let c=h(k(s.value.service,`${t}.${o}.service`));if(!c.ok)return c;let m=h(ir(s.value.containerPort,`${t}.${o}.containerPort`));if(!m.ok)return m;let f=de(s.value.healthPath,`${t}.${o}.healthPath`);if(!f.ok)return f;n[o]={service:c.value,containerPort:m.value,healthPath:f.value}}return l(n)}function Cw(e,t){if(e===void 0)return l(void 0);let r=W(e,t);if(!r.ok)return r;let n=cw(r.value.paths,`${t}.paths`);if(!n.ok)return n;let o=lp(r.value.attach,`${t}.attach`);return o.ok?l({attach:o.value,paths:n.value}):o}function up(e,t){return typeof e=="string"||typeof e=="number"||typeof e=="boolean"?l(e):I(`${t} must be a string, number, or boolean`)}function qs(e,t,r){let n=new Set;for(let o of e){if(n.has(o))return I(`${t} contains duplicate ${r}: ${o}`);n.add(o)}return l(void 0)}function Tw(e,t){let r=W(e,t);if(!r.ok)return r;switch(r.value.type){case"initial-execute-team":case"request":{let n=h(rt(r.value.requestId));return n.ok?l({type:r.value.type,requestId:n.value}):n}case"move":{let n=h(Ae(r.value.moveId));if(!n.ok)return n;let o=h(he(r.value.fromNodeId));return o.ok?l({type:"move",moveId:n.value,fromNodeId:o.value}):o}case"hunsu":{let n=h(Rt(r.value.hunsuId));if(!n.ok)return n;let o=h(he(r.value.fromNodeId));return o.ok?l({type:"hunsu",hunsuId:n.value,fromNodeId:o.value}):o}default:return I(`${t}.type must be a supported node source type`)}}function cp(e,t){switch(t){case"active":return l({...e,status:"active"});case"paused":return l({...e,status:"paused"});case"complete":return l({...e,status:"complete"});case"failed":return l({...e,status:"failed"});case"abandoned":return l({...e,status:"abandoned"})}}function Dw(e,t,r,n){let o=Kn(e,t,r);return o.ok?l({...n,status:"pending"}):o}function Kn(e,t,r){let n=r.find(o=>e[o]!==void 0);return n?I(`${t}.${n} is not valid for this lifecycle status`):l(void 0)}function h(e){return e.ok?l(e.value):I(e.error.message)}function Pp(e,t){let r=W(e,"Command");if(!r.ok)return r;switch(r.value.type){case"RegisterHunsuOrigin":{let n=Ws(r.value.origin,"origin");if(!n.ok)return n;let o=de(r.value.actor,"actor");if(!o.ok)return o;let i=K(r.value.at);return i.ok?l({type:"RegisterHunsuOrigin",origin:n.value,actor:o.value,at:i.value}):i}case"CreateInitialTeam":{let n=U(rt(r.value.requestId));if(!n.ok)return n;let o=U(Q(r.value.lineId));if(!o.ok)return o;let i=U(ys(r.value.title));if(!i.ok)return i;let s=U(Ss(r.value.goal));if(!s.ok)return s;let a=Ls(r.value.destinations,"destinations");if(!a.ok)return a;let d=r.value.harness===void 0?l(void 0):t(r.value.harness);if(!d.ok)return d;let u=Cr(r.value.harnessLock,"harnessLock",["team"]);if(!u.ok)return u;let c=r.value.teamName===void 0?l(void 0):U(ke(r.value.teamName));if(!c.ok)return c;let m=de(r.value.actor,"actor");if(!m.ok)return m;let f=K(r.value.at);return f.ok?l({type:"CreateInitialTeam",requestId:n.value,lineId:o.value,title:i.value,goal:s.value,destinations:a.value,harness:d.value,harnessLock:u.value,teamName:c.value,actor:m.value,at:f.value}):f}case"StartLine":{let n=U(rt(r.value.requestId));if(!n.ok)return n;let o=U(Q(r.value.lineId));if(!o.ok)return o;let i=r.value.teamName===void 0?l(void 0):U(ke(r.value.teamName));if(!i.ok)return i;let s=K(r.value.at);return s.ok?l({type:"StartLine",lineId:o.value,requestId:n.value,teamName:i.value,at:s.value}):s}case"PauseLine":case"ResumeLine":{let n=U(Q(r.value.lineId));if(!n.ok)return n;let o=K(r.value.at);return o.ok?l({type:r.value.type,lineId:n.value,at:o.value}):o}case"AcceptLine":case"RejectLine":{let n=U(Q(r.value.lineId));if(!n.ok)return n;let o=de(r.value.reason,"reason");if(!o.ok)return o;let i=K(r.value.at);return i.ok?l({type:r.value.type,lineId:n.value,reason:o.value,at:i.value}):i}case"ClaimDestination":case"StartDestinationWork":{let n=U(ut(r.value.destinationId));if(!n.ok)return n;let o=U(k(r.value.actor,"actor"));if(!o.ok)return o;let i=K(r.value.at);return i.ok?l({type:r.value.type,destinationId:n.value,actor:o.value,at:i.value}):i}case"ReportDestinationBlocked":{let n=U(ut(r.value.destinationId));if(!n.ok)return n;let o=U(St(r.value.reason,"reason"));if(!o.ok)return o;let i=U(k(r.value.actor,"actor"));if(!i.ok)return i;let s=K(r.value.at);return s.ok?l({type:"ReportDestinationBlocked",destinationId:n.value,reason:o.value,actor:i.value,at:s.value}):s}case"RecordMove":{let n=U(Q(r.value.lineId));if(!n.ok)return n;let o=U(Ae(r.value.moveId));if(!o.ok)return o;let i=U(yt(r.value.summary));if(!i.ok)return i;let s=U(rn(r.value.commit,"commit"));if(!s.ok)return s;let a=Bs(r.value.reachedDestinationIds,"reachedDestinationIds",!0);if(!a.ok)return a;let d=U(Gn(a.value,"reachedDestinationIds"));if(!d.ok)return d;let u=Us(r.value.evidence,"evidence",!0);if(!u.ok)return u;let c=r.value.risks===void 0?l(void 0):Fs(r.value.risks,"risks");if(!c.ok)return c;let m=Gs(r.value.executeId);if(!m.ok)return m;let f=xr(r.value.conversationRef,"conversationRef");if(!f.ok)return f;let p=js(r.value.worktree,"worktree");if(!p.ok)return p;let g=U(k(r.value.actor,"actor"));if(!g.ok)return g;let v=K(r.value.at);return v.ok?l({type:"RecordMove",lineId:n.value,moveId:o.value,summary:i.value,commit:s.value,reachedDestinationIds:d.value,evidence:u.value,risks:c.value,executeId:m.value,conversationRef:f.value,worktree:p.value,actor:g.value,at:v.value}):v}case"RecordAccident":{let n=U(Q(r.value.lineId));if(!n.ok)return n;let o=U(Ae(r.value.moveId));if(!o.ok)return o;let i=U(yt(r.value.summary));if(!i.ok)return i;let s=U(rn(r.value.commit,"commit"));if(!s.ok)return s;let a=Us(r.value.evidence,"evidence",!0);if(!a.ok)return a;let d=U(St(r.value.failureReason));if(!d.ok)return d;let u=r.value.risks===void 0?l(void 0):Fs(r.value.risks,"risks");if(!u.ok)return u;let c=Gs(r.value.executeId);if(!c.ok)return c;let m=xr(r.value.conversationRef,"conversationRef");if(!m.ok)return m;let f=js(r.value.worktree,"worktree");if(!f.ok)return f;let p=U(k(r.value.actor,"actor"));if(!p.ok)return p;let g=K(r.value.at);return g.ok?l({type:"RecordAccident",lineId:n.value,moveId:o.value,summary:i.value,commit:s.value,evidence:a.value,failureReason:d.value,risks:u.value,executeId:c.value,conversationRef:m.value,worktree:f.value,actor:p.value,at:g.value}):g}case"AttachMoveEvidence":{let n=U(Ae(r.value.moveId));if(!n.ok)return n;let o=Jo(r.value.artifact,"artifact");if(!o.ok)return o;let i=U(k(r.value.actor,"actor"));if(!i.ok)return i;let s=K(r.value.at);return s.ok?l({type:"AttachMoveEvidence",moveId:n.value,artifact:o.value,actor:i.value,at:s.value}):s}case"ConfirmHunsuDraft":{let n=yp(r.value.draft,"draft",t);if(!n.ok)return n;if(n.value.status!=="ready")return I(`HUNSU Draft ${n.value.id} cannot be confirmed from status ${n.value.status}`);let o=U(k(r.value.actor,"actor"));if(!o.ok)return o;let i=K(r.value.at);return i.ok?l({type:"ConfirmHunsuDraft",draft:n.value,actor:o.value,at:i.value}):i}case"CreateSkillDraft":{let n=U(Ar(r.value.draftId));if(!n.ok)return n;let o=U(Q(r.value.lineId));if(!o.ok)return o;let i=U(k(r.value.name,"name"));if(!i.ok)return i;let s=U(k(r.value.draftPath,"draftPath"));if(!s.ok)return s;let a=de(r.value.sourcePath,"sourcePath");if(!a.ok)return a;let d=U(k(r.value.actor,"actor"));if(!d.ok)return d;let u=K(r.value.at);return u.ok?l({type:"CreateSkillDraft",draftId:n.value,lineId:o.value,name:i.value,draftPath:s.value,sourcePath:a.value,actor:d.value,at:u.value}):u}case"DiscardSkillDraft":{let n=U(Ar(r.value.draftId));if(!n.ok)return n;let o=U(k(r.value.actor,"actor"));if(!o.ok)return o;let i=K(r.value.at);return i.ok?l({type:"DiscardSkillDraft",draftId:n.value,actor:o.value,at:i.value}):i}case"RecordArtifact":{let n=Jo(r.value.artifact,"artifact");if(!n.ok)return n;let o=K(r.value.at);return o.ok?l({type:"RecordArtifact",artifact:n.value,at:o.value}):o}default:return I(`Unsupported command type: ${String(r.value.type)}`)}}function U(e){return e.ok?l(e.value):I(e.error.message)}function Ap(e,t){let r=W(e,"DomainEvent");if(!r.ok)return r;switch(r.value.type){case"HunsuOriginRegistered":{let n=Ws(r.value.origin,"event.origin");if(!n.ok)return n;let o=K(r.value.at,"event.at");return o.ok?l({type:"HunsuOriginRegistered",origin:n.value,at:o.value}):o}case"InitialTeamCreated":{let n=ou(r.value.request,"event.request");if(!n.ok)return n;let o=su(r.value.line,"event.line");if(!o.ok)return o;let i=Ls(r.value.destinations,"event.destinations");if(!i.ok)return i;let s=r.value.harness===void 0?l(void 0):t(r.value.harness);if(!s.ok)return s;let a=Cr(r.value.harnessLock,"event.harnessLock",["team"]);if(!a.ok)return a;let d=K(r.value.at,"event.at");return d.ok?l({type:"InitialTeamCreated",request:n.value,line:o.value,destinations:i.value,harness:s.value,harnessLock:a.value,at:d.value}):d}case"RequestCreated":{let n=ou(r.value.request,"event.request");return n.ok?l({type:"RequestCreated",request:n.value}):n}case"DestinationDeclared":{let n=De(rt(r.value.requestId));if(!n.ok)return n;let o=$s(r.value.destination,"event.destination");if(!o.ok)return o;let i=K(r.value.at,"event.at");return i.ok?l({type:"DestinationDeclared",requestId:n.value,destination:o.value,at:i.value}):i}case"HarnessSeeded":{let n=De(rt(r.value.requestId));if(!n.ok)return n;let o=t(r.value.harness);if(!o.ok)return o;let i=K(r.value.at,"event.at");return i.ok?l({type:"HarnessSeeded",requestId:n.value,harness:o.value,at:i.value}):i}case"LineStarted":{let n=su(r.value.line,"event.line");return n.ok?l({type:"LineStarted",line:n.value}):n}case"SkillDraftCreated":{let n=hp(r.value.draft,"event.draft");return n.ok?l({type:"SkillDraftCreated",draft:n.value}):n}case"SkillDraftAccepted":{let n=De(Ar(r.value.draftId));if(!n.ok)return n;let o=iu(r.value.skill,"event.skill");if(!o.ok)return o;let i=K(r.value.at,"event.at");return i.ok?l({type:"SkillDraftAccepted",draftId:n.value,skill:o.value,at:i.value}):i}case"SkillDraftDiscarded":{let n=De(Ar(r.value.draftId));if(!n.ok)return n;let o=K(r.value.at,"event.at");return o.ok?l({type:"SkillDraftDiscarded",draftId:n.value,at:o.value}):o}case"NodeCreated":{let n=Ip(r.value.node,"event.node",t);return n.ok?l({type:"NodeCreated",node:n.value}):n}case"LinePaused":case"LineResumed":{let n=De(Q(r.value.lineId));if(!n.ok)return n;let o=K(r.value.at,"event.at");return o.ok?l({type:r.value.type,lineId:n.value,at:o.value}):o}case"LineAccepted":case"LineRejected":{let n=De(Q(r.value.lineId));if(!n.ok)return n;let o=de(r.value.reason,"event.reason");if(!o.ok)return o;let i=K(r.value.at,"event.at");return i.ok?l({type:r.value.type,lineId:n.value,reason:o.value,at:i.value}):i}case"DestinationClaimed":case"DestinationWorkStarted":{let n=De(ut(r.value.destinationId));if(!n.ok)return n;let o=nu(r.value.actor,"event.actor");if(!o.ok)return o;let i=K(r.value.at,"event.at");return i.ok?l({type:r.value.type,destinationId:n.value,actor:o.value,at:i.value}):i}case"DestinationBlocked":{let n=De(ut(r.value.destinationId));if(!n.ok)return n;let o=De(St(r.value.reason,"event.reason"));if(!o.ok)return o;let i=nu(r.value.actor,"event.actor");if(!i.ok)return i;let s=K(r.value.at,"event.at");return s.ok?l({type:"DestinationBlocked",destinationId:n.value,reason:o.value,actor:i.value,at:s.value}):s}case"MoveRecorded":{let n=Sp(r.value.move,"event.move",t);return n.ok?l({type:"MoveRecorded",move:n.value}):n}case"DestinationReached":{let n=De(ut(r.value.destinationId));if(!n.ok)return n;let o=De(Ae(r.value.moveId));if(!o.ok)return o;let i=K(r.value.at,"event.at");return i.ok?l({type:"DestinationReached",destinationId:n.value,moveId:o.value,at:i.value}):i}case"HunsuRecorded":{let n=Rp(r.value.hunsu,"event.hunsu",t);return n.ok?l({type:"HunsuRecorded",hunsu:n.value}):n}case"LineForkedByHunsu":{let n=De(Rt(r.value.hunsuId));if(!n.ok)return n;let o=De(Q(r.value.fromLineId));if(!o.ok)return o;let i=De(Q(r.value.newLineId));if(!i.ok)return i;let s=r.value.newTeamName??r.value.newTeamName,a=s===void 0?l(void 0):De(ke(s,(s===r.value.newTeamName,"event.newTeamName")));if(!a.ok)return a;let d=zo(r.value.fromMoveId);if(!d.ok)return d;let u=De(rt(r.value.requestId));if(!u.ok)return u;let c=K(r.value.at,"event.at");return c.ok?l({type:"LineForkedByHunsu",hunsuId:n.value,fromLineId:o.value,newLineId:i.value,newTeamName:a.value,fromMoveId:d.value,requestId:u.value,at:c.value}):c}case"ArtifactRecorded":{let n=Jo(r.value.artifact,"event.artifact");if(!n.ok)return n;let o=K(r.value.at,"event.at");return o.ok?l({type:"ArtifactRecorded",artifact:n.value,at:o.value}):o}default:return I(`Unsupported Hunsu domain event type: ${String(r.value.type)}`)}}function De(e){return e.ok?l(e.value):I(e.error.message)}var du=["T1","Gen.G","Hanwha Life Esports","KT Rolster","Dplus KIA","DRX","Nongshim RedForce","BNK FearX","DN Freecs","OKSavingsBank BRION","Bilibili Gaming","JD Gaming","Top Esports","Anyone's Legend","Ninjas in Pyjamas","Weibo Gaming","Invictus Gaming","Team WE","LNG Esports","TT Gaming","LGD Gaming","EDward Gaming","Ultra Prime","Oh My God","Cloud9","Team Liquid","FlyQuest","Shopify Rebellion","100 Thieves","Dignitas","LYON","Sentinels","G2 Esports","Fnatic","Karmine Corp","Team Vitality","Team Heretics","GIANTX","Movistar KOI","SK Gaming","Natus Vincere","Rogue"];function fe(e,t){return e.some(r=>r.id===t.id)?e.map(r=>r.id===t.id?t:r):[...e,t]}function uu(e){return Array.from(new Set(e))}function Ot(e){return V(he(`${e}:root`))}function Vs(e){let t=e.nodes.reduce((r,n)=>{let o=n.id.match(/^N(\d+)$/i);return o?Math.max(r,Number(o[1])):r},0);return V(he(`N${String(t+1).padStart(4,"0")}`))}function $t(e){let t=new Set(e.lines.map(n=>n.teamName).filter(n=>!!n)),r=du.find(n=>!t.has(n));return r?V(ke(r)):V(ke(`${du[e.lines.length%du.length]}-${e.lines.length+1}`))}function bp(e,t){if(!e.requests.some(r=>r.id===t))throw new Z(`Unknown request: ${t}`)}function _e(e,t){let r=e.lines.find(n=>n.id===t);if(!r)throw new Z(`Unknown line: ${t}`);return r}function cu(e){if(e.status!=="active")throw new Z(`TEAM line ${e.id} cannot continue from status ${e.status}`)}function dn(e,t){let r=e.nodes.find(n=>n.id===t);if(!r)throw new Z(`Unknown node: ${t}`);return r}function Js(e,t){return dn(e,Ot(t))}function zs(e,t){return dn(e,t.currentNodeId)}function lu(e,t){let r=e.moves.find(n=>n.id===t);if(!r)throw new Z(`Unknown MOVE: ${t}`);return r}function xp(e,t){let r=e.skillDrafts.find(n=>n.id===t);if(!r)throw new Z(`Unknown Skill Draft: ${t}`);return r}function Ks(e,t){let r=e.destinations.find(n=>n.id===t);if(!r)throw new Z(`Unknown Destination: ${t}`);return r}function _w(e,t){let r=e.destinations.find(n=>n.id===t);if(!r)throw new Z(`Unknown Destination in node ${e.id}: ${t}`);return r}function Cp(e,t){let r=Ks(e,t);if(r.status!=="pending"&&r.status!=="blocked")throw new Z(`Destination ${t} cannot be claimed from status ${r.status}`);return r}function Tp(e,t){let r=Ks(e,t);if(_p(r))throw new Z(`Destination ${t} cannot be blocked from status ${r.status}`);return r}function Dp(e,t){let r=_w(e,t);if(_p(r))throw new Z(`Destination ${t} cannot be reached from status ${r.status}`);return r}function _p(e){return e.status==="reached"||e.status==="canceled"||e.status==="superseded"}function Xo(e,t){if(e.length===0)throw new Z(t)}function Mp(e,t){if(e.length!==1)throw new Z(t)}function Hp(e,t){if(e.trim()==="")throw new Z(t)}function Tr(){return{origins:[],requests:[],destinations:[],nodes:[],edges:[],lines:[],moves:[],hunsus:[],skillDrafts:[],artifacts:[],artifactActions:[],futureConstraints:[]}}function Bp(e){return nt(e.reduce((t,r)=>pu(t,r),Tr()))}function Dr(e){let t=Op(e);if(!t.ok)return t;try{return l(Bp(e))}catch(r){return S(Mo(r))}}function Op(e){let t={requestIds:new Set,destinationIds:new Set,lineIds:new Set,moveIds:new Set,hunsuIds:new Set,skillDraftIds:new Set,artifactIds:new Set},r=Tr();for(let n=0;n<e.length;n+=1){let o=e[n],i=Hw(o,n,t);if(!i.ok)return i;let s=Nw(o,n,r);if(!s.ok)return s;try{r=pu(r,o)}catch(d){return S(Mo(d))}let a=Vw(r,n);if(!a.ok)return a}return l(e)}function pu(e,t){switch(t.type){case"HunsuOriginRegistered":return{...e,origins:Mw(e.origins,t.origin)};case"InitialTeamCreated":return zw(e,t);case"RequestCreated":return nt({...e,requests:fe(e.requests,t.request)});case"DestinationDeclared":return Kw(e,t.requestId,t.destination,t.at);case"HarnessSeeded":return Xw(e,t.requestId,t.harness,t.at);case"LineStarted":return nt({...e,lines:fe(e.lines,Lp(e,t.line))});case"SkillDraftCreated":return{...e,skillDrafts:fe(e.skillDrafts,t.draft)};case"SkillDraftAccepted":return{...e,skillDrafts:e.skillDrafts.map(r=>r.id===t.draftId?V(Zd(r,{...t.skill})):r)};case"SkillDraftDiscarded":return{...e,skillDrafts:e.skillDrafts.map(r=>r.id===t.draftId?V(eu(r)):r)};case"NodeCreated":return nt({...e,nodes:fe(e.nodes,t.node)});case"LinePaused":return Yo(e,t.lineId,Wo);case"LineResumed":return Yo(e,t.lineId,Go);case"LineAccepted":return Yo(e,t.lineId,qo);case"LineRejected":return Yo(e,t.lineId,Vo);case"DestinationClaimed":return fu(e,t.destinationId,r=>Lo(r,{claimedBy:t.actor,updatedBy:"TEAM",updatedAt:t.at}));case"DestinationWorkStarted":return fu(e,t.destinationId,r=>Uo(r,{claimedBy:t.actor,updatedBy:"TEAM",updatedAt:t.at}));case"DestinationBlocked":return fu(e,t.destinationId,r=>Fo(r,{blockedReason:t.reason,updatedBy:"TEAM",updatedAt:t.at}));case"MoveRecorded":return Yw(e,t.move);case"DestinationReached":return e;case"HunsuRecorded":return Qw(e,t.hunsu);case"LineForkedByHunsu":return Zw(e,t);case"ArtifactRecorded":return{...e,artifacts:fe(e.artifacts,t.artifact)}}}function Mw(e,t){return e.some(r=>r.name===t.name)?e.map(r=>r.name===t.name?{...t}:{...r}):[...e.map(r=>({...r})),{...t}]}function Hw(e,t,r){switch(e.type){case"InitialTeamCreated":{let n=kt(r.requestIds,"RequestId",e.request.id,t);if(!n.ok)return n;let o=kt(r.lineIds,"LineId",e.line.id,t);return o.ok?Jw(r.destinationIds,e.destinations,t):o}case"RequestCreated":return kt(r.requestIds,"RequestId",e.request.id,t);case"DestinationDeclared":return kt(r.destinationIds,"DestinationId",e.destination.id,t);case"LineStarted":return kt(r.lineIds,"LineId",e.line.id,t);case"SkillDraftCreated":return kt(r.skillDraftIds,"SkillDraftId",e.draft.id,t);case"MoveRecorded":return kt(r.moveIds,"MoveId",e.move.id,t);case"HunsuRecorded":return kt(r.hunsuIds,"HunsuId",e.hunsu.id,t);case"LineForkedByHunsu":return kt(r.lineIds,"LineId",e.newLineId,t);case"ArtifactRecorded":return kt(r.artifactIds,"ArtifactId",e.artifact.id,t);case"HunsuOriginRegistered":case"HarnessSeeded":case"SkillDraftAccepted":case"SkillDraftDiscarded":case"NodeCreated":case"LinePaused":case"LineResumed":case"LineAccepted":case"LineRejected":case"DestinationClaimed":case"DestinationWorkStarted":case"DestinationBlocked":case"DestinationReached":return l(void 0)}}function Nw(e,t,r){switch(e.type){case"InitialTeamCreated":return Bw(e,t);case"DestinationDeclared":return r.requests.some(n=>n.id===e.requestId)?l(void 0):x(t,`Unknown request: ${e.requestId}`);case"HarnessSeeded":return r.nodes.some(n=>n.id===Ot(e.requestId))?l(void 0):x(t,`Unknown root node for request: ${e.requestId}`);case"LineStarted":return Ow(r,e.line,t);case"SkillDraftAccepted":return Np(r,e.draftId,t,n=>Zd(n,e.skill));case"SkillDraftDiscarded":return Np(r,e.draftId,t,eu);case"NodeCreated":return $w(r,e.node,t);case"LinePaused":return Xs(r,e.lineId,t,Wo);case"LineResumed":return Xs(r,e.lineId,t,Go);case"LineAccepted":return Xs(r,e.lineId,t,qo);case"LineRejected":return Xs(r,e.lineId,t,Vo);case"DestinationClaimed":return mu(r,e.destinationId,t,n=>Lo(n,{claimedBy:e.actor,updatedBy:"TEAM",updatedAt:e.at}));case"DestinationWorkStarted":return mu(r,e.destinationId,t,n=>Uo(n,{claimedBy:e.actor,updatedBy:"TEAM",updatedAt:e.at}));case"DestinationBlocked":return mu(r,e.destinationId,t,n=>Fo(n,{blockedReason:e.reason,updatedBy:"TEAM",updatedAt:e.at}));case"MoveRecorded":return Lw(r,e.move,t);case"HunsuRecorded":return Uw(r,e.hunsu,t);case"LineForkedByHunsu":return Gw(r,e,t);case"ArtifactRecorded":return qw(r,e.artifact,t);case"DestinationReached":return x(t,"DestinationReached is a legacy no-op event and cannot be projected");case"HunsuOriginRegistered":case"RequestCreated":case"SkillDraftCreated":return l(void 0)}}function Bw(e,t){return e.line.requestId!==e.request.id?x(t,`Initial line ${e.line.id} request ${e.line.requestId} does not match request ${e.request.id}`):e.line.status!=="active"?x(t,`Initial line ${e.line.id} cannot start from status ${e.line.status}`):e.line.rootNodeId!==e.line.currentNodeId?x(t,`Initial line ${e.line.id} currentNodeId must start at rootNodeId`):e.line.nodeIds.includes(e.line.rootNodeId)?e.line.moveIds.length!==0?x(t,`Initial line ${e.line.id} cannot start with MOVEs`):"parentLineId"in e.line||"forkedFromMoveId"in e.line?x(t,`Initial line ${e.line.id} cannot carry fork metadata`):l(void 0):x(t,`Initial line ${e.line.id} nodeIds must include rootNodeId ${e.line.rootNodeId}`)}function Ow(e,t,r){if(!e.requests.some(o=>o.id===t.requestId))return x(r,`Unknown request: ${t.requestId}`);if(t.status!=="active")return x(r,`Line ${t.id} cannot start from status ${t.status}`);let n=e.nodes.find(o=>o.id===Ot(t.requestId));return n?t.rootNodeId!==n.id||t.currentNodeId!==n.id||!t.nodeIds.includes(n.id)?x(r,`Line ${t.id} must start at request root node ${n.id}`):t.moveIds.length!==0?x(r,`Line ${t.id} cannot start with MOVEs`):"parentLineId"in t||"forkedFromMoveId"in t?x(r,`LineStarted ${t.id} cannot carry fork metadata`):l(void 0):x(r,`Unknown root node for request: ${t.requestId}`)}function Np(e,t,r,n){let o=e.skillDrafts.find(i=>i.id===t);return o?Ys(r,n(o)):x(r,`Unknown Skill Draft: ${t}`)}function $w(e,t,r){if(t.lineId){let o=e.lines.find(i=>i.id===t.lineId);if(!o)return x(r,`Unknown line: ${t.lineId}`);if(o.requestId!==t.requestId)return x(r,`Node ${t.id} request ${t.requestId} does not match line ${o.id} request ${o.requestId}`)}let n=t.source;switch(n.type){case"initial-execute-team":case"request":return e.requests.some(o=>o.id===n.requestId)?l(void 0):x(r,`Unknown request: ${n.requestId}`);case"move":{let o=e.moves.find(i=>i.id===n.moveId);return o?o.toNodeId===t.id&&o.fromNodeId===n.fromNodeId?l(void 0):x(r,`Node ${t.id} does not match MOVE ${o.id} topology`):x(r,`Unknown MOVE: ${n.moveId}`)}case"hunsu":{let o=e.hunsus.find(i=>i.id===n.hunsuId);return o?o.toNodeId===t.id&&o.fromNodeId===n.fromNodeId?l(void 0):x(r,`Node ${t.id} does not match HUNSU ${o.id} topology`):x(r,`Unknown HUNSU: ${n.hunsuId}`)}}}function Xs(e,t,r,n){let o=e.lines.find(i=>i.id===t);return o?Ys(r,n(o)):x(r,`Unknown line: ${t}`)}function mu(e,t,r,n){let o=new Set(e.lines.map(s=>s.currentNodeId)),i=e.nodes.filter(s=>o.has(s.id)).flatMap(s=>s.destinations.filter(a=>a.id===t));if(i.length===0)return x(r,`Unknown Destination in active route nodes: ${t}`);for(let s of i){let a=Ys(r,n(s));if(!a.ok)return a}return l(void 0)}function Lw(e,t,r){let n=e.lines.find(s=>s.id===t.lineId);if(!n)return x(r,`Unknown line: ${t.lineId}`);if(n.status!=="active")return x(r,`TEAM line ${n.id} cannot continue from status ${n.status}`);let o=e.nodes.find(s=>s.id===t.fromNodeId);if(!o)return x(r,`Unknown node: ${t.fromNodeId}`);if(o.id!==n.currentNodeId||o.requestId!==n.requestId)return x(r,`MOVE ${t.id} source node ${o.id} does not match current node for line ${n.id}`);if(t.toNodeId===t.fromNodeId)return x(r,`MOVE ${t.id} cannot be a self-loop`);if(e.nodes.some(s=>s.id===t.toNodeId))return x(r,`MOVE ${t.id} target node already exists: ${t.toNodeId}`);let i=Ms(t);if(!i.ok)return x(r,i.error.message);for(let s of t.reachedDestinationIds){let a=Ww(o,s,r);if(!a.ok)return a;let d=Ys(r,jo(a.value,{reachedByMoveId:t.id,updatedBy:"TEAM",updatedAt:t.recordedAt}));if(!d.ok)return d}return l(void 0)}function Uw(e,t,r){let n=e.lines.find(s=>s.id===t.lineId);if(!n)return x(r,`Unknown line: ${t.lineId}`);let o=e.nodes.find(s=>s.id===t.fromNodeId);if(!o)return x(r,`Unknown node: ${t.fromNodeId}`);if(o.requestId!==n.requestId||!n.nodeIds.includes(o.id))return x(r,`Node ${o.id} does not belong to line ${n.id}`);if(t.toNodeId===t.fromNodeId)return x(r,`HUNSU ${t.id} cannot be a self-loop`);if(e.nodes.some(s=>s.id===t.toNodeId))return x(r,`HUNSU ${t.id} target node already exists: ${t.toNodeId}`);let i=Fw(e,t,n,o,r);return i.ok?jw(e,t,o,r):i}function Fw(e,t,r,n,o){switch(t.target.type){case"line":{let i=e.lines.find(s=>s.id===t.target.id);return i?i.id===t.lineId?l(void 0):x(o,`HUNSU target line ${i.id} does not match event line ${t.lineId}`):x(o,`Unknown line: ${t.target.id}`)}case"node":{let i=e.nodes.find(s=>s.id===t.target.id);return i?i.requestId===r.requestId&&r.nodeIds.includes(i.id)?l(void 0):x(o,`Node ${i.id} does not belong to line ${r.id}`):x(o,`Unknown node: ${t.target.id}`)}case"move":{let i=$p(e,r,t.target.id,o);return i.ok?l(void 0):i}case"destination":return n.destinations.some(i=>i.id===t.target.id)?l(void 0):x(o,`Unknown Destination in node ${n.id}: ${t.target.id}`)}return x(o,`Unsupported HUNSU target: ${JSON.stringify(t.target)}`)}function jw(e,t,r,n){if(t.changedFiles.length===0)return x(n,`HUNSU ${t.id} must include changed runtime files`);let o=new Set;for(let d of t.changedFiles){let u=String(d.path);if(!u.startsWith(".hunsu-request/"))return x(n,`HUNSU changed file must be under .hunsu-request: ${u}`);if(o.has(u))return x(n,`Duplicate HUNSU changed file: ${u}`);o.add(u)}if(t.teamSnapshot.moveOrdinal!==r.ordinal)return x(n,`HUNSU ${t.id} Team snapshot ordinal ${t.teamSnapshot.moveOrdinal} does not match source node ordinal ${r.ordinal}`);let i=new Set(r.destinations.map(d=>String(d.id))),s=new Set(e.destinations.map(d=>String(d.id))),a=new Set;for(let d of t.teamSnapshot.destinations){let u=String(d.id);if(a.has(u))return x(n,`Duplicate DestinationId in HUNSU Team snapshot: ${u}`);if(a.add(u),d.requestId!==r.requestId)return x(n,`Destination ${d.id} request ${d.requestId} does not match source request ${r.requestId}`);if(!i.has(u)&&s.has(u))return x(n,`Duplicate DestinationId in HUNSU Team snapshot: ${u}`)}return l(void 0)}function Ww(e,t,r){let n=e.destinations.find(o=>o.id===t);return n?l(n):x(r,`Unknown Destination in node ${e.id}: ${t}`)}function $p(e,t,r,n){let o=e.moves.find(i=>i.id===r);return o?o.lineId===t.id||t.moveIds.includes(o.id)?l(o):x(n,`MOVE ${o.id} does not belong to line ${t.id}`):x(n,`Unknown MOVE: ${r}`)}function Gw(e,t,r){let n=e.lines.find(i=>i.id===t.fromLineId);if(!n)return x(r,`Unknown line: ${t.fromLineId}`);if(t.requestId!==n.requestId)return x(r,`LineForkedByHunsu request ${t.requestId} does not match parent line ${n.id}`);let o=e.hunsus.find(i=>i.id===t.hunsuId);if(!o)return x(r,`Unknown HUNSU: ${t.hunsuId}`);if(o.lineId!==t.fromLineId)return x(r,`HUNSU ${o.id} does not belong to parent line ${t.fromLineId}`);if(o.newLineId!==t.newLineId)return x(r,`Line fork ${t.newLineId} does not match HUNSU recorded new line ${o.newLineId}`);if(o.sourceMoveId!==t.fromMoveId)return x(r,`Line fork ${t.newLineId} fromMoveId does not match HUNSU source move`);if(o.newTeamName!==t.newTeamName)return x(r,`Line fork ${t.newLineId} Team name does not match HUNSU record`);if(t.fromMoveId){let i=$p(e,n,t.fromMoveId,r);if(!i.ok)return i;if(i.value.toNodeId!==o.fromNodeId)return x(r,`Line fork source MOVE ${i.value.id} does not end at HUNSU source node ${o.fromNodeId}`)}return e.nodes.some(i=>i.id===o.toNodeId)?l(void 0):x(r,`Unknown HUNSU target node: ${o.toNodeId}`)}function qw(e,t,r){switch(t.owner.type){case"move":return e.moves.some(n=>n.id===t.owner.id)?l(void 0):x(r,`Unknown MOVE: ${t.owner.id}`);case"hunsu":return e.hunsus.some(n=>n.id===t.owner.id)?l(void 0):x(r,`Unknown HUNSU: ${t.owner.id}`);case"line":return e.lines.some(n=>n.id===t.owner.id)?l(void 0):x(r,`Unknown line: ${t.owner.id}`)}}function Vw(e,t){for(let r of e.edges){if(!e.nodes.find(i=>i.id===r.fromNodeId))return x(t,`Edge ${r.id} references missing fromNode ${r.fromNodeId}`);if(!e.nodes.find(i=>i.id===r.toNodeId))return x(t,`Edge ${r.id} references missing toNode ${r.toNodeId}`);switch(r.type){case"move":{let i=e.moves.find(s=>s.id===r.moveId);if(!i)return x(t,`MOVE edge ${r.id} references missing MOVE ${r.moveId}`);if(i.lineId!==r.lineId||i.fromNodeId!==r.fromNodeId||i.toNodeId!==r.toNodeId||i.id!==r.id)return x(t,`MOVE edge ${r.id} does not match MOVE ${i.id}`);break}case"hunsu":{let i=e.hunsus.find(s=>s.id===r.hunsuId);if(!i)return x(t,`HUNSU edge ${r.id} references missing HUNSU ${r.hunsuId}`);if(i.lineId!==r.lineId||i.fromNodeId!==r.fromNodeId||i.toNodeId!==r.toNodeId||i.id!==r.id)return x(t,`HUNSU edge ${r.id} does not match HUNSU ${i.id}`);break}}}return l(void 0)}function Ys(e,t){return t.ok?l(void 0):x(e,t.error.message)}function x(e,t){return I(`Invalid event stream at event ${e}: ${t}`)}function Jw(e,t,r){for(let n of t){let o=kt(e,"DestinationId",n.id,r);if(!o.ok)return o}return l(void 0)}function kt(e,t,r,n){return e.has(r)?I(`Duplicate ${t} in event stream at event ${n}: ${r}`):(e.add(r),l(void 0))}function zw(e,t){let r=t.destinations.map(s=>jp(t.request.id,s,"initial-execute-team",t.at)),n=Ke(t.harness??Te()),o={id:t.line.rootNodeId,requestId:t.request.id,lineId:t.line.id,teamName:t.line.teamName,ordinal:0,destinations:r,harness:n,harnessGraph:Nt(n),harnessLock:t.harnessLock?{...t.harnessLock}:void 0,executorPackageBindings:[],resourcePackageBindings:[],artifactActions:[],source:{type:"initial-execute-team",requestId:t.request.id},createdAt:t.at??t.request.createdAt},i=Lp({...e,requests:fe(e.requests,t.request),nodes:fe(e.nodes,o)},{...t.line,rootNodeId:o.id,currentNodeId:t.line.currentNodeId,nodeIds:t.line.nodeIds});return nt({...e,requests:fe(e.requests,t.request),nodes:fe(e.nodes,o),lines:fe(e.lines,i)})}function Kw(e,t,r,n){let o=jp(t,r,"initial-request",n),i=e.nodes.find(a=>a.id===Ot(t)),s=i?{...i,destinations:fe(i.destinations,o)}:{id:Ot(t),requestId:t,ordinal:0,destinations:[o],harness:Te(),harnessGraph:Nt(Te()),artifactActions:[],source:{type:"request",requestId:t},createdAt:n};return nt({...e,nodes:fe(e.nodes,s)})}function Xw(e,t,r,n){let o=Js(e,t);return nt({...e,nodes:fe(e.nodes,{...o,harness:Ke(r),harnessGraph:Nt(r),createdAt:o.createdAt??n})})}function Yw(e,t){let r=_e(e,t.lineId),n=dn(e,t.fromNodeId),o=t.toNodeId,i=V(Ms(Qd(t,{fromNodeId:n.id,toNodeId:o,teamName:t.teamName??r.teamName??n.teamName??$t(e),ordinal:t.ordinal??n.ordinal+1}))),s=e.nodes.find(m=>m.id===o)??eE(n,i,o),a=V(Ms(Qd(i,{snapshot:i.snapshot??nE(s)}))),d={id:a.id,type:"move",lineId:a.lineId,fromNodeId:n.id,toNodeId:o,moveId:a.id},u={...e,nodes:fe(e.nodes,s),moves:fe(e.moves,a),edges:fe(e.edges,d)},c=Wp(iE(u,a),a.lineId,o);return nt(a.outcome==="accident"?Yo(c,a.lineId,sp):c)}function Qw(e,t){_e(e,t.lineId);let r=dn(e,t.fromNodeId),n=t.toNodeId,o={...t,fromNodeId:r.id,toNodeId:n},i=e.nodes.find(d=>d.id===n)??tE(r,o,n),s={id:o.id,type:"hunsu",lineId:o.lineId,fromNodeId:r.id,toNodeId:n,hunsuId:o.id},a={...e,nodes:fe(e.nodes,i),hunsus:fe(e.hunsus,o),edges:fe(e.edges,s)};return o.newLineId?nt(a):nt(Wp(a,o.lineId,n))}function Zw(e,t){let r=_e(e,t.fromLineId),n=e.hunsus.find(d=>d.id===t.hunsuId),o=t.fromMoveId?e.moves.find(d=>d.id===t.fromMoveId):void 0,i=n?.toNodeId??o?.toNodeId??r.currentNodeId,s=t.fromMoveId?r.moveIds.indexOf(t.fromMoveId):-1,a=s>=0?r.moveIds.slice(0,s+1):[];return nt({...e,lines:fe(e.lines,{id:t.newLineId,requestId:t.requestId,teamName:t.newTeamName??$t(e),status:"active",moveIds:a,rootNodeId:r.rootNodeId,currentNodeId:i,nodeIds:[i],parentLineId:t.fromLineId,forkedFromMoveId:t.fromMoveId})})}function Lp(e,t){return{...t,teamName:t.teamName??$t(e)}}function eE(e,t,r){let n=new Set(t.reachedDestinationIds);return{id:r,requestId:e.requestId,lineId:t.lineId,teamName:t.teamName??e.teamName,ordinal:t.ordinal??e.ordinal+1,destinations:e.destinations.map(o=>n.has(o.id)?V(jo(o,{reachedByMoveId:t.id,updatedBy:"TEAM",updatedAt:t.recordedAt})):{...o}),harness:Ke(e.harness),harnessGraph:lt(e.harnessGraph),harnessLock:e.harnessLock?{...e.harnessLock}:void 0,executorPackageBindings:e.executorPackageBindings?.map(o=>({executorId:o.executorId,lock:{...o.lock}})),resourcePackageBindings:e.resourcePackageBindings?.map(o=>({name:o.name,lock:{...o.lock}})),artifactActions:gu(e.artifactActions),source:{type:"move",moveId:t.id,fromNodeId:e.id},createdAt:t.recordedAt}}function tE(e,t,r){let n=t.teamSnapshot;return{id:r,requestId:e.requestId,lineId:t.newLineId??t.lineId,teamName:n.teamName,ordinal:n.moveOrdinal,destinations:n.destinations.map(o=>({...o})),harness:Ke(n.harness),harnessGraph:lt(n.harnessGraph),harnessLock:n.harnessLock?{...n.harnessLock}:void 0,executorPackageBindings:n.executorPackageBindings?.map(o=>({executorId:o.executorId,lock:{...o.lock}})),resourcePackageBindings:n.resourcePackageBindings?.map(o=>({name:o.name,lock:{...o.lock}})),artifactActions:gu(n.artifactActions),source:{type:"hunsu",hunsuId:t.id,fromNodeId:e.id},createdAt:t.recordedAt}}function gu(e){return Fp((e??[]).map(Up))}function Up(e){return{...e,env:e.env?Object.fromEntries(Object.entries(e.env).map(([t,r])=>[t,{...r}])):void 0,runner:{...e.runner},aliases:e.aliases?Object.fromEntries(Object.entries(e.aliases).map(([t,r])=>[t,{...r}])):void 0,evidence:e.evidence?{...e.evidence,paths:e.evidence.paths?.slice()}:void 0}}function Fp(e){return e.slice().sort((t,r)=>t.displayOrder-r.displayOrder||String(t.id).localeCompare(String(r.id)))}function rE(e){let t=new Set,r=[];for(let n of e)t.has(n.id)||(t.add(n.id),r.push(Up(n)));return r}function nE(e){return{teamName:e.teamName??V(ke("Team")),moveOrdinal:e.ordinal,destinations:e.destinations.map(t=>({...t})),harness:Ke(e.harness),harnessGraph:lt(e.harnessGraph),harnessLock:e.harnessLock?{...e.harnessLock}:void 0,executorPackageBindings:e.executorPackageBindings?.map(t=>({executorId:t.executorId,lock:{...t.lock}})),resourcePackageBindings:e.resourcePackageBindings?.map(t=>({name:t.name,lock:{...t.lock}})),artifactActions:gu(e.artifactActions)}}function jp(e,t,r,n){return ip(e,t,r,n)}function oE(e,t,r){return e.map(n=>n.id===t?V(r(n)):{...n})}function fu(e,t,r){let n=new Set(e.lines.map(i=>i.currentNodeId)),o=e.nodes.map(i=>!n.has(i.id)||!i.destinations.some(s=>s.id===t)?i:{...i,destinations:oE(i.destinations,t,r)});return nt({...e,nodes:o})}function Yo(e,t,r){return _e(e,t),nt({...e,lines:e.lines.map(n=>n.id===t?V(r(n)):n)})}function iE(e,t){return _e(e,t.lineId),{...e,lines:e.lines.map(r=>r.id===t.lineId?{...r,moveIds:uu([...r.moveIds,t.id])}:r)}}function Wp(e,t,r){return _e(e,t),{...e,lines:e.lines.map(n=>n.id===t?{...n,currentNodeId:r,nodeIds:V(dt(uu([...n.nodeIds,r]),"nodeIds"))}:n)}}function nt(e){let t=e.requests.flatMap(o=>{let i=sE(e,o.id);return i?[i]:[]}),r=t.flatMap(o=>o.destinations),n=t.flatMap(o=>o.artifactActions);return{...e,destinations:r.map(o=>({...o})),artifactActions:Fp(rE(n))}}function sE(e,t){let r=e.lines.filter(o=>o.requestId===t&&o.status!=="abandoned"),n=r.findLast(o=>o.status==="active")??r.at(-1);return n?e.nodes.find(o=>o.id===n.currentNodeId):e.nodes.find(o=>o.id===Ot(t))}function aE(e,t=Tr()){let r=uE(e);if(!r.ok)return r;let n=cE(r.value,t);if(!n.ok)return n;try{return l(dE(n.value,t))}catch(o){return S(Mo(o))}}function dE(e,t=Tr()){switch(e.type){case"RegisterHunsuOrigin":return[{type:"HunsuOriginRegistered",origin:{...e.origin},at:e.at}];case"CreateInitialTeam":{Xo(e.destinations,"CreateInitialTeam requires at least one Destination");let r=e.harness?Ke(e.harness):Te(),n=Ot(e.requestId);return[{type:"InitialTeamCreated",request:{id:e.requestId,title:e.title,goal:e.goal,createdBy:"SYSTEM",createdAt:e.at},line:{id:e.lineId,requestId:e.requestId,teamName:e.teamName??$t(t),status:"active",moveIds:[],rootNodeId:n,currentNodeId:n,nodeIds:[n]},destinations:e.destinations,harness:r,harnessLock:e.harnessLock,at:e.at}]}case"StartLine":{bp(t,e.requestId);let r=Js(t,e.requestId),n=e.teamName??$t(t);return[{type:"LineStarted",line:{id:e.lineId,requestId:e.requestId,teamName:n,status:"active",moveIds:[],rootNodeId:r.id,currentNodeId:r.id,nodeIds:[r.id]}}]}case"PauseLine":return _e(t,e.lineId),[{type:"LinePaused",lineId:e.lineId,at:e.at}];case"ResumeLine":return _e(t,e.lineId),[{type:"LineResumed",lineId:e.lineId,at:e.at}];case"AcceptLine":return _e(t,e.lineId),[{type:"LineAccepted",lineId:e.lineId,reason:e.reason,at:e.at}];case"RejectLine":return _e(t,e.lineId),[{type:"LineRejected",lineId:e.lineId,reason:e.reason,at:e.at}];case"ClaimDestination":return Cp(t,e.destinationId),[{type:"DestinationClaimed",destinationId:e.destinationId,actor:e.actor,at:e.at}];case"StartDestinationWork":return Ks(t,e.destinationId),[{type:"DestinationWorkStarted",destinationId:e.destinationId,actor:e.actor,at:e.at}];case"ReportDestinationBlocked":return Tp(t,e.destinationId),[{type:"DestinationBlocked",destinationId:e.destinationId,reason:e.reason,actor:e.actor,at:e.at}];case"RecordMove":{let r=_e(t,e.lineId);cu(r);let n=zs(t,r);Mp(e.reachedDestinationIds,"MOVE must reach exactly one Destination");for(let s of e.reachedDestinationIds)Dp(n,s);let o=Vs(t);return[{type:"MoveRecorded",move:V(Xd({id:e.moveId,lineId:e.lineId,fromNodeId:n.id,toNodeId:o,executeId:e.executeId,conversationRef:e.conversationRef,worktree:e.worktree,summary:e.summary,commit:e.commit,reachedDestinationIds:e.reachedDestinationIds,evidence:e.evidence,risks:e.risks,recordedBy:"SYSTEM",recordedAt:e.at}))}]}case"RecordAccident":{let r=_e(t,e.lineId);cu(r);let n=zs(t,r);Xo(e.evidence,"A ACCIDENT must include evidence"),Hp(e.failureReason,"A ACCIDENT must include a failure reason");let o=Vs(t);return[{type:"MoveRecorded",move:V(Yd({id:e.moveId,lineId:e.lineId,fromNodeId:n.id,toNodeId:o,executeId:e.executeId,conversationRef:e.conversationRef,worktree:e.worktree,failureReason:e.failureReason,summary:e.summary,commit:e.commit,evidence:e.evidence,risks:e.risks,recordedBy:"SYSTEM",recordedAt:e.at}))}]}case"AttachMoveEvidence":return lu(t,e.moveId),[{type:"ArtifactRecorded",artifact:e.artifact,at:e.at}];case"ConfirmHunsuDraft":{let r=e.draft,n=_e(t,r.sourceLineId),o=dn(t,r.sourceNodeId);if(o.requestId!==n.requestId)throw new Z(`Node ${o.id} does not belong to line ${n.id}`);return r.sourceMoveId&&lu(t,r.sourceMoveId),Xo(r.changedFiles,"A confirmed HUNSU Draft must include at least one changed runtime file"),[mE(r.hunsuId,r.sourceLineId,o.id,Vs(t),r.target,r.summary,r.teamSnapshot,r.changedFiles,e.at,{hunsuDraftId:r.id,conversationRef:r.conversationRef,newLineId:r.newLineId,sourceMoveId:r.sourceMoveId,newTeamName:r.newTeamName}),{type:"LineForkedByHunsu",hunsuId:r.hunsuId,fromLineId:r.sourceLineId,newLineId:r.newLineId,newTeamName:r.newTeamName,fromMoveId:r.sourceMoveId,requestId:o.requestId,at:e.at}]}case"CreateSkillDraft":{let r=_e(t,e.lineId),n=zs(t,r);return[{type:"SkillDraftCreated",draft:dp({id:e.draftId,name:e.name,sourcePath:e.sourcePath,draftPath:e.draftPath,createdFromNodeId:n.id,createdAt:e.at})}]}case"DiscardSkillDraft":{let r=xp(t,e.draftId);if(r.status!=="draft")throw new Z(`Skill Draft ${e.draftId} cannot be discarded from status ${r.status}`);return[{type:"SkillDraftDiscarded",draftId:e.draftId,at:e.at}]}case"RecordArtifact":return[{type:"ArtifactRecorded",artifact:e.artifact,at:e.at}]}}function Qo(e,t){let r=Dr(e);if(!r.ok)return r;let n=r.value,o=aE(t,n);return o.ok?l([...e,...o.value]):o}function uE(e){return Pp(e,No)}function Qs(e){return Ap(e,No)}function cE(e,t){let r=lE(e,t);if(!r.ok)return r;switch(e.type){case"RegisterHunsuOrigin":case"CreateInitialTeam":return l(e);case"RecordArtifact":return Fe([HE(t,e.artifact)],e);case"StartLine":return Fe([RE(t,e.requestId),AE(t,e.requestId)],e);case"PauseLine":return Fe([IE(t,e.lineId)],e);case"ResumeLine":return Fe([wE(t,e.lineId)],e);case"AcceptLine":return Fe([EE(t,e.lineId)],e);case"RejectLine":return Fe([PE(t,e.lineId)],e);case"ClaimDestination":return Fe([CE(t,e.destinationId)],e);case"StartDestinationWork":return Fe([xE(t,e.destinationId)],e);case"ReportDestinationBlocked":return Fe([TE(t,e.destinationId)],e);case"RecordMove":return Fe([Gp(t,e.lineId),hu(t,e.lineId),..._E(t,e.lineId,e.moveId,e.reachedDestinationIds)],e);case"RecordAccident":return Fe([Gp(t,e.lineId),hu(t,e.lineId)],e);case"AttachMoveEvidence":return Fe([qp(t,e.moveId),NE(e.artifact,e.moveId)],e);case"ConfirmHunsuDraft":return Fe([Vp(t,e.draft.sourceNodeId,e.draft.sourceLineId),BE(t,e.draft.sourceLineId,e.draft.target),...e.draft.sourceMoveId?[Jp(t,e.draft.sourceMoveId,e.draft.sourceLineId)]:[]],e);case"CreateSkillDraft":return Fe([hu(t,e.lineId)],e);case"DiscardSkillDraft":return Fe([OE(t,e.draftId,"discarded")],e)}}function lE(e,t){switch(e.type){case"CreateInitialTeam":{let r=fE(t,e.requestId);if(!r.ok)return r;let n=vu(t,e.lineId);return n.ok?yE(t,e.destinations.map(o=>o.id)):n}case"StartLine":return vu(t,e.lineId);case"RecordMove":case"RecordAccident":return pE(t,e.moveId);case"AttachMoveEvidence":case"RecordArtifact":return hE(t,e.artifact.id);case"CreateSkillDraft":return vE(t,e.draftId);case"ConfirmHunsuDraft":{let r=gE(t,e.draft.hunsuId);return r.ok?vu(t,e.draft.newLineId):r}case"RegisterHunsuOrigin":case"PauseLine":case"ResumeLine":case"AcceptLine":case"RejectLine":case"ClaimDestination":case"StartDestinationWork":case"ReportDestinationBlocked":case"DiscardSkillDraft":return l(void 0)}}function Fe(e,t){let r=e.find(n=>!n.ok);return r&&!r.ok?S(r.error):l(t)}function mE(e,t,r,n,o,i,s,a,d,u={}){return Xo(a,"A HUNSU must include at least one changed runtime file"),{type:"HunsuRecorded",hunsu:{id:e,...u,lineId:t,fromNodeId:r,toNodeId:n,target:o,summary:i,teamSnapshot:s,changedFiles:a,recordedBy:"DIRECTOR",recordedAt:d}}}function sr(e,t){return t.ok?l(e):I(t.error.message)}function fE(e,t){return e.requests.some(r=>r.id===t)?I(`Duplicate RequestId: ${t}`):l(void 0)}function vu(e,t){return e.lines.some(r=>r.id===t)?I(`Duplicate LineId: ${t}`):l(void 0)}function pE(e,t){return e.moves.some(r=>r.id===t)?I(`Duplicate MoveId: ${t}`):l(void 0)}function gE(e,t){return e.hunsus.some(r=>r.id===t)?I(`Duplicate HunsuId: ${t}`):l(void 0)}function vE(e,t){return e.skillDrafts.some(r=>r.id===t)?I(`Duplicate SkillDraftId: ${t}`):l(void 0)}function hE(e,t){return e.artifacts.some(r=>r.id===t)?I(`Duplicate ArtifactId: ${t}`):l(void 0)}function yE(e,t){let r=new Set,n=SE(e);for(let o of t){if(r.has(o))return I(`Duplicate DestinationId in command: ${o}`);if(n.has(o))return I(`Duplicate DestinationId: ${o}`);r.add(o)}return l(void 0)}function SE(e){return new Set([...e.destinations.map(t=>t.id),...e.nodes.flatMap(t=>t.destinations.map(r=>r.id))])}function RE(e,t){return e.requests.some(r=>r.id===t)?l(void 0):I(`Unknown request: ${t}`)}function kE(e,t){return It(e,t)}function IE(e,t){let r=It(e,t);return r.ok?sr(r.value,Wo(r.value)):r}function wE(e,t){let r=It(e,t);return r.ok?sr(r.value,Go(r.value)):r}function EE(e,t){let r=It(e,t);return r.ok?sr(r.value,qo(r.value)):r}function PE(e,t){let r=It(e,t);return r.ok?sr(r.value,Vo(r.value)):r}function AE(e,t){return yu(e,Ot(t))}function qp(e,t){return zp(e,t)}function bE(e,t){return $E(e,t)}function xE(e,t){let r=Ru(e,t);return r.ok?sr(r.value,Uo(r.value,{claimedBy:"validation",updatedBy:"TEAM"})):r}function hu(e,t){return Su(e,t)}function Gp(e,t){let r=It(e,t);return r.ok?sr(r.value,ap(r.value)):r}function CE(e,t){let r=Ru(e,t);return r.ok?sr(r.value,Lo(r.value,{claimedBy:"validation",updatedBy:"TEAM"})):r}function TE(e,t){let r=Ru(e,t);return r.ok?sr(r.value,Fo(r.value,{blockedReason:"validation",updatedBy:"TEAM"})):r}function DE(e,t,r){let n=Su(e,t);return n.ok?Kp(n.value,r):n}function _E(e,t,r,n){let o=Su(e,t);return o.ok?n.length!==1?[I("MOVE must reach exactly one Destination")]:n.map(i=>ME(o.value,i,r)):[o]}function ME(e,t,r){let n=Kp(e,t);return n.ok?sr(n.value,jo(n.value,{reachedByMoveId:r,updatedBy:"TEAM"})):n}function HE(e,t){switch(t.owner.type){case"move":return qp(e,t.owner.id);case"hunsu":return bE(e,t.owner.id);case"line":return kE(e,t.owner.id)}}function NE(e,t){return e.owner.type!=="move"||e.owner.id!==t?I(`AttachMoveEvidence artifact owner must be move ${t}`):l(void 0)}function Vp(e,t,r){let n=It(e,r);if(!n.ok)return n;let o=yu(e,t);return o.ok?n.value.nodeIds.includes(o.value.id)?o:I(`Node ${o.value.id} does not belong to line ${n.value.id}`):o}function Jp(e,t,r){let n=It(e,r);if(!n.ok)return n;let o=zp(e,t);return o.ok&&o.value.lineId!==n.value.id&&!n.value.moveIds.includes(o.value.id)?I(`MOVE ${o.value.id} does not belong to line ${n.value.id}`):o}function BE(e,t,r){switch(r.type){case"line":{let n=It(e,t);if(!n.ok)return n;let o=It(e,r.id);return o.ok?o.value.id===n.value.id?l(n.value):I(`HUNSU target line ${o.value.id} does not match command line ${n.value.id}`):o}case"node":return Vp(e,r.id,t);case"move":return Jp(e,r.id,t);case"destination":return DE(e,t,r.id)}}function OE(e,t,r){let n=LE(e,t);return n.ok?n.value.status!=="draft"?I(`Skill Draft ${t} cannot be ${r} from status ${n.value.status}`):l(n.value):n}function It(e,t){let r=e.lines.find(n=>n.id===t);return r?l(r):I(`Unknown line: ${t}`)}function yu(e,t){let r=e.nodes.find(n=>n.id===t);return r?l(r):I(`Unknown node: ${t}`)}function Su(e,t){let r=It(e,t);return r.ok?yu(e,r.value.currentNodeId):r}function zp(e,t){let r=e.moves.find(n=>n.id===t);return r?l(r):I(`Unknown MOVE: ${t}`)}function $E(e,t){let r=e.hunsus.find(n=>n.id===t);return r?l(r):I(`Unknown HUNSU: ${t}`)}function LE(e,t){let r=e.skillDrafts.find(n=>n.id===t);return r?l(r):I(`Unknown Skill Draft: ${t}`)}function Ru(e,t){let r=e.destinations.find(n=>n.id===t);return r?l(r):I(`Unknown Destination: ${t}`)}function Kp(e,t){let r=e.destinations.find(n=>n.id===t);return r?l(r):I(`Unknown Destination in node ${e.id}: ${t}`)}import{delimiter as UE,dirname as FE,join as jE,resolve as WE}from"node:path";import{fileURLToPath as GE}from"node:url";import{spawn as qE}from"node:child_process";import{createInterface as VE}from"node:readline";import{Buffer as JE}from"node:buffer";var ng=Es,zE={type:"object",properties:{executorId:{type:"string"},goal:{type:"string"}},required:["executorId","goal"],additionalProperties:!1},KE={type:["object","null"],properties:{executorId:{type:"string"},prompt:{type:"string"}},required:["executorId","prompt"],additionalProperties:!1},XE={type:["string","array"],items:{type:"string"}},YE={type:"object",properties:{kind:{type:"string",enum:["goal"]},stage:{type:"string",enum:["needs_evaluation"]},id:{type:"string"},assignee:zE,evaluator:KE,remainingAttempts:{type:"integer",minimum:0},requires:XE},required:["kind","stage","id","assignee","evaluator","remainingAttempts","requires"],additionalProperties:!1},Xp={type:"object",properties:{kind:{type:"string",enum:["queue"]},id:{type:"string"},items:{type:"array",items:YE}},required:["kind","id","items"],additionalProperties:!1},og={type:"object",properties:{type:{type:"string",enum:["pass","fail"]},summary:{type:"string"},reason:{type:"string"},feedback:{type:"string"},nextGoal:{type:"string"},evidence:{type:"array",items:{type:"string"}}},required:["type","summary","reason","feedback","nextGoal","evidence"],additionalProperties:!1},QE={sandboxMode:"workspace-write",approvalPolicy:"never",approvalsReviewer:"user",networkAccessEnabled:!1},ku=class{subscribers=new Map;push(t){let r=this.subscribers.get(t.runId);if(r)for(let n of r)n.closed||(n.queue.push(t),n.resolve?.(),n.resolve=void 0)}close(t){let r=this.subscribers.get(t);if(r)for(let n of r)n.closed=!0,n.resolve?.(),n.resolve=void 0}async*events(t){let r={queue:[],closed:!1},n=this.subscribers.get(t);n||(n=new Set,this.subscribers.set(t,n)),n.add(r);try{for(;;){let o=r.queue.shift();if(o){yield o;continue}if(r.closed)return;await new Promise(i=>{r.resolve=i})}}finally{n.delete(r),n.size===0&&this.subscribers.delete(t)}}},Zo=class extends Error{code;data;constructor(t,r,n){super(r),this.code=t,this.data=n}},Iu=class{child;stdout;messageHandlers=new Set;errorHandlers=new Set;closeHandlers=new Set;constructor(t){this.child=qE(t.command,t.args,{cwd:t.cwd,env:EP(t.environment)}),this.stdout=VE({input:this.child.stdout}),this.stdout.on("line",r=>this.handleLine(r)),this.child.stderr.on("data",()=>{}),this.child.once("error",r=>this.emitError(r)),this.child.once("close",()=>this.emitClose())}send(t){if(this.child.stdin.destroyed||!this.child.stdin.writable)throw new Error("Codex app-server stdin is closed");this.child.stdin.write(`${JSON.stringify(t)}
|
|
8
|
+
`)}close(){this.stdout.close(),this.child.killed||this.child.kill("SIGTERM")}onMessage(t){return this.messageHandlers.add(t),()=>this.messageHandlers.delete(t)}onError(t){return this.errorHandlers.add(t),()=>this.errorHandlers.delete(t)}onClose(t){return this.closeHandlers.add(t),()=>this.closeHandlers.delete(t)}handleLine(t){if(t.trim())try{let r=JSON.parse(t);for(let n of this.messageHandlers)n(r)}catch(r){this.emitError(new Error(`Invalid Codex app-server JSON-RPC message: ${r instanceof Error?r.message:String(r)}`))}}emitError(t){for(let r of this.errorHandlers)r(t)}emitClose(){for(let t of this.closeHandlers)t()}},wu=class{requestTimeoutMs;transportFactory;clientInfo;serverRequestHandler;transport;startPromise;initialized;nextId=1;pending=new Map;notificationHandlers=new Set;constructor(t={}){let r=t.environment??{},n=t.command??"codex",o=t.args??["app-server","--stdio"];this.requestTimeoutMs=t.requestTimeoutMs??6e4,this.clientInfo=t.clientInfo??{name:"hunsu-studio",title:"Hunsu Studio",version:"0.1.0"},this.transportFactory=t.transportFactory??(()=>new Iu({command:n,args:o,environment:r,cwd:t.cwd})),this.serverRequestHandler=t.handleServerRequest??ig}setServerRequestHandler(t){this.serverRequestHandler=t}async initialize(){return await this.ensureStarted(),this.initialized}async request(t,r,n={}){return await this.ensureStarted(),this.requestRaw(t,r,n.timeoutMs)}notify(t,r){this.transport?.send(r===void 0?{method:t}:{method:t,params:r})}onNotification(t){return this.notificationHandlers.add(t),()=>this.notificationHandlers.delete(t)}close(){this.disposeTransport(new Error("Codex app-server client closed"),!0)}async ensureStarted(){if(!(this.transport&&this.initialized)){if(this.startPromise)return this.startPromise;this.startPromise=this.start();try{await this.startPromise}finally{this.startPromise=void 0}}}async start(){let t=this.transportFactory();this.transport=t,t.onMessage(r=>this.handleMessage(r)),t.onError(r=>this.disposeTransport(r,!0)),t.onClose(()=>{this.disposeTransport(new Error("Codex app-server process exited"),!1)}),this.initialized=await this.requestRaw("initialize",{clientInfo:this.clientInfo,capabilities:null},this.requestTimeoutMs),this.notify("initialized")}requestRaw(t,r,n=this.requestTimeoutMs){let o=this.transport;if(!o)throw new Error("Codex app-server transport is not started");let i=`hunsu-${this.nextId++}`;return new Promise((s,a)=>{let d=setTimeout(()=>{this.pending.delete(i);let u=new Error(`Codex app-server request timed out: ${t}`);a(u),this.disposeTransport(u,!0)},n);this.pending.set(i,{method:t,resolve:s,reject:a,timer:d});try{o.send(r===void 0?{id:i,method:t}:{id:i,method:t,params:r})}catch(u){clearTimeout(d),this.pending.delete(i),a(u instanceof Error?u:new Error(String(u)))}})}handleMessage(t){if(t.id!==void 0&&(t.result!==void 0||t.error!==void 0)&&!t.method){this.handleResponse(t);return}if(t.id!==void 0&&typeof t.method=="string"){this.handleServerRequest(t);return}if(typeof t.method=="string")for(let r of this.notificationHandlers)r(t)}handleResponse(t){let r=this.pending.get(t.id);if(r){if(clearTimeout(r.timer),this.pending.delete(t.id),t.error){r.reject(new Error(`Codex app-server ${r.method} failed: ${t.error.message}`));return}r.resolve(t.result)}}async handleServerRequest(t){try{let r=await this.serverRequestHandler(t);this.transport?.send({id:t.id,result:r})}catch(r){let n=r instanceof Zo?r:new Zo(-32603,r instanceof Error?r.message:String(r));this.transport?.send({id:t.id,error:{code:n.code,message:n.message,data:n.data}})}}rejectPending(t){for(let[r,n]of this.pending)clearTimeout(n.timer),n.reject(t),this.pending.delete(r)}disposeTransport(t,r){let n=this.transport;this.transport=void 0,this.initialized=void 0,this.rejectPending(t),r&&n?.close()}},Eu=class{eventBus=new ku;client;threadOptions;activeByRunId=new Map;activeByThreadId=new Map;activeByTurnId=new Map;constructor(t={}){this.threadOptions={...QE,...t.threadOptions},this.client=t.client??new wu({...t.clientOptions,environment:t.clientOptions?.environment??t.environment??{}}),this.client.setServerRequestHandler(r=>this.handleServerRequest(r)),this.client.onNotification(r=>this.handleNotification(r))}async runTeamPlanning(t){let r=tg(t);return this.executeTurn(t,r,eg(t),void 0,!0,Xp)}async runMemberPath(t){let r=mg(t,t.memberPath.executorId);return this.executeTurn(t,r,mP(t),void 0,!1,t.outputSchema)}async runMoveFinalizer(t){let r=IP();return this.executeTurn(t,r,fP(t),void 0,!0)}async runHunsuDraftTurn(t){let r=rg(t.manager);return this.executeTurn(t,r,pP(t),t.providerThreadId,!1,void 0,{reusePreparedThread:!0})}async prepareHunsuDraftSession(t){let r=rg(t.manager),n=await this.prepareThread(t,r,t.providerThreadId,!1);return{runId:t.runId,provider:"codex",providerThreadId:n}}async resumeRun(t){let r=tg(t);return this.executeTurn(t,r,eg(t),t.providerThreadId,!0,Xp)}async pauseRun(t){this.eventBus.push({type:"runner.status.changed",runId:t,phase:"waiting",headline:"Pause requested",detail:"Codex app-server will stop after the current turn boundary."})}async stopRun(t){let r=this.activeByRunId.get(t);if(this.eventBus.push({type:"runner.status.changed",runId:t,phase:"waiting",headline:"Stop requested"}),r?.threadId&&r.turnId){try{await this.client.request("turn/interrupt",{threadId:r.threadId,turnId:r.turnId},{timeoutMs:1e4})}catch(n){this.eventBus.push({type:"runner.error",runId:t,error:`Codex app-server interrupt failed: ${n instanceof Error?n.message:String(n)}`})}r.completed=!0,r.reject(new Error("Codex turn interrupted by Studio"));return}if(r){r.completed=!0,this.client.close(),r.reject(new Error("Codex turn interrupted by Studio before app-server returned a turn id"));return}this.eventBus.close(t)}async providerStatus(){try{let r={backend:"app-server",available:!0,initialized:await this.client.initialize()};try{r.account=await this.client.request("account/read",{refreshToken:!1})}catch(o){r.accountError=o instanceof Error?o.message:String(o)}try{r.rateLimits=await this.client.request("account/rateLimits/read")}catch(o){r.rateLimitsError=o instanceof Error?o.message:String(o)}let n=[r.accountError,r.rateLimitsError].filter(Boolean);return n.length>0&&(r.error=n.join("; ")),r}catch(t){return{backend:"app-server",available:!1,error:t instanceof Error?t.message:String(t)}}}events(t){return this.eventBus.events(t)}async executeTurn(t,r,n,o,i=!1,s,a={}){let d=a.reusePreparedThread===!0&&o!==void 0&&!s;try{let u=d?o:await this.prepareThread(t,r,o,i,s);d&&this.eventBus.push({type:"runner.status.changed",runId:t.runId,phase:"working",headline:"Prepared thread reused",detail:u,providerThreadId:u});try{return await this.startTurn(t,r,u,n,i,s)}catch(c){if(!d)throw c;let m=c instanceof Error?c.message:String(c);this.eventBus.push({type:"runner.status.changed",runId:t.runId,phase:"working",headline:"Prepared thread reuse failed",detail:m,providerThreadId:o});let f=await this.prepareThread(t,r,o,i,s);return await this.startTurn(t,r,f,n,i,s)}}catch(u){let c=u instanceof Error?u.message:String(u);throw this.eventBus.push({type:"runner.error",runId:t.runId,error:c}),u}finally{this.eventBus.close(t.runId)}}async startTurn(t,r,n,o,i,s){let a;try{return await new Promise((d,u)=>{a={runId:t.runId,threadId:n,rawEvents:[],activeCommandExecutionIds:new Set,backgroundTerminalCleanupRequested:!1,finalEmitted:!1,completed:!1,resolve:d,reject:u},this.trackActiveTurn(a),this.client.request("turn/start",this.turnStartParamsFor(t,r,n,o,i,s),{timeoutMs:6e4}).then(c=>{let m=dr(c,"turn");if(!a||a.completed)return;let f=N(m,"id");f&&this.setActiveTurnId(a,f),m&&N(m,"status")!=="inProgress"&&this.completeActiveTurn(a,m)}).catch(c=>{a?.completed||u(c instanceof Error?c:new Error(String(c)))})})}finally{a&&this.untrackActiveTurn(a)}}async prepareThread(t,r,n,o,i){let s=n?await this.client.request("thread/resume",this.threadResumeParamsFor(t,r,n,o)):await this.client.request("thread/start",this.threadStartParamsFor(t,r,o)),a=Zs(s,["thread","id"])??n;if(!a)throw new Error("Codex app-server did not return a thread id");return this.eventBus.push({type:"runner.status.changed",runId:t.runId,phase:"working",headline:"Thread ready",detail:a,providerThreadId:a}),i?(await this.client.request("thread/goal/clear",{threadId:a},{timeoutMs:6e4}),this.eventBus.push({type:"runner.status.changed",runId:t.runId,phase:"working",headline:"Provider goal cleared",providerThreadId:a})):(await this.client.request("thread/goal/set",this.threadGoalSetParamsFor(t,r,a),{timeoutMs:6e4}),this.eventBus.push({type:"runner.status.changed",runId:t.runId,phase:"working",headline:"Provider goal set",providerThreadId:a})),a}threadStartParamsFor(t,r,n){let o=this.effectiveThreadOptions(t,r,n);return{cwd:t.repositoryPath,approvalPolicy:o.approvalPolicy,approvalsReviewer:o.approvalsReviewer??"user",sandbox:o.sandboxMode,model:o.model??null,serviceTier:o.serviceTier==="fast"?"fast":null,ephemeral:!1,threadSource:"user"}}threadResumeParamsFor(t,r,n,o){let i=this.effectiveThreadOptions(t,r,o);return{threadId:n,cwd:t.repositoryPath,approvalPolicy:i.approvalPolicy,approvalsReviewer:i.approvalsReviewer??"user",sandbox:i.sandboxMode,model:i.model??null,serviceTier:i.serviceTier==="fast"?"fast":null}}threadGoalSetParamsFor(t,r,n){return{threadId:n,objective:gP(t,r)}}turnStartParamsFor(t,r,n,o,i,s){let a=this.effectiveThreadOptions(t,r,i);return{threadId:n,input:[{type:"text",text:o,text_elements:[]}],cwd:t.repositoryPath,approvalPolicy:a.approvalPolicy,approvalsReviewer:a.approvalsReviewer??"user",sandboxPolicy:ZE(t.repositoryPath,a,i),model:a.model??null,serviceTier:a.serviceTier==="fast"?"fast":null,effort:a.modelReasoningEffort??null,outputSchema:s??null}}effectiveThreadOptions(t,r,n){let o=wP(r),i={...this.threadOptions,...t.codexThreadOptions,...o,...fg(t.resolvedModelSelection)};return n&&(i.networkAccessEnabled=t.codexThreadOptions?.networkAccessEnabled??this.threadOptions.networkAccessEnabled??o.networkAccessEnabled,i.sandboxMode="read-only",i.approvalPolicy="never",i.approvalsReviewer="user"),i}handleNotification(t){let r=Yp(t,this.activeByThreadId,this.activeByTurnId);if(!r)return;r.rawEvents.push(Qp(t));let n=ot(t.params)?t.params:{},o=N(n,"turnId")??Zs(n,["turn","id"]);this.eventBus.push({type:"runner.appServer.message",runId:r.runId,direction:"server-notification",providerThreadId:r.threadId,providerTurnId:o??r.turnId,method:t.method,message:t}),o&&o!==r.turnId&&this.setActiveTurnId(r,o),(t.method==="item/started"||t.method==="item/completed")&&this.trackCommandExecutionItem(r,t.method,dr(n,"item"));let i=eP({runId:r.runId,providerThreadId:r.threadId,providerTurnId:o??r.turnId},t);for(let s of i)switch(s.kind){case"setTurnId":this.setActiveTurnId(r,s.turnId);break;case"usage":r.usage=s.usage;break;case"teamEvent":this.eventBus.push(s.event);break;case"finalResponse":r.finalResponse=s.finalResponse,this.requestBackgroundTerminalCleanupIfNeeded(r);break;case"completeTurn":this.completeActiveTurn(r,s.turn);break}}trackCommandExecutionItem(t,r,n){if(N(n,"type")!=="commandExecution")return;let o=ei(n);if(!o)return;let i=N(n,"status");if(r==="item/completed"||i==="completed"||i==="failed"||i==="declined"){t.activeCommandExecutionIds.delete(o);return}t.activeCommandExecutionIds.add(o)}requestBackgroundTerminalCleanupIfNeeded(t){t.backgroundTerminalCleanupRequested||t.activeCommandExecutionIds.size===0||(t.backgroundTerminalCleanupRequested=!0,this.client.request("thread/backgroundTerminals/clean",{threadId:t.threadId},{timeoutMs:1e4}).catch(()=>{}))}completeActiveTurn(t,r){if(t.completed)return;t.completed=!0;let n=N(r,"id")??t.turnId;n&&this.setActiveTurnId(t,n);let o=N(r,"status");if(o==="failed"){let s=dr(r,"error"),a=N(s,"message")??"Codex app-server turn failed";this.eventBus.push({type:"runner.error",runId:t.runId,error:a}),t.reject(new Error(a));return}if(o==="interrupted"){t.reject(new Error("Codex app-server turn interrupted"));return}let i=t.finalResponse??uP(r);i&&!t.finalEmitted&&(t.finalEmitted=!0,this.eventBus.push({type:"runner.final",runId:t.runId,finalResponse:i})),t.resolve({runId:t.runId,provider:"codex",providerThreadId:t.threadId,providerTurnId:t.turnId,finalResponse:i,rawResult:{rawEvents:t.rawEvents,finalResponse:i,usage:t.usage,turn:r}})}trackActiveTurn(t){this.activeByRunId.set(t.runId,t),this.activeByThreadId.set(t.threadId,t),t.turnId&&this.activeByTurnId.set(t.turnId,t)}setActiveTurnId(t,r){t.turnId&&t.turnId!==r&&this.activeByTurnId.delete(t.turnId),t.turnId=r,this.activeByTurnId.set(r,t)}untrackActiveTurn(t){this.activeByRunId.delete(t.runId),this.activeByThreadId.delete(t.threadId),t.turnId&&this.activeByTurnId.delete(t.turnId)}async handleServerRequest(t){let r=ot(t.params)?t.params:{},n=Yp(t,this.activeByThreadId,this.activeByTurnId);n?.rawEvents.push(Qp(t));let o=n?.runId;o&&this.eventBus.push({type:"runner.appServer.message",runId:o,direction:"server-request",providerThreadId:n?.threadId,providerTurnId:n?.turnId,method:t.method,message:t});let i=nP(t.method,r);return o&&i&&this.eventBus.push({type:"runner.status.changed",runId:o,phase:"waiting",headline:"Approval requested",detail:i,providerThreadId:n?.threadId,providerTurnId:n?.turnId}),t.method==="item/permissions/requestApproval"&&(n?.threadId&&n.turnId&&this.client.request("turn/interrupt",{threadId:n.threadId,turnId:n.turnId},{timeoutMs:1e4}).catch(()=>{}),o&&this.eventBus.push({type:"runner.error",runId:o,error:"Codex app-server requested additional permissions; Hunsu declined and interrupted the turn."}),n&&!n.completed&&(n.completed=!0,n.reject(new Error("Codex app-server requested additional permissions; Hunsu declined and interrupted the turn.")))),ig(t)}};function un(e={}){return new Eu(e)}function ig(e){switch(e.method){case"item/commandExecution/requestApproval":return{decision:"decline"};case"item/fileChange/requestApproval":return{decision:"decline"};case"execCommandApproval":case"applyPatchApproval":return{decision:"denied"};case"item/permissions/requestApproval":return{permissions:{},scope:"turn",strictAutoReview:!0};default:throw new Zo(-32601,`Unsupported Codex app-server request: ${e.method??"unknown"}`)}}function ZE(e,t,r){let n=t.networkAccessEnabled===!0;return r||t.sandboxMode==="read-only"?{type:"readOnly",networkAccess:n}:t.sandboxMode==="danger-full-access"?{type:"dangerFullAccess",networkAccess:n}:{type:"workspaceWrite",writableRoots:[e],networkAccess:n,excludeTmpdirEnvVar:!1,excludeSlashTmp:!1}}function Yp(e,t,r){let n=ot(e.params)?e.params:{},o=N(n,"turnId")??Zs(n,["turn","id"]);if(o){let s=r.get(o);if(s)return s}let i=N(n,"threadId")??Zs(n,["thread","id"]);return i?t.get(i):void 0}function Qp(e){return{source:"codex.app-server",message:e}}function eP(e,t){let r=ot(t.params)?t.params:{};switch(t.method){case"turn/started":{let n=dr(r,"turn"),o=N(n,"id")??N(r,"turnId")??e.providerTurnId??"turn";return[...o?[{kind:"setTurnId",turnId:o}]:[],{kind:"teamEvent",event:{type:"runner.turn.started",runId:e.runId,providerThreadId:e.providerThreadId,providerTurnId:o,turn:n,startedAtMs:ur(r,"startedAtMs")}},{kind:"teamEvent",event:{type:"runner.status.changed",runId:e.runId,phase:"working",headline:"Working",detail:o,providerThreadId:e.providerThreadId,providerTurnId:o}}]}case"turn/completed":{let n=dr(r,"turn"),o=N(n,"id")??N(r,"turnId")??e.providerTurnId;return[{kind:"teamEvent",event:{type:"runner.turn.completed",runId:e.runId,providerThreadId:e.providerThreadId,providerTurnId:o,turn:n,completedAtMs:ur(r,"completedAtMs")}},{kind:"completeTurn",turn:n}]}case"thread/tokenUsage/updated":{let n=tP(r);return[{kind:"usage",usage:n},{kind:"teamEvent",event:{type:"runner.status.changed",runId:e.runId,phase:"working",headline:"Working",detail:rP(n),providerThreadId:e.providerThreadId,providerTurnId:e.providerTurnId}}]}case"item/started":case"item/completed":return oP(e,t.method,dr(r,"item"));case"item/agentMessage/delta":case"item/agentMessage/textDelta":case"item/agentMessage/outputDelta":case"item/assistantMessage/delta":case"item/assistantMessage/textDelta":case"item/assistantMessage/outputDelta":{let n=Zp(r);if(!n)return[];let o=ei(r)??"agentMessage",i=N(r,"turnId")??e.providerTurnId;return[{kind:"teamEvent",event:{type:"runner.item.delta",runId:e.runId,providerThreadId:e.providerThreadId,providerTurnId:i,itemId:o,deltaKind:"agentMessage",delta:n}}]}case"item/commandExecution/outputDelta":case"item/fileChange/outputDelta":case"item/plan/delta":case"item/reasoning/textDelta":case"item/reasoning/summaryTextDelta":{let n=Zp(r);if(!n)return[];let o=iP(t.method),i=ei(r)??o,s=N(r,"turnId")??e.providerTurnId;return[{kind:"teamEvent",event:{type:"runner.item.delta",runId:e.runId,providerThreadId:e.providerThreadId,providerTurnId:s,itemId:i,deltaKind:o,delta:n,contentIndex:ur(r,"contentIndex")}}]}case"turn/plan/updated":{let n=N(r,"explanation");return[{kind:"teamEvent",event:{type:"runner.status.changed",runId:e.runId,phase:"thinking",headline:"Planning",detail:n?Xn(n,500):"Codex plan updated.",providerThreadId:e.providerThreadId,providerTurnId:e.providerTurnId}}]}case"error":{let n=dr(r,"error");return[{kind:"teamEvent",event:{type:"runner.error",runId:e.runId,error:N(n,"message")??"Codex app-server error"}}]}default:return[]}}function tP(e){let t=dr(e,"tokenUsage"),r=dr(t,"last");if(r)return{input_tokens:ur(r,"inputTokens")??0,cached_input_tokens:ur(r,"cachedInputTokens")??0,output_tokens:ur(r,"outputTokens")??0,reasoning_output_tokens:ur(r,"reasoningOutputTokens")??0}}function rP(e){return e?`Codex turn usage. Input ${e.input_tokens}, output ${e.output_tokens}, reasoning ${e.reasoning_output_tokens}.`:"Codex app-server usage updated."}function nP(e,t){switch(e){case"item/commandExecution/requestApproval":return`Codex app-server requested command approval; Hunsu declined: ${N(t,"command")??"unknown command"}`;case"item/fileChange/requestApproval":return`Codex app-server requested file-change approval; Hunsu declined${N(t,"grantRoot")?` for ${N(t,"grantRoot")}`:""}.`;case"item/permissions/requestApproval":return"Codex app-server requested additional permissions; Hunsu declined.";case"execCommandApproval":return`Codex app-server requested command approval; Hunsu declined: ${t.command?.join(" ")??"unknown command"}`;case"applyPatchApproval":return"Codex app-server requested patch approval; Hunsu declined.";default:return}}function oP(e,t,r){let n=t==="item/started"?"started":"completed",o=sP(r);if(!o)return[];let i=o.id??ei(r)??o.type,s={kind:"teamEvent",event:n==="started"?{type:"runner.item.started",runId:e.runId,providerThreadId:e.providerThreadId,providerTurnId:e.providerTurnId,itemId:i,item:o}:{type:"runner.item.completed",runId:e.runId,providerThreadId:e.providerThreadId,providerTurnId:e.providerTurnId,itemId:i,item:o}};switch(o.type){case"agentMessage":{let a=o.text;return n!=="completed"||!a?[s]:[s,{kind:"finalResponse",finalResponse:a}]}case"reasoning":return[s];case"plan":return[s];case"commandExecution":return[s];case"fileChange":return[s];case"mcpToolCall":return[s];case"webSearch":return[s];default:return[s]}}function iP(e){switch(e){case"item/agentMessage/delta":case"item/agentMessage/textDelta":case"item/agentMessage/outputDelta":case"item/assistantMessage/delta":case"item/assistantMessage/textDelta":case"item/assistantMessage/outputDelta":return"agentMessage";case"item/plan/delta":return"plan";case"item/reasoning/textDelta":return"reasoningText";case"item/reasoning/summaryTextDelta":return"reasoningSummary";case"item/fileChange/outputDelta":return"fileChangeOutput";default:return"commandOutput"}}function sP(e){let t=N(e,"type");if(!e||!t)return;let r={id:ei(e),type:t,raw:e},n=N(e,"text");if(n!==void 0)r.text=n;else{let A=aP(e);A!==void 0&&(r.text=A)}let o=Pu(e.summary);o.length>0&&(r.summary=o);let i=Pu(e.content);i.length>0&&(r.content=i);let s=N(e,"command");s!==void 0&&(r.command=s);let a=N(e,"cwd");a!==void 0&&(r.cwd=a);let d=N(e,"status");d!==void 0&&(r.status=d);let u=dP(e);u.length>0&&(r.commandActions=u);let c=N(e,"aggregatedOutput");c!==void 0&&(r.aggregatedOutput=c);let m=ur(e,"exitCode");m!==void 0&&(r.exitCode=m);let f=ur(e,"durationMs");f!==void 0&&(r.durationMs=f),"changes"in e&&(r.changes=e.changes);let p=N(e,"server");p!==void 0&&(r.server=p);let g=N(e,"tool");g!==void 0&&(r.tool=g);let v=N(e,"query");return v!==void 0&&(r.query=v),r}function aP(e){let t=Pu(e.content);if(t.length!==0)return t.join(`
|
|
9
|
+
|
|
10
|
+
`)}function Pu(e){return Array.isArray(e)?e.flatMap(t=>{if(typeof t=="string")return t?[t]:[];if(!ot(t))return[];let r=N(t,"text")??N(t,"content")??N(t,"summary");return r?[r]:[]}):[]}function dP(e){let t=e.commandActions;return Array.isArray(t)?t.flatMap(r=>{if(!ot(r))return[];let n=N(r,"type");switch(n){case"read":return[{type:n,command:N(r,"command"),name:N(r,"name"),path:N(r,"path")}];case"listFiles":return[{type:n,command:N(r,"command"),path:N(r,"path")}];case"search":return[{type:n,command:N(r,"command"),query:N(r,"query"),path:N(r,"path")}];case"unknown":return[{type:n,command:N(r,"command")}];default:return[]}}):[]}function uP(e){let t=Array.isArray(e?.items)?e.items:[];for(let r of[...t].reverse())if(ot(r)&&r.type==="agentMessage"&&typeof r.text=="string")return r.text}function ei(e){if(ot(e))return N(e,"itemId")??N(e,"id")}function dr(e,t){if(!ot(e))return;let r=e[t];return ot(r)?r:void 0}function N(e,t){if(!ot(e))return;let r=e[t];return typeof r=="string"?r:void 0}function Zp(e){let t=N(e,"delta");if(t!==void 0)return t;let r=N(e,"deltaBase64");if(r)try{return JE.from(r,r.includes("-")||r.includes("_")?"base64url":"base64").toString("utf8")}catch{return}}function ur(e,t){if(!ot(e))return;let r=e[t];return typeof r=="number"?r:void 0}function Zs(e,t){let r=e;for(let n of t){if(!ot(r))return;r=r[n]}return typeof r=="string"?r:void 0}function ot(e){return!!e&&typeof e=="object"&&!Array.isArray(e)}function eg(e){let t=ea(e);return["<role>"," <purpose>"," Plan a closure-free executable ExecutionPlan."," </purpose>",""," <instructions>",ar(sg(e,t),4)," </instructions>","</role>","","<goal>",ar(cg(e),2),"</goal>","","<member_profiles>",hP(t.members),"</member_profiles>","","<rules>"," Return one structured ExecutionPlan object with root kind queue."," Put each executable step in the queue items array as kind goal with stage needs_evaluation."," Use each goal item to delegate to one assignee Executor and optionally one evaluator Executor."," A goal assignee must name executorId and a standalone goal."," A goal evaluator, when present, must name executorId and a prompt that can return pass or fail with type, summary, reason, feedback, nextGoal, and evidence.",` Set remainingAttempts to ${lP(e.maxAttemptCount)||cP(t)} for each goal unless a smaller bound is clearly enough.`," Set requires to PrevMove unless this goal intentionally depends on earlier Path ids.","</rules>"].join(`
|
|
11
|
+
`)}function cP(e){switch(e.kind){case"team_execution_plan":return e.maxAttemptCount;case"role_squad":case"council_vote":case"court_debate":return e.maxRoundCount}}function lP(e){return Number.isInteger(e)&&e&&e>0?e:void 0}function mP(e){let t=mg(e,e.memberPath.executorId);return["<member>",Ho(t.promptTemplate,dg(e)).trim()||"No additional Member prompt.","</member>","","<goal>",e.memberPath.goal.trim(),"</goal>","","<constraints>","Do not read .hunsu files.","Do not create commits.","Use bounded commands for verification; do not run preview servers, dev servers, watchers, or other long-running processes in the foreground.","If you start a preview server, dev server, watcher, or any other long-running command, stop it before your final response.","Do not leave running command sessions, local listeners, or background processes open at the end of the turn.","</constraints>"].join(`
|
|
12
|
+
`)}function fP(e){let t=ti(e),r=e.pathOutputs.map(n=>[`- ${n.pathId} (${n.executorId})`,` goal: ${n.goal}`,n.commit?` commit: ${n.commit}`:void 0,n.finalResponse?` output: ${Xn(n.finalResponse,2e3)}`:void 0].filter(Boolean).join(`
|
|
13
|
+
`)).join(`
|
|
14
|
+
`);return["You are the MOVE finalizer for a completed Hunsu Execute.","Write the Git commit message for MOVE N+1 from the source MOVE to terminal Path diff.","Do not edit files. Do not create Git commits. Return only the commit message content.","",`MOVE id: ${e.moveId}`,`Source MOVE commit: ${e.sourceMoveCommit}`,`Terminal Path commit: ${e.terminalPathCommit}`,e.terminalMemberPathId?`Terminal Path id: ${e.terminalMemberPathId}`:void 0,"","Destination:",t?SP(t):`- ${e.requestGoal}`,"","Completion summary:",e.completionSummary||"Not provided.","","Path commits:",Object.entries(e.pathCommits).map(([n,o])=>`- ${n}: ${o}`).join(`
|
|
15
|
+
`)||"- none","","Path outputs:",r||"- none","","Diff stat:",e.diffStat?.trim()||"Not provided.","","Diff name-status:",e.diffNameStatus?.trim()||"Not provided.","","Diff patch:",e.diffPatch?.trim()||"Not provided.","","Commit message requirements:","- First line: concise imperative subject for the MOVE result.","- Body: summarize the product changes and relevant Path outputs.","- Do not include Hunsu trailers; Studio appends system trailers."].filter(n=>n!==void 0).join(`
|
|
16
|
+
`)}function pP(e){let t=Ho(e.manager.promptTemplate,ug(e)).trim();return["<role>","You are the Hunsu Draft agent for a local Hunsu Studio session.","Help the user refine a proposed HUNSU intervention conversationally.","You may edit decoded draft request files under .hunsu-request/ in the supplied Route worktree.","Do not edit .hunsu/ encoded runtime files, .hunsu-prev/, product files, or create commits.","Available request runtime files are .hunsu-request/destinations.json, .hunsu-request/harness.json, .hunsu-request/executors.json, .hunsu-request/resources.json, and .hunsu-request/artifact-actions.json.","Edit only the files required by the user's explicit request.","Use destinations.json for Destination/TODO changes and artifact-actions.json for Artifact Action changes.","For a simple TODO/Destination addition, edit only .hunsu-request/destinations.json.",".hunsu-request/executors.json is the source of truth for Member definitions.",".hunsu-request/resources.json is the source of truth for Skill, Plugin, and Resource bindings.",".hunsu-request/harness.json stores Harness policy only; it must not contain a members field.","Do not edit .hunsu-request/harness.json unless the user explicitly asks to change root Team or Harness policy.","Do not edit .hunsu-request/executors.json unless the user explicitly asks to change Member definitions or Member config.","Do not edit .hunsu-request/resources.json unless the user explicitly asks to change Resource bindings or requirements.","Do not create, copy, or update Resource bindings or assignment entries for newly added Destinations; Team-planner routing and binding are handled outside Destination edits.","After editing .hunsu-request files, run the supplied Draft check command. It creates a DiffArtifact in Hunsu Bridge.",'If the DiffArtifact passes, include this exact marker in your final reply: ::hunsu-diff{draftSessionId="<draftSessionId>" diffArtifactId="<diffArtifactId>" status="pass"}','If the DiffArtifact fails, include the same marker with status="failed" and explain the validation error briefly.',"Confirmation is handled by Hunsu Bridge from the DiffArtifact id.","</role>","","<manager>",`id: ${e.manager.id}`,"instructions:",ar(t||"No Manager-specific instructions.",2),"</manager>","","<draft_check_command>",ar(e.draftCheckCommand,2),"</draft_check_command>","","<source_snapshot>",ar(RP(e.sourceSnapshot),2),"</source_snapshot>","","<request_goal>",ar(e.requestGoal,2),"</request_goal>","","<conversation>",ar(kP(e.messages),2),"</conversation>","","<latest_user_message>",ar(e.userMessage,2),"</latest_user_message>","","<response_rules>","Answer naturally and briefly.","If you edited .hunsu-request files, summarize the changed files and the intended runtime change after running the Draft check command.","If the requested change cannot be represented in the provided .hunsu-request runtime files, say which runtime file or schema is missing.","If more detail is needed, ask a focused follow-up question.","Do not output JSON unless the user explicitly asks for an example.","</response_rules>"].join(`
|
|
17
|
+
`)}function gP(e,t){let r=Ho(t.promptTemplate,ug(e));if(gg(e))return Xn(["Objective: discuss a HUNSU draft with the user.",`Source: ${e.sourceSnapshot.teamName??"Team"} ${e.sourceSnapshot.moveOrdinal!==void 0?`M${String(e.sourceSnapshot.moveOrdinal).padStart(4,"0")}`:e.sourceSnapshot.sourceNodeId}`,Au(e)?`User request: ${e.userMessage}`:"Status: preparing the Draft chat session before the first user message.",r.trim()?`Instructions:
|
|
18
|
+
${r.trim()}`:void 0].filter(Boolean).join(`
|
|
19
|
+
|
|
20
|
+
`),4e3);if(pg(e)){let o=[`Objective: ${e.memberPath.goal}`,r.trim()?`Member:
|
|
21
|
+
${r.trim()}`:void 0].filter(Boolean);return Xn(o.join(`
|
|
22
|
+
|
|
23
|
+
`),4e3)}let n=[`Objective:
|
|
24
|
+
${cg(e)}`,`Instructions:
|
|
25
|
+
${r.trim()||ng}`].filter(Boolean);return Xn(n.join(`
|
|
26
|
+
|
|
27
|
+
`),4e3)}function sg(e,t){let r=Ho(t.team.promptTemplate,ag(e,t)).trim();return r||ng}function ag(e,t){let r=lg(e);return{requestGoal:e.requestGoal,currentDestination:r[0]??ti(e),currentDestinations:r,selectedDestinations:r,activeDestinations:e.activeDestinations,constraints:bu(e),members:t.members.map(n=>({id:n.id,promptTemplate:n.promptTemplate.template,model:n.model,reasoningEffort:n.reasoningEffort,serviceTier:n.serviceTier,skills:n.skills.map(o=>o.name),plugins:n.plugins.map(o=>o.id)}))}}function dg(e){let t=lg(e);return{requestGoal:e.requestGoal,pathGoal:e.memberPath.goal,memberPath:e.memberPath,dependencyOutputs:e.dependencyOutputs??[],worktreeStatus:e.worktreeStatus,worktreeDiff:e.worktreeDiff,attemptTranscript:e.attemptTranscript,evaluationFeedback:e.attemptTranscript,currentDestination:t[0]??ti(e),currentDestinations:t,selectedDestinations:t,activeDestinations:e.activeDestinations,constraints:bu(e),sourceMoveId:e.sourceMoveId,targetMoveOrdinal:e.targetMoveOrdinal}}function ug(e){return pg(e)?dg(e):gg(e)?{requestGoal:e.requestGoal,sourceSnapshot:e.sourceSnapshot,userMessage:Au(e)?e.userMessage:void 0,messages:Au(e)?e.messages:[]}:ag(e,ea(e))}function cg(e){let t=ti(e),r=bu(e).map(n=>`- ${n}`).join(`
|
|
28
|
+
`);return[t?vP(t):`- ${e.requestGoal}`,r?`Relevant constraints:
|
|
29
|
+
${r}`:void 0].filter(n=>n!==void 0).join(`
|
|
30
|
+
|
|
31
|
+
`)}function ti(e){let t=e.selectedDestinationIds?.[0];return t?e.activeDestinations.find(r=>r.id===t):[...e.activeDestinations].sort((r,n)=>(n.priority??0)-(r.priority??0))[0]}function lg(e){let t=e.selectedDestinationIds??[];if(t.length===0){let n=ti(e);return n?[n]:[]}let r=new Set(t);return e.activeDestinations.filter(n=>r.has(n.id))}function bu(e){return e.futureConstraints&&e.futureConstraints.length>0?e.futureConstraints:e.board.futureConstraints.map(t=>t.constraint)}function vP(e){let t=[`- ${e.title}`];return e.acceptanceCriteria&&e.acceptanceCriteria.length>0&&t.push(` Acceptance: ${e.acceptanceCriteria.join("; ")}`),e.constraints&&e.constraints.length>0&&t.push(` Constraints: ${e.constraints.join("; ")}`),e.notes?.trim()&&t.push(` Notes: ${e.notes.trim()}`),t.join(`
|
|
32
|
+
`)}function hP(e){return e.map(t=>[` <member id="${yP(t.id)}">`," <profile>",ar(t.promptTemplate.template.trim()||"No profile.",6)," </profile>"," </member>"].join(`
|
|
33
|
+
`)).join(`
|
|
34
|
+
|
|
35
|
+
`)||` <member id="default">
|
|
36
|
+
<profile>
|
|
37
|
+
No profile.
|
|
38
|
+
</profile>
|
|
39
|
+
</member>`}function ar(e,t){let r=" ".repeat(t);return e.split(`
|
|
40
|
+
`).map(n=>n?`${r}${n}`:"").join(`
|
|
41
|
+
`)}function yP(e){return e.replaceAll("&","&").replaceAll('"',""").replaceAll("<","<").replaceAll(">",">")}function SP(e){let t=[`- ${e.title}`];return e.acceptanceCriteria&&e.acceptanceCriteria.length>0&&t.push(` Acceptance: ${e.acceptanceCriteria.join("; ")}`),e.constraints&&e.constraints.length>0&&t.push(` Constraints: ${e.constraints.join("; ")}`),e.notes?.trim()&&t.push(` Notes: ${e.notes.trim()}`),t.join(`
|
|
42
|
+
`)}function RP(e){return[`draftSessionId source line: ${e.sourceLineId}`,`source node: ${e.sourceNodeId}`,e.sourceMoveId?`source move: ${e.sourceMoveId}`:void 0,e.moveOrdinal!==void 0?`position: M${String(e.moveOrdinal).padStart(4,"0")}`:void 0,e.teamName?`team: ${e.teamName}`:void 0,e.summary?`summary: ${e.summary}`:void 0,"destinations:",e.destinationSummaries.length>0?e.destinationSummaries.map(t=>`- ${t.id} [${t.status}] ${t.title}`).join(`
|
|
43
|
+
`):"- none"].filter(t=>t!==void 0).join(`
|
|
44
|
+
`)}function kP(e){return e.length===0?"No prior draft conversation.":e.map(t=>`${t.role==="draft-agent"?"Draft Agent":t.role==="user"?"User":"System"}: ${Xn(t.text,1200)}`).join(`
|
|
45
|
+
|
|
46
|
+
`)}function tg(e){let t=ea(e);return Je("team",sg(e,t),[])}function IP(){return Je("move-finalizer","Write a precise final MOVE commit message from the completed Execute diff and evidence.",[])}function rg(e=Jn()){return{...Je(String(e.id),e.promptTemplate.template,e.skills),promptTemplate:{...e.promptTemplate},plugins:e.plugins.map(r=>({...r})),...e.modelSelection?{modelSelection:JSON.parse(JSON.stringify(e.modelSelection))}:{},execution:{kind:"worktree_write",network:"enabled"},approval:{policy:"never"}}}function mg(e,t){if(e.harnessGraph){let o=Gd(e.harnessGraph,t);if(!o)throw new Error(`Harness does not define required Member ${t}`);return bs(o)}let r=ea(e),n=zn(r,t);if(!n)throw new Error(`Harness ${r.kind} does not define required Member ${t}`);return n}function ea(e){return e.harnessGraph?an(e.harnessGraph,e.teamScopeId??e.harnessGraph.rootTeamId):e.harness??Te()}function wP(e){let t={approvalPolicy:e.approval.policy==="on_request"?"on-request":"never",approvalsReviewer:e.approval.policy==="on_request"?e.approval.reviewer:"user",networkAccessEnabled:e.execution.network==="enabled"};switch(e.execution.kind){case"read_only":t.sandboxMode="read-only";break;case"worktree_write":t.sandboxMode="workspace-write";break;case"unrestricted":t.sandboxMode="danger-full-access";break}let r=e.modelSelection?Df(e.modelSelection):void 0;return r?{...t,...fg(r)}:(e.modelSelection||(e.model&&e.model!=="codex-default"&&(t.model=e.model),e.reasoningEffort&&e.reasoningEffort!=="default"&&(t.modelReasoningEffort=e.reasoningEffort),t.serviceTier=e.serviceTier??"default"),t)}function fg(e){return!e||e.providerId!=="codex"?{}:{model:e.model==="codex-default"?void 0:e.model,modelReasoningEffort:e.reasoningEffort&&e.reasoningEffort!=="default"?e.reasoningEffort:void 0,serviceTier:e.serviceTier??"default"}}function pg(e){return"memberPath"in e}function Au(e){return"draftSessionId"in e&&"sourceSnapshot"in e&&"userMessage"in e}function gg(e){return"draftSessionId"in e&&"sourceSnapshot"in e}function EP(e){let t={};for(let[o,i]of Object.entries(e))i!==void 0&&(t[o]=i);let r=WE(FE(GE(import.meta.url)),"../../.."),n=jE(r,"node_modules",".bin");return t.PATH=[n,e.PATH].filter(Boolean).join(UE),t}function Xn(e,t=4e3){return e.length<=t?e:`${e.slice(0,t-1)}...`}var _r=class extends Error{constructor(t){super(t),this.name="HunsuError"}};var ie=class extends _r{command;stderr;constructor(t,r){super(`Git command failed: git ${t.join(" ")}${r?`
|
|
47
|
+
${r}`:""}`),this.name="GitError",this.command=t,this.stderr=r}};function xu(e){let t=[];for(let[r,n]of Object.entries(e))n!==void 0&&t.push(`${r}: ${String(n)}`);return t.join(`
|
|
48
|
+
`)}function vg(e,t="commitSha"){return typeof e=="string"&&/^[0-9a-f]{40}$/i.test(e)?l(e):yg(t,"must be a 40-character Git commit SHA")}function AP(e,t="runtimeChecksum"){return typeof e=="string"&&/^[0-9a-f]{64}$/i.test(e)?l(e):yg(t,"must be a SHA-256 hex checksum")}function pe(e,t="commitSha"){return hg(vg(e,t))}function Yn(e,t="runtimeChecksum"){return hg(AP(e,t))}function hg(e){if(e.ok)return e.value;throw new _r(`${e.error.field} ${e.error.message}`)}function yg(e,t){return S({type:"CorePrimitiveError",field:e,message:t})}import{createHash as OP}from"node:crypto";import{gzipSync as $P,gunzipSync as LP}from"node:zlib";import{existsSync as ii,mkdirSync as UP,readFileSync as Bu,rmSync as kg,writeFileSync as FP}from"node:fs";import{dirname as jP,join as Hr}from"node:path";import{mkdirSync as bP,mkdtempSync as xP,rmSync as Cu,writeFileSync as Tu}from"node:fs";import{isAbsolute as CP,join as ri}from"node:path";import{spawnSync as TP}from"node:child_process";var DP="",_P=64*1024*1024,gU=["%H","%h","%P","%D","%an","%aI","%s","%B"].join(DP);function w(e,t={}){let r=TP("git",e,{cwd:t.cwd,input:t.input,encoding:"utf8",maxBuffer:_P,env:t.env});if(r.status!==0)throw new ie(e,r.stderr.trim());return r.stdout}function j(e=process.cwd()){return w(["rev-parse","--show-toplevel"],{cwd:e}).trim()}function MP(e,t={}){let r=t.cwd??process.cwd(),n=_u(r,"hunsu-move-"),o=ri(n,"message.txt");try{return Tu(o,e,"utf8"),w(["commit","-F",o],{cwd:r}),{commitSha:pe(w(["rev-parse","HEAD"],{cwd:r}).trim()),message:e}}finally{Cu(n,{recursive:!0,force:!0})}}function Sg(e,t={}){let r=t.cwd??process.cwd();if(!w(["status","--porcelain=v1"],{cwd:r}).trim())throw new _r("Cannot create MOVE commit without worktree changes");return w(["add","--all"],{cwd:r}),MP(e,{cwd:r})}function HP(e){let t=e.finalizerMessage.trim();if(!t)throw new _r("MOVE finalizer returned an empty commit message");let r=xu({"Hunsu-Event":"move","Hunsu-Run":e.runId,"Hunsu-Move":e.moveId,"Hunsu-Goal":e.goal,"Hunsu-Role":"move-finalizer","Hunsu-Actor":e.actor??"agent:codex","Hunsu-Status":"complete"});return`${t}
|
|
49
|
+
|
|
50
|
+
${r}
|
|
51
|
+
`}function Du(e){let t=e.cwd??process.cwd(),r=_u(t,"hunsu-final-move-"),n=ri(r,"message.txt"),o=HP(e);try{return Tu(n,o,"utf8"),w(["commit","--allow-empty","-F",n],{cwd:t}),{commitSha:pe(w(["rev-parse","--verify","HEAD"],{cwd:t}).trim()),message:o}}finally{Cu(r,{recursive:!0,force:!0})}}function NP(e){let t=Array.isArray(e.requires)?e.requires.join(","):e.requires,r=xu({"Hunsu-Event":"member-path","Hunsu-Run":e.runId,"Hunsu-Path":e.pathId,"Hunsu-Member":e.executorId,"Hunsu-Goal":e.goal,"Hunsu-Requires":t});return[`path: ${e.pathId} (${e.executorId})`,"",`Goal: ${e.goal}`,"",`Requires: ${t}`,"",r].join(`
|
|
52
|
+
`)+`
|
|
53
|
+
`}function ta(e){let t=e.cwd??process.cwd(),r=_u(t,"hunsu-path-"),n=ri(r,"message.txt"),o=NP(e);try{let i=BP(t),s=w(["rev-parse","--verify",`${i}^{tree}`],{cwd:t}).trim();Tu(n,o,"utf8");let a=e.paths?.filter(c=>c.trim()!=="");a&&a.length>0?w(["add","--all","--",...a],{cwd:t}):w(["add","--all"],{cwd:t}),w(["commit","--allow-empty","-F",n],{cwd:t});let d=pe(w(["rev-parse","--verify","HEAD"],{cwd:t}).trim()),u=w(["rev-parse","--verify",`${d}^{tree}`],{cwd:t}).trim();return{commitSha:d,parentSha:i,treeSha:u,parentTreeSha:s,treeChanged:u!==s,message:o}}finally{Cu(r,{recursive:!0,force:!0})}}function BP(e){try{return pe(w(["rev-parse","--verify","HEAD"],{cwd:e}).trim())}catch{return w(["commit","--allow-empty","-m","hunsu: initialize repository worktree"],{cwd:e}),pe(w(["rev-parse","--verify","HEAD"],{cwd:e}).trim())}}function _u(e,t){let r=w(["rev-parse","--git-path","hunsu/tmp"],{cwd:e}).trim(),n=CP(r)?r:ri(e,r);return bP(n,{recursive:!0}),xP(ri(n,t))}var Ou=".hunsu/completed-destinations.hunsu",sa=".hunsu/destinations.hunsu",$u=".hunsu/harness.hunsu",Lu=".hunsu/executors.hunsu",Uu=".hunsu/resources.hunsu",Fu=".hunsu/artifact-actions.hunsu",it=".hunsu/current-execution.hunsu",Zn=".hunsu/previous-execution.hunsu",si=".hunsu/hunsu-draft.hunsu",Br=[Ou,sa,$u,Lu,Uu,Fu],Hu=".hunsu/state.hunsu",Ig="gzip+base64url";var ju={type:"self"},Nr="__HUNSU_SELF_COMMIT__",aa="HUNSU_RUNTIME_FILE_V1",WP="HUNSU_STATE_V1",GP="refs/hunsu/events",qP="%(refname) %(objectname) %(objecttype)",VP=" ";function xe(e=process.cwd()){let t=j(e),r=Ag(t),n=zu(t);if(r&&(!n||ia(r.runtime)>=ia(n.runtime)))return ni(t,r.runtime,"worktree-runtime",[],r.checksum);if(n)return ni(t,n.runtime,"reachable-runtime",[],n.checksum,n.commit);let o=yA(t)??SA(t,"HEAD");if(o){let a=oa(o.state.events,void 0,o.state.events);return ni(t,a,"legacy-state",[],Mu(a))}let i=qu(t);if(i.length>0){let a=i.map(u=>ui(KP(t,u))),d=oa(a,void 0,a);return ni(t,d,"legacy-refs",i,Mu(d))}let s=oa([]);return ni(t,s,"empty",[],Mu(s))}function JP(e,t=process.cwd()){let r=xe(t),n=e.reduce((i,s)=>{let a=Qo(i,s);if(!a.ok)throw new Error(a.error.message);return a.value},r.events),o=n.slice(r.events.length);return{store:r,acceptedEvents:o,board:Ju(n,"dry-run commands")}}function da(e,t={}){return ai([e],t)}function ai(e,t={}){let r=t.cwd??process.cwd(),{store:n,acceptedEvents:o,board:i}=JP(e,r);if(o.length>0){let s=oa([...n.events,...o],n.runtime,o,t.previousExecution);cA(n.root,s,{selfCommitMoveIds:t.selfCommitMoveIds}),gA(n.root,t.commitMessage)}return{acceptedEvents:o,board:i}}function mt(e){let t=`${JSON.stringify(e)}
|
|
54
|
+
`,r=Yn(ci(t)),n=$P(Buffer.from(t,"utf8")).toString("base64url");return{checksum:r,text:`${aa}
|
|
55
|
+
encoding: ${Ig}
|
|
56
|
+
checksum: sha256:${r}
|
|
57
|
+
|
|
58
|
+
${n}
|
|
59
|
+
`}}function wg(e,t){let r=ua(e,t,aa);return r.ok?l(r.value.value):r}function Eg(e){let t=na(e);return{"destinations.json":t.destinations,"harness.json":t.harness,"executors.json":t.executors,"resources.json":t.resources,"artifact-actions.json":t.artifactActions}}function na(e){return{destinations:cn(e.destinations),harness:cn(e.harness),executors:cn(e.executors),resources:cn(e.resources),artifactActions:cn(e.artifactActions)}}function Wu(e,t){let r=j(e),n=oi(r,t,"destinations.json");if(!n.ok)return n;let o=oi(r,t,"harness.json");if(!o.ok)return o;let i=oi(r,t,"executors.json");if(!i.ok)return i;let s=oi(r,t,"resources.json");if(!s.ok)return s;let a=oi(r,t,"artifact-actions.json");return a.ok?l({destinations:n.value,harness:o.value,executors:i.value,resources:s.value,artifactActions:a.value}):a}function Pg(e,t,r){let n=na(r);if(ra(e)!==ra(n))return be(".hunsu-prev no longer matches the source runtime bundle");if(ra(t.destinations.compatibility)!==ra(r.destinations.compatibility))return be(".hunsu-request/destinations.json compatibility is Bridge-owned and must not be edited");try{let o=Cg({completed:r.completed,destinations:t.destinations,harness:t.harness,executors:t.executors,resources:t.resources,artifactActions:t.artifactActions,currentExecution:r.currentExecution,previousExecution:r.previousExecution,eventLog:r.eventLog},"draft request runtime");return l({previous:na(r),request:na(o),requestRuntime:o})}catch(o){return be(o instanceof Error?o.message:String(o))}}function Ag(e=process.cwd()){let t=j(e);if(Br.every(r=>ii(Hr(t,r))))return xg(r=>Bu(Hr(t,r),"utf8"),"worktree",RA(t))}function bg(e=process.cwd(),t="HEAD"){let r=j(e);try{let n=pe(w(["rev-parse","--verify",`${t}^{commit}`],{cwd:r}).trim());return xg(o=>w(["show",`${n}:${o}`],{cwd:r}),n,n)}catch(n){if(n instanceof ie)return;throw n}}function zP(e=process.cwd()){let t=j(e),r;try{r=w(["rev-list","--date-order","--all","--",sa],{cwd:t}).trim().split(/\r?\n/).filter(Boolean)}catch(n){if(n instanceof ie)return[];throw n}return r.flatMap(n=>{let o=pe(n),i=bg(t,o);return i?[{commit:o,...i}]:[]})}function Gu(e=process.cwd(),t){let r=j(e),n=new Set,o=[],i=t??zu(r)?.commit??"HEAD";for(;i;){let s;try{s=pe(w(["rev-parse","--verify",`${i}^{commit}`],{cwd:r}).trim())}catch(d){if(d instanceof ie)break;throw d}if(n.has(s))break;n.add(s);let a=bg(r,s);if(!a||a.runtime.previousExecution.type!=="present")break;o.push({commit:s,execution:a.runtime.previousExecution.value}),i=a.runtime.previousExecution.value.sourceMoveCommit}return o}function di(e=process.cwd()){let t=j(e);return Ag(t)!==void 0||zu(t)!==void 0}function qu(e=process.cwd()){let t=j(e),r=w(["for-each-ref",`--format=${qP}`,GP],{cwd:t}).trim();return r?r.split(/\r?\n/).map(IA).filter(n=>n.objectType==="blob").sort((n,o)=>n.ordinal-o.ordinal||n.ref.localeCompare(o.ref)):[]}function KP(e,t){let r=j(e),n=w(["cat-file","-p",t.object],{cwd:r});return XP(n,t.ref)}function XP(e,t){let r=e.trim();if(!r)return be(`Empty Hunsu domain event object: ${t}`);let n;try{n=JSON.parse(r)}catch(i){return be(`Invalid Hunsu domain event JSON in ${t}: ${i instanceof Error?i.message:String(i)}`)}let o=Qs(n);return o.ok?l(o.value):be(`Invalid Hunsu domain event object in ${t}: ${o.error.message}`)}function oa(e,t,r=[],n){let o=Ju(e,"runtime events"),i={events:e,updatedAt:r.length>0?new Date().toISOString():t?.eventLog.updatedAt};return{completed:ZP(o,t?.completed,t?r:e),destinations:{schema:"hunsu.destinations.v1",order:"queue-head-is-current",destinations:tA(o),compatibility:{events:i.events,updatedAt:i.updatedAt}},...rA(o,t),artifactActions:nA(o),currentExecution:YP(t?.currentExecution,r),previousExecution:QP(t?.previousExecution,r,n),eventLog:i}}function YP(e,t){return t.some(r=>r.type==="HunsuRecorded"||r.type==="LineForkedByHunsu"||r.type==="MoveRecorded")?{type:"none"}:e??{type:"none"}}function QP(e,t,r){return r||(t.some(n=>n.type==="HunsuRecorded"||n.type==="LineForkedByHunsu")?{type:"none"}:t.some(n=>n.type==="MoveRecorded")?{type:"none"}:e??{type:"none"})}function ZP(e,t,r){let n=t?[...t.entries]:[];for(let o of r)if(!(o.type!=="MoveRecorded"||o.move.outcome!=="arrived"))for(let i of o.move.reachedDestinationIds)n.some(s=>s.moveId===o.move.id&&s.destinationId===i)||n.push(eA(e,o.move,i));return{schema:"hunsu.completed-destinations.v1",order:"oldest-first-tail-append",entries:n}}function eA(e,t,r){let n=t.snapshot?.destinations.find(o=>o.id===r)??e.destinations.find(o=>o.id===r);return{destinationId:r,title:n?.title??r,completedAt:t.recordedAt,resultCommit:uA(t.commit),moveId:t.id,harnessId:"default",digest:{summary:t.summary,evidence:[...t.evidence],risks:t.risks?[...t.risks]:void 0}}}function tA(e){return e.destinations.filter(t=>t.status!=="reached"&&t.status!=="canceled"&&t.status!=="superseded").sort((t,r)=>(r.priority??0)-(t.priority??0)||t.id.localeCompare(r.id))}function rA(e,t){let r=e.lines.findLast(i=>i.status==="active")??e.lines.at(-1),n=r?e.nodes.find(i=>i.id===r.currentNodeId):void 0,o=n?.harnessGraph??(t?Tg(t):Nt(Te()));return{harness:{schema:"hunsu.harness.v1",origins:e.origins.map(i=>({...i})),harness:{name:"Default Harness",rootTeamId:o.rootTeamId,guardrails:o.guardrails.map(i=>({...i})),lock:n?.harnessLock?{...n.harnessLock}:t?.harness.harness.lock}},executors:{schema:"hunsu.executors.v1",executors:cn(o.executors)},resources:{schema:"hunsu.resources.v1",resources:cn(o.resources),bindings:e.destinations.map(i=>{let s=t?.resources.bindings.find(a=>a.destinationId===i.id);return{destinationId:i.id,executorPackageBindings:n?.executorPackageBindings?.map(a=>({executorId:a.executorId,lock:{...a.lock}}))??s?.executorPackageBindings,resourcePackageBindings:n?.resourcePackageBindings?.map(a=>({name:a.name,lock:{...a.lock}}))??s?.resourcePackageBindings}})}}}function nA(e){return{schema:"hunsu.artifact-actions.v1",order:"display-order",actions:e.artifactActions.map(oA).sort((t,r)=>t.displayOrder-r.displayOrder||String(t.id).localeCompare(String(r.id)))}}function oA(e){return{...e,env:e.env?Object.fromEntries(Object.entries(e.env).map(([t,r])=>[t,{...r}])):void 0,runner:{...e.runner},aliases:e.aliases?Object.fromEntries(Object.entries(e.aliases).map(([t,r])=>[t,{...r}])):void 0,evidence:e.evidence?{...e.evidence,paths:e.evidence.paths?.slice()}:void 0}}function xg(e,t,r){let n=Qn(e,Ou,t),o=Qn(e,sa,t),i=Qn(e,$u,t),s=Qn(e,Lu,t),a=Qn(e,Uu,t),d=Qn(e,Fu,t);if(!n||!o||!i||!s||!a||!d)return;let u=Rg(e,it,t),c=Rg(e,Zn,t);return{runtime:Cg({completed:n.value,destinations:o.value,harness:i.value,executors:s.value,resources:a.value,artifactActions:d.value,currentExecution:u?{type:"present",value:u.value}:{type:"none"},previousExecution:c?{type:"present",value:c.value}:{type:"none"}},t,r),checksum:Yn(ci([n.checksum,o.checksum,i.checksum,s.checksum,a.checksum,d.checksum,u?.checksum??"none",c?.checksum??"none"].join(`
|
|
60
|
+
`)))}}function Qn(e,t,r){try{let n=ua(e(t),`${r}:${t}`,aa);return n.ok?{value:n.value.value,checksum:n.value.checksum}:ui(n)}catch(n){if(n instanceof ie)return;throw n}}function Rg(e,t,r){try{let n=ua(e(t),`${r}:${t}`,aa);return n.ok?{value:n.value.value,checksum:n.value.checksum}:ui(n)}catch(n){if(n instanceof ie||kA(n))return;throw n}}function Cg(e,t,r){if(e.completed.schema!=="hunsu.completed-destinations.v1"||e.completed.order!=="oldest-first-tail-append"||!Array.isArray(e.completed.entries))throw new Error(`Invalid completed Destinations runtime file in ${t}`);if(e.destinations.schema!=="hunsu.destinations.v1"||e.destinations.order!=="queue-head-is-current"||!Array.isArray(e.destinations.destinations))throw new Error(`Invalid pending Destinations runtime file in ${t}`);if(!e.destinations.compatibility||!Array.isArray(e.destinations.compatibility.events))throw new Error(`Invalid pending Destinations compatibility data in ${t}`);let n=[];for(let[u,c]of e.destinations.compatibility.events.entries()){let m=Qs(dA(c,r));if(!m.ok)throw new Error(`Invalid Hunsu runtime event ${u} in ${t}: ${m.error.message}`);n.push(m.value)}let o={events:n,updatedAt:typeof e.destinations.compatibility.updatedAt=="string"?e.destinations.compatibility.updatedAt:e.eventLog?.updatedAt};if(e.harness.schema!=="hunsu.harness.v1"||!e.harness.harness||typeof e.harness.harness.name!="string")throw new Error(`Invalid Harness runtime file in ${t}`);if(Object.prototype.hasOwnProperty.call(e.harness.harness,"executors"))throw new Error(`Invalid Harness runtime file in ${t}: Executor definitions are stored in executors.json`);if(Object.prototype.hasOwnProperty.call(e.harness.harness,"members"))throw new Error(`Invalid Harness runtime file in ${t}: members is stored in executors.json, not harness.json`);if(Object.prototype.hasOwnProperty.call(e.harness.harness,"plan"))throw new Error(`Invalid Harness runtime file in ${t}: root Team planner is stored in executors.json, not harness.json`);if(typeof e.harness.harness.rootTeamId!="string"||!e.harness.harness.rootTeamId.trim())throw new Error(`Invalid Harness runtime file in ${t}: rootTeamId must reference the locked root Team`);if(e.executors.schema!=="hunsu.executors.v1"||!Array.isArray(e.executors.executors))throw new Error(`Invalid Executors runtime file in ${t}`);if(e.resources.schema!=="hunsu.resources.v1"||!Array.isArray(e.resources.resources)||!Array.isArray(e.resources.bindings))throw new Error(`Invalid Resources runtime file in ${t}`);let i=iA(e.artifactActions,t),s=Tg({...e,artifactActions:i},t);br(s);let a=sA(e.currentExecution,t),d=aA(e.previousExecution,t,r);return{completed:e.completed,destinations:{...e.destinations,compatibility:{...e.destinations.compatibility,events:n}},harness:{...e.harness,harness:{name:e.harness.harness.name,rootTeamId:s.rootTeamId,guardrails:s.guardrails.map(u=>({...u})),lock:e.harness.harness.lock}},executors:{...e.executors,executors:s.executors},resources:{...e.resources,resources:s.resources},artifactActions:i,currentExecution:a,previousExecution:d,eventLog:o}}function Tg(e,t="runtime"){let r=sn({rootTeamId:e.harness.harness.rootTeamId,executors:e.executors.executors,resources:e.resources.resources,guardrails:e.harness.harness.guardrails??[],artifactActions:e.artifactActions.actions},`${t} Harness graph`);if(!r.ok)throw new Error(`Invalid Harness runtime graph in ${t}: ${r.error.message}`);return r.value}function iA(e,t){if(e.schema!=="hunsu.artifact-actions.v1"||e.order!=="display-order"||!Array.isArray(e.actions))throw new Error(`Invalid Artifact Actions runtime file in ${t}`);let r=Ko(e.actions,"artifactActions.actions");if(!r.ok)throw new Error(`Invalid Artifact Actions runtime file in ${t}: ${r.error.message}`);return{...e,actions:r.value}}function sA(e,t){if(!e||e.type==="none")return{type:"none"};if(e.type!=="present"||!e.value||e.value.schema!=="hunsu.current-execution.v1")throw new Error(`Invalid current execution runtime file in ${t}`);if(!e.value.execution||typeof e.value.execution!="object")throw new Error(`Invalid current execution payload in ${t}`);return e}function aA(e,t,r){if(!e||e.type==="none")return{type:"none"};if(e.type!=="present"||!e.value||e.value.schema!=="hunsu.previous-execution.v1")throw new Error(`Invalid previous execution runtime file in ${t}`);if(!e.value.sourceMoveCommit||!e.value.targetMoveId||!e.value.executeId||!e.value.runId||!e.value.lineId)throw new Error(`Invalid previous execution identity in ${t}`);if(!e.value.plan||e.value.plan.nodeType!=="PlanNode")throw new Error(`Invalid previous execution PlanNode in ${t}`);if(!Array.isArray(e.value.paths))throw new Error(`Invalid previous execution PathNode list in ${t}`);let n=e.value.moveFinalizerCommit;if(Vu(n)){if(!r)throw new Error(`Cannot resolve previous execution self commit in ${t}`);return{type:"present",value:{...e.value,moveFinalizerCommit:{type:"external",commit:r}}}}return e}function dA(e,t){if(e.type!=="MoveRecorded")return e;let r=e.move.commit;if(Vu(r)){if(!t)throw new Error("Cannot resolve self MOVE commit without containing commit");return{...e,move:{...e.move,commit:t}}}if(r===Nr){if(!t)throw new Error("Cannot resolve self MOVE commit without containing commit");return{...e,move:{...e.move,commit:t}}}return e}function Vu(e){return!!(e&&typeof e=="object"&&e.type==="self")}function uA(e){return Vu(e)?ju:e===Nr?Nr:pe(String(e))}function cA(e,t,r={}){let n=j(e);Mr(n,Ou,t.completed),Mr(n,sa,Dg(t,r.selfCommitMoveIds??[])),Mr(n,$u,t.harness),Mr(n,Lu,t.executors),Mr(n,Uu,t.resources),Mr(n,Fu,t.artifactActions),lA(n,t.currentExecution),mA(n,t.previousExecution,r.selfCommitMoveIds??[])}function Mr(e,t,r){let n=Hr(e,t);UP(jP(n),{recursive:!0}),FP(n,mt(r).text,"utf8")}function lA(e,t){let r=Hr(e,it);if(t.type==="none"){ii(r)&&kg(r,{force:!0});return}Mr(e,it,t.value)}function mA(e,t,r){let n=Hr(e,Zn);if(t.type==="none"){ii(n)&&kg(n,{force:!0});return}let o=pA(t.value,r);Mr(e,Zn,o)}function Dg(e,t){return{...e.destinations,compatibility:{events:e.eventLog.events.map(r=>fA(r,t)),updatedAt:e.eventLog.updatedAt}}}function fA(e,t){return e.type!=="MoveRecorded"||!t.includes(String(e.move.id))?e:{...e,move:{...e.move,commit:ju}}}function pA(e,t){return!e.moveFinalizerCommit||e.moveFinalizerCommit.type!=="external"||!t.includes(e.targetMoveId)?e:{...e,moveFinalizerCommit:ju}}function gA(e,t){if(!t)return;let r=vA(e);r.length===0||(w(["add","--all","--",...r],{cwd:e}),!w(["status","--porcelain=v1","--",...r],{cwd:e}).trim())||w(["commit","--only","-m",t,"--",...r],{cwd:e})}function vA(e){return[...Br,it,Zn].filter(t=>ii(Hr(e,t))||hA(e,t))}function hA(e,t){try{return w(["ls-files","--error-unmatch",t],{cwd:e}),!0}catch(r){if(r instanceof ie)return!1;throw r}}function ni(e,t,r,n,o,i){let s=[...t.eventLog.events];return{root:e,eventRefs:n,events:s,board:Ju(s,r),runtimePaths:Br,runtime:t,source:r,checksum:o,commit:i}}function Ju(e,t){let r=Dr(e);if(!r.ok)throw new Error(`Invalid Hunsu domain event stream in ${t}: ${r.error.message}`);return r.value}function zu(e){return zP(e).sort((t,r)=>ia(r.runtime)-ia(t.runtime)).at(0)}function ia(e){return e.eventLog.events.length}function Mu(e){return Yn(ci([mt(e.completed).checksum,mt(Dg(e,[])).checksum,mt(e.harness).checksum,mt(e.executors).checksum,mt(e.resources).checksum,mt(e.artifactActions).checksum,e.currentExecution.type==="present"?mt(e.currentExecution.value).checksum:"none",e.previousExecution.type==="present"?mt(e.previousExecution.value).checksum:"none"].join(`
|
|
61
|
+
`)))}function ua(e,t,r){let n=e.replace(/\r\n/g,`
|
|
62
|
+
`),o=n.indexOf(`
|
|
63
|
+
|
|
64
|
+
`);if(o===-1)return be(`Invalid Hunsu runtime envelope in ${t}`);let i=n.slice(0,o).split(`
|
|
65
|
+
`),s=n.slice(o+2).trim();if(i[0]!==r)return be(`Invalid Hunsu runtime header in ${t}`);let a=new Map(i.slice(1).map(m=>{let f=m.indexOf(":");return f===-1?[m.trim(),""]:[m.slice(0,f).trim(),m.slice(f+1).trim()]}));if(a.get("encoding")!==Ig)return be(`Unsupported Hunsu runtime encoding in ${t}: ${a.get("encoding")??"missing"}`);let d=a.get("checksum")?.replace(/^sha256:/,"");if(!d)return be(`Missing Hunsu runtime checksum in ${t}`);let u;try{u=LP(Buffer.from(s,"base64url")).toString("utf8")}catch(m){return be(`Invalid Hunsu runtime payload in ${t}: ${m instanceof Error?m.message:String(m)}`)}let c=ci(u);if(c!==d)return be(`Hunsu runtime checksum mismatch in ${t}`);try{return l({value:JSON.parse(u),checksum:Yn(c)})}catch(m){return be(`Invalid Hunsu runtime JSON in ${t}: ${m instanceof Error?m.message:String(m)}`)}}function yA(e){let t=j(e),r=Hr(t,Hu);if(!ii(r))return;let n=ui(_g(Bu(r,"utf8"),r));return{state:n,checksum:Mg(n)}}function SA(e,t){let r=j(e);try{let n=w(["show",`${t}:${Hu}`],{cwd:r}),o=ui(_g(n,`${t}:${Hu}`));return{state:o,checksum:Mg(o)}}catch(n){if(n instanceof ie)return;throw n}}function _g(e,t){let r=ua(e,t,WP);if(!r.ok)return r;let n=r.value.value;if(!n||typeof n!="object")return be(`Invalid legacy Hunsu runtime state JSON in ${t}: expected object`);let o=n;if(o.version!==1||!Array.isArray(o.events))return be(`Invalid legacy Hunsu runtime state in ${t}`);let i=[];for(let[s,a]of o.events.entries()){let d=Qs(a);if(!d.ok)return be(`Invalid legacy Hunsu runtime state event ${s} in ${t}: ${d.error.message}`);i.push(d.value)}return l({version:1,events:i,...typeof o.updatedAt=="string"?{updatedAt:o.updatedAt}:{}})}function Mg(e){return Yn(ci(`${JSON.stringify(e)}
|
|
66
|
+
`))}function be(e){return S({type:"DomainStoreError",message:e})}function oi(e,t,r){let n=Hr(e,t,r);try{return l(JSON.parse(Bu(n,"utf8")))}catch(o){return be(`Cannot read ${t}/${r}: ${o instanceof Error?o.message:String(o)}`)}}function cn(e){return JSON.parse(JSON.stringify(e))}function ra(e){return JSON.stringify(Nu(e))}function Nu(e){return Array.isArray(e)?e.map(Nu):e&&typeof e=="object"?Object.fromEntries(Object.entries(e).sort(([t],[r])=>t.localeCompare(r)).map(([t,r])=>[t,Nu(r)])):e}function ui(e){if(e.ok)return e.value;throw new Error(e.error.message)}function RA(e){try{return pe(w(["rev-parse","--verify","HEAD^{commit}"],{cwd:e}).trim())}catch(t){if(t instanceof ie)return;throw t}}function kA(e){return e instanceof Error?"code"in e&&e.code==="ENOENT":!1}function ci(e){return OP("sha256").update(e).digest("hex")}function IA(e){let[t,r,n]=e.split(VP);return{ref:t,object:r,objectType:n,ordinal:wA(t)}}function wA(e){let r=e.slice(e.lastIndexOf("/")+1).match(/^E(\d+)(?:-|$)/);return r?Number.parseInt(r[1],10):Number.MAX_SAFE_INTEGER}import{existsSync as Lt,readFileSync as Bg,readdirSync as EA,statSync as PA,writeFileSync as AA}from"node:fs";import{basename as bA,join as cr,resolve as xA}from"node:path";var CA="Port Git Project",TA="Make this project ready for Hunsu-managed MOVEs and Artifact Actions.";function Ku(e=process.cwd()){let t=xA(e),r=[],n=t,o=!1;try{n=j(t),o=!0}catch{r.push("Not a Git repository. Hunsu Port expects an existing Git project.")}let i=MA(n),s=i?.scripts??{},a=_A(n,i),d=Hg(n,/^Dockerfile(?:\.|$)/),u=Hg(n,/^(?:docker-)?compose(?:\.[^.]+)?\.ya?ml$/),c=o&&Og(n),m=DA(n),f=HA(n,s),p=[];return!i&&o&&r.push("No package.json found. Port can still create Roadmap state, but Artifact Actions may need a later Hunsu setup."),o&&!c&&r.push("Hunsu runtime state is missing. Port apply will create Initial Team state."),{root:n,isGitRepository:o,isHunsuRoadmap:c,packageManager:a,packageScripts:s,docker:{dockerfiles:d,composeFiles:u},artifactActions:m,env:f,recommendedFiles:p,issues:r}}function Xu(e={}){let t=Ku(e.cwd);if(!t.isGitRepository)throw new Error("Hunsu Port requires an existing Git repository");let r=e.title?.trim()||bA(t.root)||CA,n=e.goal?.trim()||TA,o=e.destinations&&e.destinations.length>0?e.destinations:[{id:"destination_001",title:"Establish artifact-action-ready product execution",priority:100}],i=t.isHunsuRoadmap?[]:[{type:"CreateInitialTeam",requestId:Ng("req",r),lineId:`run/${Ng("req",r)}`,title:r,goal:n,destinations:o,harness:e.harness}];return{root:t.root,title:r,goal:n,destinations:o,inspection:t,files:[],commands:i}}function Yu(e={}){let t=Xu(e),r=[];for(let o of t.files){let i=cr(t.root,o.path);Lt(i)||(AA(i,o.content,"utf8"),r.push(o.path))}let n=t.commands.length>0?ai(t.commands,{cwd:t.root,commitMessage:`hunsu: port ${t.title}`}):{acceptedEvents:[],board:xe(t.root).board};return{root:t.root,plan:t,writtenFiles:r,acceptedEvents:n.acceptedEvents,board:n.board}}function DA(e){if(!Og(e))return{configured:!1,count:0,issues:[]};let t=xe(e).board;return{configured:t.artifactActions.length>0,count:t.artifactActions.length,issues:[]}}function _A(e,t){if(Lt(cr(e,"pnpm-lock.yaml"))||t?.packageManager?.startsWith("pnpm@"))return"pnpm";if(Lt(cr(e,"yarn.lock"))||t?.packageManager?.startsWith("yarn@"))return"yarn";if(Lt(cr(e,"bun.lockb"))||Lt(cr(e,"bun.lock"))||t?.packageManager?.startsWith("bun@"))return"bun";if(Lt(cr(e,"package-lock.json"))||t)return"npm"}function MA(e){let t=cr(e,"package.json");if(Lt(t))return JSON.parse(Bg(t,"utf8"))}function Hg(e,t){return!Lt(e)||!PA(e).isDirectory()?[]:EA(e).filter(r=>t.test(r)).sort()}function Og(e){try{return di(e)||qu(e).length>0||w(["for-each-ref","--count=1","--format=%(refname)","refs/hunsu"],{cwd:e}).trim().length>0}catch(t){if(t instanceof ie)return!1;throw t}}function HA(e,t){let r=[".env",".env.local",".env.development",".env.example"].filter(o=>Lt(cr(e,o))),n=Object.entries(t).filter(([,o])=>/\b(?:3000|5173|8080|4187)\b|localhost|127\.0\.0\.1/.test(o)).map(([o])=>`package.json scripts.${o}`);for(let o of["vite.config.ts","vite.config.js","next.config.js","next.config.mjs"]){let i=cr(e,o);if(!Lt(i))continue;let s=Bg(i,"utf8");/\b(?:3000|5173|8080|4187)\b|localhost|127\.0\.0\.1/.test(s)&&n.push(o)}return{files:r,hardcodedHints:n}}function Ng(e,t){let r=t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"").slice(0,48);return`${e}_${r||"project"}`}import{createHash as NA}from"node:crypto";import{spawnSync as BA}from"node:child_process";import{existsSync as fa,mkdirSync as $g,readFileSync as OA,readdirSync as $A,rmSync as Lg,writeFileSync as LA}from"node:fs";import{tmpdir as UA}from"node:os";import{basename as FA,join as ca,resolve as ec}from"node:path";function Ug(e=process.cwd(),t){let r=j(e),n=xe(r);if(t){let o=n.board.moves.find(s=>s.id===t);if(!o)throw new Error(`No MOVE found for Artifact Action source: ${t}`);let i=n.board.nodes.find(s=>s.id===o.toNodeId);return ma(o.snapshot?.artifactActions??i?.artifactActions??[])}return ma(n.board.artifactActions)}function tc(e){let t=j(e.cwd??process.cwd()),r=jA(t,e),n=r.actions.find(c=>c.id===e.actionId);if(!n)throw new Error(`Unknown Artifact Action for selected source: ${e.actionId}`);WA(n,r.source);let o=e.now??new Date().toISOString(),i=KA(n.id,r.source,o),s=e.baseActionPath??zA(e.roadmapId,i),a=n.kind==="host"?qA(n,s):void 0,d=rc(n,e.env,e.ambientEnv),u={runId:i,actionId:n.id,roadmapId:e.roadmapId,action:Zu(n),source:r.source,status:"queued",env:GA(n,d),aliases:a,createdAt:o,updatedAt:o};return{action:Zu(n),run:u,commands:Gg(t,n,u,d)}}function Fg(e,t={}){let r=j(e.cwd??process.cwd()),n=tc(e),o=e.now??new Date().toISOString(),i=JA(r,n.run.runId,n.run.source.commit,o,e.worktreeRoot),s=e.processEnv??t.processEnv,a=t.runner??((m,f,p)=>Xg(m,f,{...p,processEnv:s})),d={...n.run,status:(n.action.kind==="host","running"),sourceWorktree:i,updatedAt:o},u=rc(n.action,e.env,e.ambientEnv),c=Gg(r,n.action,d,u);try{if(n.action.runner.type==="docker_compose")li(a,c[0]),li(a,c[1]),d.aliases=VA(r,d,a,u),d.status="running";else{let m=li(a,c[0]);if(d.exitCode=m.status,d.stdout=m.stdout,d.stderr=m.stderr,d.status=n.action.kind==="host"?"running":"succeeded",n.action.kind==="check"){let f=la(r,i.path);d.sourceWorktree={...i,removedAt:f}}}d.updatedAt=new Date().toISOString()}catch(m){d.status="failed",d.updatedAt=new Date().toISOString(),d.error=m instanceof Error?m.message:String(m);let f=la(r,i.path);d.sourceWorktree={...i,removedAt:f}}if(t.store!==!1&&Vg(r,d),d.status==="failed")throw new Error(d.error??`Artifact Action ${d.runId} failed`);return d}function jg(e=process.cwd()){let t=j(e),r=nc(t);return fa(r)?$A(r).filter(n=>n.endsWith(".json")).map(n=>mi(t,n.slice(0,-5))).sort((n,o)=>o.updatedAt.localeCompare(n.updatedAt)):[]}function mi(e,t){let r=j(e),n=Jg(r,t);if(!fa(n))throw new Error(`Unknown Artifact Action Run: ${t}`);return JSON.parse(OA(n,"utf8"))}function Wg(e,t,r={}){let n=j(e),o=mi(n,t),i=r.runner??((u,c,m)=>Xg(u,c,{...m,processEnv:r.processEnv})),s=rc(o.action,o.env,r.processEnv);o.action.runner.type==="docker_compose"?li(i,Qu(n,o,["down"],s)):o.action.runner.stopCommand&&li(i,qg(n,o,o.action.runner.stopCommand,s));let a=o.sourceWorktree?.path?la(n,o.sourceWorktree.path):void 0,d={...o,sourceWorktree:o.sourceWorktree?{...o.sourceWorktree,removedAt:a}:void 0,status:"stopped",stoppedAt:new Date().toISOString(),updatedAt:new Date().toISOString()};return r.store!==!1&&Vg(n,d),d}function jA(e,t){if(t.moveId&&t.commit)throw new Error("Artifact Action source accepts either moveId or commit, not both");let r=xe(e);if(t.moveId){let o=r.board.moves.find(s=>s.id===t.moveId);if(!o)throw new Error(`No MOVE found for Artifact Action source: ${t.moveId}`);let i=r.board.nodes.find(s=>s.id===o.toNodeId);return{source:{moveId:o.id,commit:w(["rev-parse","--verify",`${o.commit}^{commit}`],{cwd:e}).trim(),ref:o.commit},actions:ma(o.snapshot?.artifactActions??i?.artifactActions??[])}}let n=t.commit??"HEAD";return{source:{commit:w(["rev-parse","--verify",`${n}^{commit}`],{cwd:e}).trim(),ref:n},actions:ma(r.board.artifactActions)}}function WA(e,t){if(e.sourceScope==="move"&&!t.moveId)throw new Error(`Artifact Action ${e.id} can only run against a MOVE source`);if(e.sourceScope==="commit"&&t.moveId)throw new Error(`Artifact Action ${e.id} can only run against a commit source`)}function rc(e,t={},r={}){let n={},o=new Set;for(let[i,s]of Object.entries(e.env??{}))if(o.add(i),"default"in s)n[i]=t[i]??String(s.default);else if("value"in s)n[i]=t[i]??String(s.value);else if("alias"in s){let a=e.aliases?.[s.alias];if(!a)throw new Error(`Artifact Action env ${i} references unknown alias: ${s.alias}`);n[i]=String(a.containerPort??a.target??"")}else if("fromAliasUrl"in s){let a=e.aliases?.[s.fromAliasUrl];if(!a)throw new Error(`Artifact Action env ${i} references unknown alias: ${s.fromAliasUrl}`);n[i]=a.service&&a.containerPort?`http://${a.service}:${a.containerPort}`:String(a.target??"")}else if(s.required){let a=t[i]??r[i];if(!a)throw new Error(`Artifact Action env ${i} is required but not set`);n[i]=a}for(let[i,s]of Object.entries(t))o.has(i)||(n[i]=s);return n}function GA(e,t){let r={};for(let[n,o]of Object.entries(t)){let i=e.env?.[n];r[n]=i&&"required"in i&&i.secret?"<secret>":o}return r}function Gg(e,t,r,n){return t.runner.type==="docker_compose"?[Qu(e,r,["build"],n),Qu(e,r,["up","-d"],n)]:[qg(e,r,t.runner.command,n)]}function Qu(e,t,r,n){if(t.action.runner.type!=="docker_compose")throw new Error(`Artifact Action ${t.actionId} does not use docker compose`);let o=t.source.commit.slice(0,12),i=zg(Kg(t.action.runner.projectName??`hunsu-${t.actionId}-${o}`,{actionId:t.actionId,runId:t.runId,commit:t.source.commit,shortCommit:o,moveId:t.source.moveId??""}));return{command:"docker",args:["compose","-f",ec(t.sourceWorktree?.path??e,t.action.runner.file),"-p",i,...r],cwd:t.sourceWorktree?.path??e,env:n}}function qg(e,t,r,n){return{command:"sh",args:["-lc",r],cwd:t.sourceWorktree?.path??e,env:n}}function li(e,t){let r=e(t.command,t.args,{cwd:t.cwd,env:t.env});if(r.status!==0)throw new Error(`${t.command} ${t.args.join(" ")} failed
|
|
67
|
+
${r.stderr||r.stdout}`);return r}function qA(e,t){if(e.aliases)return Object.fromEntries(Object.entries(e.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:`${t}/${encodeURIComponent(r)}/`}]))}function VA(e,t,r,n){if(!t.aliases||t.action.runner.type!=="docker_compose")return t.aliases;let o=t.action.runner;return Object.fromEntries(Object.entries(t.aliases).map(([i,s])=>{if(!s.service||!s.containerPort)return[i,s];let a=r("docker",["compose","-f",ec(t.sourceWorktree?.path??e,o.file),"-p",zg(Kg(o.projectName??`hunsu-${t.actionId}-${t.source.commit.slice(0,12)}`,{actionId:t.actionId,runId:t.runId,commit:t.source.commit,shortCommit:t.source.commit.slice(0,12),moveId:t.source.moveId??""})),"port",s.service,String(s.containerPort)],{cwd:t.sourceWorktree?.path??e,env:n});return a.status!==0||!a.stdout.trim()?[i,s]:[i,{...s,directUrl:YA(a.stdout.trim())}]}))}function JA(e,t,r,n,o){let i=ec(o??ca(UA(),"hunsu-action-runs",`${FA(e)}-${XA(e)}`)),s=ca(i,oc(t));return $g(i,{recursive:!0}),fa(s)&&(la(e,s),Lg(s,{recursive:!0,force:!0})),w(["worktree","add","--detach",s,r],{cwd:e}),{path:s,commit:r,createdAt:n}}function la(e,t){let r=new Date().toISOString();if(!fa(t))return r;try{w(["worktree","remove","--force",t],{cwd:e})}catch{Lg(t,{recursive:!0,force:!0}),w(["worktree","prune"],{cwd:e})}return r}function Vg(e,t){$g(nc(e),{recursive:!0}),LA(Jg(e,t.runId),`${JSON.stringify(t,null,2)}
|
|
68
|
+
`,"utf8")}function nc(e){return ca(e,".hunsu","action-runs")}function Jg(e,t){return ca(nc(e),`${oc(t)}.json`)}function zA(e,t){return e?`/api/roadmaps/${encodeURIComponent(e)}/action-runs/${encodeURIComponent(t)}/proxy`:`/api/action-runs/${encodeURIComponent(t)}/proxy`}function KA(e,t,r){return oc(`${e}-${t.moveId??t.commit.slice(0,12)}-${r.replace(/[^0-9A-Za-z]/g,"").slice(0,14)}`)}function oc(e){return e.toLowerCase().replace(/[^a-z0-9_.-]+/g,"-").replace(/^-+|-+$/g,"")||"action-run"}function zg(e){return e.toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"").slice(0,63)||"hunsu-action"}function Kg(e,t){return e.replace(/\{([a-zA-Z][a-zA-Z0-9]*)\}/g,(r,n)=>t[n]??"")}function XA(e){return NA("sha256").update(e).digest("hex").slice(0,12)}function YA(e){let t=e.split(/\r?\n/).find(Boolean)??e,r=t.match(/(?:0\.0\.0\.0|127\.0\.0\.1|localhost|\[::\]|::):(\d+)$/);return r?`http://127.0.0.1:${r[1]}`:/^https?:\/\//.test(t)?t:`http://${t}`}function Xg(e,t,r){let n=BA(e,t,{cwd:r.cwd,env:{...QA(r.processEnv),...r.env},encoding:"utf8",maxBuffer:16777216});return{status:n.status??1,stdout:n.stdout,stderr:n.stderr}}function QA(e){if(e===void 0)return;let t={};for(let[r,n]of Object.entries(e))n!==void 0&&(t[r]=n);return t}function ma(e){return e.map(Zu).sort((t,r)=>t.displayOrder-r.displayOrder||String(t.id).localeCompare(String(r.id)))}function Zu(e){return{...e,env:e.env?Object.fromEntries(Object.entries(e.env).map(([t,r])=>[t,{...r}])):void 0,runner:{...e.runner},aliases:e.aliases?Object.fromEntries(Object.entries(e.aliases).map(([t,r])=>[t,{...r}])):void 0,evidence:e.evidence?{...e.evidence,paths:e.evidence.paths?.slice()}:void 0}}import{createHash as ZA}from"node:crypto";var eb="hunsu.hub-package-manifest.v1",Yg="hunsu-json-c14n-v1+sha256:";function tb(e){dc(e);let{integrity:t,...r}=e;return JSON.stringify(ac(r,"manifest"))}function rb(e){let t=tb(e);return`${Yg}${ZA("sha256").update(t,"utf8").digest("hex")}`}async function fi(e,t){if(!e.integrity.startsWith(Yg))throw new Error(`Unsupported Hub package integrity prefix: ${e.integrity}`);let r=t.origins.find(a=>a.name===e.origin);if(!r)throw new Error(`Unknown Origin: ${e.origin}`);if(r.transport!=="http")throw new Error(`Origin ${r.name} uses unsupported transport ${r.transport}`);let o=await(t.fetch??fetch)(nb(r.url,e.kind,e.key,e.version));if(!o.ok)throw o.status===404?new Error(`Missing Hub package manifest: ${e.origin}/${e.kind}/${e.key}@${e.version}`):new Error(`Origin ${r.name} returned ${o.status} for ${e.kind}/${e.key}@${e.version}`);let i=await o.json();if(dc(i),i.kind!==e.kind||i.key!==e.key||i.version!==e.version)throw new Error(`Hub package manifest from ${r.name} does not match requested ${e.kind}/${e.key}@${e.version}`);let s=rb(i);if(s!==e.integrity)throw new Error(`Hub package integrity mismatch for ${e.origin}/${e.kind}/${e.key}@${e.version}: expected ${e.integrity}, got ${s}`);return{lock:{...e},manifest:i,integrity:s,origin:{...r}}}function nb(e,t,r,n){let o=new URL(e),i=`/v1/packages/${t}/${encodeURIComponent(r)}/versions/${encodeURIComponent(n)}`;return new URL(i,o).toString()}function Qg(e){if(dc(e),e.kind!=="team")throw new Error(`Hub package ${e.kind}/${e.key}@${e.version} is not a team package`);return ub(e.team)}function dc(e){let t=ic(e,"manifest");if(t.schema!==eb)throw new Error(`Unsupported Hub package manifest schema: ${String(t.schema)}`);sc(t,["integrity","key","kind","team","member","manager","schema","skill","version"],"manifest");let r=db(t.kind,"manifest.kind");switch(eo(t.key,"manifest.key"),eo(t.version,"manifest.version"),t.integrity!==void 0&&eo(t.integrity,"manifest.integrity"),r){case"team":if(ob(t.team),t.member!==void 0||t.manager!==void 0||t.skill!==void 0)throw new Error("Team package manifest must not include member, manager, or skill payloads");return;case"member":if(ib(t.member),t.team!==void 0||t.manager!==void 0||t.skill!==void 0)throw new Error("Member package manifest must not include team, manager, or skill payloads");return;case"manager":if(sb(t.manager),t.team!==void 0||t.member!==void 0||t.skill!==void 0)throw new Error("Manager package manifest must not include team, member, or skill payloads");return;case"skill":if(ab(t.skill),t.team!==void 0||t.member!==void 0||t.manager!==void 0)throw new Error("Skill package manifest must not include team, member, or manager payloads");return}}function ob(e){let t=sn(e,"manifest.team");if(!t.ok)throw new Error(`Invalid manifest.team: ${t.error.message}`)}function ib(e){let t=jd(e,"manifest.member");if(!t.ok)throw new Error(`Invalid manifest.member: ${t.error.message}`)}function sb(e){let t=Bo(e,"manifest.manager");if(!t.ok)throw new Error(`Invalid manifest.manager: ${t.error.message}`)}function ab(e){let t=ic(e,"manifest.skill");if(sc(t,["contentHash","files","name"],"manifest.skill"),eo(t.name,"manifest.skill.name"),eo(t.contentHash,"manifest.skill.contentHash"),t.files!==void 0){if(!Array.isArray(t.files))throw new Error("manifest.skill.files must be an array");for(let[r,n]of t.files.entries()){let o=ic(n,`manifest.skill.files[${r}]`);sc(o,["path","text"],`manifest.skill.files[${r}]`),eo(o.path,`manifest.skill.files[${r}].path`),Zg(o.text,`manifest.skill.files[${r}].text`)}}}function db(e,t){if(e==="team"||e==="member"||e==="manager"||e==="skill")return e;throw new Error(`${t} must be team, member, manager, or skill`)}function ic(e,t){if(typeof e!="object"||e===null||Array.isArray(e))throw new Error(`${t} must be an object`);return e}function sc(e,t,r){let n=t.filter(i=>i!=="integrity"&&i!=="team"&&i!=="member"&&i!=="manager"&&i!=="skill"&&i!=="files"&&!(i in e));if(n.length>0)throw new Error(`${r} is missing required keys: ${n.join(", ")}`);let o=Object.keys(e).filter(i=>!t.includes(i));if(o.length>0)throw new Error(`${r} has unsupported keys: ${o.join(", ")}`)}function Zg(e,t){if(typeof e!="string")throw new Error(`${t} must be a string`);return e}function eo(e,t){let r=Zg(e,t);if(r.trim().length===0)throw new Error(`${t} must be non-empty`);return r}function ac(e,t){if(e===null||typeof e=="string"||typeof e=="boolean")return e;if(typeof e=="number"){if(!Number.isFinite(e))throw new Error(`${t} must be a finite number`);return e}if(Array.isArray(e))return e.map((r,n)=>{if(r===void 0)throw new Error(`${t}[${n}] must not be undefined`);return ac(r,`${t}[${n}]`)});if(typeof e=="object"&&e!==null){let r=e,n={};for(let o of Object.keys(r).sort()){let i=r[o];i!==void 0&&(n[o]=ac(i,`${t}.${o}`))}return n}throw new Error(`${t} must be JSON-serializable`)}function ub(e){return JSON.parse(JSON.stringify(e))}function B(e,t,r){return r===void 0?{code:e,message:t}:{code:e,message:t,details:r}}function pi(e){let t=new Error(e.message);return t.name=`ExecuteOrchestrationError:${e.code}`,e.details!==void 0&&(t.details=e.details),t}function ln(e){if(e.ok)return e.value;throw pi(e.error)}function cc(e){let t=uv(e,"Team planning final response must be a JSON ExecutionPlan object");return t.ok?mc(t.value,"execution"):t}function tv(e){let t=uv(e,"Goal evaluator final response must be a JSON object");if(!t.ok)return t;let r=t.value;if(r.type==="pass"){if(typeof r.summary!="string"||r.summary.trim()==="")return S(B("goal_evaluation_invalid","pass evaluation must include a non-empty summary"));let n=uc(r.evidence,"evidence");return n.ok?l({type:"pass",summary:r.summary,evidence:n.value}):n}if(r.type==="fail"){if(typeof r.reason!="string"||r.reason.trim()==="")return S(B("goal_evaluation_invalid","fail evaluation must include a non-empty reason"));if(typeof r.feedback!="string"||r.feedback.trim()==="")return S(B("goal_evaluation_invalid","fail evaluation must include non-empty feedback"));if(r.nextGoal!==void 0&&typeof r.nextGoal!="string")return S(B("goal_evaluation_invalid","fail evaluation nextGoal must be a string when present"));let n=uc(r.evidence,"evidence");return n.ok?l({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 S(B("goal_evaluation_invalid","Goal evaluator response type must be pass or fail"))}function lc(e,t,r,n){if(t==="assignee")return{id:r,executorId:e.assignee.executorId,goal:e.assignee.goal,requires:n};let o=e.evaluator;if(!o)throw new Error(`Goal ${e.id} does not define an evaluator`);return{id:r,executorId:o.executorId,goal:o.prompt,requires:n}}function rv(e,t){let[,...r]=e.items;if(t)return{...e,items:[t,...r]};if(r.length!==0)return{...e,items:r}}function mc(e,t){return gi(e)?e.kind==="queue"?cb(e,t):e.kind==="goal"?nv(e,t):e.kind==="continuation"?lb(e,t):S(B("execution_plan_invalid",`${t}.kind must be queue, goal, or continuation`)):S(B("execution_plan_invalid",`${t} must be an object`))}function cb(e,t){let r=iv(e.id,`${t}.id`);if(!r.ok)return r;if(!Array.isArray(e.items))return S(B("execution_plan_invalid",`${t}.items must be an array`));let n=[];for(let[o,i]of e.items.entries()){let s=mc(i,`${t}.items[${o}]`);if(!s.ok)return s;n.push(s.value)}return l({kind:"queue",id:r.value,items:n})}function nv(e,t){return e.stage==="needs_evaluation"?ov(e,t):e.stage==="needs_execution"?mb(e,t):S(B("execution_plan_invalid",`${t}.stage must be needs_evaluation or needs_execution`))}function lb(e,t){let r=fc(e.id,`${t}.id`);if(!r.ok)return r;let n=sv(e.teamScopeId,`${t}.teamScopeId`);if(!n.ok)return n;let o=mc(e.execution,`${t}.execution`);if(!o.ok)return o;let i=e.continuation===void 0?l(void 0):gi(e.continuation)?nv(e.continuation,`${t}.continuation`):S(B("execution_plan_invalid",`${t}.continuation must be an object`));return i.ok?l({kind:"continuation",id:r.value,teamScopeId:n.value,execution:o.value,continuation:i.value}):i}function ov(e,t){let r=fc(e.id,`${t}.id`);if(!r.ok)return r;let n=ev(e.assignee,`${t}.assignee`,"goal");if(!n.ok)return n;let o=e.evaluator===void 0||e.evaluator===null?l(void 0):ev(e.evaluator,`${t}.evaluator`,"prompt");if(!o.ok)return o;let i=bf(e.remainingAttempts,`${t}.remainingAttempts`);if(!i.ok)return S(B("execution_plan_invalid",i.error.message));let s=pb(e.requires,`${t}.requires`);return s.ok?l({kind:"goal",stage:"needs_evaluation",id:r.value,assignee:{executorId:n.value.executorId,goal:n.value.text},evaluator:o.value?{executorId:o.value.executorId,prompt:o.value.text}:void 0,remainingAttempts:i.value,requires:s.value}):s}function mb(e,t){let r=ov({...e,stage:"needs_evaluation"},t);if(!r.ok)return r;let n=fc(e.evaluationPathId,`${t}.evaluationPathId`);if(!n.ok)return n;let o=fb(e.evaluation,`${t}.evaluation`);if(!o.ok)return o;if(!Array.isArray(e.requires))return S(B("execution_plan_invalid",`${t}.requires must be an array for needs_execution`));let i=av(e.requires,`${t}.requires`);return i.ok?i.value.length!==1||i.value[0]!==n.value?S(B("execution_plan_invalid",`${t}.requires must contain only ${t}.evaluationPathId`)):l({...r.value,stage:"needs_execution",evaluationPathId:n.value,evaluation:o.value,requires:i.value}):i}function ev(e,t,r){if(!gi(e))return S(B("execution_plan_invalid",`${t} must be an object`));let n=sv(e.executorId,`${t}.executorId`);if(!n.ok)return n;let o=iv(e[r],`${t}.${r}`);return o.ok?l({executorId:n.value,text:o.value}):o}function fb(e,t){if(!gi(e))return S(B("execution_plan_invalid",`${t} must be an object`));if(e.type!=="fail")return S(B("execution_plan_invalid",`${t}.type must be fail`));if(typeof e.reason!="string"||e.reason.trim()==="")return S(B("execution_plan_invalid",`${t}.reason must be a non-empty string`));if(typeof e.feedback!="string"||e.feedback.trim()==="")return S(B("execution_plan_invalid",`${t}.feedback must be a non-empty string`));if(e.nextGoal!==void 0&&typeof e.nextGoal!="string")return S(B("execution_plan_invalid",`${t}.nextGoal must be a string when present`));let r=uc(e.evidence,`${t}.evidence`);return r.ok?l({type:"fail",reason:e.reason,feedback:e.feedback,nextGoal:typeof e.nextGoal=="string"&&e.nextGoal.trim()!==""?e.nextGoal:void 0,evidence:r.value}):r}function iv(e,t){return typeof e!="string"||e.trim()===""?S(B("execution_plan_invalid",`${t} must be a non-empty string`)):l(e)}function fc(e,t){let r=k(e,t);return r.ok?l(r.value):S(B("execution_plan_invalid",r.error.message))}function sv(e,t){let r=k(e,t);return r.ok?l(r.value):S(B("execution_plan_invalid",r.error.message))}function pb(e,t){return e==="PrevMove"?l("PrevMove"):av(e,t)}function av(e,t){let r=dv(e,t,"execution_plan_invalid");if(!r.ok)return r;let n=[];for(let[o,i]of r.value.entries()){let s=k(i,`${t}[${o}]`);if(!s.ok)return S(B("execution_plan_invalid",s.error.message));n.push(s.value)}return l(n)}function uc(e,t){return e===void 0?l(void 0):dv(e,t,"goal_evaluation_invalid")}function dv(e,t,r){return Array.isArray(e)?e.every(n=>typeof n=="string")?l([...e]):S(B(r,`${t} must be an array of strings`)):S(B(r,`${t} must be an array of strings`))}function uv(e,t){try{let r=JSON.parse(e);return gi(r)?l(r):S(B("execution_plan_invalid",t))}catch(r){return S(B("execution_plan_invalid",t,{cause:r instanceof Error?r.message:String(r)}))}}function gi(e){return!!e&&typeof e=="object"&&!Array.isArray(e)}function pc(e){let{line:t,lineNode:r}=e;if(!r)return S(B("invalid_start_state",`No execute-ready MOVE found for Team route ${t.id}`));if(t.status==="failed"||t.status==="complete"||t.status==="abandoned")return S(B("invalid_start_state",`Cannot start Execute from ${t.id} because the route is ${t.status}`));if(new Set(e.board.edges.filter(a=>a.type==="move").map(a=>a.fromNodeId)).has(r.id))return S(B("invalid_start_state",`Cannot start Execute from ${cv(r,e.formatMovePosition)} because Arrived or Accident already exists`));if(e.existingRuns.find(a=>a.sourceNodeId===r.id&&(a.status==="running"||a.status==="paused")))return S(B("active_execute_exists",`A Execute is already active for ${cv(r,e.formatMovePosition)}`));let i=ir(r.ordinal+1,"targetMoveOrdinal");if(!i.ok)return S(B("invalid_start_state",i.error.message));let s=gb(e.selectedDestinationIds,e.activeDestinations);return s.ok?l({lineNode:r,selectedDestinationIds:s.value,targetMoveOrdinal:i.value}):s}function lv(e){return e?l(e):S(B("terminal_output_missing","ExecutionPlan completed without a terminal output"))}function gb(e,t){let r=vb(t);return e&&e.length>0?e.length!==1?S(B("invalid_start_state","Execute must select exactly one Destination")):r&&e[0]===r.id?l([...e]):S(B("invalid_start_state","Execute must select the next Destination in the queue")):l(r?[r.id]:[])}function vb(e){return[...e].sort(hb)[0]}function hb(e,t){return(t.priority??0)-(e.priority??0)}function cv(e,t){return t?t(e):`${e.teamName??"Team"} MOVE ${e.ordinal}`}import{execFile as Rb,spawn as kb}from"node:child_process";import{accessSync as Ib,constants as wb,existsSync as vi,readdirSync as Eb,statSync as Pb}from"node:fs";import{delimiter as pv,isAbsolute as ga,join as Ut}from"node:path";import{promisify as Ab}from"node:util";function pa(e,t,r,n=process.platform){return n!=="win32"||!/\.(?:cmd|bat)$/iu.test(e)?{command:e,args:t}:{command:r.ComSpec??r.COMSPEC??"cmd.exe",args:["/d","/s","/v:off","/c",yb(e,t)],windowsVerbatimArguments:!0}}function yb(e,t){return`"${[e,...t].map(Sb).join(" ")}"`}function Sb(e){if(/[%"\u0000-\u001f\u007f]/u.test(e))throw new Error("Windows command-shim paths and arguments cannot contain percent, quote, or control characters.");return`"${e}"`}var ye="0.2.0-next.1",mn="local-bridge-v1";var ha=Ab(Rb),yi=3500;async function Or(e={}){let t=e.env??oe(),r=e.platform??process.platform,n=await bb({env:t,platform:r,customBinaryPath:e.customBinaryPath}),o=[];for(let d of n){let u=await xb(d,t,r,e.timeoutMs);if(o.push(u),d.rejectWhitespace&&u.error?.includes("HUNSU_CODEX_APP_SERVER_COMMAND"))return{installed:!1,source:u.source,appServerAvailable:!1,discovery:o,error:u.error};if(u.usable&&u.path)return{installed:!0,binaryPath:u.path,source:u.source,version:u.version,appServerAvailable:!0,discovery:o}}let i=o.find(d=>d.path&&d.versionOk===!0&&d.appServerOk===!1);if(i?.path)return{installed:!0,binaryPath:i.path,source:i.source,version:i.version,appServerAvailable:!1,discovery:o,error:i.error??"Codex was found, but Codex app-server is not available."};let s=o.find(d=>d.source==="windows_apps_alias"||d.path&&yc(d.path,r));if(s)return{installed:!1,binaryPath:s.path,source:"windows_apps_alias",appServerAvailable:!1,discovery:o,aliasDetected:!0,error:s.error??"Codex resolved to a WindowsApps execution alias. Select the real Codex binary path in Hunsu Bridge."};let a=o.find(d=>d.path)??o[0];return{installed:!1,binaryPath:a?.path,source:a?.source??"unknown",appServerAvailable:!1,discovery:o,error:a?.error??"Codex CLI was not found by Hunsu Bridge."}}async function ya(e){try{let t=e.env??oe(),r=e.platform??process.platform,n=hv(e.binaryPath,["--version"],t,r),{stdout:o,stderr:i}=await ha(n.command,n.args,{env:yv(t,r),timeout:e.timeoutMs??yi,windowsHide:!0,windowsVerbatimArguments:n.windowsVerbatimArguments,maxBuffer:64*1024});return`${o}
|
|
69
|
+
${i}`.trim().split(/\r?\n/).map(a=>a.trim()).find(Boolean)}catch{return}}async function gv(e){let t=e.env??oe(),r=e.command?{ok:!0,value:{command:e.command,args:e.args??["app-server","--stdio"]}}:gc({env:t,cliBinaryPath:e.binaryPath});if(!r.ok)return{available:!1,error:r.error};let n=new hi(r.value.command,e.timeoutMs??yi,{env:t,platform:e.platform,args:r.value.args});try{let o=await n.initialize();return{available:!0,initialized:Re(o)}}catch(o){return{available:!1,error:fn(o)}}finally{n.close()}}function gc(e){let t=e.env.HUNSU_CODEX_APP_SERVER_COMMAND?.trim();if(t&&/\s/.test(t))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=To(e.env);if(!r.ok)return{ok:!1,error:r.error.message};let n=e.cliBinaryPath?.trim();return{ok:!0,value:{command:r.value.command==="codex"&&n?n:r.value.command,args:r.value.args}}}function vc(e,t){if(t!=="win32")return[];let r=to(e,"LOCALAPPDATA","LocalAppData","localappdata"),n=to(e,"APPDATA","AppData","appdata");return Ra([r?Ut(r,"OpenAI","Codex","bin"):void 0,n?Ut(n,"npm"):void 0,r?Ut(r,"Programs","OpenAI Codex"):void 0])}function hc(e,t){return t!=="win32"?e.PATH??"":[e.PATH,e.Path,e.path,e.HUNSU_WINDOWS_USER_PATH,e.HUNSU_WINDOWS_MACHINE_PATH].filter(r=>typeof r=="string"&&r.trim().length>0).join(";")}async function bb(e){let{env:t,platform:r}=e,n=[],o=e.customBinaryPath?.trim();o&&n.push({candidate:o,source:"custom"});let i=t.HUNSU_CODEX_BINARY_PATH?.trim();i&&n.push({candidate:i,source:t.HUNSU_CODEX_BINARY_PATH_SOURCE==="user_config"?"custom":"env"});let s=t.HUNSU_CODEX_APP_SERVER_COMMAND?.trim();if(s&&n.push({candidate:s,source:"env",rejectWhitespace:!0}),n.push(...va("codex",t,r,Sa(t,r)).map(a=>({candidate:a,source:"process_path"}))),r==="win32"){n.push(...va("codex",t,r,await mv("user",t,r)).map(d=>({candidate:d,source:"registry_user_path"}))),n.push(...va("codex",t,r,await mv("machine",t,r)).map(d=>({candidate:d,source:"registry_machine_path"}))),n.push(...(await _b(t)).map(d=>({candidate:d,source:"where"}))),n.push(...(await Mb(t)).map(d=>({candidate:d,source:"powershell_get_command"}))),n.push(...Db(t,r).map(d=>({candidate:d,source:"known_install_dir"})));let a=Nb(t,r);a&&n.push({candidate:a,source:"windows_apps_alias"})}return Ob(n)}async function xb(e,t,r,n){let o=Cb(e.candidate,e.source,t,r,{rejectWhitespace:e.rejectWhitespace});if(o.kind!=="binary")return{source:o.source==="unknown"?e.source:o.source,path:o.kind==="missing"?o.binaryPath:void 0,usable:!1,error:o.error};let i=yc(o.binaryPath,r)?"windows_apps_alias":o.source;if(i==="windows_apps_alias")return{source:i,path:o.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 ya({binaryPath:o.binaryPath,timeoutMs:n,env:t,platform:r});if(!s)return{source:i,path:o.binaryPath,usable:!1,versionOk:!1,appServerOk:!1,error:"Codex candidate did not return a CLI version."};let a=await gv({binaryPath:o.binaryPath,timeoutMs:n,env:t,platform:r});return a.available?{source:i,path:o.binaryPath,usable:!0,versionOk:!0,appServerOk:!0,version:s}:{source:i,path:o.binaryPath,usable:!1,versionOk:!0,appServerOk:!1,version:s,error:a.error}}function Cb(e,t,r,n,o={}){let i=e.trim();if(!i)return{kind:"missing",installed:!1,source:t??"unknown",error:"Codex command is empty."};if(o.rejectWhitespace&&/\s/.test(i))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=ga(i)?i:Tb(i,r,n,Sa(r,n));if(!s)return{kind:"missing",installed:!1,source:t??"unknown",binaryPath:ga(i)?i:void 0,error:ga(i)?"Configured Codex path does not exist.":`Codex command was not found on PATH: ${i}`};if(yc(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 Pb(s).isFile()?(n!=="win32"&&Ib(s,wb.X_OK),{kind:"binary",installed:!0,binaryPath:s,source:t==="unknown"||t===void 0?"process_path":t}):{kind:"missing",installed:!1,binaryPath:s,source:t??"unknown",error:"Configured Codex path is not a file."}}catch(a){return{kind:"missing",installed:!1,binaryPath:s,source:t??"unknown",error:fn(a)}}}function Tb(e,t,r=process.platform,n=Sa(t,r)){return va(e,t,r,n)[0]}function va(e,t,r=process.platform,n=Sa(t,r)){if(ga(e))return vi(e)?[e]:[];let o=r==="win32"?["",...(t.PATHEXT??t.PathExt??".EXE;.CMD;.BAT;.COM").split(";").filter(Boolean)]:[""],i=r==="win32"?";":pv,s=[];for(let a of n.split(i).filter(Boolean))for(let d of o){let u=Ut(a,r==="win32"&&!e.toUpperCase().endsWith(d.toUpperCase())?`${e}${d}`:e);vi(u)&&s.push(u)}return Ra(s)}function Db(e,t){if(t!=="win32")return[];let r=to(e,"LOCALAPPDATA","LocalAppData","localappdata"),n=to(e,"APPDATA","AppData","appdata"),o=[];if(r){let i=Ut(r,"OpenAI","Codex","bin");if(vi(i))for(let s of Bb(i))o.push(Ut(i,s,"codex.exe"));o.push(Ut(r,"OpenAI","Codex","bin","codex.exe"),Ut(r,"Programs","OpenAI Codex","codex.exe"))}return n&&o.push(Ut(n,"npm","codex.cmd")),Ra(o.filter(vi))}async function mv(e,t,r){if(r!=="win32")return"";let n=e==="user"?t.HUNSU_WINDOWS_USER_PATH:t.HUNSU_WINDOWS_MACHINE_PATH;if(n?.trim())return fv(n,t);let o=e==="user"?"HKCU\\Environment":"HKLM\\SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment";try{let{stdout:i}=await ha("reg.exe",["query",o,"/v","Path"],{env:t,timeout:1500,windowsHide:!0,maxBuffer:65536});return fv(Hb(i),t)}catch{return""}}async function _b(e){try{let{stdout:t}=await ha("where.exe",["codex"],{env:e,timeout:1500,windowsHide:!0,maxBuffer:65536});return vv(t)}catch{return[]}}async function Mb(e){let t="Get-Command codex -All | ForEach-Object { $_.Source }";for(let r of["powershell.exe","pwsh"])try{let{stdout:n}=await ha(r,["-NoProfile","-Command",t],{env:e,timeout:2e3,windowsHide:!0,maxBuffer:65536}),o=vv(n);if(o.length>0)return o}catch{}return[]}function Hb(e){return e.split(/\r?\n/).map(r=>r.trim()).find(r=>/^Path\s+REG_/i.test(r))?.replace(/^Path\s+REG_\w+\s+/i,"").trim()??""}function vv(e){return Ra(e.split(/\r?\n/).map(t=>t.trim()).filter(t=>t.length>0&&!/^[-\s]+$/.test(t)&&!/^CommandType\b|^Name\b|^Source\b/i.test(t)))}function Nb(e,t){if(t!=="win32")return;let r=to(e,"LOCALAPPDATA","LocalAppData","localappdata"),n=r?Ut(r,"Microsoft","WindowsApps","codex.exe"):void 0;return n&&vi(n)?n:void 0}function Sa(e,t){return t!=="win32"?e.PATH??"":[e.PATH,e.Path,e.path].filter(r=>typeof r=="string"&&r.trim().length>0).join(";")}function Bb(e){try{return Eb(e,{withFileTypes:!0}).filter(t=>t.isDirectory()).map(t=>t.name)}catch{return[]}}function Ob(e){let t=new Set,r=[];for(let n of e){let o=`${n.source}:${n.candidate}`;t.has(o)||(t.add(o),r.push(n))}return r}function to(e,...t){return t.map(r=>e[r]).find(r=>typeof r=="string"&&r.trim().length>0)?.trim()}function Ra(e){return[...new Set(e.filter(t=>typeof t=="string"&&t.length>0))]}function yc(e,t){return t==="win32"&&/(?:^|[\\/])WindowsApps[\\/]/i.test(e)}function fv(e,t){return e.replace(/%([^%]+)%/g,(r,n)=>{let o=n.trim(),i=oe();return to(t,o,o.toUpperCase(),o.toLowerCase())??i[o]??r})}function hv(e,t,r,n){return pa(e,t,r,n)}function yv(e,t){let r=oe(),n={...r,...e},o=t==="win32"?";":pv;for(let i of["PATH","Path","path"]){let s=e[i],a=r[i];if(s===""&&a){n[i]=a;continue}s&&a&&!s.split(o).includes(a)&&(n[i]=`${s}${o}${a}`)}return n}var hi=class{command;args;timeoutMs;child;nextId=1;buffer="";pending=new Map;constructor(t,r,n={}){this.command=t,this.args=n.args??["app-server","--stdio"],this.timeoutMs=r;let o=n.env??oe(),i=n.platform??process.platform,s=hv(this.command,this.args,o,i);this.child=kb(s.command,s.args,{env:yv(o,i),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(t,r){let n=this.nextId;return this.nextId+=1,new Promise((o,i)=>{let s=setTimeout(()=>{this.pending.delete(n),i(new Error(`Codex app-server probe timed out: ${t}`))},this.timeoutMs);this.pending.set(n,{resolve:o,reject:i,timer:s});try{this.write({jsonrpc:"2.0",id:n,method:t,params:r})}catch(a){clearTimeout(s),this.pending.delete(n),i(a instanceof Error?a:new Error(String(a)))}})}async initialize(){let t=await this.request("initialize",{clientInfo:{name:"hunsu-bridge",title:"Hunsu Bridge",version:ye}});return this.notify("initialized",{}),t}notify(t,r){this.write({jsonrpc:"2.0",method:t,params:r})}close(){this.rejectAll(new Error("Codex app-server probe closed.")),this.child.kill()}write(t){this.child.stdin.write(`${JSON.stringify(t)}
|
|
70
|
+
`)}read(t){this.buffer+=t;let r=this.buffer.indexOf(`
|
|
71
|
+
`);for(;r>=0;){let n=this.buffer.slice(0,r).trim();if(this.buffer=this.buffer.slice(r+1),r=this.buffer.indexOf(`
|
|
72
|
+
`),!n)continue;let o;try{o=JSON.parse(n)}catch(s){this.rejectAll(new Error(`Invalid Codex app-server JSON-RPC line: ${fn(s)}`));continue}if(o.id===void 0||typeof o.id!="number")continue;let i=this.pending.get(o.id);i&&(clearTimeout(i.timer),this.pending.delete(o.id),o.error?i.reject(new Error(o.error.message??"Codex app-server request failed.")):i.resolve(o.result))}}rejectAll(t){for(let[r,n]of this.pending)clearTimeout(n.timer),n.reject(t),this.pending.delete(r)}};function Sc(e){return xo(e)}function fn(e){return Sc(e instanceof Error?e.message:String(e))}import{existsSync as $b}from"node:fs";import{homedir as Iv}from"node:os";import{join as Rc}from"node:path";var Lb=5e3,pn;async function wv(e){let t=e.env??oe(),r=gc({env:t,cliBinaryPath:e.binaryPath});if(!r.ok)return{appServer:{available:!1,error:r.error}};let n=new hi(r.value.command,e.timeoutMs??yi,{env:t,platform:e.platform,args:r.value.args});try{let o=await n.initialize(),i=await Ub(n),s=await Fb(n);return{appServer:{available:!0,initialized:Re(o)},account:i,rateLimits:s}}catch(o){return{appServer:{available:!1,error:fn(o)}}}finally{n.close()}}async function $r(e={}){let t=e.env??oe(),r=e.platform??process.platform,n=JSON.stringify({customBinaryPath:e.customBinaryPath??t.HUNSU_CODEX_BINARY_PATH,envCommand:t.HUNSU_CODEX_APP_SERVER_COMMAND,envArgs:t.HUNSU_CODEX_APP_SERVER_ARGS,codexHome:t.CODEX_HOME,path:hc(t,r),knownWindowsInstallDirs:vc(t,r),platform:r,lastRunUsage:e.lastRunUsage});if(!e.force&&pn&&pn.key===n&&Date.now()-pn.at<Lb)return pn.status;let o=await Or(e);if(!o.installed||!o.binaryPath){let C={runtime:"codex",cli:{installed:!1,source:o.source,discovery:o.discovery,installActionAvailable:!0,error:o.error},appServer:{available:!1},auth:{state:"unknown",access:"unknown"},usage:{rateLimitsAvailable:!1,lastRunUsage:e.lastRunUsage},ready:!1,recommendedAction:o.aliasDetected||o.error?.includes("WindowsApps")?"select_binary":"install_codex"};return pn={at:Date.now(),key:n,status:C},C}let i=o.version??await ya({binaryPath:o.binaryPath,timeoutMs:e.timeoutMs,env:t,platform:r}),s=await wv({binaryPath:o.binaryPath,timeoutMs:e.timeoutMs,env:t,platform:r}),a=s.appServer;if(!a.available){let C={runtime:"codex",cli:{installed:!0,binaryPath:o.binaryPath,source:o.source,version:i,discovery:o.discovery,installActionAvailable:!1,error:o.error},appServer:a,auth:{state:"unknown",access:"unknown"},usage:{rateLimitsAvailable:!1,lastRunUsage:e.lastRunUsage},ready:!1,recommendedAction:"recheck"};return pn={at:Date.now(),key:n,status:C},C}let d=s.account??{ok:!1,authState:"unknown",error:"Codex account probe did not return a result."},u=s.rateLimits??{ok:!1,error:"Codex rate limit probe did not return a result."},c=d.ok?Wb(d.account):{state:d.authState,access:"unknown",error:d.error},m=Ev({env:t,platform:r}),f=c.state==="not_authenticated"||c.state==="expired"||c.state==="invalid"?{...c,homeDiagnostic:m}:c,p=u.ok?Vb(u.rateLimits):void 0,g=u.ok?{rateLimitsAvailable:!0,rateLimitSummary:p?.summary,rateLimited:p?.rateLimited,lastRunUsage:e.lastRunUsage}:{rateLimitsAvailable:!1,lastRunUsage:e.lastRunUsage,error:u.error},v=f.state==="authenticated"&&g.rateLimited!==!0,A={runtime:"codex",cli:{installed:!0,binaryPath:o.binaryPath,source:o.source,version:i,discovery:o.discovery,installActionAvailable:!1,error:o.error},appServer:a,auth:f,usage:g,ready:v,recommendedAction:v?"none":f.state==="not_authenticated"||f.state==="expired"||f.state==="invalid"?"login_codex":"recheck"};return pn={at:Date.now(),key:n,status:A},A}async function Ub(e){try{let t=await e.request("account/read",{refreshToken:!1});return{ok:!0,account:Re(t)}}catch(t){let r=fn(t);return{ok:!1,authState:qb(r),error:r}}}async function Fb(e){try{let t=await e.request("account/rateLimits/read");return{ok:!0,rateLimits:Re(t)}}catch(t){return{ok:!1,error:fn(t)}}}function Ev(e={}){let t=e.env??oe(),r=e.platform??process.platform,n=jb(t,r,e.homeDir??Iv()),o=t.CODEX_HOME?.trim()||n,i=Sv(o),s=Sv(n),a=!!(o&&n&&!i&&s&&Rv(o,r)!==Rv(n,r));return{effectiveCodexHome:o,defaultCodexHome:n,authFileExistsAtEffectiveHome:i,authFileExistsAtDefaultHome:s,likelyHomeMismatch:a,remediation:a?{type:"set_codex_home",message:`Codex auth was not found for CODEX_HOME=${o}. Default Codex auth appears to exist at ${n}. Set Codex Home to this path or sign in again for the current Codex Home.`,suggestedCodexHome:n}:i?void 0:{type:"login_again",message:`Codex auth was not found for CODEX_HOME=${o}. Sign in again for this Codex Home.`}}}function jb(e,t,r=Iv()){if(t==="win32"){let n=Si(e,["USERPROFILE","UserProfile","userprofile"]),o=Si(e,["HOMEDRIVE","HomeDrive","homedrive"]),i=Si(e,["HOMEPATH","HomePath","homepath"]),s=n??(o&&i?`${o}${i}`:void 0)??Si(e,["HOME","Home","home"])??r;return Rc(s,".codex")}return Rc(Si(e,["HOME"])??r,".codex")}function Sv(e){return!!(e&&$b(Rc(e,"auth.json")))}function Rv(e,t){let r=e.replace(/\\/g,"/").replace(/\/+$/,"");return t==="win32"?r.toLowerCase():r}function Si(e,t){for(let r of t){let n=e[r];if(typeof n=="string"&&n.trim())return n.trim()}}function Wb(e){let t=ka(e)?e:{};if(t.requiresOpenaiAuth===!0)return{state:"not_authenticated",access:"unknown"};let r=Gb(t);return{state:"authenticated",method:r,access:r==="api_key"||r==="access_token"?"usage_based":r==="chatgpt"?"subscription":"unknown",accountSummary:{displayName:wt(t,["displayName","name","userName"]),email:wt(t,["email","userEmail"]),workspaceName:wt(t,["workspaceName","organizationName","orgName"]),planLabel:wt(t,["planLabel","plan","subscriptionPlan"])}}}function Gb(e){let t=ka(e.account)?e.account:{},r=`${wt(e,["authMethod","method","loginMethod","accountType","type"])??wt(t,["authMethod","method","loginMethod","accountType","type"])??""}`.toLowerCase();return r.includes("chatgpt")||r.includes("subscription")?"chatgpt":r.includes("api")?"api_key":r.includes("access")?"access_token":"unknown"}function qb(e){let t=e.toLowerCase();return t.includes("not authenticated")||t.includes("login")||t.includes("sign in")||t.includes("unauthorized")?"not_authenticated":t.includes("expired")?"expired":t.includes("invalid")?"invalid":"error"}function Vb(e){let t=Jb(e),r={label:wt(t,["label","status","summary"])??(kv(t)?"Rate limited":"Available"),resetAt:wt(t,["resetAt","reset_at"]),remainingLabel:wt(t,["remainingLabel","remaining"])};return{summary:r,rateLimited:kv(t)||Pv(`${r.label} ${r.remainingLabel??""}`)}}function Jb(e){return ka(e)?ka(e.rateLimits)?{...e,...e.rateLimits}:e:{}}function kv(e){if(e.rateLimited===!0||e.limited===!0)return!0;let t=wt(e,["rateLimitReachedType","rate_limit_reached_type"]);return t&&t.toLowerCase()!=="none"?!0:Pv(wt(e,["label","status","summary","remainingLabel","remaining"])??"")}function Pv(e){return/\brate.?limited\b|quota exceeded|temporarily unavailable|no remaining/i.test(e)}function wt(e,t){for(let r of t){let n=e[r];if(typeof n=="string"&&n.trim())return Sc(n.trim());if(typeof n=="number")return String(n)}}function ka(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}import{isAbsolute as tx,resolve as rx}from"node:path";var kc=[{name:"binaryPath",envName:"HUNSU_CODEX_BINARY_PATH",label:"Codex binary",description:"Path to the Codex CLI executable used by Hunsu.",kind:"file",required:!1,secret:!1,primary:!0,validation:{mustExist:!0,executable:!0}},{name:"codexHome",envName:"CODEX_HOME",label:"Codex home",description:"Directory where Codex stores auth and configuration. Usually ~/.codex.",kind:"directory",required:!1,secret:!1,primary:!0,placeholder:"~/.codex",validation:{directory:!0}},{name:"appServerCommand",envName:"HUNSU_CODEX_APP_SERVER_COMMAND",label:"App-server command",description:"Advanced override for the Codex command used by Hunsu.",kind:"text",required:!1,secret:!1,primary:!1,advanced:!0},{name:"appServerArgs",envName:"HUNSU_CODEX_APP_SERVER_ARGS",label:"App-server args",description:"Advanced app-server arguments.",kind:"text",required:!1,secret:!1,primary:!1,advanced:!0},{name:"authenticationPreference",label:"Authentication method",kind:"select",required:!1,secret:!1,primary:!1,default:"chatgpt",options:[{value:"chatgpt",label:"ChatGPT sign-in"},{value:"device_code",label:"Device code"},{value:"api_key",label:"API key"}]}],Ea={providerId:"codex",label:"Codex",description:"OpenAI Codex CLI through the local app-server boundary.",configKeys:kc,setupSteps:["Choose the Codex executable Hunsu should use.","Choose the Codex Home that contains the auth.json file for this daemon.","Sign in or recheck after saving."]},zb=new Set(kc.map(e=>e.name));function gn(e){return{...e.baseEnv,...e.settings.binaryPath?{HUNSU_CODEX_BINARY_PATH:e.settings.binaryPath,HUNSU_CODEX_BINARY_PATH_SOURCE:"user_config"}:{},...e.settings.codexHome?{CODEX_HOME:e.settings.codexHome}:{},...e.settings.appServerCommand?{HUNSU_CODEX_APP_SERVER_COMMAND:e.settings.appServerCommand}:{},...e.settings.appServerArgs?{HUNSU_CODEX_APP_SERVER_ARGS:e.settings.appServerArgs}:{}}}function Ri(e){return{HUNSU_CODEX_BINARY_PATH:e.HUNSU_CODEX_BINARY_PATH??null,CODEX_HOME:e.CODEX_HOME??null,HUNSU_CODEX_APP_SERVER_COMMAND:e.HUNSU_CODEX_APP_SERVER_COMMAND??null,HUNSU_CODEX_APP_SERVER_ARGS:e.HUNSU_CODEX_APP_SERVER_ARGS??null}}function Et(e){let t=wa(e,"binaryPath"),r=wa(e,"codexHome"),n=wa(e,"appServerCommand"),o=wa(e,"appServerArgs"),i=e?.installChannel==="stable"||e?.installChannel==="latest"||e?.installChannel==="manual"?e.installChannel:void 0,s=e?.authenticationPreference==="chatgpt"||e?.authenticationPreference==="api_key"||e?.authenticationPreference==="device_code"?e.authenticationPreference:void 0;return{...t?{binaryPath:t}:{},...r?{codexHome:r}:{},...n?{appServerCommand:n}:{},...o?{appServerArgs:o}:{},...i?{installChannel:i}:{},...s?{authenticationPreference:s}:{}}}function Pa(e){return kc.map(t=>{let r=e[t.name],n=typeof r=="string"?r:void 0;return{key:t.name,value:n??t.default,isSet:!!n,isSecret:t.secret,label:t.label}})}function vn(e,t){let r={...e};for(let n of t){let o=n.key.trim();if(!zb.has(o))throw new Error(`Unsupported Codex provider config key: ${o}`);let i=typeof n.value=="string"?n.value.trim():"";switch(o){case"binaryPath":Ia(r,"binaryPath",i);break;case"codexHome":Ia(r,"codexHome",i);break;case"appServerCommand":Ia(r,"appServerCommand",i);break;case"appServerArgs":Ia(r,"appServerArgs",i);break;case"authenticationPreference":if(i==="")delete r.authenticationPreference;else if(i==="chatgpt"||i==="api_key"||i==="device_code")r.authenticationPreference=i;else throw new Error(`Unsupported Codex authenticationPreference: ${i}`);break}}return r}function Ia(e,t,r){r?e[t]=r:delete e[t]}function wa(e,t){let r=e?.[t];return typeof r=="string"&&r.trim()?r.trim():void 0}import{spawn as Kb,spawnSync as Xb}from"node:child_process";var Yb="npm is required to install Codex. Install npm and retry, or use Select Existing Codex.";function Ic(e=process.platform){return e==="win32"?"npm.cmd":"npm"}function Av(e){let t=Ic(e.platform),r={...oe(),...e.env},n=xv(t,["--version"],r,e.platform),o=Xb(n.command,n.args,{encoding:"utf8",stdio:["ignore","pipe","pipe"],env:r,windowsHide:!0,windowsVerbatimArguments:n.windowsVerbatimArguments});if(o.status===0){let i=`${o.stdout??""}
|
|
73
|
+
${o.stderr??""}`.trim().split(/\r?\n/u).find(Boolean);return{available:!0,command:t,version:i}}return{available:!1,command:t,message:Yb}}function wc(e={available:!0,command:Ic()}){return{providerId:"codex",available:e.available,label:"Install Codex",command:e.command,args:["install","-g","@openai/codex@latest"],confirmationRequired:!0,instructions:e.available?["Hunsu Bridge can run the Codex npm installer after you confirm.","If Codex is already installed in a custom location, use Select Existing Codex."]:[e.message,"pnpm and yarn cannot run this npm-specific provider installer."]}}var bv=async e=>{let t=Ic(),r=["install","-g","@openai/codex@latest"];return e.dryRun?{ok:!0,command:t,args:r}:new Promise(n=>{let o={...oe(),...e.env},i=xv(t,r,o),s=Kb(i.command,i.args,{stdio:["ignore","pipe","pipe"],env:o,windowsHide:!0,windowsVerbatimArguments:i.windowsVerbatimArguments}),a="",d=u=>{a=`${a}${u.toString()}`.slice(-16*1024)};s.stdout?.on("data",d),s.stderr?.on("data",d),s.once("error",u=>{n({ok:!1,command:t,args:r,output:a.trim(),error:u.message})}),s.once("close",u=>{n({ok:u===0,command:t,args:r,exitCode:u??void 0,output:a.trim(),error:u===0?void 0:`Codex installer exited with status ${u??"unknown"}.`})})})};function xv(e,t,r,n=process.platform){return pa(e,t,r,n)}import{spawn as bc}from"node:child_process";var Lr=new WeakMap;async function ki(e,t){let r=await Or({env:t});return!r.installed||!r.binaryPath?{started:!1,args:e,message:r.error??"Codex CLI was not found."}:(bc(r.binaryPath,e,{detached:!0,stdio:"ignore",env:{...oe(),...t},windowsHide:!0}).unref(),{started:!0,command:r.binaryPath,args:e})}async function Aa(e,t){let r=["login"],n=await Or({env:t}),o=new Date().toISOString();if(!n.installed||!n.binaryPath){let i=lr(e,{kind:"chatgpt",startedAt:o,status:"failed",error:n.error??"Codex CLI was not found.",lastOutput:"Browser login failed to start."});return Ec(void 0,r,i,!1)}try{let i=bc(n.binaryPath,r,{detached:!0,stdio:"ignore",env:{...oe(),...t},windowsHide:!0});i.unref();let s=lr(e,{kind:"chatgpt",pid:i.pid,startedAt:o,status:"pending",lastOutput:"Browser login started. Complete sign-in, then click Recheck."});return Ec(n.binaryPath,r,s)}catch(i){let s=lr(e,{kind:"chatgpt",startedAt:o,status:"failed",error:i instanceof Error?i.message:String(i),lastOutput:"Browser login failed to start."});return Ec(n.binaryPath,r,s,!1)}}async function ba(e,t,r=3e3){let n=["login","--device-auth"],o=Lr.get(e);if(o&&!o.cleared)return Pc(o.child.spawnfile,n,e.codexLogin);let i=await Or({env:t});if(!i.installed||!i.binaryPath){let u=lr(e,{kind:"device",startedAt:new Date().toISOString(),status:"failed",error:i.error??"Codex CLI was not found."});return Pc(void 0,n,u,!1)}let s=bc(i.binaryPath,n,{detached:!0,stdio:["ignore","pipe","pipe"],env:{...oe(),...t},windowsHide:!0}),a={child:s,startedAt:new Date().toISOString(),output:"",cleared:!1};Lr.set(e,a),lr(e,{kind:"device",pid:s.pid,startedAt:a.startedAt,status:"starting"});let d=u=>{if(a.cleared)return;a.output=`${a.output}${u.toString()}`.slice(-64*1024);let c=Ac(a.output);lr(e,{kind:"device",pid:s.pid,startedAt:a.startedAt,status:c.verificationUri||c.userCode?"device_code":"pending",...c,lastOutput:a.output.trim().slice(-4096)})};return s.stdout?.on("data",d),s.stderr?.on("data",d),s.once("error",u=>{a.cleared||(lr(e,{kind:"device",pid:s.pid,startedAt:a.startedAt,status:"failed",error:u.message,lastOutput:a.output.trim().slice(-4096)}),Lr.delete(e))}),s.once("close",(u,c)=>{if(a.cleared)return;let m=Ac(a.output),f=u!==0;lr(e,{kind:"device",pid:s.pid,startedAt:a.startedAt,status:f?"failed":m.verificationUri||m.userCode?"device_code":"completed",...m,lastOutput:a.output.trim().slice(-4096),error:f?`Codex device login exited with status ${u??c??"unknown"}.`:void 0}),Lr.delete(e)}),await Qb(e,r),Pc(i.binaryPath,n,e.codexLogin)}function Cv(e){let t=Lr.get(e);t&&(t.cleared=!0,Lr.delete(e)),e.codexLogin=void 0}function Ac(e){let t=[...e.matchAll(/https?:\/\/[^\s)'"]+/g)].map(s=>s[0].replace(/[.,;:]+$/,"")),r=t.find(s=>/[?&](user_?code|code)=/i.test(s)),n=t.find(s=>s!==r)??r,o=r?ex(r):void 0,i=e.match(/(?:user\s+code|one[-\s]?code|one[-\s]?time\s+code|code)[:\s]+([A-Z0-9][A-Z0-9\-\s]{3,}[A-Z0-9])/i)?.[1]?.trim().replace(/\s+/g,"-");return{...n?{verificationUri:n}:{},...r?{verificationUriComplete:r}:{},...o??i?{userCode:o??i}:{}}}function Ec(e,t,r,n=!0){return{started:n,command:e,args:t,state:r.status,status:r.status,lastOutput:r.lastOutput,error:r.error,message:r.status==="failed"?r.error??"Codex login failed to start.":"Codex login started. Complete sign-in in your browser, then click Recheck."}}function Pc(e,t,r,n=!0){let o=r?.status??"pending";return{started:n,command:e,args:t,state:o,status:o,verificationUri:r?.verificationUri,verificationUriComplete:r?.verificationUriComplete,userCode:r?.userCode,lastOutput:r?.lastOutput,error:r?.error,message:o==="failed"?r?.error??"Codex device login failed.":r?.verificationUri||r?.userCode?"Codex device login started. Complete authorization in your browser.":o==="completed"?"Codex device login completed.":"Codex device login started."}}function lr(e,t){return e.codexLogin=t,t}async function Qb(e,t){let r=e.codexLogin?.startedAt,n=Date.now()+t;for(;Date.now()<n;){let i=e.codexLogin,s=i&&i.startedAt===r?i.status:void 0;if(s==="device_code"){await Zb(e,r);return}if(s==="failed"||s==="completed")return;await Tv(50)}let o=Lr.get(e);o&&!o.cleared&&e.codexLogin?.startedAt===o.startedAt&&e.codexLogin.status==="starting"&&lr(e,{...e.codexLogin,status:"pending"})}async function Zb(e,t,r=100){let n=Date.now()+r;for(;Date.now()<n;){let o=e.codexLogin;if((o&&o.startedAt===t?o.status:void 0)!=="device_code"||!Lr.has(e))return;await Tv(10)}}function ex(e){try{let t=new URL(e);return t.searchParams.get("user_code")??t.searchParams.get("user-code")??t.searchParams.get("code")??void 0}catch{return}}function Tv(e){return new Promise(t=>setTimeout(t,e))}function Ii(){return[xc("codex-default","Codex Default",["default","low","medium","high"],["default","fast"],"default"),xc("gpt-5.5-thinking","GPT-5.5 Thinking",["high","xhigh"],["default","fast"],"high"),xc("gpt-5.5","GPT-5.5",["default","low","medium","high"],["default","fast"],"medium")]}function xc(e,t,r,n,o){return{model:Cc(e,"providerInventory.model"),label:Cc(t,"providerInventory.model.label"),capabilities:{reasoningEfforts:r,serviceTiers:n,supportsReasoning:r.length>0,supportsFastTier:n.includes("fast")},defaultConfig:{providerId:"codex",model:Cc(e,"providerInventory.model.defaultConfig.model"),reasoningEffort:o,serviceTier:"default",...e==="codex-default"?{experimental:!0}:{}}}}function Cc(e,t){return V(k(e,t))}var nx={canExecute:!0,canEditFiles:!0,canRunShell:!0,supportsWorktree:!0,supportsEventStream:!0,supportsUsage:!0,supportsSubscriptionAuth:!0,supportsDeviceAuth:!0,supportsApiKeyAuth:!0,supportsRemoteRelay:!0,supportsAcp:!1},hn=class{providerId="codex";kind="codex";label="Codex";settings;internalLoginState={};options;constructor(t={}){this.options=t,this.settings=Et(t.settings)}metadata(){return Ea}async readConfig(){return Pa(this.settings)}async validateConfig(t){let r=vn(this.settings,t);return this.validateSettings(r)}async saveConfig(t){let r=vn(this.settings,t),n=await this.validateSettings(r);if(!n.valid)throw new Error(n.provider.safeMessage??n.provider.auth.error??n.provider.install?.error??"Codex provider configuration is invalid.");return this.settings=r,this.options.onConfigure?.(this.settings),n.provider}async deleteConfig(t){return this.settings=t&&t.length>0?vn(this.settings,t.map(r=>({key:r,value:"",isSet:!1,isSecret:!1}))):{},this.options.onConfigure?.(this.settings),this.status({force:!0})}effectiveEnv(t={}){return this.statusEnv(t)}async status(t={}){let r=this.statusEnv(t.env),n=await $r({force:t.force,env:r});return Tc(n,{effectiveEnv:Ri(r)})}async recheck(){return this.status({force:!0})}async installPlan(){return wc(await this.installerPrerequisite(this.statusEnv()))}async install(t={}){let r=this.statusEnv(t.env),n=await this.status({force:!0,env:r}),o=await this.installerPrerequisite(r),i=wc(o);if(n.installed)return{providerId:this.providerId,confirmed:t.confirmed===!0,started:!1,status:"already_installed",message:"Codex is already installed.",plan:i,providerStatus:n};if(!o.available)return{providerId:this.providerId,confirmed:t.confirmed===!0,started:!1,status:"prerequisite_missing",message:o.message,plan:i,providerStatus:n};if(t.confirmed!==!0)return{providerId:this.providerId,confirmed:!1,started:!1,status:"confirmation_required",message:"Confirm Codex installation before Hunsu Bridge runs the installer.",plan:i,providerStatus:n};let a=await(this.options.installer??bv)({env:r,dryRun:t.dryRun===!0||r.HUNSU_CODEX_INSTALL_DRY_RUN==="1"}),d=await this.status({force:!0,env:r});return{providerId:this.providerId,confirmed:!0,started:!0,status:a.ok?a.exitCode===void 0?"dry_run":"completed":"failed",message:a.ok?a.exitCode===void 0?"Codex install dry run completed. No installer was run.":"Codex installer completed. Provider status was rechecked.":a.error??"Codex installer failed.",plan:i,command:a.command,args:a.args,exitCode:a.exitCode,output:a.output,error:a.error,providerStatus:d}}async login(t){let r=t.method==="default"?dx(this.settings.authenticationPreference):t.method,n=this.statusEnv(),o=this.options.loginState??this.internalLoginState;if(r==="device")return{providerId:this.providerId,method:r,...await ba(o,n)};if(r==="api_key"){let i=await ki(["login","--api-key"],n);return{providerId:this.providerId,method:r,...i,message:i.started?"Codex API-key login started.":i.message??"Codex API-key login could not start."}}return{providerId:this.providerId,method:r,...await Aa(o,n)}}async configure(t){if(t.authMethod==="api_key")return this.configureApiKey(t);if(t.clearBinaryPath){let o={...this.settings};return delete o.binaryPath,this.settings=o,this.options.onConfigure?.(this.settings),this.status({force:!0,env:t.env})}let r=t.binaryPath?.trim()||t.selectBinaryPath?.trim();if(!r)return this.status({force:!0,env:t.env});let n=tx(r)?r:rx(r);return this.saveConfig([{key:"binaryPath",value:n,isSet:!0,isSecret:!1}])}async configureApiKey(t){let r=t.apiKey?.trim(),n=r?this.statusEnv({...t.env,OPENAI_API_KEY:r}):this.statusEnv(t.env);return this.status({force:!0,env:n})}statusEnv(t={}){return gn({baseEnv:this.baseEnv(t),settings:this.settings})}installerPrerequisite(t){return Promise.resolve((this.options.installerPrerequisite??Av)({env:t}))}baseEnv(t={}){return{...oe(),...this.options.env?.()??{},...t}}async validateSettings(t){let r=gn({baseEnv:this.baseEnv(),settings:t}),n=await $r({force:!0,env:r,customBinaryPath:t.binaryPath}),o=Tc(n,{effectiveEnv:Ri(r)}),i=n.cli.installed===!0&&!!n.cli.version&&n.appServer.available===!0;return{valid:i,provider:o,diagnostics:o.diagnostics??{effectiveEnv:Ri(r)},errors:i?[]:ox(t,n)}}};function ox(e,t){return!t.cli.installed||!t.cli.version?[{field:"binaryPath",message:e.binaryPath?"Select a Codex executable that Hunsu Bridge can run.":"Select an existing Codex executable or install Codex first."}]:t.appServer.available?[]:[{field:e.appServerCommand?"appServerCommand":e.appServerArgs?"appServerArgs":"binaryPath",message:"Codex app-server could not be started with this setting."}]}function Tc(e,t={}){let r=e.cli.installed,n=r&&e.appServer.available,o=e.auth.state==="authenticated"?!0:e.auth.state==="unknown"||e.auth.state==="error"?"unknown":!1;return{providerId:"codex",kind:"codex",label:"Codex",description:"OpenAI Codex CLI through the local app-server boundary.",connectionKind:"local_cli",installed:r,configured:n,authenticated:o,ready:e.ready,auth:{kind:ix(e),state:e.auth.state,access:e.auth.access,accountSummary:e.auth.accountSummary,error:e.auth.error,homeDiagnostic:e.auth.homeDiagnostic},install:{installed:r,binaryPath:e.cli.binaryPath,source:e.cli.source,version:e.cli.version,error:e.cli.error,discovery:e.cli.discovery},usage:{available:e.usage.rateLimitsAvailable,rateLimited:e.usage.rateLimited,summary:e.usage.rateLimitSummary,lastRunUsage:e.usage.lastRunUsage,error:e.usage.error},capabilities:nx,modelInventory:{state:"available",models:Ii()},recommendedAction:sx(e),diagnostics:{...t.effectiveEnv?{effectiveEnv:t.effectiveEnv}:{},...e.auth.homeDiagnostic?{codexHome:e.auth.homeDiagnostic}:{}},safeMessage:ax(e)}}async function wi(e,t,r={}){let n=await $r({env:e,force:r.force,lastRunUsage:r.lastRunUsage});return n.auth.state==="authenticated"&&t.codexLogin&&Cv(t),t.codexLogin?{...n,codexLogin:t.codexLogin}:n}function ix(e){return e.auth.method==="chatgpt"?"chatgpt_oauth":e.auth.method==="api_key"||e.auth.method==="access_token"?"api_key":e.auth.state==="not_authenticated"?"chatgpt_oauth":"unknown"}function sx(e){return e.recommendedAction==="install_codex"?"install":e.recommendedAction==="select_binary"?"select_binary":e.recommendedAction==="login_codex"?"login":e.recommendedAction==="recheck"?"recheck":"none"}function ax(e){return e.recommendedAction==="select_binary"?"Select the real Codex binary path. WindowsApps aliases cannot be used for Execute.":e.cli.installed?e.appServer.available?e.auth.homeDiagnostic?.likelyHomeMismatch&&e.auth.homeDiagnostic.remediation?.message?e.auth.homeDiagnostic.remediation.message:e.auth.state==="not_authenticated"?"Sign in to Codex to enable Execute.":e.auth.state==="expired"||e.auth.state==="invalid"?"Codex sign-in needs to be refreshed.":e.usage.rateLimited?"Codex is temporarily rate limited.":e.ready?"Codex is ready.":"Codex needs attention.":"Codex is installed, but the app-server is not available.":"Codex was not found by Hunsu Bridge."}function dx(e){return e==="device_code"?"device":e==="api_key"?"api_key":"chatgpt"}import{existsSync as Ix,mkdirSync as wx,readFileSync as Ex,renameSync as Px,writeFileSync as Ax}from"node:fs";import{dirname as bx}from"node:path";import{homedir as ux}from"node:os";import{posix as Dv,win32 as _v}from"node:path";function cx(e={}){let t=e.platform??process.platform,r=t==="win32"?_v:Dv,n=e.env??{},o=Ei(e.home)??Ei(n.HUNSU_HOME);if(o)return r.isAbsolute(o)?o:r.resolve(o);let i=Ei(e.userHome)??ux();if(t==="win32"){let s=Ei(e.localAppData)??Ei(n.LOCALAPPDATA)??r.join(i,"AppData","Local");return r.join(s,"Hunsu","Bridge")}return t==="darwin"?r.join(i,"Library","Application Support","Hunsu","Bridge"):r.join(i,".local","share","hunsu","bridge")}function ft(e={}){let t=cx(e),r=(e.platform??process.platform)==="win32"?_v:Dv,n=r.join(t,"logs"),o=r.join(t,"runtime");return{home:t,homeOwnershipFile:r.join(t,".hunsu-bridge-home.json"),configFile:r.join(t,"config.json"),workspacesFile:r.join(t,"workspaces.json"),credentialsFile:r.join(t,"credentials.json"),runtimeFile:r.join(t,"runtime.json"),logsDirectory:n,structuredLogFile:r.join(n,"bridge.jsonl"),runtimeDirectory:o,runtimeStagingDirectory:r.join(o,"staging"),runtimeVersionsDirectory:r.join(o,"versions"),runtimeInstallFile:r.join(o,"install.json"),setupTransactionFile:r.join(o,"setup-transaction.json"),setupLockFile:r.join(o,"setup.lock"),daemonLockFile:r.join(o,"daemon.lock")}}function Ei(e){let t=e?.trim();return t||void 0}import{mkdir as lx,open as mx,readFile as fx,rename as px,unlink as gx}from"node:fs/promises";import{basename as Pi,dirname as vx,join as hx}from"node:path";import{randomBytes as yx}from"node:crypto";var Ft=class extends Error{code="BRIDGE_STATE_INVALID";file;constructor(t,r,n){super(r,n),this.name="BridgeStateError",this.file=t}};async function Xe(e){let t;try{t=await fx(e,"utf8")}catch(r){if(X(r)&&r.code==="ENOENT")return;throw new Ft(e,`Unable to read Bridge state file: ${Pi(e)}.`,{cause:r})}try{return JSON.parse(t)}catch(r){throw new Ft(e,`Bridge state file is not valid JSON: ${Pi(e)}.`,{cause:r})}}async function Me(e,t,r={}){let n=vx(e),o=r.mode??384;await lx(n,{recursive:!0,mode:448});let i=hx(n,`.${Pi(e)}.${process.pid}.${yx(8).toString("hex")}.tmp`),s;try{s=await mx(i,"wx",o),await s.writeFile(`${JSON.stringify(t,null,2)}
|
|
74
|
+
`,"utf8"),await s.sync(),await s.chmod(o),await s.close(),s=void 0,await r.prepareTemporaryFile?.(i),await px(i,e),r.onCommitted?.()}catch(a){throw new Ft(e,`Unable to persist Bridge state file: ${Pi(e)}.`,{cause:a})}finally{await s?.close().catch(()=>{}),await gx(i).catch(a=>{if(!X(a)||a.code!=="ENOENT")throw a})}}function M(e,t){return new Ft(e,`Bridge state file is invalid (${Pi(e)}): ${t}`)}function X(e){return e instanceof Error&&"code"in e}var mr="hunsu.bridge.config.v1",Sx=Object.freeze({schema:mr,host:"127.0.0.1",port:19687,provider:Object.freeze({kind:"unconfigured"}),remote:Object.freeze({enabled:!1})});function yn(e){let t=Promise.resolve(),r=async()=>{let o=await Xe(e.configFile);return o===void 0?kx(Sx):Dc(e.configFile,o)},n=o=>{let i=t.then(o,o);return t=i.then(()=>{},()=>{}),i};return{async read(){return await t,r()},async write(o){await n(async()=>{await Me(e.configFile,Dc(e.configFile,o))})},async update(o){return n(async()=>{let i=Dc(e.configFile,o(await r()));return await Me(e.configFile,i),i})}}}function Dc(e,t){if(!_c(t)||t.schema!==mr)throw M(e,`expected schema ${mr}`);if(typeof t.host!="string"||t.host.trim()==="")throw M(e,"host must be a non-empty string");if(!Number.isInteger(t.port)||t.port<0||t.port>65535)throw M(e,"port must be an integer from 0 through 65535");if(!_c(t.remote)||typeof t.remote.enabled!="boolean")throw M(e,"remote.enabled must be a boolean");let r=Rx(e,t.provider);return{schema:mr,host:t.host.trim(),port:t.port,provider:r,remote:{enabled:t.remote.enabled}}}function Rx(e,t){if(!_c(t))throw M(e,"provider must be configured explicitly");if(t.kind==="unconfigured")return{kind:"unconfigured"};if(t.kind!=="codex")throw M(e,"provider.kind must be unconfigured or codex");let r=xa(e,"provider.binaryPath",t.binaryPath),n=xa(e,"provider.home",t.home),o=xa(e,"provider.appServerCommand",t.appServerCommand),i=xa(e,"provider.appServerArgs",t.appServerArgs),s=Mv(e,"provider.installChannel",t.installChannel,["stable","latest","manual"]),a=Mv(e,"provider.authenticationPreference",t.authenticationPreference,["chatgpt","api_key","device_code"]);return{kind:"codex",...r?{binaryPath:r}:{},...n?{home:n}:{},...o?{appServerCommand:o}:{},...i?{appServerArgs:i}:{},...s?{installChannel:s}:{},...a?{authenticationPreference:a}:{}}}function Mv(e,t,r,n){if(r!==void 0){if(typeof r!="string"||!n.includes(r))throw M(e,`${t} must be one of ${n.join(", ")} when present`);return r}}function xa(e,t,r){if(r!==void 0){if(typeof r!="string"||r.trim()==="")throw M(e,`${t} must be a non-empty string when present`);return r}}function kx(e){return{...e,provider:{...e.provider},remote:{...e.remote}}}function _c(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Ca(){return{currentProviderId:"codex",providers:{codex:{enabled:!0,settings:{}}}}}function Ai(e){let t=Ca();if(!Ur(e))return t;let r=Ur(e.providers)?Object.fromEntries(Object.entries(e.providers).map(([n,o])=>{let i=Ur(o)?o:{};return[n,{enabled:n==="codex"&&i.enabled!==!1,settings:Ur(i.settings)?i.settings:{}}]})):{};return r.codex={enabled:!0,settings:Ur(r.codex?.settings)?r.codex.settings:{}},{currentProviderId:e.currentProviderId==="codex"?"codex":t.currentProviderId,providers:r}}function Hv(e=oe()){return ft({env:e}).configFile}function xx(e=oe()){let t=Bv(Hv(e));return!t||t.provider.kind!=="codex"?Ca():Ai({currentProviderId:"codex",providers:{codex:{enabled:!0,settings:{...t.provider.binaryPath?{binaryPath:t.provider.binaryPath}:{},...t.provider.home?{codexHome:t.provider.home}:{},...t.provider.appServerCommand?{appServerCommand:t.provider.appServerCommand}:{},...t.provider.appServerArgs?{appServerArgs:t.provider.appServerArgs}:{},...t.provider.installChannel?{installChannel:t.provider.installChannel}:{},...t.provider.authenticationPreference?{authenticationPreference:t.provider.authenticationPreference}:{}}}}})}function Nv(e=oe()){let t=Hv(e);return{read:()=>xx(e),write(r){let n=Bv(t)??{schema:mr,host:"127.0.0.1",port:19687,provider:{kind:"unconfigured"},remote:{enabled:!1}},o=Et(r.providers.codex?.settings),i={...n,provider:{kind:"codex",...o.binaryPath?{binaryPath:o.binaryPath}:{},...o.codexHome?{home:o.codexHome}:{},...o.appServerCommand?{appServerCommand:o.appServerCommand}:{},...o.appServerArgs?{appServerArgs:o.appServerArgs}:{},...o.installChannel?{installChannel:o.installChannel}:{},...o.authenticationPreference?{authenticationPreference:o.authenticationPreference}:{}}};Cx(t,i)}}}function Bv(e){if(Ix(e))try{let t=JSON.parse(Ex(e,"utf8"));return!Ur(t)||t.schema!==mr||typeof t.host!="string"||typeof t.port!="number"||!Ur(t.remote)||typeof t.remote.enabled!="boolean"||!Ur(t.provider)||t.provider.kind!=="unconfigured"&&t.provider.kind!=="codex"?void 0:t}catch{return}}function Cx(e,t){wx(bx(e),{recursive:!0});let r=`${e}.tmp-${process.pid}-${Date.now()}`;Ax(r,`${JSON.stringify(t,null,2)}
|
|
75
|
+
`,{encoding:"utf8",mode:384}),Px(r,e)}function Ur(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}var Ta={canExecute:!1,canEditFiles:!1,canRunShell:!1,supportsWorktree:!1,supportsEventStream:!1,supportsUsage:!1,supportsSubscriptionAuth:!1,supportsDeviceAuth:!1,supportsApiKeyAuth:!1,supportsRemoteRelay:!1,supportsAcp:!1};var Tx={codex:"Codex",claude_code:"Claude Code",gemini_cli:"Gemini CLI",openhands:"OpenHands Agent Server",acp_agent:"ACP Agent",litellm_gateway:"LiteLLM Gateway",openrouter_gateway:"OpenRouter Gateway",custom:"Custom Provider"};function Mc(e={}){let t=Ai(e.providerState??e.providerStateStore?.read()??{...Ca(),currentProviderId:e.currentProviderId??"codex"}),r=t.providers[t.currentProviderId]?.enabled?t.currentProviderId:"codex",n=e.providers??[new hn({...e.codex,settings:t.providers.codex?.settings??{},onConfigure(o){t=Dx(t,o),e.providerStateStore?.write(t),e.codex?.onConfigure?.(o)}}),Sn("claude_code"),Sn("gemini_cli"),Sn("openhands"),Sn("acp_agent"),Sn("litellm_gateway"),Sn("openrouter_gateway")];return{list:()=>[...n],get:o=>n.find(i=>i.providerId===o),current:()=>n.find(o=>o.providerId===r)??n[0],async setCurrent(o){let i=n.find(s=>s.providerId===o);if(!i)throw new Error(`Unknown runtime provider: ${o}`);if(i.providerId!=="codex"||t.providers[i.providerId]?.enabled!==!0)throw new Error(`${i.label} is not an enabled runtime provider yet.`);r=i.providerId,t=Ai({...t,currentProviderId:r}),e.providerStateStore?.write(t)}}}function Dx(e,t){let r=_x(t);return Ai({...e,providers:{...e.providers,codex:{enabled:!0,settings:r}}})}function _x(e){let t=Et(e),r={};for(let[n,o]of Object.entries(t))o!==void 0&&(r[n]=o);return r}function Sn(e){let t=Tx[e];return{providerId:e,kind:e,label:t,hiddenByDefault:!0,metadata(){return{providerId:e,label:t,description:"Future runtime provider.",configKeys:[]}},async readConfig(){return[]},async saveConfig(){throw new Error(`${t} does not support configuration yet.`)},async status(){return{providerId:e,kind:e,label:t,description:"Future runtime provider.",connectionKind:e.includes("gateway")?"gateway":e==="openhands"||e==="acp_agent"?"remote_agent_server":"local_cli",installed:!1,configured:!1,authenticated:"unknown",ready:!1,auth:{kind:"unknown",state:"unknown",access:"unknown"},install:{installed:!1},usage:{available:!1},capabilities:Ta,modelInventory:{state:"unavailable",reason:"not_supported",message:`${t} does not publish a model inventory yet.`},recommendedAction:"configure",safeMessage:"Coming later"}},async recheck(){return this.status()}}}async function Lv(e,t,r,n,o){if(e.method==="GET"&&r==="/api/providers"){let i=n.searchParams.get("advanced")==="1"||n.searchParams.get("advanced")==="true",s=o.providerRegistry.list().filter(a=>i||!a.hiddenByDefault);return o.sendJson(t,200,{currentProviderId:o.providerRegistry.current().providerId,providers:await Promise.all(s.map(a=>a.status({env:o.env})))}),!0}if(e.method==="GET"&&r==="/api/codex/status"&&o.legacyCodexStatus){let i=await o.legacyCodexStatus();return o.sendJson(t,200,o.sanitizeLegacyCodexStatus?o.sanitizeLegacyCodexStatus(i):i),!0}if(e.method==="GET"&&r==="/api/runtimes/codex/status"){let i=ro(o);return o.sendJson(t,200,await wi(i,o.codexLoginState??{},{lastRunUsage:o.latestCodexRunUsage?.()})),!0}if(e.method==="POST"&&r==="/api/runtimes/codex/recheck"){let i=ro(o);return o.sendJson(t,202,await wi(i,o.codexLoginState??{},{force:!0,lastRunUsage:o.latestCodexRunUsage?.()})),!0}if(e.method==="POST"&&r==="/api/runtimes/codex/install"){let i=await $v(e,o.readJson),s=o.providerRegistry.get("codex")??o.providerRegistry.current();return o.sendJson(t,202,s.install?await s.install({confirmed:i.confirmed,dryRun:i.dryRun,env:o.env}):await s.installPlan?.()),!0}if(e.method==="POST"&&r==="/api/runtimes/codex/login/chatgpt"){let i=o.providerRegistry.get("codex")??o.providerRegistry.current();return o.sendJson(t,202,i.login?await i.login({method:"chatgpt"}):await Aa(o.codexLoginState??{},ro(o))),!0}if(e.method==="POST"&&r==="/api/runtimes/codex/login/device"){let i=o.providerRegistry.get("codex")??o.providerRegistry.current();return o.sendJson(t,202,i.login?await i.login({method:"device"}):await ba(o.codexLoginState??{},ro(o))),!0}if(e.method==="POST"&&r==="/api/runtimes/codex/login/api-key"){let i=o.providerRegistry.get("codex")??o.providerRegistry.current();return o.sendJson(t,202,i.login?await i.login({method:"api_key"}):await ki(["login","--api-key"],ro(o))),!0}if(e.method==="POST"&&r==="/api/runtimes/codex/logout")return o.sendJson(t,202,await ki(["logout"],ro(o))),!0;if(e.method==="GET"&&r==="/api/providers/current")return o.sendJson(t,200,await o.providerRegistry.current().status({env:o.env})),!0;if(e.method==="GET"&&r==="/api/providers/current/metadata")return o.sendJson(t,200,o.providerRegistry.current().metadata()),!0;if(e.method==="GET"&&r==="/api/providers/current/config")return o.sendJson(t,200,await Hc(o.providerRegistry.current(),o)),!0;if(e.method==="POST"&&r==="/api/providers/current/validate"){let i=await Ov(e,o.readJson),s=o.providerRegistry.current();return s.validateConfig?(o.sendJson(t,200,await s.validateConfig(i.fields)),!0):(o.sendJson(t,501,{error:"Current provider does not support configuration validation yet."}),!0)}if(e.method==="POST"&&r==="/api/providers/current/config"){let i=await Ov(e,o.readJson),s=o.providerRegistry.current();return await s.saveConfig(i.fields),o.sendJson(t,202,await Hc(s,o)),!0}if(e.method==="DELETE"&&(r==="/api/providers/current/config"||r.startsWith("/api/providers/current/config/"))){let i=o.providerRegistry.current();return i.deleteConfig?(await i.deleteConfig(Mx(r,n)),o.sendJson(t,202,await Hc(i,o)),!0):(o.sendJson(t,501,{error:"Current provider does not support configuration reset yet."}),!0)}if(e.method==="POST"&&r==="/api/providers/current/recheck")return o.sendJson(t,202,await o.providerRegistry.current().status({env:o.env,force:!0})),!0;if(e.method==="POST"&&r==="/api/providers/current/install"){let i=o.providerRegistry.current();if(!i.install)return o.sendJson(t,501,{error:"Current provider does not support installation yet."}),!0;let s=await $v(e,o.readJson);return o.sendJson(t,202,await i.install({confirmed:s.confirmed,dryRun:s.dryRun,env:o.env})),!0}if(e.method==="POST"&&r==="/api/providers/current/login"){let i=await o.readJson(e),s=o.providerRegistry.current();return s.login?(o.sendJson(t,202,await s.login({method:i.method??"default"})),!0):(o.sendJson(t,501,{error:"Current provider does not support login yet."}),!0)}if(e.method==="POST"&&r==="/api/providers/current/authenticate"){let i=await o.readJson(e),s=o.providerRegistry.current();return s.login?(o.sendJson(t,202,await s.login({method:i.method??"default"})),!0):(o.sendJson(t,501,{error:"Current provider does not support authentication yet."}),!0)}if(e.method==="POST"&&r==="/api/providers/current/configure"){let i=await o.readJson(e),s=o.providerRegistry.current();return s.configure?(o.sendJson(t,202,await s.configure({...i,env:o.env})),!0):(o.sendJson(t,501,{error:"Current provider does not support configuration yet."}),!0)}return!1}function Mx(e,t){let r="/api/providers/current/config/";if(e.startsWith(r)){let o=decodeURIComponent(e.slice(r.length)).trim();return o?[o]:void 0}let n=t.searchParams.getAll("key").map(o=>o.trim()).filter(Boolean);return n.length>0?n:void 0}function ro(e){let r=e.providerRegistry.get("codex");return r?.effectiveEnv?r.effectiveEnv(e.env):e.env}async function Hc(e,t){let r=await e.status({env:t.env,force:!0});return{providerId:e.providerId,metadata:e.metadata(),fields:await e.readConfig(),status:r,diagnostics:r.diagnostics}}async function Ov(e,t){let r=await t(e);return{fields:Array.isArray(r)?r:r.fields??[]}}async function $v(e,t){try{return await t(e)}catch{return{}}}import{Buffer as Lx}from"node:buffer";import{createHash as Ux}from"node:crypto";import{existsSync as Fx,mkdirSync as jx,readFileSync as Wx,writeFileSync as Gx}from"node:fs";import{homedir as Wv,hostname as qx}from"node:os";import{dirname as Vx}from"node:path";function jt(e,t){let r=bi(e.lifecycle),n=t.redactPath?void 0:e.repositoryPath;return{workspaceId:e.roadmapId,roadmapId:e.roadmapId,displayName:e.displayName,path:n,pathRedacted:t.redactPath||void 0,lifecycle:r,health:Hx(e),backendId:t.backendId??"local",connectionMode:t.connectionMode??"local",provider:{providerId:t.provider.providerId,label:t.provider.label,readyForExecute:t.provider.ready},actions:Nx(r,e.primaryAction)}}function Fr(e,t){return e.filter(r=>t.activeOnly!==!0||bi(r.lifecycle)==="active").filter(r=>t.remoteOnly!==!0||r.remoteAccess?.enabled===!0&&bi(r.lifecycle)==="active").map(r=>jt(r,t))}function bi(e){return e==="inactive"||e==="missing"||e==="needs_upgrade"||e==="error"?e:"active"}function Hx(e){return e.lifecycle==="missing"||e.health==="missing"?"missing":e.lifecycle==="needs_upgrade"||e.health==="needs-upgrade"||e.health==="missing-runtime"?"needs_upgrade":e.lifecycle==="error"?"error":e.health==="ok"||e.health==="git-dirty"?"ok":"unknown"}function Nx(e,t){let r=[];return e==="active"?r.push("open_studio","deactivate"):e==="inactive"?r.push("activate","remove"):r.push(t==="repair"?"repair":"remove"),r}import{existsSync as Bx}from"node:fs";var Ox=["local-pairing","project-finder","roadmap-registry","artifact-actions","connection-status","headless-daemon","remote-ready"],no={minBridgeVersion:ye,requiredProtocolVersion:mn,requiredFeatures:["local-pairing","connection-status"]};function st(){return{bridgeVersion:ye,protocolVersion:mn,supportedFeatures:[...Ox]}}function Nc(e,t,r="0.1.0"){if(Uv(e.bridgeVersion,t.minBridgeVersion)<0)return{compatible:!1,reason:"bridge_update_needed",message:`Bridge ${e.bridgeVersion} is older than required ${t.minBridgeVersion}.`};if(e.protocolVersion!==t.requiredProtocolVersion)return{compatible:!1,reason:"bridge_update_needed",message:`Bridge protocol ${e.protocolVersion} does not match required ${t.requiredProtocolVersion}.`};let n=t.requiredFeatures.find(o=>!e.supportedFeatures.includes(o));return n?{compatible:!1,reason:"feature_unavailable",message:`Bridge feature is unavailable: ${n}.`}:e.minSupportedStudioVersion&&Uv(r,e.minSupportedStudioVersion)<0?{compatible:!1,reason:"studio_update_needed",message:`Studio ${r} is older than Bridge requires ${e.minSupportedStudioVersion}.`}:{compatible:!0}}function Bc(e){let t=[];$x(e.runtimeConfig.bridgeApi.host)&&t.push("public_bind"),e.repositoryPath&&!Bx(e.repositoryPath)&&t.push("project_missing");let r=e.bridgeVersion??st(),n=Nc(r,e.requirement??no,e.studioVersion);n.compatible||t.push("version_mismatch");let o=e.error??(n.compatible?void 0:n.message);return{mode:"local",transport:"direct",health:o===void 0?"connected":"error",auth:e.auth??"paired",projectAccess:e.projectAccess??(e.repositoryPath?"granted":"not_applicable"),bridge:{id:`local:${e.runtimeConfig.bridgeApi.host}:${e.runtimeConfig.bridgeApi.port}`,name:"Local Bridge",version:r.bridgeVersion,protocolVersion:r.protocolVersion,startedAt:e.startedAt,lastSeenAt:new Date().toISOString()},endpoint:{apiUrl:e.bridgeApiUrl},project:e.repositoryPath?{roadmapId:e.roadmapId,displayName:e.roadmapDisplayName,repositoryPath:e.repositoryPath}:void 0,warnings:t,error:o,version:r,compatibility:n}}function Oc(e){return{mode:"none",transport:"unreachable",health:"disconnected",auth:"unknown",projectAccess:"not_applicable",warnings:[],error:e,version:st(),compatibility:{compatible:!0}}}function Da(e){let t=e.device.status==="online"&&e.error===void 0,r={...st(),bridgeVersion:e.device.bridgeVersion??"unknown",protocolVersion:e.device.protocolVersion??"unknown"},n=Nc(r,e.requirement??no,e.studioVersion),o=[];return t||o.push("relay_unavailable"),n.compatible||o.push("version_mismatch"),{mode:"remote",transport:"relay",health:t&&n.compatible?"connected":e.error||!n.compatible?"error":"disconnected",auth:e.account?.sameUser===!1?"account_mismatch":"paired",projectAccess:e.projectAccess??"needs_grant",bridge:{id:e.device.deviceId,name:e.device.deviceName,version:e.device.bridgeVersion,protocolVersion:e.device.protocolVersion,lastSeenAt:e.device.lastSeenAt},endpoint:{relayLabel:"Hunsu Relay"},account:e.account,project:e.projectPath?{roadmapId:e.roadmapId,displayName:e.roadmapDisplayName,repositoryPath:e.projectPath}:void 0,warnings:o,error:e.error??(n.compatible?void 0:n.message),version:r,compatibility:n}}function Uv(e,t){let r=e.split(/[.-]/).map(i=>Number.parseInt(i,10)),n=t.split(/[.-]/).map(i=>Number.parseInt(i,10)),o=Math.max(r.length,n.length);for(let i=0;i<o;i+=1){let s=Number.isFinite(r[i])?r[i]:0,a=Number.isFinite(n[i])?n[i]:0;if(s!==a)return s>a?1:-1}return 0}function $x(e){return e==="0.0.0.0"||e==="::"||e==="[::]"}var Jx=["remoteRelay.access","execute.start","artifactAction.run","env.read","hostAlias.expose"];function $c(e={}){let t=nh(e).devices.filter(r=>r.remoteAccess!=="disabled");return e.userId?t.filter(r=>r.userId===e.userId):t}async function xi(e,t,r={}){let n=fr(e,t);if(!n)return $c(r);let o=await fetch(new URL("/v1/devices",n.relayApiUrl),{headers:{authorization:`Bearer ${n.accessToken}`}}),i=await o.json().catch(()=>{});if(!o.ok)throw new Error(i?.error??`Relay device list failed with HTTP ${o.status}.`);let s=Array.isArray(i?.devices)?i.devices.filter(ih).filter(a=>a.remoteAccess!=="disabled"):[];return r.userId?s.filter(a=>a.userId===r.userId):s}async function Gv(e,t,r={}){try{return await xi(e,t,r)}catch{return[]}}function qv(e,t={}){let r=e.deviceId?.trim(),n=th(e);if(!r){let a={compatible:!1,reason:"bridge_update_needed",message:"Choose a Remote Bridge device before connecting."};return{connection:{...Oc("Choose a Remote Bridge device before connecting."),compatibility:a},compatibility:a}}let o=$c(t).find(a=>a.deviceId===r);if(!o){let a={compatible:!1,reason:"bridge_update_needed",message:"Remote Bridge device is not registered."};return{compatibility:a,connection:rh(a)}}let i=e.webUserId?.trim()?{webUserId:e.webUserId.trim(),bridgeUserId:o.userId,sameUser:e.webUserId.trim()===o.userId}:{bridgeUserId:o.userId,sameUser:void 0},s=Da({device:o,account:i,projectAccess:e.projectPath?.trim()?"needs_grant":"not_applicable",projectPath:e.projectPath?.trim()||void 0,requirement:n});return{connection:s,device:o,compatibility:s.compatibility??{compatible:!0}}}async function Ci(e,t,r,n={}){if(!fr(t,r))return qv(e,n);let s=(await xi(t,r,n)).find(d=>d.deviceId===e.deviceId?.trim());if(!s){let d={compatible:!1,reason:"bridge_update_needed",message:"Remote Bridge device is not registered."};return{compatibility:d,connection:rh(d)}}let a=Da({device:s,account:{webUserId:e.webUserId,bridgeUserId:s.userId,sameUser:e.webUserId?e.webUserId===s.userId:void 0},projectAccess:await Yx(e,t,r),projectPath:e.projectPath?.trim()||void 0,requirement:th(e)});return{connection:a,device:s,compatibility:a.compatibility??{compatible:!0}}}async function Lc(e,t,r){let n=fr(t,r);if(!n)return{ok:!1,status:503,error:"Remote Relay is not configured for this Bridge API."};let o=await fetch(new URL("/v1/commands",n.relayApiUrl),{method:"POST",headers:{authorization:`Bearer ${n.accessToken}`,"content-type":"application/json"},body:JSON.stringify(e)}),i=await o.json().catch(()=>{});return i?i.status===void 0?{...i,status:o.status}:i:{ok:!1,status:o.status,error:`Relay command returned HTTP ${o.status}.`}}async function Uc(e,t,r,n,o){let i=fr(t,n);if(!i){o.sendJson(r,503,{ok:!1,error:"Remote Relay is not configured for this Bridge API."});return}let s=new AbortController;t.on("close",()=>s.abort());let a=await fetch(new URL("/v1/commands/events",i.relayApiUrl),{method:"POST",headers:{authorization:`Bearer ${i.accessToken}`,"content-type":"application/json"},body:JSON.stringify(e),signal:s.signal}).catch(u=>{if(!(u instanceof Error&&u.name==="AbortError"))throw u});if(!a)return;if(!a.ok){let u=await a.json().catch(()=>{});o.sendJson(r,a.status,{ok:!1,error:u?.error??u?.message??`Relay event stream returned HTTP ${a.status}.`});return}if(!a.body){o.sendJson(r,502,{ok:!1,error:"Relay did not return an event stream."});return}r.writeHead(200,{...o.responseHeaders?.(r)??{},"content-type":"text/event-stream; charset=utf-8","cache-control":"no-cache, no-transform",connection:"keep-alive"}),r.flushHeaders?.();let d=a.body.getReader();try{for(;!r.destroyed;){let{value:u,done:c}=await d.read();if(c)break;r.write(Lx.from(u))}}finally{d.releaseLock(),r.destroyed||r.end()}}function Vv(e){let t=e.searchParams.get("command");if(t)try{let r=JSON.parse(t);return Zx(r)?r:void 0}catch{return}}function Jv(e,t,r,n){let o=e.processEnv.HUNSU_BRIDGE_DEVICE_NAME?.trim()||qx()||"This computer";return{deviceId:e.processEnv.HUNSU_BRIDGE_DEVICE_ID?.trim()||`local_${Ux("sha256").update(`${o}:${Wv()}`).digest("hex").slice(0,16)}`,deviceName:o,userId:t.userId??t.email??"signed-in-user",registeredAt:new Date().toISOString(),lastSeenAt:r==="online"?new Date().toISOString():void 0,status:r,remoteAccess:r==="online"?"enabled":"disabled",provider:n,bridgeVersion:st().bridgeVersion,protocolVersion:st().protocolVersion}}function zv(e,t){for(let r of e.roadmapIds)t.setWorkspaceRemoteAccess({roadmapId:r},{enabled:!0,scopes:e.scopes})}function Kv(e,t){for(let r of e)r.remoteAccess?.enabled!==!0&&!(r.remoteAccess?.scopes??[]).includes("remoteRelay.access")||t.setWorkspaceRemoteAccess({roadmapId:r.roadmapId},{enabled:!1,scopes:(r.remoteAccess?.scopes??[]).filter(iC).filter(n=>n!=="remoteRelay.access")})}function Xv(e={}){return{read:()=>nh(e).devices,write:t=>Qx({schema:"hunsu.relay-registry.v1",devices:t},e)}}function fr(e,t){let n=Pr(yf(t.processEnv)).relayApiUrl,o=sh(e,"x-hunsu-relay-token")??eC(e)??tC(e)??t.processEnv.HUNSU_RELAY_WEB_TOKEN?.trim();return n&&o?{relayApiUrl:n,accessToken:o}:void 0}function Fc(e){let t=e.device.deviceName??e.device.name??"Remote Bridge",r=e.device.status==="online";return{backendId:`remote:${e.device.deviceId}`,mode:"remote",label:t,device:{deviceId:e.device.deviceId,name:t,registered:!0,online:r,lastSeenAt:e.device.lastSeenAt},provider:e.provider??Ti(e.device),connection:e.signedIn?r?{state:"connected"}:{state:"relay_offline"}:{state:"login_required"},workspaces:e.workspaces}}function Yv(e,t={}){let r=t.provider??Ti(e),n=`remote:${e.deviceId}`,o=t.projectGrants??e.projectGrants??[];return(Array.isArray(e.workspaces)?e.workspaces:[]).filter(nC).map(s=>{let a=typeof s.path=="string"&&Kx(s.path,o)?s.path:void 0;return{...s,backendId:n,connectionMode:"remote",path:a,pathRedacted:s.path?a===void 0?!0:void 0:s.pathRedacted,provider:{providerId:r.providerId,label:r.label,readyForExecute:r.ready}}})}function Ti(e){if(jv(e.provider))return e.provider;if(jv(e.providerStatus))return e.providerStatus;let t=e.deviceName??e.name??"Remote Bridge";return{providerId:`remote:${e.deviceId}:provider`,kind:"custom",label:"Remote provider",description:`Provider status for ${t} has not been reported by Relay yet.`,connectionKind:"remote_agent_server",installed:!1,configured:!1,authenticated:"unknown",ready:!1,auth:{kind:"unknown",state:"unknown",access:"unknown"},install:{installed:!1},usage:{available:!1},capabilities:{...Ta,supportsRemoteRelay:!0},modelInventory:{state:"unavailable",reason:"not_reported",message:"Remote provider model inventory has not been reported by this Bridge."},recommendedAction:"recheck",safeMessage:"Remote provider status is not available until that Bridge reports it."}}function Qv(e,t={}){let r=oC(t.scopes??Jx),n=t.grantedAt??new Date().toISOString(),o=e.filter(s=>bi(s.lifecycle)==="active"),i=t.provider??Ti({deviceId:"local",deviceName:"This computer",provider:void 0});return{roadmapIds:o.map(s=>s.roadmapId),workspaces:o.map(s=>jt(s,{provider:i,backendId:"local",connectionMode:"local",redactPath:!0})),projectGrants:o.map(s=>({path:s.repositoryPath,grantedAt:n,scopes:r,active:!0})),scopes:r,lastSnapshotAt:n}}async function Zv(e){let t=Qv(e.roadmaps,{provider:e.device.provider}),r={...e.device,workspaces:t.workspaces,projectGrants:t.projectGrants,lastSnapshotAt:t.lastSnapshotAt};if(e.relay){let s=await zx(e.relay,r,t);return e.publishWorkspaceAccess(t),s}if(!e.store)throw new Error("Remote Bridge device store is required when Relay is not available.");let n=e.store.read(),o=n.find(s=>s.deviceId===e.device.deviceId),i={...r,registeredAt:o?.registeredAt??e.device.registeredAt,lastSeenAt:new Date().toISOString(),status:"online",remoteAccess:"enabled",projectGrants:t.projectGrants,workspaces:t.workspaces,lastSnapshotAt:t.lastSnapshotAt};return e.store.write([i,...n.filter(s=>s.deviceId!==i.deviceId)]),e.publishWorkspaceAccess(t),i}async function eh(e){let t={...e.device,status:"offline",remoteAccess:"disabled",projectGrants:[],workspaces:[],lastSnapshotAt:new Date().toISOString()};if(e.relay)return await Xx(e.relay,t),e.deactivateWorkspaceAccess(),t;if(!e.store)return e.deactivateWorkspaceAccess(),t;let r=e.store.read(),n,o=r.map(i=>i.deviceId!==t.deviceId?i:(n={...i,status:"offline",remoteAccess:"disabled",projectGrants:[],workspaces:[],lastSnapshotAt:new Date().toISOString()},n));return n||(n=t,o.unshift(n)),e.store.write(o),e.deactivateWorkspaceAccess(),n}async function zx(e,t,r){let n=await fetch(new URL("/v1/devices",e.relayApiUrl),{method:"POST",headers:{authorization:`Bearer ${e.accessToken}`,"content-type":"application/json"},body:JSON.stringify({device:t,projectGrants:r.projectGrants,workspaces:r.workspaces,lastSnapshotAt:r.lastSnapshotAt})}),o=await n.json().catch(()=>{});if(!n.ok||!o?.device)throw new Error(o?.error??o?.message??`Remote Bridge registration failed with HTTP ${n.status}.`);return o.device}function Kx(e,t){let r=Fv(e);return t.some(n=>n.active!==!1&&Fv(n.path)===r&&n.scopes.includes("remoteRelay.access"))}function Fv(e){return e.replace(/\\/g,"/").replace(/\/+$/,"")}async function Xx(e,t){let r=await fetch(new URL("/v1/devices",e.relayApiUrl),{method:"POST",headers:{authorization:`Bearer ${e.accessToken}`,"content-type":"application/json"},body:JSON.stringify({device:t,projectGrants:[]})});if(!r.ok){let n=await r.json().catch(()=>{});throw new Error(n?.error??n?.message??`Remote Bridge disable failed with HTTP ${r.status}.`)}}async function Yx(e,t,r){let n=e.projectPath?.trim();if(!n)return"not_applicable";let o=fr(t,r);if(!o||!e.deviceId?.trim())return"needs_grant";let i=await fetch(new URL("/v1/project-grants/status",o.relayApiUrl),{method:"POST",headers:{authorization:`Bearer ${o.accessToken}`,"content-type":"application/json"},body:JSON.stringify({deviceId:e.deviceId.trim(),projectPath:n,requestedScopes:["remoteRelay.access"]})}),s=await i.json().catch(()=>{});return!i.ok||s?.projectAccess!=="granted"&&s?.projectAccess!=="needs_grant"&&s?.projectAccess!=="denied"?"denied":s.projectAccess}function th(e){return{minBridgeVersion:e.minBridgeVersion?.trim()||no.minBridgeVersion,requiredProtocolVersion:e.requiredProtocolVersion?.trim()||no.requiredProtocolVersion,requiredFeatures:e.requiredFeatures?.length?e.requiredFeatures:no.requiredFeatures}}function rh(e){return{mode:"remote",transport:"relay",health:"disconnected",auth:"unknown",projectAccess:"not_applicable",warnings:["relay_unavailable"],error:"Remote Bridge device is not registered.",version:st(),compatibility:e}}function nh(e={}){let t=oh(e);if(!Fx(t))return{schema:"hunsu.relay-registry.v1",devices:[]};try{let r=JSON.parse(Wx(t,"utf8"));return{schema:"hunsu.relay-registry.v1",devices:Array.isArray(r.devices)?r.devices.filter(ih):[]}}catch{return{schema:"hunsu.relay-registry.v1",devices:[]}}}function Qx(e,t={}){let r=oh(t);jx(Vx(r),{recursive:!0}),Gx(r,`${JSON.stringify(e,null,2)}
|
|
76
|
+
`,"utf8")}function oh(e={}){return e.relayRegistryPath??`${Wv()}/.config/hunsu/relay-devices.json`}function Zx(e){if(typeof e!="object"||e===null)return!1;let t=e;return typeof t.deviceId=="string"&&t.deviceId.trim().length>0&&typeof t.command=="string"&&jc(t.command)}function ih(e){if(typeof e!="object"||e===null)return!1;let t=e;return typeof t.deviceId=="string"&&typeof t.deviceName=="string"&&typeof t.userId=="string"&&typeof t.registeredAt=="string"&&(t.status==="online"||t.status==="offline")}function eC(e){return sh(e,"authorization")?.match(/^Relay\s+(.+)$/i)?.[1]?.trim()}function tC(e){try{return new URL(e.url??"/","http://localhost").searchParams.get("hunsuRelayToken")?.trim()||void 0}catch{return}}function sh(e,t){let r=e.headers[t.toLowerCase()];return Array.isArray(r)?r[0]:r}function jc(e){return["health","bridge.status","connection.status","provider.inventory","modelAlias.validate","modelAlias.resolve","roadmap.registry.list","roadmap.registry.remove","roadmap.open","roadmap.port.inspect","roadmap.port.apply","roadmap.create","roadmap.board","roadmap.worktree","roadmap.skills","roadmap.commands","execute.start","execute.pause","execute.resume","execute.stop","execute.completeMove","execute.status","artifactAction.list","artifactAction.runs","artifactAction.start","artifactAction.stop","moveFile.tree","moveFile.blob","moveFile.diff","hunsuDraft.list","hunsuDraft.start","hunsuDraft.get","hunsuDraft.message","hunsuDraft.diffArtifact.create","hunsuDraft.diffArtifact.get","hunsuDraft.approve","hunsuDraft.discard","line.accept","line.reject","agentSession.list","agentSession.get","agentSession.events","live.events"].includes(e)}function Di(e){switch(e){case"execute.start":case"execute.pause":case"execute.resume":case"execute.stop":case"execute.completeMove":return["execute.start","remoteRelay.access"];case"artifactAction.list":case"artifactAction.runs":return["env.read","hostAlias.expose","remoteRelay.access"];case"artifactAction.start":case"artifactAction.stop":return["artifactAction.run","env.read","hostAlias.expose","remoteRelay.access"];case"health":case"bridge.status":case"connection.status":case"provider.inventory":case"modelAlias.validate":case"modelAlias.resolve":case"roadmap.registry.list":return[];default:return["remoteRelay.access"]}}function jv(e){if(typeof e!="object"||e===null)return!1;let t=e;return typeof t.providerId=="string"&&typeof t.label=="string"&&typeof t.kind=="string"&&typeof t.ready=="boolean"&&typeof t.auth=="object"&&t.auth!==null&&typeof t.capabilities=="object"&&t.capabilities!==null&&rC(t.modelInventory)}function rC(e){if(typeof e!="object"||e===null||!("state"in e))return!1;let t=e;return t.state==="available"?Array.isArray(t.models)&&t.models.every(r=>{if(typeof r!="object"||r===null)return!1;let n=r;return typeof n.model=="string"&&typeof n.label=="string"&&typeof n.capabilities=="object"&&n.capabilities!==null}):t.state==="unavailable"&&(t.reason==="not_reported"||t.reason==="not_supported")&&typeof t.message=="string"}function nC(e){if(typeof e!="object"||e===null)return!1;let t=e;return typeof t.workspaceId=="string"&&typeof t.roadmapId=="string"&&typeof t.displayName=="string"&&(t.path===void 0||typeof t.path=="string")&&(t.lifecycle==="active"||t.lifecycle==="inactive"||t.lifecycle==="missing"||t.lifecycle==="needs_upgrade"||t.lifecycle==="error")&&(t.health==="ok"||t.health==="missing"||t.health==="needs_upgrade"||t.health==="error"||t.health==="unknown")&&typeof t.backendId=="string"&&(t.connectionMode==="local"||t.connectionMode==="remote")&&typeof t.provider=="object"&&t.provider!==null&&typeof t.provider.providerId=="string"&&typeof t.provider.label=="string"&&typeof t.provider.readyForExecute=="boolean"&&Array.isArray(t.actions)}function oC(e){return[...new Set(e)]}function iC(e){return e==="execute.start"||e==="artifactAction.run"||e==="env.read"||e==="hostAlias.expose"||e==="remoteRelay.access"}async function ah(e,t,r,n){if(e.method==="GET"&&r==="/api/connection/status")return n.sendJson(t,200,n.studioConnectionStatus()),!0;if(e.method==="GET"&&r==="/api/bridge/status")return n.sendJson(t,200,await n.bridgeStatus()),!0;if(e.method==="GET"&&r==="/api/connections"){let o=await n.bridgeStatus();return n.sendJson(t,200,{connections:o.connections}),!0}if(e.method==="GET"&&r==="/api/connections/local"){let o=await n.bridgeStatus();return n.sendJson(t,200,{connection:o.connections.find(i=>i.mode==="local")}),!0}if(e.method==="GET"&&r==="/api/connections/remote"){let o=await n.bridgeStatus();return n.sendJson(t,200,{connections:o.connections.filter(i=>i.mode==="remote")}),!0}return e.method==="POST"&&r==="/api/connections/remote/enable"?(await sC(t,n),!0):e.method==="POST"&&r==="/api/connections/remote/disable"?(await aC(t,n),!0):e.method==="POST"&&r==="/api/connections/remote/connect"?(n.sendJson(t,202,await n.connectRemote(await n.readJson(e))),!0):!1}async function sC(e,t){let r=t.account();if(!r.signedIn){t.sendJson(e,401,{error:"login_required",message:"Sign in to Hunsu before enabling Remote Bridge."});return}if(t.headlessRemote){let s=await t.headlessRemote.enable(),a=await t.currentProvider(),d={...t.remoteDevice({account:r,status:s.connection==="connected"?"online":"offline",provider:a}),...s.deviceId?{deviceId:s.deviceId}:{},remoteAccess:"enabled"},u=await t.bridgeStatus();t.sendJson(e,202,{enabled:!0,device:d,connections:u.connections.filter(c=>c.mode==="remote")});return}let n=await t.currentProvider(),o=await Zv({device:t.remoteDevice({account:r,status:"online",provider:n}),roadmaps:t.managedRoadmaps(),relay:t.relay(),store:t.deviceStore,publishWorkspaceAccess:t.publishWorkspaceAccess}),i=await t.bridgeStatus();t.sendJson(e,202,{enabled:!0,device:o,connections:i.connections.filter(s=>s.mode==="remote")})}async function aC(e,t){let r=t.account();if(t.headlessRemote){let i=await t.headlessRemote.disable(),s={...t.remoteDevice({account:r,status:"offline"}),...i.deviceId?{deviceId:i.deviceId}:{},remoteAccess:"disabled"},a=await t.bridgeStatus();t.sendJson(e,202,{enabled:!1,device:s,connections:a.connections.filter(d=>d.mode==="remote")});return}let n=await eh({device:t.remoteDevice({account:r,status:"offline"}),relay:t.relay(),store:t.deviceStore,deactivateWorkspaceAccess:t.deactivateWorkspaceAccess}),o=await t.bridgeStatus();t.sendJson(e,202,{enabled:!1,device:n,connections:o.connections.filter(i=>i.mode==="remote")})}async function uh(e,t,r,n){if(await dC(e,t,r,n))return!0;if(e.method==="GET"&&r==="/api/workspaces"){let o=await n.bridgeStatus();return n.sendJson(t,200,o.workspaces),!0}if(e.method==="GET"&&r==="/api/workspaces/active"){let o=await n.bridgeStatus();return n.sendJson(t,200,{workspaces:o.workspaces.active}),!0}if(e.method==="GET"&&r==="/api/workspaces/managed"){let o=await n.bridgeStatus();return n.sendJson(t,200,{workspaces:o.workspaces.managed}),!0}return e.method==="POST"&&r==="/api/workspaces/add"?(n.sendJson(t,202,await cC(await n.readJson(e),n)),!0):e.method==="POST"&&r==="/api/workspaces/activate"?(n.sendJson(t,202,await dh(await n.readJson(e),"active",n)),!0):e.method==="POST"&&r==="/api/workspaces/deactivate"?(n.sendJson(t,202,await dh(await n.readJson(e),"inactive",n)),!0):e.method==="POST"&&r==="/api/workspaces/remove"?(n.sendJson(t,202,await lC(await n.readJson(e),n)),!0):!1}async function dC(e,t,r,n){return e.method==="GET"&&r==="/api/roadmaps/recent"?(n.sendJson(t,200,{roadmaps:n.recentRoadmaps()}),!0):e.method==="GET"&&r==="/api/roadmaps/managed"?(n.sendJson(t,200,{roadmaps:n.managedRoadmaps()}),!0):e.method==="POST"&&r==="/api/roadmaps/recent/remove"?(n.sendJson(t,202,await n.removeRoadmap(await n.readJson(e))),!0):e.method==="POST"&&r==="/api/roadmaps/activate"?(n.sendJson(t,202,await n.activateRoadmap(await n.readJson(e))),!0):e.method==="POST"&&r==="/api/roadmaps/deactivate"?(n.sendJson(t,202,await n.deactivateRoadmap(await n.readJson(e))),!0):e.method==="POST"&&r==="/api/projects/inspect"?(n.sendJson(t,200,{project:await n.inspectProject(await n.readJson(e))}),!0):e.method==="POST"&&r==="/api/roadmaps/open"?(n.sendJson(t,202,await Wc(await n.readJson(e),n.openRoadmap,n)),!0):e.method==="POST"&&r==="/api/roadmaps/port/inspect"?(n.sendJson(t,200,await n.inspectRoadmapPort(await n.readJson(e))),!0):e.method==="POST"&&r==="/api/roadmaps/port/apply"?(n.sendJson(t,202,await Wc(await n.readJson(e),n.applyRoadmapPort,n)),!0):e.method==="POST"&&r==="/api/roadmaps/create"?(n.sendJson(t,202,await Wc(await n.readJson(e),n.createRoadmap,n)),!0):!1}async function Wc(e,t,r){let n=await t(e),o=uC(n);return o&&r.selectRepository?.(o),n}function uC(e){if(typeof e!="object"||e===null)return;let t=e.repository;if(typeof t!="object"||t===null)return;let r=t.root;return typeof r=="string"&&r.trim()?r:void 0}async function cC(e,t){let r=await t.addWorkspace(e);r.repository?.root&&t.selectRepository?.(r.repository.root);let n=await t.currentProvider();return{workspace:jt(r.roadmap,{provider:n}),workspaces:Fr(t.managedRoadmaps(),{provider:n})}}async function dh(e,t,r){let n=await r.setWorkspaceLifecycle(e,t),o=await r.currentProvider();return{workspace:n.roadmap?jt(n.roadmap,{provider:o}):void 0,workspaces:Fr(n.roadmaps,{provider:o})}}async function lC(e,t){let r=await t.removeWorkspace(e),n=await t.currentProvider();return{removed:r.removed,workspaces:Fr(r.roadmaps,{provider:n})}}function Gc(e){return{backendId:"local",mode:"local",label:e.label??"This computer",provider:e.provider,connection:e.running===!1?{state:"not_running"}:{state:"connected"},workspaces:e.workspaces}}import{existsSync as PC,readFileSync as AC}from"node:fs";import{chmod as mC}from"node:fs/promises";import{execFile as fC}from"node:child_process";import{promisify as pC}from"node:util";import{randomBytes as gC}from"node:crypto";var Rn="hunsu.bridge.credentials.v1";function jr(e,t={}){let r=t.randomBytes??gC,n=t.platform??process.platform,o=t.windowsAclHardener??hC,i=Promise.resolve(),s=async()=>{let c=await Xe(e.credentialsFile);if(c!==void 0)return RC(e.credentialsFile,c)},a=async()=>(await i,s()),d=c=>{let m=i.then(c,c);return i=m.then(()=>{},()=>{}),m},u=async c=>d(async()=>{let m=await s(),f={schema:Rn,controlToken:_a(e.credentialsFile,"controlToken",c.controlToken??m?.controlToken??qc(r)),account:c.account===void 0?m?.account??null:ch(e.credentialsFile,c.account),relay:c.relay===void 0?m?.relay??null:lh(e.credentialsFile,c.relay)};return await Me(e.credentialsFile,f,{mode:384,...n==="win32"?{prepareTemporaryFile:o}:{}}),f});return{read:a,async ensure(){let c=await a();return c?(n==="win32"?await o(e.credentialsFile):await mC(e.credentialsFile,384),c):u({})},write:u,rotateControlToken(c={}){return d(async()=>{let m=await s(),f=qc(r);for(let g=0;f===m?.controlToken&&g<8;g+=1)f=qc(r);if(f===m?.controlToken)throw M(e.credentialsFile,"a distinct control credential could not be generated");let p={schema:Rn,controlToken:f,account:m?.account??null,relay:m?.relay??null};return await Me(e.credentialsFile,p,{mode:384,...n==="win32"?{prepareTemporaryFile:o}:{},onCommitted:()=>c.onCommitted?.(p)}),p})}}}var vC=pC(fC);async function hC(e){let t=yC(e);try{await vC(t.command,t.args,{windowsHide:!0})}catch{throw M(e,"credentials ACL could not be restricted to the current Windows user")}}function yC(e){if(/[\u0000-\u001f\u007f]/u.test(e))throw M(e,"credentials path cannot contain control characters");let t=["$ErrorActionPreference = 'Stop'",`$CredentialPath = ${SC(e)}`,"$identity = [System.Security.Principal.WindowsIdentity]::GetCurrent().Name","$acl = Get-Acl -LiteralPath $CredentialPath","$acl.SetOwner((New-Object System.Security.Principal.NTAccount($identity)))","$acl.SetAccessRuleProtection($true, $false)","foreach ($existingRule in @($acl.Access)) { $acl.RemoveAccessRuleSpecific($existingRule) | Out-Null }","$rule = New-Object System.Security.AccessControl.FileSystemAccessRule($identity, 'FullControl', 'Allow')","$acl.SetAccessRule($rule)","Set-Acl -LiteralPath $CredentialPath -AclObject $acl"].join("; ");return{command:"powershell.exe",args:["-NoProfile","-NonInteractive","-ExecutionPolicy","Bypass","-EncodedCommand",Buffer.from(t,"utf16le").toString("base64")]}}function SC(e){return`'${e.replace(/'/g,"''")}'`}function qc(e){return`hunsu_control_${Buffer.from(e(32)).toString("base64url")}`}function RC(e,t){if(!Vc(t)||t.schema!==Rn)throw M(e,`expected schema ${Rn}`);return{schema:Rn,controlToken:_a(e,"controlToken",t.controlToken),account:ch(e,t.account),relay:lh(e,t.relay)}}function ch(e,t){if(t===null)return null;if(!Vc(t))throw M(e,"account must be null or an account credential");return{accountId:Ma(e,"account.accountId",t.accountId),accessToken:_a(e,"account.accessToken",t.accessToken),refreshToken:kC(e,"account.refreshToken",t.refreshToken),expiresAt:IC(e,"account.expiresAt",t.expiresAt)}}function lh(e,t){if(t===null)return null;if(!Vc(t))throw M(e,"relay must be null or a Relay credential");return{deviceId:Ma(e,"relay.deviceId",t.deviceId),token:_a(e,"relay.token",t.token)}}function _a(e,t,r){return Ma(e,t,r)}function kC(e,t,r){return mh(e,t,r)}function Ma(e,t,r){if(typeof r!="string"||r.trim()==="")throw M(e,`${t} must be a non-empty string`);return r}function mh(e,t,r){return r===null?null:Ma(e,t,r)}function IC(e,t,r){let n=mh(e,t,r);if(n!==null&&!Number.isFinite(Date.parse(n)))throw M(e,`${t} must be a valid timestamp or null`);return n}function Vc(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}var oo=["remoteRelay.access","execute.start","artifactAction.run","env.read","hostAlias.expose"];var Wt="hunsu.bridge.workspaces.v1";function Ha(e){return{async read(){let t=await Xe(e.workspacesFile);return t===void 0?{schema:Wt,workspaces:[]}:fh(e.workspacesFile,t)},async write(t){await Me(e.workspacesFile,fh(e.workspacesFile,t))}}}function fh(e,t){if(!Jc(t)||t.schema!==Wt||!Array.isArray(t.workspaces))throw M(e,`expected schema ${Wt} and a workspaces array`);let r=t.workspaces.map((i,s)=>wC(e,i,s)),n=new Set,o=new Set;for(let i of r){if(n.has(i.workspaceId))throw M(e,`duplicate workspaceId ${i.workspaceId}`);if(o.has(i.repositoryPath))throw M(e,"duplicate repositoryPath");n.add(i.workspaceId),o.add(i.repositoryPath)}return{schema:Wt,workspaces:r}}function wC(e,t,r){if(!Jc(t))throw M(e,`workspaces[${r}] must be an object`);let n=t.lifecycle;if(n!=="active"&&n!=="inactive")throw M(e,`workspaces[${r}].lifecycle is invalid`);return{workspaceId:io(e,`workspaces[${r}].workspaceId`,t.workspaceId),displayName:io(e,`workspaces[${r}].displayName`,t.displayName),repositoryPath:io(e,`workspaces[${r}].repositoryPath`,t.repositoryPath),lifecycle:n,...EC(e,t.remoteAccess,r),createdAt:io(e,`workspaces[${r}].createdAt`,t.createdAt),updatedAt:io(e,`workspaces[${r}].updatedAt`,t.updatedAt)}}function EC(e,t,r){if(t===void 0)return{};if(!Jc(t)||typeof t.enabled!="boolean"||!Array.isArray(t.scopes))throw M(e,`workspaces[${r}].remoteAccess must contain enabled and scopes`);let n=t.scopes.map((o,i)=>{let s=io(e,`workspaces[${r}].remoteAccess.scopes[${i}]`,o);if(!oo.includes(s))throw M(e,`workspaces[${r}].remoteAccess.scopes[${i}] is unsupported`);return s});return{remoteAccess:{enabled:t.enabled,scopes:[...new Set(n)]}}}function io(e,t,r){if(typeof r!="string"||r.trim()==="")throw M(e,`${t} must be non-empty`);return r}function Jc(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function ph(e){let t=bC(e);return t?.account?t.account.expiresAt!==null&&Date.parse(t.account.expiresAt)<=Date.now()?{available:!0,signedIn:!1}:{available:!0,signedIn:!0,userId:t.account.accountId}:{available:t!==void 0,signedIn:!1}}function gh(e){if(Sh(e)?.remote.enabled!==!0)return[];let r=ft({env:e}),n=zc(r.workspacesFile);return n?.schema!==Wt||!Array.isArray(n.workspaces)?[]:n.workspaces.filter(o=>o.lifecycle==="active"&&o.remoteAccess?.enabled===!0&&o.remoteAccess.scopes.includes("remoteRelay.access")).map(o=>({path:Kc(o.repositoryPath),scopes:o.remoteAccess?.scopes.filter(Rh)??["remoteRelay.access"]}))}function vh(e){let t=Sh(e)?.provider;return t?.kind==="codex"?Et({binaryPath:t.binaryPath,codexHome:t.home,appServerCommand:t.appServerCommand,appServerArgs:t.appServerArgs,installChannel:t.installChannel,authenticationPreference:t.authenticationPreference}):{}}function hh(e){if(!e?.trim())return[];try{let t=JSON.parse(e);return Array.isArray(t)?t.flatMap(r=>!xC(r)||typeof r.path!="string"||!r.path.trim()||!Array.isArray(r.scopes)?[]:[{path:Kc(r.path),scopes:r.scopes.filter(Rh),active:r.active===!1?!1:void 0}]):[]}catch{return[]}}function yh(e){let t=new Map;for(let r of e){let n=Kc(r.path),o=t.get(n);t.set(n,{path:n,scopes:[...new Set([...o?.scopes??[],...r.scopes])],active:o?.active===!1||r.active===!1?!1:void 0})}return[...t.values()]}function Sh(e){let t=zc(ft({env:e}).configFile);return t?.schema===mr?t:void 0}function bC(e){let t=zc(ft({env:e}).credentialsFile);return t?.schema===Rn?t:void 0}function zc(e){if(PC(e))try{return JSON.parse(AC(e,"utf8"))}catch{return}}function Rh(e){return e==="execute.start"||e==="artifactAction.run"||e==="env.read"||e==="hostAlias.expose"||e==="remoteRelay.access"}function Kc(e){return e.replace(/\\/g,"/").replace(/\/+$/,"")}function xC(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}async function Na(e,t,r={}){return e.current().status({env:t,force:r.force})}function Xc(e,t){let r=new URL(e.url??"/","http://localhost"),n=r.searchParams.get("userId")?.trim()||void 0,o=r.searchParams.get("email")?.trim()||void 0,i=DC(t.processEnv),s=ph(t.processEnv),a=fr(e,t);return s.signedIn?{signedIn:!0,userId:s.userId??i.userId,email:s.email??i.email,source:"daemon"}:a?{signedIn:!0,userId:i.userId??n,email:i.email??o,source:"relay"}:i.signedIn?{...i,source:"env"}:!s.available&&_C(t.processEnv)&&(n||o)?{signedIn:!0,userId:n,email:o,source:"query"}:s.available?{signedIn:!1,source:"daemon"}:{signedIn:!1,source:"none"}}function CC(e){return yh([...hh(e.processEnv.HUNSU_BRIDGE_PROJECT_GRANTS_JSON),...gh(e.processEnv)])}async function Wr(e){let t=Xc(e.request,e.runtimeConfig);return TC({providerRegistry:e.providerRegistry,env:e.runtimeConfig.processEnv,managedRoadmaps:e.managedRoadmaps(),account:t,projectGrants:CC(e.runtimeConfig),listRemoteDevices:r=>Gv(e.request,e.runtimeConfig,{relayRegistryPath:e.relayRegistryPath??e.runtimeConfig.processEnv.HUNSU_RELAY_REGISTRY_PATH,userId:r})})}async function TC(e){let t=await Na(e.providerRegistry,e.env),r=Fr(e.managedRoadmaps,{provider:t,activeOnly:!0}),n=Fr(e.managedRoadmaps,{provider:t,activeOnly:!1}),o=[Gc({provider:t,workspaces:r})];if(e.account.signedIn){let i=await e.listRemoteDevices(e.account.userId);for(let s of i){let a=Ti(s),d=s.projectGrants?.length?s.projectGrants:e.projectGrants,u=Yv(s,{provider:a,projectGrants:d});o.push(Fc({device:s,provider:a,workspaces:u,signedIn:!0}))}}return{provider:t,connections:o,workspaces:{active:r,managed:n},account:e.account}}function DC(e){let t=e.HUNSU_BRIDGE_ACCOUNT_USER_ID?.trim()||void 0,r=e.HUNSU_BRIDGE_ACCOUNT_EMAIL?.trim()||void 0;return{signedIn:!!(t||r),userId:t,email:r}}function _C(e){return e.HUNSU_BRIDGE_DEBUG_QUERY_ACCOUNT_EVIDENCE==="1"||e.HUNSU_BRIDGE_ALLOW_QUERY_ACCOUNT_EVIDENCE==="1"}import{createServer as MC}from"node:http";function kh(e,t={}){let r=MC(e),n=t.runtimeConfig;return n?.bridgeApi.port===0&&r.once("listening",()=>{let o=r.address();!o||typeof o=="string"||HC(n,o.port)}),r}function Ih(e){return new URL(e.url??"/","http://localhost")}function HC(e,t){e.bridgeApi={...e.bridgeApi,port:t},e.processEnv.HUNSU_BRIDGE_PORT=String(t),e.codexAppServer.environment.HUNSU_BRIDGE_PORT=String(t)}function Yc(e){return e==="/health"}function wh(e){return Yc(e)}function Qc(e){return e==="/api/bridge/control/status"||e==="/api/bridge/pairing/rotate"||e==="/api/bridge/pairing/revoke"||e==="/api/bridge/control/shutdown"}async function Eh(e,t,r,n,o){if(e.method==="GET"&&r==="/api/remote/devices")return o.sendJson(t,200,{devices:await xi(e,o.runtimeConfig,{relayRegistryPath:o.runtimeConfig.processEnv.HUNSU_RELAY_REGISTRY_PATH,userId:n.searchParams.get("userId")??void 0})}),!0;if(e.method==="POST"&&r==="/api/remote/connect"){let i=await o.readJson(e);return o.sendJson(t,202,await Ci(i,e,o.runtimeConfig,{relayRegistryPath:o.runtimeConfig.processEnv.HUNSU_RELAY_REGISTRY_PATH})),!0}if(e.method==="POST"&&r==="/api/remote/commands"){let i=await o.readJson(e),s=await Lc(i,e,o.runtimeConfig);return o.sendJson(t,s.ok?s.status:s.status??502,s),!0}if(e.method==="GET"&&r==="/api/remote/commands/events"){let i=Vv(n);return i?(await Uc(i,e,t,o.runtimeConfig,{sendJson:o.sendJson,responseHeaders:o.responseHeaders}),!0):(o.sendJson(t,400,{ok:!1,error:"Remote event stream command payload is invalid."}),!0)}return!1}async function Ph(e,t,r,n){if(await NC(r,n))return!0;if(e.method==="GET"&&r==="/api/board")return n.sendJson(t,200,n.board()),!0;if(e.method==="GET"&&r==="/api/roadmap")return n.sendJson(t,200,n.roadmapView()),!0;if(e.method==="GET"&&r==="/api/events")return n.sendJson(t,200,{events:n.events()}),!0;if(e.method==="GET"&&r==="/api/repository")return n.sendJson(t,200,{repository:n.repository()}),!0;if(e.method==="POST"&&r==="/api/repository")return n.sendJson(t,202,await n.selectRepository(await n.readJson(e))),!0;if(e.method==="GET"&&r==="/api/worktree")return n.sendJson(t,200,n.worktree()),!0;if(e.method==="GET"&&r==="/api/artifacts")return n.sendJson(t,200,{artifacts:n.artifacts()}),!0;if(e.method==="GET"&&r.startsWith("/api/artifacts/")){let o=decodeURIComponent(r.slice(15)),i=n.artifact(o);return n.sendJson(t,i?200:404,i?{artifact:i}:{error:`Unknown artifact: ${o}`}),!0}if(e.method==="GET"&&r==="/api/skills")return n.sendJson(t,200,{skills:n.skills()}),!0;if(e.method==="GET"&&r.startsWith("/api/moves/")&&r.endsWith("/diff")){let o=decodeURIComponent(r.slice(11,-5));return n.sendJson(t,200,{diff:n.moveDiff(o)}),!0}return e.method==="POST"&&r==="/api/commands"?(n.sendJson(t,202,await n.executeCommands(await n.readJson(e))),!0):e.method==="POST"&&r==="/api/lines/accept"?(n.sendJson(t,202,await n.decideLine("accept",await n.readJson(e))),!0):e.method==="POST"&&r==="/api/lines/reject"?(n.sendJson(t,202,await n.decideLine("reject",await n.readJson(e))),!0):!1}async function Ah(e,t,r,n){let o=BC(r);if(!o)return!1;let i=n.repositoryPath(o.roadmapId),s=o.suffix;if(e.method==="GET"&&s==="")return n.sendJson(t,200,n.loadRoadmap(o.roadmapId,i)),!0;if(e.method==="GET"&&s==="/board")return n.sendJson(t,200,n.board(o.roadmapId,i)),!0;if(e.method==="GET"&&s==="/roadmap")return n.sendJson(t,200,n.roadmapView(o.roadmapId,i)),!0;if(e.method==="GET"&&s==="/events")return n.sendJson(t,200,{events:n.events(o.roadmapId,i)}),!0;if(e.method==="GET"&&s==="/repository")return n.sendJson(t,200,{repository:n.repository(o.roadmapId,i)}),!0;if(e.method==="GET"&&s==="/worktree")return n.sendJson(t,200,n.worktree(o.roadmapId,i)),!0;if(e.method==="GET"&&s==="/artifacts")return n.sendJson(t,200,{artifacts:n.artifacts(o.roadmapId,i)}),!0;if(e.method==="GET"&&s.startsWith("/artifacts/")){let d=decodeURIComponent(s.slice(11)),u=n.artifact(o.roadmapId,i,d);return n.sendJson(t,u?200:404,u?{artifact:u}:{error:`Unknown artifact: ${d}`}),!0}if(s==="/artifact-actions"||s.startsWith("/artifact-actions/")||s==="/action-runs"||s.startsWith("/action-runs/"))return n.artifactActions(s,o.roadmapId,i);if(s==="/hunsu/drafts"||s.startsWith("/hunsu/drafts/"))return n.hunsuDrafts(s.slice(13),o.roadmapId,i);if(await n.executes(s,o.roadmapId,i))return!0;if(e.method==="GET"&&s==="/skills")return n.sendJson(t,200,{skills:n.skills(o.roadmapId,i)}),!0;let a=OC(s);if(a&&e.method==="GET"){let u=new URL(e.url??"/","http://localhost").searchParams.get("path")??void 0;if(a.action==="tree")return n.sendJson(t,200,{tree:n.moveFileTree(o.roadmapId,i,a.moveId,u)}),!0;if(a.action==="blob")return n.sendJson(t,200,{blob:n.moveFileBlob(o.roadmapId,i,a.moveId,u??"")}),!0;if(a.action==="diff")return n.sendJson(t,200,{diff:n.moveDiff(o.roadmapId,i,a.moveId)}),!0}if(e.method==="GET"&&s.startsWith("/moves/")&&s.endsWith("/diff")){let d=decodeURIComponent(s.slice(7,-5));return n.sendJson(t,200,{diff:n.moveDiff(o.roadmapId,i,d)}),!0}return e.method==="POST"&&s==="/commands"?(n.sendJson(t,202,await n.executeCommands(o.roadmapId,i,await n.readJson(e))),!0):e.method==="POST"&&s==="/lines/accept"?(n.sendJson(t,202,await n.decideLine(o.roadmapId,i,"accept",await n.readJson(e))),!0):e.method==="POST"&&s==="/lines/reject"?(n.sendJson(t,202,await n.decideLine(o.roadmapId,i,"reject",await n.readJson(e))),!0):!1}async function NC(e,t){return e==="/api/artifact-actions"||e.startsWith("/api/artifact-actions/")||e==="/api/action-runs"||e.startsWith("/api/action-runs/")?t.artifactActions(e):!1}function BC(e){let t="/api/roadmaps/";if(!e.startsWith(t))return;let r=e.slice(t.length),[n,...o]=r.split("/");if(n)return{roadmapId:decodeURIComponent(n),suffix:o.length>0?`/${o.join("/")}`:""}}function OC(e){if(!e.startsWith("/moves/"))return;let t=e.slice(1).split("/");if(t.length<4||t[0]!=="moves"||t[2]!=="files")return;let r=decodeURIComponent(t[1]??"");if(t[3]==="tree")return{action:"tree",moveId:r};if(t[3]==="blob")return{action:"blob",moveId:r};if(t[3]==="diff")return{action:"diff",moveId:r}}function Gt(){return{"access-control-allow-methods":"GET,HEAD,POST,PUT,DELETE,OPTIONS","access-control-allow-headers":"authorization,content-type,x-hunsu-bridge-token,x-hunsu-bridge-control-token","access-control-allow-private-network":"true","access-control-max-age":"600",vary:"origin, access-control-request-method, access-control-request-headers, access-control-request-private-network"}}function bh(){let e=new WeakMap;return{set(t,r){e.set(t,r)},get(t){return e.get(t)??Gt()}}}import{randomBytes as $C,timingSafeEqual as LC}from"node:crypto";var UC=300*1e3;function Ba(e){if(!e.controlToken.trim())throw new Error("Control token is required before pairing can be enabled.");let t=e.ttlMs??UC;if(!Number.isFinite(t)||t<=0)throw new Error("Pairing TTL must be positive.");let r=e.now??Date.now,n=e.randomBytes??$C,o;if(e.initialPairing){let a=e.initialPairing.credential.trim();if(!a||Zc(e.controlToken,a))throw new Error("Initial pairing credential must be non-empty and distinct from the control token.");let d=xh(e.initialPairing.browserUrl);if(!d)throw new Error("Initial pairing browser URL is invalid.");let u=`pair_${Buffer.from(n(12)).toString("base64url")}`;d.searchParams.set("hunsuBridgeToken",a),e.initialPairing.workspaceId&&d.searchParams.set("workspace",e.initialPairing.workspaceId),o={pairingId:u,credential:a,pairingUrl:d.toString(),workspaceId:e.initialPairing.workspaceId??null,expiresAtMs:r()+t,browserOpened:!1,consumed:!1,revoked:!1}}let i=a=>({pairingId:a.pairingId,expiresAt:new Date(a.expiresAtMs).toISOString(),workspaceId:a.workspaceId,browserOpened:a.browserOpened,status:a.revoked?"revoked":r()>=a.expiresAtMs?"expired":a.consumed?"consumed":"active"}),s=a=>!o||!Zc(o.credential,a)?S({code:"PAIRING_CREDENTIAL_INVALID",message:"Pairing credential is invalid."}):o.revoked?S({code:"PAIRING_CREDENTIAL_REVOKED",message:"Pairing credential has been revoked."}):r()>=o.expiresAtMs?S({code:"PAIRING_CREDENTIAL_EXPIRED",message:"Pairing credential has expired."}):l({pairingId:o.pairingId,workspaceId:o.workspaceId,expiresAt:new Date(o.expiresAtMs).toISOString()});return{rotate(a){let d=xh(a.browserUrl);if(!d)return S({code:"PAIRING_ROTATION_FAILED",message:"Browser URL is invalid."});let u=`hunsu_bridge_pair_${Buffer.from(n(32)).toString("base64url")}`;if(u===e.controlToken)return S({code:"PAIRING_ROTATION_FAILED",message:"Pairing credential generation failed."});let c=`pair_${Buffer.from(n(12)).toString("base64url")}`;return d.searchParams.set("hunsuBridgeToken",u),a.workspaceId&&d.searchParams.set("workspace",a.workspaceId),o&&(o.revoked=!0),o={pairingId:c,credential:u,pairingUrl:d.toString(),workspaceId:a.workspaceId??null,expiresAtMs:r()+t,browserOpened:!1,consumed:!1,revoked:!1},l({safe:i(o),internal:{pairingId:c,credential:u,pairingUrl:o.pairingUrl}})},consume(a){let d=s(a);return d.ok&&o&&(o.consumed=!0),d},validate(a){return a?!o||!Zc(o.credential,a)?{valid:!1,reason:"invalid"}:o.revoked?{valid:!1,reason:"revoked"}:r()>=o.expiresAtMs?{valid:!1,reason:"expired"}:{valid:!0}:{valid:!1,reason:"missing"}},revoke(a){return!o||a!==void 0&&o.pairingId!==a?!1:(o.revoked=!0,!0)},markBrowserOpened(a){return!o||o.pairingId!==a||o.revoked||r()>=o.expiresAtMs?!1:(o.browserOpened=!0,!0)},getSafeMetadata(){return o?i(o):null},getPairingUrl(a){if(!o||o.pairingId!==a)return S({code:"PAIRING_CREDENTIAL_INVALID",message:"Pairing credential is invalid."});let d=s(o.credential);return d.ok?l(o.pairingUrl):d}}}function xh(e){try{let t=new URL(e);return t.protocol==="http:"||t.protocol==="https:"?t:void 0}catch{return}}function Zc(e,t){let r=Buffer.from(e),n=Buffer.from(t);return r.length===n.length&&LC(r,n)}var Oa="hunsu.bridge.cli-result.v1",FC="Start Hunsu Bridge with `hunsu-bridge service start`.",b=class extends Error{code;recovery;cause;constructor(t,r,n={}){super(r),this.name="BridgeError",this.code=t,this.recovery=n.recovery,this.cause=n.cause}};function te(e,t,r="OK"){return{schema:Oa,ok:!0,code:r,message:e,...t===void 0?{}:{value:t}}}function ee(e,t,r){return{schema:Oa,ok:!1,code:e,message:t,...r?{recovery:r}:{}}}function Ch(){return ee("BRIDGE_NOT_RUNNING",FC)}function pr(e){return e instanceof b?ee(e.code,e.message,e.recovery):e instanceof Ft?ee(e.code,e.message):ee("BRIDGE_CONTROL_UNAVAILABLE","Hunsu Bridge command failed unexpectedly.")}import{unlink as jC}from"node:fs/promises";import{isAbsolute as WC}from"node:path";var _i="hunsu.bridge.runtime.v1";function $a(e){let t=async()=>{let r=await Xe(e.runtimeFile);return r===void 0?void 0:Th(e.runtimeFile,r)};return{read:t,async write(r){await Me(e.runtimeFile,Th(e.runtimeFile,r))},async clear(r){if(r!==void 0){let n=await t();if(n===void 0||n.instanceId!==r)return!1}try{return await jC(e.runtimeFile),!0}catch(n){if(X(n)&&n.code==="ENOENT")return!1;throw n}}}}function Th(e,t){if(!VC(t)||t.schema!==_i)throw M(e,`expected schema ${_i}`);if(!Number.isInteger(t.daemonPid)||t.daemonPid<=0)throw M(e,"daemonPid must be a positive integer");let r=t.serviceManager;if(r!=="development"&&r!=="windows-task-scheduler"&&r!=="macos-launch-agent"&&r!=="linux-systemd-user")throw M(e,"serviceManager is invalid");return{schema:_i,instanceId:so(e,"instanceId",t.instanceId),daemonPid:t.daemonPid,version:so(e,"version",t.version),protocolVersion:GC(e,t.protocolVersion),startedAt:so(e,"startedAt",t.startedAt),endpoint:so(e,"endpoint",t.endpoint),runtimePath:qC(e,"runtimePath",t.runtimePath),serviceManager:r,lastHealthyAt:so(e,"lastHealthyAt",t.lastHealthyAt)}}function GC(e,t){if(t!=="local-bridge-v1")throw M(e,"protocolVersion must be local-bridge-v1");return t}function so(e,t,r){if(typeof r!="string"||r.trim()==="")throw M(e,`${t} must be non-empty`);return r}function qC(e,t,r){let n=so(e,t,r);if(!WC(n)||/[\u0000-\u001f\u007f]/u.test(n))throw M(e,`${t} must be an absolute path without control characters`);return n}function VC(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function _h(e){let t={...e.env??{}},r=new Set,n=i=>new hn({env:()=>t,settings:Gr(i.provider)}),o=i=>{for(let s of r)try{s(Dh(i))}catch{}};return{async list(){return[{providerId:"codex",label:"Codex",configured:(await e.configStore.read()).provider.kind==="codex"}]},async configuration(){return Dh((await e.configStore.read()).provider)},async status(i=!1){let s=await e.configStore.read();return n(s).status({force:i,env:t})},async setCodex(i){let a={...await e.configStore.read(),provider:{kind:"codex",...i.binaryPath?.trim()?{binaryPath:i.binaryPath.trim()}:{},...i.home?.trim()?{home:i.home.trim()}:{},...i.appServerCommand?.trim()?{appServerCommand:i.appServerCommand.trim()}:{},...i.appServerArgs?.trim()?{appServerArgs:i.appServerArgs.trim()}:{},...i.installChannel?{installChannel:i.installChannel}:{},...i.authenticationPreference?{authenticationPreference:i.authenticationPreference}:{}}},d=await n(a).status({force:!0,env:t});if(!d.installed)throw new b("PROVIDER_BINARY_NOT_FOUND",d.safeMessage??"Codex was not found by Hunsu Bridge.");if(!d.configured)throw new b("PROVIDER_CHECK_FAILED",d.safeMessage??"Codex could not initialize its app-server.");let u=await e.configStore.update(c=>({...c,provider:a.provider}));return o(u.provider),d},async resetCodex(){let i=await e.configStore.update(s=>({...s,provider:{kind:"unconfigured"}}));return o(i.provider),n(i).status({force:!0,env:t})},onConfigurationChange(i){return r.add(i),()=>r.delete(i)}}}function Mh(e){let t=async()=>new hn({env:e.env,settings:Gr(await e.service.configuration())}),r={providerId:"codex",kind:"codex",label:"Codex",metadata:()=>Ea,async readConfig(){return Pa(Gr(await e.service.configuration()))},async validateConfig(o){return(await t()).validateConfig(o)},async saveConfig(o){let i=Gr(await e.service.configuration());return e.service.setCodex(el(vn(i,o)))},async deleteConfig(o){if(!o?.length)return e.service.resetCodex();let i=Gr(await e.service.configuration()),s=vn(i,o.map(a=>({key:a,value:"",isSet:!1,isSecret:!1})));return e.service.setCodex(el(s))},status:o=>e.service.status(o?.force),async installPlan(){return(await t()).installPlan()},async install(o){return(await t()).install(o)},async login(o){return(await t()).login(o)},recheck:()=>e.service.status(!0),async configure(o){if(o.authMethod==="api_key")return(await t()).configure(o);let i=Gr(await e.service.configuration()),s=o.binaryPath?.trim()||o.selectBinaryPath?.trim(),a={...i,...s?{binaryPath:s}:{}};return o.clearBinaryPath&&delete a.binaryPath,e.service.setCodex(el(a))},effectiveEnv:o=>({...e.env(),...o??{}})},n=e.fallback.list().map(o=>o.providerId==="codex"?r:o);return n.some(o=>o.providerId==="codex")||n.unshift(r),{list:()=>[...n],get:o=>o==="codex"?r:n.find(i=>i.providerId===o),current:()=>r,async setCurrent(o){o!=="codex"&&await e.fallback.setCurrent(o)}}}function Gr(e){return e.kind==="codex"?Et({binaryPath:e.binaryPath,codexHome:e.home,appServerCommand:e.appServerCommand,appServerArgs:e.appServerArgs,installChannel:e.installChannel,authenticationPreference:e.authenticationPreference}):{}}function el(e){return{...e.binaryPath?{binaryPath:e.binaryPath}:{},...e.codexHome?{home:e.codexHome}:{},...e.appServerCommand?{appServerCommand:e.appServerCommand}:{},...e.appServerArgs?{appServerArgs:e.appServerArgs}:{},...e.installChannel?{installChannel:e.installChannel}:{},...e.authenticationPreference?{authenticationPreference:e.authenticationPreference}:{}}}function Dh(e){return{...e}}var JC="/studio/settings/model-aliases",zC="1970-01-01T00:00:00.000Z",Mi={primary:"PrimaryModel",fast:"FastModel",reviewer:"ReviewerModel",cheap:"CheapModel"};function Nh(e=zC){return[La(Mi.primary,"Primary Model",{kind:"direct",provider:{providerId:"codex",model:"gpt-5.5-thinking",reasoningEffort:"high",serviceTier:"default"}},e),La(Mi.fast,"Fast Model",{kind:"direct",provider:{providerId:"codex",model:"gpt-5.5",reasoningEffort:"medium",serviceTier:"fast"}},e),La(Mi.reviewer,"Reviewer Model",{kind:"direct",provider:{providerId:"codex",model:"gpt-5.5-thinking",reasoningEffort:"xhigh",serviceTier:"default"}},e),La(Mi.cheap,"Cheap Model",{kind:"direct",provider:{providerId:"codex",model:"gpt-5.5",reasoningEffort:"low",serviceTier:"default"}},e)]}function KC(e,t="local"){let r=vr(t.trim()||"local","providerInventory.backendId");return e.modelInventory.state==="unavailable"?S({code:"PROVIDER_INVENTORY_UNAVAILABLE",backendId:r,providerId:e.providerId,message:e.modelInventory.message}):l({providerId:e.providerId,label:vr(e.label,"providerInventory.label"),ready:e.ready,authState:e.auth.state,models:e.modelInventory.models})}function rl(){return{backendId:vr("local","providerInventory.backendId"),providers:[{providerId:"codex",label:vr("Codex","providerInventory.label"),ready:!0,authState:"authenticated",models:Ii()}]}}function nl(e){let t=e.backendId?.trim(),r=t?e.connections?.find(s=>s.backendId===t):e.connections?.find(s=>s.mode==="local");if(t&&!r)return qt(t);let n=r?.backendId??"local",o=r?.provider??e.provider;if(!o)return qt(n);let i=KC(o,n);return i.ok?l({backendId:vr(n,"providerInventory.backendId"),providers:[i.value]}):i}function qt(e,t=`Backend ${e.trim()||"local"} is not available on this Bridge.`){return S({code:"BACKEND_UNAVAILABLE",backendId:vr(e.trim()||"local","providerInventory.backendId"),message:t})}function Bh(e,t,r){return S({code:"PROVIDER_INVENTORY_UNAVAILABLE",backendId:vr(e.trim()||"local","providerInventory.backendId"),providerId:t,message:r})}function kn(e){let t=e.backendId?.trim()||"local",r=e.selection??{kind:"alias",aliasId:Mi.primary},n=e.aliases===void 0?Nh():e.aliases;if(r.kind==="direct")return tl(r,e.inventories,t);let o=n.find(s=>s.aliasId===r.aliasId);if(!o)return{ok:!1,backendId:t,error:gr("MODEL_ALIAS_NOT_FOUND",`Model alias ${r.aliasId} does not exist.`,{aliasId:r.aliasId,actions:[Ua()]})};let i=e.overrides?.find(s=>s.aliasId===o.aliasId&&s.backendId===t);return tl(i?.selection??o.selection,e.inventories,t)}function tl(e,t,r="local"){let n=r.trim()||"local",o=e.provider,i=t.find(m=>m.providerId===o.providerId);if(!i)return{ok:!1,backendId:n,error:gr("PROVIDER_NOT_READY",`Provider ${o.providerId} is not available for model selection.`,{providerId:o.providerId,actions:[Hh(o.providerId)]})};if(i.authState==="not_authenticated"||i.authState==="expired"||i.authState==="invalid")return{ok:!1,backendId:n,error:gr("PROVIDER_LOGIN_REQUIRED",`${i.label} login is required before this model can run.`,{providerId:o.providerId,actions:[XC(o.providerId,i.label)]})};if(!i.ready)return{ok:!1,backendId:n,error:gr("PROVIDER_NOT_READY",`${i.label} is not ready for Execute.`,{providerId:o.providerId,actions:[Hh(o.providerId)]})};let s=i.models.find(m=>m.model===o.model);if(!s)return o.experimental===!0?{ok:!0,backendId:n,selection:e,resolved:o,provider:{providerId:o.providerId,ready:i.ready},model:{providerId:o.providerId,model:o.model,experimental:!0}}:{ok:!1,backendId:n,error:gr("MODEL_UNSUPPORTED",`${i.label} does not advertise model ${o.model}.`,{providerId:o.providerId,model:o.model,actions:[Ua()]})};let a=s.capabilities.reasoningEfforts??[],d=o.reasoningEffort??s.defaultConfig?.reasoningEffort;if(d&&a.length>0&&!a.includes(d))return{ok:!1,backendId:n,error:gr("REASONING_UNSUPPORTED",`${s.label} does not support ${d} reasoning.`,{providerId:o.providerId,model:o.model,actions:[Ua()]})};let u=s.capabilities.serviceTiers??[],c=o.serviceTier??s.defaultConfig?.serviceTier;return c&&u.length>0&&!u.includes(c)?{ok:!1,backendId:n,error:gr("SERVICE_TIER_UNSUPPORTED",`${s.label} does not support the ${c} service tier.`,{providerId:o.providerId,model:o.model,actions:[Ua()]})}:{ok:!0,backendId:n,selection:e,resolved:o,provider:{providerId:o.providerId,ready:i.ready},model:s}}function In(e){return{ok:!1,backendId:e.backendId,error:e.code==="BACKEND_UNAVAILABLE"?gr(e.code,e.message,{actions:[QC(e.backendId)]}):gr(e.code,e.message,{providerId:e.providerId,actions:[YC(e.providerId)]})}}function qr(e,t){if(e.error==="BACKEND_UNAVAILABLE"){let r=t.startsWith("remote:")||t==="remote";return{area:"connection",backendId:t,error:r?"REMOTE_NOT_CONNECTED":"BRIDGE_NOT_CONNECTED",message:e.message,actions:e.actions}}return{area:"model",backendId:t,providerId:e.providerId,aliasId:e.aliasId,model:e.model,error:e.error,message:e.message,actions:e.actions}}function La(e,t,r,n){return{aliasId:vr(e,"modelAlias.aliasId"),displayName:vr(t,"modelAlias.displayName"),selection:r,scope:{kind:"user"},createdAt:n,updatedAt:n}}function gr(e,t,r){return{error:e,message:t,...r}}function Hh(e){return{type:"open_provider_setup",label:"Run hunsu-bridge provider status",href:"/studio/setup?next=%2Fstudio",providerId:e}}function XC(e,t){return{type:"login_provider",label:`Check ${t} with hunsu-bridge provider check ${e}`,href:"/studio/setup?next=%2Fstudio",providerId:e}}function YC(e){return{type:"recheck_provider",label:`Run hunsu-bridge provider check ${e}`,href:"/studio/setup?next=%2Fstudio",providerId:e}}function QC(e){return{type:"open_connection",label:e.startsWith("remote:")||e==="remote"?"Run hunsu-bridge remote status":"Run hunsu-bridge status",href:"/studio/setup?next=%2Fstudio"}}function Ua(){return{type:"edit_model_alias",label:"Edit Model Alias",href:JC}}function vr(e,t){return V(k(e,t))}var He="/studio/setup?next=%2Fstudio",Oh="/studio";function Fa(e){if(!e.installed){let t=e.recommendedAction==="select_binary"?{type:"open_provider_setup",label:`Run hunsu-bridge provider set ${e.providerId} --binary <path>`,href:He,providerId:e.providerId}:{type:"install_provider",label:`Install ${e.label}, then run hunsu-bridge provider check ${e.providerId}`,href:He,providerId:e.providerId};return ao(e,"PROVIDER_MISSING",e.safeMessage??`${e.label} is not installed or could not be found.`,[t])}if(!e.configured)return ao(e,"PROVIDER_UNAVAILABLE",`${e.label} is installed but unavailable.`,[{type:"recheck_provider",label:`Run hunsu-bridge provider check ${e.providerId}`,href:He,providerId:e.providerId}]);if(e.auth.state==="not_authenticated")return ao(e,"PROVIDER_LOGIN_REQUIRED",`${e.label} login is required before Execute can start.`,[{type:"login_provider",label:`Run hunsu-bridge provider check ${e.providerId}`,href:He,providerId:e.providerId}]);if(e.auth.state==="expired"||e.auth.state==="invalid")return ao(e,"PROVIDER_AUTH_EXPIRED",`${e.label} authentication needs to be refreshed.`,[{type:"login_provider",label:`Run hunsu-bridge provider check ${e.providerId}`,href:He,providerId:e.providerId},{type:"recheck_provider",label:`Recheck with hunsu-bridge provider check ${e.providerId}`,href:He,providerId:e.providerId}]);if(e.usage?.rateLimited)return ao(e,"PROVIDER_RATE_LIMITED",`${e.label} is temporarily rate limited.`,[{type:"recheck_provider",label:`Run hunsu-bridge provider check ${e.providerId}`,href:He,providerId:e.providerId}]);if(!e.capabilities.canExecute)return ao(e,"PROVIDER_CAPABILITY_MISSING",`${e.label} cannot execute Hunsu workspaces.`,[{type:"open_provider_setup",label:"Run hunsu-bridge provider status",href:He}])}function ol(e){if(!e)return Hi(void 0,"WORKSPACE_MISSING","Choose an active Workspace before starting Execute.");if(e.lifecycle==="inactive")return Hi(e.workspaceId,"WORKSPACE_INACTIVE","This Workspace is inactive. Activate it in Hunsu Bridge before starting Execute.");if(e.lifecycle==="missing")return Hi(e.workspaceId,"WORKSPACE_MISSING","This Workspace path is missing. Repair or remove it in Hunsu Bridge.");if(e.lifecycle==="needs_upgrade")return Hi(e.workspaceId,"WORKSPACE_NEEDS_UPGRADE","This Workspace needs an upgrade before Execute can start.");if(e.lifecycle==="error"||e.health==="error"||e.health==="unknown")return Hi(e.workspaceId,"WORKSPACE_UNHEALTHY","This Workspace needs attention before Execute can start.")}function Lh(e,t){return ol(e?jt(e,{provider:t}):void 0)}function ZC(e,t,r){let n=Vr(e),o=Wa(t.connections,n),i=o?.provider??r.provider,s=Wh(e.workspace?.workspaceId,r.workspace?.workspaceId),a=o?.workspaces.find(u=>u.workspaceId===s||u.roadmapId===s),d=o?.mode==="remote"?a:a??r.workspace;return ol(d)??Fa(i)}function il(e,t){let r=e.aliases;if(!e.modelSelection&&!r?.length)return;let n=sl(e,t);if(!n.ok){let s=In(n.error);return qr(s.error,s.backendId)}let o=n.value,i=kn({selection:e.modelSelection,aliases:r,backendId:o.backendId,inventories:o.providers});return i.ok?void 0:qr(i.error,i.backendId)}function sl(e,t){let r=Vr(e),n=Wa(t.connections,r);if(r.backendId&&!n)return qt(r.backendId,`Backend ${r.backendId} is not connected to this Bridge.`);if(r.remoteRequested&&!n)return qt("remote","No Remote Bridge backend is connected.");let o=t.connections.find(s=>s.mode==="local"),i=n??o;return nl({connections:t.connections,backendId:r.backendId??i?.backendId??"local"})}async function al(e,t,r){let n=ul(e,t);if(n)return n;let o=Vr(e),i=Wa(t.connections,o)??(o.remoteRequested?void 0:t.connections.find(u=>u.mode==="local")),s=i?Fa(i.provider):void 0;if(s)return s;let a=await r.providerInventory();if(!a.ok){let u=In(a.error);return qr(u.error,u.backendId)}let d=new Set;for(let u of await r.modelSelections()){if(!u.selection&&!u.aliases?.length)continue;let c=JSON.stringify(u);if(d.has(c))continue;d.add(c);let m=kn({selection:u.selection,aliases:u.aliases,backendId:a.value.backendId,inventories:a.value.providers});if(!m.ok)return qr(m.error,m.backendId)}}function Uh(e,t){return e}function ja(e){return!!(e.backendId?.trim()||e.connectionMode||e.workspace?.backendId?.trim()||e.workspace?.connectionMode)}async function dl(e,t,r,n){let o=await t.current().status({env:r,force:!0});return n?ZC(n.body,n.status,{provider:o,workspace:e?jt(e,{provider:o}):void 0}):Lh(e,o)??Fa(o)}async function Fh(e){let t=$h(e.repositoryPath),r=e.roadmaps.find(n=>$h(n.repositoryPath)===t);return dl(r,e.registry,e.env,e.selected)}function Vr(e){let t=Wh(e.backendId,e.workspace?.backendId),r=t?eT(t)?"remote":"local":e.connectionMode??e.workspace?.connectionMode;return{backendId:t,connectionMode:r,remoteRequested:r==="remote"}}function ul(e,t){let r=Vr(e),n=Wa(t.connections,r);return jh({backend:n,backendId:r.backendId,remoteRequested:r.remoteRequested,accountSignedIn:t.account.signedIn,localBridgeConnected:t.connections.some(o=>o.mode==="local"&&o.connection.state==="connected")})}function jh(e){if(e.localBridgeConnected===!1&&!e.remoteRequested)return wn(e.backendId??"local","BRIDGE_NOT_CONNECTED","Hunsu Bridge is not connected.",[{type:"open_connection",label:"Run hunsu-bridge status",href:He}]);if(e.remoteRequested&&e.accountSignedIn===!1)return wn(e.backendId,"REMOTE_LOGIN_REQUIRED","Sign in to Hunsu before using Remote Bridge.",[{type:"open_connection",label:"Run hunsu-bridge login",href:He}]);if(!e.backend)return e.remoteRequested?wn(e.backendId,"REMOTE_NOT_CONNECTED","Remote Bridge is not connected.",[{type:"open_connection",label:"Run hunsu-bridge remote status",href:He}]):e.backendId?wn(e.backendId,"BRIDGE_NOT_CONNECTED",`Backend ${e.backendId} is not connected to this Bridge.`,[{type:"open_connection",label:"Run hunsu-bridge status",href:He}]):void 0;if(e.backend.connection.state!=="connected")return e.backend.connection.state==="login_required"?wn(e.backend.backendId,"REMOTE_LOGIN_REQUIRED","Sign in to Hunsu before using Remote Bridge.",[{type:"open_connection",label:"Run hunsu-bridge login",href:He}]):e.backend.mode==="remote"?wn(e.backend.backendId,"REMOTE_NOT_CONNECTED","Remote Bridge is offline or unavailable.",[{type:"open_connection",label:"Run hunsu-bridge remote status",href:He}]):wn(e.backend.backendId,"BRIDGE_NOT_CONNECTED","Hunsu Bridge is not connected.",[{type:"open_connection",label:"Run hunsu-bridge status",href:He}])}function Wa(e,t){if(t.backendId)return e.find(r=>r.backendId===t.backendId);if(t.connectionMode==="local")return e.find(r=>r.mode==="local");if(t.remoteRequested)return e.find(r=>r.mode==="remote"&&r.connection.state==="connected")??e.find(r=>r.mode==="remote")}function Wh(...e){return e.find(t=>t?.trim())?.trim()}function eT(e){return e==="remote"||e.startsWith("remote:")}function $h(e){return e.replace(/\\/g,"/").replace(/\/+$/,"")}function ao(e,t,r,n){return{area:"provider",providerId:e.providerId,error:t,message:r,actions:[{type:"open_provider_setup",label:"Run hunsu-bridge provider status",href:He,providerId:e.providerId},...n]}}function wn(e,t,r,n){return{area:"connection",backendId:e,error:t,message:r,actions:n}}function Hi(e,t,r){return{area:"workspace",workspaceId:e,error:t,message:r,actions:[{type:"open_workspaces",label:"Run hunsu-bridge workspace list",href:Oh},...e?[{type:"activate_workspace",label:`Run hunsu-bridge workspace inspect ${e}`,href:Oh,workspaceId:e}]:[]]}}async function Gh(e,t,r,n){return Vh(e,t,r,n,"/api")}async function qh(e,t,r,n){return Vh(e,t,r,n,"")}async function Vh(e,t,r,n,o){if(e.method==="GET"&&(r===`${o}/runs`||r===`${o}/executes`)){let i=n.runSummaries();return n.sendJson(t,200,{runs:i,executes:i.map(n.executeView)}),!0}if(e.method==="GET"&&(r===`${o}/runs/events`||r===`${o}/executes/events`))return n.streamLiveEvents(),!0;if(e.method==="POST"&&(r===`${o}/runs/start`||r===`${o}/executes/start`)){let i=await n.readJson(e),s=await tT(i,n);return s?(n.sendJson(t,409,s),!0):(n.sendJson(t,202,await n.startRun(i)),!0)}if(e.method==="POST"&&(r===`${o}/runs/pause`||r===`${o}/executes/pause`))return n.sendJson(t,202,await n.pauseRun(await n.readJson(e))),!0;if(e.method==="POST"&&(r===`${o}/runs/resume`||r===`${o}/executes/resume`)){let i=await n.resumeRun(await n.readJson(e));return i.ok?(n.sendJson(t,202,i.value),!0):(n.sendJson(t,409,i.error),!0)}return e.method==="POST"&&(r===`${o}/runs/stop`||r===`${o}/executes/stop`)?(n.sendJson(t,202,await n.stopRun(await n.readJson(e))),!0):e.method==="POST"&&(r===`${o}/runs/complete-move`||r===`${o}/executes/complete-move`)?(n.sendJson(t,202,await n.completeMove(await n.readJson(e))),!0):rT(e,t,r,n,o)}async function tT(e,t){let r=Uh(e,{localBridgeTokenPresent:t.localBridgeTokenPresent()}),n=ja(r)||r.modelSelection||r.aliases?.length||t.modelPreflight?await t.bridgeStatus():void 0,o=n?ul(r,n):void 0;if(o)return o;let i=n?il(r,n):void 0;if(i)return i;let s=t.modelPreflight?await t.modelPreflight(r):void 0;if(s)return s;if(t.roadmapId){let a=t.managedRoadmaps().find(d=>d.roadmapId===t.roadmapId);return dl(a,t.providerRegistry,t.env,n?{body:r,status:n}:void 0)}return Fh({repositoryPath:t.repositoryPath,registry:t.providerRegistry,roadmaps:t.managedRoadmaps(),env:t.env,selected:n?{body:r,status:n}:void 0})}function rT(e,t,r,n,o){if(e.method==="GET"&&r===`${o}/agent-sessions`)return n.sendJson(t,200,{sessions:n.agentSessions()}),!0;if(e.method==="GET"&&r===`${o}/agent-sessions/events`)return n.streamAgentSessionEvents(),!0;if(e.method==="GET"&&r.startsWith(`${o}/agent-sessions/`)){let i=nT(r.slice(`${o}/agent-sessions`.length));if(i?.action==="show"){let s=n.findAgentSession(i.sessionId);return n.sendJson(t,s?200:404,s?{session:s}:{error:`Unknown AgentSession: ${i.sessionId}`}),!0}if(i?.action==="events")return n.streamAgentSessionEvents(i.sessionId),!0}return!1}function nT(e){if(!e.startsWith("/"))return;if(e.endsWith("/events")){let r=e.slice(1,-7);return r?{action:"events",sessionId:decodeURIComponent(r)}:void 0}let t=e.slice(1);return t?{action:"show",sessionId:decodeURIComponent(t)}:void 0}async function Jh(e,t,r,n,o){return e.method==="GET"&&r==="/api/filesystem/roots"?(o.sendJson(t,200,{roots:o.browseRootEntries(o.cwd)}),!0):e.method==="GET"&&r==="/api/filesystem/browse"?(o.sendJson(t,200,o.browse(n.searchParams.get("path")??void 0,{cwd:o.cwd,rootId:n.searchParams.get("rootId")??void 0})),!0):e.method==="POST"&&r==="/api/filesystem/grants"?(o.sendJson(t,201,o.createGrant(await o.readJson(e),{cwd:o.cwd})),!0):!1}function zh(e){return{async readEndpointConfig(){let{host:t,port:r}=await yn(e).read();return{host:t,port:r}},async readCredential(){let t=await jr(e).read();return t?{controlToken:t.controlToken}:void 0}}}var En="X-Hunsu-Bridge-Control-Token";function ll(e={}){let t=e.paths??ft(e),r=e.fetchImpl??fetch,n=e.timeoutMs??2e3,o=e.stateReader??zh(t),i=async()=>{if(e.endpoint)return oT(e.endpoint);let s=await o.readEndpointConfig();return Ni(s.host,s.port)};return{endpoint:i,async probe(){return(await cl(r,await i(),n)).probe},async health(){try{return(await cl(r,await i(),n)).health}catch{return}},async request(s,a={}){let d;try{d=await i()}catch(v){return pr(v)}let u=a.timeoutMs??n,c=await cl(r,d,u);if(c.probe.state==="offline")return Ch();if(c.probe.state==="foreign-listener")return ee("BRIDGE_PORT_IN_USE","The configured Hunsu Bridge endpoint is in use by another service.");if(c.probe.state==="hunsu-unhealthy")return ee("BRIDGE_CONTROL_UNAVAILABLE",c.probe.status===void 0?"Hunsu Bridge health is unavailable.":`Hunsu Bridge health is unavailable (HTTP ${c.probe.status}).`);let m;try{m=await o.readCredential()}catch(v){return pr(v)}if(!m?.controlToken)return ee("BRIDGE_CONTROL_UNAUTHORIZED","Hunsu Bridge control credentials are missing.");let f;try{f=iT(s)}catch(v){return pr(v)}let p;try{p=await r(new URL(f,d),{method:a.method??"GET",headers:{[En]:m.controlToken,...a.body===void 0?{}:{"content-type":"application/json"}},...a.body===void 0?{}:{body:JSON.stringify(a.body)},redirect:"error",signal:AbortSignal.timeout(u)})}catch{return ee("BRIDGE_CONTROL_UNAVAILABLE","Hunsu Bridge was healthy, but the authenticated control request did not complete.")}if(p.status===401||p.status===403)return ee("BRIDGE_CONTROL_UNAUTHORIZED","Hunsu Bridge rejected the local control credential.");let g=await sT(p);return g||ee("BRIDGE_CONTROL_UNAVAILABLE",`Hunsu Bridge returned an invalid control response (HTTP ${p.status}).`)}}}async function cl(e,t,r){let n;try{n=await e(new URL("/health",t),{method:"GET",redirect:"error",signal:AbortSignal.timeout(r)})}catch{return{probe:{state:"offline"}}}let o=await n.json().catch(()=>{});return n.ok&&o?.ok===!0&&o.service==="hunsu-bridge"&&typeof o.version=="string"&&o.protocolVersion==="local-bridge-v1"?{probe:{state:"hunsu-healthy"},health:o}:o?.service==="hunsu-bridge"?{probe:{state:"hunsu-unhealthy",status:n.status}}:{probe:{state:"foreign-listener"}}}function Ni(e,t){if(!Kh(e))throw new b("BRIDGE_STATE_INVALID","Bridge control endpoint configuration must use a loopback host.");return`http://${e.includes(":")&&!e.startsWith("[")?`[${e}]`:e}:${t}`}function oT(e){let t;try{t=new URL(e)}catch(r){throw new b("BRIDGE_STATE_INVALID","Bridge control endpoint configuration is invalid.",{cause:r})}if(t.protocol!=="http:"&&t.protocol!=="https:")throw new b("BRIDGE_STATE_INVALID","Bridge control endpoint configuration must use HTTP or HTTPS.");if(!Kh(t.hostname))throw new b("BRIDGE_STATE_INVALID","Bridge control endpoint configuration must use a loopback host.");if(t.username||t.password)throw new b("BRIDGE_STATE_INVALID","Bridge control endpoint configuration must not contain credentials.");return t.pathname="/",t.search="",t.hash="",t.toString().replace(/\/$/,"")}function Kh(e){return e==="localhost"||e==="127.0.0.1"||e==="::1"||e==="[::1]"}function iT(e){if(!e.startsWith("/v1/control"))throw new b("BRIDGE_CONTROL_UNAVAILABLE","The Bridge control client may call only control API routes.");return e}async function sT(e){if(!(e.headers.get("content-type")??"").toLowerCase().includes("application/json"))return;let r=await e.json().catch(()=>{});if(!(!r||r.schema!==Oa||typeof r.ok!="boolean"||typeof r.code!="string"||typeof r.message!="string"))return r}var Oy=gT(aT),vT=Be(Qe(pT(import.meta.url)),"../../.."),Xh="# HUNSU-MANAGED-CODEX-ENVIRONMENT v1",Wl=".hunsu-materialized-skill",co=".hunsu-prev",xn=".hunsu-request",Gi=["destinations.json","harness.json","executors.json","resources.json","artifact-actions.json"],hT=Gi.map(e=>`${co}/${e}`),Bi=Gi.map(e=>`${xn}/${e}`),yT=[...hT,...Bi],$y="check-command",ST="Hello World Web Project",RT=["Create a minimal Hello World web project from this empty checkout.","Add the smallest practical web app files, package scripts, and run instructions needed to launch it locally through an Artifact Action from a clean checkout.","Keep the implementation simple and verify the project can be started or built with a concrete command."].join(" "),kT=[{id:"destination_001",title:"Create a runnable Hello World web app",acceptanceCriteria:["The repository contains a minimal runnable web app.","The app renders Hello World or an equivalent visible greeting in a browser.","A documented package script starts or builds the hosted action surface."],constraints:["Prefer the smallest static or Vite-style implementation that is easy to inspect.","Do not add unrelated product features."],priority:100}],IT=["Act as Faker, a pragmatic engineer.","Build the smallest working web project that satisfies the goal, prefer simple conventional files and scripts, and verify the result with concrete commands."].join(" "),wT=["Act as Keria, a careful reviewer.","Verify the completed web project against the goal with concrete evidence, and call out any missing run or build proof."].join(" "),Yh="Plan the smallest ExecutionPlan needed for the available engineer Member to create and verify the Hello World web project.",Ja=`
|
|
77
|
+
...[truncated]`,Vt=8*1024,Y=128*1024,Jt=32*1024,ET=100,PT=256*1024,Ly=50,Uy=256*1024,AT=512*1024,bT=256*1024,xT=1024*1024,CT=250,TT=300,DT=900*1e3,kl=256*1024,Il=new WeakMap,$i=bh(),_T="hunsuBridgeToken",wl="x-hunsu-bridge-token",MT="x-hunsu-bridge-control-token",HT=900*1e3,NT=["http://127.0.0.1:19688","http://localhost:19688"];async function Gl(e,t){let r=typeof e=="function"?await e(t):e,n=r.ok?r.value.backendId:r.error.backendId,o=Vr(t);return o.backendId&&n!==o.backendId?qt(o.backendId,`Provider inventory backend ${n} does not match selected backend ${o.backendId}.`):!o.backendId&&o.connectionMode==="remote"&&n==="local"?qt("remote","A remote backend selection requires a remote provider inventory."):!o.backendId&&o.connectionMode!=="remote"&&n!=="local"?qt("local",`Provider inventory backend ${n} does not match the default local backend.`):r}function BT(e=[]){return{events:e,runs:{},agentSessions:{},hunsuDrafts:{},hunsuDraftArtifacts:{},filesystemCapabilities:{},liveSubscribers:new Set,agentSessionSubscribers:new Set}}function Fy(e,t){let r=e??Pr(hf(t)).webUrl;try{return new URL(r).toString()}catch{throw new Error(`Invalid Studio web URL: ${r}`)}}function OT(e){let t=process.platform==="darwin"?"open":process.platform==="win32"?"cmd":"xdg-open",r=process.platform==="win32"?["/c","start","",e]:[e];return new Promise((n,o)=>{let i=dT(t,r,{detached:!0,stdio:"ignore",windowsHide:!0});i.once("spawn",()=>{i.unref(),n()}),i.once("error",o)})}function ql(e){return OT(e)}function $T(e,t){let r=Cn(e,"host");return r?`http://${Gy(t.bridgeApi.host)?r.replace(/^(0\.0\.0\.0|\[::\])(?=:|$)/,"127.0.0.1"):r}`:hs(t.bridgeApi)}function LT(e,t){let r=typeof e?.controlToken=="function"?An(e.controlToken()):An(e?.controlToken),n=An(e?.authToken),o=Math.max(1,e?.pairingTokenTtlMs??HT),i=e?.pairingService??(r?Ba({controlToken:r,ttlMs:o,...n?{initialPairing:{credential:n,browserUrl:Fy(void 0,t.processEnv)}}:{}}):void 0);if(e?.pairingService&&n&&!e.pairingService.validate(n).valid)throw new Error("The supplied pairing service must own the explicit browser auth token.");return{authToken:i?void 0:n,controlToken:typeof e?.controlToken=="function"?e.controlToken:An(e?.controlToken),pairingService:i,allowedOrigins:qT([...NT,...WT(t.processEnv),...e?.allowedOrigins??[]].map(Wy).filter(s=>s!==void 0)),allowNoOrigin:e?.allowNoOrigin??!0,requirePairing:e?.requirePairing??!!(e?.authToken||i||e?.pairingValidator),pairingValidator:e?.pairingValidator}}function UT(e,t,r,n={}){let o=Cn(e,"origin"),i=FT(o,r);if(o&&i===void 0)return{allowed:!1,status:403,error:`Origin is not allowed for Hunsu Bridge: ${o}`,code:"origin_not_allowed",corsHeaders:Gt()};if(!o&&!r.allowNoOrigin)return{allowed:!1,status:403,error:"Requests without an Origin header are not allowed.",code:"origin_missing",corsHeaders:Gt()};let s=i??Gt(),a=!n.skipAuth&&r.requirePairing&&!wh(t.pathname)?jT(e,t,r):{valid:!0};return a.valid?{allowed:!0,corsHeaders:s}:{allowed:!1,status:401,error:a.error,code:a.code,corsHeaders:s}}function FT(e,t){if(!e)return Gt();let r=Wy(e);if(!(!r||!t.allowedOrigins.includes(r)))return{...Gt(),"access-control-allow-origin":r}}function Qh(e,t){let r=typeof t.controlToken=="function"?An(t.controlToken()):t.controlToken;if(!r)return{allowed:!1,status:404,error:"Bridge control endpoint is not enabled.",code:"bridge_control_unavailable",corsHeaders:Gt()};let n=Cn(e,MT);return!n||!jy(n,r)?{allowed:!1,status:401,error:"Missing or invalid Hunsu Bridge control token.",code:"bridge_control_token_invalid",corsHeaders:Gt()}:{allowed:!0,corsHeaders:Gt()}}function jT(e,t,r){let n=r.authToken,i=Cn(e,"authorization")?.match(/^Bearer\s+(.+)$/i)?.[1]?.trim(),s=Cn(e,wl),a=t.searchParams.get(_T)??void 0,d=[i,s,a].find(c=>c!==void 0);if(d===void 0)return{valid:!1,code:"pairing_token_missing",error:"Missing Hunsu Bridge pairing token."};let u=r.pairingService?.validate(d)??r.pairingValidator?.(d);if(u?.valid)return{valid:!0};if(u?.valid===!1||!n||!jy(d,n)){let c=u?.valid===!1?u.reason:"invalid";return{valid:!1,code:c==="expired"?"pairing_token_expired":c==="revoked"?"pairing_token_revoked":"pairing_token_invalid",error:c==="expired"?"Hunsu Bridge pairing token expired. Pair again with `hunsu-bridge pair`.":c==="revoked"?"Hunsu Bridge pairing token was revoked. Pair again with `hunsu-bridge pair`.":"Invalid Hunsu Bridge pairing token."}}return{valid:!0}}function jy(e,t){let r=Buffer.from(e),n=Buffer.from(t);return r.length===n.length&&fT(r,n)}function Cn(e,t){let n=(e.headers??{})[t.toLowerCase()];return Array.isArray(n)?n[0]:n}function WT(e){let t=An(e.HUNSU_WEB_PORT),r=An(e.HUNSU_WEB_HOST);return[...GT(e.HUNSU_BRIDGE_ALLOWED_ORIGINS),t?`http://127.0.0.1:${t}`:void 0,t?`http://localhost:${t}`:void 0,r&&t&&!Gy(r)?`http://${r}:${t}`:void 0].filter(n=>n!==void 0)}function GT(e){return e?.split(",").map(t=>t.trim()).filter(Boolean)??[]}function Wy(e){if(e?.trim())try{return new URL(e.trim()).origin}catch{return}}function An(e){return e?.trim()?e.trim():void 0}function qT(e){return[...new Set(e)]}function Gy(e){return e==="0.0.0.0"||e==="::"||e==="[::]"}function ml(e){if(e.testRunner==="deterministic")return new El;let t=e.processEnv.HUNSU_CODEX_BINARY_PATH?.trim(),r=t&&e.codexAppServer.command==="codex"?t:e.codexAppServer.command;return un({clientOptions:{command:r,args:e.codexAppServer.args,environment:e.codexAppServer.environment},threadOptions:e.codexThreadOptions})}async function VT(e,t){let r=t?await wi(e,t,{lastRunUsage:qy(t)}):await $r({env:e});return{bridge:{connected:!0,version:st().bridgeVersion,protocolVersion:st().protocolVersion},runtimes:{codex:r},...t?.codexLogin?{codexLogin:t.codexLogin}:{},tools:{git:await Zh("git",["--version"]),node:await Zh(process.execPath,["--version"])}}}function JT(e){let t="account"in e?zT(e.account):void 0,r="rateLimits"in e?KT(e.rateLimits):void 0,n=["accountError"in e?e.accountError:void 0,"rateLimitsError"in e?e.rateLimitsError:void 0,e.error].filter(o=>typeof o=="string"&&o.trim().length>0);return{backend:e.backend,available:e.available,initialized:"initialized"in e?e.initialized!==void 0:void 0,auth:t?.auth,accountSummary:t?.summary,rateLimitSummary:r?.summary,rateLimited:r?.rateLimited,accountError:"accountError"in e?qa(e.accountError):void 0,rateLimitsError:"rateLimitsError"in e?qa(e.rateLimitsError):void 0,error:n.length>0?qa(n.join("; ")):void 0}}function zT(e){if(!za(e))return;let r={...za(e.account)?e.account:{},...e},n=r.requiresOpenaiAuth===!0,o=XT(r);return{auth:{state:n?"not_authenticated":"authenticated",method:o,access:o==="chatgpt"?"subscription":o==="api_key"||o==="access_token"?"usage_based":"unknown"},summary:n?void 0:{displayName:hr(r,["displayName","name","userName"]),email:hr(r,["email","userEmail"]),workspaceName:hr(r,["workspaceName","organizationName","orgName"]),planLabel:hr(r,["planLabel","plan","planType","subscriptionPlan"])}}}function KT(e){if(!za(e))return;let t=za(e.rateLimits)?e.rateLimits:{},r={...e,...t},n=hr(r,["rateLimitReachedType","rate_limit_reached_type"]),o=hr(r,["label","status","summary"])??(n&&n.toLowerCase()!=="none"?"Rate limited":"Available"),i=hr(r,["remainingLabel","remaining"]),s=r.rateLimited===!0||r.limited===!0||n!==void 0&&n.toLowerCase()!=="none"||/\brate.?limited\b|quota exceeded|temporarily unavailable|no remaining/i.test(`${o} ${i??""}`);return{summary:{label:o,resetAt:hr(r,["resetAt","reset_at"]),remainingLabel:i},rateLimited:s}}function XT(e){let t=`${hr(e,["authMethod","method","loginMethod","accountType","type"])??""}`.toLowerCase();return t.includes("chatgpt")||t.includes("subscription")?"chatgpt":t.includes("api")?"api_key":t.includes("access")?"access_token":"unknown"}function hr(e,t){for(let r of t){let n=e[r];if(typeof n=="string"&&n.trim())return qa(n.trim());if(typeof n=="number")return String(n)}}function qa(e){if(!e)return;let t=Re(e);return typeof t=="string"?t:void 0}function za(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}async function Zh(e,t){try{let{stdout:r,stderr:n}=await Oy(e,t,{timeout:2e3,windowsHide:!0}),o=`${r}
|
|
78
|
+
${n}`.trim().split(/\r?\n/).find(Boolean);return{installed:!0,binaryPath:e,version:o}}catch(r){return{installed:!1,binaryPath:e,error:r instanceof Error?r.message:String(r)}}}function qy(e){return Object.values(e.runs).filter(r=>r.lastRunUsage).sort((r,n)=>n.updatedAt.localeCompare(r.updatedAt))[0]?.lastRunUsage}function YT(e){if(e)return{inputTokens:e.input_tokens,cachedInputTokens:e.cached_input_tokens,outputTokens:e.output_tokens,reasoningTokens:e.reasoning_output_tokens}}var El=class{async runTeamPlanning(t){return{runId:t.runId,provider:"codex",providerThreadId:this.threadId(t.runId,"team"),providerTurnId:this.turnId(t.runId,"plan"),finalResponse:JSON.stringify({kind:"queue",id:"deterministic-e2e-execute",items:[{kind:"goal",stage:"needs_evaluation",id:"hello-world-web-app",assignee:{executorId:"faker",goal:"Create the smallest static Hello World web app with package scripts."},evaluator:{executorId:"keria",prompt:"Verify the static Hello World app files and scripts exist."},remainingAttempts:1,requires:"PrevMove"}]},null,2)}}async runMemberPath(t){return t.outputSchema?{runId:t.runId,provider:"codex",providerThreadId:this.threadId(t.runId,"evaluator"),providerTurnId:this.turnId(t.runId,t.memberPath.id),finalResponse:JSON.stringify(this.evaluateHelloWorldApp(t.repositoryPath),null,2)}:(QT(t.repositoryPath),{runId:t.runId,provider:"codex",providerThreadId:this.threadId(t.runId,"member"),providerTurnId:this.turnId(t.runId,t.memberPath.id),finalResponse:"Created a minimal static Hello World web app with index.html, package.json, and README.md."})}async runMoveFinalizer(t){return{runId:t.runId,provider:"codex",providerThreadId:this.threadId(t.runId,"finalizer"),providerTurnId:this.turnId(t.runId,`finalize-${t.moveId}`),finalResponse:["move: create runnable Hello World web app","",t.completionSummary,"","Evidence:",...t.pathOutputs.map(r=>`- ${r.pathId}: ${r.finalResponse??"completed"}`)].join(`
|
|
79
|
+
`)}}async prepareHunsuDraftSession(t){return{runId:t.runId,provider:"codex",providerThreadId:this.threadId(t.runId,"hunsu-draft")}}async runHunsuDraftTurn(t){return{runId:t.runId,provider:"codex",providerThreadId:t.providerThreadId??this.threadId(t.runId,"hunsu-draft"),providerTurnId:this.turnId(t.runId,"hunsu-draft-turn"),finalResponse:"Updated the decoded Hunsu request files. Run the supplied Draft check command to create a DiffArtifact."}}resumeRun(t){return this.runTeamPlanning(t)}pauseRun(t){return Promise.resolve()}stopRun(t){return Promise.resolve()}providerStatus(){return Promise.resolve({backend:"app-server",available:!0,initialized:{runner:"deterministic"}})}async*events(t){if(t.startsWith("hunsu-draft:")){yield*this.hunsuDraftEvents(t);return}yield{type:"runner.status.changed",runId:t,phase:"working",headline:"Deterministic E2E runner"}}async*hunsuDraftEvents(t){let r=this.threadId(t,"hunsu-draft"),n=this.turnId(t,"hunsu-draft-turn"),o=Date.now();yield{type:"runner.turn.started",runId:t,providerThreadId:r,providerTurnId:n,startedAtMs:o},await Pt(80),yield{type:"runner.item.started",runId:t,providerThreadId:r,providerTurnId:n,itemId:"reasoning_001",item:{id:"reasoning_001",type:"reasoning",raw:{type:"reasoning",id:"reasoning_001"}},startedAtMs:o+80},await Pt(80),yield{type:"runner.item.delta",runId:t,providerThreadId:r,providerTurnId:n,itemId:"reasoning_001",deltaKind:"reasoningSummary",delta:"Inspecting decoded request runtime files."},await Pt(80),yield{type:"runner.item.delta",runId:t,providerThreadId:r,providerTurnId:n,itemId:"reasoning_001",deltaKind:"reasoningText",delta:"Mapping the request to the editable Hunsu runtime surface."},await Pt(80),yield{type:"runner.item.completed",runId:t,providerThreadId:r,providerTurnId:n,itemId:"reasoning_001",item:{id:"reasoning_001",type:"reasoning",summary:["Inspecting decoded request runtime files."],content:["Mapping the request to the editable Hunsu runtime surface."],durationMs:240,raw:{type:"reasoning",id:"reasoning_001"}},completedAtMs:o+320},await Pt(80),yield{type:"runner.item.started",runId:t,providerThreadId:r,providerTurnId:n,itemId:"cmd_check_001",item:{id:"cmd_check_001",type:"commandExecution",command:"node --input-type=module -e <draft-check-command>",commandActions:[{type:"unknown",command:"node --input-type=module -e <draft-check-command>"}],raw:{type:"commandExecution",id:"cmd_check_001"}},startedAtMs:o+400},await Pt(80),yield{type:"runner.item.delta",runId:t,providerThreadId:r,providerTurnId:n,itemId:"cmd_check_001",deltaKind:"commandOutput",delta:`Draft check command completed.
|
|
80
|
+
`},await Pt(80),yield{type:"runner.item.completed",runId:t,providerThreadId:r,providerTurnId:n,itemId:"cmd_check_001",item:{id:"cmd_check_001",type:"commandExecution",status:"completed",command:"node --input-type=module -e <draft-check-command>",aggregatedOutput:`Draft check command completed.
|
|
81
|
+
`,durationMs:160,raw:{type:"commandExecution",id:"cmd_check_001",status:"completed"}},completedAtMs:o+560},await Pt(80),yield{type:"runner.item.started",runId:t,providerThreadId:r,providerTurnId:n,itemId:"file_change_001",item:{id:"file_change_001",type:"fileChange",changes:[{path:".hunsu-request/destinations.json",kind:"updated"}],raw:{type:"fileChange",id:"file_change_001"}},startedAtMs:o+640},await Pt(80),yield{type:"runner.item.completed",runId:t,providerThreadId:r,providerTurnId:n,itemId:"file_change_001",item:{id:"file_change_001",type:"fileChange",changes:[{path:".hunsu-request/destinations.json",kind:"updated"}],durationMs:80,raw:{type:"fileChange",id:"file_change_001"}},completedAtMs:o+720},await Pt(80),yield{type:"runner.item.started",runId:t,providerThreadId:r,providerTurnId:n,itemId:"assistant_001",item:{id:"assistant_001",type:"agentMessage",raw:{type:"agentMessage",id:"assistant_001"}},startedAtMs:o+800};for(let i of["Updated decoded Hunsu request files. ","DiffArtifact review is ready when the check output appears."])await Pt(60),yield{type:"runner.item.delta",runId:t,providerThreadId:r,providerTurnId:n,itemId:"assistant_001",deltaKind:"agentMessage",delta:i};yield{type:"runner.item.completed",runId:t,providerThreadId:r,providerTurnId:n,itemId:"assistant_001",item:{id:"assistant_001",type:"agentMessage",text:"Updated decoded Hunsu request files. DiffArtifact review is ready when the check output appears.",durationMs:120,raw:{type:"agentMessage",id:"assistant_001"}},completedAtMs:o+920},yield{type:"runner.turn.completed",runId:t,providerThreadId:r,providerTurnId:n,completedAtMs:o+940}}evaluateHelloWorldApp(t){let r=H(t,"index.html"),n=H(t,"package.json"),o=G(r)?Xt(r,"utf8"):"",i=G(n)?Xt(n,"utf8"):"",s=/hello\s+world/i.test(o),a=/"scripts"\s*:/.test(i);return s&&a?{type:"pass",summary:"The static Hello World web app files and package scripts are present.",reason:"",feedback:"",nextGoal:"",evidence:["index.html renders Hello World","package.json defines runnable scripts"]}:{type:"fail",summary:"",reason:"The Hello World app files are not complete yet.",feedback:"Create index.html with a visible Hello World greeting and package.json with scripts.",nextGoal:"Create the minimal static Hello World app files.",evidence:[s?"index.html greeting present":"index.html greeting missing",a?"package scripts present":"package scripts missing"]}}threadId(t,r){return`thread-${r}-${qe(Ge("sha256").update(t)).slice(0,12)}`}turnId(t,r){return`turn-${qe(Ge("sha256").update(`${t}:${r}`)).slice(0,12)}`}};function QT(e){vt(e,{recursive:!0}),At(H(e,"index.html"),["<!doctype html>",'<html lang="en">'," <head>",' <meta charset="utf-8">',' <meta name="viewport" content="width=device-width, initial-scale=1">'," <title>Hello World</title>"," </head>"," <body>"," <main>"," <h1>Hello World</h1>"," </main>"," </body>","</html>",""].join(`
|
|
82
|
+
`),"utf8"),At(H(e,"package.json"),`${JSON.stringify({scripts:{start:"python3 -m http.server 4173",build:`node -e "console.log('static build ok')"`}},null,2)}
|
|
83
|
+
`,"utf8"),At(H(e,"README.md"),["# Hello World","","Run `npm run start` to serve the static page or `npm run build` for a simple build check.",""].join(`
|
|
84
|
+
`),"utf8")}function Vy(e={}){let t=e.state??BT(),r=e.persist??!0,n=e.cwd??vT,o=e.runtimeConfig??Pr(vs(process.env,{cwd:n,roadmapRegistryPath:e.roadmapRegistryPath})),i={...o.processEnv},s={...o.codexAppServer,environment:{...o.codexAppServer.environment}},a=vh(i);fl(o,i,s,a);let d=e.roadmapRegistryPath??o.roadmapRegistryPath,u=e.runner??ml(o),c=e.runner===void 0,m=e.actionRunner,f=LT(e.security,o),p=ZT(e.controlStatus),g=Mc({providerStateStore:Nv(o.processEnv),codex:{env:()=>o.processEnv,loginState:t,onConfigure(R){a=R,fl(o,i,s,a),c&&(u=ml(o))}}}),v=e.providerService?Mh({service:e.providerService,fallback:g,env:()=>o.processEnv}):g,A=e.providerService?.onConfigurationChange(R=>{a=Gr(R),fl(o,i,s,a),c&&(u=ml(o))}),C=async(R,P)=>{if(e.providerInventory)return Gl(e.providerInventory,P);let L=await Wr({request:R,runtimeConfig:o,providerRegistry:v,managedRoadmaps:()=>je({roadmapRegistryPath:d})});return sl(P,L)},D=kh(async(R,P)=>{try{let L=Ih(R),q=L.pathname;if(e.controlRouteHandler&&await e.controlRouteHandler(R,P,L))return;let ve=Qh(R,f).allowed,z=UT(R,L,f,{skipAuth:R.method==="OPTIONS"||Qc(q)||ve});if($i.set(P,z.corsHeaders),R.method==="OPTIONS"){O(P,z.allowed?204:z.status??403,z.allowed?{}:{error:z.error??"Origin is not allowed.",code:z.code});return}if(!z.allowed){O(P,z.status??403,{error:z.error??"Bridge API request is not allowed.",code:z.code});return}if(R.method==="GET"&&Yc(q)){O(P,200,{ok:!0,service:"hunsu-bridge",version:st().bridgeVersion,protocolVersion:"local-bridge-v1"});return}if(Qc(q)){let y=Qh(R,f);if(!y.allowed){O(P,y.status??401,{error:y.error??"Bridge control request is not allowed.",code:y.code});return}if(R.method==="GET"&&q==="/api/bridge/control/status"){O(P,200,p);return}if(R.method!=="POST"){O(P,405,{error:"method_not_allowed"});return}if(q==="/api/bridge/control/shutdown"){O(P,202,{shuttingDown:!0}),setTimeout(()=>{try{D.close()}catch($e){if(!($e instanceof Error&&"code"in $e&&$e.code==="ERR_SERVER_NOT_RUNNING"))throw $e}},0);return}if(q==="/api/bridge/pairing/revoke"){let $e=f.pairingService;if(!$e){O(P,404,{error:"Bridge pairing is not enabled.",code:"pairing_unavailable"});return}let us=$e.revoke();O(P,202,{pairing:$e.getSafeMetadata(),revoked:us});return}let E=await We(R),_=f.pairingService;if(!_){O(P,404,{error:"Bridge pairing is not enabled.",code:"pairing_unavailable"});return}let $=typeof E.webUrl=="string"&&E.webUrl.trim()?E.webUrl:void 0,Oe=typeof E.roadmapId=="string"&&E.roadmapId.trim()?E.roadmapId:void 0,tr=new URL(Fy($,o.processEnv));if(Oe){let $e=tr.pathname.replace(/\/$/u,"");tr.pathname=`${$e.endsWith("/studio")?$e:"/studio"}/roadmaps/${encodeURIComponent(Oe)}`}let rr=_.rotate({browserUrl:tr.toString(),...Oe?{workspaceId:Oe}:{}});if(!rr.ok){O(P,400,{error:rr.error.message,code:rr.error.code});return}O(P,202,{bridgeApiUrl:$T(R,o),studioUrl:rr.value.internal.pairingUrl,authToken:rr.value.internal.credential,pairing:rr.value.safe});return}if(await Eh(R,P,q,L,{runtimeConfig:o,readJson:We,sendJson:O,responseHeaders:y=>$i.get(y)}))return;if(R.method==="GET"&&q==="/api/prerequisites"){O(P,200,await VT(o.processEnv,t));return}if(R.method==="GET"&&q==="/api/providers/inventory"){O(P,200,await C(R,{backendId:L.searchParams.get("backendId")??void 0}));return}if(R.method==="POST"&&(q==="/api/model-aliases/validate"||q==="/api/model-aliases/resolve")){let y=await We(R),E=await C(R,{backendId:y.backendId}),_=E.ok?kn({selection:y.modelSelection,aliases:y.aliases,backendId:E.value.backendId,inventories:E.value.providers}):In(E.error);O(P,200,_.ok?{ok:!0,backendId:_.backendId,resolved:_.resolved,provider:_.provider}:{ok:!1,backendId:_.backendId,error:_.error.error,message:_.error.message,actions:_.error.actions});return}if(await Lv(R,P,q,L,{providerRegistry:v,env:o.processEnv,codexLoginState:t,latestCodexRunUsage:()=>qy(t),legacyCodexStatus:async()=>u.providerStatus?await u.providerStatus():{backend:"sdk",available:!0},sanitizeLegacyCodexStatus:y=>JT(y),readJson:We,sendJson:O})||await ah(R,P,q,{studioConnectionStatus:()=>{let y=gS(n,{roadmapRegistryPath:d});return Bc({bridgeApiUrl:hs(o.bridgeApi),repositoryPath:n,roadmapId:y?.roadmapId,roadmapDisplayName:y?.displayName,runtimeConfig:o})},bridgeStatus:()=>Wr({request:R,runtimeConfig:o,providerRegistry:v,managedRoadmaps:()=>je({roadmapRegistryPath:d})}),account:()=>Xc(R,o),currentProvider:()=>Na(v,o.processEnv),remoteDevice:y=>Jv(o,y.account,y.status,y.provider),relay:()=>fr(R,o),deviceStore:Xv({relayRegistryPath:o.processEnv.HUNSU_RELAY_REGISTRY_PATH}),managedRoadmaps:()=>je({roadmapRegistryPath:d}),publishWorkspaceAccess:y=>zv(y,{setWorkspaceRemoteAccess:(E,_)=>cy(E,_,{roadmapRegistryPath:d})}),deactivateWorkspaceAccess:()=>Kv(je({roadmapRegistryPath:d}),{setWorkspaceRemoteAccess:(y,E)=>cy(y,E,{roadmapRegistryPath:d})}),headlessRemote:e.headlessRemote,connectRemote:y=>Ci(y,R,o,{relayRegistryPath:o.processEnv.HUNSU_RELAY_REGISTRY_PATH}),readJson:We,sendJson:O})||await uh(R,P,q,{bridgeStatus:()=>Wr({request:R,runtimeConfig:o,providerRegistry:v,managedRoadmaps:()=>je({roadmapRegistryPath:d})}),currentProvider:()=>Na(v,o.processEnv),managedRoadmaps:()=>je({roadmapRegistryPath:d}),addWorkspace:y=>rD(y,t,{persist:r,roadmapRegistryPath:d}),selectRepository:y=>{n=y},setWorkspaceLifecycle:(y,E)=>gl(y,E,{roadmapRegistryPath:d}),removeWorkspace:y=>uy(y,{roadmapRegistryPath:d}),recentRoadmaps:()=>cS({roadmapRegistryPath:d}),removeRoadmap:y=>uy(y,{roadmapRegistryPath:d}),activateRoadmap:y=>gl(y,"active",{roadmapRegistryPath:d}),deactivateRoadmap:y=>gl(y,"inactive",{roadmapRegistryPath:d}),inspectProject:y=>Xl(uo(y,t),{roadmapRegistryPath:d}),openRoadmap:y=>lS(y,t,{persist:r,roadmapRegistryPath:d}),inspectRoadmapPort:y=>a_(uo(y,t)),applyRoadmapPort:y=>fS(uo(y,t),t,{roadmapRegistryPath:d}),createRoadmap:y=>mS(y,t,{persist:r,roadmapRegistryPath:d}),readJson:We,sendJson:O})||await Jh(R,P,q,L,{cwd:n,browseRootEntries:Yl,browse:c_,createGrant:(y,E)=>m_(y,t,E),readJson:We,sendJson:O})||await Ph(R,P,q,{board:()=>J(t,{cwd:n,persist:r}),roadmapView:()=>ay(J(t,{cwd:n,persist:r})),events:()=>Dl(t,{cwd:n,persist:r}),repository:()=>Ne(n),selectRepository:y=>{let E=yS(y.cwd,t,{persist:r});return n=E.repository.root,E},worktree:()=>Ne(n),artifacts:()=>J(t,{cwd:n,persist:r}).artifacts,artifact:y=>dy(J(t,{cwd:n,persist:r}),y),artifactActions:y=>sy(y,R,P,{cwd:n,actionRunner:m,ambientEnv:o.processEnv,processEnv:o.processEnv,worktreeRoot:o.actionWorktreeRoot}),skills:()=>Qa(o.processEnv),moveDiff:y=>xl(J(t,{cwd:n,persist:r}),y,n),executeCommands:y=>Cl(wy(y),t,{cwd:n,persist:r}),decideLine:(y,E)=>Iy(y,E,t,{cwd:n,persist:r}),readJson:We,sendJson:O})||await Ah(R,P,q,{repositoryPath:y=>pS(y,{roadmapRegistryPath:d}),loadRoadmap:y=>d_(y,t,{persist:r,roadmapRegistryPath:d}),board:(y,E)=>J(t,{cwd:E,persist:r}),roadmapView:(y,E)=>ay(J(t,{cwd:E,persist:r})),events:(y,E)=>Dl(t,{cwd:E,persist:r}),repository:(y,E)=>Ne(E),worktree:(y,E)=>Ne(E),artifacts:(y,E)=>J(t,{cwd:E,persist:r}).artifacts,artifact:(y,E,_)=>dy(J(t,{cwd:E,persist:r}),_),artifactActions:(y,E,_)=>sy(y,R,P,{cwd:_,roadmapId:E,actionRunner:m,ambientEnv:o.processEnv,processEnv:o.processEnv,worktreeRoot:o.actionWorktreeRoot}),hunsuDrafts:(y,E,_)=>nD(y,R,P,t,{cwd:_,persist:r,roadmapId:E,runner:u,bridgeApiBaseUrl:hs(o.bridgeApi),bridgeApiAuthToken:f.authToken,apmSkillRegistryClient:e.apmSkillRegistryClient,routeWorktreeRoot:o.routeWorktreeRoot,providerInventory:$=>C(R,$)}),executes:(y,E,_)=>qh(R,P,y,{repositoryPath:_,roadmapId:E,providerRegistry:v,env:o.processEnv,managedRoadmaps:()=>je({roadmapRegistryPath:d}),bridgeStatus:()=>Wr({request:R,runtimeConfig:o,providerRegistry:v,managedRoadmaps:()=>je({roadmapRegistryPath:d})}),localBridgeTokenPresent:()=>!!Cn(R,wl),runSummaries:()=>po(t,_).filter($=>!$.roadmapId||$.roadmapId===E).map(Ye),executeView:$=>at($),modelPreflight:$=>vy($,t,{cwd:_,persist:r,providerInventory:Oe=>C(R,Oe)}),startRun:$=>hy($,t,{cwd:_,persist:r,roadmapId:E,runner:u,apmSkillRegistryClient:e.apmSkillRegistryClient,routeWorktreeRoot:o.routeWorktreeRoot,providerInventory:Oe=>C(R,Oe)}),pauseRun:$=>yy($,t,{cwd:_,persist:r,runner:u}),resumeRun:async $=>Sy($,t,{cwd:_,persist:r,runner:u,apmSkillRegistryClient:e.apmSkillRegistryClient,bridgeStatus:await Wr({request:R,runtimeConfig:o,providerRegistry:v,managedRoadmaps:()=>je({roadmapRegistryPath:d})}),providerInventory:Oe=>C(R,Oe)}),stopRun:$=>Ry($,t,{cwd:_,persist:r,runner:u}),completeMove:$=>ky($,t,{cwd:_,persist:r}),streamLiveEvents:()=>Ey(R,P,t,{cwd:_}),agentSessions:()=>$l(t,_).filter($=>iR($,E)).map(Ul),findAgentSession:$=>Ll(t,$,{cwd:_,roadmapId:E}),streamAgentSessionEvents:$=>Py(R,P,t,{cwd:_,roadmapId:E,sessionId:$}),readJson:We,sendJson:O}),skills:()=>Qa(o.processEnv),moveFileTree:(y,E,_,$)=>J_(J(t,{cwd:E,persist:r}),_,E,$),moveFileBlob:(y,E,_,$)=>K_(J(t,{cwd:E,persist:r}),_,E,$),moveDiff:(y,E,_)=>xl(J(t,{cwd:E,persist:r}),_,E),executeCommands:(y,E,_)=>Cl(wy(_),t,{cwd:E,persist:r}),decideLine:(y,E,_,$)=>Iy(_,$,t,{cwd:E,persist:r}),readJson:We,sendJson:O})||await Gh(R,P,q,{repositoryPath:n,providerRegistry:v,env:o.processEnv,managedRoadmaps:()=>je({roadmapRegistryPath:d}),bridgeStatus:()=>Wr({request:R,runtimeConfig:o,providerRegistry:v,managedRoadmaps:()=>je({roadmapRegistryPath:d})}),localBridgeTokenPresent:()=>!!Cn(R,wl),runSummaries:()=>po(t,n).map(Ye),executeView:y=>at(y),modelPreflight:y=>vy(y,t,{cwd:n,persist:r,providerInventory:E=>C(R,E)}),startRun:y=>hy(y,t,{cwd:n,persist:r,runner:u,apmSkillRegistryClient:e.apmSkillRegistryClient,routeWorktreeRoot:o.routeWorktreeRoot,providerInventory:E=>C(R,E)}),pauseRun:y=>yy(y,t,{cwd:n,persist:r,runner:u}),resumeRun:async y=>Sy(y,t,{cwd:n,persist:r,runner:u,apmSkillRegistryClient:e.apmSkillRegistryClient,bridgeStatus:await Wr({request:R,runtimeConfig:o,providerRegistry:v,managedRoadmaps:()=>je({roadmapRegistryPath:d})}),providerInventory:E=>C(R,E)}),stopRun:y=>Ry(y,t,{cwd:n,persist:r,runner:u}),completeMove:y=>ky(y,t,{cwd:n,persist:r}),streamLiveEvents:()=>Ey(R,P,t,{cwd:n}),agentSessions:()=>$l(t,n).map(Ul),findAgentSession:y=>Ll(t,y,{cwd:n}),streamAgentSessionEvents:y=>Py(R,P,t,{cwd:n,sessionId:y}),readJson:We,sendJson:O}))return;O(P,404,{error:"Not found"})}catch(L){let q=L instanceof Error?L.message:String(L);O(P,400,{error:q})}},{runtimeConfig:o});return A&&D.once("close",A),D}function ZT(e){let t=st();return{ok:!0,instanceId:e?.instanceId?.trim()||`bridge_instance_${mT(18).toString("base64url")}`,protocolVersion:t.protocolVersion,bridgeVersion:t.bridgeVersion,daemonPid:eD(e?.daemonPid)??process.pid,startedAt:e?.startedAt??new Date().toISOString(),state:"running"}}function eD(e){let t=typeof e=="string"&&/^\d+$/.test(e.trim())?Number(e):e;return typeof t=="number"&&Number.isInteger(t)&&t>0?t:void 0}function fl(e,t,r,n){tD(e.processEnv,gn({baseEnv:t,settings:n})),e.codexAppServer=Pr(To(e.processEnv,{...n.appServerCommand?{}:{command:r.command},...n.appServerArgs?{}:{args:r.args},environment:{...r.environment,...e.processEnv}}))}function tD(e,t){for(let r of Object.keys(e))delete e[r];for(let[r,n]of Object.entries(t))n!==void 0&&(e[r]=n)}function rD(e,t,r){let n=uo(e,t),o=Xl(n,{roadmapRegistryPath:r.roadmapRegistryPath});if(o.kind==="hunsu-roadmap")return lS({path:o.path,title:e.title},t,r);if(o.kind==="git-project")return fS({path:o.path,title:e.title??bt(o.path),goal:`Port ${bt(o.path)} into Hunsu.`},t,r);if(o.kind==="new-project")return mS({path:o.path,title:e.title??bt(o.path)},t,r);throw new Error(o.reason)}async function nD(e,t,r,n,o){if(t.method==="GET"&&e==="")return O(r,200,{drafts:bD(n,o)}),!0;if(t.method==="POST"&&e===""){let s=await We(t),a=await sD(s,n,o);return O(r,202,a),!0}let i=oD(e);if(!i)return!1;if(t.method==="GET"&&i.action==="show"){let s=Pl(n,i.draftSessionId,o);return O(r,s?200:404,s?{draft:s}:{error:`Unknown HUNSU Draft: ${i.draftSessionId}`}),!0}if(t.method==="POST"&&i.action==="messages"){let s=await We(t);return O(r,202,await Ky(i.draftSessionId,s,n,o)),!0}if(t.method==="POST"&&i.action==="diff-artifacts"){let s=await uD(i.draftSessionId,n,o);if(pD(t)){if(!s.diffArtifact)throw new Error("HUNSU Draft check command did not create a DiffArtifact.");return O(r,202,gD(s.diffArtifact)),!0}return O(r,202,s),!0}if(t.method==="GET"&&i.action==="diff-artifact"){let s=Pl(n,i.draftSessionId,o),a=s?Va(s.diffArtifacts[i.diffArtifactId]):void 0;return O(r,a?200:404,a?{diffArtifact:a}:{error:`Unknown HUNSU Draft DiffArtifact: ${i.diffArtifactId}`}),!0}if(t.method==="POST"&&i.action==="approve"){let s=await We(t);return O(r,202,await aD(i.draftSessionId,s,n,o)),!0}return t.method==="POST"&&i.action==="discard"?(O(r,202,await AD(i.draftSessionId,n,o)),!0):!1}function oD(e){let t=e.split("/").filter(Boolean).map(decodeURIComponent);if(t.length===1)return{action:"show",draftSessionId:t[0]};if(t.length===3&&t[1]==="diff-artifacts")return{action:"diff-artifact",draftSessionId:t[0],diffArtifactId:t[2]};if(t.length!==2)return;let r=t[1];if(r==="messages"||r==="diff-artifacts"||r==="approve"||r==="discard")return{action:r,draftSessionId:t[0]}}async function iD(e,t){if(!e.managerLock)return{manager:Jn()};if(e.managerLock.kind!=="manager")throw new Error(`HUNSU Draft managerLock must reference a manager package, got ${e.managerLock.kind}`);let r=await fi(e.managerLock,{origins:t.origins});if(r.manifest.kind!=="manager")throw new Error(`Hub package ${r.manifest.kind}/${r.manifest.key}@${r.manifest.version} is not a Manager package`);return{managerLock:{...r.lock},manager:Jy(r.manifest.manager)}}function Jy(e){let t=Bo(e,"Manager");if(!t.ok)throw new Error(t.error.message);return t.value}async function zy(e,t,r){if(e.modelSelection)return nm({backendId:"local",connectionMode:"local",modelSelection:e.modelSelection,aliases:r},{providerInventory:t.providerInventory},e.modelSelection)}async function sD(e,t,r){Vl(t,r.cwd);let n=J(t,r),o=tS(n,e),i=await iD(e,n),s=new Date().toISOString(),a=qD(t),d=DD(a),u=r.persist?tm(n,o.node,r.cwd):void 0,c=r.persist?vS(r.cwd,d,s,u,r.routeWorktreeRoot):QS(r.cwd,d,s),m=nS(o),f=CD(t,{kind:"source-protocol",repositoryPath:r.cwd,roadmapId:r.roadmapId,draftSessionId:a,value:xD(n,o,m),createdAt:s}),p={draftSessionId:a,roadmapId:r.roadmapId,repositoryPath:r.cwd,sourceLineId:String(o.line.id),sourceNodeId:String(o.node.id),sourceMoveId:o.move?String(o.move.id):void 0,routeId:d,worktree:c,agentSessionIds:[],sourceArtifactId:f.artifactId,currentArtifactId:f.artifactId,managerLock:i.managerLock,manager:i.manager,aliases:e.aliases,messages:[],diffArtifacts:{},status:"draft",createdAt:s,updatedAt:s};t.hunsuDrafts[p.draftSessionId]=p,lD(p,o.node,xe(r.cwd).runtime),await Xy(p,r),Sr(p,r,"Hunsu draft route start",yT);let g=zl(t,p,s);if(r.runner.prepareHunsuDraftSession){g.state={type:"starting",startedAt:s},Rr(g,s),Yt(t,g);try{let v=await zy(p.manager,r,p.aliases),A=n.requests.find(D=>D.id===o.line.requestId)??n.requests[0],C=await r.runner.prepareHunsuDraftSession({runId:`hunsu-draft:${p.draftSessionId}`,repositoryPath:iS(p,r),requestGoal:String(A?.goal??"No Roadmap request goal is available."),activeDestinations:Yr(n,p.sourceLineId).filter(Ir),selectedDestinationIds:tR(o.node.destinations),harness:o.node.harness,board:n,resolvedModelSelection:v?.provider,draftSessionId:p.draftSessionId,manager:p.manager,sourceArtifactId:p.sourceArtifactId,baseArtifactId:p.currentArtifactId,draftCheckCommand:Yy(p,r),sourceSnapshot:m,messages:oS(p),providerThreadId:p.providerThreadId});p.providerThreadId=C.providerThreadId??p.providerThreadId,Kt(t,p,C)}catch(v){throw sS(p,v),Sr(p,r,"Hunsu draft route failed"),Kt(t,p),v}}return e.message?.trim()?Ky(p.draftSessionId,{message:e.message},t,r):{draft:p,board:n}}async function Ky(e,t,r,n){let o=Jl(r,e,n),i=t.message?.trim();if(!i)throw new Error("HUNSU Draft message cannot be empty");let s=new Date().toISOString();iy(o,"user",i,s),Kt(r,o);let a=J(r,n),d=rS(a,o),u=a.requests.find(c=>c.id===d.line.requestId)??a.requests[0];try{let c=`hunsu-draft:${o.draftSessionId}`;await Xy(o,n);let m=await zy(o.manager,n,o.aliases),f=await HM(n.runner,c,r,o,()=>n.runner.runHunsuDraftTurn({runId:c,repositoryPath:iS(o,n),requestGoal:String(u?.goal??"No Roadmap request goal is available."),activeDestinations:Yr(a,o.sourceLineId).filter(Ir),selectedDestinationIds:tR(d.node.destinations),harness:d.node.harness,board:a,resolvedModelSelection:m?.provider,draftSessionId:o.draftSessionId,manager:o.manager,sourceArtifactId:o.sourceArtifactId,baseArtifactId:o.currentArtifactId,draftCheckCommand:Yy(o,n),sourceSnapshot:nS(d),messages:oS(o),userMessage:i,providerThreadId:o.providerThreadId}));o.providerThreadId=f.providerThreadId??o.providerThreadId;let p=f.finalResponse?.trim();p&&iy(o,"draft-agent",p,new Date().toISOString());let g=o.latestDiffArtifactId?o.diffArtifacts[o.latestDiffArtifactId]:void 0,v=!!(g&&p&&p.includes(`diffArtifactId="${g.diffArtifactId}"`));return(!g||!v||g.status!=="pass")&&(o.status=o.status==="failed"||o.status==="ready"?"draft":o.status,o.readyDraft=void 0),o.error=void 0,o.updatedAt=new Date().toISOString(),Kt(r,o,f),Sr(o,n,"Hunsu draft route message",Bi),{draft:o,board:J(r,n)}}catch(c){throw sS(o,c),Sr(o,n,"Hunsu draft route failed"),Kt(r,o),c}}async function aD(e,t,r,n){let o=Jl(r,e,n),i=t.diffArtifactId?.trim();if(!i)throw new Error("Confirm HUNSU requires a DiffArtifact id");let s=o.diffArtifacts[i];if(!s)throw new Error(`Unknown HUNSU Draft DiffArtifact: ${i}`);if(s.status!=="pass"||!s.readyDraft)throw new Error(s.failedReason??`HUNSU Draft DiffArtifact ${i} is not ready for approval`);if(Qy(o)!==s.draftSurfaceHash)throw new Error("HUNSU Draft request files changed after this DiffArtifact was created. Ask the Draft agent to check the request files again.");let d=dD(s.readyDraft,t.teamName,J(r,n)),u={type:"ConfirmHunsuDraft",draft:d,actor:"DIRECTOR",at:new Date().toISOString()},c=n.persist?await da(u,{cwd:n.cwd,commitMessage:`Hunsu intervention ${d.hunsuId}`}):await Dn(u,r,{cwd:n.cwd,persist:!1});n.persist&&(r.events=xe(n.cwd).events),s.readyDraft=d,o.readyDraft=d,o.latestDiffArtifactId=s.diffArtifactId,o.status="confirmed",o.updatedAt=new Date().toISOString();let m=c.board.hunsus.find(f=>String(f.id)===String(d.hunsuId));return m&&(o.confirmedHunsuId=String(m.id),o.confirmedNodeId=String(m.toNodeId)),Sr(o,n,`Hunsu draft route confirmed ${d.hunsuId}`),Kt(r,o),{draft:o,board:c.board,acceptedEvents:c.acceptedEvents,hunsu:m}}function dD(e,t,r){let n=t?.trim();if(t!==void 0&&!n)throw new Error("teamName must be a non-empty string");let o=n?F(ke(n)):e.newTeamName;if(r.lines.some(i=>i.teamName===o))throw new Error(`Team name is already used: ${o}`);return{...e,newTeamName:o,teamSnapshot:{...e.teamSnapshot,teamName:o}}}async function uD(e,t,r){let n=Jl(t,e,r),o=J(t,r),i=rS(o,n),s=new Date().toISOString(),a=Qy(n),d=yD(n,i.node,xe(r.cwd).runtime,s),u=d.changes;if(!u.ok){n.readyDraft=void 0,n.status=n.status==="failed"||n.status==="ready"?"draft":n.status,n.error=u.errors[0];let g=pl(n,{status:"failed",summary:u.summary,files:u.files,errors:u.errors,failedReason:u.errors[0],checkedAt:s,draftSurfaceHash:a});return n.updatedAt=s,Sr(n,r,"Hunsu draft route diff artifact failed",Bi),Kt(t,n),{draft:n,board:o,diffArtifact:Va(g)}}if(!d.validation)throw new Error("HUNSU Draft DiffArtifact succeeded without a validated runtime bundle");let c=WD(n,u,o,i,d.validation,n.providerThreadId,s),m={type:"ConfirmHunsuDraft",draft:c,actor:"DIRECTOR",at:s},f=cD(Dl(t,r),m);if(!f.ok){n.readyDraft=void 0,n.status=n.status==="ready"?"draft":n.status,n.error=f.error;let g=pl(n,{status:"failed",summary:u.summary,files:u.files,errors:[f.error],failedReason:f.error,checkedAt:s,draftSurfaceHash:a});return n.updatedAt=s,Sr(n,r,"Hunsu draft route diff artifact failed",Bi),Kt(t,n),{draft:n,board:o,diffArtifact:Va(g)}}n.readyDraft=c,n.status="ready",n.error=void 0;let p=pl(n,{status:"pass",summary:u.summary,files:u.files,errors:[],checkedAt:s,draftSurfaceHash:a,readyDraft:c});return n.updatedAt=s,Sr(n,r,"Hunsu draft route diff artifact created",Bi),Kt(t,n),{draft:n,board:o,diffArtifact:Va(p)}}function cD(e,t){let r=Qo(e,t);if(!r.ok)return{ok:!1,error:r.error.message};let n=Dr(r.value);return n.ok?{ok:!0,board:n.value}:{ok:!1,error:n.error.message}}function lD(e,t,r){if(!e.worktree||e.worktree.baseRef==="virtual")return;let n=Zy(r,t),o=Eg(n);for(let i of Gi)ey(H(e.worktree.path,co,i),o[i]),ey(H(e.worktree.path,xn,i),o[i])}async function Xy(e,t){if(!e.worktree||e.worktree.baseRef==="virtual")return;let r=Te("Prepare HUNSU Draft Manager resources.");r.members=[Je(String(e.manager.id),e.manager.promptTemplate.template,e.manager.skills,{kind:"worktree_write",network:"enabled"},{policy:"never"},e.manager.plugins)],await Ji(e.worktree.path,r,{phase:"member",executorId:String(e.manager.id),apmSkillRegistryClient:t.apmSkillRegistryClient})}function ey(e,t){vt(Qe(e),{recursive:!0}),At(e,`${JSON.stringify(t,null,2)}
|
|
85
|
+
`,"utf8")}function Yy(e,t){let r=`${t.bridgeApiBaseUrl}/api/roadmaps/${encodeURIComponent(t.roadmapId)}/hunsu/drafts/${encodeURIComponent(e.draftSessionId)}/diff-artifacts?response=${$y}`,n={"content-type":"application/json"};t.bridgeApiAuthToken&&(n.authorization=`Bearer ${t.bridgeApiAuthToken}`);let o=[`const url = ${JSON.stringify(r)};`,`const headers = ${JSON.stringify(n)};`,'const response = await fetch(url, { method: "POST", headers, body: "{}" });',"const text = await response.text();","console.log(text);","if (!response.ok) process.exit(1);"].join(" ");return`node --input-type=module -e ${mD(o)}`}function mD(e){return`'${e.replaceAll("'","'\\''")}'`}function pl(e,t){let r=fD(e.draftSessionId,t),n={diffArtifactId:r,draftSessionId:e.draftSessionId,...t};return e.diffArtifacts[r]=n,e.latestDiffArtifactId=r,n}function fD(e,t){return`hdd_${qe(Ge("sha256").update(lo({draftSessionId:e,status:t.status,summary:t.summary,files:t.files,errors:t.errors,failedReason:t.failedReason,checkedAt:t.checkedAt,draftSurfaceHash:t.draftSurfaceHash}))).slice(0,16)}`}function Va(e){if(e)return{diffArtifactId:e.diffArtifactId,draftSessionId:e.draftSessionId,status:e.status,newTeamName:e.readyDraft?String(e.readyDraft.newTeamName):void 0,files:e.files.map(hD),errors:e.errors,failedReason:e.failedReason,checkedAt:e.checkedAt,draftSurfaceHash:e.draftSurfaceHash}}function pD(e){return new URL(e.url??"/","http://localhost").searchParams.get("response")===$y}function gD(e){let t={draftSessionId:e.draftSessionId,diffArtifactId:e.diffArtifactId,marker:vD(e),checkedAt:e.checkedAt};return e.status==="pass"?{...t,status:"pass",changedFiles:e.files.map(r=>({path:r.path,kind:r.kind}))}:{...t,status:"failed",failedReason:e.failedReason??e.errors[0]??"HUNSU Draft DiffArtifact failed.",errors:e.errors}}function vD(e){return`::hunsu-diff{draftSessionId="${e.draftSessionId}" diffArtifactId="${e.diffArtifactId}" status="${e.status}"}`}function hD(e){return{path:e.path,kind:e.kind,diff:e.diff}}function Qy(e){let t=Ge("sha256");if(t.update(`draft:${e.draftSessionId}
|
|
86
|
+
`),!e.worktree||e.worktree.baseRef==="virtual")return t.update(`worktree:virtual-or-missing
|
|
87
|
+
`),qe(t);for(let r of[co,xn])for(let n of Gi){let o=H(e.worktree.path,r,n);t.update(`${r}/${n}\0`),t.update(G(o)?Xt(o,"utf8"):"<missing>"),t.update("\0")}return qe(t)}function yD(e,t,r,n){let o={draftSessionId:e.draftSessionId,sourceNodeId:e.sourceNodeId,requestDir:xn,previousDir:co,checkedAt:n};if(!e.worktree||e.worktree.baseRef==="virtual")return{changes:{...o,ok:!1,summary:"HUNSU Draft changes require a route worktree.",errors:["HUNSU Draft changes require a persisted route worktree."],files:[]}};let i=Zy(r,t),s=Wu(e.worktree.path,co),a=Wu(e.worktree.path,xn),d=[...s.ok?[]:[s.error.message],...a.ok?[]:[a.error.message]];if(d.length>0||!s.ok||!a.ok)return{changes:{...o,ok:!1,summary:"HUNSU Draft runtime files have validation errors.",errors:d,files:[]}};let u=Pg(s.value,a.value,i);if(!u.ok)return{changes:{...o,ok:!1,summary:"HUNSU Draft runtime files have validation errors.",errors:[u.error.message],files:[]}};let c=SD(u.value.previous,u.value.request);return c.length===0?{changes:{...o,ok:!1,summary:"No runtime file changes detected.",errors:["No runtime file changes detected in .hunsu-request."],files:[]},validation:u.value}:{changes:{...o,ok:!0,summary:kD(c),errors:[],files:c},validation:u.value}}function Zy(e,t){let r=lt(t.harnessGraph),n=new Map(e.resources.bindings.map(o=>[o.destinationId,o]));return{...ne(e),destinations:{schema:"hunsu.destinations.v1",order:"queue-head-is-current",destinations:t.destinations.map(o=>ne(o)),compatibility:{events:e.eventLog.events.map(o=>ne(o)),updatedAt:e.eventLog.updatedAt}},harness:{schema:"hunsu.harness.v1",origins:e.harness.origins?.map(o=>ne(o)),harness:{name:e.harness.harness.name,rootTeamId:r.rootTeamId,guardrails:r.guardrails.map(o=>ne(o)),lock:t.harnessLock?ne(t.harnessLock):ne(e.harness.harness.lock)}},executors:{schema:"hunsu.executors.v1",executors:r.executors.map(o=>ne(o))},resources:{schema:"hunsu.resources.v1",resources:r.resources.map(o=>ne(o)),bindings:t.destinations.map(o=>{let i=n.get(String(o.id));return{destinationId:String(o.id),executorPackageBindings:t.executorPackageBindings?.map(s=>ne(s))??ne(i?.executorPackageBindings),resourcePackageBindings:t.resourcePackageBindings?.map(s=>ne(s))??ne(i?.resourcePackageBindings)}})},artifactActions:{schema:"hunsu.artifact-actions.v1",order:"display-order",actions:t.artifactActions.map(o=>ne(o)).sort((o,i)=>o.displayOrder-i.displayOrder||String(o.id).localeCompare(String(i.id)))}}}function SD(e,t){let r=[];for(let n of Gi){let o=ty(e,n),i=ty(t,n);lo(o)!==lo(i)&&r.push({path:`${xn}/${n}`,kind:"updated",summary:RD(n,o,i),diff:ID(n,o,i)})}return r}function ty(e,t){switch(t){case"destinations.json":return e.destinations;case"harness.json":return e.harness;case"executors.json":return e.executors;case"resources.json":return e.resources;case"artifact-actions.json":return e.artifactActions}}function RD(e,t,r){switch(e){case"destinations.json":return ry("Destinations",t.destinations??[],r.destinations??[]);case"artifact-actions.json":return ry("Artifact Actions",t.actions??[],r.actions??[]);case"harness.json":return"Harness runtime changed.";case"executors.json":return"Executors runtime changed.";case"resources.json":return"Resources runtime changed."}}function ry(e,t,r){let n=new Set(t.map(u=>String(u.id))),o=new Set(r.map(u=>String(u.id))),i=[...o].filter(u=>!n.has(u)).length,s=[...n].filter(u=>!o.has(u)).length,a=r.filter(u=>n.has(String(u.id))).length===t.filter(u=>o.has(String(u.id))).length?r.filter(u=>n.has(String(u.id))).length:0,d=[i?`${i} added`:void 0,s?`${s} removed`:void 0,!i&&!s&&a?"content updated":void 0].filter(Boolean);return d.length>0?`${e} ${d.join(", ")}.`:`${e} changed.`}function kD(e){return e.length===1?e[0].summary:`${e.length} runtime files changed: ${e.map(t=>bt(t.path)).join(", ")}.`}function ID(e,t,r){let n=`${co}/${e}`,o=`${xn}/${e}`,i=oy(ny(t)),s=oy(ny(r)),a=wD(i,s),d=ED(a);return[`diff --git a/${n} b/${o}`,`--- a/${n}`,`+++ b/${o}`,...d.flatMap(u=>[`@@ -${u.oldStart},${u.oldCount} +${u.newStart},${u.newCount} @@`,...u.lines.map(c=>`${PD(c)}${c.text}`)])].join(`
|
|
88
|
+
`)}function ny(e){return`${JSON.stringify(e,null,2)}
|
|
89
|
+
`}function oy(e){let t=e.endsWith(`
|
|
90
|
+
`)?e.slice(0,-1):e;return t.length===0?[]:t.split(`
|
|
91
|
+
`)}function wD(e,t){let r=Array.from({length:e.length+1},()=>Array(t.length+1).fill(0));for(let d=e.length-1;d>=0;d-=1)for(let u=t.length-1;u>=0;u-=1)r[d][u]=e[d]===t[u]?r[d+1][u+1]+1:Math.max(r[d+1][u],r[d][u+1]);let n=[],o=0,i=0;for(;o<e.length||i<t.length;)o<e.length&&i<t.length&&e[o]===t[i]?(n.push({kind:"same",text:e[o]}),o+=1,i+=1):o<e.length&&(i>=t.length||r[o+1][i]>=r[o][i+1])?(n.push({kind:"remove",text:e[o]}),o+=1):i<t.length&&(n.push({kind:"add",text:t[i]}),i+=1);let s=1,a=1;return n.map(d=>d.kind==="same"?{kind:"same",text:d.text,oldLine:s++,newLine:a++}:d.kind==="remove"?{kind:"remove",text:d.text,oldLine:s++}:{kind:"add",text:d.text,newLine:a++})}function ED(e,t=3){let r=[];for(let[n,o]of e.entries()){if(o.kind==="same")continue;let i=Math.max(0,n-t),s=Math.min(e.length-1,n+t),a=r.at(-1);a&&i<=a.end+1?a.end=Math.max(a.end,s):r.push({start:i,end:s})}return r.map(n=>{let o=e.slice(n.start,n.end+1),i=o.flatMap(u=>"oldLine"in u?[u.oldLine]:[]),s=o.flatMap(u=>"newLine"in u?[u.newLine]:[]),a=o.filter(u=>u.kind!=="add").length,d=o.filter(u=>u.kind!=="remove").length;return{oldStart:i[0]??0,oldCount:a,newStart:s[0]??0,newCount:d,lines:o}})}function PD(e){return e.kind==="add"?"+":e.kind==="remove"?"-":" "}function ne(e){return e===void 0?e:JSON.parse(JSON.stringify(e))}async function AD(e,t,r){let n=eS(t,e,r);return n.status="discarded",n.updatedAt=new Date().toISOString(),Sr(n,r,"Hunsu draft route discarded"),Kt(t,n),{draft:n,board:J(t,r)}}function bD(e,t){return Vl(e,t.cwd),Object.values(e.hunsuDrafts).filter(r=>r.repositoryPath===t.cwd&&(!r.roadmapId||r.roadmapId===t.roadmapId)).sort((r,n)=>n.updatedAt.localeCompare(r.updatedAt))}function Pl(e,t,r){Vl(e,r.cwd);let n=e.hunsuDrafts[t];if(!(!n||n.repositoryPath!==r.cwd)&&!(n.roadmapId&&n.roadmapId!==r.roadmapId))return n}function Vl(e,t){if(!G(t))return;let r;try{r=j(t)}catch(o){if(o instanceof ie)return;throw o}let n="";try{n=w(["for-each-ref","--format=%(refname)","refs/heads/hunsu/routes"],{cwd:r})}catch(o){if(o instanceof ie)return;throw o}for(let o of n.split(/\r?\n/).map(i=>i.trim()).filter(Boolean)){let i;try{i=w(["show",`${o}:${si}`],{cwd:r})}catch(d){if(d instanceof ie)continue;throw d}let s=wg(i,`${o}:${si}`);if(!s.ok||s.value.schema!=="hunsu.hunsu-draft-route.v1"||s.value.repositoryPath!==r)continue;let a=e.hunsuDrafts[s.value.draftSessionId];a&&a.updatedAt>=s.value.updatedAt||(e.hunsuDrafts[s.value.draftSessionId]=HD(s.value))}}function eS(e,t,r){let n=Pl(e,t,r);if(!n)throw new Error(`Unknown HUNSU Draft: ${t}`);return n}function Jl(e,t,r){let n=eS(e,t,r);if(n.status==="confirmed"||n.status==="discarded")throw new Error(`HUNSU Draft ${t} is already ${n.status}`);return n}function tS(e,t){let r=t.sourceMoveId?e.moves.find(d=>String(d.id)===t.sourceMoveId):void 0,n=t.sourceNodeId?e.nodes.find(d=>String(d.id)===t.sourceNodeId):r?e.nodes.find(d=>String(d.id)===String(r.toNodeId)):void 0,o=t.sourceLineId?e.lines.find(d=>String(d.id)===t.sourceLineId):e.lines.find(d=>d.status==="active")??e.lines[0],i=n??(o?e.nodes.find(d=>String(d.id)===String(o.currentNodeId)):void 0)??e.nodes[0];if(!i)throw new Error("Cannot start HUNSU Draft without a source node");let s=t.sourceLineId?e.lines.find(d=>String(d.id)===t.sourceLineId):vH(e,i)??o;if(!s)throw new Error(`Cannot resolve route for HUNSU Draft source node ${i.id}`);let a=r??um(e,i);return{line:s,node:i,move:a}}function rS(e,t){return tS(e,{sourceLineId:t.sourceLineId,sourceNodeId:t.sourceNodeId,sourceMoveId:t.sourceMoveId})}function nS(e){return{sourceLineId:String(e.line.id),sourceNodeId:String(e.node.id),sourceMoveId:e.move?String(e.move.id):void 0,moveOrdinal:e.move?.ordinal??e.node.ordinal,teamName:String(e.line.teamName??e.node.teamName??""),summary:String(e.move?.summary??"Initial immutable Team Snapshot"),destinationSummaries:e.node.destinations.map(t=>({id:String(t.id),title:String(t.title),status:String(t.status)}))}}function xD(e,t,r){let n=e.requests.find(o=>o.id===t.line.requestId);return{kind:"source-protocol",request:n?{id:String(n.id),title:String(n.title),goal:String(n.goal)}:void 0,source:r,team:{lineId:String(t.line.id),teamName:String(t.line.teamName??t.node.teamName??r.teamName??""),currentNodeId:String(t.line.currentNodeId),moveOrdinal:r.moveOrdinal},destinations:t.node.destinations,harness:t.node.harness}}function CD(e,t){let r=TD(t.kind,t.value),n={...t,artifactId:r};return e.hunsuDraftArtifacts[r]=n,n}function TD(e,t){return`hda_${qe(Ge("sha256").update(lo({kind:e,value:t}))).slice(0,16)}`}function lo(e){if(e===null||typeof e!="object")return JSON.stringify(e);if(Array.isArray(e))return`[${e.map(lo).join(",")}]`;let t=e;return`{${Object.keys(t).sort().map(r=>`${JSON.stringify(r)}:${lo(t[r])}`).join(",")}}`}function oS(e){return e.messages.map(t=>({role:t.role,text:t.text,createdAt:t.createdAt}))}function iy(e,t,r,n=new Date().toISOString()){e.messages.push({messageId:`${e.draftSessionId}:msg:${String(e.messages.length+1).padStart(4,"0")}`,role:t,text:r,createdAt:n}),e.updatedAt=n}function DD(e){return`hunsu-draft:${e}`}function iS(e,t){return e.worktree?.path??t.cwd}function _D(e){return{kind:"Route",routeKind:"HunsuDraft",routeId:e.routeId,draftSessionId:e.draftSessionId,sourceLineId:e.sourceLineId,sourceNodeId:e.sourceNodeId,targetNodeId:e.confirmedNodeId,worktree:e.worktree}}function MD(e){return{schema:"hunsu.hunsu-draft-route.v1",draftSessionId:e.draftSessionId,roadmapId:e.roadmapId,repositoryPath:e.repositoryPath,routeId:e.routeId,sourceLineId:e.sourceLineId,sourceNodeId:e.sourceNodeId,sourceMoveId:e.sourceMoveId,sourceArtifactId:e.sourceArtifactId,currentArtifactId:e.currentArtifactId,managerLock:e.managerLock,manager:e.manager,aliases:e.aliases,confirmedHunsuId:e.confirmedHunsuId,confirmedNodeId:e.confirmedNodeId,status:e.status,readyDraft:e.readyDraft,latestDiffArtifactId:e.latestDiffArtifactId,diffArtifacts:e.diffArtifacts,worktree:e.worktree,updatedAt:e.updatedAt}}function HD(e){return{draftSessionId:e.draftSessionId,roadmapId:e.roadmapId,repositoryPath:e.repositoryPath,sourceLineId:e.sourceLineId,sourceNodeId:e.sourceNodeId,sourceMoveId:e.sourceMoveId,routeId:e.routeId,worktree:e.worktree,agentSessionIds:[],sourceArtifactId:e.sourceArtifactId,currentArtifactId:e.currentArtifactId,managerLock:e.managerLock,manager:Jy(e.manager),aliases:e.aliases,confirmedHunsuId:e.confirmedHunsuId,confirmedNodeId:e.confirmedNodeId,messages:[],readyDraft:e.readyDraft,latestDiffArtifactId:e.latestDiffArtifactId,diffArtifacts:e.diffArtifacts??{},status:e.status,createdAt:e.updatedAt,updatedAt:e.updatedAt}}function Sr(e,t,r,n=[]){if(!t.persist||!e.worktree||e.worktree.baseRef==="virtual")return;let o=H(e.worktree.path,si);vt(Qe(o),{recursive:!0}),At(o,mt(MD(e)).text,"utf8"),ND(e.worktree.path,r,[...n,si])}function ND(e,t,r){let n=r.filter(i=>G(H(e,i))||ES(e,i));if(!(n.length===0||(w(["add","--all","--",...n],{cwd:e}),!w(["status","--porcelain=v1","--",...n],{cwd:e}).trim())))return w(["commit","--only","-m",t,"--",...n],{cwd:e}),w(["rev-parse","--verify","HEAD"],{cwd:e}).trim()}function zl(e,t,r=new Date().toISOString()){let n={kind:"HunsuDraft",draftSessionId:t.draftSessionId},o=bS(n),i=e.agentSessions[o];if(i)return t.draftAgentSessionId=i.sessionId,t.activeAgentSessionId=i.sessionId,t.agentSessionIds.includes(i.sessionId)||t.agentSessionIds.push(i.sessionId),i;let s={sessionId:o,roadmapId:t.roadmapId,routeRef:_D(t),owner:n,state:{type:"waiting",reason:"Waiting for HUNSU Draft message"},messages:[],activeItemIds:[],revision:1,createdAt:r,updatedAt:r};return e.agentSessions[s.sessionId]=s,t.draftAgentSessionId=s.sessionId,t.activeAgentSessionId=s.sessionId,t.agentSessionIds.push(s.sessionId),Yt(e,s),s}function Kt(e,t,r){let n=t.draftAgentSessionId?e.agentSessions[t.draftAgentSessionId]:zl(e,t);if(!n)return;let o=t.updatedAt;r?.providerThreadId&&r.providerTurnId?n.provider={providerThreadId:r.providerThreadId,providerTurnId:r.providerTurnId}:t.providerThreadId&&!n.provider&&(n.provider={providerThreadId:t.providerThreadId,providerTurnId:"draft"});let i=OD(n,t);n.error=t.error,n.finalResponse=t.messages.at(-1)?.text,n.state=BD(t,n.provider),Rr(n,o),Yt(e,n);for(let s of i)CM(e,n,s)}function BD(e,t){return e.status==="failed"?{type:"failed",provider:t,error:e.error??"HUNSU Draft failed",completedAt:e.updatedAt}:e.status==="confirmed"||e.status==="discarded"?{type:"completed",provider:t,finalResponse:e.messages.at(-1)?.text,completedAt:e.updatedAt}:{type:"waiting",reason:e.status==="ready"?"Waiting for approval":"Waiting for HUNSU Draft message"}}function OD(e,t){let r=new Map(e.messages.map(o=>[o.itemId,o])),n=[];for(let o of t.messages){if(r.has(o.messageId))continue;let i=$D(e.sessionId,o);e.messages.push(i),n.push(i)}return n}function $D(e,t){return{sessionId:e,messageId:t.messageId,itemId:t.messageId,role:t.role==="user"?"user":t.role==="system"?"system":"assistant",type:`hunsuDraft.${t.role}`,status:"completed",title:t.role==="user"?"Prompt":"Reply",text:t.text,revision:1,createdAt:t.createdAt,updatedAt:t.createdAt,completedAt:t.createdAt}}function sS(e,t){e.status="failed",e.error=t instanceof Error?t.message:String(t),e.updatedAt=new Date().toISOString()}function LD(e,t,r){if(t.kind!=="registry-package"||t.registryKind!=="apm")throw new Error(`APM resolver returned unsupported metadata for ${r}`);if(t.name!==e.name||t.registry!==e.registry||t.package!==e.package||t.version!==e.version)throw new Error(`APM resolver returned a different skill lock for ${e.package}@${e.version}`);if(!t.integrity.trim()||!t.contentHash.trim())throw new Error(`APM resolver returned an incomplete skill lock for ${e.package}@${e.version}`);if(!jD(t.version))throw new Error(`APM resolver returned a non-exact version for ${e.package}: ${t.version}`)}function UD(e=fetch){return{async resolveSkill(t){let r=new URL("/v1/skills/resolve",t.registry);r.searchParams.set("package",t.package),r.searchParams.set("version",t.version);let n=await e(r);if(!n.ok)throw new Error(`APM registry failed to resolve ${t.package}@${t.version}: HTTP ${n.status}`);let o=await n.json(),i=Al(o,"APM resolve response"),s={kind:"registry-package",registryKind:"apm",name:Pn(typeof i.name=="string"&&i.name.trim()?i.name:t.name,"APM resolve response.name"),registry:Pn(typeof i.registry=="string"&&i.registry.trim()?i.registry:t.registry,"APM resolve response.registry"),package:Pn(i.package,"APM resolve response.package"),version:Pn(i.version,"APM resolve response.version"),integrity:Pn(i.integrity,"APM resolve response.integrity"),contentHash:Pn(i.contentHash,"APM resolve response.contentHash")};return LD(t,s,"APM resolve response"),s},async fetchSkillFiles(t){let r=new URL("/v1/skills/files",t.registry);r.searchParams.set("package",t.package),r.searchParams.set("version",t.version);let n=await e(r);if(!n.ok)throw new Error(`APM registry failed to fetch ${t.package}@${t.version}: HTTP ${n.status}`);let o=await n.json(),i=Al(o,"APM files response");if(i.integrity!==void 0&&i.integrity!==t.integrity)throw new Error(`APM integrity mismatch for ${t.package}@${t.version}`);if(i.contentHash!==void 0&&i.contentHash!==t.contentHash)throw new Error(`APM contentHash mismatch for ${t.package}@${t.version}`);let s=FD(i.files,"APM files response.files");if(t.contentHash.startsWith("sha256:")&&aS(s)!==t.contentHash)throw new Error(`APM contentHash mismatch for ${t.package}@${t.version}`);return s}}}function Pn(e,t){if(typeof e!="string"||!e.trim())throw new Error(`${t} must be a non-empty string`);return F(k(e.trim(),t))}function Al(e,t){if(!e||typeof e!="object"||Array.isArray(e))throw new Error(`${t} must be an object`);return e}function FD(e,t){if(!Array.isArray(e)||e.length===0)throw new Error(`${t} must be a non-empty array`);return e.map((r,n)=>{let o=Al(r,`${t}[${n}]`);return{path:Pn(o.path,`${t}[${n}].path`),text:typeof o.text=="string"?o.text:(()=>{throw new Error(`${t}[${n}].text must be a string`)})()}})}function aS(e){let t=Ge("sha256");for(let r of e)t.update(r.path),t.update("\0"),t.update(r.text),t.update("\0");return`sha256:${t.digest("hex")}`}function jD(e){return/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/.test(e)}function WD(e,t,r,n,o,i,s){let a=VD(r),d=F(Q(`${e.sourceLineId}/fork-${a}`)),u=$t(r);return{id:F(Do(e.draftSessionId)),status:"ready",sourceLineId:F(Q(e.sourceLineId)),sourceNodeId:F(he(e.sourceNodeId)),sourceMoveId:e.sourceMoveId?F(Ae(e.sourceMoveId)):void 0,target:{type:"node",id:F(he(e.sourceNodeId))},newTeamName:u,summary:F(yt(t.summary,"summary")),teamSnapshot:GD(o.requestRuntime,n.node,u),changedFiles:t.files.map(c=>({path:F(k(c.path,"changedFile.path")),kind:c.kind,summary:F(yt(c.summary,"changedFile.summary"))})),hunsuId:a,newLineId:d,conversationRef:{provider:"codex",threadId:i?F(k(i,"conversation.threadId")):void 0,conversationHash:F(_o(XS({draftSessionId:e.draftSessionId,sourceLineId:e.sourceLineId,sourceNodeId:e.sourceNodeId,at:s}))),contextHash:F(k(YS(r,n.node,e.draftSessionId),"conversation.contextHash")),worktreeHash:F(nn(hH(e.repositoryPath))),startedAt:e.createdAt,endedAt:s},createdAt:e.createdAt,updatedAt:s}}function GD(e,t,r){let n=e.resources.bindings.find(s=>t.destinations.some(a=>String(a.id)===s.destinationId)),o={rootTeamId:e.harness.harness.rootTeamId,executors:e.executors.executors.map(s=>ne(s)),resources:e.resources.resources.map(s=>ne(s)),guardrails:(e.harness.harness.guardrails??[]).map(s=>ne(s)),artifactActions:e.artifactActions.actions.map(s=>ne(s))},i=br(o);return{teamName:r,moveOrdinal:t.ordinal,destinations:e.destinations.destinations.map(s=>ne(s)),harness:i,harnessGraph:o,harnessLock:e.harness.harness.lock?ne(e.harness.harness.lock):void 0,executorPackageBindings:n?.executorPackageBindings?.map(s=>ne(s))??t.executorPackageBindings?.map(s=>ne(s)),resourcePackageBindings:n?.resourcePackageBindings?.map(s=>ne(s))??t.resourcePackageBindings?.map(s=>ne(s)),artifactActions:e.artifactActions.actions.map(s=>ne(s))}}function qD(e){let t=Object.keys(e.hunsuDrafts).reduce((r,n)=>{let o=n.match(/^hd(\d+)$/i);return o?Math.max(r,Number(o[1])):r},0);return`hd${String(t+1).padStart(4,"0")}`}function VD(e){let t=e.hunsus.reduce((r,n)=>{let o=String(n.id).match(/^H(\d+)$/i);return o?Math.max(r,Number(o[1])):r},0);return F(Rt(`H${String(t+1).padStart(4,"0")}`))}async function sy(e,t,r,n){let o=JD(e),i=o.split("/").filter(Boolean);if(t.method==="GET"&&i.length===1&&i[0]==="artifact-actions")return O(r,200,{actions:Ug(n.cwd)}),!0;if(t.method==="GET"&&i.length===1&&i[0]==="action-runs")return O(r,200,{runs:jg(n.cwd)}),!0;let s=XD(o);if(!s)return!1;if(s.resource==="action"&&s.action==="run"&&t.method==="POST"){let a=await We(t),d={...a,actionId:a.actionId??s.actionId};return a.dryRun?(O(r,200,{plan:zD(d,n)}),!0):(O(r,202,{run:KD(d,n)}),!0)}return s.resource==="run"&&s.action==="proxy"?(await YD(t,r,n.cwd,s.runId,s.alias,s.path),!0):s.resource==="run"&&t.method==="GET"&&s.action==="show"?(O(r,200,{run:mi(n.cwd,s.runId)}),!0):s.resource==="run"&&t.method==="POST"&&s.action==="stop"?(O(r,202,{run:Wg(n.cwd,s.runId,{runner:n.actionRunner,processEnv:n.processEnv})}),!0):!1}function JD(e){let t=e.split("/").filter(Boolean),r=t[0]==="api"?1:0,n=t.findIndex((o,i)=>i>=r&&(o==="artifact-actions"||o==="action-runs"));return n>=0?`/${t.slice(n).join("/")}`:e}function zD(e,t){return tc(dS(e,t))}function KD(e,t){return Fg(dS(e,t),{runner:t.actionRunner,processEnv:t.processEnv})}function dS(e,t){if(!e.actionId)throw new Error("Artifact Action run requires actionId");return{cwd:t.cwd,roadmapId:t.roadmapId,actionId:e.actionId,moveId:e.moveId,commit:e.commit,env:e.env,ambientEnv:t.ambientEnv,processEnv:t.processEnv,worktreeRoot:t.worktreeRoot}}function XD(e){if(!e.startsWith("/"))return;let t=e.slice(1).split("/");if(t[0]==="artifact-actions"&&t[1]&&t[2]==="runs"&&t.length===3)return{resource:"action",actionId:decodeURIComponent(t[1]),action:"run"};if(t[0]==="action-runs"&&t[1]){let r=decodeURIComponent(t[1]);if(t.length===2||t[2]==="")return{resource:"run",runId:r,action:"show"};if(t[2]==="stop"&&t.length===3)return{resource:"run",runId:r,action:"stop"};if(t[2]==="proxy"&&t[3])return{resource:"run",runId:r,action:"proxy",alias:decodeURIComponent(t[3]),path:`/${t.slice(4).map(n=>decodeURIComponent(n)).join("/")}`}}}async function YD(e,t,r,n,o,i){let a=mi(r,n).aliases?.[o];if(!a){O(t,404,{error:`Unknown Artifact Action alias: ${o}`});return}if(!a.directUrl){O(t,503,{error:`Artifact Action alias has no direct URL yet: ${o}`});return}let d=new URL(e.url??"/","http://localhost"),u=new URL(a.directUrl),c=u.pathname.replace(/\/$/,""),m=i==="/"?"/":`/${i.replace(/^\/+/,"")}`;u.pathname=`${c}${m}`.replace(/\/{2,}/g,"/"),u.search=d.search;let f=e.method==="GET"||e.method==="HEAD"?void 0:await QD(e),p=await fetch(u,{method:e.method,headers:ZD(e),body:f?new Uint8Array(f):void 0});t.statusCode=p.status;for(let[g,v]of p.headers)t_(g)||t.setHeader(g,v);t.end(Buffer.from(await p.arrayBuffer()))}async function QD(e){let t=[];for await(let r of e)t.push(Buffer.isBuffer(r)?r:Buffer.from(r));return Buffer.concat(t)}function ZD(e){let t=new Headers;for(let[r,n]of Object.entries(e.headers))n===void 0||e_(r)||t.set(r,Array.isArray(n)?n.join(", "):n);return t}function e_(e){return["host","connection","content-length","transfer-encoding","upgrade"].includes(e.toLowerCase())}function t_(e){return["connection","content-encoding","content-length","transfer-encoding","upgrade"].includes(e.toLowerCase())}function uS(e){if(e.length===0)return Tr();let t=Dr(e);if(!t.ok)throw new Error(t.error.message);return t.value}function r_(e,t,r={}){let n=r.cwd?i=>{if(!(i.type==="run.updated"&&!Fi(i.run,r.cwd))){if(i.type==="runs.snapshot"){let s=i.runs.filter(a=>Fi(a,r.cwd)).map(Ye);t({type:"runs.snapshot",runs:s,executes:s.map(at)});return}if(i.type==="run.updated"){let s=Ye(i.run);t({type:"run.updated",run:s,execute:at(s),board:i.board});return}t(i)}}:t;e.liveSubscribers.add(n);let o=(r.cwd?po(e,r.cwd):Object.values(e.runs)).map(Ye);return t({type:"runs.snapshot",runs:o,executes:o.map(at)}),()=>{e.liveSubscribers.delete(n)}}function n_(e,t,r={}){let n=r.cwd||r.roadmapId||r.sessionId?i=>{if(i.type==="agentSession.snapshot"){t({type:"agentSession.snapshot",sessions:i.sessions.filter(a=>go(a,e,r))});return}let s=Ll(e,i.sessionId,r);!s||!eN(i,s,e,r)||t(i)}:t;e.agentSessionSubscribers.add(n);let o=o_(e,r);return n({type:"agentSession.snapshot",sessions:o}),()=>{e.agentSessionSubscribers.delete(n)}}function o_(e,t){return(t.cwd?$l(e,t.cwd):oR(e)).filter(n=>go(n,e,t))}function ay(e){return{...e,roadmap:e,destinations:e.destinations,teams:e.lines,moves:e.moves,hunsus:e.hunsus}}function at(e){let t=Ye(e);return{...t,executeId:t.executeId,teamRouteId:t.lineId,selectedDestinationIds:t.selectedDestinationIds,statusLabel:Ol(t.status),outcomeLabel:t.outcome==="arrived"?"Arrived":t.outcome==="accident"?"Accident":void 0,memberEvaluations:t.memberEvaluations??[]}}function dy(e,t){return e.artifacts.find(r=>r.id===t)}function Ne(e=process.cwd()){let t=j(e),r=w(["status","--porcelain=v1","--branch"],{cwd:t}).split(/\r?\n/).filter(Boolean),n=r.find(i=>i.startsWith("## ")),o=r.filter(i=>!i.startsWith("## ")).map(i=>({status:i.slice(0,2),path:i.slice(3)}));return{root:t,branch:i_(n?n.slice(3):void 0),clean:o.length===0,changes:o}}function i_(e){return e?e.match(/^No commits yet on (.+)$/)?.[1]??e:"unknown"}function cS(e={}){let t=Tn(e).roadmaps.map(r=>Kl(r,e));return e.activeOnly===!1?t:t.filter(r=>r.lifecycle==="active")}function je(e={}){return cS({...e,activeOnly:!1})}function Kl(e,t={}){let r=Xl({path:e.repositoryPath},t);return r.kind==="missing-roadmap"?{...e,repositoryPath:r.path,health:r.health==="missing-path"?"missing":r.health,lifecycle:r.health==="missing-path"?"missing":"error",type:"missing",primaryAction:r.recommendedAction}:r.kind==="hunsu-roadmap"?{...e,roadmapId:r.roadmapId,displayName:r.displayName,repositoryPath:r.path,health:r.health,kind:"hunsu-roadmap",lifecycle:e.lifecycle==="inactive"?"inactive":r.health==="needs-upgrade"?"needs_upgrade":"active",localAccess:e.localAccess??{enabled:!0},remoteAccess:e.remoteAccess??{enabled:!1,scopes:[]},type:"roadmap",primaryAction:r.health==="ok"||r.health==="git-dirty"?"open":"repair"}:r.kind==="git-project"?{...e,repositoryPath:r.path,lastKnownBranch:r.branch??e.lastKnownBranch,health:"missing-runtime",kind:"git-project",lifecycle:e.lifecycle==="inactive"?"inactive":"error",type:"git-project",primaryAction:"repair"}:{...e,health:r.kind==="unsupported"?"unknown":"missing-runtime",lifecycle:e.lifecycle==="inactive"?"inactive":"error",type:r.kind==="unsupported"?"missing":"roadmap",primaryAction:r.kind==="unsupported"?"remove":"repair"}}function uy(e,t={}){let r=Tn(t),n=e.path?Kr(e.path):void 0,o=r.roadmaps.filter(s=>!(e.roadmapId&&s.roadmapId===e.roadmapId||n&&Kr(s.repositoryPath)===n)),i=o.length!==r.roadmaps.length;return i&&td({version:1,roadmaps:o},t),{removed:i,roadmaps:je(t)}}function gl(e,t,r={}){let n=e.roadmapId?.trim();if(!n)throw new Error("Roadmap id is required.");let o=Tn(r),i=new Date().toISOString(),s,a=o.roadmaps.map(d=>d.roadmapId!==n?d:(s={...d,lifecycle:t,localAccess:{enabled:t==="active"},remoteAccess:t==="active"?d.remoteAccess??{enabled:!1,scopes:[]}:{enabled:!1,scopes:d.remoteAccess?.scopes??[]},lastOpenedAt:t==="active"?i:d.lastOpenedAt},s));if(!s)throw new Error(`Unknown Roadmap: ${n}`);return td({version:1,roadmaps:a},r),{roadmap:Kl(s,r),roadmaps:je(r)}}function cy(e,t,r={}){let n=e.roadmapId?.trim();if(!n)throw new Error("Roadmap id is required.");let o=Tn(r),i,s=o.roadmaps.map(a=>{if(a.roadmapId!==n)return a;if(t.enabled&&a.lifecycle==="inactive")throw new Error(`Inactive Roadmap cannot be exposed over Remote Access: ${n}`);return i={...a,remoteAccess:{enabled:t.enabled,scopes:[...new Set(t.scopes)]}},i});if(!i)throw new Error(`Unknown Roadmap: ${n}`);return td({version:1,roadmaps:s},r),{roadmap:Kl(i,r),roadmaps:je(r)}}function Xl(e,t={}){let r=typeof e=="string"?e:e.path??e.cwd;if(!r?.trim())return{kind:"unsupported",path:"",reason:"Choose a folder before Hunsu can inspect it.",recommendedAction:"explain"};let n=Be(r),o=gS(n,t),i=pt(n);if(!i)return o?{kind:"missing-roadmap",path:n,roadmapId:o.roadmapId,displayName:o.displayName,health:"missing-path",reason:"This Roadmap was registered before, but its last known path is missing.",recommendedAction:"remove"}:R_(n)?{kind:"new-project",path:n,recommendedAction:"create"}:{kind:"unsupported",path:n,reason:"This path is not accessible from the local Bridge.",recommendedAction:"explain"};let s;try{s=Xr(i)}catch(d){return{kind:"unsupported",path:n,reason:d instanceof Error?d.message:"This path could not be inspected.",recommendedAction:"explain"}}if(!s.isDirectory())return{kind:"unsupported",path:i,reason:"Choose a folder, not a file.",recommendedAction:"explain"};let a=y_(i);if(a){let d=E_(a);if(Zl(a)||o){let c=ly(a),m=S_(a);return o&&!m?{kind:"missing-roadmap",path:a,roadmapId:o.roadmapId,displayName:o.displayName,health:"missing-runtime",reason:"This registered Roadmap is missing Hunsu runtime files.",recommendedAction:"repair"}:{kind:"hunsu-roadmap",path:a,roadmapId:o?.roadmapId??RS(a),displayName:o?.displayName??bt(a),health:m?c?.clean===!1?"git-dirty":"ok":"missing-runtime",recommendedAction:"open",stackHints:d}}let u=ly(a);return{kind:"git-project",path:a,branch:u?.branch,clean:u?.clean,stackHints:d,recommendedAction:"port"}}return I_(i)?{kind:"new-project",path:i,recommendedAction:"create"}:{kind:"unsupported",path:i,reason:"This folder is not a Git repository or an empty folder that Hunsu can initialize.",recommendedAction:"explain"}}function lS(e,t,r={}){let n=uo(e,t),o=n.path??n.cwd;if(!o?.trim())throw new Error("Roadmap path is required");let i=D_(o),s=Ne(i);return{roadmap:Li(s,n.title,r),repository:s,board:J(t,{cwd:s.root,persist:r.persist??!0})}}function mS(e,t,r={}){let n=uo(e,t),o=n.path??n.cwd;if(!o?.trim())throw new Error("Roadmap path is required");let i=yS(o,t,{persist:r.persist,forceRoot:!0});if(Zl(i.repository.root)){let u=Ne(i.repository.root),c=Li(u,n.title,r);return t.events=xe(i.repository.root).events,{roadmap:c,repository:u,board:J(t,{cwd:i.repository.root,persist:r.persist??!0})}}let s=Yu({cwd:i.repository.root,title:n.title?.trim()||ST,goal:RT,destinations:kT,harness:s_()}),a=Ne(i.repository.root),d=Li(a,n.title,r);return t.events=xe(i.repository.root).events,{roadmap:d,repository:a,board:s.board}}function s_(){let e=Te(Yh);return e.kind!=="team_execution_plan"?e:{...e,team:{promptTemplate:Vn(Yh)},members:[Je("faker",IT,[],{kind:"worktree_write",network:"disabled"},{policy:"on_request",reviewer:"auto_review"}),Je("keria",wT,[],{kind:"worktree_write",network:"disabled"},{policy:"never"})]}}function a_(e){let t=e.path??e.cwd;if(!t?.trim())throw new Error("Roadmap path is required");let r=Ku(t),n=r.isGitRepository?Xu({cwd:r.root,title:e.title,goal:e.goal,destinations:e.destinations}):void 0;return{port:r,plan:n}}function fS(e,t,r={}){let n=e.path??e.cwd;if(!n?.trim())throw new Error("Roadmap path is required");let o=Yu({cwd:n,title:e.title,goal:e.goal,destinations:e.destinations}),i=Ne(o.root),s=Li(i,e.title,r);return t.events=xe(o.root).events,{roadmap:s,repository:i,board:o.board,port:o}}function d_(e,t,r={}){let n=pS(e,r),o=Ne(n);return{roadmap:Li(o,void 0,r),repository:o,board:J(t,{cwd:o.root,persist:r.persist??!0})}}function pS(e,t={}){let r=Tn(t).roadmaps.find(n=>n.roadmapId===e);if(!r)throw new Error(`Unknown Roadmap: ${e}`);if(!G(r.repositoryPath))throw new Error(`Roadmap path is missing: ${r.repositoryPath}`);return r.repositoryPath}function u_(e=process.cwd()){return cm([pt(H(zt(),"code")),pt(ed()),pt(e),pt(process.cwd()),pt(zt())])}function Yl(e=process.cwd()){return u_(e).map(t=>({rootId:g_(t),path:t,label:h_(t)}))}function c_(e,t={}){let r=l_(e,t);if(!r.ok)throw new Error(r.error.message);return r.value}function l_(e,t={}){let r=Yl(t.cwd),n=t.rootId?r.find(m=>m.rootId===t.rootId):void 0;if(t.rootId&&!n)return S({code:"invalid_root",message:`Unknown filesystem browse root: ${t.rootId}`});let o=n??r[0],i=e?.trim()?e:o?.path;if(!i)return S({code:"no_roots",message:"No filesystem browse roots are available"});let s=n?[n.path]:r.map(m=>m.path),a=pt(i)??A_(i,s);if(!a||!bn(a,s))return S({code:"outside_root",message:`Folder is outside allowed browse roots: ${i}`});if(bl(a))return S({code:"protected_path",message:`Folder is protected from browsing: ${a}`});if(!Xr(a).isDirectory())return S({code:"not_directory",message:`Browse path is not a directory: ${a}`});let d=r.find(m=>bn(a,[m.path]));if(!d)return S({code:"outside_root",message:`Folder is outside allowed browse roots: ${i}`});let u=ji(a,{withFileTypes:!0}).filter(m=>m.isDirectory()).filter(m=>!x_(m.name)).filter(m=>!bl(H(a,m.name))).slice(0,TT).map(m=>{let f=H(a,m.name);return{kind:"directory",name:m.name,path:f,rootId:d.rootId,type:"directory",isGitRepository:G(H(f,".git")),isRoadmap:T_(f)}}).sort((m,f)=>Number(f.isRoadmap)-Number(m.isRoadmap)||Number(f.isGitRepository)-Number(m.isGitRepository)||m.name.localeCompare(f.name)),c=Qe(a);return l({path:a,parent:c!==a&&bn(c,[d.path])?c:void 0,rootId:d.rootId,roots:r,entries:u})}function m_(e,t,r={}){let n=f_(e,t,r);if(!n.ok)throw new Error(n.error.message);return n.value}function f_(e,t,r={}){let n=Yl(r.cwd),o=e.rootId?n.find(g=>g.rootId===e.rootId):void 0;if(e.rootId&&!o)return S({code:"invalid_root",message:`Unknown filesystem browse root: ${e.rootId}`});let i=o??n[0],s=e.path?.trim()?e.path:i?.path;if(!s)return S({code:"no_roots",message:"No filesystem browse roots are available"});let a=o?[o.path]:n.map(g=>g.path),d=b_(s,a);if(!d||!bn(d,a))return S({code:"outside_root",message:`Folder is outside allowed browse roots: ${s}`});if(bl(d))return S({code:"protected_path",message:`Folder is protected from browsing: ${d}`});if(G(d)&&!Xr(d).isDirectory())return S({code:"not_directory",message:`Browse grant path is not a directory: ${d}`});let u=n.find(g=>bn(d,[g.path]));if(!u)return S({code:"outside_root",message:`Folder is outside allowed browse roots: ${s}`});let c=new Date,m=new Date(c.getTime()+DT),f=v_(`${u.rootId}:${d}:${c.toISOString()}:${Ql(d).slice(0,16)}`),p={browseToken:f,rootId:u.rootId,path:d,displayPath:d,issuedAt:c.toISOString(),expiresAt:m.toISOString()};return t.filesystemCapabilities[f]=p,l({capability:p})}function uo(e,t){if(!e.browseToken)return e;let r=p_(e.browseToken,t);return{...e,path:r.path,cwd:r.path}}function p_(e,t){let r=t.filesystemCapabilities[e];if(!r)throw new Error("Filesystem browse token is unknown or expired.");if(Date.parse(r.expiresAt)<Date.now())throw delete t.filesystemCapabilities[e],new Error("Filesystem browse token has expired.");return r}function g_(e){return`root_${Ql(e).slice(0,16)}`}function v_(e){return`browse_${Ql(e).slice(0,32)}`}function h_(e){return e===zt()?"Home":e===ed()?"Temporary":bt(e)||e}function Ql(e){return qe(Ge("sha256").update(e))}function pt(e){try{return cT(e)}catch{return}}function y_(e){try{return j(e)}catch{return}}function ly(e){try{return Ne(e)}catch{return}}function S_(e){try{return di(e)}catch{return!1}}function gS(e,t={}){let r=Kr(e);return Tn(t).roadmaps.find(n=>Kr(n.repositoryPath)===r)}function R_(e){let t=k_(e);if(!t)return!1;try{return Xr(t).isDirectory()}catch{return!1}}function k_(e){let t=Be(e);for(;;){let r=Qe(t);if(r===t)return pt(t);let n=pt(r);if(n)return n;t=r}}function I_(e){try{return ji(e).filter(t=>!w_.has(t)).length===0}catch{return!1}}var w_=new Set([".DS_Store","Thumbs.db"]);function E_(e){let t=new Set,r=P_(H(e,"package.json"));if(r){t.add("Node");let n=new Set([...Object.keys(r.dependencies??{}),...Object.keys(r.devDependencies??{})]),o=Object.values(r.scripts??{}).join(`
|
|
92
|
+
`);(n.has("vite")||Ga(e,["vite.config.ts","vite.config.js","vite.config.mjs"])||/\bvite\b/.test(o))&&t.add("Vite"),(n.has("next")||Ga(e,["next.config.ts","next.config.js","next.config.mjs"]))&&t.add("Next.js"),n.has("react")&&t.add("React")}return Ga(e,["pyproject.toml","requirements.txt","setup.py","uv.lock"])&&t.add("Python"),G(H(e,"Cargo.toml"))&&t.add("Rust"),G(H(e,"go.mod"))&&t.add("Go"),Ga(e,["deno.json","deno.jsonc"])&&t.add("Deno"),[...t]}function Ga(e,t){return t.some(r=>G(H(e,r)))}function P_(e){if(G(e))try{return JSON.parse(Xt(e,"utf8"))}catch{return}}function A_(e,t){let r=Be(e);for(;;){let n=pt(r);if(n&&bn(n,t)&&Xr(n).isDirectory())return n;let o=Qe(r);if(o===r)return;r=o}}function b_(e,t){let r=Be(e),n=r;for(;;){let o=pt(n);if(o){if(!bn(o,t)||n!==r&&!Xr(o).isDirectory())return;let s=jl(n,r);return s.startsWith("..")||Oi(s)?void 0:Be(o,s)}let i=Qe(n);if(i===n)return;n=i}}function bn(e,t){return t.some(r=>e===r||e.startsWith(`${r}/`))}function x_(e){return e==="node_modules"||e===".git"||e===".cache"||e===".npm"||e===".pnpm-store"||e==="dist"||e==="build"||e==="out"||e==="target"||e==="coverage"||e==="__pycache__"||e.startsWith(".")}function bl(e){return Fl(e).split(/[\\/]/).filter(Boolean).some(r=>C_.has(r))}var C_=new Set([".ssh",".gnupg",".aws",".config",".local",".password-store","Library","AppData"]);function T_(e){return G(H(e,".git"))?Br.every(t=>G(H(e,t))):!1}function Zl(e){if(!G(H(e,".git")))return!1;try{return di(e)||w(["for-each-ref","--count=1","--format=%(refname)","refs/hunsu"],{cwd:e}).trim().length>0}catch{return!1}}function D_(e){let t=j(e);if(!Zl(t))throw new Error(`Not a Hunsu Roadmap. Use Hunsu Port or Create Roadmap first: ${t}`);return t}function qe(e){return e.digest("hex")}function F(e){if(e.ok)return e.value;throw new Error(e.error.message)}function mo(e,t){return F(ir(e,t))}function vS(e,t,r=new Date().toISOString(),n,o){let i=j(e),s=em(i,n),a=L_(t),d=qe(Ge("sha256").update(i)).slice(0,12),u=qe(Ge("sha256").update(JSON.stringify({root:i,routeId:t,baseRef:s,createdAt:r}))).slice(0,16),c=Be(o??H(ed(),"hunsu-routes",`${bt(i)}-${d}`)),m=H(c,a),f=`hunsu/routes/${a}`;return vt(c,{recursive:!0}),O_(i,f),G(m)&&Wi(m,{recursive:!0,force:!0}),w(["worktree","add","-b",f,m,s],{cwd:i}),{worktreeHash:F(nn(u)),path:F(k(m,"worktree.path")),branch:F(k(f,"worktree.branch")),baseRef:F(k(s,"worktree.baseRef")),createdAt:r}}function __(e,t,r=new Date().toISOString(),n,o){return vS(e,t,r,n,o)}function em(e,t){if(t)return w(["rev-parse","--verify",`${t}^{commit}`],{cwd:e}).trim();try{return w(["rev-parse","--verify","HEAD"],{cwd:e}).trim()}catch{return w(["commit","--allow-empty","-m","hunsu: initialize repository worktree"],{cwd:e}),w(["rev-parse","--verify","HEAD"],{cwd:e}).trim()}}function tm(e,t,r){let n=um(e,t);if(n?.commit)return M_(r,n.id)??n.commit;let o=t.source;if(o.type==="hunsu"){let i=e.nodes.find(s=>s.id===o.fromNodeId);if(i)return tm(e,i,r)}return em(r)}function M_(e,t){try{return w(["rev-parse","--verify",`refs/hunsu/moves/${t}^{commit}`],{cwd:e}).trim()}catch{return}}function rm(e,t){let r=j(e);return G(t.path)&&w(["worktree","remove","--force",t.path],{cwd:r}),{...t,removedAt:new Date().toISOString()}}function H_(e,t,r){let n=j(e);w(["update-ref",`refs/hunsu/moves/${t}`,r],{cwd:n})}function N_(e){let t=w(["status","--porcelain=v1","--",".hunsu"],{cwd:e}).trim();if(!t)return;let r=t.split(/\r?\n/).map(n=>n.slice(3).replace(/^"|"$/g,"")).filter(n=>n.startsWith(".hunsu/")&&(n.endsWith(".hunsu")||Br.includes(n)));if(r.length!==0)throw new Error(`Team modified Hunsu runtime files; refusing to trust agent-owned .hunsu changes: ${r.join(", ")}`)}function B_(e){let t=Ne(e).changes.map(r=>r.path).filter(r=>r===".hunsu"||r.startsWith(".hunsu/"));if(t.length!==0)throw new Error(`Team modified Hunsu control-plane files; refusing to commit agent-owned .hunsu changes: ${t.join(", ")}`)}function my(e,t){let r={schema:"hunsu.current-execution.v1",execution:t,updatedAt:new Date().toISOString()},n=H(e,it);vt(Qe(n),{recursive:!0}),At(n,mt(r).text,"utf8")}function fy(e){Wi(H(e,it),{force:!0})}function O_(e,t){try{w(["show-ref","--verify",`refs/heads/${t}`],{cwd:e})}catch{return}throw new Error(`Git branch already exists: ${t}`)}function $_(e){return e.replace(/[^A-Za-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"execute"}function L_(e){return e.split("/").map(t=>$_(t)).filter(Boolean).join("/")}function vl(e){try{w(["init","-b","main"],{cwd:e})}catch{w(["init"],{cwd:e})}py(e,"user.email","hunsu@example.invalid"),py(e,"user.name","Hunsu Studio")}function py(e,t,r){try{w(["config","--local","--get",t],{cwd:e})}catch{w(["config",t,r],{cwd:e})}}function xl(e,t,r=process.cwd()){let n=e.moves.find(u=>u.id===t);if(!n)throw new Error(`Unknown MOVE: ${t}`);let o=U_(e,n,r),i=o.baseCommit?["diff","--stat","--patch","--find-renames","--no-ext-diff",o.baseCommit,o.headCommit]:["show","--root","--stat","--patch","--find-renames","--format=medium","--no-ext-diff",o.headCommit],s=o.baseCommit?["diff","--name-status","--find-renames","-z",o.baseCommit,o.headCommit]:["diff-tree","--root","--no-commit-id","--name-status","--find-renames","-r","-z",o.headCommit],a=w(i,{cwd:r}),d=j_(s,a,r);return{moveId:t,commit:n.commit,headCommit:o.headCommit,baseCommit:o.baseCommit,baseMoveId:o.baseMoveId,files:d,tree:V_(d),text:d.map(u=>u.patch).filter(Boolean).join(`
|
|
93
|
+
`)}}function U_(e,t,r){let n=Gu(r,t.commit).map(s=>s.execution).find(s=>String(s.targetMoveId)===String(t.id)),o=n?.terminalPathCommit??n?.paths.slice().reverse().find(s=>s.commit)?.commit;if(n?.sourceMoveCommit&&o)return{headCommit:o,baseCommit:n.sourceMoveCommit,baseMoveId:n.sourceMoveId?String(n.sourceMoveId):void 0};let i=F_(e,String(t.id));return i?{headCommit:t.commit,baseCommit:i.commit,baseMoveId:String(i.id)}:{headCommit:t.commit}}function F_(e,t){let r=e.moves.find(a=>a.id===t);if(!r)return;let n=e.lines.find(a=>a.id===r.lineId),o=n?.moveIds.indexOf(r.id)??-1;if(n&&o>0){let a=n.moveIds[o-1];return e.moves.find(d=>d.id===a)}let s=e.nodes.find(a=>a.id===r.fromNodeId)?.source;if(s?.type==="move")return e.moves.find(a=>a.id===s.moveId)}function j_(e,t,r){let n=W_(w(e,{cwd:r})),o=q_(t);return n.map((i,s)=>({...i,patch:o[s]??""})).filter(i=>!Ka(i.path)&&(!i.oldPath||!Ka(i.oldPath)))}function W_(e){let t=e.split("\0").filter(Boolean),r=[];for(let n=0;n<t.length;){let o=t[n++]??"";if(!o)continue;let i=G_(o);if(o.startsWith("R")||o.startsWith("C")){let a=t[n++],d=t[n++];a&&d&&r.push({path:d,oldPath:a,kind:i});continue}let s=t[n++];s&&r.push({path:s,kind:i})}return r}function G_(e){return e.startsWith("A")?"added":e.startsWith("D")?"removed":e.startsWith("R")?"renamed":e.startsWith("C")?"copied":e.startsWith("T")?"typeChanged":"modified"}function q_(e){let t=[],r;for(let n of e.split(/\r?\n/)){if(n.startsWith("diff --git ")){r&&t.push(r.join(`
|
|
94
|
+
`)),r=[n];continue}r&&r.push(n)}return r&&t.push(r.join(`
|
|
95
|
+
`)),t}function V_(e){let t=[],r=new Map,n=(i,s)=>{let a=r.get(i);if(a)return a;let d={kind:"directory",name:s,path:i,changedFileCount:0,children:[]};if(r.set(i,d),!i.includes("/"))t.push(d);else{let u=Qe(i).replace(/^\.$/,""),c=bt(u);n(u,c).children.push(d)}return d};for(let i of e){let s=i.path.split("/").filter(Boolean),a=t,d="";for(let u of s.slice(0,-1)){d=d?`${d}/${u}`:u;let c=n(d,u);c.changedFileCount+=1,a=c.children}a.push({kind:"file",name:s.at(-1)??i.path,path:i.path,oldPath:i.oldPath,changeKind:i.kind})}let o=i=>i.sort((s,a)=>{let d=s.kind==="directory"?0:1,u=a.kind==="directory"?0:1;return d-u||s.name.localeCompare(a.name)}).map(s=>s.kind==="directory"?{...s,children:o(s.children)}:s);return o(t)}function J_(e,t,r=process.cwd(),n=""){let o=z_(e,t,r,n);if(!o.ok)throw new Error(o.error.message);return o.value}function z_(e,t,r=process.cwd(),n=""){let o=e.moves.find(d=>d.id===t);if(!o)return S({code:"unknown_move",message:`Unknown MOVE: ${t}`});let i=hS(n);if(!i.ok)return i;let s=i.value,a=Z_(o.commit,r);try{let d=s?`${o.commit}:${s}`:`${o.commit}:`,c=w(["ls-tree","-z","-l",d],{cwd:r}).split("\0").filter(Boolean).map(m=>Y_(m,s)).filter(m=>!!m).sort(Q_);return l({moveId:t,commit:o.commit,path:s,parent:s?Qe(s).replace(/^\.$/,""):void 0,nodes:c,changedPaths:eM(e,t,r),runtimeCapsule:a})}catch(d){return d instanceof ie?S({code:"not_found",message:`MOVE file tree not found: ${s||"/"}`}):S({code:"git_error",message:d instanceof Error?d.message:String(d)})}}function K_(e,t,r=process.cwd(),n=""){let o=X_(e,t,r,n);if(!o.ok)throw new Error(o.error.message);return o.value}function X_(e,t,r=process.cwd(),n=""){let o=e.moves.find(a=>a.id===t);if(!o)return S({code:"unknown_move",message:`Unknown MOVE: ${t}`});let i=hS(n);if(!i.ok)return i;let s=i.value;if(!s)return S({code:"invalid_path",message:"MOVE file path is required"});if(Ka(s))return l({kind:"hiddenRuntime",moveId:t,commit:o.commit,path:s});try{if(w(["cat-file","-t",`${o.commit}:${s}`],{cwd:r}).trim()!=="blob")return S({code:"not_file",message:`MOVE path is not a file: ${s}`});let d=Number(w(["cat-file","-s",`${o.commit}:${s}`],{cwd:r}).trim());if(Number.isFinite(d)&&d>kl)return l({kind:"tooLarge",moveId:t,commit:o.commit,path:s,size:d,maxBytes:kl});let u=w(["show",`${o.commit}:${s}`],{cwd:r});return tM(u)?l({kind:"binary",moveId:t,commit:o.commit,path:s,size:Number.isFinite(d)?d:Buffer.byteLength(u)}):l({kind:"text",moveId:t,commit:o.commit,path:s,text:u,language:rM(s),size:Number.isFinite(d)?d:Buffer.byteLength(u)})}catch(a){return a instanceof ie?S({code:"not_found",message:`MOVE file not found: ${s}`}):S({code:"git_error",message:a instanceof Error?a.message:String(a)})}}function hS(e){let t=Fl(e.trim().replace(/^\/+/,"")).replace(/\\/g,"/");return t==="."?l(""):t.startsWith("../")||t===".."||Oi(e)||t.includes("\0")?S({code:"invalid_path",message:`Invalid MOVE file path: ${e}`}):l(t)}function Y_(e,t){let r=e.match(/^(\d+)\s+(\w+)\s+([0-9a-f]+)\s+(-|\d+)\t(.+)$/);if(!r)return;let n=r[2],o=r[5],i=t?`${t}/${o}`:o,s=bt(o);if(Ka(i)||i===".hunsu")return{kind:"hiddenRuntime",name:s,path:i};if(n==="tree")return{kind:"directory",name:s,path:i};let a=r[4]==="-"?0:Number(r[4]);return Number.isFinite(a)&&a>kl?{kind:"tooLarge",name:s,path:i,size:a}:{kind:"textFile",name:s,path:i,size:Number.isFinite(a)?a:0}}function Q_(e,t){let r=e.kind==="directory"?0:e.kind==="hiddenRuntime"?2:1,n=t.kind==="directory"?0:t.kind==="hiddenRuntime"?2:1;return r-n||e.name.localeCompare(t.name)}function Z_(e,t){let r=Br.filter(n=>{try{return w(["cat-file","-e",`${e}:${n}`],{cwd:t}),!0}catch{return!1}});return{hiddenRuntimeFileCount:r.length,runtimePaths:r,summary:r.length===0?"No encoded Hunsu runtime files are present on this MOVE commit.":`${r.length} encoded Hunsu runtime files are hidden from the file explorer.`}}function eM(e,t,r){try{return xl(e,t,r).files.map(n=>n.path)}catch{return[]}}function Ka(e){return e===".hunsu"||e.startsWith(".hunsu/")}function tM(e){return e.includes("\0")}function rM(e){let t=e.split(".").pop()?.toLowerCase();return!t||t===e?void 0:{js:"javascript",jsx:"javascript",ts:"typescript",tsx:"typescript",json:"json",md:"markdown",css:"css",html:"html",yml:"yaml",yaml:"yaml",py:"python",rb:"ruby",rs:"rust",go:"go",sh:"shell",toml:"toml"}[t]}function yS(e,t,r={}){let n=nM(e,{forceRoot:r.forceRoot}),o=r.persist??!0;return{repository:Ne(n),board:J(t,{cwd:n,persist:o})}}function nM(e,t={}){let r=Be(e);if(!G(r))return vt(r,{recursive:!0}),vl(r),j(r);if(!Xr(r).isDirectory())throw new Error(`Repository path is not a directory: ${r}`);if(t.forceRoot&&!G(H(r,".git")))return vl(r),j(r);try{return j(r)}catch{return vl(r),j(r)}}function Li(e,t,r={}){let n=Tn(r),o=new Date().toISOString(),i=n.roadmaps.find(d=>Kr(d.repositoryPath)===Kr(e.root))?.roadmapId??RS(e.root),s={roadmapId:i,displayName:t?.trim()||n.roadmaps.find(d=>d.roadmapId===i)?.displayName||bt(e.root),repositoryPath:e.root,kind:"hunsu-roadmap",lifecycle:"active",localAccess:{enabled:!0},remoteAccess:dM(n.roadmaps.find(d=>d.roadmapId===i)),codex:{readyForExecute:!1},lastOpenedAt:o,lastKnownBranch:e.branch,health:"ok",type:"roadmap",primaryAction:"open"},a={version:1,roadmaps:[s,...n.roadmaps.filter(d=>d.roadmapId!==i)]};return td(a,r),s}function Tn(e={}){let t=SS(e);if(!G(t))return{version:1,roadmaps:[]};try{let r=JSON.parse(Xt(t,"utf8"));return{version:1,roadmaps:r.schema==="hunsu.bridge.workspaces.v1"&&Array.isArray(r.workspaces)?r.workspaces.flatMap(o=>typeof o.workspaceId!="string"||typeof o.displayName!="string"||typeof o.repositoryPath!="string"||typeof o.updatedAt!="string"?[]:[{roadmapId:o.workspaceId,displayName:o.displayName,repositoryPath:o.repositoryPath,lifecycle:o.lifecycle==="inactive"?"inactive":"active",localAccess:{enabled:o.lifecycle!=="inactive"},remoteAccess:oM(o.remoteAccess)?{enabled:o.remoteAccess.enabled,scopes:o.remoteAccess.scopes.filter(iM)}:{enabled:!1,scopes:[]},lastOpenedAt:o.updatedAt,health:"unknown"}]):Array.isArray(r.roadmaps)?r.roadmaps.filter(aM):[]}}catch{return{version:1,roadmaps:[]}}}function td(e,t={}){let r=SS(t);vt(Qe(r),{recursive:!0});let n=sM(r),o=new Date().toISOString(),i={schema:"hunsu.bridge.workspaces.v1",workspaces:e.roadmaps.map(a=>({workspaceId:a.roadmapId,displayName:a.displayName,repositoryPath:a.repositoryPath,lifecycle:a.lifecycle==="inactive"?"inactive":"active",remoteAccess:{enabled:a.remoteAccess?.enabled===!0,scopes:a.remoteAccess?.scopes??[]},createdAt:n.get(a.roadmapId)?.createdAt??a.lastOpenedAt??o,updatedAt:a.lastOpenedAt??o}))},s=`${r}.tmp-${process.pid}-${Date.now()}`;At(s,`${JSON.stringify(i,null,2)}
|
|
96
|
+
`,{encoding:"utf8",mode:384}),lT(s,r)}function oM(e){if(typeof e!="object"||e===null)return!1;let t=e;return typeof t.enabled=="boolean"&&Array.isArray(t.scopes)&&t.scopes.every(r=>typeof r=="string")}function iM(e){return e==="execute.start"||e==="artifactAction.run"||e==="env.read"||e==="hostAlias.expose"||e==="remoteRelay.access"}function sM(e){if(!G(e))return new Map;try{let t=JSON.parse(Xt(e,"utf8"));return t.schema!=="hunsu.bridge.workspaces.v1"||!Array.isArray(t.workspaces)?new Map:new Map(t.workspaces.flatMap(r=>{if(typeof r!="object"||r===null)return[];let n=r;return typeof n.workspaceId=="string"&&typeof n.createdAt=="string"?[[n.workspaceId,{createdAt:n.createdAt}]]:[]}))}catch{return new Map}}function SS(e={}){return Be(e.roadmapRegistryPath??H(zt(),".config","hunsu","roadmaps.json"))}function aM(e){if(typeof e!="object"||e===null)return!1;let t=e;return typeof t.roadmapId=="string"&&typeof t.displayName=="string"&&typeof t.repositoryPath=="string"&&typeof t.lastOpenedAt=="string"}function dM(e){return e?.remoteAccess??{enabled:!1,scopes:[]}}function RS(e){return`roadmap_${qe(Ge("sha256").update(e)).slice(0,12)}`}async function Dn(e,t,r={}){return Cl([e],t,r)}async function Cl(e,t,r={}){let n=r.persist??!0,o=r.cwd??process.cwd();if(n){let a=`Hunsu runtime state ${e.map(d=>d.type).join(", ")}`;return e.length===1?da(e[0],{cwd:o,commitMessage:a}):ai(e,{cwd:o,commitMessage:a})}let i=t.events.length;return t.events=e.reduce((a,d)=>{let u=Qo(a,d);if(!u.ok)throw new Error(u.error.message);return u.value},t.events),{acceptedEvents:t.events.slice(i),board:uS(t.events)}}async function rd(e,t){if(!e.harnessLock){let o=lt(e.harnessGraph);if(e.harness.kind!=="team_execution_plan")return{harness:Ke(e.harness),harnessGraph:o};if(!e.executorPackageBindings?.length&&!e.resourcePackageBindings?.length)return{harness:br(o),harnessGraph:o};let i=await gy(o,e,t);return{harness:br(i),harnessGraph:i}}let r=await fi(e.harnessLock,{origins:t.origins});if(r.manifest.kind!=="team")throw new Error(`Hub package ${e.harnessLock.origin}/${e.harnessLock.kind}/${e.harnessLock.key}@${e.harnessLock.version} is not a team package`);let n=await gy(Qg(r.manifest),e,t);return{harness:br(n),harnessGraph:n,harnessLock:r.lock}}async function gy(e,t,r){let n=lt(e);for(let o of t.executorPackageBindings??[]){let i=await fi(o.lock,{origins:r.origins});if(i.manifest.kind!=="member")throw new Error(`Hub package ${o.lock.origin}/${o.lock.kind}/${o.lock.key}@${o.lock.version} is not a member package`);let s=i.manifest,a=n.executors.findIndex(d=>d.kind==="member"&&d.id===o.executorId);if(a<0)throw new Error(`Harness cannot bind Member package to unknown Member Executor ${o.executorId}`);n.executors[a]=uM(s.member,i.lock)}for(let o of t.resourcePackageBindings??[]){let i=await fi(o.lock,{origins:r.origins});if(i.manifest.kind!=="skill")throw new Error(`Hub package ${o.lock.origin}/${o.lock.kind}/${o.lock.key}@${o.lock.version} is not a skill package`);let s=`resource.package.${o.name}`;n.resources=[...n.resources.filter(a=>a.id!==s),{id:s,binding:{kind:"package",lock:i.lock},packageLock:i.lock}]}return n}function uM(e,t){return{kind:"member",id:e.id,promptTemplate:{...e.promptTemplate},resources:[...e.skills.map(r=>({kind:"skill",skill:r.kind==="local-snapshot"?{...r,snapshotFiles:r.snapshotFiles?.map(n=>({...n}))}:{...r}})),...e.plugins.map(r=>({kind:"plugin",plugin:{...r}}))],runtimePolicy:{...e.modelSelection?{modelSelection:e.modelSelection}:{},model:e.model,reasoningEffort:e.reasoningEffort,serviceTier:e.serviceTier,execution:{...e.execution},approval:{...e.approval}},packageLock:t}}function kS(e,t){return{backendId:e.backendId,connectionMode:e.connectionMode,workspace:e.workspace,modelSelection:t??e.modelSelection,aliases:e.aliases}}async function IS(e,t,r){let n=e.aliases,o=r??e.modelSelection;if(!o&&!n?.length)return;let i=t.providerInventory?await Gl(t.providerInventory,e):cM(e);if(!i.ok)return In(i.error);let s=i.value;return kn({selection:o,aliases:n,backendId:s.backendId,inventories:s.providers})}function cM(e){let t=Vr(e);return ja(e)?t.remoteRequested?qt(t.backendId??"remote",t.backendId?`Provider inventory is required for selected backend ${t.backendId}.`:"Provider inventory is required for the selected remote backend."):Bh(t.backendId??"local","codex","Provider inventory must be supplied for an explicit local backend selection."):l(rl())}async function nm(e,t,r){let n=await IS(e,t,r);if(n){if(!n.ok)throw new Error(qr(n.error,n.backendId).message);return{provider:n.resolved}}}async function vy(e,t,r){let n;try{let i=J(t,r),s=vo(i,e.requestId),a=zS(i,s.id,e.lineId),d=ho(i,a.id),u=Yr(i,a.id).filter(Ir),c=ln(pc({board:i,line:a,lineNode:d,existingRuns:po(t,r.cwd),activeDestinations:u,selectedDestinationIds:e.selectedDestinationIds,formatMovePosition:ZS}));n=await rd(c.lineNode,{origins:i.origins})}catch{return}let o=wS(n.harness,n.harnessGraph);for(let i of o){let s=await IS({...e,modelSelection:i},{providerInventory:r.providerInventory},i);if(s&&!s.ok)return qr(s.error,s.backendId)}}function wS(e,t){let r=[],n=new Set,o=i=>{if(!i)return;let s=JSON.stringify(i);n.has(s)||(n.add(s),r.push(i))};if(e.kind==="team_execution_plan")for(let i of e.members)o(i.modelSelection);for(let i of t.executors)i.kind==="member"&&o(i.runtimePolicy.modelSelection);return r}async function hy(e,t,r={}){let n=r.persist??!0,o=r.cwd??process.cwd(),i=r.runner??un(),s=J(t,{cwd:o,persist:n}),a=vo(s,e.requestId),d=zS(s,a.id,e.lineId),u=ho(s,d.id),c=Yr(s,d.id).filter(Ir),m=ln(pc({board:s,line:d,lineNode:u,existingRuns:po(t,o),activeDestinations:c,selectedDestinationIds:e.selectedDestinationIds,formatMovePosition:ZS})),f=m.selectedDestinationIds,p=await rd(m.lineNode,{origins:s.origins});KS(p.harness);let g=lt(p.harnessGraph),v=new Date().toISOString(),A=yH(t,s,n?o:void 0),C=um(s,m.lineNode),D=n?tm(s,m.lineNode,o):void 0,R=n?__(o,A,v,D,r.routeWorktreeRoot):QS(o,A,v),P={provider:"codex",conversationHash:F(_o(XS({executeId:A,lineId:d.id,sourceNodeId:m.lineNode.id,at:v}))),contextHash:F(k(YS(s,m.lineNode,A),"conversation.contextHash")),worktreeHash:R.worktreeHash,startedAt:v},L=await nm(e,r),q=e.aliases,z={runId:SH({lineId:d.id,executeId:A,roadmapId:r.roadmapId}),roadmapId:r.roadmapId,executeId:A,requestId:a.id,lineId:d.id,repositoryPath:o,backendId:e.backendId,connectionMode:e.connectionMode,workspace:e.workspace,provider:"codex",modelSelection:e.modelSelection,aliases:q,resolvedModelSelection:L?.provider,source:"live",status:"running",selectedDestinationIds:f,harnessLock:p.harnessLock,sourceNodeId:m.lineNode.id,sourceMoveId:C?.id,targetMoveOrdinal:m.targetMoveOrdinal,worktree:R,conversationRef:P,attemptCount:0,maxAttemptCount:iH(p.harness),memberEvaluations:[],pathCommits:{},memberPathRuns:[],providerTurnIds:[],debugEvents:[],rawAppServerMessages:[],codexTurns:[],codexItems:[],agentSessions:[],activeItemIds:[],assistantTranscript:[],startedAt:v,updatedAt:v};t.runs[z.runId]=z,se(t,z,s);let y={runId:z.runId,executeId:A,repositoryPath:R.path,worktreeHash:R.worktreeHash,sourceMoveId:C?.id,targetMoveOrdinal:m.targetMoveOrdinal,requestGoal:a.goal,teamName:d.teamName??m.lineNode.teamName,harness:p.harness,harnessGraph:g,teamScopeId:g.rootTeamId,harnessLock:p.harnessLock,activeDestinations:c,selectedDestinationIds:f,attemptOrdinal:1,maxAttemptCount:z.maxAttemptCount,futureConstraints:s.futureConstraints.filter(E=>E.lineId===d.id).map(E=>E.constraint),conversationRef:P,resolvedModelSelection:L?.provider,board:s};return US(y,i,t,{cwd:o,persist:n,apmSkillRegistryClient:r.apmSkillRegistryClient,providerInventory:r.providerInventory}).catch(E=>qS(z.runId,E,t,{cwd:o,persist:n})),{run:Ye(z),execute:at(z),board:s}}async function yy(e,t,r={}){let n=Mn(t,e.runId,r.cwd);await(r.runner??un()).pauseRun(n.runId),kr(n,"paused"),se(t,n);let i=await Dn({type:"PauseLine",lineId:n.lineId},t,r);return{run:Ye(n),execute:at(n),board:i.board}}async function Sy(e,t,r){let n=r.persist??!0,o=r.cwd??process.cwd(),i=Mn(t,e.runId,o),s=await lM(i,t,{cwd:o,persist:n,status:r.bridgeStatus,providerInventory:r.providerInventory});if(s)return S(s);let a=r.runner??un(),d=await Dn({type:"ResumeLine",lineId:i.lineId},t,r);if(kr(i,"running"),se(t,i),i.providerThreadId){let u=J(t,{cwd:o,persist:n}),c=vo(u,i.requestId),m=dm(u,i.lineId),f=ho(u,i.lineId),p=Yr(u,i.lineId).filter(Ir),g=f?await rd(f,{origins:u.origins}):void 0,v=g?lt(g.harnessGraph):void 0;g&&(KS(g.harness),i.harnessLock=g.harnessLock),US({runId:i.runId,executeId:i.executeId,repositoryPath:i.worktree?.path??o,worktreeHash:i.worktree?.worktreeHash,sourceMoveId:i.sourceMoveId,targetMoveOrdinal:i.targetMoveOrdinal,requestGoal:c.goal,teamName:m.teamName??f?.teamName,harness:g?.harness??f?.harness,harnessGraph:v,teamScopeId:v?.rootTeamId,harnessLock:g?.harnessLock,activeDestinations:p,selectedDestinationIds:i.selectedDestinationIds,attemptOrdinal:(i.attemptCount??0)+1,maxAttemptCount:i.maxAttemptCount,previousMemberOutputs:i.memberEvaluations?.map(qi),futureConstraints:u.futureConstraints.filter(A=>A.lineId===i.lineId).map(A=>A.constraint),conversationRef:i.conversationRef,resolvedModelSelection:i.resolvedModelSelection,board:u},a,t,{cwd:o,persist:n,resumeProviderThreadId:i.providerTeamThreadId??i.providerThreadId,apmSkillRegistryClient:r.apmSkillRegistryClient,providerInventory:r.providerInventory}).catch(A=>qS(i.runId,A,t,{cwd:o,persist:n}))}return l({run:Ye(i),execute:at(i),board:d.board})}async function lM(e,t,r){let n=kS(e);return al(n,r.status,{providerInventory:()=>Gl(r.providerInventory,n),modelSelections:async()=>{let o=[];e.resolvedModelSelection&&o.push({selection:{kind:"direct",provider:e.resolvedModelSelection}}),o.push({selection:e.modelSelection,aliases:e.aliases});let i=J(t,{cwd:r.cwd,persist:r.persist}),s=ho(i,e.lineId);if(s){let a=await rd(s,{origins:i.origins});for(let d of wS(a.harness,a.harnessGraph))o.push({selection:d,aliases:e.aliases})}return o}})}async function Ry(e,t,r={}){let n=r.persist??!0,o=r.cwd??process.cwd(),i=Mn(t,e.runId,o);return await(r.runner??un()).stopRun(i.runId),kr(i,"stopped"),se(t,i),{run:Ye(i),execute:at(i),board:J(t,{cwd:o,persist:n})}}async function ky(e,t,r={}){let n=r.persist??!0,o=r.cwd??process.cwd(),i=Mn(t,e.runId,o),s=J(t,{cwd:o,persist:n});dm(s,i.lineId);let a=eR(e.destinationIds,i.selectedDestinationIds);EH(s,i,e,a,o);let d=w(["rev-parse","--verify",`${e.fromRef}^{commit}`],{cwd:o}).trim(),u=lm(s),c=await Dn({type:"RecordMove",lineId:i.lineId,moveId:u,summary:e.summary,commit:d,reachedDestinationIds:a,evidence:e.evidence,risks:e.risks&&e.risks.length>0?e.risks:void 0,executeId:i.executeId,conversationRef:i.conversationRef,worktree:i.worktree,actor:"codex"},t,{cwd:o,persist:n});return i.finalResponse=`Recorded MOVE ${u} Arrived`,i.outcome="arrived",i.conversationRef&&(i.conversationRef={...i.conversationRef,endedAt:new Date().toISOString()}),i.worktree&&n&&(i.worktree=rm(o,i.worktree)),kr(i,"arrived"),se(t,i,c.board),{run:Ye(i),execute:at(i),board:c.board,acceptedEvents:c.acceptedEvents,moveId:u,commit:d}}async function mM(e,t,r){let n=r.persist??!0,o=r.cwd??process.cwd(),i=Mn(t,r.runId,o),s=J(t,{cwd:o,persist:n}),a=i.worktree?.path??o,d=eR(void 0,i.selectedDestinationIds);PH(s,i,e,d,a,{promotedPathCommit:i.terminalPathCommit,prevMoveCommit:i.pathCommits?.PrevMove});let u=lm(s);!i.terminalPathCommit&&i.worktree&&n&&N_(a);let c=i.terminalPathCommit?await fM({board:s,cwd:a,completion:e,moveId:u,runner:r.runner??un(),run:i,state:t}):void 0,m=c&&i.terminalPathCommit?n&&i.worktree?Nr:Du({cwd:a,runId:i.runId,moveId:u,goal:vo(s,i.requestId).goal,finalizerMessage:c}).commitSha:Sg(`Hunsu move ${u}
|
|
97
|
+
`,{cwd:a}).commitSha,f={type:"RecordMove",lineId:i.lineId,moveId:u,summary:e.summary,commit:m,reachedDestinationIds:d,evidence:e.evidence,risks:e.risks.length>0?e.risks:void 0,executeId:i.executeId,conversationRef:i.conversationRef,worktree:i.worktree,actor:"codex"},p=i.worktree&&n?a:o,g=c&&i.terminalPathCommit&&i.worktree&&n?pM(f,i,{board:s,cwd:p,finalizerMessage:c,moveId:u}):await Dn(f,t,{cwd:p,persist:n}),v=c&&i.terminalPathCommit&&i.worktree&&n?pe(w(["rev-parse","--verify","HEAD"],{cwd:a}).trim()):i.worktree&&n?pe(w(["rev-parse","--verify","HEAD"],{cwd:a}).trim()):m===Nr?pe(w(["rev-parse","--verify","HEAD"],{cwd:a}).trim()):pe(m);return c&&i.terminalPathCommit&&i.worktree&&n?i.moveFinalizerCommit=v:c&&i.terminalPathCommit&&(i.moveFinalizerCommit=m===Nr?v:pe(m)),i.worktree&&n&&H_(o,u,v),i.finalResponse=`Recorded MOVE ${u} Arrived`,i.outcome="arrived",i.conversationRef&&(i.conversationRef={...i.conversationRef,endedAt:new Date().toISOString()}),i.worktree&&n&&(i.worktree=rm(o,i.worktree)),kr(i,"arrived"),se(t,i,g.board),{run:Ye(i),execute:at(i),board:g.board,acceptedEvents:g.acceptedEvents,moveId:u,commit:v}}async function fM(e){let t=e.run.terminalPathCommit,r=e.run.pathCommits?.PrevMove;if(!t||!r)throw new Error("Cannot finalize MOVE without PrevMove and terminal Path commits");await Ji(e.cwd,void 0,{phase:"move-finalizer"});let n=od(e.state,e.run,{kind:"MoveFinalizer",runId:e.run.runId,executeId:e.run.executeId,moveId:e.moveId}),o;try{o=await ad(e.runner,e.run.runId,e.state,n.sessionId,()=>e.runner.runMoveFinalizer(sH({board:e.board,cwd:e.cwd,completion:e.completion,moveId:e.moveId,run:e.run,sourceMoveCommit:r,terminalPathCommit:t})))}catch(s){throw Jr(e.state,e.run,n.sessionId,s),s}e.run.providerFinalizerThreadId=o.providerThreadId??e.run.providerFinalizerThreadId,e.run.providerThreadId=o.providerThreadId??e.run.providerThreadId,Vi(e.run,o.providerTurnId),sd(e.state,e.run,n,o);let i=o.finalResponse?.trim();if(!i)throw Jr(e.state,e.run,n.sessionId,"MOVE finalizer completed without a commit message"),new Error("MOVE finalizer completed without a commit message");return e.run.moveFinalizerMessage=i,e.run.updatedAt=new Date().toISOString(),id(e.state,e.run,n.sessionId,i,e.run.updatedAt),se(e.state,e.run),i}function pM(e,t,r){let n=yM(t,r.moveId),o=da(e,{cwd:r.cwd,previousExecution:{type:"present",value:n},selfCommitMoveIds:[r.moveId]});vM(r.cwd);let i=Du({cwd:r.cwd,runId:t.runId,moveId:r.moveId,goal:vo(r.board,t.requestId).goal,finalizerMessage:r.finalizerMessage}).commitSha;return{acceptedEvents:o.acceptedEvents.map(s=>gM(s,r.moveId,i)),board:xe(r.cwd).board}}function gM(e,t,r){return e.type!=="MoveRecorded"||e.move.id!==t||e.move.commit!==Nr?e:{...e,move:{...e.move,commit:F(rn(r,"commit"))}}}function vM(e){w(["add","--all","--",...hM(e)],{cwd:e})}function hM(e){return[...Br,it,Zn].filter(t=>G(H(e,t))||ES(e,t))}function ES(e,t){try{return w(["ls-files","--error-unmatch",t],{cwd:e}),!0}catch(r){if(r instanceof ie)return!1;throw r}}function yM(e,t){let r=e.agentSessions.find(i=>i.owner.kind==="TeamPlan"),n=e.agentSessions.find(i=>i.owner.kind==="MoveFinalizer"&&i.owner.moveId===t),o=e.pathCommits?.PrevMove;if(!o)throw new Error("Cannot persist previous execution without PrevMove commit");return{schema:"hunsu.previous-execution.v1",sourceMoveCommit:o,targetMoveId:t,executeId:e.executeId,runId:e.runId,lineId:e.lineId,sourceNodeId:e.sourceNodeId,sourceMoveId:e.sourceMoveId,targetMoveOrdinal:e.targetMoveOrdinal,selectedDestinationIds:[...e.selectedDestinationIds],worktree:e.worktree,conversationRef:e.conversationRef,plan:{nodeType:"PlanNode",lifecycle:r?.state.type==="failed"?"Failed":"Completed",session:r?Tl(r,"TeamPlan"):void 0,completedAt:PS(r),error:r?.state.type==="failed"?r.state.error:void 0},paths:SM(e),pathCommits:{...e.pathCommits??{}},terminalPathId:e.terminalMemberPathId,terminalPathCommit:e.terminalPathCommit,finalizerSession:n?Tl(n,"MoveFinalizer"):void 0,moveFinalizerCommit:{type:"self"},moveFinalizerMessage:e.moveFinalizerMessage,startedAt:e.startedAt,completedAt:new Date().toISOString()}}function SM(e){let t=e.memberPathRuns??[],r=new Map(t.map(o=>[o.pathId,o]));return t.map(o=>({id:o.pathId,executorId:o.executorId,goal:o.goal,requires:o.requires})).map(o=>{let i=r.get(o.id),s=i?.agentSessionId?e.agentSessions.find(a=>a.sessionId===i.agentSessionId):e.agentSessions.find(a=>a.owner.kind==="ExecutionPlan"&&a.owner.pathId===o.id);return{nodeType:"PathNode",pathId:o.id,executorId:o.executorId,goal:o.goal,requires:o.requires,lifecycle:RM(i),session:s?Tl(s,"ExecutionPlan"):void 0,commit:i&&"commit"in i?i.commit:void 0,parentCommit:i&&"parentCommit"in i?i.parentCommit:void 0,treeChanged:i&&"treeChanged"in i?i.treeChanged:void 0,startedAt:i?.startedAt,completedAt:i&&"completedAt"in i?i.completedAt:void 0,error:i&&i.status==="failed"?i.error:void 0}})}function RM(e){return!e||e.status==="planned"?"Waiting":e.status==="starting"||e.status==="executing"?"Executing":e.status==="failed"?"Failed":"Completed"}function Tl(e,t){return{sessionId:e.sessionId,ownerKind:t,providerThreadId:e.provider?.providerThreadId,providerTurnId:e.provider?.providerTurnId,state:e.state.type,startedAt:e.createdAt,completedAt:PS(e),error:e.state.type==="failed"?e.state.error:void 0}}function PS(e){if(e&&(e.state.type==="completed"||e.state.type==="failed"))return e.state.completedAt}async function om(e,t,r,n){let o=n.persist??!0,i=n.cwd??process.cwd(),s=Mn(r,n.runId,i),a=J(r,{cwd:i,persist:o}),d=s.worktree?.path??i,u=lm(a),c=gH(d,s.worktree),m=await Dn({type:"RecordAccident",lineId:s.lineId,moveId:u,summary:n.summary??`Execute failed after ${s.attemptCount??0} attempt${s.attemptCount===1?"":"s"}`,commit:c,evidence:t,failureReason:e,risks:n.risks&&n.risks.length>0?n.risks:void 0,executeId:s.executeId,conversationRef:s.conversationRef,worktree:s.worktree,actor:"codex"},r,{cwd:i,persist:o});return s.finalResponse=`Recorded MOVE ${u} Accident`,s.outcome="accident",s.conversationRef&&(s.conversationRef={...s.conversationRef,endedAt:new Date().toISOString()}),s.worktree&&o&&(s.worktree=rm(i,s.worktree)),kr(s,"accident"),se(r,s,m.board),{run:Ye(s),execute:at(s),board:m.board,acceptedEvents:m.acceptedEvents,moveId:u,commit:c}}async function Iy(e,t,r,n={}){let o=await Dn({type:e==="accept"?"AcceptLine":"RejectLine",lineId:t.lineId,reason:t.reason},r,n),i=nR(r,t.lineId,n.cwd);return i&&(kr(i,e==="accept"?"finished":"stopped"),se(r,i)),o}function kM(e){return typeof e=="object"&&e!==null&&"commands"in e&&Array.isArray(e.commands)}function wy(e){let t=e;return kM(t)?t.commands:[t]}function Dl(e,t){return t.persist?xe(t.cwd).events:e.events}function J(e,t){return t.persist?xe(t.cwd).board:uS(e.events)}function Ey(e,t,r,n={}){t.writeHead(200,{...$i.get(t),"content-type":"text/event-stream; charset=utf-8","cache-control":"no-cache, no-transform",connection:"keep-alive"}),t.flushHeaders?.(),t.write(`: connected
|
|
98
|
+
|
|
99
|
+
`);let o=r_(r,i=>AS(t,i),n);e.on("close",o)}function Py(e,t,r,n={}){t.writeHead(200,{...$i.get(t),"content-type":"text/event-stream; charset=utf-8","cache-control":"no-cache, no-transform",connection:"keep-alive"}),t.flushHeaders?.(),t.write(`: connected
|
|
100
|
+
|
|
101
|
+
`);let o=n_(r,i=>AS(t,i),n);e.on("close",o)}function AS(e,t){e.write(`event: ${t.type}
|
|
102
|
+
`),e.write(`data: ${JSON.stringify(t)}
|
|
103
|
+
|
|
104
|
+
`)}function se(e,t,r){IM(e,t.runId),Ui(t);let n=Ye(t);wM(e,{type:"run.updated",run:n,execute:at(n),board:r})}function Ay(e,t){let r=Il.get(e);if(r||(r=new Map,Il.set(e,r)),r.has(t.runId))return;let n=setTimeout(()=>{r?.delete(t.runId),e.runs[t.runId]===t&&se(e,t)},CT);n.unref?.(),r.set(t.runId,n)}function IM(e,t){let r=Il.get(e),n=r?.get(t);n&&(clearTimeout(n),r?.delete(t))}function wM(e,t){for(let r of e.liveSubscribers)r(t)}function nd(e,t){for(let r of e.agentSessionSubscribers)r(t)}function od(e,t,r,n=new Date().toISOString()){t.agentSessions??=[],t.agentSessionIds??=[];let o=bS(r),i=e.agentSessions[o]??t.agentSessions.find(d=>d.sessionId===o);if(i)return t.activeAgentSessionId=i.sessionId,t.agentSessionIds.includes(i.sessionId)||t.agentSessionIds.push(i.sessionId),t.agentSessions.some(d=>d.sessionId===i.sessionId)||t.agentSessions.push(i),e.agentSessions[i.sessionId]=i,i;let s=EM(t,r),a={sessionId:o,roadmapId:t.roadmapId,routeRef:s,runId:s.runId,executeId:s.executeId,owner:r,state:{type:"starting",startedAt:n},messages:[],activeItemIds:[],revision:1,createdAt:n,updatedAt:n};return e.agentSessions[a.sessionId]=a,t.agentSessions.push(a),t.agentSessionIds.push(a.sessionId),t.activeAgentSessionId=a.sessionId,Yt(e,a),a}function bS(e){switch(e.kind){case"TeamPlan":return`${e.executeId}:plan:${e.attempt}`;case"ExecutionPlan":return`${e.executeId}:path:${e.attempt}:${e.pathId}`;case"MoveFinalizer":return`${e.executeId}:finalizer:${e.moveId??"move"}`;case"HunsuDraft":return`hunsu-draft:${e.draftSessionId}:draft`}}function EM(e,t){switch(t.kind){case"TeamPlan":return hl(e,"Plan");case"ExecutionPlan":return hl(e,"Path");case"MoveFinalizer":return hl(e,"Path");case"HunsuDraft":return{kind:"Route",routeKind:"HunsuDraft",routeId:`hunsu-draft:${t.draftSessionId}`,draftSessionId:t.draftSessionId,sourceLineId:"",sourceNodeId:""}}}function hl(e,t){return{kind:"Route",routeKind:t,routeId:e.executeId,runId:e.runId,executeId:e.executeId,sourceLineId:e.lineId,sourceNodeId:String(e.sourceNodeId??""),worktree:e.worktree}}function id(e,t,r,n,o=new Date().toISOString()){let i=r?t.agentSessions?.find(a=>a.sessionId===r):void 0;if(!i)return;let s=ue(n,Y);i.finalResponse=s,i.state={type:"completed",provider:i.provider,finalResponse:s,completedAt:o},i.activeItemIds=[],Rr(i,o),_n(i),t.activeAgentSessionId===i.sessionId&&(t.activeAgentSessionId=void 0),Yt(e,i)}function Jr(e,t,r,n,o=new Date().toISOString()){let i=r?t.agentSessions?.find(a=>a.sessionId===r):void 0;if(!i)return;let s=re(n instanceof Error?n.message:String(n),Y);i.error=s,i.state={type:"failed",provider:i.provider,error:s,completedAt:o},i.activeItemIds=[],Rr(i,o),_n(i),t.activeAgentSessionId===i.sessionId&&(t.activeAgentSessionId=void 0),Yt(e,i)}function xS(e,t,r,n,o=new Date().toISOString()){r&&(r.provider=n,r.state={type:"executing",provider:n,activeItemIds:r.activeItemIds},Rr(r,o),t.activeAgentSessionId=r.sessionId,Yt(e,r))}function sd(e,t,r,n,o=new Date().toISOString()){if(!n.providerThreadId||!n.providerTurnId)return;let i={providerThreadId:n.providerThreadId,providerTurnId:n.providerTurnId};return xS(e,t,r,i,o),i}function PM(e,t,r){let n="providerTurnId"in t?t.providerTurnId:void 0;if(n){let i=e.agentSessions?.find(s=>s.provider?.providerTurnId===n);if(i)return i}let o=r??e.activeAgentSessionId;return o?e.agentSessions?.find(i=>i.sessionId===o):void 0}function CS(e,t){return e?`${e}:${t}`:t}function by(e,t,r,n,o,i,s){if(!t)return;let a=s?new Date(s).toISOString():new Date().toISOString(),d=CS(r,n),u=t.messages.find(c=>c.itemId===d);return u||(u={sessionId:t.sessionId,messageId:`${t.sessionId}:${d}`,itemId:d,role:xy(o.type),type:o.type,status:i,title:Ml(o),revision:1,createdAt:a,updatedAt:a},t.messages.push(u)),u.type=o.type,u.role=xy(o.type),u.status=i,u.title=Ml(o),u.command=o.command??u.command,u.cwd=o.cwd??u.cwd,u.commandActions=o.commandActions??u.commandActions,i!=="completed"?(u.text=o.text??u.text,u.summary=o.summary??u.summary,u.content=o.content??u.content,u.output=o.aggregatedOutput??u.output,u.changes=o.changes??u.changes):(u.text=u.text??o.text,u.summary=u.summary??o.summary,u.content=u.content??o.content,u.output=u.output??o.aggregatedOutput,u.changes=u.changes??o.changes),u.completedAt=i==="completed"?a:u.completedAt,u.durationMs=MS(_S(u.createdAt,u.completedAt,o.durationMs,u.durationMs)),am(u),DS(t,u,a),i==="started"&&TS(t,d,a),_n(t),i==="completed"?(t.activeItemIds=t.activeItemIds.filter(c=>c!==d),nd(e,{type:"agentMessage.completed",sessionId:t.sessionId,roadmapId:t.roadmapId,routeRef:t.routeRef,runId:t.runId,executeId:t.executeId,messageId:u.messageId,itemId:u.itemId,role:u.role,messageType:u.type,title:u.title,status:"completed",text:u.text,summary:u.summary,content:u.content,command:u.command,cwd:u.cwd,commandActions:u.commandActions,output:u.output,changes:u.changes,messageRevision:u.revision,sessionRevision:t.revision,createdAt:u.createdAt,completedAt:u.completedAt??a,durationMs:u.durationMs,updatedAt:u.updatedAt})):Yt(e,t),u}function AM(e,t,r){if(!t)return;let n=new Date().toISOString(),o=CS(r.providerTurnId,r.itemId),i=t.messages.find(d=>d.itemId===o);i||(i={sessionId:t.sessionId,messageId:`${t.sessionId}:${o}`,itemId:o,role:DM(r.deltaKind),type:BS(r.deltaKind),status:"streaming",title:OS(r.deltaKind),revision:1,createdAt:n,updatedAt:n},t.messages.push(i));let s=TM(r.deltaKind),a=re(r.delta,Y);i.status=i.status==="completed"?"completed":"streaming",s==="text"?i.text=re(`${i.text??""}${a}`,Y):s==="output"?i.output=re(`${i.output??""}${a}`,Y):s==="summary"?i.summary=zr(Xa(i.summary,a,r.contentIndex)):i.content=zr(Xa(i.content,a,r.contentIndex)),am(i),DS(t,i,n),TS(t,o,n),_n(t),nd(e,{type:"agentMessage.delta",sessionId:t.sessionId,roadmapId:t.roadmapId,routeRef:t.routeRef,runId:t.runId,executeId:t.executeId,messageId:i.messageId,itemId:o,role:i.role,messageType:i.type,title:i.title,field:s,delta:a,contentIndex:r.contentIndex,messageRevision:i.revision,sessionRevision:t.revision,createdAt:i.createdAt,updatedAt:n})}function TS(e,t,r=new Date().toISOString()){e.activeItemIds.includes(t)||e.activeItemIds.push(t),e.provider&&(e.state.type==="starting"||e.state.type==="executing")&&(e.state={type:"executing",provider:e.provider,activeItemIds:e.activeItemIds}),Rr(e,r)}function DS(e,t,r=new Date().toISOString()){t.revision+=1,t.updatedAt=r,Rr(e,r)}function Rr(e,t=new Date().toISOString()){e.revision+=1,e.updatedAt=t}function _S(e,t,r,n){let o=xM(e,t);return bM([{source:"lifecycle",value:o},{source:"itemMetadata",value:r},{source:"previous",value:n}])}function bM(e){let t=e.find(n=>typeof n.value=="number"&&Number.isFinite(n.value)&&n.value>0);if(t?.value!==void 0)return{ok:!0,value:t.value,source:t.source};let r=e.find(n=>typeof n.value=="number"&&Number.isFinite(n.value));return r?.value!==void 0?{ok:!0,value:r.value,source:r.source}:{ok:!1,error:"missing-duration"}}function MS(e){return e.ok?e.value:void 0}function xM(e,t){if(!e||!t)return;let r=Date.parse(e),n=Date.parse(t);if(!(!Number.isFinite(r)||!Number.isFinite(n)))return Math.max(0,n-r)}function Yt(e,t){nd(e,{type:"agentSession.lifecycle",sessionId:t.sessionId,roadmapId:t.roadmapId,routeRef:t.routeRef,runId:t.runId,executeId:t.executeId,owner:t.owner,state:t.state,provider:t.provider,activeItemIds:t.activeItemIds,finalResponse:t.finalResponse,error:t.error,sessionRevision:t.revision,updatedAt:t.updatedAt})}function CM(e,t,r){nd(e,{type:"agentMessage.completed",sessionId:t.sessionId,roadmapId:t.roadmapId,routeRef:t.routeRef,runId:t.runId,executeId:t.executeId,messageId:r.messageId,itemId:r.itemId,role:r.role,messageType:r.type,title:r.title,status:"completed",text:r.text,summary:r.summary,content:r.content,command:r.command,cwd:r.cwd,commandActions:r.commandActions,output:r.output,changes:r.changes,messageRevision:r.revision,sessionRevision:t.revision,createdAt:r.createdAt,completedAt:r.completedAt??r.updatedAt,durationMs:r.durationMs,updatedAt:r.updatedAt})}function TM(e){switch(e){case"agentMessage":case"plan":return"text";case"commandOutput":case"fileChangeOutput":return"output";case"reasoningSummary":return"summary";case"reasoningText":return"content"}}function DM(e){switch(e){case"agentMessage":case"plan":return"assistant";case"reasoningText":case"reasoningSummary":return"reasoning";case"commandOutput":case"fileChangeOutput":return"tool"}}function xy(e){switch(e){case"userMessage":return"user";case"agentMessage":case"plan":return"assistant";case"reasoning":return"reasoning";case"commandExecution":case"fileChange":case"mcpToolCall":case"webSearch":return"tool";default:return"system"}}async function _M(e,t,r,n){try{for await(let o of e.events(t)){let i=r.runs[t];if(!i)return;if(o.runId===t){if(o.type==="runner.appServer.message"){HS(i,o),i.updatedAt=new Date().toISOString(),Ui(i),Ay(r,i);continue}NS(i,o,r,n),i.debugEvents.push(sm(o)),i.updatedAt=new Date().toISOString(),o.type==="runner.final"&>(i.status)&&(i.finalResponse=re(o.finalResponse,Y)),o.type==="runner.error"&>(i.status)&&(i.error=re(o.error,Y)),Ui(i),MM(o)?Ay(r,i):se(r,i)}}}catch(o){oH(t,o,r)}}function MM(e){return e.type==="runner.item.delta"}async function ad(e,t,r,n,o){let i=_M(e,t,r,n);try{return await o()}finally{await i}}async function HM(e,t,r,n,o){let i=n.draftAgentSessionId?r.agentSessions[n.draftAgentSessionId]:zl(r,n),s=BM(n,i),a=NM(e,t,r,s,i?.sessionId);try{return await o()}finally{await a}}async function NM(e,t,r,n,o){try{for await(let i of e.events(t))if(i.runId===t){if(i.type==="runner.appServer.message"){HS(n,i),n.updatedAt=new Date().toISOString(),Ui(n);continue}NS(n,i,r,o),n.debugEvents.push(sm(i)),n.updatedAt=new Date().toISOString(),i.type==="runner.final"&>(n.status)&&(n.finalResponse=re(i.finalResponse,Y)),i.type==="runner.error"&>(n.status)&&(n.error=re(i.error,Y)),Ui(n)}}catch(i){let s=o?r.agentSessions[o]:void 0;s&&OM(r,s,i)}}function BM(e,t){let r=new Date().toISOString();return{runId:`hunsu-draft:${e.draftSessionId}`,roadmapId:e.roadmapId,executeId:e.routeId,requestId:e.sourceLineId,lineId:e.sourceLineId,repositoryPath:e.repositoryPath,provider:"codex",status:e.status==="failed"?"failed":"running",selectedDestinationIds:[],sourceNodeId:e.sourceNodeId,sourceMoveId:e.sourceMoveId,worktree:e.worktree,providerThreadId:e.providerThreadId,debugEvents:[],rawAppServerMessages:[],codexTurns:[],codexItems:[],agentSessionIds:t?[t.sessionId]:[],agentSessions:t?[t]:[],activeItemIds:[],activeAgentSessionId:t?.sessionId,assistantTranscript:[],startedAt:r,updatedAt:r}}function OM(e,t,r){let n=re(r instanceof Error?r.message:String(r),Y),o=new Date().toISOString();t.error=n,t.state={type:"failed",provider:t.provider,error:n,completedAt:o},t.activeItemIds=[],Rr(t,o),_n(t),Yt(e,t)}function $M(e,t){e.assistantTranscript??=[];let r=e.assistantTranscript.find(o=>o.itemId===t.itemId&&o.providerTurnId===t.providerTurnId&&o.providerThreadId===t.providerThreadId),n=new Date().toISOString();if(r){r.text=re(`${r.text}${t.delta}`,Y),r.status="streaming",r.updatedAt=n;return}e.assistantTranscript.push({itemId:t.itemId,providerThreadId:t.providerThreadId,providerTurnId:t.providerTurnId,text:re(t.delta,Y),status:"streaming",updatedAt:n})}function LM(e,t){e.assistantTranscript??=[];let r=e.assistantTranscript.find(o=>o.itemId===t.itemId&&o.providerTurnId===t.providerTurnId&&o.providerThreadId===t.providerThreadId),n=new Date().toISOString();if(r){r.status="completed",r.updatedAt=n;return}}function HS(e,t){e.rawAppServerMessages??=[],e.rawAppServerMessages.push(JS({direction:t.direction,method:t.method,providerThreadId:t.providerThreadId,providerTurnId:t.providerTurnId,message:t.message,at:new Date().toISOString()})),Bl(e.rawAppServerMessages,Ly,Uy)}function NS(e,t,r,n){let o=PM(e,t,n);switch(t.type){case"runner.status.changed":e.liveStatus={phase:t.phase,headline:t.headline,detail:t.detail,itemId:t.itemId,providerTurnId:t.providerTurnId,updatedAt:new Date().toISOString()};break;case"runner.turn.started":Cy(e,{providerThreadId:t.providerThreadId,providerTurnId:t.providerTurnId,status:"started",startedAt:t.startedAtMs?new Date(t.startedAtMs).toISOString():new Date().toISOString()}),Vi(e,t.providerTurnId),xS(r,e,o,{providerThreadId:t.providerThreadId,providerTurnId:t.providerTurnId},t.startedAtMs?new Date(t.startedAtMs).toISOString():new Date().toISOString()),UM(e,{providerThreadId:t.providerThreadId,providerTurnId:t.providerTurnId});break;case"runner.turn.completed":e.lastRunUsage=YT(t.usage)??e.lastRunUsage,t.providerTurnId&&Cy(e,{providerThreadId:t.providerThreadId,providerTurnId:t.providerTurnId,status:"completed",completedAt:t.completedAtMs?new Date(t.completedAtMs).toISOString():new Date().toISOString()});break;case"runner.item.started":Ty(e,Dy(t.itemId,t.item,"started",t.providerThreadId,t.providerTurnId,t.startedAtMs)),by(r,o,t.providerTurnId,t.itemId,t.item,"started",t.startedAtMs),GM(e,t.itemId),e.liveStatus=LS(e.codexItems.find(i=>i.itemId===t.itemId),"started");break;case"runner.item.delta":qM(e,t),AM(r,o,t),t.deltaKind==="agentMessage"&&$M(e,{itemId:t.itemId,providerThreadId:t.providerThreadId,providerTurnId:t.providerTurnId,delta:t.delta});break;case"runner.item.completed":Ty(e,Dy(t.itemId,t.item,"completed",t.providerThreadId,t.providerTurnId,t.completedAtMs)),by(r,o,t.providerTurnId,t.itemId,t.item,"completed",t.completedAtMs),t.item.type==="agentMessage"&&t.item.text&&LM(e,{itemId:t.itemId,providerThreadId:t.providerThreadId,providerTurnId:t.providerTurnId,text:t.item.text}),e.activeItemIds=(e.activeItemIds??[]).filter(i=>i!==t.itemId),e.liveStatus=XM(e);break;default:break}}function UM(e,t){let r=[...e.memberPathRuns??[]].reverse().find(n=>n.status==="starting");r&&Object.assign(r,{status:"executing",session:t})}function FM(e){return"session"in e?e.session:void 0}function jM(e,t){if(!e.providerThreadId||!e.providerTurnId)throw new Error(`Member Path ${t} completed without a provider session`);return{providerThreadId:e.providerThreadId,providerTurnId:e.providerTurnId}}function WM(e,t){let r=new Date().toISOString(),n=re(t,Y);for(let o of e.memberPathRuns??[]){let i=o.status;i!=="starting"&&i!=="executing"&&i!=="running"||Object.assign(o,{status:"failed",error:n,completedAt:r})}}function _l(e,t,r){let n=new Date().toISOString(),o=re(r,Y);for(let i of t.agentSessions??[])i.state.type==="completed"||i.state.type==="failed"||(i.error=o,i.state={type:"failed",provider:i.provider,error:o,completedAt:n},i.activeItemIds=[],Rr(i,n),_n(i),Yt(e,i));t.activeAgentSessionId=void 0}function Cy(e,t){e.codexTurns??=[];let r=e.codexTurns.find(n=>n.providerTurnId===t.providerTurnId);if(!r){e.codexTurns.push(t);return}Object.assign(r,t)}function Ty(e,t){e.codexItems??=[];let r=e.codexItems.find(s=>s.itemId===t.itemId);if(!r){e.codexItems.push(Ya(t));return}let n=t.type==="commandExecution"&&t.commandActions===void 0&&r.commandActions!==void 0,o=r.startedAt??t.startedAt,i=t.completedAt??r.completedAt;Object.assign(r,{itemId:t.itemId,providerThreadId:t.providerThreadId??r.providerThreadId,providerTurnId:t.providerTurnId??r.providerTurnId,type:t.type,status:t.status,title:n?r.title:t.title,detail:t.detail??r.detail,text:t.text??r.text,summary:t.summary??r.summary,content:t.content??r.content,command:t.command??r.command,cwd:t.cwd??r.cwd,commandActions:t.commandActions??r.commandActions,output:t.output??r.output,changes:t.changes??r.changes,rawItem:t.rawItem??r.rawItem,durationMs:MS(_S(o,i,t.durationMs,r.durationMs)),startedAt:o,completedAt:i,updatedAt:t.updatedAt}),Ya(r)}function GM(e,t){e.activeItemIds??=[],e.activeItemIds.includes(t)||e.activeItemIds.push(t)}function Dy(e,t,r,n,o,i){let s=i?new Date(i).toISOString():new Date().toISOString();return{itemId:e,providerThreadId:n,providerTurnId:o,type:t.type,status:r,title:Ml(t),detail:VM(t),text:t.text,summary:t.summary,content:t.content,command:t.command,cwd:t.cwd,commandActions:t.commandActions,output:t.aggregatedOutput,changes:t.changes,rawItem:t,durationMs:t.durationMs,...r==="started"?{startedAt:s}:{completedAt:s},updatedAt:s}}function qM(e,t){e.codexItems??=[];let r=e.codexItems.find(i=>i.itemId===t.itemId),n=new Date().toISOString();r||(r={itemId:t.itemId,providerThreadId:t.providerThreadId,providerTurnId:t.providerTurnId,type:BS(t.deltaKind),status:"streaming",title:OS(t.deltaKind),updatedAt:n},e.codexItems.push(r)),r.status=r.status==="completed"?"completed":"streaming",r.updatedAt=n;let o=re(t.delta,Y);switch(t.deltaKind){case"agentMessage":r.text=re(`${r.text??""}${o}`,Y);break;case"plan":r.text=re(`${r.text??""}${o}`,Y);break;case"reasoningText":r.content=zr(Xa(r.content,o,t.contentIndex));break;case"reasoningSummary":r.summary=zr(Xa(r.summary,o,t.contentIndex));break;case"commandOutput":case"fileChangeOutput":r.output=re(`${r.output??""}${o}`,Y);break}Ya(r),e.liveStatus=KM(t)}function Xa(e,t,r){let n=[...e??[]],o=r??Math.max(n.length-1,0);return n[o]=`${n[o]??""}${t}`,n}function BS(e){switch(e){case"agentMessage":return"agentMessage";case"plan":return"plan";case"reasoningText":case"reasoningSummary":return"reasoning";case"fileChangeOutput":return"fileChange";case"commandOutput":return"commandExecution"}}function OS(e){switch(e){case"agentMessage":return"Assistant";case"plan":return"Planning";case"reasoningText":case"reasoningSummary":return"Reasoning";case"fileChangeOutput":return"Applying file changes";case"commandOutput":return"Running command"}}function Ml(e){switch(e.type){case"userMessage":return"Prompt";case"agentMessage":return"Assistant";case"reasoning":return"Reasoning";case"plan":return"Plan";case"commandExecution":return $S(e)?"Exploring":"Running command";case"fileChange":return"File changes";case"mcpToolCall":return e.server&&e.tool?`Tool ${e.server}.${e.tool}`:"Tool call";case"webSearch":return"Web search";default:return e.type}}function VM(e){switch(e.type){case"commandExecution":return JM(e);case"fileChange":return zM(e.changes);case"mcpToolCall":return e.server&&e.tool?`${e.server}.${e.tool}`:void 0;case"webSearch":return e.query;case"plan":case"userMessage":case"agentMessage":return e.text;case"reasoning":return[...e.summary??[],...e.content??[]].join(`
|
|
105
|
+
`);default:return}}function JM(e){let t=e.commandActions?.[0];if(!t)return e.command;switch(t.type){case"read":return t.path??t.name??e.command;case"listFiles":return t.path??e.command;case"search":return[t.query,t.path].filter(Boolean).join(" in ")||e.command;case"unknown":return t.command??e.command}}function zM(e){if(Array.isArray(e))return e.map(t=>typeof t=="object"&&t!==null&&"path"in t?String(t.path):void 0).filter(Boolean).join(", ")}function $S(e){let t=e?.commandActions;return!!(t&&t.length>0&&t.every(r=>r.type==="read"||r.type==="listFiles"||r.type==="search"))}function LS(e,t){let r=new Date().toISOString();return e?e.type==="reasoning"||e.type==="plan"?{phase:"thinking",headline:e.type==="plan"?"Planning":"Reasoning",detail:e.detail,itemId:e.itemId,providerTurnId:e.providerTurnId,updatedAt:r}:e.type==="commandExecution"&&$S(e)?{phase:"exploring",headline:e.status==="completed"?"Explored":"Exploring",detail:e.detail,itemId:e.itemId,providerTurnId:e.providerTurnId,updatedAt:r}:e.type==="commandExecution"||e.type==="mcpToolCall"||e.type==="webSearch"?{phase:"running",headline:e.title,detail:e.detail,itemId:e.itemId,providerTurnId:e.providerTurnId,updatedAt:r}:{phase:"working",headline:e.title,detail:e.detail,itemId:e.itemId,providerTurnId:e.providerTurnId,updatedAt:r}:{phase:"working",headline:t==="completed"?"Working":"Starting",updatedAt:r}}function KM(e){let t=new Date().toISOString();switch(e.deltaKind){case"reasoningText":case"reasoningSummary":return{phase:"thinking",headline:"Reasoning",detail:yr(e.delta.trim(),160),itemId:e.itemId,providerTurnId:e.providerTurnId,updatedAt:t};case"commandOutput":return{phase:"running",headline:"Running command",detail:yr(e.delta.trim(),160),itemId:e.itemId,providerTurnId:e.providerTurnId,updatedAt:t};case"fileChangeOutput":return{phase:"working",headline:"Applying file changes",detail:yr(e.delta.trim(),160),itemId:e.itemId,providerTurnId:e.providerTurnId,updatedAt:t};case"plan":return{phase:"thinking",headline:"Planning",detail:yr(e.delta.trim(),160),itemId:e.itemId,providerTurnId:e.providerTurnId,updatedAt:t};case"agentMessage":return{phase:"working",headline:"Responding",itemId:e.itemId,providerTurnId:e.providerTurnId,updatedAt:t}}}function XM(e){let t=e.activeItemIds??[],r=(e.codexItems??[]).find(n=>t.includes(n.itemId));return r?LS(r,r.status):{phase:gt(e.status)?"working":"idle",headline:gt(e.status)?"Working":"Idle",updatedAt:new Date().toISOString()}}async function US(e,t,r,n){let o=r.runs[e.runId];if(!o||o.status==="stopped")return;let i=o.maxAttemptCount??Nl(e.maxAttemptCount);o.maxAttemptCount=i,o.memberEvaluations??=[];let s=mo((o.attemptCount??0)+1,"attempt");o.attemptCount=s,o.updatedAt=new Date().toISOString(),se(r,o);let a={...e,attemptOrdinal:s,maxAttemptCount:i,previousMemberOutputs:o.memberEvaluations?.map(qi),repositoryPath:o.worktree?.path??e.repositoryPath,worktreeHash:o.worktree?.worktreeHash??e.worktreeHash,conversationRef:o.conversationRef??e.conversationRef};await Ji(a.repositoryPath,a.harness,{phase:"team",apmSkillRegistryClient:n.apmSkillRegistryClient});let d=n.resumeProviderThreadId;n.resumeProviderThreadId=void 0;let u=od(r,o,{kind:"TeamPlan",runId:o.runId,executeId:o.executeId,attempt:s}),c;try{c=await ad(t,o.runId,r,u.sessionId,()=>d?t.resumeRun({...a,providerThreadId:d}):t.runTeamPlanning(a))}catch(v){throw Jr(r,o,u.sessionId,v),v}if(!gt(o.status))return;if(o.providerTeamThreadId=c.providerThreadId??o.providerTeamThreadId,o.providerTeamPlanningTurnId=c.providerTurnId??o.providerTeamPlanningTurnId,o.providerThreadId=c.providerThreadId??o.providerThreadId,Vi(o,c.providerTurnId),sd(r,o,u,c,o.updatedAt),o.conversationRef?.provider==="codex"&&c.providerThreadId&&(o.conversationRef={...o.conversationRef,threadId:F(k(c.providerThreadId,"conversation.threadId"))}),o.finalResponse=c.finalResponse,o.updatedAt=new Date().toISOString(),se(r,o),!c.finalResponse)throw Jr(r,o,u.sessionId,"Team planning completed without a ExecutionPlan"),pi(B("team_output_invalid","Team planning completed without a ExecutionPlan"));let m;try{m=ln(cc(c.finalResponse))}catch(v){throw Jr(r,o,u.sessionId,v),v}let f=o.worktree?.path??n.cwd,p=o.pathCommits?.PrevMove??dH(f,o.worktree);o.pathCommits={PrevMove:p},o.currentExecution=m,o.executionPlanPlan=void 0,o.terminalMemberPathId=void 0,o.terminalPathCommit=void 0,o.updatedAt=new Date().toISOString(),my(f,m);let g=ta({cwd:f,runId:o.runId,pathId:"current-execution.plan",executorId:"team",goal:"Materialize current ExecutionPlan.",requires:"PrevMove",paths:[it]});for(o.pathCommits["current-execution.plan"]=g.commitSha,id(r,o,u.sessionId,c.finalResponse,o.updatedAt),se(r,o);gt(o.status);){let v=await Hl(m,{attempt:s,attemptInput:a,currentExecution:m,runner:t,state:r,run:o,worktreeCwd:f,options:n});if(!gt(o.status))return;if(v.type==="next"){if(m=v.execution,o.currentExecution=m,my(f,m),v.terminalPath)yl(o,v.terminalPath,v.finalResponse??"",f,r);else{let ve=ta({cwd:f,runId:o.runId,pathId:"current-execution.next",executorId:"team",goal:"Materialize next ExecutionPlan.",requires:"PrevMove",paths:[it]});o.pathCommits??={},o.pathCommits["current-execution.next"]=ve.commitSha}o.updatedAt=new Date().toISOString(),se(r,o);continue}if(v.type==="fail"){fy(f),v.terminalPath&&yl(o,v.terminalPath,v.finalResponse??v.reason.message,f,r),await om(v.reason.message,im(o),r,{cwd:n.cwd,persist:n.persist,runId:o.runId,summary:"ExecutionPlan failed"});return}fy(f),v.terminalPath&&yl(o,v.terminalPath,v.finalResponse??"",f,r);let A=v.terminalPath;if(!A)throw pi(B("terminal_output_missing","ExecutionPlan completed without a terminal Path"));let C=o.memberPathRuns?.filter(ve=>ve.attempt===s&&ve.pathId===A.id).at(-1),D=C&&"commit"in C?C.commit:void 0;D&&(o.terminalMemberPathId=A.id,o.terminalPathCommit=D,o.updatedAt=new Date().toISOString(),se(r,o));let R=C&&"finalResponse"in C?C.finalResponse:void 0,P=ln(lv(R??v.finalResponse)),L=nH({finalResponse:P,run:o,terminalPath:A,terminalPathRun:C}),q={...L,terminalPathId:A.id,terminalPathCommit:D,attempt:s,at:new Date().toISOString()};o.memberEvaluations.push(q),o.currentExecution=void 0,o.updatedAt=q.at,se(r,o),await lH(L,r,{cwd:n.cwd,persist:n.persist,runId:o.runId,runner:t});return}}async function Hl(e,t){switch(e.kind){case"queue":{let[r]=e.items;if(!r)return{type:"done"};let n=await Hl(r,t);if(n.type==="fail")return n;let o=n.type==="next"?n.execution:void 0,i=rv(e,o);return i?{type:"next",execution:i,terminalPath:n.terminalPath,finalResponse:n.finalResponse}:{type:"done",terminalPath:n.terminalPath,finalResponse:n.finalResponse}}case"goal":return YM(e,t);case"continuation":{let r=await Hl(e.execution,{...t,attemptInput:{...t.attemptInput,teamScopeId:e.teamScopeId}});return r.type==="fail"?r:r.type==="next"?{type:"next",execution:{...e,execution:r.execution},terminalPath:r.terminalPath,finalResponse:r.finalResponse}:r.terminalPath?e.continuation?{type:"next",execution:{...e.continuation,requires:[r.terminalPath.id]},terminalPath:r.terminalPath,finalResponse:r.finalResponse}:{type:"done",terminalPath:r.terminalPath,finalResponse:r.finalResponse}:{type:"fail",reason:B("terminal_output_missing",`Nested Team ${e.id} completed without a terminal Path`),finalResponse:r.finalResponse}}}}async function YM(e,t){if(e.stage==="needs_execution")return QM(e,t);if(!e.evaluator)return FS(e,t,e.assignee.goal,e.requires,"done");let r=lc(e,"evaluator",WS(t.run,e.id,"evaluate"),e.requires),n=await jS(r,t,{outputSchema:og}),o=ln(tv(n.finalResponse));return o.type==="pass"?{type:"done",terminalPath:r,finalResponse:o.summary||n.finalResponse}:e.remainingAttempts<1?{type:"fail",reason:B("max_attempts_exhausted",o.reason,{feedback:o.feedback}),terminalPath:r,finalResponse:n.finalResponse}:{type:"next",execution:{...e,stage:"needs_execution",evaluationPathId:r.id,evaluation:o,requires:[r.id]},terminalPath:r,finalResponse:n.finalResponse}}async function QM(e,t){let r=[e.evaluation.nextGoal??e.assignee.goal,"","Evaluator feedback:",e.evaluation.feedback].join(`
|
|
106
|
+
`).trim(),n=await FS(e,t,r,e.requires,"next");if(n.type==="next"&&n.execution.kind!=="goal")return n;let o=n.terminalPath;if(!o)return n;let i=GS(e.remainingAttempts-1);return{type:"next",execution:{kind:"goal",stage:"needs_evaluation",id:e.id,assignee:{...e.assignee,goal:e.evaluation.nextGoal??e.assignee.goal},evaluator:e.evaluator,remainingAttempts:i,requires:[o.id]},terminalPath:o,finalResponse:n.finalResponse}}async function FS(e,t,r,n,o){let i=eH(t,e.assignee.executorId);if(i?.kind==="team"){let u=await ZM(i.id,r,t);return o==="next"?{type:"next",execution:{kind:"continuation",id:`${e.id}.${i.id}.continuation`,teamScopeId:i.id,execution:u,continuation:{kind:"goal",stage:"needs_evaluation",id:e.id,assignee:{...e.assignee,goal:r},evaluator:e.evaluator,remainingAttempts:GS(e.remainingAttempts-1),requires:[]}}}:{type:"next",execution:{kind:"continuation",id:`${e.id}.${i.id}.continuation`,teamScopeId:i.id,execution:u}}}let s={...e,assignee:{...e.assignee,goal:r}},a=lc(s,"assignee",WS(t.run,e.id,"execute"),n),d=await jS(a,t);return{type:o,terminalPath:a,finalResponse:d.finalResponse,execution:o==="next"?s:void 0}}async function ZM(e,t,r){let n=tH(r),o=an(n,e),i={...r.attemptInput,requestGoal:t,harness:o,harnessGraph:n,teamScopeId:e,previousMemberOutputs:r.run.memberEvaluations?.map(qi)};await Ji(r.worktreeCwd,o,{phase:"team",apmSkillRegistryClient:r.options.apmSkillRegistryClient});let s=od(r.state,r.run,{kind:"TeamPlan",runId:r.run.runId,executeId:r.run.executeId,attempt:r.attempt});try{let a=await ad(r.runner,r.run.runId,r.state,s.sessionId,()=>r.runner.runTeamPlanning(i));if(r.run.providerTeamThreadId=a.providerThreadId??r.run.providerTeamThreadId,r.run.providerTeamPlanningTurnId=a.providerTurnId??r.run.providerTeamPlanningTurnId,r.run.providerThreadId=a.providerThreadId??r.run.providerThreadId,Vi(r.run,a.providerTurnId),sd(r.state,r.run,s,a,r.run.updatedAt),!a.finalResponse)throw Jr(r.state,r.run,s.sessionId,`Team ${e} planning completed without a ExecutionPlan`),pi(B("team_output_invalid",`Team ${e} planning completed without a ExecutionPlan`));let d=ln(cc(a.finalResponse));return id(r.state,r.run,s.sessionId,a.finalResponse,new Date().toISOString()),d}catch(a){throw Jr(r.state,r.run,s.sessionId,a),a}}function eH(e,t){let r=e.attemptInput.harnessGraph;if(!r)return;let n=e.attemptInput.teamScopeId??r.rootTeamId,o=As(r,n);if(!o||o.kind!=="team")throw new Error(`Harness Team scope is unavailable: ${n}`);if(!o.members.some(s=>s.executorId===t))throw new Error(`Team ${n} cannot delegate to Executor ${t}; it is not a direct Membership`);let i=As(r,t);if(!i)throw new Error(`Team ${n} references unknown Executor ${t}`);return i}function tH(e){let t=e.attemptInput.harnessGraph;if(!t)throw new Error("Nested Team delegation requires a Harness Executor graph");return t}async function jS(e,t,r={}){let n=[],o=od(t.state,t.run,{kind:"ExecutionPlan",runId:t.run.runId,executeId:t.run.executeId,attempt:t.attempt,pathId:e.id,executorId:e.executorId}),i={pathId:e.id,executorId:e.executorId,goal:e.goal,requires:e.requires,attempt:t.attempt,agentSessionId:o.sessionId,status:"starting",dependencyPathIds:e.requires==="PrevMove"?[]:e.requires,dependencyOutputs:n,startedAt:new Date().toISOString()};t.run.memberPathRuns??=[],t.run.memberPathRuns.push(i),t.run.updatedAt=i.startedAt,se(t.state,t.run);let s=rH(t),a=s?zn(s,e.executorId):void 0,d=a?.modelSelection?await nm(kS(t.run,a.modelSelection),{providerInventory:t.options.providerInventory},a.modelSelection):void 0,u={...t.attemptInput,board:J(t.state,{cwd:t.options.cwd,persist:t.options.persist}),harness:s,resolvedModelSelection:d?.provider??t.attemptInput.resolvedModelSelection,memberPath:e,dependencyOutputs:n,worktreeStatus:VS(t.worktreeCwd),worktreeDiff:uH(t.worktreeCwd),attemptTranscript:cH(t.run.debugEvents),outputSchema:r.outputSchema};try{await Ji(t.worktreeCwd,s,{phase:"member",executorId:e.executorId,apmSkillRegistryClient:t.options.apmSkillRegistryClient});let c=await ad(t.runner,t.run.runId,t.state,o.sessionId,()=>t.runner.runMemberPath(u));if(!gt(t.run.status))return{pathRun:i,finalResponse:""};t.run.providerMemberThreadId=c.providerThreadId??t.run.providerMemberThreadId,t.run.providerThreadId=c.providerThreadId??t.run.providerThreadId,Vi(t.run,c.providerTurnId);let m=FM(i)??sd(t.state,t.run,o,c)??jM(c,e.id),f=c.finalResponse??"";B_(t.worktreeCwd);let p=new Date().toISOString();return Object.assign(i,{status:"completed",session:m,finalResponse:f,completedAt:p}),id(t.state,t.run,o.sessionId,f,p),t.run.updatedAt=p,se(t.state,t.run),{pathRun:i,finalResponse:f}}catch(c){let m=new Date().toISOString();throw Object.assign(i,{status:"failed",error:c instanceof Error?c.message:String(c),completedAt:m}),Jr(t.state,t.run,o.sessionId,c,m),t.run.updatedAt=m,se(t.state,t.run),c}}function rH(e){let t=e.attemptInput.harnessGraph;return t?an(t,e.attemptInput.teamScopeId??t.rootTeamId):e.attemptInput.harness}function yl(e,t,r,n,o){let i=[...e.memberPathRuns??[]].reverse().find(a=>a.pathId===t.id),s=ta({cwd:n,runId:e.runId,pathId:t.id,executorId:t.executorId,goal:t.goal,requires:t.requires});e.pathCommits??={},e.pathCommits[t.id]=s.commitSha,i&&Object.assign(i,{status:"completed",finalResponse:r,commit:s.commitSha,parentCommit:s.parentSha,treeChanged:s.treeChanged,completedAt:new Date().toISOString()}),e.updatedAt=new Date().toISOString(),se(o,e)}function WS(e,t,r){return`${t}.${r}.${(e.memberPathRuns?.length??0)+1}`}function GS(e){return Number.isInteger(e)&&e>0?e:0}function nH(e){let t=e.terminalPathRun,r=t&&"session"in t?t.session:void 0,n=t&&"commit"in t?t.commit:void 0,o=t&&"treeChanged"in t?t.treeChanged:void 0,i=yr(kH(e.finalResponse)??`Completed terminal Path ${e.terminalPath.id}`,240),s=[`Terminal Path ${e.terminalPath.id} completed`,n?`Terminal Path commit ${n}`:void 0,o===void 0?void 0:`Terminal Path tree changed: ${o?"yes":"no"}`,r?`Terminal Path session ${r.providerThreadId}/${r.providerTurnId}`:void 0,e.run.selectedDestinationIds.length===1?`Selected Destination: ${e.run.selectedDestinationIds[0]}`:void 0].filter(a=>!!(a&&a.trim()));return{summary:i,evidence:s,risks:[]}}function oH(e,t,r){let n=r.runs[e];n&&n.status!=="stopped"&&(n.error=t instanceof Error?t.message:String(t),_l(r,n,n.error),kr(n,"failed"),se(r,n))}async function qS(e,t,r,n){let o=r.runs[e];if(!o||o.status==="stopped"||o.status==="arrived"||o.status==="accident")return;let i=t instanceof Error?t.message:String(t);o.error=i,_l(r,o,i);try{await om(i,[`runner error: ${i}`,...im(o)],r,{cwd:n.cwd,persist:n.persist,runId:e,summary:"Execute failed during execution"})}catch(s){o.error=`${i}; failed to record Accident: ${s instanceof Error?s.message:String(s)}`,_l(r,o,o.error),kr(o,"failed"),se(r,o)}}function Nl(e){if(e===void 0)return mo(5,"maxAttemptCount");if(!Number.isInteger(e)||e<1)throw new Error("maxAttemptCount must be a positive integer");return mo(e,"maxAttemptCount")}function iH(e){switch(e.kind){case"team_execution_plan":return Nl(e.maxAttemptCount);case"role_squad":case"council_vote":case"court_debate":return Nl(e.maxRoundCount)}}function sH(e){let t=vo(e.board,e.run.requestId),r=dm(e.board,e.run.lineId),n=ho(e.board,e.run.lineId),o=Yr(e.board,e.run.lineId).filter(Ir);return{runId:e.run.runId,executeId:e.run.executeId,repositoryPath:e.cwd,worktreeHash:e.run.worktree?.worktreeHash,sourceMoveId:e.run.sourceMoveId,targetMoveOrdinal:e.run.targetMoveOrdinal,requestGoal:t.goal,teamName:r.teamName??n?.teamName,harness:n?.harness,harnessLock:e.run.harnessLock??n?.harnessLock,activeDestinations:o,selectedDestinationIds:e.run.selectedDestinationIds,futureConstraints:e.board.futureConstraints.filter(i=>i.lineId===e.run.lineId).map(i=>i.constraint),attemptOrdinal:e.run.attemptCount,maxAttemptCount:e.run.maxAttemptCount,previousMemberOutputs:e.run.memberEvaluations?.map(qi),conversationRef:e.run.conversationRef,board:e.board,moveId:e.moveId,sourceMoveCommit:e.sourceMoveCommit,terminalPathCommit:e.terminalPathCommit,terminalMemberPathId:e.run.terminalMemberPathId,pathCommits:e.run.pathCommits??{},pathOutputs:aH(e.run),completionSummary:e.completion.summary,diffStat:Sl(e.cwd,e.sourceMoveCommit,e.terminalPathCommit,"stat"),diffNameStatus:Sl(e.cwd,e.sourceMoveCommit,e.terminalPathCommit,"name-status"),diffPatch:Sl(e.cwd,e.sourceMoveCommit,e.terminalPathCommit,"patch")}}function aH(e){return(e.memberPathRuns??[]).filter(t=>t.status==="completed").map(t=>({pathId:t.pathId,executorId:t.executorId,goal:t.goal,commit:t.commit,finalResponse:t.finalResponse}))}function Sl(e,t,r,n){try{return n==="stat"?w(["diff","--stat",t,r],{cwd:e}).trim():n==="name-status"?w(["diff","--name-status",t,r],{cwd:e}).trim():yr(w(["diff",t,r,"--","."],{cwd:e}),16e3).trim()}catch(o){return`diff unavailable: ${o instanceof Error?o.message:String(o)}`}}function dH(e,t){return t?.baseRef&&t.baseRef!=="virtual"?pe(w(["rev-parse","--verify",`${t.baseRef}^{commit}`],{cwd:e}).trim()):pe(em(e))}function VS(e){try{let t=Ne(e),r=t.changes.map(n=>`${n.status} ${n.path}`).join(`
|
|
107
|
+
`);return[`root: ${t.root}`,`branch: ${t.branch}`,`clean: ${t.clean}`,"changes:",r||"- none"].join(`
|
|
108
|
+
`)}catch(t){return`status unavailable: ${t instanceof Error?t.message:String(t)}`}}function uH(e){try{let t=w(["diff","--stat"],{cwd:e}).trim(),r=w(["diff","--cached","--stat"],{cwd:e}).trim(),n=w(["diff","--","."],{cwd:e}),o=w(["diff","--cached","--","."],{cwd:e});return yr([t?`Unstaged stat:
|
|
109
|
+
${t}`:"",r?`Staged stat:
|
|
110
|
+
${r}`:"",n?`Unstaged diff:
|
|
111
|
+
${n}`:"",o?`Staged diff:
|
|
112
|
+
${o}`:""].filter(Boolean).join(`
|
|
113
|
+
|
|
114
|
+
`),12e3)||"No worktree diff."}catch(t){return`diff unavailable: ${t instanceof Error?t.message:String(t)}`}}function cH(e){return yr(e.slice(-40).map(t=>t.type==="runner.final"?`${t.type}: ${t.finalResponse}`:t.type==="runner.error"?`${t.type}: ${t.error}`:t.type==="runner.status.changed"?`${t.type}: ${t.headline}${t.detail?` - ${t.detail}`:""}`:t.type==="runner.turn.started"||t.type==="runner.turn.completed"?`${t.type}: ${t.providerTurnId??"unknown turn"}`:t.type==="runner.item.started"||t.type==="runner.item.completed"?`${t.type}: ${t.item.type} ${t.itemId}`:t.type==="runner.item.delta"?`${t.type}: ${t.deltaKind} ${yr(t.delta,200)}`:t.type==="runner.appServer.message"?`${t.type}: ${t.direction} ${t.method??"unknown"}`:"unknown runner event").join(`
|
|
115
|
+
`),8e3)}function qi(e){return[`attempt ${e.attempt}`,`summary: ${e.summary}`,e.terminalPathId?`terminalPath: ${e.terminalPathId}`:void 0,e.terminalPathCommit?`terminalCommit: ${e.terminalPathCommit}`:void 0,`evidence: ${e.evidence.join("; ")||"none"}`,`risks: ${e.risks.join("; ")||"none"}`].filter(t=>t!==void 0).join(" | ")}function im(e){let t=e.memberEvaluations??[],r=t.flatMap(n=>n.evidence);return[`attempts: ${e.attemptCount??0}/${e.maxAttemptCount??5}`,...t.map(qi),...r].filter((n,o,i)=>n.trim()!==""&&i.indexOf(n)===o)}async function lH(e,t,r){try{await mM(e,t,r);return}catch(n){let o=n instanceof Error?n.message:String(n),i=mH(o);if(!i)throw n;let s=Mn(t,r.runId,r.cwd);await om(i,[i,...im(s),VS(s.worktree?.path??r.cwd)],t,{cwd:r.cwd,persist:r.persist,runId:s.runId,summary:"Path completion could not be recorded"})}}function mH(e){if(e==="Cannot auto-record MOVE without worktree changes")return"Terminal Path completed, but Studio could not record Arrived MOVE because the Route worktree had no product file changes.";if(e==="Cannot auto-record MOVE when the Team changed Hunsu control-plane files")return"Terminal Path completed, but Studio declined Arrived MOVE because the Execute changed Hunsu control-plane files."}function yr(e,t){return e.length<=t?e:`${e.slice(0,t)}
|
|
116
|
+
...[truncated]`}function re(e,t){if(Buffer.byteLength(e,"utf8")<=t)return e;let r=Buffer.byteLength(Ja,"utf8"),n=Math.max(0,t-r),o=0,i=e.length,s=0;for(;o<=i;){let a=Math.floor((o+i)/2),d=e.slice(0,a);Buffer.byteLength(d,"utf8")<=n?(s=a,o=a+1):i=a-1}return`${e.slice(0,s)}${Ja}`}function ue(e,t){return e===void 0?void 0:re(e,t)}function zr(e,t=Jt){return e?.map(r=>re(r,t))}function dd(e){try{return Buffer.byteLength(JSON.stringify(e)??"null","utf8")}catch{return Number.MAX_SAFE_INTEGER}}function Bl(e,t,r){for(e.length>t&&e.splice(0,e.length-t);e.length>0&&dd(e)>r;)e.shift()}function fo(e,t=Y,r=0){if(typeof e=="string")return re(e,t);if(e==null||typeof e!="object")return e;if(r>=8)return`...${Ja}`;if(Array.isArray(e)){let i=e.slice(0,200).map(s=>fo(s,t,r+1));return e.length>i.length&&i.push(`...${Ja}`),i}let n={},o=Object.entries(e);for(let[i,s]of o.slice(0,200))n[i]=fo(s,t,r+1);return o.length>200&&(n.__truncated=!0),n}function sm(e){return fo(e,Jt)}function JS(e){return{...e,method:ue(e.method,Jt),providerThreadId:ue(e.providerThreadId,Jt),providerTurnId:ue(e.providerTurnId,Jt),message:fo(e.message,Jt)}}function Ya(e){return e.title=re(e.title,Jt),e.detail=ue(e.detail,Y),e.text=ue(e.text,Y),e.summary=zr(e.summary),e.content=zr(e.content),e.command=ue(e.command,Y),e.cwd=ue(e.cwd,Jt),e.output=ue(e.output,Y),e.changes=fo(e.changes),e.rawItem=void 0,e}function am(e){return e.title=re(e.title,Jt),e.text=ue(e.text,Y),e.summary=zr(e.summary),e.content=zr(e.content),e.command=ue(e.command,Y),e.cwd=ue(e.cwd,Jt),e.output=ue(e.output,Y),e.changes=fo(e.changes),e}function _n(e){for(e.finalResponse=ue(e.finalResponse,Y),e.error=ue(e.error,Y),e.messages.forEach(am);e.messages.length>0&&dd(e.messages)>xT;){let t=e.messages.findIndex(r=>!e.activeItemIds.includes(r.itemId));e.messages.splice(t>=0?t:0,1)}}function fH(e){for(e.forEach(Ya);e.length>0&&dd(e)>AT;)e.shift()}function pH(e){for(let t of e)t.text=re(t.text,Y);for(;e.length>0&&dd(e)>bT;)e.shift()}function Ui(e){e.debugEvents??=[],e.rawAppServerMessages??=[],e.codexItems??=[],e.agentSessions??=[],e.assistantTranscript??=[];for(let t=0;t<e.debugEvents.length;t+=1)e.debugEvents[t]=sm(e.debugEvents[t]);for(let t=0;t<e.rawAppServerMessages.length;t+=1)e.rawAppServerMessages[t]=JS(e.rawAppServerMessages[t]);Bl(e.debugEvents,ET,PT),Bl(e.rawAppServerMessages,Ly,Uy),fH(e.codexItems),pH(e.assistantTranscript),e.agentSessions.forEach(_n)}function kr(e,t){e.status=t,e.updatedAt=new Date().toISOString(),(t==="failed"||t==="accident")&&WM(e,e.error??Ol(t)),gt(t)||(e.activeItemIds=[],e.liveStatus={phase:"idle",headline:Ol(t),detail:e.error,updatedAt:e.updatedAt})}function Vi(e,t){t&&(e.providerTurnIds??=[],e.providerTurnIds.includes(t)||e.providerTurnIds.push(t))}function gt(e){return e==="running"||e==="paused"}function Ol(e){switch(e){case"running":return"Executing";case"paused":return"Paused";case"arrived":return"Arrived";case"accident":return"Accident";case"failed":return"Failed";case"discarded":return"Discarded";case"finished":return"Finished";case"stopped":return"Stopped"}}function gH(e,t){try{return w(["rev-parse","--verify","HEAD"],{cwd:e}).trim()}catch{return t?.baseRef&&t.baseRef!=="virtual"?t.baseRef:"uncommitted"}}function vo(e,t){let r=t?e.requests.find(n=>n.id===t):e.requests[0];if(!r)throw new Error(t?`Unknown request: ${t}`:"No request exists");return r}function zS(e,t,r){let n=e.lines.filter(i=>i.requestId===t),o=r?e.lines.find(i=>i.id===r):n.findLast(i=>i.status==="active")??n.at(-1);if(!o)throw new Error(r?`Unknown line: ${r}`:`No line exists for request: ${t}`);return o}function dm(e,t){let r=e.lines.find(n=>n.id===t);if(!r)throw new Error(`Unknown line: ${t}`);return r}function vH(e,t){return e.lines.find(r=>String(r.currentNodeId)===String(t.id)||String(r.rootNodeId)===String(t.id)||!!(t.lineId&&String(t.lineId)===String(r.id)))}function um(e,t){let r=t.source;return r.type==="move"?e.moves.find(n=>n.id===r.moveId):e.moves.find(n=>n.toNodeId===t.id)}function KS(e){let t=Ps(e);if(!t.ok)throw new Error(t.error.message);return t.value}function XS(e){return`conv_${qe(Ge("sha256").update(JSON.stringify(e))).slice(0,16)}`}function YS(e,t,r){return qe(Ge("sha256").update(JSON.stringify({requestId:t.requestId,nodeId:t.id,ordinal:t.ordinal,destinations:t.destinations.map(n=>[n.id,n.title,n.status]),harness:t.harness,lineCount:e.lines.length,moveCount:e.moves.length,hunsuCount:e.hunsus.length,message:r})))}function hH(e){try{let t=Ne(e);return qe(Ge("sha256").update(JSON.stringify(t)))}catch{return}}function yH(e,t,r){let o=[...(r?po(e,r):Object.values(e.runs)).map(i=>i.executeId??i.runId),...t.moves.flatMap(i=>i.executeId?[String(i.executeId)]:[]),...RH(r)].reduce((i,s)=>{let a=s.match(/^F(\d+)$/i);return a?Math.max(i,Number(a[1])):i},0);return`F${String(o+1).padStart(4,"0")}`}function SH(e){return e.roadmapId?`${e.roadmapId}:${e.executeId}:${e.lineId}`:e.lineId}function RH(e){if(!e)return[];try{let t=j(e);return w(["for-each-ref","--format=%(refname:short)","refs/heads/hunsu/routes"],{cwd:t}).trim().split(/\r?\n/).map(r=>r.trim().split("/").at(-1)??"").filter(Boolean)}catch{return[]}}function QS(e,t,r){let n=qe(Ge("sha256").update(JSON.stringify({cwd:e,executeId:t,createdAt:r}))).slice(0,16);return{worktreeHash:F(nn(n)),path:F(k(e,"worktree.path")),branch:F(k(`virtual/${t}`,"worktree.branch")),baseRef:F(k("virtual","worktree.baseRef")),createdAt:r}}function kH(e){return e.split(/\r?\n/).map(t=>t.trim()).find(t=>t.length>0)}function ZS(e){return`${e.teamName??"Team"} MOVE ${e.ordinal}`}function eR(e,t){let r=e&&e.length>0?e:t;if(r.length!==1)throw new Error("MOVE completion requires exactly one Destination");return[r[0]]}function tR(e){let t=IH(e.filter(Ir));return t?[String(t.id)]:[]}function IH(e){return[...e].sort(wH)[0]}function wH(e,t){return(t.priority??0)-(e.priority??0)}function EH(e,t,r,n,o){if(!r.summary.trim())throw new Error("MOVE completion requires a summary");if(r.evidence.length===0||r.evidence.some(s=>s.trim()===""))throw new Error("MOVE completion requires evidence");if(r.risks&&r.risks.length>0&&!r.approvedRisks)throw new Error("MOVE completion with risks requires explicit approval");for(let s of n){let a=Yr(e,t.lineId).find(d=>d.id===s);if(!a)throw new Error(`Unknown Destination: ${s}`);if(a.requestId!==t.requestId)throw new Error(`Destination ${s} does not belong to request ${t.requestId}`);if(!t.selectedDestinationIds.includes(s))throw new Error(`Destination ${s} was not selected for run ${t.runId}`);if(!Ir(a))throw new Error(`Destination ${s} is not open`)}if(!Ne(o).clean)throw new Error("Cannot record MOVE while worktree has uncommitted changes")}function PH(e,t,r,n,o,i={}){if(!r.summary.trim())throw new Error("MOVE completion requires a summary");if(r.evidence.length===0||r.evidence.some(d=>d.trim()===""))throw new Error("MOVE completion requires evidence");for(let d of n){let u=Yr(e,t.lineId).find(c=>c.id===d);if(!u)throw new Error(`Unknown Destination: ${d}`);if(u.requestId!==t.requestId)throw new Error(`Destination ${d} does not belong to request ${t.requestId}`);if(!t.selectedDestinationIds.includes(d))throw new Error(`Destination ${d} was not selected for run ${t.runId}`);if(!Ir(u))throw new Error(`Destination ${d} is not open`)}if(i.promotedPathCommit){if(!i.prevMoveCommit)throw new Error("Cannot auto-record MOVE without PrevMove commit for ExecutionPlan promotion");if(!AH(o,i.prevMoveCommit,i.promotedPathCommit))throw new Error("Cannot auto-record MOVE without worktree changes");bH(o,i.prevMoveCommit,i.promotedPathCommit);return}let s=Ne(o);if(s.clean)throw new Error("Cannot auto-record MOVE without worktree changes");if(s.changes.find(d=>d.path===".hunsu"||d.path.startsWith(".hunsu/")))throw new Error("Cannot auto-record MOVE when the Team changed Hunsu control-plane files")}function AH(e,t,r){let n=w(["rev-parse","--verify",`${t}^{tree}`],{cwd:e}).trim(),o=w(["rev-parse","--verify",`${r}^{tree}`],{cwd:e}).trim();return n!==o}function bH(e,t,r){if(w(["diff","--name-only",`${t}..${r}`,"--",".hunsu"],{cwd:e}).trim())throw new Error("Cannot auto-record MOVE when the Team changed Hunsu control-plane files")}async function Ji(e,t,r={}){if(!G(e))return;let n=r.executorId&&t?xH(t,r.executorId):void 0,o=n?OH(n.skills):[],i=n?$H(n.plugins??[]):[],s=Qa(r.env??process.env,r.home??zt()),a=WH(e,r.env??process.env,r.home??zt()),d=qH(r.env??process.env,r.home??zt()),u=[];if(UH(e),HH(e),o.length>0){LH(e);let c=H(e,".agents","skills");vt(c,{recursive:!0});for(let m of o){let f=await CH(m,s,r);if(f.length===0)continue;let p=H(c,FH(m.name));MH(p);for(let g of f){let v=jH(p,g.path);vt(Qe(v),{recursive:!0}),At(v,g.text,"utf8")}At(H(p,Wl),`hunsu-managed
|
|
117
|
+
`,"utf8"),u.push(H(p,"SKILL.md"))}}for(let c of i)if(!d.includes(c.id))throw new Error(`Member Codex Environment missing Plugin: ${c.id}`);NH(e,{enabledSkillPaths:u,disabledSkillPaths:a.map(c=>H(c.sourcePath,"SKILL.md")),enabledPluginIds:i.map(c=>c.id),disabledPluginIds:d})}function xH(e,t){let r=e.members.find(n=>n.id===t);if(!r)throw new Error(`Member Codex Environment cannot find Member ${t}`);return r}async function CH(e,t,r){if(e.kind==="skillMeta"){let n=await TH(e,r),o=Hy(n)??[];if(o.length===0)throw new Error(`Member Codex Environment Skill ${e.name} has no readable files after npx skills add`);return o}if(e.kind==="local-root-installed"){let n=_H(e,t),o=Hy(n)??[];if(o.length===0)throw new Error(`Member Codex Environment Skill ${e.name} has no readable files`);return o}return BH(e,r.apmSkillRegistryClient)}async function TH(e,t){let r=uT(H(ed(),"hunsu-skill-meta-"));try{await(t.skillMetaInstaller??DH()).install(e,r,{env:t.env,home:t.home});let i=Za(H(r,".agents","skills")).filter(s=>s.name===e.name);if(i.length===0)throw new Error(`Member Codex Environment missing Skill ${e.name} after npx skills add ${e.source}`);if(i.length>1)throw new Error(`Member Codex Environment Skill ${e.name} is ambiguous after npx skills add ${e.source}`);return i[0]}finally{Wi(r,{recursive:!0,force:!0})}}function DH(e="npx"){return{async install(t,r,n){let o={...process.env,...n.env};n.home&&(o.HOME=n.home,o.USERPROFILE=n.home);try{await Oy(e,["--yes","skills","add",t.source,"--skill",t.name,"--agent",t.agent,"--copy","--yes"],{cwd:r,env:o,maxBuffer:2*1024*1024})}catch(i){let s=i instanceof Error?i.message:String(i);throw new Error(`npx skills add failed for ${t.name}: ${s}`)}}}}function _H(e,t){if(e.sourcePath){let n=Be(e.sourcePath),o=t.filter(i=>Be(i.sourcePath)===n);if(o.length===0)throw new Error(`Member Codex Environment missing Skill ${e.name} at ${e.sourcePath}`);if(o.length>1)throw new Error(`Member Codex Environment Skill ${e.name} is ambiguous at ${e.sourcePath}`);if(o[0].name!==e.name)throw new Error(`Member Codex Environment Skill ${e.sourcePath} resolved as ${o[0].name}, not ${e.name}`);return o[0]}let r=t.filter(n=>n.name===e.name);if(r.length===0)throw new Error(`Member Codex Environment missing Skill: ${e.name}`);if(r.length>1)throw new Error(`Member Codex Environment Skill ${e.name} is ambiguous across local roots`);return r[0]}function MH(e){if(G(e)&&!G(H(e,Wl)))throw new Error(`Member Codex Environment cannot overwrite non-Hunsu Skill folder: ${e}`);Wi(e,{recursive:!0,force:!0}),vt(e,{recursive:!0})}function HH(e){let t=H(e,".agents","skills");if(G(t))for(let r of ji(t,{withFileTypes:!0})){if(!r.isDirectory())continue;let n=H(t,r.name);G(H(n,Wl))&&Wi(n,{recursive:!0,force:!0})}}function NH(e,t){let r=H(e,".codex","config.toml");if(G(r)&&!Xt(r,"utf8").startsWith(Xh))throw new Error(`Member Codex Environment cannot overwrite non-Hunsu Codex config: ${r}`);vt(Qe(r),{recursive:!0});let n=new Set(t.enabledSkillPaths.map(d=>Be(d))),o=[...Array.from(n).map(d=>({path:d,enabled:!0})),...Array.from(new Set(t.disabledSkillPaths.map(d=>Be(d)))).filter(d=>!n.has(d)).map(d=>({path:d,enabled:!1}))].sort((d,u)=>d.path.localeCompare(u.path)),i=new Set(t.enabledPluginIds),s=[...Array.from(i).map(d=>({id:d,enabled:!0})),...Array.from(new Set(t.disabledPluginIds)).filter(d=>!i.has(d)).map(d=>({id:d,enabled:!1}))].sort((d,u)=>d.id.localeCompare(u.id)),a=[Xh,"# Generated by Hunsu Bridge for a Route worktree. Do not edit by hand.",""];for(let d of o)a.push("[[skills.config]]",`path = ${_y(d.path)}`,`enabled = ${d.enabled?"true":"false"}`,"");for(let d of s)a.push(`[plugins.${_y(d.id)}]`,`enabled = ${d.enabled?"true":"false"}`,"");At(r,`${a.join(`
|
|
118
|
+
`).trimEnd()}
|
|
119
|
+
`,"utf8")}async function BH(e,t){if(e.kind==="local-snapshot")return e.snapshotFiles?.map(o=>({...o}))??[];if(e.kind!=="registry-package")throw new Error(`Skill ${e.name} must be resolved before materialization`);let n=await(t??UD()).fetchSkillFiles(e);if(e.contentHash.startsWith("sha256:")&&aS(n)!==e.contentHash)throw new Error(`APM contentHash mismatch for ${e.package}@${e.version}`);return n.map(o=>({...o}))}function OH(e){let t=new Set,r=[];for(let n of e){let o=n.kind==="local-root-installed"&&n.sourcePath?`${n.name}\0${Be(n.sourcePath)}`:n.name;t.has(o)||(t.add(o),r.push(n))}return r}function $H(e){let t=new Set,r=[];for(let n of e)t.has(n.id)||(t.add(n.id),r.push({...n}));return r}function LH(e){rR(e,[".agents/skills/"])}function UH(e){rR(e,[".agents/skills/",".codex/config.toml"])}function rR(e,t){try{let r=w(["rev-parse","--git-path","info/exclude"],{cwd:e}).trim(),n=Oi(r)?r:H(e,r);vt(Qe(n),{recursive:!0});let o=G(n)?Xt(n,"utf8"):"",i=new Set(o.split(/\r?\n/)),s=t.filter(d=>!i.has(d));if(s.length===0)return;let a=o.length>0&&!o.endsWith(`
|
|
120
|
+
`)?`
|
|
121
|
+
`:"";At(n,`${o}${a}${s.join(`
|
|
122
|
+
`)}
|
|
123
|
+
`,"utf8")}catch{}}function _y(e){return JSON.stringify(e)}function FH(e){let t=e.trim().replace(/[^A-Za-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"");if(!t||t==="."||t==="..")throw new Error(`Invalid Skill name for Codex materialization: ${e}`);return t}function jH(e,t){if(!t.trim()||t.includes("\0")||Oi(t))throw new Error(`Invalid Skill snapshot file path: ${t}`);let r=Fl(t);if(My(r))throw new Error(`Invalid Skill snapshot file path: ${t}`);let n=H(e,r),o=jl(e,n);if(My(o)||Oi(o))throw new Error(`Invalid Skill snapshot file path: ${t}`);return n}function My(e){return e===".."||e.startsWith("../")||e.startsWith("..\\")}function Qa(e={},t=zt()){return cm([e.CODEX_HOME?H(e.CODEX_HOME,"skills"):void 0,H(t,".codex","skills"),H(t,".agents","skills"),"/etc/codex/skills"]).flatMap(n=>Za(n)).sort((n,o)=>n.name.localeCompare(o.name))}function WH(e,t={},r=zt()){return GH([...Qa(t,r),...Za(H(e,".agents","skills")),...Za(H(e,".codex","skills"))])}function Za(e){if(!G(e))return[];let t=[],r=n=>{if(G(H(n,"SKILL.md"))){t.push(n);return}for(let o of ji(n,{withFileTypes:!0}))!o.isDirectory()||o.name==="node_modules"||o.name===".git"||r(H(n,o.name))};try{r(e)}catch{return[]}return t.flatMap(n=>VH(n,bt(n)))}function GH(e){let t=new Set,r=[];for(let n of e){let o=Be(n.sourcePath);t.has(o)||(t.add(o),r.push(n))}return r.sort((n,o)=>n.name.localeCompare(o.name)||n.sourcePath.localeCompare(o.sourcePath))}function qH(e={},t=zt()){let r=cm([e.CODEX_HOME?H(e.CODEX_HOME,"config.toml"):void 0,H(t,".codex","config.toml")]),n=new Set;for(let o of r){if(!G(o))continue;let i=Xt(o,"utf8");for(let s of i.matchAll(/^\s*\[plugins\."([^"]+)"\]\s*$/gm))s[1]?.trim()&&n.add(s[1])}return Array.from(n).sort()}function VH(e,t){let r=JH(e);if(r.length===0)return[];let n=Ge("sha256");for(let i of r)n.update(i.path),n.update("\0"),n.update(i.text??""),n.update("\0");let o=qe(n);return[{kind:"local-snapshot",name:F(k(t,"skill.name")),sourcePath:F(k(e,"skill.sourcePath")),contentHash:F(k(o,"skill.contentHash")),snapshotRef:F(k(`codex-skill:${o}`,"skill.snapshotRef")),snapshotFiles:r.filter(i=>typeof i.text=="string").map(i=>({path:F(k(i.path,"skill.snapshotFiles.path")),text:i.text})),files:r}]}function Hy(e){if(e.kind==="local-snapshot"&&e.snapshotFiles)return e.snapshotFiles.map(t=>({...t}));if("files"in e)return e.files.filter(t=>typeof t.text=="string").map(t=>({path:F(k(t.path,"skill.snapshotFiles.path")),text:t.text}))}function JH(e){let t=[],r=n=>{for(let o of ji(n,{withFileTypes:!0})){let i=H(n,o.name);if(o.isDirectory()){if(o.name==="node_modules"||o.name===".git")continue;r(i);continue}if(!o.isFile())continue;let s=Xr(i),a=jl(e,i),d=s.size<=64e3?Xt(i,"utf8"):void 0;t.push({path:a,size:s.size,text:d})}};return r(e),t.sort((n,o)=>n.path.localeCompare(o.path))}function cm(e){return Array.from(new Set(e.filter(t=>!!t)))}function lm(e){let t=e.moves.reduce((r,n)=>{let o=n.id.match(/^M(\d+)$/i);return o?Math.max(r,Number(o[1])):r},0);return F(Ae(`M${String(t+1).padStart(4,"0")}`))}function Ir(e){return e.status!=="reached"&&e.status!=="canceled"&&e.status!=="superseded"}function Yr(e,t){return ho(e,t)?.destinations??e.destinations.filter(r=>{let n=e.lines.find(o=>o.id===t);return!n||r.requestId===n.requestId})}function ho(e,t){let r=e.lines.find(n=>n.id===t);return r?.currentNodeId?e.nodes.find(n=>n.id===r.currentNodeId):void 0}function Mn(e,t,r){let n=nR(e,t,r);if(!n)throw new Error(`Unknown run: ${t}`);return n}function nR(e,t,r){let n=e.runs[t]??Object.values(e.runs).find(o=>o.runId===t);return r?n&&Fi(n,r)?n:void 0:n}function po(e,t){return zH(e,t),Object.values(e.runs).filter(r=>Fi(r,t))}function zH(e,t){if(!G(t))return;let r;try{r=Gu(t)}catch(n){if(n instanceof ie)return;throw n}for(let n of r){let o=KH(n.execution),i=e.runs[o]??Object.values(e.runs).find(s=>s.executeId===n.execution.executeId);i&&i.source!=="rehydrated"||(e.runs[o]=XH(n.execution,t,n.commit))}}function KH(e){return`${e.runId}:${e.executeId}`}function XH(e,t,r){let n=[e.plan.session?.providerTurnId,...e.paths.flatMap(s=>s.session?.providerTurnId?[s.session.providerTurnId]:[]),e.finalizerSession?.providerTurnId].filter(s=>!!s),o=QH(e),i=e.completedAt??new Date(0).toISOString();return{runId:e.runId,executeId:e.executeId,lineId:e.lineId,requestId:ZH(e.lineId),repositoryPath:t,provider:"codex",source:"rehydrated",status:"arrived",selectedDestinationIds:e.selectedDestinationIds,sourceNodeId:e.sourceNodeId,sourceMoveId:e.sourceMoveId,targetMoveOrdinal:e.targetMoveOrdinal,worktree:e.worktree,conversationRef:e.conversationRef,outcome:"arrived",providerThreadId:e.plan.session?.providerThreadId??e.finalizerSession?.providerThreadId,providerTeamThreadId:e.plan.session?.providerThreadId,providerTeamPlanningTurnId:e.plan.session?.providerTurnId,providerFinalizerThreadId:e.finalizerSession?.providerThreadId,providerTurnIds:n,attemptCount:mo(1,"attempt"),pathCommits:{...e.pathCommits},memberPathRuns:e.paths.map(s=>YH(s,e)),terminalMemberPathId:e.terminalPathId,terminalPathCommit:e.terminalPathCommit,moveFinalizerCommit:e.moveFinalizerCommit?.type==="external"?e.moveFinalizerCommit.commit:r,moveFinalizerMessage:e.moveFinalizerMessage,debugEvents:[],rawAppServerMessages:[],codexTurns:[],codexItems:[],agentSessions:o,activeItemIds:[],assistantTranscript:[],startedAt:e.startedAt??i,updatedAt:i}}function YH(e,t){let r=mo(1,"attempt"),n={pathId:e.pathId,executorId:e.executorId,goal:e.goal,requires:e.requires,attempt:r,agentSessionId:e.session?.sessionId,dependencyPathIds:Array.isArray(e.requires)?e.requires:[],dependencyOutputs:[],startedAt:e.startedAt??t.startedAt??new Date(0).toISOString()},o=e.session?.providerThreadId&&e.session.providerTurnId?{providerThreadId:e.session.providerThreadId,providerTurnId:e.session.providerTurnId}:void 0;switch(e.lifecycle){case"Failed":return{...n,status:"failed",session:o,error:e.error??"Path failed before server restart",commit:e.commit,parentCommit:e.parentCommit,treeChanged:e.treeChanged,completedAt:e.completedAt??t.completedAt??new Date(0).toISOString()};case"Executing":return o?{...n,status:"executing",session:o}:{...n,status:"starting"};case"Waiting":return{...n,status:"planned"};case"Completed":return{...n,status:"completed",session:o??{providerThreadId:"unknown",providerTurnId:e.session?.sessionId??e.pathId},finalResponse:"",commit:e.commit,parentCommit:e.parentCommit,treeChanged:e.treeChanged,completedAt:e.completedAt??t.completedAt??new Date(0).toISOString()}}}function QH(e){let t=[],r=mo(1,"attempt");e.plan.session&&t.push(Rl(e.plan.session,{kind:"TeamPlan",runId:e.runId,executeId:e.executeId,attempt:r},e));for(let n of e.paths)n.session&&t.push(Rl(n.session,{kind:"ExecutionPlan",runId:e.runId,executeId:e.executeId,attempt:r,pathId:n.pathId,executorId:n.executorId},e));return e.finalizerSession&&t.push(Rl(e.finalizerSession,{kind:"MoveFinalizer",runId:e.runId,executeId:e.executeId,moveId:e.targetMoveId},e)),t}function Rl(e,t,r){let n=e.providerThreadId&&e.providerTurnId?{providerThreadId:e.providerThreadId,providerTurnId:e.providerTurnId}:void 0,o=e.completedAt??r.completedAt??new Date(0).toISOString();return{sessionId:e.sessionId,routeRef:{kind:"Route",routeKind:t.kind==="TeamPlan"?"Plan":"Path",routeId:r.executeId,runId:r.runId,executeId:r.executeId,sourceLineId:r.lineId,sourceNodeId:String(r.sourceNodeId??""),worktree:r.worktree},runId:r.runId,executeId:r.executeId,owner:t,state:e.state==="failed"?{type:"failed",provider:n,error:e.error??"Session failed before server restart",completedAt:o}:{type:"completed",provider:n,completedAt:o},provider:n,messages:[],activeItemIds:[],revision:0,createdAt:e.startedAt??r.startedAt??o,updatedAt:o}}function ZH(e){return e.startsWith("run/")?e.slice(4).split("/")[0]??e:e}function $l(e,t){return oR(e).filter(r=>go(r,e,{cwd:t}))}function Ll(e,t,r={}){let n=e.agentSessions[t];if(n&&go(n,e,r))return n;for(let o of Object.values(e.runs)){let i=o.agentSessions?.find(s=>s.sessionId===t);if(i&&go(i,e,r))return i}}function oR(e){let t=new Map;for(let r of Object.values(e.agentSessions))t.set(r.sessionId,r);for(let r of Object.values(e.runs))for(let n of r.agentSessions??[])t.set(n.sessionId,n);return[...t.values()].sort((r,n)=>r.createdAt.localeCompare(n.createdAt))}function go(e,t,r){if(!e||r.sessionId&&e.sessionId!==r.sessionId||r.roadmapId&&!iR(e,r.roadmapId))return!1;if(!r.cwd)return!0;if(e.routeRef.routeKind==="HunsuDraft"&&e.routeRef.draftSessionId)return t.hunsuDrafts[e.routeRef.draftSessionId]?.repositoryPath===r.cwd;let n=tN(t,e);return!!(n&&Fi(n,r.cwd))}function eN(e,t,r,n){return e.type==="agentSession.snapshot"||n.sessionId&&e.sessionId!==n.sessionId||n.roadmapId&&"roadmapId"in e&&e.roadmapId&&e.roadmapId!==n.roadmapId?!1:go(t,r,n)}function iR(e,t){return e.roadmapId===t}function tN(e,t){if(t.routeRef.runId){let r=e.runs[t.routeRef.runId];if(r)return r}return Object.values(e.runs).find(r=>r.agentSessions?.some(n=>n===t)||t.runId&&r.runId===t.runId&&(!t.roadmapId||r.roadmapId===t.roadmapId))}function Ul(e){let t=ue(e.finalResponse,Vt),r=ue(e.error,Vt),n=e.state;return n.type==="completed"?n={...n,finalResponse:ue(n.finalResponse,Vt)}:n.type==="failed"&&(n={...n,error:re(n.error,Vt)}),{...e,state:n,messages:[],finalResponse:t,error:r}}function Ye(e){let t=rN(e)?e:void 0,r=t?void 0:e,n=e.pathCommits?{...e.pathCommits}:void 0,o=t?nN(e.repositoryPath,t):e.planExecutionTransition,i=t?t.memberPathRuns?.map(s=>Ny(oN(t.repositoryPath,t,s))):e.memberPathRuns?.map(Ny);return{runId:e.runId,roadmapId:e.roadmapId,executeId:e.executeId,requestId:e.requestId,lineId:e.lineId,repositoryPath:e.repositoryPath,provider:e.provider,source:e.source,status:e.status,selectedDestinationIds:[...e.selectedDestinationIds],harnessLock:e.harnessLock,sourceNodeId:e.sourceNodeId,sourceMoveId:e.sourceMoveId,targetMoveOrdinal:e.targetMoveOrdinal,worktree:e.worktree,conversationRef:e.conversationRef,outcome:e.outcome,providerThreadId:e.providerThreadId,providerTeamThreadId:e.providerTeamThreadId,providerTeamPlanningTurnId:e.providerTeamPlanningTurnId,providerMemberThreadId:e.providerMemberThreadId,providerFinalizerThreadId:e.providerFinalizerThreadId,providerTurnIds:e.providerTurnIds?[...e.providerTurnIds]:void 0,lastRunUsage:e.lastRunUsage,finalResponse:ue(e.finalResponse,Vt),attemptCount:e.attemptCount,maxAttemptCount:e.maxAttemptCount,memberEvaluations:e.memberEvaluations?[...e.memberEvaluations]:void 0,executionPlanPlan:e.executionPlanPlan?[...e.executionPlanPlan]:void 0,pathCommits:n,planExecutionTransition:o,memberPathRuns:i,terminalMemberPathId:e.terminalMemberPathId,terminalPathCommit:e.terminalPathCommit,moveFinalizerMessage:ue(e.moveFinalizerMessage,Vt),moveFinalizerCommit:e.moveFinalizerCommit,error:ue(e.error,Vt),codexTurns:e.codexTurns?[...e.codexTurns]:[],agentSessions:e.agentSessions.map(Ul),activeItemIds:[...e.activeItemIds],activeAgentSessionId:e.activeAgentSessionId,liveStatus:e.liveStatus,startedAt:e.startedAt,updatedAt:e.updatedAt,debugEventCount:t?t.debugEvents.length:r.debugEventCount,rawAppServerMessageCount:t?t.rawAppServerMessages.length:r.rawAppServerMessageCount,codexItemCount:t?t.codexItems.length:r.codexItemCount,assistantTranscriptCount:t?t.assistantTranscript.length:r.assistantTranscriptCount}}function rN(e){return"debugEvents"in e}function Ny(e){return e.status==="completed"?{...e,finalResponse:re(e.finalResponse,Vt)}:e.status==="failed"?{...e,error:re(e.error,Vt),finalResponse:ue(e.finalResponse,Vt)}:e}function nN(e,t){if(!e)return t.planExecutionTransition;let r=t.pathCommits?.["current-execution.plan"],n=t.pathCommits?.PrevMove??sN(t.worktree?.baseRef);return sR(e,n,r,{nextPending:gt(t.status)&&!r&&!t.currentExecution})??t.planExecutionTransition}function oN(e,t,r){if(!e||r.currentExecutionTransition)return r;let n="commit"in r?r.commit:void 0,o=("parentCommit"in r?r.parentCommit:void 0)??iN(t,r),i=sR(e,o,n,{nextPending:!n&&(r.status==="starting"||r.status==="executing")});return i?{...r,currentExecutionTransition:i,currentExecutionFile:r.currentExecutionFile??i.next}:r}function iN(e,t){let r=e.memberPathRuns??[],n=r.findIndex(o=>o===t);for(let o=n-1;o>=0;o-=1){let i=r[o];if(i&&i.status==="completed"&&"commit"in i&&i.commit)return i.commit}return e.pathCommits?.["current-execution.plan"]}function sN(e){if(e)try{return pe(e)}catch{return}}function sR(e,t,r,n={}){if(!t&&!r&&!n.nextPending)return;let o=t?By(e,t):void 0,i=r?By(e,r):void 0;return{path:it,previousCommit:t,previous:o,previousState:o?"present":"none",nextCommit:r,next:i,nextState:n.nextPending&&!r?"pending":i?"present":"none"}}function By(e,t){try{return{path:it,commit:t,text:w(["show",`${t}:${it}`],{cwd:e})}}catch{return}}function Fi(e,t){return!t||!e.repositoryPath?!1:aN(e.repositoryPath,t)}function aN(e,t){return Kr(e)===Kr(t)}function Kr(e){return pt(e)??Be(e)}function O(e,t,r){e.writeHead(t,{...$i.get(e),"content-type":"application/json; charset=utf-8"}),e.end(`${JSON.stringify(r,null,2)}
|
|
124
|
+
`)}async function We(e){let t=[];for await(let r of e)t.push(Buffer.isBuffer(r)?r:Buffer.from(r));return JSON.parse(Buffer.concat(t).toString("utf8"))}function Pt(e){return new Promise(t=>setTimeout(t,e))}import{access as _N}from"node:fs/promises";import{createHash as dN}from"node:crypto";import{realpath as uN,stat as aR}from"node:fs/promises";import{basename as cN,normalize as lN,resolve as dR}from"node:path";function ud(e){let t=e.now??(()=>new Date),r=e.platform??process.platform,n=Promise.resolve(),o=a=>{let d=n.then(a,a);return n=d.then(()=>{},()=>{}),d},i=async()=>{try{await n;let a=await e.store.read();return l(await Promise.all(a.workspaces.map(d=>zi(d))))}catch(a){return S(Ki(a))}},s=async a=>{try{await n;let u=(await e.store.read()).workspaces.find(c=>c.workspaceId===a);return u?l(await zi(u)):S(mm(a))}catch(d){return S(Ki(d))}};return{async add(a,d={}){let u=await fN(a);if(!u.ok)return u;let c=mN(u.value,r);return o(async()=>{try{let m=await e.store.read(),f=m.workspaces.find(A=>A.workspaceId===c||fm(A.repositoryPath,r)===fm(u.value,r));if(f)return S({code:"WORKSPACE_ALREADY_REGISTERED",message:"Workspace is already registered.",workspaceId:f.workspaceId});let p=t().toISOString(),g=d.displayName?.trim()||cN(u.value),v={workspaceId:c,displayName:g,repositoryPath:u.value,lifecycle:"active",remoteAccess:{enabled:!1,scopes:[]},createdAt:p,updatedAt:p};return await e.store.write({schema:Wt,workspaces:[...m.workspaces,v]}),l(await zi(v))}catch(m){return S(Ki(m))}})},list:i,get:s,async remove(a){return o(async()=>{try{let d=await e.store.read(),u=d.workspaces.findIndex(m=>m.workspaceId===a);if(u<0)return S(mm(a));let c=d.workspaces[u];return await e.store.write({schema:Wt,workspaces:d.workspaces.filter((m,f)=>f!==u)}),l(await zi(c))}catch(d){return S(Ki(d))}})},async open(a){let d=await s(a);return d.ok?d.value.lifecycle==="missing"?S({code:"WORKSPACE_PATH_INVALID",message:"Workspace path no longer exists.",reason:"missing"}):d.value.lifecycle==="error"?S({code:"WORKSPACE_PATH_INVALID",message:"Workspace path is not readable.",reason:"unreadable"}):l({workspaceId:d.value.workspaceId,displayName:d.value.displayName,repositoryPath:d.value.repositoryPath}):d},async setRemoteAccess(a,d){return o(async()=>{try{let u=await e.store.read(),c=u.workspaces.findIndex(p=>p.workspaceId===a);if(c<0)return S(mm(a));let f={...u.workspaces[c],remoteAccess:{enabled:d.enabled,scopes:[...new Set(d.scopes)]},updatedAt:t().toISOString()};return await e.store.write({schema:Wt,workspaces:u.workspaces.map((p,g)=>g===c?f:p)}),l(await zi(f))}catch(u){return S(Ki(u))}})}}}function mN(e,t=process.platform){let r=fm(dR(e),t);return`ws_${dN("sha256").update(r).digest("hex")}`}function uR(e){return{workspaceId:e.workspaceId,displayName:e.displayName,lifecycle:e.lifecycle,pathRedacted:!0}}async function fN(e){if(!e.trim())return S({code:"WORKSPACE_PATH_INVALID",message:"Workspace path is required.",reason:"empty"});try{let t=await uN(dR(e));return(await aR(t)).isDirectory()?l(t):S({code:"WORKSPACE_PATH_INVALID",message:"Workspace path must be a directory.",reason:"not_directory"})}catch(t){return X(t)&&t.code==="ENOENT"?S({code:"WORKSPACE_PATH_INVALID",message:"Workspace path does not exist.",reason:"missing"}):S({code:"WORKSPACE_PATH_INVALID",message:"Workspace path is not readable.",reason:"unreadable"})}}async function zi(e){let t={workspaceId:e.workspaceId,displayName:e.displayName,repositoryPath:e.repositoryPath,remoteAccess:e.remoteAccess??{enabled:!1,scopes:[]},createdAt:e.createdAt,updatedAt:e.updatedAt};try{return(await aR(e.repositoryPath)).isDirectory()?{...t,lifecycle:e.lifecycle}:{...t,lifecycle:"error",issue:"unreadable"}}catch(r){return X(r)&&r.code==="ENOENT"?{...t,lifecycle:"missing"}:{...t,lifecycle:"error",issue:"unreadable"}}}function fm(e,t){let r=lN(e);return t==="win32"?r.toLowerCase():r}function mm(e){return{code:"WORKSPACE_NOT_FOUND",message:"Workspace was not found.",workspaceId:e}}function Ki(e){return{code:"BRIDGE_STATE_INVALID",message:e instanceof Ft?e.message:"Workspace state is unavailable."}}import{randomUUID as IN}from"node:crypto";import{link as wN,mkdir as EN,open as PN,readFile as AN,unlink as md}from"node:fs/promises";import{randomUUID as pN}from"node:crypto";import{unlink as gN}from"node:fs/promises";import{isAbsolute as vN,win32 as hN}from"node:path";var yN=ye,SG=`@hunsu/bridge@${yN}`,Xi="hunsu.bridge.runtime-install.v1";function cR(){return`install_${pN()}`}function Qr(e){return{async read(){let t=await Xe(e.runtimeInstallFile);return t===void 0?void 0:cd(e.runtimeInstallFile,t)},async write(t){await Me(e.runtimeInstallFile,cd(e.runtimeInstallFile,t),{mode:384})},async clear(){try{await gN(e.runtimeInstallFile)}catch(t){if(!X(t)||t.code!=="ENOENT")throw t}}}}function lR(e,t){return{nodePath:e.nodePath,cliPath:e.cliPath,hunsuHome:t,packageVersion:e.packageVersion,runtimePath:e.runtimePath}}function cd(e,t){if(!pm(t)||t.schema!==Xi)throw M(e,`expected schema ${Xi}`);return{schema:Xi,installationId:SN(e,t.installationId),current:ld(e,"current",t.current),previous:t.previous===null?null:ld(e,"previous",t.previous),serviceInput:RN(e,t.serviceInput),updatedAt:yo(e,"updatedAt",t.updatedAt)}}function SN(e,t){if(t==null)return null;let r=yo(e,"installationId",t);if(!/^install_[A-Za-z0-9_-]{8,}$/u.test(r))throw M(e,"installationId must be a Hunsu installation id");return r}function ld(e,t,r){if(!pm(r))throw M(e,`${t} must be an installation record`);return{packageVersion:yo(e,`${t}.packageVersion`,r.packageVersion),runtimePath:Hn(e,`${t}.runtimePath`,r.runtimePath),nodePath:Hn(e,`${t}.nodePath`,r.nodePath),cliPath:Hn(e,`${t}.cliPath`,r.cliPath),installedAt:yo(e,`${t}.installedAt`,r.installedAt)}}function RN(e,t){if(!pm(t))throw M(e,"serviceInput must be an object");return{nodePath:Hn(e,"serviceInput.nodePath",t.nodePath),cliPath:Hn(e,"serviceInput.cliPath",t.cliPath),hunsuHome:Hn(e,"serviceInput.hunsuHome",t.hunsuHome),packageVersion:yo(e,"serviceInput.packageVersion",t.packageVersion),runtimePath:Hn(e,"serviceInput.runtimePath",t.runtimePath)}}function Hn(e,t,r){let n=yo(e,t,r);if(!vN(n)&&!hN.isAbsolute(n))throw M(e,`${t} must be absolute`);return n}function yo(e,t,r){if(typeof r!="string"||!r.trim()||kN(r))throw M(e,`${t} must be a non-empty safe string`);return r}function pm(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function kN(e){return/[\u0000-\u001f\u007f]/u.test(e)}var Yi="hunsu.bridge.setup-transaction.v1",gm="hunsu.bridge.setup-lock.v1",xt=class extends Error{code="SETUP_IN_PROGRESS";constructor(){super("Another Hunsu Bridge setup, removal, or service mutation is already in progress."),this.name="SetupInProgressError"}};function bN(e){return e.setupTransactionFile}function xN(e){return e.setupLockFile}function fd(e){let t=bN(e);return{async read(){let r=await Xe(t);return r===void 0?void 0:mR(t,r)},async write(r){await Me(t,mR(t,r),{mode:384})},async clear(){try{await md(t)}catch(r){if(!X(r)||r.code!=="ENOENT")throw r}}}}async function So(e,t,r={}){let n=xN(e),o=r.now??(()=>new Date),i=r.pid??process.pid,s=r.isProcessAlive??DN,a={schema:gm,token:IN(),operation:t,pid:i,createdAt:o().toISOString()},d=`${n}.${i}.${a.token}.tmp`;await EN(e.runtimeDirectory,{recursive:!0,mode:448});let u=await PN(d,"wx",384);try{await u.writeFile(`${JSON.stringify(a)}
|
|
125
|
+
`,"utf8"),await u.sync(),await u.chmod(384)}finally{await u.close()}try{for(let c=0;c<2;c+=1)try{await wN(d,n);let m=!1;return{operation:t,async release(){if(m)return;let f=await fR(n).catch(p=>{if(!(X(p)&&p.code==="ENOENT"))throw p});if(f&&f.token!==a.token)throw M(n,"setup lock ownership changed before release");f&&await md(n),m=!0}}}catch(m){if(!X(m)||m.code!=="EEXIST")throw m;let f=await fR(n).catch(()=>{});if(f&&s(f.pid))throw new xt;try{await md(n)}catch(p){if(!X(p)||p.code!=="ENOENT")throw new xt}}}finally{await md(d).catch(c=>{if(!X(c)||c.code!=="ENOENT")throw c})}throw new xt}function mR(e,t){if(!pR(t)||t.schema!==Yi)throw M(e,`expected schema ${Yi}`);if(!CN(t.phase))throw M(e,"phase is invalid");return{schema:Yi,transactionId:hm(e,"transactionId",t.transactionId),phase:t.phase,candidate:ld(e,"candidate",t.candidate),previous:t.previous===null?null:cd(e,t.previous),createdAt:vm(e,"createdAt",t.createdAt),updatedAt:vm(e,"updatedAt",t.updatedAt)}}async function fR(e){let t;try{t=await AN(e,"utf8")}catch(n){if(X(n)&&n.code==="ENOENT")return;throw n}let r;try{r=JSON.parse(t)}catch{throw M(e,"setup lock is not valid JSON")}if(!pR(r)||r.schema!==gm||!TN(r.operation)||!Number.isSafeInteger(r.pid)||Number(r.pid)<=0)throw M(e,"setup lock has an invalid schema");return{schema:gm,token:hm(e,"token",r.token),operation:r.operation,pid:Number(r.pid),createdAt:vm(e,"createdAt",r.createdAt)}}function hm(e,t,r){if(typeof r!="string"||!r.trim()||/[\u0000-\u001f\u007f]/u.test(r))throw M(e,`${t} must be a non-empty safe string`);return r}function vm(e,t,r){let n=hm(e,t,r);if(!Number.isFinite(Date.parse(n)))throw M(e,`${t} must be an ISO timestamp`);return n}function CN(e){return e==="preparing"||e==="candidate-staged"||e==="previous-stopped"||e==="service-switched"||e==="candidate-started"||e==="candidate-verified"||e==="committing"||e==="rolling-back"}function TN(e){return e==="setup"||e==="remove"||e==="service-mutation"||e==="runtime-upgrade"}function pR(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function DN(e){try{return process.kill(e,0),!0}catch(t){return X(t)&&t.code==="EPERM"}}async function pd(e){let t=[],r=!0;try{await yn(e.paths).read()}catch{r=!1,t.push({code:"BRIDGE_STATE_INVALID",message:"Bridge configuration is invalid."})}let n=await MN(e.paths.credentialsFile);if(n)try{await jr(e.paths).read()}catch{t.push({code:"BRIDGE_STATE_INVALID",message:"Bridge credentials file is invalid or inaccessible."})}let o=await $a(e.paths).read().catch(()=>{}),i;try{i=(await fd(e.paths).read())?.phase,i&&t.push({code:"SETUP_TRANSACTION_INCOMPLETE",message:`Bridge setup has an incomplete ${i} transaction.`})}catch{t.push({code:"BRIDGE_STATE_INVALID",message:"Bridge setup transaction state is invalid."})}let s=await ud({store:Ha(e.paths)}).list(),a=s.ok?s.value.map(uR):[];s.ok||t.push({code:s.error.code,message:s.error.message});let d=e.providerService?await e.providerService.status(!1).catch(()=>{}):void 0,u={schema:"hunsu.bridge.doctor.v1",mode:e.online===!1?"offline":"online",version:ye,protocolVersion:mn,home:e.paths.home,state:{config:r?"valid":"invalid",credentialsPresent:n,runtimePresent:o!==void 0,workspaceCount:a.length,...i?{setupTransactionPhase:i}:{}},...d?{provider:{providerId:d.providerId,installed:d.installed,configured:d.configured,authenticated:d.authenticated,ready:d.ready,...d.safeMessage?{message:d.safeMessage}:{}}}:{},workspaces:a,issues:t},c=Re(u);return or(c),c}async function MN(e){try{return await _N(e),!0}catch{return!1}}import{appendFile as HN,chmod as NN,mkdir as BN,readFile as ON,rename as $N,stat as LN,unlink as gR}from"node:fs/promises";var ym="hunsu.bridge.log.v1",UN=1048576,FN=3;function yR(e){let t=hR(e.maxBytes??UN,"maxBytes"),r=hR(e.maxFiles??FN,"maxFiles"),n=e.now??(()=>new Date),o=Promise.resolve();return{append:async s=>{let a=o.then(async()=>{if(!s.event.trim())throw new Error("Structured log event name must be non-empty.");let d={schema:ym,timestamp:n().toISOString(),level:s.level,event:s.event,...s.message===void 0?{}:{message:s.message},...s.data===void 0?{}:{data:s.data}},u=Sm(d),c=`${JSON.stringify(u)}
|
|
126
|
+
`;if(Buffer.byteLength(c)>t&&(u=Sm({schema:ym,timestamp:d.timestamp,level:d.level,event:d.event,message:"Structured log event exceeded the configured size limit.",data:{truncated:!0}}),c=`${JSON.stringify(u)}
|
|
127
|
+
`),Buffer.byteLength(c)>t)throw new Error("Structured log maxBytes is too small for a valid record.");return await BN(e.paths.logsDirectory,{recursive:!0,mode:448}),await WN(e.paths.structuredLogFile,Buffer.byteLength(c),t,r),await HN(e.paths.structuredLogFile,c,{encoding:"utf8",mode:384}),await NN(e.paths.structuredLogFile,384),u});return o=a.then(()=>{},()=>{}),a},async read(s={}){await o;let a=[];for(let c of GN(e.paths.structuredLogFile,r)){let m=await qN(c);if(m!==void 0)for(let f of m.split(/\r?\n/u)){if(!f.trim())continue;let p=jN(f);p&&a.push(p)}}let d=s.limit;if(d===void 0)return a;let u=Math.max(0,Math.trunc(d));return u===0?[]:a.slice(-u)}}}function Sm(e){let t=Re(e);return or(t),t}function jN(e){try{let t=JSON.parse(e);return VN(t)?Sm(t):void 0}catch{return}}async function WN(e,t,r,n){let o=0;try{o=(await LN(e)).size}catch(i){if(!X(i)||i.code!=="ENOENT")throw i}if(!(o===0||o+t<=r)){if(n===1){await gR(e).catch(i=>{if(!X(i)||i.code!=="ENOENT")throw i});return}await gR(`${e}.${n-1}`).catch(i=>{if(!X(i)||i.code!=="ENOENT")throw i});for(let i=n-2;i>=1;i-=1)await vR(`${e}.${i}`,`${e}.${i+1}`);await vR(e,`${e}.1`)}}async function vR(e,t){try{await $N(e,t)}catch(r){if(!X(r)||r.code!=="ENOENT")throw r}}function GN(e,t){let r=[];for(let n=t-1;n>=1;n-=1)r.push(`${e}.${n}`);return r.push(e),r}async function qN(e){try{return await ON(e,"utf8")}catch(t){if(X(t)&&t.code==="ENOENT")return;throw t}}function hR(e,t){if(!Number.isInteger(e)||e<=0)throw new Error(`${t} must be a positive integer.`);return e}function VN(e){if(typeof e!="object"||e===null||Array.isArray(e))return!1;let t=e;return t.schema===ym&&typeof t.timestamp=="string"&&(t.level==="debug"||t.level==="info"||t.level==="warn"||t.level==="error")&&typeof t.event=="string"}import{randomBytes as wR}from"node:crypto";import{hostname as Rm}from"node:os";import{resolve as JN}from"node:path";function ER(e){let t=e.fetchImpl??fetch,r=e.sleep??(g=>new Promise(v=>setTimeout(v,g))),n=e.now??(()=>new Date),o=SR(e.authBaseUrl??"https://hunsu.app"),i=SR(e.relayApiUrl??"https://relay.hunsu.app"),s=XN(e.relayWsUrl??"wss://relay.hunsu.app/v1/bridge"),a,d,u="disabled",c=!1,m=Promise.resolve(),f=g=>{let v=m.then(g,g);return m=v.then(()=>{},()=>{}),v},p=async()=>{let[g,v,A]=await Promise.all([e.configStore.read(),e.credentialStore.read(),e.workspaceService.list()]),C=A.ok?A.value.filter(kR):[],D=!!(v?.account&&!km(v.account,n())),R=g.remote.enabled;return{enabled:R,signedIn:D,...v?.account?.accountId?{accountId:v.account.accountId}:{},connection:D?R?u:"disabled":"signed_out",...v?.relay?.deviceId?{deviceId:v.relay.deviceId}:{},grantedWorkspaceIds:R&&D?C.map(P=>P.workspaceId):[],protocolVersion:"local-bridge-v1"}};return{status:p,async login(g={}){return f(async()=>{a&&(a.canceled=!0);let A=(await e.credentialStore.ensure()).relay?.deviceId??`device_${wR(16).toString("base64url")}`,C=new URL("/oauth/device/code",o),D=new URLSearchParams({client_id:"hunsu-bridge",scope:"bridge remote",device_id:A,device_name:e.deviceName??Rm()}),R=await t(C,{method:"POST",headers:{"content-type":"application/x-www-form-urlencoded"},body:D});if(!R.ok)throw new b("REMOTE_CONNECTION_FAILED",`Hunsu login could not start (HTTP ${R.status}).`);let P=await R.json(),L=gd(P.device_code,"device_code"),q=gd(P.user_code,"user_code"),ve=Im(gd(P.verification_uri,"verification_uri")),z=Ro(P.verification_uri_complete),y=RR(P.expires_in,900),E=RR(P.interval,5);a={deviceCode:L,expiresAt:new Date(n().getTime()+y*1e3).toISOString(),intervalSeconds:E,canceled:!1};let _=a,$=!1,Oe=z?Im(z):ve;if(g.openBrowser!==!1&&e.openBrowser)try{await e.openBrowser(Oe),$=!0}catch{$=!1}return zN({pending:_,authBaseUrl:o,deviceId:A,commitAccount:async tr=>f(async()=>{!_.canceled&&!c&&await e.credentialStore.write({account:tr})}),fetchImpl:t,sleep:r,now:n}).catch(()=>{}),{state:"pending",verificationUri:ve,...z?{verificationUriComplete:Im(z)}:{},userCode:q,expiresAt:_.expiresAt,browserOpened:$}})},async logout(){return f(async()=>{a&&(a.canceled=!0),a=void 0,d?.stop(),d=void 0,u="disabled",await e.configStore.update(g=>({...g,remote:{enabled:!1}})),await e.credentialStore.write({account:null,relay:null})})},async enable(){return f(async()=>{let g=await e.credentialStore.read();if(!g?.account||km(g.account,n()))throw new b("ACCOUNT_LOGIN_REQUIRED","Sign in to Hunsu before enabling Remote Bridge.");let v=await e.workspaceService.list();if(!v.ok)throw new b("REMOTE_ENABLE_FAILED",v.error.message);let A=v.value.filter(kR);u="connecting";try{let C=await KN({relayApiUrl:i,account:g.account,existingRelay:g.relay,workspaces:A.map(D=>({workspaceId:D.workspaceId,displayName:D.displayName,repositoryPath:D.repositoryPath,scopes:D.remoteAccess.scopes})),deviceName:e.deviceName??Rm(),fetchImpl:t});if(c)throw new b("REMOTE_ENABLE_FAILED","Remote Bridge stopped while enabling.");await e.credentialStore.write({relay:C.credential}),await e.configStore.update(D=>({...D,remote:{enabled:!0}})),d?.stop(),d=new wm({url:C.wsUrl??s,credential:C.credential,socketFactory:e.socketFactory,onState:D=>{u=D},onCommand:e.onCommand?async D=>{let R=await e.credentialStore.read();return!R?.account||km(R.account,n())?{ok:!1,status:401,error:"Remote command requires an active Hunsu sign-in."}:e.onCommand(D)}:void 0,accountId:g.account.accountId,deviceName:e.deviceName??Rm(),workspaces:A.map(D=>({workspaceId:D.workspaceId,displayName:D.displayName,repositoryPath:D.repositoryPath,scopes:D.remoteAccess.scopes}))}),d.start()}catch(C){throw u="offline",await e.configStore.update(D=>({...D,remote:{enabled:!1}})),C instanceof b?C:new b("REMOTE_ENABLE_FAILED","Remote Bridge could not be enabled.",{cause:C})}return p()})},async disable(){return f(async()=>(d?.stop(),d=void 0,u="disabled",await e.configStore.update(g=>({...g,remote:{enabled:!1}})),p()))},stop(){c=!0,a&&(a.canceled=!0),d?.stop(),d=void 0}}}var wm=class{input;socket;stopped=!0;reconnectTimer;reconnectAttempt=0;constructor(t){this.input=t}start(){this.stopped=!1,this.connect()}stop(){this.stopped=!0,this.reconnectTimer&&clearTimeout(this.reconnectTimer),this.reconnectTimer=void 0,this.socket?.close(1e3,"Remote Bridge disabled"),this.socket=void 0}connect(){if(this.stopped)return;if(!this.input.socketFactory){this.input.onState("offline");return}this.input.onState("connecting");let t=this.input.socketFactory(this.input.url);this.socket=t,t.addEventListener("open",()=>{this.reconnectAttempt=0,t.send(JSON.stringify({type:"authenticate",protocolVersion:"local-bridge-v1",deviceId:this.input.credential.deviceId,token:this.input.credential.token})),t.send(JSON.stringify({type:"device.register",device:PR({deviceId:this.input.credential.deviceId,accountId:this.input.accountId,deviceName:this.input.deviceName,workspaces:this.input.workspaces}),workspaces:Pm(this.input.workspaces),projectGrants:Am(this.input.workspaces)})),this.input.onState("connected")}),t.addEventListener("message",r=>{this.handleMessage(t,r.data)}),t.addEventListener("close",()=>this.reconnect(t)),t.addEventListener("error",()=>this.reconnect(t))}reconnect(t){if(this.stopped||this.reconnectTimer||this.socket!==t)return;this.socket=void 0,this.input.onState("offline");let r=Math.min(3e4,250*2**this.reconnectAttempt);this.reconnectAttempt+=1,this.reconnectTimer=setTimeout(()=>{this.reconnectTimer=void 0,this.connect()},r),this.reconnectTimer.unref?.()}async handleMessage(t,r){if(typeof r!="string"||!this.input.onCommand)return;let n;try{n=JSON.parse(r)}catch{return}if(n.type!=="command"||typeof n.commandId!="string")return;let o=YN(n.command);if(!o||o.deviceId!==this.input.credential.deviceId){t.send(JSON.stringify({type:"command.result",commandId:n.commandId,result:{ok:!1,status:400,error:"Remote command payload is invalid."}}));return}let i=QN(o,this.input.workspaces);if(i){t.send(JSON.stringify({type:"command.result",commandId:n.commandId,result:i}));return}try{let s=await this.input.onCommand(o);t.send(JSON.stringify({type:"command.result",commandId:n.commandId,result:s}))}catch{t.send(JSON.stringify({type:"command.result",commandId:n.commandId,result:{ok:!1,status:500,error:"Remote command failed."}}))}}};async function zN(e){let t=Math.max(1,e.pending.intervalSeconds)*1e3;for(;!e.pending.canceled&&e.now().getTime()<Date.parse(e.pending.expiresAt);){let r=await e.fetchImpl(new URL("/oauth/token",e.authBaseUrl),{method:"POST",headers:{"content-type":"application/x-www-form-urlencoded"},body:new URLSearchParams({grant_type:"urn:ietf:params:oauth:grant-type:device_code",client_id:"hunsu-bridge",device_code:e.pending.deviceCode,device_id:e.deviceId})}),n=await r.json().catch(()=>({}));if(e.pending.canceled)return;if(r.ok){let i=gd(n.access_token,"access_token"),s={accountId:Ro(n.user_id)??Ro(n.account_id)??"hunsu-account",accessToken:i,refreshToken:Ro(n.refresh_token)??null,expiresAt:typeof n.expires_in=="number"?new Date(e.now().getTime()+n.expires_in*1e3).toISOString():null};await e.commitAccount(s);return}let o=Ro(n.error);if(o==="authorization_pending"){await e.sleep(t);continue}if(o==="slow_down"){t+=5e3,await e.sleep(t);continue}return}}async function KN(e){let t=e.existingRelay?.deviceId??`device_${wR(16).toString("base64url")}`,r=PR({deviceId:t,accountId:e.account.accountId,deviceName:e.deviceName,workspaces:e.workspaces}),n=await e.fetchImpl(new URL("/v1/devices",e.relayApiUrl),{method:"POST",headers:{authorization:`Bearer ${e.account.accessToken}`,"content-type":"application/json"},body:JSON.stringify({device:r,workspaces:Pm(e.workspaces),projectGrants:Am(e.workspaces),lastSnapshotAt:new Date().toISOString()})});if(!n.ok)throw new b("REMOTE_ENABLE_FAILED",`Relay device registration failed (HTTP ${n.status}).`);let o=await n.json(),i=AR(o.device)?o.device:void 0;if(!i||i.deviceId!==t)throw new b("REMOTE_ENABLE_FAILED","Relay device registration returned an invalid device identity.");return{credential:{deviceId:t,token:e.account.accessToken}}}function km(e,t){if(e.expiresAt===null)return!1;let r=Date.parse(e.expiresAt);return!Number.isFinite(r)||r<=t.getTime()}function SR(e){let t=new URL(e);if(t.protocol!=="https:"&&!(t.protocol==="http:"&&Em(t.hostname)))throw new b("REMOTE_CONNECTION_FAILED","Remote service URLs must use HTTPS, except for loopback development fixtures.");if(t.username||t.password)throw new b("REMOTE_CONNECTION_FAILED","Remote service URLs must not contain credentials.");return t.toString()}function Im(e){let t=new URL(e);if(t.protocol!=="https:"&&!(t.protocol==="http:"&&Em(t.hostname)))throw new b("REMOTE_CONNECTION_FAILED","Hunsu login returned an unsafe verification URL.");return t.toString()}function XN(e){let t=new URL(e);if(t.protocol!=="wss:"&&!(t.protocol==="ws:"&&Em(t.hostname)))throw new b("REMOTE_CONNECTION_FAILED","Relay returned an unsafe WebSocket URL.");if(t.username||t.password||t.search)throw new b("REMOTE_CONNECTION_FAILED","Relay WebSocket URLs must not contain credentials.");return t.toString()}function Em(e){return e==="localhost"||e==="127.0.0.1"||e==="[::1]"||e==="::1"}function gd(e,t){let r=Ro(e);if(!r)throw new b("REMOTE_CONNECTION_FAILED",`Remote response is missing ${t}.`);return r}function Ro(e){return typeof e=="string"&&e.trim()?e.trim():void 0}function RR(e,t){return typeof e=="number"&&Number.isFinite(e)&&e>0?e:t}function kR(e){return e.lifecycle==="active"&&e.remoteAccess.enabled&&e.remoteAccess.scopes.includes("remoteRelay.access")}function PR(e){let t=new Date().toISOString();return{deviceId:e.deviceId,deviceName:e.deviceName,userId:e.accountId,registeredAt:t,status:"online",remoteAccess:"enabled",bridgeVersion:ye,protocolVersion:"local-bridge-v1",workspaces:Pm(e.workspaces),projectGrants:Am(e.workspaces),lastSnapshotAt:t}}function Pm(e){return e.map(t=>({workspaceId:t.workspaceId,roadmapId:t.workspaceId,displayName:t.displayName,pathRedacted:!0,lifecycle:"active",health:"ok",backendId:"local",connectionMode:"local",provider:{providerId:"codex",label:"Codex",readyForExecute:!1},actions:["open_studio","deactivate"]}))}function Am(e){let t=new Date().toISOString();return e.map(r=>({path:r.repositoryPath,grantedAt:t,scopes:r.scopes,active:!0}))}function YN(e){if(!AR(e)||typeof e.deviceId!="string"||!e.deviceId.trim()||typeof e.command!="string"||!jc(e.command))return;let t=e.requestedScopes===void 0?void 0:Array.isArray(e.requestedScopes)&&e.requestedScopes.every(ZN)?[...new Set(e.requestedScopes)]:void 0;if(!(e.requestedScopes!==void 0&&t===void 0))return{deviceId:e.deviceId.trim(),command:e.command,...typeof e.projectPath=="string"&&e.projectPath.trim()?{projectPath:e.projectPath.trim()}:{},...t?{requestedScopes:t}:{},...Object.prototype.hasOwnProperty.call(e,"payload")?{payload:e.payload}:{}}}function QN(e,t){let r=[...new Set([...Di(e.command),...e.requestedScopes??[]])];if(r.length===0&&!e.projectPath)return;if(!e.projectPath)return{ok:!1,status:403,error:"Remote command requires an explicit Workspace grant."};let n=IR(e.projectPath),o=t.find(s=>IR(s.repositoryPath)===n);return o?r.find(s=>!o.scopes.includes(s))?{ok:!1,status:403,error:"Remote command scope is not granted."}:void 0:{ok:!1,status:403,error:"Remote command Workspace is not granted."}}function ZN(e){return e==="remoteRelay.access"||e==="execute.start"||e==="artifactAction.run"||e==="env.read"||e==="hostAlias.expose"}function IR(e){let t=JN(e);return process.platform==="win32"?t.toLowerCase():t}function AR(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}import{resolve as eB}from"node:path";function bR(e){let t=e.fetchImpl??fetch;return async r=>{let n=e.endpoint();if(!n)return Nn(503,"Bridge is still starting.");let o=await tB(e.workspaceService,r);if(!o.ok)return o.error;let i=rB(r,o.value);if(!i)return Nn(400,"Remote command is not supported by this Bridge protocol.");try{let s=await t(new URL(i.path,n),{method:i.method,headers:{[En]:e.controlToken(),...i.body===void 0?{}:{"content-type":"application/json"}},...i.body===void 0?{}:{body:JSON.stringify(i.body)},redirect:"error",signal:AbortSignal.timeout(9e3)}),a=await s.json().catch(()=>{});if(!s.ok)return Nn(s.status,"Local Bridge command failed.");let d=Re(bm(a,i.authorizedRoot));return or(d),{ok:!0,status:s.status,...a===void 0?{}:{body:d}}}catch{return Nn(503,"Local Bridge command is unavailable.")}}}async function tB(e,t){if(!t.projectPath)return{ok:!0};let r=await e.list();if(!r.ok)return{ok:!1,error:Nn(503,"Workspace registry is unavailable.")};let n=ko(t.projectPath),o=r.value.find(s=>s.lifecycle==="active"&&s.remoteAccess.enabled&&s.remoteAccess.scopes.includes("remoteRelay.access")&&ko(s.repositoryPath)===n),i=[...new Set([...Di(t.command),...t.requestedScopes??[]])];return o&&i.some(s=>!o.remoteAccess.scopes.includes(s))?{ok:!1,error:Nn(403,"Remote command scope is not granted.")}:o?{ok:!0,value:o}:{ok:!1,error:Nn(403,"Remote command Workspace is not granted.")}}function rB(e,t){let r=sB(e.payload),n=nB(e.command,r);if(n)return(e.projectPath||Di(e.command).length>0)&&!t?void 0:{...n,...t?{authorizedRoot:t.repositoryPath}:{}};if(!t)return;let o=t.workspaceId,i=Ct(r,"roadmapId");if(i&&i!==o)return;let s=Ct(r,"path");if(s&&ko(s)!==ko(t.repositoryPath))return;let a={...r??{},roadmapId:o,...s?{path:t.repositoryPath}:{}},d=`/api/roadmaps/${encodeURIComponent(o)}`,u=oB(e.command,d,a);return u?{...u,authorizedRoot:t.repositoryPath}:void 0}function nB(e,t){switch(e){case"health":return{method:"GET",path:"/health"};case"bridge.status":return{method:"GET",path:"/api/bridge/status"};case"connection.status":return{method:"GET",path:"/api/connection/status"};case"provider.inventory":{let r=Ct(t,"backendId");return{method:"GET",path:`/api/providers/inventory${r?`?backendId=${encodeURIComponent(r)}`:""}`}}case"modelAlias.validate":return{method:"POST",path:"/api/model-aliases/validate",body:t??{}};case"modelAlias.resolve":return{method:"POST",path:"/api/model-aliases/resolve",body:t??{}};case"roadmap.registry.list":return{method:"GET",path:"/api/roadmaps/recent"};case"roadmap.registry.remove":return{method:"POST",path:"/api/roadmaps/recent/remove",body:t??{}};case"roadmap.open":return{method:"POST",path:"/api/roadmaps/open",body:t??{}};case"roadmap.port.inspect":return{method:"POST",path:"/api/roadmaps/port/inspect",body:t??{}};case"roadmap.port.apply":return{method:"POST",path:"/api/roadmaps/port/apply",body:t??{}};case"roadmap.create":return{method:"POST",path:"/api/roadmaps/create",body:t??{}};default:return}}function oB(e,t,r){switch(e){case"roadmap.board":return{method:"GET",path:`${t}/board`};case"roadmap.worktree":return{method:"GET",path:`${t}/worktree`};case"roadmap.skills":return{method:"GET",path:`${t}/skills`};case"roadmap.commands":return{method:"POST",path:`${t}/commands`,body:r};case"execute.status":return{method:"GET",path:`${t}/runs`};case"execute.start":return{method:"POST",path:`${t}/runs/start`,body:r};case"execute.pause":return{method:"POST",path:`${t}/runs/pause`,body:r};case"execute.resume":return{method:"POST",path:`${t}/runs/resume`,body:r};case"execute.stop":return{method:"POST",path:`${t}/runs/stop`,body:r};case"execute.completeMove":return{method:"POST",path:`${t}/runs/complete-move`,body:r};case"artifactAction.list":return{method:"GET",path:`${t}/artifact-actions`};case"artifactAction.runs":return{method:"GET",path:`${t}/action-runs`};case"artifactAction.start":{let n=Ct(r,"actionId");return n?{method:"POST",path:`${t}/artifact-actions/${encodeURIComponent(n)}/runs`,body:r}:void 0}case"artifactAction.stop":{let n=Ct(r,"runId");return n?{method:"POST",path:`${t}/action-runs/${encodeURIComponent(n)}/stop`,body:r}:void 0}case"moveFile.tree":case"moveFile.blob":case"moveFile.diff":{let n=Ct(r,"moveId");if(!n)return;let o=e.slice(9),i=Ct(r,"path");return{method:"GET",path:`${t}/moves/${encodeURIComponent(n)}/files/${o}${i?`?path=${encodeURIComponent(i)}`:""}`}}case"hunsuDraft.list":return{method:"GET",path:`${t}/hunsu/drafts`};case"hunsuDraft.start":return{method:"POST",path:`${t}/hunsu/drafts`,body:r};case"hunsuDraft.get":return Qi("GET",t,r);case"hunsuDraft.message":return Qi("POST",t,r,"messages");case"hunsuDraft.diffArtifact.create":return Qi("POST",t,r,"diff-artifacts");case"hunsuDraft.diffArtifact.get":{let n=Ct(r,"draftSessionId"),o=Ct(r,"diffArtifactId");return n&&o?{method:"GET",path:`${t}/hunsu/drafts/${encodeURIComponent(n)}/diff-artifacts/${encodeURIComponent(o)}`}:void 0}case"hunsuDraft.approve":return Qi("POST",t,r,"approve");case"hunsuDraft.discard":return Qi("POST",t,r,"discard");case"line.accept":return{method:"POST",path:`${t}/lines/accept`,body:r};case"line.reject":return{method:"POST",path:`${t}/lines/reject`,body:r};case"agentSession.list":return{method:"GET",path:`${t}/agent-sessions`};case"agentSession.get":{let n=Ct(r,"sessionId");return n?{method:"GET",path:`${t}/agent-sessions/${encodeURIComponent(n)}`}:void 0}case"agentSession.events":case"live.events":return;default:return}}function Qi(e,t,r,n){let o=Ct(r,"draftSessionId");return o?{method:e,path:`${t}/hunsu/drafts/${encodeURIComponent(o)}${n?`/${n}`:""}`,...e==="POST"?{body:r}:{}}:void 0}function bm(e,t){if(Array.isArray(e))return e.map(o=>bm(o,t));if(!xR(e))return e;let r={},n=!1;for(let[o,i]of Object.entries(e)){if((o==="path"||o==="repositoryPath")&&typeof i=="string"&&!iB(i,t)){n=!0;continue}r[o]=bm(i,t)}return n&&(r.pathRedacted=!0),r}function iB(e,t){if(!t)return!1;let r=ko(t),n=ko(e);return n===r||n.startsWith(`${r}/`)||n.startsWith(`${r}\\`)}function ko(e){let t=eB(e);return process.platform==="win32"?t.toLowerCase():t}function Nn(e,t){return{ok:!1,status:e,error:t}}function sB(e){return xR(e)?e:void 0}function Ct(e,t){let r=e?.[t];return typeof r=="string"&&r.trim()?r.trim():void 0}function xR(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}import{timingSafeEqual as aB}from"node:crypto";function TR(e){return async(t,r,n)=>{if(!n.pathname.startsWith("/v1/control"))return!1;if(!dB(t,e.controlToken()))return ge(r,401,ee("BRIDGE_CONTROL_UNAUTHORIZED","Hunsu Bridge rejected the local control credential.")),!0;try{let o=n.pathname;if(t.method==="GET"&&o==="/v1/control/status")return ge(r,200,te("Hunsu Bridge is running.",e.runtimeIdentity())),!0;if(t.method==="POST"&&o==="/v1/control/credential/rotate")return await e.rotateControlToken(),ge(r,200,te("Hunsu Bridge control credential was rotated.",{rotated:!0,pairingPreserved:!0},"CONTROL_CREDENTIAL_ROTATED")),!0;if(t.method==="GET"&&o==="/v1/control/provider"){let[s,a]=await Promise.all([e.providerService.list(),e.providerService.status(n.searchParams.get("force")==="1")]);return ge(r,200,te("Codex provider status is available.",{providers:s,provider:a})),!0}if(t.method==="PUT"&&o==="/v1/control/provider"){let s=await Io(t);if(s.providerId!=="codex")throw new b("PROVIDER_NOT_CONFIGURED","The first headless Bridge prerelease supports only Codex.");let a=s.reset===!0?await e.providerService.resetCodex():await e.providerService.setCodex({binaryPath:On(s.binaryPath),home:On(s.home)});return ge(r,200,te(s.reset===!0?"Codex provider configuration was reset.":"Codex provider was configured.",{provider:a})),!0}if(t.method==="POST"&&o==="/v1/control/provider/check"){let s=await e.providerService.status(!0);if(!s.installed)throw new b("PROVIDER_BINARY_NOT_FOUND",s.safeMessage??"Codex was not found.");if(!s.configured)throw new b("PROVIDER_CHECK_FAILED",s.safeMessage??"Codex could not initialize.");return ge(r,200,te(s.ready?"Codex is ready.":"Codex was checked and needs attention.",{provider:s})),!0}if(t.method==="GET"&&o==="/v1/control/workspaces")return Bn(r,await e.workspaceService.list(),"Workspaces are available."),!0;if(t.method==="POST"&&o==="/v1/control/workspaces"){let s=await Io(t);return Bn(r,await e.workspaceService.add(lB(s.path,"Workspace path"),{displayName:On(s.displayName)}),"Workspace was added.",201),!0}let i=uB(o);if(i&&t.method==="GET"&&i.action==="inspect")return Bn(r,await e.workspaceService.get(i.workspaceId),"Workspace is available."),!0;if(i&&t.method==="DELETE"&&i.action==="inspect")return Bn(r,await e.workspaceService.remove(i.workspaceId),"Workspace was removed."),!0;if(i&&t.method==="POST"&&i.action==="open"){let s=await e.workspaceService.open(i.workspaceId);if(!s.ok)return Bn(r,s,"Workspace could not be opened."),!0;let a=CR(e.pairingService.rotate({browserUrl:e.webUrl??"https://hunsu.app/studio",workspaceId:i.workspaceId})),d=!1;try{await e.openBrowser(a.internal.pairingUrl),d=!0,e.pairingService.markBrowserOpened(a.safe.pairingId)}catch{d=!1}return ge(r,d?200:503,d?te("Workspace was opened in Hunsu Web.",{workspace:s.value,...a.safe,browserOpened:d}):ee("BROWSER_OPEN_FAILED","The Workspace is paired, but the browser could not be opened.")),!0}if(i&&t.method==="PUT"&&i.action==="remote-access"){let s=await Io(t);if(typeof s.enabled!="boolean")throw new b("BRIDGE_STATE_INVALID","Workspace Remote access requires an enabled boolean.");let a=s.enabled?cB(s.scopes):[];return Bn(r,await e.workspaceService.setRemoteAccess(i.workspaceId,{enabled:s.enabled,scopes:a}),s.enabled?"Workspace Remote access was granted.":"Workspace Remote access was revoked."),!0}if(t.method==="POST"&&(o==="/v1/control/pair"||i?.action==="pair")){let s=await Io(t,!0),a=i?.workspaceId??On(s.workspaceId);if(a){let c=await e.workspaceService.get(a);if(!c.ok)return Bn(r,c,"Workspace was not found."),!0}let d=CR(e.pairingService.rotate({browserUrl:On(s.webUrl)??e.webUrl??"https://hunsu.app/studio",...a?{workspaceId:a}:{}})),u=!1;if(s.openBrowser===!0)try{await e.openBrowser(d.internal.pairingUrl),u=!0,e.pairingService.markBrowserOpened(d.safe.pairingId)}catch{throw new b("BROWSER_OPEN_FAILED","Pairing was created, but the browser could not be opened.")}return ge(r,201,te("A short-lived Hunsu Web pairing was created.",{...d.safe,browserOpened:u})),!0}if(t.method==="POST"&&o==="/v1/control/pair/revoke"){let s=await Io(t,!0),a=e.pairingService.revoke(On(s.pairingId));return ge(r,a?200:404,a?te("The active browser pairing credential was revoked.",{revoked:!0}):ee("PAIRING_ROTATION_FAILED","No matching active browser pairing credential was found.")),!0}if(t.method==="POST"&&o==="/v1/control/login"){let s=await Io(t,!0),a=await e.remoteService.login({openBrowser:s.openBrowser!==!1});return ge(r,202,te("Hunsu sign-in is waiting for browser or device-code approval.",a)),!0}if(t.method==="POST"&&o==="/v1/control/logout")return await e.remoteService.logout(),ge(r,200,te("Signed out of Hunsu and disabled Remote Bridge.")),!0;if(t.method==="GET"&&o==="/v1/control/remote")return ge(r,200,te("Remote Bridge status is available.",await e.remoteService.status())),!0;if(t.method==="POST"&&o==="/v1/control/remote/enable")return ge(r,200,te("Remote Bridge is enabled.",await e.remoteService.enable())),!0;if(t.method==="POST"&&o==="/v1/control/remote/disable")return ge(r,200,te("Remote Bridge is disabled.",await e.remoteService.disable())),!0;if(t.method==="GET"&&o==="/v1/control/doctor")return ge(r,200,te("Bridge diagnostics completed.",await e.doctor())),!0;if(t.method==="GET"&&o==="/v1/control/logs"){let s=Number.parseInt(n.searchParams.get("limit")??"200",10);return ge(r,200,te("Bridge logs are available.",{events:await e.structuredLog.read({limit:Number.isFinite(s)?Math.max(1,Math.min(1e3,s)):200})})),!0}return t.method==="POST"&&o==="/v1/control/shutdown"?(ge(r,202,te("Hunsu Bridge is shutting down.")),setImmediate(e.onShutdown),!0):(ge(r,404,ee("BRIDGE_CONTROL_UNAVAILABLE","Unknown Hunsu Bridge control route.")),!0)}catch(o){let i=pr(o);return ge(r,mB(i.code),i),!0}}}function dB(e,t){let r=e.headers[En.toLowerCase()],n=Array.isArray(r)?r[0]:r;if(!n)return!1;let o=Buffer.from(n),i=Buffer.from(t);return o.length===i.length&&aB(o,i)}function ge(e,t,r){let n=JSON.stringify(r);e.writeHead(t,{"content-type":"application/json; charset=utf-8","content-length":Buffer.byteLength(n),"cache-control":"no-store"}),e.end(n)}function Bn(e,t,r,n=200){t.ok?ge(e,n,te(r,t.value)):ge(e,t.error.code==="WORKSPACE_NOT_FOUND"?404:400,ee(t.error.code,t.error.message))}async function Io(e,t=!1){let r=[],n=0;for await(let o of e){let i=Buffer.isBuffer(o)?o:Buffer.from(o);if(n+=i.length,n>1048576)throw new b("BRIDGE_STATE_INVALID","Control request body is too large.");r.push(i)}if(r.length===0&&t)return{};try{let o=JSON.parse(Buffer.concat(r).toString("utf8"));if(!o||typeof o!="object"||Array.isArray(o))throw new Error("object required");return o}catch{throw new b("BRIDGE_STATE_INVALID","Control request body must be a JSON object.")}}function uB(e){let t=e.match(/^\/v1\/control\/workspaces\/([^/]+)(?:\/(pair|open|remote-access))?$/);if(t?.[1])return{workspaceId:decodeURIComponent(t[1]),action:t[2]==="pair"?"pair":t[2]==="open"?"open":t[2]==="remote-access"?"remote-access":"inspect"}}function cB(e){if(!Array.isArray(e)||e.length===0)throw new b("BRIDGE_STATE_INVALID","Workspace Remote access requires at least one explicit scope.");let t=e.map(r=>{if(typeof r!="string"||!oo.includes(r))throw new b("BRIDGE_STATE_INVALID","Workspace Remote access contains an unsupported scope.");return r});if(!t.includes("remoteRelay.access"))throw new b("BRIDGE_STATE_INVALID","Workspace Remote access requires the remoteRelay.access scope.");return[...new Set(t)]}function lB(e,t){let r=On(e);if(!r)throw new b("BRIDGE_STATE_INVALID",`${t} is required.`);return r}function On(e){return typeof e=="string"&&e.trim()?e.trim():void 0}function mB(e){return e==="WORKSPACE_NOT_FOUND"?404:e==="BRIDGE_CONTROL_UNAUTHORIZED"?401:e==="PROVIDER_BINARY_NOT_FOUND"||e==="PROVIDER_LOGIN_REQUIRED"||e==="ACCOUNT_LOGIN_REQUIRED"?409:400}function CR(e){if(!e.ok)throw new b(e.error.code,e.error.message);return e.value}import{constants as xm}from"node:fs";import{mkdir as fB,open as pB,readFile as gB,unlink as vB}from"node:fs/promises";import{dirname as hB}from"node:path";async function _R(e){let t=e.pid??process.pid,r=e.now??(()=>new Date),n=e.processAlive??yB,o=e.fetchImpl??fetch;await fB(hB(e.paths.daemonLockFile),{recursive:!0});for(let i=0;i<2;i+=1)try{let s=await pB(e.paths.daemonLockFile,xm.O_CREAT|xm.O_EXCL|xm.O_WRONLY,384);try{await s.writeFile(`${JSON.stringify({pid:t,createdAt:r().toISOString()})}
|
|
128
|
+
`,"utf8")}finally{await s.close()}let a=await vd({endpoint:e.endpoint,controlToken:e.controlToken,fetchImpl:o});if(a.kind!=="unreachable")throw await Cm(e.paths.daemonLockFile),DR(a);let d=!1;return{async release(){d||(d=!0,await Cm(e.paths.daemonLockFile))}}}catch(s){if(s instanceof b||!RB(s))throw s;let a=await SB(e.paths.daemonLockFile),d=await vd({endpoint:e.endpoint,controlToken:e.controlToken,fetchImpl:o});if(a!==void 0&&!n(a)&&d.kind==="unreachable"&&i===0){await Cm(e.paths.daemonLockFile);continue}throw d.kind!=="unreachable"?DR(d):new b("BRIDGE_ALREADY_RUNNING","Another Hunsu Bridge daemon startup is already in progress.")}throw new b("BRIDGE_ALREADY_RUNNING","Another Hunsu Bridge daemon startup is already in progress.")}async function vd(e){let t=e.fetchImpl??fetch,r=e.timeoutMs??750,n;try{n=await t(new URL("/health",e.endpoint),{redirect:"error",signal:AbortSignal.timeout(r)})}catch{return{kind:"unreachable"}}if(!n.ok)return{kind:"foreign"};let o=await n.json().catch(()=>{});if(o?.ok!==!0||o.service!=="hunsu-bridge"||o.protocolVersion!=="local-bridge-v1")return{kind:"foreign"};try{let i=await t(new URL("/v1/control/status",e.endpoint),{headers:{[En]:e.controlToken},redirect:"error",signal:AbortSignal.timeout(r)});if(!i.ok)return{kind:"hunsu-unauthenticated"};let s=await i.json().catch(()=>{});return s?.ok===!0?{kind:"hunsu-authenticated",...typeof s.value?.instanceId=="string"?{instanceId:s.value.instanceId}:{}}:{kind:"hunsu-unauthenticated"}}catch{return{kind:"hunsu-unauthenticated"}}}function yB(e){if(!Number.isSafeInteger(e)||e<=0)return!1;try{return process.kill(e,0),!0}catch(t){return Tm(t,"EPERM")}}function DR(e){return e.kind==="hunsu-authenticated"?new b("BRIDGE_ALREADY_RUNNING","Hunsu Bridge is already running."):new b("BRIDGE_PORT_IN_USE","The configured Hunsu Bridge port is already in use by another service.")}async function SB(e){try{let t=JSON.parse(await gB(e,"utf8"));return typeof t.pid=="number"&&Number.isSafeInteger(t.pid)&&t.pid>0?t.pid:void 0}catch{return}}async function Cm(e){try{await vB(e)}catch(t){if(!Tm(t,"ENOENT"))throw t}}function RB(e){return Tm(e,"EEXIST")}function Tm(e,t){return e instanceof Error&&"code"in e&&e.code===t}async function PB(e){try{await e.credentialStore.rotateControlToken({onCommitted:t=>e.activate(t.controlToken)})}catch(t){let r=await e.credentialStore.read().catch(()=>{});throw r&&e.activate(r.controlToken),t}}async function MR(e={}){let t={...process.env,...e.env??{}},r=ft({...e,env:t}),n=e.runtimePath??e.cwd??process.cwd();if(e.runtimePath!==void 0&&!wB(e.runtimePath)||/[\u0000-\u001f\u007f]/u.test(n))throw new b("BRIDGE_STATE_INVALID","Bridge runtime path must be absolute and contain no control characters.");let o=EB(n);await IB(r.home,{recursive:!0,mode:448});let i=yn(r),s=jr(r),a=$a(r),d=await i.read(),u=e.host??d.host,c=e.port??d.port;if(bB(u),!Number.isInteger(c)||c<0||c>65535)throw new b("BRIDGE_STATE_INVALID","Bridge port must be an integer from 0 through 65535.");let m=await s.read(),f=Ni(Dm(d.host),d.port),p=await _R({paths:r,endpoint:f,controlToken:m?.controlToken??"hunsu_control_unavailable",fetchImpl:e.fetchImpl}),g;try{g=await s.ensure();let Ee=Ni(Dm(u),c);if(Ee!==f){let _t=await vd({endpoint:Ee,controlToken:g.controlToken,fetchImpl:e.fetchImpl});if(_t.kind!=="unreachable")throw _t.kind==="hunsu-authenticated"?new b("BRIDGE_ALREADY_RUNNING","Hunsu Bridge is already running."):new b("BRIDGE_PORT_IN_USE","The configured Hunsu Bridge port is already in use by another service.")}(u!==d.host||c!==d.port)&&await i.update(_t=>({..._t,host:u,port:c}))}catch(Ee){throw await p.release().catch(()=>{}),Ee}let v=g.controlToken,A=yR({paths:r}),C=ud({store:Ha(r)}),D=_h({configStore:i,env:{...t,HUNSU_HOME:r.home}}),R=Ba({controlToken:g.controlToken}),P=e.socketFactory??CB(),L,q=bR({workspaceService:C,endpoint:()=>L?.endpoint,controlToken:()=>v,fetchImpl:e.fetchImpl}),ve=ER({configStore:i,credentialStore:s,workspaceService:C,authBaseUrl:t.HUNSU_BRIDGE_AUTH_BASE_URL,relayApiUrl:t.HUNSU_RELAY_API_URL,relayWsUrl:t.HUNSU_RELAY_WS_URL,fetchImpl:e.fetchImpl,socketFactory:P,openBrowser:e.openBrowser??ql,onCommand:q}),z=new Date().toISOString(),y=e.serviceManager??xB(e.development===!0,e.platform??process.platform),E=`bridge_${kB(16).toString("base64url")}`,_,$,Oe=!1,tr,rr=new Promise(Ee=>{tr=Ee}),$e=async()=>{Oe||(Oe=!0,$&&clearInterval($),ve.stop(),L&&await a.clear(L.instanceId).catch(()=>!1),await p.release().catch(()=>{}),await A.append({level:"info",event:"daemon.stopped",message:"Hunsu Bridge stopped."}).catch(()=>{}),tr())},us=async()=>{let Ee=_;if(!Ee||!Ee.listening){await $e();return}await new Promise((_t,cs)=>{Ee.close(ls=>ls?cs(ls):_t())}),await rr};try{let Ee={...t,HUNSU_HOME:r.home,HUNSU_BRIDGE_HOST:u,HUNSU_BRIDGE_PORT:String(c),HUNSU_ROADMAP_REGISTRY_PATH:r.workspacesFile,...e.webUrl?{HUNSU_WEB_URL:e.webUrl}:{}},_t=Pr(vs(Ee,{cwd:e.cwd??process.cwd(),roadmapRegistryPath:r.workspacesFile,processEnv:Ee})),cs=e.webUrl??Ee.HUNSU_WEB_URL??"https://hunsu.app/studio",ls=new URL(cs).origin,Fk=TR({controlToken:()=>v,rotateControlToken:async()=>{await PB({credentialStore:s,activate:nr=>{v=nr}}),await A.append({level:"info",event:"control.credential_rotated",message:"Hunsu Bridge control credential was rotated."}).catch(()=>{})},runtimeIdentity:()=>{if(!L)throw new b("BRIDGE_CONTROL_UNAVAILABLE","Hunsu Bridge is still starting.");return L},providerService:D,workspaceService:C,pairingService:R,remoteService:ve,structuredLog:A,webUrl:cs,openBrowser:e.openBrowser??ql,doctor:()=>pd({paths:r,providerService:D,online:!0}),onShutdown:()=>{us()}});_=Vy({cwd:e.cwd??process.cwd(),roadmapRegistryPath:r.workspacesFile,runtimeConfig:_t,security:{controlToken:()=>v,allowedOrigins:[ls],requirePairing:!0,pairingService:R},controlRouteHandler:Fk,providerService:D,headlessRemote:{enable:()=>ve.enable(),disable:()=>ve.disable()}}),_.once("close",()=>{$e()}),await AB(_,u,c);let ms=_.address();if(!ms||typeof ms=="string")throw new b("BRIDGE_CONTROL_UNAVAILABLE","Bridge listener address is unavailable.");let of=Ni(Dm(u),ms.port),jk=new Date().toISOString();return L={schema:_i,instanceId:E,daemonPid:process.pid,version:ye,protocolVersion:mn,startedAt:z,endpoint:of,runtimePath:o,serviceManager:y,lastHealthyAt:jk},await a.write(L),c===0&&await i.update(nr=>({...nr,host:u,port:ms.port})),await p.release(),await A.append({level:"info",event:"daemon.started",message:"Hunsu Bridge is ready.",data:{instanceId:E,endpoint:of,version:ye,serviceManager:y}}),$=setInterval(()=>{L&&(L={...L,lastHealthyAt:new Date().toISOString()},a.write(L).catch(nr=>A.append({level:"error",event:"runtime.write_failed",message:nr instanceof Error?nr.message:"Runtime identity update failed."}).then(()=>{})))},3e4),$.unref(),(await i.read()).remote.enabled&&ve.enable().catch(nr=>A.append({level:"warn",event:"remote.connect_failed",message:nr instanceof Error?nr.message:"Remote Bridge could not connect."}).then(()=>{})),{identity:L,paths:r,server:_,close:us,waitUntilClosed:()=>rr}}catch(Ee){throw _?.listening&&await new Promise(_t=>_.close(()=>_t())),await $e(),TB(Ee,"EADDRINUSE")?new b("BRIDGE_PORT_IN_USE","The configured Hunsu Bridge port is already in use.",{cause:Ee}):Ee}}function AB(e,t,r){return new Promise((n,o)=>{let i=s=>o(s);e.once("error",i),e.listen(r,t,()=>{e.off("error",i),n()})})}function bB(e){if(e!=="127.0.0.1"&&e!=="localhost"&&e!=="::1"&&e!=="[::1]")throw new b("BRIDGE_STATE_INVALID","Hunsu Bridge must bind to a loopback address.")}function Dm(e){return e==="localhost"?"127.0.0.1":e==="[::1]"?"::1":e}function xB(e,t){return e?"development":t==="win32"?"windows-task-scheduler":t==="darwin"?"macos-launch-agent":"linux-systemd-user"}function CB(){let e=globalThis.WebSocket;if(e)return t=>new e(t)}function TB(e,t){return e instanceof Error&&"code"in e&&e.code===t}var HR=new Set(["home","json","help","version"]),BR=new Set(["json","help","version","follow","delete-data","confirm-delete-data","no-open","dry-run"]),DB=new Set(["home","host","port","cwd","web-url","channel","runtime-package","runtime-path","binary","codex-home","workspace","scopes"]);function _m(e){let t=new Map,r=[];for(let o=0;o<e.length;o+=1){let i=e[o];if(!i.startsWith("--")){r.push(i);continue}let s=i.slice(2);if(!s)throw wo("Invalid empty command option.");let a=s.indexOf("="),d=a>=0?s.slice(0,a):s;if(_B(d),t.has(d))throw wo(`Duplicate option: --${d}.`);if(BR.has(d)){if(a>=0)throw wo(`--${d} does not accept a value.`);t.set(d,!0);continue}let u=a>=0?s.slice(a+1):e[o+1];if(!u||a<0&&u.startsWith("--"))throw wo(`--${d} requires a value.`);t.set(d,u),a<0&&(o+=1)}let n={positionals:r,flags:t};return MB(n),n}function OR(e){return e.some(t=>t==="--json"||t.startsWith("--json="))}function Se(e,t){let r=e.flags.get(t);return typeof r=="string"?r:void 0}function Tt(e,t){return e.flags.get(t)===!0}function _B(e){if(!BR.has(e)&&!DB.has(e))throw wo(`Unknown option: --${e}.`)}function MB(e){let t=e.positionals[0];if(!t){NR(e,HR,"help");return}let r=new Set(HR);switch(t){case"dev":case"daemon":Zr(r,"host","port","cwd","web-url","runtime-path");break;case"setup":Zr(r,"channel","runtime-package","dry-run");break;case"remove":Zr(r,"delete-data","confirm-delete-data","dry-run");break;case"logs":Zr(r,"follow");break;case"provider":e.positionals[1]==="set"&&Zr(r,"binary","codex-home");break;case"workspace":e.positionals[1]==="grant"&&Zr(r,"scopes");break;case"pair":case"open":Zr(r,"workspace");break;case"login":Zr(r,"no-open");break;default:break}NR(e,r,t)}function Zr(e,...t){for(let r of t)e.add(r)}function NR(e,t,r){for(let n of e.flags.keys())if(!t.has(n))throw wo(`Option --${n} is not supported by ${r}.`)}function wo(e){return new b("BRIDGE_STATE_INVALID",e)}var HB=new Set(["status","doctor","logs","provider","workspace","credential","pair","open","login","logout","remote"]),hd=2e4;function $R(e){return HB.has(e)}async function LR(e){let{parsed:t,paths:r,client:n,emit:o}=e,i=t.positionals[0];if(i==="status")return o(await n.request("/v1/control/status"));if(i==="doctor"){let s=await n.request("/v1/control/doctor"),a=!s.ok&&(s.code==="BRIDGE_NOT_RUNNING"||s.code==="BRIDGE_STATE_INVALID")?te("Offline Bridge diagnostics completed.",await pd({paths:r,online:!1})):s;return o(a)}if(i==="logs"){let s=await n.request("/v1/control/logs"),a=o(s);return a!==0||!Tt(t,"follow")?a:$B(n,o)}if(i==="provider")return o(await NB(t,n));if(i==="workspace")return o(await BB(t,n));if(i==="credential"){let s=t.positionals[1];if(s!=="rotate")throw new b("BRIDGE_STATE_INVALID",`Unknown credential command: ${s??""}`);return o(await n.request("/v1/control/credential/rotate",{method:"POST"}))}if(i==="pair"||i==="open")return i==="pair"&&t.positionals[1]==="revoke"?o(await n.request("/v1/control/pair/revoke",{method:"POST"})):o(await n.request("/v1/control/pair",{method:"POST",body:{...Se(t,"workspace")?{workspaceId:Se(t,"workspace")}:{},openBrowser:i==="open"}}));if(i==="login")return o(await n.request("/v1/control/login",{method:"POST",body:{openBrowser:!Tt(t,"no-open")}}));if(i==="logout")return o(await n.request("/v1/control/logout",{method:"POST"}));if(i==="remote"){let s=t.positionals[1]??"status";if(s==="status")return o(await n.request("/v1/control/remote"));if(s==="enable"||s==="disable")return o(await n.request(`/v1/control/remote/${s}`,{method:"POST"}));throw new b("BRIDGE_STATE_INVALID",`Unknown remote command: ${s}`)}throw new b("BRIDGE_STATE_INVALID",`Unknown client command: ${i}`)}async function NB(e,t){let r=e.positionals[1]??"status";if(r==="list"||r==="status")return t.request(`/v1/control/provider${r==="status"?"":"?list=1"}`,{timeoutMs:hd});if(r==="check")return Mm(e.positionals[2]),t.request("/v1/control/provider/check",{method:"POST",timeoutMs:hd});if(r==="set"){Mm(e.positionals[2]);let n=await t.request("/v1/control/provider",{method:"PUT",timeoutMs:hd,body:{providerId:"codex",...Se(e,"binary")?{binaryPath:Se(e,"binary")}:{},...Se(e,"codex-home")?{home:Se(e,"codex-home")}:{}}});return!n.ok&&n.code==="BRIDGE_NOT_RUNNING"&&Se(e,"home")&&!Se(e,"codex-home")?ee("BRIDGE_NOT_RUNNING","Hunsu Bridge is not running at the selected HUNSU_HOME. --home selects HUNSU_HOME; use --codex-home to configure Codex Home."):n}if(r==="reset")return Mm(e.positionals[2]),t.request("/v1/control/provider",{method:"PUT",timeoutMs:hd,body:{providerId:"codex",reset:!0}});throw new b("BRIDGE_STATE_INVALID",`Unknown provider command: ${r}`)}async function BB(e,t){let r=e.positionals[1]??"list";if(r==="list")return t.request("/v1/control/workspaces");if(r==="add"){let i=e.positionals[2];if(!i)throw new b("WORKSPACE_PATH_INVALID","Workspace path is required.");return t.request("/v1/control/workspaces",{method:"POST",body:{path:i}})}let n=e.positionals[2];if(!n)throw new b("WORKSPACE_NOT_FOUND","Workspace id is required.");let o=encodeURIComponent(n);if(r==="inspect")return t.request(`/v1/control/workspaces/${o}`);if(r==="remove")return t.request(`/v1/control/workspaces/${o}`,{method:"DELETE"});if(r==="open")return t.request(`/v1/control/workspaces/${o}/open`,{method:"POST"});if(r==="grant"||r==="revoke"){let i=r==="revoke"?[]:OB(Se(e,"scopes"));return t.request(`/v1/control/workspaces/${o}/remote-access`,{method:"PUT",body:{enabled:r==="grant",scopes:i}})}throw new b("BRIDGE_STATE_INVALID",`Unknown workspace command: ${r}`)}function OB(e){let r=(e??"remoteRelay.access").split(",").map(n=>n.trim()).filter(Boolean).map(n=>{if(!oo.includes(n))throw new b("BRIDGE_STATE_INVALID",`Unsupported Workspace Remote scope: ${n}`);return n});if(!r.includes("remoteRelay.access"))throw new b("BRIDGE_STATE_INVALID","Workspace Remote grants require remoteRelay.access.");return[...new Set(r)]}async function $B(e,t){let r=!1,n=()=>{r=!0};process.once("SIGINT",n),process.once("SIGTERM",n);try{for(;!r&&(await new Promise(i=>setTimeout(i,1e3)),!r);){let o=await e.request("/v1/control/logs?limit=50");if(t(o)!==0)return 1}return 0}finally{process.off("SIGINT",n),process.off("SIGTERM",n)}}function Mm(e){if(e!=="codex")throw new b("PROVIDER_NOT_CONFIGURED","The first headless Bridge prerelease supports only Codex.")}import{homedir as tO}from"node:os";import{homedir as zB}from"node:os";import{join as KB}from"node:path";import{execFile as LB}from"node:child_process";import{access as UB,mkdir as UR,readFile as FB,rm as jB,writeFile as WB}from"node:fs/promises";import{dirname as jR,isAbsolute as GB,win32 as qB}from"node:path";function Po(e,t){let r=t.sleep??(u=>new Promise(c=>setTimeout(c,u))),n=Math.max(1,t.stopTimeoutMs??8e3),o=Math.max(1,t.pollIntervalMs??100),i,s=async()=>{let[u,c,m]=await Promise.all([Hm(e),WR(t.probeHealth),i?Promise.resolve(i):t.readInstalledRuntime?.().catch(()=>{})??Promise.resolve(void 0)]),f=c==="healthy"?await JB(t.probeAuthenticatedStatus):"unavailable";return{installed:u.installed,manager:e.manager,managerState:u.state,health:c,authentication:f,definitionPath:e.definitionPath,packageVersion:m?.packageVersion,runtimePath:m?.runtimePath,detail:u.detail}},a=async()=>{let u=!1;try{u=await t.requestAuthenticatedShutdown()}catch{u=!1}if(u&&await FR(t.probeHealth,r,n,o)==="offline")return $n(e.manager,"Hunsu Bridge stopped through its authenticated control API.",!0);try{await e.stopOwned()}catch{return Ln(e.manager,"SERVICE_STOP_FAILED","The owned Hunsu Bridge service could not be stopped.")}return await FR(t.probeHealth,r,n,o)==="healthy"?Ln(e.manager,"SERVICE_STOP_FAILED","The owned Hunsu Bridge service stopped, but the Bridge endpoint remained healthy."):$n(e.manager,"Hunsu Bridge stopped through its OS user service manager.",!0)},d={async install(u){try{VB(u,e.platform);let c=await e.install(u);return i={packageVersion:u.packageVersion,runtimePath:u.runtimePath},c.changed?$n(e.manager,"Hunsu Bridge user service installed. It was not started.",!0):$n(e.manager,"Hunsu Bridge user service is already installed.",!1,"SERVICE_ALREADY_INSTALLED")}catch{return Ln(e.manager,"SERVICE_INSTALL_FAILED","Hunsu Bridge user service installation failed.")}},async uninstall(){if(!(await Hm(e)).installed)return $n(e.manager,"Hunsu Bridge user service is not installed.",!1);if(!(await a()).ok)return Ln(e.manager,"SERVICE_STOP_FAILED","Hunsu Bridge must stop before its user service can be uninstalled.");try{let m=await e.uninstall();return $n(e.manager,"Hunsu Bridge user service uninstalled.",m.changed)}catch{return Ln(e.manager,"SERVICE_INSTALL_FAILED","Hunsu Bridge user service uninstallation failed.")}},async start(){if(!(await Hm(e)).installed)return Ln(e.manager,"SERVICE_NOT_INSTALLED","Install the Hunsu Bridge user service before starting it.");try{return await e.start(),$n(e.manager,"Hunsu Bridge start requested through its OS user service manager.",!0)}catch{return Ln(e.manager,"SERVICE_START_FAILED","The Hunsu Bridge user service could not be started.")}},stop:a,async restart(){let u=await a();return u.ok?d.start():u},status:s};return d}var yd={async exists(e){try{return await UB(e),!0}catch{return!1}},async readText(e){try{return await FB(e,"utf8")}catch{return}},async mkdir(e,t){await UR(e,{recursive:!0,mode:t?.mode})},async writeText(e,t,r){await UR(jR(e),{recursive:!0,mode:448}),await WB(e,t,{encoding:"utf8",mode:r?.mode})},async remove(e){await jB(e,{force:!0})}},Ao=e=>new Promise(t=>{LB(e.command,e.args,{encoding:"utf8",windowsHide:!0,maxBuffer:1024*1024},(r,n,o)=>{let i=r&&"code"in r&&typeof r.code=="number"?r.code:r?1:0;t({exitCode:i,stdout:n??"",stderr:o??(r instanceof Error?r.message:"")})})});async function Sd(e,t,r){return await e.readText(t)===r?!1:(await e.mkdir(jR(t),{mode:448}),await e.writeText(t,r,{mode:384}),!0)}function VB(e,t){let r=t==="win32"?qB.isAbsolute:GB;for(let[n,o]of Object.entries({nodePath:e.nodePath,cliPath:e.cliPath,hunsuHome:e.hunsuHome,runtimePath:e.runtimePath}))if(!o||!r(o)||Eo(o))throw new Error(`${n} must be an absolute path without control characters.`);if(!e.packageVersion.trim()||Eo(e.packageVersion))throw new Error("packageVersion must be non-empty and contain no control characters.")}function Nm(e){if(Eo(e))throw new Error("systemd values cannot contain control characters.");return`"${e.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace(/%/g,"%%")}"`}function Un(e){if(Eo(e))throw new Error("plist values cannot contain control characters.");return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}function Qt(e){if(Eo(e))throw new Error("PowerShell values cannot contain control characters.");return`'${e.replace(/'/g,"''")}'`}function Rd(e){if(Eo(e)||e.includes('"'))throw new Error("Windows command arguments cannot contain control characters or quotes.");return`"${e.replace(/(\\+)$/u,"$1$1")}"`}async function Hm(e){try{return await e.status()}catch{return{installed:!1,state:"unknown",detail:"Service-manager status is unavailable."}}}async function WR(e){try{return await e()?"healthy":"offline"}catch{return"unavailable"}}async function JB(e){if(!e)return"unavailable";try{return(await e()).state}catch{return"unavailable"}}async function FR(e,t,r,n){let o=Math.max(1,Math.ceil(r/n));for(let i=0;i<o;i+=1){let s=await WR(e);if(s!=="healthy")return s;i+1<o&&await t(n)}return"healthy"}function $n(e,t,r,n="OK"){return{ok:!0,code:n,message:t,manager:e,changed:r}}function Ln(e,t,r){return{ok:!1,code:t,message:r,manager:e}}function Eo(e){return/[\u0000-\u001f\u007f]/u.test(e)}var bo="hunsu-bridge.service";function GR(e){let t=e.commandRunner??Ao,r=e.fileSystem??yd,n=e.unitPath??KB(e.homeDirectory??zB(),".config","systemd","user",bo);return Po({manager:"systemd-user",definitionPath:n,platform:"linux",async install(i){let s=await Sd(r,n,XB(i));return Zi(await t({command:"systemctl",args:["--user","daemon-reload"]}),"reload systemd user units"),Zi(await t({command:"systemctl",args:["--user","enable",bo]}),"enable the systemd user unit"),{changed:s}},async uninstall(){let i=await r.exists(n);return await t({command:"systemctl",args:["--user","disable",bo]}),await r.remove(n),Zi(await t({command:"systemctl",args:["--user","daemon-reload"]}),"reload systemd user units"),{changed:i}},async start(){Zi(await t({command:"systemctl",args:["--user","start",bo]}),"start the systemd user unit")},async stopOwned(){Zi(await t({command:"systemctl",args:["--user","stop",bo]}),"stop the systemd user unit")},async status(){if(!await r.exists(n))return{installed:!1,state:"stopped"};let i=await t({command:"systemctl",args:["--user","is-active",bo]});return{installed:!0,state:i.exitCode===0&&i.stdout.trim()==="active"?"running":/^(inactive|failed|deactivating)$/u.test(i.stdout.trim())||i.exitCode===3?"stopped":"unknown",detail:i.stdout.trim()||i.stderr.trim()||void 0}}},e)}function XB(e){return["[Unit]","Description=Hunsu Bridge","After=network-online.target","","[Service]","Type=simple",`ExecStart=${[e.nodePath,e.cliPath,"daemon","--runtime-path",e.runtimePath].map(Nm).join(" ")}`,`Environment=${Nm(`HUNSU_HOME=${e.hunsuHome}`)}`,"Restart=on-failure","RestartSec=2","","[Install]","WantedBy=default.target",""].join(`
|
|
129
|
+
`)}function Zi(e,t){if(e.exitCode!==0)throw new Error(`Unable to ${t}.`)}import{homedir as YB}from"node:os";import{join as kd}from"node:path";var Om="app.hunsu.bridge";function qR(e){let t=e.commandRunner??Ao,r=e.fileSystem??yd,n=e.homeDirectory??YB(),o=e.plistPath??kd(n,"Library","LaunchAgents",`${Om}.plist`),s=`gui/${e.uid??(typeof process.getuid=="function"?process.getuid():0)}`,a=`${s}/${Om}`;return Po({manager:"launchd-user",definitionPath:o,platform:"darwin",async install(u){await r.mkdir(kd(u.hunsuHome,"logs"),{mode:448});let c=QB(u);return await r.readText(o)!==c&&(await t({command:"launchctl",args:["print",a]})).exitCode===0&&Bm(await t({command:"launchctl",args:["bootout",a]}),"reload the changed LaunchAgent definition"),{changed:await Sd(r,o,c)}},async uninstall(){let u=await r.exists(o);return await t({command:"launchctl",args:["bootout",a]}),await r.remove(o),{changed:u}},async start(){let c=(await t({command:"launchctl",args:["print",a]})).exitCode===0?await t({command:"launchctl",args:["kickstart",a]}):await t({command:"launchctl",args:["bootstrap",s,o]});Bm(c,"start the LaunchAgent")},async stopOwned(){Bm(await t({command:"launchctl",args:["bootout",a]}),"stop the LaunchAgent")},async status(){if(!await r.exists(o))return{installed:!1,state:"stopped"};let u=await t({command:"launchctl",args:["print",a]}),m=u.stdout.match(/^\s*state\s*=\s*([^\r\n]+)\s*$/imu)?.[1]?.trim().toLowerCase();return{installed:!0,state:u.exitCode!==0?"stopped":m==="running"?"running":m?"stopped":"unknown",detail:u.exitCode===0?m??"loaded; state unavailable":"not loaded"}}},e)}function QB(e){let t=kd(e.hunsuHome,"logs","bridge.stdout.log"),r=kd(e.hunsuHome,"logs","bridge.stderr.log");return['<?xml version="1.0" encoding="UTF-8"?>','<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">','<plist version="1.0">',"<dict>"," <key>Label</key>",` <string>${Om}</string>`," <key>ProgramArguments</key>"," <array>",` <string>${Un(e.nodePath)}</string>`,` <string>${Un(e.cliPath)}</string>`," <string>daemon</string>"," <string>--runtime-path</string>",` <string>${Un(e.runtimePath)}</string>`," </array>"," <key>EnvironmentVariables</key>"," <dict>"," <key>HUNSU_HOME</key>",` <string>${Un(e.hunsuHome)}</string>`," </dict>"," <key>RunAtLoad</key>"," <true/>"," <key>KeepAlive</key>"," <dict>"," <key>SuccessfulExit</key>"," <false/>"," </dict>"," <key>StandardOutPath</key>",` <string>${Un(t)}</string>`," <key>StandardErrorPath</key>",` <string>${Un(r)}</string>`,"</dict>","</plist>",""].join(`
|
|
130
|
+
`)}function Bm(e,t){if(e.exitCode!==0)throw new Error(`Unable to ${t}.`)}var VR="Hunsu Bridge";function JR(e){let t=e.commandRunner??Ao,r=e.taskName??VR,n=e.powershellPath??"powershell.exe",o=!1,i=u=>t({command:n,args:["-NoProfile","-NonInteractive","-ExecutionPolicy","Bypass","-Command",u]}),s=async()=>i(["$ErrorActionPreference = 'Stop'",`Get-ScheduledTask -TaskName ${Qt(r)} | Select-Object -ExpandProperty State`].join("; ")),a=async()=>i(["$ErrorActionPreference = 'Stop'",`$Task = Get-ScheduledTask -TaskName ${Qt(r)}`,"@{ Execute = $Task.Actions[0].Execute; Arguments = $Task.Actions[0].Arguments; WorkingDirectory = $Task.Actions[0].WorkingDirectory } | ConvertTo-Json -Compress"].join("; ")),d={manager:"windows-task-scheduler",definitionPath:`Task Scheduler: ${r}`,platform:"win32",async install(u){let c=await a(),m=!eO(c,u),f=await i(ZB(u,r));return Id(f,"register the current-user scheduled task"),o=!0,{changed:m}},async uninstall(){let u=await s(),c=await i(["$ErrorActionPreference = 'Stop'",`Unregister-ScheduledTask -TaskName ${Qt(r)} -Confirm:$false`].join("; "));return u.exitCode===0&&Id(c,"unregister the current-user scheduled task"),o=!1,{changed:u.exitCode===0}},async start(){Id(await i(`Start-ScheduledTask -TaskName ${Qt(r)}`),"start the current-user scheduled task")},async stopOwned(){Id(await i(`Stop-ScheduledTask -TaskName ${Qt(r)}`),"stop the current-user scheduled task")},async status(){let u=await s();if(u.exitCode!==0)return{installed:o,state:"stopped",detail:"task not registered"};o=!0;let c=u.stdout.trim().toLowerCase();return{installed:!0,state:c==="running"?"running":c?"stopped":"unknown",detail:c||void 0}}};return Po(d,e)}function ZB(e,t=VR){let r=zR(e);return["$ErrorActionPreference = 'Stop'","$CurrentUser = [System.Security.Principal.WindowsIdentity]::GetCurrent().Name",`$Action = New-ScheduledTaskAction -Execute ${Qt(e.nodePath)} -Argument ${Qt(r)} -WorkingDirectory ${Qt(e.runtimePath)}`,"$Trigger = New-ScheduledTaskTrigger -AtLogOn -User $CurrentUser","$Principal = New-ScheduledTaskPrincipal -UserId $CurrentUser -LogonType Interactive -RunLevel Limited","$Settings = New-ScheduledTaskSettingsSet -Hidden -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries -RestartCount 3 -RestartInterval (New-TimeSpan -Minutes 1)",`Register-ScheduledTask -TaskName ${Qt(t)} -Action $Action -Trigger $Trigger -Principal $Principal -Settings $Settings -Description 'Hunsu Bridge current-user daemon' -Force | Out-Null`].join("; ")}function zR(e){return[Rd(e.cliPath),"daemon","--runtime-path",Rd(e.runtimePath),"--home",Rd(e.hunsuHome)].join(" ")}function eO(e,t){if(e.exitCode!==0)return!1;try{let r=JSON.parse(e.stdout.trim().replace(/^\uFEFF/u,""));return typeof r.Execute=="string"&&r.Execute.toLowerCase()===t.nodePath.toLowerCase()&&r.Arguments===zR(t)&&typeof r.WorkingDirectory=="string"&&r.WorkingDirectory.toLowerCase()===t.runtimePath.toLowerCase()}catch{return!1}}function Id(e,t){if(e.exitCode!==0)throw new Error(`Unable to ${t}.`)}function KR(e){let t=e.platform??process.platform;if(t==="linux"&&e.linux)return GR(e.linux);if(t==="darwin"&&e.macos)return qR(e.macos);if(t==="win32"&&e.windows)return JR(e.windows);throw new Error(`Hunsu Bridge does not have a configured user service manager for ${t}.`)}function XR(e){let t=e.platform??process.platform,r={requestAuthenticatedShutdown:async()=>(await e.controlClient.request("/v1/control/shutdown",{method:"POST"})).ok,probeHealth:async()=>await e.controlClient.health()!==void 0,probeAuthenticatedStatus:async()=>{let o=await e.controlClient.request("/v1/control/status");return o.ok?{state:"authenticated",value:o.value}:o.code==="BRIDGE_CONTROL_UNAUTHORIZED"?{state:"unauthorized"}:{state:"unavailable"}},readInstalledRuntime:async()=>{let o=await Qr(e.paths).read();return o?{packageVersion:o.current.packageVersion,runtimePath:o.current.runtimePath}:void 0}},n=e.userHome??tO();return KR({platform:t,...t==="linux"?{linux:{...r,homeDirectory:n}}:{},...t==="darwin"?{macos:{...r,homeDirectory:n}}:{},...t==="win32"?{windows:r}:{}})}import{isAbsolute as YR}from"node:path";import{fileURLToPath as rO,pathToFileURL as QR}from"node:url";var Zt=class extends Error{code="RUNTIME_INSTALL_FAILED";constructor(t){super(t),this.name="RuntimePackageSourceError"}};function wd(){return{kind:"registry-exact",packageName:"@hunsu/bridge",version:ye}}function ZR(e,t=ye){if(rk(e)||!YR(e)||!e.toLowerCase().endsWith(".tgz"))throw new Zt("--runtime-package requires an absolute local .tgz path.");if(!$m(t))throw new Zt("The local runtime package requires an exact expected version.");return{kind:"local-tarball",fileUrl:QR(e).href,expectedVersion:t}}function ek(e){return es(e),"@hunsu/bridge"}function tk(e){let t=es(e);return t.kind==="registry-exact"?t.version:t.expectedVersion}function Lm(e){let t=es(e);return t.kind==="local-tarball"?t.fileUrl:`${t.packageName}@${t.version}`}function es(e){if(e.kind==="registry-exact"){if(e.packageName!=="@hunsu/bridge"||!$m(e.version))throw new Zt("Bridge setup requires one exact @hunsu/bridge package version.");return{kind:"registry-exact",packageName:"@hunsu/bridge",version:e.version}}if(e.kind!=="local-tarball"||!$m(e.expectedVersion))throw new Zt("Bridge setup requires one exact @hunsu/bridge package version.");let t;try{t=new URL(e.fileUrl)}catch{throw new Zt("The local runtime package must be a file URL created from an absolute .tgz path.")}if(t.protocol!=="file:"||t.username||t.password||t.search||t.hash)throw new Zt("The local runtime package must be a credential-free local file URL.");let r;try{r=rO(t)}catch{throw new Zt("The local runtime package file URL is invalid.")}if(!YR(r)||!r.toLowerCase().endsWith(".tgz")||rk(r))throw new Zt("The local runtime package must resolve to an absolute .tgz path.");return{kind:"local-tarball",fileUrl:QR(r).href,expectedVersion:e.expectedVersion}}function $m(e){return/^(?:0|[1-9]\d*)\.(?:0|[1-9]\d*)\.(?:0|[1-9]\d*)(?:-[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*)?(?:\+[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*)?$/u.test(e)}function rk(e){return/[\u0000-\u001f\u007f]/u.test(e)}import{join as yO}from"node:path";import{lstat as nk,mkdir as nO,realpath as oO}from"node:fs/promises";import{isAbsolute as iO,resolve as Fm,win32 as sO}from"node:path";var Ed="hunsu.bridge.home-ownership.v1",Pe=class extends Error{constructor(t,r){super(t,r),this.name="HomeOwnershipError"}};function Pd(e){return{async read(){let t;try{t=await nk(e.homeOwnershipFile)}catch(n){if(X(n)&&n.code==="ENOENT")return;throw new Pe("The Hunsu home ownership marker could not be inspected.",{cause:n})}if(!t.isFile()||t.isSymbolicLink())throw new Pe("The Hunsu home ownership marker has an unsafe filesystem type.");let r=await Xe(e.homeOwnershipFile);return r===void 0?void 0:ok(e.homeOwnershipFile,r)},async write(t){await Me(e.homeOwnershipFile,ok(e.homeOwnershipFile,t),{mode:384})},async canonicalHome(t){try{t&&await nO(e.home,{recursive:!0,mode:448});let r=await nk(e.home);if(!r.isDirectory()||r.isSymbolicLink())throw new Pe("The configured Hunsu home has an unsafe filesystem type.");return Fm(await oO(e.home))}catch(r){throw r instanceof Pe?r:new Pe("The canonical Hunsu home could not be established.",{cause:r})}}}}async function ik(e){let t=await e.store.canonicalHome(!0),r=await e.store.read();if(r){if(!Ad(r.home,t))throw new Pe("The Hunsu home ownership marker does not match the canonical home.");if(e.expectedInstallationId&&r.installationId!==e.expectedInstallationId)throw new Pe("The Hunsu home ownership marker does not match the installed runtime.");return r}let n=e.expectedInstallationId??(e.createInstallationId??cR)();sk(n);let o={schema:Ed,installationId:n,createdAt:(e.now??(()=>new Date))().toISOString(),home:t};return await e.store.write(o),o}function Ad(e,t){let r=Fm(e),n=Fm(t);return process.platform==="win32"?r.toLowerCase()===n.toLowerCase():r===n}function ok(e,t){if(!aO(t)||t.schema!==Ed)throw M(e,`expected schema ${Ed}`);let r=Um(e,"installationId",t.installationId);sk(r,e);let n=Um(e,"createdAt",t.createdAt);if(!Number.isFinite(Date.parse(n)))throw M(e,"createdAt must be an ISO timestamp");let o=Um(e,"home",t.home);if(!iO(o)&&!sO.isAbsolute(o))throw M(e,"home must be an absolute path");return{schema:Ed,installationId:r,createdAt:n,home:o}}function sk(e,t){if(!/^install_[A-Za-z0-9_-]{8,}$/u.test(e))throw t?M(t,"installationId must be a Hunsu installation id"):new Pe("The Hunsu installation identity is invalid.")}function Um(e,t,r){if(typeof r!="string"||!r.trim()||/[\u0000-\u001f\u007f]/u.test(r))throw M(e,`${t} must be a non-empty safe string`);return r}function aO(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}import{lstat as dO,readdir as uO,realpath as cO,rmdir as lO,unlink as mO}from"node:fs/promises";import{homedir as fO}from"node:os";import{basename as pO,isAbsolute as gO,join as ns,parse as vO,relative as ck,resolve as ht,sep as lk}from"node:path";var Wm=Object.freeze(["config.json","workspaces.json","credentials.json","runtime.json","runtime","logs",".hunsu-bridge-home.json"]),mk=Object.freeze(["runtime.json","runtime"]),fk={"config.json":"file","workspaces.json":"file","credentials.json":"file","runtime.json":"file",runtime:"directory",logs:"directory",".hunsu-bridge-home.json":"file"},we=class extends Error{constructor(t,r){super(t,r),this.name="OwnedDataSafetyError"}},os={async lstat(e){try{return await dO(e)}catch(t){if(X(t)&&t.code==="ENOENT")return;throw t}},realpath:cO,readdir:uO,unlink:mO,rmdir:lO};async function pk(e){let t=e.fileSystem??os,r=ht(e.canonicalHome);await hO({canonicalHome:r,fileSystem:t,userHome:e.userHome,currentDirectory:e.currentDirectory});let n=await bd(t,r),o=[];for(let d of e.entries)is(d),await hk(t,r,ns(r,d),fk[d])&&o.push(d);let i=Sk(n),s=new Set(e.entries),a=n.every(d=>s.has(d));return{canonicalHome:r,entries:[...e.entries],existingEntries:o,preservedUnknownEntries:i,homeDirectoryRemoved:a}}async function gk(e,t=os){for(let o of e.entries)await yk(t,e.canonicalHome,ns(e.canonicalHome,o),fk[o]);let r=await bd(t,e.canonicalHome),n=!1;if(r.length===0)try{await t.rmdir(e.canonicalHome),n=!0}catch(o){if(!X(o)||o.code!=="ENOENT"&&o.code!=="ENOTEMPTY"&&o.code!=="EEXIST")throw o;n=o.code==="ENOENT"}return{deleted:e.existingEntries.filter(o=>o!==".hunsu-bridge-home.json"),preservedUnknownEntries:Sk(r),homeDirectoryRemoved:n}}async function vk(e){let t=e.fileSystem??os;Gm(e.canonicalHome,e.path);let r=ck(ht(e.canonicalHome),ht(e.path)).split(lk),n=ht(e.canonicalHome);for(let i of r.slice(0,-1)){is(i),n=ns(n,i);let s=await rs(t,n);if(!s?.isDirectory()||s.isSymbolicLink())throw new we("An installation identity directory has an unsafe filesystem type.");await Fn(t,e.canonicalHome,n)}let o=await rs(t,e.path);if(!o||o.isSymbolicLink()||!o.isFile())throw new we("An installation identity file has an unsafe filesystem type.");await Fn(t,e.canonicalHome,e.path)}async function hk(e,t,r,n){Gm(t,r);let o=await rs(e,r);if(!o)return!1;if(o.isSymbolicLink())return!0;if(o.isFile()){if(n==="directory")throw ts();return await Fn(e,t,r),!0}if(o.isDirectory()){if(n==="file")throw ts();await Fn(e,t,r);let i=await bd(e,r);for(let s of i)is(s),await hk(e,t,ns(r,s),"any");return!0}throw ts()}async function yk(e,t,r,n){Gm(t,r);let o=await rs(e,r);if(o){if(o.isSymbolicLink()){await e.unlink(r);return}if(o.isFile()){if(n==="directory")throw ts();await Fn(e,t,r),await e.unlink(r);return}if(!o.isDirectory()||n==="file")throw ts();await Fn(e,t,r);for(let i of await bd(e,r))is(i),await ak(e,t,r),await yk(e,t,ns(r,i),"any");await ak(e,t,r),await e.rmdir(r)}}async function ak(e,t,r){let n=await rs(e,r);if(!n?.isDirectory()||n.isSymbolicLink())throw new we("A Hunsu-owned directory changed type during removal.");await Fn(e,t,r)}async function Fn(e,t,r){let n;try{n=ht(await e.realpath(r))}catch(o){throw new we("Canonical containment could not be established for Hunsu-owned data.",{cause:o})}if(!qm(t,n,!1))throw new we("A Hunsu-owned entry resolves outside the canonical Hunsu home.")}async function hO(e){let t=vO(e.canonicalHome).root;if(uk(e.canonicalHome,t))throw jm();let r=await dk(e.fileSystem,e.userHome??fO());if(uk(e.canonicalHome,r))throw jm();let n=await dk(e.fileSystem,e.currentDirectory??process.cwd());if(qm(e.canonicalHome,n,!0))throw jm()}async function dk(e,t){try{return ht(await e.realpath(t))}catch{return ht(t)}}async function rs(e,t){try{return await e.lstat(t)}catch(r){throw new we("A Hunsu-owned entry could not be inspected safely.",{cause:r})}}async function bd(e,t){try{let r=await e.readdir(t);for(let n of r)is(n);return r.sort((n,o)=>n.localeCompare(o))}catch(r){if(X(r)&&r.code==="ENOENT")return[];throw r instanceof we?r:new we("A Hunsu-owned directory could not be inspected safely.",{cause:r})}}function Sk(e){let t=new Set(Wm);return e.filter(r=>!t.has(r))}function Gm(e,t){if(!qm(e,ht(t),!1))throw new we("A Hunsu-owned path is outside the canonical Hunsu home.")}function qm(e,t,r){let n=ck(ht(e),ht(t));return n===""?r:n!==".."&&!n.startsWith(`..${lk}`)&&!gO(n)}function uk(e,t){let r=ht(e),n=ht(t);return process.platform==="win32"?r.toLowerCase()===n.toLowerCase():r===n}function is(e){if(!e||e==="."||e===".."||pO(e)!==e)throw new we("A directory entry is not safe to report or remove.")}function jm(){return new we("Hunsu Bridge refuses to remove data from a protected directory.")}function ts(){return new we("A Hunsu-owned entry has an unexpected filesystem type.")}async function kk(e,t){if(e.deleteData&&e.confirmed!==!0)return{ok:!1,code:"CONFIRMATION_REQUIRED",message:"Deleting Hunsu Bridge data requires explicit confirmation."};if(e.dryRun)return Vm(e,t);if(e.deleteData){let o=await Vm({...e,dryRun:!0},t);if(!o.ok)return o}let r;try{r=await(t.acquireOperationLock?t.acquireOperationLock(t.paths):So(t.paths,"remove"))}catch(o){return o instanceof xt?{ok:!1,code:o.code,message:o.message}:xd()}let n;try{n=await Vm(e,t)}finally{try{await r.release()}catch{return xd()}}return n}async function Vm(e,t){if(e.deleteData&&e.confirmed!==!0)return{ok:!1,code:"CONFIRMATION_REQUIRED",message:"Deleting Hunsu Bridge data requires explicit confirmation."};let r=t.installStore??Qr(t.paths),n=t.ownershipStore??Pd(t.paths),o=t.fileSystem??os,i;try{let a=await o.lstat(t.paths.home);if(a){if(a.isSymbolicLink())throw new we("Hunsu Bridge refuses to remove data through a symbolic-link or junction home.");if(!a.isDirectory())throw new we("The configured Hunsu home has an unexpected filesystem type.");let d=await n.canonicalHome(!1);i=await pk({canonicalHome:d,entries:e.deleteData?Wm:mk,fileSystem:o,userHome:t.userHome,currentDirectory:t.currentDirectory}),e.deleteData&&await SO({canonicalHome:d,installStore:r,ownershipStore:n,fileSystem:o})}else if(e.deleteData)return Jm("Hunsu Bridge refused to delete data because installation ownership is unknown.")}catch(a){return a instanceof we||a instanceof Pe||e.deleteData?Jm(a instanceof Error?a.message:"Hunsu Bridge could not verify ownership of the data directory."):xd()}if(e.dryRun)return Rk({removedRuntime:!0,deletedData:e.deleteData===!0,deleted:RO(i),preservedUnknownEntries:i?.preservedUnknownEntries??[],homeDirectoryRemoved:i?.homeDirectoryRemoved??!0,dryRun:!0});let s=await t.serviceManager.uninstall();if(!s.ok)return{ok:!1,code:s.code,message:s.message};try{let a=i?await gk(i,o):{deleted:[],preservedUnknownEntries:[],homeDirectoryRemoved:!0};return Rk({removedRuntime:!0,deletedData:e.deleteData===!0,deleted:a.deleted,preservedUnknownEntries:a.preservedUnknownEntries,homeDirectoryRemoved:a.homeDirectoryRemoved,dryRun:!1})}catch(a){return a instanceof we?Jm(a.message):xd()}}async function SO(e){await vk({canonicalHome:e.canonicalHome,path:yO(e.canonicalHome,"runtime","install.json"),fileSystem:e.fileSystem});let t=await e.installStore.read();if(!t?.installationId)throw new Pe("Hunsu Bridge refused to delete data because installation ownership is unknown.");let r=await e.ownershipStore.read();if(!r)throw new Pe("Hunsu Bridge refused to delete data because the ownership marker is missing.");if(r.installationId!==t.installationId)throw new Pe("Hunsu Bridge refused to delete data because the installation identity does not match.");if(!Ad(r.home,e.canonicalHome))throw new Pe("Hunsu Bridge refused to delete data because the canonical home does not match.");let n;try{n=await e.fileSystem.realpath(t.serviceInput.hunsuHome)}catch(o){throw new Pe("Hunsu Bridge refused to delete data because the installed home cannot be verified.",{cause:o})}if(!Ad(n,e.canonicalHome))throw new Pe("Hunsu Bridge refused to delete data because the installed home does not match.")}function RO(e){return e?.existingEntries.filter(t=>t!==".hunsu-bridge-home.json")??[]}function Jm(e){return{ok:!1,code:"BRIDGE_DATA_DELETE_REFUSED",message:e}}function xd(){return{ok:!1,code:"RUNTIME_INSTALL_FAILED",message:"Hunsu Bridge runtime files could not be removed safely."}}function Rk(e){let t=e.preservedUnknownEntries.length>0?` ${e.preservedUnknownEntries.length} unknown home entries were preserved.`:"";return{ok:!0,code:"OK",message:e.dryRun?`Hunsu Bridge removal dry run completed.${t}`:e.deletedData?`Hunsu Bridge and its owned user data were removed.${t}`:`Hunsu Bridge runtime removed; config, Workspaces, and credentials were preserved.${t}`,value:e}}import{randomUUID as BO}from"node:crypto";import{execFile as kO}from"node:child_process";import{createHash as IO}from"node:crypto";import{lstat as wO,mkdir as EO,readFile as PO,readdir as AO,realpath as bO,rename as xO,rmdir as CO,unlink as TO}from"node:fs/promises";import{isAbsolute as Ym,posix as Pk,relative as Ak,resolve as Dt,win32 as Km}from"node:path";var ce=class extends Error{code="RUNTIME_INSTALL_FAILED";constructor(t,r){super(t,r),this.name="StagedRuntimeInstallError"}},Ve=class extends Error{code="ROLLBACK_FAILED";constructor(t="The failed staged runtime could not be restored or removed safely.",r){super(t,r),this.name="StagedRuntimeCleanupError"}},Qm={async lstat(e){try{return await wO(e)}catch(t){if(NO(t)&&t.code==="ENOENT")return;throw t}},realpath:bO,readdir:AO,async mkdir(e){await EO(e,{recursive:!0,mode:448})},unlink:TO,rmdir:CO,rename:xO,readFile:PO},DO=e=>new Promise(t=>{kO(e.command,e.args,{encoding:"utf8",windowsHide:!0,maxBuffer:1024*1024},(r,n,o)=>{t({exitCode:r&&"code"in r&&typeof r.code=="number"?r.code:r?1:0,stdout:n??"",stderr:o??(r instanceof Error?r.message:"")})})});function Zm(e){let t=e.platform??process.platform,r=t==="win32"?Km:Pk;if(!(t==="win32"?Km.isAbsolute:Ym)(e.nodePath)||rf(e.nodePath))throw new ce("The Node executable path must be absolute.");if(!/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/u.test(e.transactionId))throw new ce("The setup transaction id is invalid.");let o=es(e.source??wd()),i=tk(o),s=e.paths.runtimeStagingDirectory,a=r.join(s,e.transactionId),d=r.join(e.paths.runtimeVersionsDirectory,i),u=r.join(e.paths.runtimeVersionsDirectory,`.${i}.previous`),c=["node_modules","@hunsu","bridge"],m=r.join(a,...c),f=r.join(d,...c),p=["install","--ignore-scripts","--omit=dev","--no-audit","--no-fund","--prefix",a,Lm(o)];return{source:o,packageName:ek(o),packageVersion:i,packageSpec:Lm(o),transactionId:e.transactionId,home:e.paths.home,runtimeDirectory:e.paths.runtimeDirectory,stagingRoot:s,stagingPath:a,stagingCliPath:r.join(m,"dist","cli.js"),stagingManifestPath:r.join(m,"package.json"),runtimeVersionsDirectory:e.paths.runtimeVersionsDirectory,runtimePath:d,quarantinePath:u,cliPath:r.join(f,"dist","cli.js"),manifestPath:r.join(f,"package.json"),nodePath:e.nodePath,npmCommand:t==="win32"?_O(e.npmCommand??"npm.cmd",p):{command:e.npmCommand??"npm",args:p}}}async function bk(e){let t=e.fileSystem??Qm,r=e.commandRunner??DO,n=e.now??(()=>new Date),o=await tf(e.plan,t);await Ck(e.plan,t,o,e.nodeVersion??process.version),await en(e.plan.stagingRoot,e.plan.stagingPath,t,o),await t.mkdir(e.plan.stagingPath);let i=!1;try{if(await jn(e.plan.stagingPath,o,t),await e.onPhase?.("npm-install"),(await r(e.plan.npmCommand)).exitCode!==0)throw new ce("npm could not install the exact Hunsu Bridge runtime package.");await e.onPhase?.("candidate-verification");let a=await Cd({root:e.plan.stagingPath,manifestPath:e.plan.stagingManifestPath,cliPath:e.plan.stagingCliPath,expectedName:e.plan.packageName,expectedVersion:e.plan.packageVersion,fileSystem:t,canonicalHome:o,nodeVersion:e.nodeVersion??process.version});if(await t.lstat(e.plan.runtimePath)){let d;try{d=await Cd({root:e.plan.runtimePath,manifestPath:e.plan.manifestPath,cliPath:e.plan.cliPath,expectedName:e.plan.packageName,expectedVersion:e.plan.packageVersion,fileSystem:t,canonicalHome:o,nodeVersion:e.nodeVersion??process.version})}catch(u){if(Xm(e.protectedRuntimePath,e.plan.runtimePath))throw new ce("The currently recorded runtime is incomplete or invalid; preserve it and run offline repair before retrying setup.",{cause:u})}if(d?.cliSha256===a.cliSha256)return await en(e.plan.stagingRoot,e.plan.stagingPath,t,o),{installation:wk(e.plan,d.cliSha256,n),reused:!0};await jn(e.plan.runtimePath,o,t),await t.rename(e.plan.runtimePath,e.plan.quarantinePath),i=!0}try{await e.onPhase?.("staging-rename"),await t.rename(e.plan.stagingPath,e.plan.runtimePath)}catch(d){if(i)try{await t.rename(e.plan.quarantinePath,e.plan.runtimePath),i=!1}catch(u){throw new Ve("The staged runtime activation failed and the previous version directory could not be restored.",{cause:u})}throw d}if(i)try{await en(e.plan.runtimeVersionsDirectory,e.plan.quarantinePath,t,o)}catch(d){try{await en(e.plan.runtimeVersionsDirectory,e.plan.runtimePath,t,o),await t.rename(e.plan.quarantinePath,e.plan.runtimePath)}catch(u){throw new Ve("The replacement runtime could not be committed or rolled back safely.",{cause:u})}throw new Ve("The replacement runtime could not remove its quarantine directory.",{cause:d})}return{installation:wk(e.plan,a.cliSha256,n),reused:!1}}catch(s){try{await en(e.plan.stagingRoot,e.plan.stagingPath,t,o)}catch(a){throw new Ve("The failed staged runtime could not be removed; remove the runtime staging directory before retrying setup.",{cause:a})}throw s instanceof ce||s instanceof Ve?s:new ce("The staged Hunsu Bridge runtime could not be verified and activated.",{cause:s})}}async function ef(e){if(e.previous&&Xm(e.previous.runtimePath,e.installation.runtimePath))return{removed:!1};let t=e.fileSystem??Qm,r=Zm({paths:e.paths,transactionId:"candidate-cleanup",nodePath:e.installation.nodePath,source:{kind:"registry-exact",packageName:"@hunsu/bridge",version:e.installation.packageVersion}}),n=await tf(r,t);if(!Xm(r.runtimePath,e.installation.runtimePath))throw new Ve("The candidate runtime path is not the exact owned version directory.");return await en(r.runtimeVersionsDirectory,r.runtimePath,t,n),{removed:!0}}async function xk(e){let t=e.fileSystem??Qm,r=await tf(e.plan,t);return await Ck(e.plan,t,r,e.nodeVersion??process.version),Cd({root:e.plan.runtimePath,manifestPath:e.plan.manifestPath,cliPath:e.plan.cliPath,expectedName:e.plan.packageName,expectedVersion:e.plan.packageVersion,fileSystem:t,canonicalHome:r,nodeVersion:e.nodeVersion??process.version})}function _O(e,t){if(!e.trim()||rf(e))throw new ce("The npm command is invalid.");let r=t.map(Ek).join(", "),n=["$ErrorActionPreference = 'Stop'",`$npm = ${Ek(e)}`,`$arguments = @(${r})`,"& $npm @arguments","if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }"].join(`
|
|
131
|
+
`);return{command:"powershell.exe",args:["-NoLogo","-NoProfile","-NonInteractive","-ExecutionPolicy","Bypass","-EncodedCommand",Buffer.from(n,"utf16le").toString("base64")]}}async function tf(e,t){let r=await t.lstat(e.home);if(!r?.isDirectory()||r.isSymbolicLink())throw new ce("The configured Hunsu home has an unsafe filesystem type.");let n=Dt(await t.realpath(e.home));for(let o of[e.runtimeDirectory,e.stagingRoot,e.runtimeVersionsDirectory])await t.lstat(o)||await t.mkdir(o),await jn(o,n,t);return ss(e.stagingRoot,e.stagingPath),ss(e.runtimeVersionsDirectory,e.runtimePath),ss(e.runtimeVersionsDirectory,e.quarantinePath),n}async function Ck(e,t,r,n){if(!await t.lstat(e.quarantinePath))return;if(await jn(e.quarantinePath,r,t),!await t.lstat(e.runtimePath)){await t.rename(e.quarantinePath,e.runtimePath);return}let o=!1;try{await Cd({root:e.runtimePath,manifestPath:e.manifestPath,cliPath:e.cliPath,expectedName:e.packageName,expectedVersion:e.packageVersion,fileSystem:t,canonicalHome:r,nodeVersion:n}),o=!0}catch{o=!1}if(o){await en(e.runtimeVersionsDirectory,e.quarantinePath,t,r);return}await en(e.runtimeVersionsDirectory,e.runtimePath,t,r),await t.rename(e.quarantinePath,e.runtimePath)}async function Cd(e){await jn(e.root,e.canonicalHome,e.fileSystem),await Ik(e.manifestPath,e.root,e.canonicalHome,e.fileSystem),await Ik(e.cliPath,e.root,e.canonicalHome,e.fileSystem);let t=await e.fileSystem.readFile(e.manifestPath),r;try{r=JSON.parse(t.toString("utf8"))}catch(i){throw new ce("The installed runtime package manifest is invalid.",{cause:i})}if(!zm(r)||r.name!==e.expectedName||r.version!==e.expectedVersion)throw new ce("The installed runtime package name or exact version does not match the candidate.");let n=zm(r.engines)&&typeof r.engines.node=="string"?r.engines.node:void 0;if(!n||!MO(e.nodeVersion,n))throw new ce("The installed runtime package has an unsupported Node engine contract.");for(let i of["dependencies","optionalDependencies","peerDependencies"]){let s=r[i];if(s!==void 0){if(!zm(s))throw new ce("The installed runtime dependency contract is invalid.");for(let a of Object.values(s))if(typeof a!="string"||/^(?:workspace:|link:|file:)/u.test(a))throw new ce("The installed runtime contains an unresolved workspace dependency.")}}let o=await e.fileSystem.readFile(e.cliPath);if(o.byteLength===0)throw new ce("The installed runtime CLI is empty.");return{cliSha256:IO("sha256").update(o).digest("hex")}}async function Ik(e,t,r,n){ss(t,e);let o=await n.lstat(e);if(!o?.isFile()||o.isSymbolicLink())throw new ce("The installed runtime contains an unsafe manifest or CLI filesystem type.");let i=Dt(await n.realpath(e));if(!Td(r,i,!1)||!Td(Dt(await n.realpath(t)),i,!1))throw new ce("The installed runtime manifest or CLI resolves outside its owned directory.")}async function jn(e,t,r){let n=await r.lstat(e);if(!n?.isDirectory()||n.isSymbolicLink())throw new ce("A runtime directory has an unsafe filesystem type.");let o=Dt(await r.realpath(e));if(!Td(t,o,!1))throw new ce("A runtime directory resolves outside the canonical Hunsu home.")}async function en(e,t,r,n){ss(e,t);let o=await r.lstat(t);if(o){if(!o.isDirectory()||o.isSymbolicLink())throw new Ve("A runtime cleanup target has an unsafe filesystem type.");await Tk(t,r,n)}}async function Tk(e,t,r){let n=await t.lstat(e);if(n){if(n.isSymbolicLink()){await t.unlink(e);return}if(n.isFile()){let o=Dt(await t.realpath(e));if(!Td(r,o,!1))throw new Ve("A runtime file resolves outside the canonical Hunsu home.");await t.unlink(e);return}if(!n.isDirectory())throw new Ve("A runtime cleanup entry has an unsupported filesystem type.");await jn(e,r,t);for(let o of await t.readdir(e)){if(!o||o==="."||o===".."||o.includes("/")||o.includes("\\"))throw new Ve("A runtime directory contains an invalid entry name.");await Tk(HO(e,o),t,r)}await jn(e,r,t),await t.rmdir(e)}}function wk(e,t,r){return{packageVersion:e.packageVersion,runtimePath:e.runtimePath,nodePath:e.nodePath,cliPath:e.cliPath,cliSha256:t,installedAt:r().toISOString()}}function MO(e,t){let r=e.trim().match(/^v?(\d+)\.(\d+)\.(\d+)/u),n=t.trim().match(/^>=(\d+)\.(\d+)(?:\.(\d+))?$/u);if(!r||!n)return!1;let o=r.slice(1,4).map(Number),i=[Number(n[1]),Number(n[2]),Number(n[3]??0)];for(let s=0;s<o.length;s+=1){if(o[s]>i[s])return!0;if(o[s]<i[s])return!1}return!0}function Ek(e){if(rf(e))throw new ce("The npm command contains an unsafe value.");return`'${e.replaceAll("'","''")}'`}function ss(e,t){let r=Ak(Dt(e),Dt(t));if(!r||r.startsWith("..")||Ym(r))throw new ce("The runtime path is outside its Hunsu-owned directory.")}function Td(e,t,r){let n=Ak(Dt(e),Dt(t));return n===""?r:!n.startsWith("..")&&!Ym(n)}function Xm(e,t){if(!e)return!1;let r=Dt(e),n=Dt(t);return process.platform==="win32"?r.toLowerCase()===n.toLowerCase():r===n}function HO(e,t){return e.includes("\\")?Km.join(e,t):Pk.join(e,t)}function rf(e){return/[\u0000-\u001f\u007f]/u.test(e)}function NO(e){return e instanceof Error&&"code"in e}function zm(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}var nf=Object.freeze({major:22,minor:18,patch:0});async function Hk(e){let t=e.nodeVersion??process.version;if(!$O(t))return Ze("NODE_VERSION_UNSUPPORTED","Hunsu Bridge requires Node 22.18 or newer.");let r=e.createTransactionId?.()??`setup_${BO()}`,n;try{n=Zm({paths:e.paths,transactionId:r,nodePath:e.nodePath??process.execPath,source:e.runtimeSource??wd(),...e.npmCommand?{npmCommand:e.npmCommand}:{},...e.platform?{platform:e.platform}:{}})}catch{return Ze("RUNTIME_INSTALL_FAILED","The exact Hunsu Bridge runtime source or executable path is invalid.")}if(e.dryRun)return Ok(n,{idempotent:!1,upgraded:!1,started:!1,dryRun:!0});let o;try{o=await(e.acquireOperationLock?e.acquireOperationLock(e.paths):So(e.paths,"setup",e.now?{now:e.now}:{}))}catch(s){return s instanceof xt?Ze(s.code,s.message):Ze("RUNTIME_INSTALL_FAILED","The Bridge setup lock could not be acquired safely.")}let i;try{i=await OO(e,n,t)}catch{i=Ze("RUNTIME_INSTALL_FAILED","Hunsu Bridge setup failed unexpectedly before activation.")}try{await o.release()}catch{return Ze("ROLLBACK_FAILED","Bridge setup finished but its operation lock could not be released; run `hunsu-bridge doctor --json` before retrying.")}return i}async function OO(e,t,r){let n=e.installStore??Qr(e.paths),o=e.transactionStore??fd(e.paths),i=e.ownershipStore??Pd(e.paths),s=e.now??(()=>new Date),a;try{a=await o.read()}catch{return Ze("RUNTIME_INSTALL_FAILED","The pending Bridge setup transaction is invalid.")}if(a){let p=await Dk({options:e,transaction:a,transactionStore:o,installStore:n,installationId:a.previous?.installationId??null});if(!p.ok)return Mk(p.failures)}let d;try{d=await n.read()}catch{return Ze("RUNTIME_INSTALL_FAILED","The installed Hunsu Bridge runtime record is invalid.")}let u;try{await Ce(e,"ownership-marker"),u=(await ik({store:i,...d?.installationId?{expectedInstallationId:d.installationId}:{},...e.now?{now:e.now}:{},...e.createInstallationId?{createInstallationId:e.createInstallationId}:{}})).installationId}catch{return Ze("RUNTIME_INSTALL_FAILED","The Hunsu home ownership marker could not be created or verified.")}try{await Ce(e,"credential-ensure"),await e.credentialStore.ensure()}catch{return Ze("RUNTIME_INSTALL_FAILED","Hunsu Bridge credentials could not be created or preserved.")}let c,m,f=!1;try{if(d&&d.current.packageVersion===t.packageVersion&&er(d.current.runtimePath,t.runtimePath)&&er(d.current.cliPath,t.cliPath))try{await xk({plan:t,...e.stagedFileSystem?{fileSystem:e.stagedFileSystem}:{},nodeVersion:r}),c={...d.current,nodePath:t.nodePath,runtimePath:t.runtimePath,cliPath:t.cliPath},f=!0}catch{}if(!c){let P=await bk({plan:t,...e.npmRunner?{commandRunner:e.npmRunner}:{},...e.stagedFileSystem?{fileSystem:e.stagedFileSystem}:{},...e.now?{now:e.now}:{},nodeVersion:r,...d?{protectedRuntimePath:d.current.runtimePath}:{},onPhase:L=>Ce(e,L)});c=P.installation,f=P.reused}let p=s().toISOString();m={schema:Yi,transactionId:t.transactionId,phase:"candidate-staged",candidate:c,previous:d??null,createdAt:p,updatedAt:p},await Ce(e,"transaction-write"),await o.write(m);let g=lR(c,e.paths.home);if(d&&!GO(d.serviceInput,g)){await Ce(e,"previous-service-stop");let P=await e.serviceManager.stop();if(!P.ok&&P.code!=="SERVICE_NOT_INSTALLED")throw Dd(P);m=await as(o,m,"previous-stopped",s)}await Ce(e,"service-definition-install");let v=await e.serviceManager.install(g);if(!v.ok)throw Dd(v);m=await as(o,m,"service-switched",s);let A=!1,C=await e.serviceManager.status().catch(()=>{});if(!C)throw tn("SERVICE_STATUS_UNAVAILABLE","The candidate service status could not be read.");if(v.changed&&(C.managerState==="running"||C.health==="healthy")){await Ce(e,"service-start");let P=await e.serviceManager.restart();if(!P.ok)throw Dd(P);A=!0}else if(C.managerState!=="running"&&C.health!=="healthy"){await Ce(e,"service-start");let P=await e.serviceManager.start();if(!P.ok)throw Dd(P);A=!0}m=await as(o,m,"candidate-started",s);let D=await Nk(e.verifyRuntime,c);if(await Ce(e,"health-verification"),!D.health)throw tn("SETUP_VERIFICATION_FAILED","The candidate runtime health check failed.");if(await Ce(e,"authentication-verification"),!D.authenticated)throw tn("SETUP_VERIFICATION_FAILED","The candidate runtime control authentication check failed.");if(await Ce(e,"version-verification"),D.version!==c.packageVersion||!er(D.runtimePath,c.runtimePath))throw tn("SETUP_VERIFICATION_FAILED","The candidate runtime version or stable path check failed.");m=await as(o,m,"candidate-verified",s),m=await as(o,m,"committing",s);let R=LO(u,c,d,g,s);return await Ce(e,"install-record-commit"),await n.write(R),await o.clear(),Ok(t,{idempotent:!!(d&&f&&er(d.current.runtimePath,c.runtimePath)),upgraded:!!(d&&d.current.packageVersion!==c.packageVersion),started:A,dryRun:!1})}catch(p){let g=FO(p);if(!c||!m)return Ze(g.code,g.message);let v=await Dk({options:e,transaction:m,transactionStore:o,installStore:n,installationId:u});return v.ok?m.previous?Ze("SETUP_VERIFICATION_FAILED",`${g.message} The previous verified runtime was restored.`):Ze(g.code,g.message):Mk(v.failures)}}async function Dk(e){let{options:t,transaction:r,transactionStore:n,installStore:o}=e,i=[],s=t.now??(()=>new Date);await n.write({...r,phase:"rolling-back",updatedAt:s().toISOString()}).catch(()=>{});let a=r.previous;return a?(await t.serviceManager.stop().catch(()=>{}),await wr(i,"previous service definition restore",async()=>{await Ce(t,"previous-definition-restore");let d=await t.serviceManager.install(a.serviceInput);if(!d.ok)throw new Error(d.code)}),await wr(i,"previous runtime restart",async()=>{await Ce(t,"previous-runtime-restart");let d=await t.serviceManager.start();if(!d.ok)throw new Error(d.code)}),await wr(i,"previous runtime verification",async()=>{let d=await Nk(t.verifyRuntime,a.current);if(!UO(d,a.current))throw new Error("previous runtime verification failed")}),await wr(i,"previous install record restore",()=>o.write({...a,installationId:a.installationId??e.installationId})),await wr(i,"candidate runtime cleanup",async()=>{await Ce(t,"candidate-runtime-cleanup"),await ef({paths:t.paths,installation:r.candidate,previous:a.current,...t.stagedFileSystem?{fileSystem:t.stagedFileSystem}:{}})})):(await wr(i,"candidate service cleanup",async()=>{await Ce(t,"candidate-service-cleanup"),await t.serviceManager.stop().catch(()=>{}),await t.serviceManager.uninstall().catch(()=>{});let d=await t.serviceManager.status();if(d.installed||d.managerState==="running"||d.health==="healthy")throw new Error("candidate service remains active")}),await wr(i,"install record cleanup",()=>o.clear()),await wr(i,"candidate runtime cleanup",async()=>{await Ce(t,"candidate-runtime-cleanup"),await ef({paths:t.paths,installation:r.candidate,previous:null,...t.stagedFileSystem?{fileSystem:t.stagedFileSystem}:{}})})),i.length===0&&await wr(i,"transaction journal cleanup",()=>n.clear()),i.length===0?{ok:!0}:{ok:!1,failures:i}}function $O(e){let t=e.trim().match(/^v?(\d+)\.(\d+)\.(\d+)(?:[-+].*)?$/u);if(!t)return!1;let r=[Number(t[1]),Number(t[2]),Number(t[3])],n=[nf.major,nf.minor,nf.patch];for(let o=0;o<n.length;o+=1){if(r[o]>n[o])return!0;if(r[o]<n[o])return!1}return!0}async function as(e,t,r,n){let o={...t,phase:r,updatedAt:n().toISOString()};return await e.write(o),o}function LO(e,t,r,n,o){let i=r&&r.current.packageVersion===t.packageVersion&&er(r.current.runtimePath,t.runtimePath);return{schema:Xi,installationId:e,current:t,previous:i?r.previous:r?.current??null,serviceInput:n,updatedAt:o().toISOString()}}async function Nk(e,t){try{return await e(t)}catch{return{health:!1,authenticated:!1,version:"unavailable",runtimePath:"unavailable"}}}function UO(e,t){return e.health&&e.authenticated&&e.version===t.packageVersion&&er(e.runtimePath,t.runtimePath)}async function Ce(e,t){await e.onPhase?.(t)}async function wr(e,t,r){try{await r()}catch{e.push(t)}}function Dd(e){return tn(e.code,e.message)}function tn(e,t){return{code:e,message:t}}function FO(e){if(jO(e))return e;if(e instanceof Ve)return tn(e.code,e.message);if(e instanceof Error&&"code"in e&&typeof e.code=="string"){let t=e.code;if(Bk(t))return tn(t,WO(e))}return tn("RUNTIME_INSTALL_FAILED","The Hunsu Bridge runtime transaction failed.")}function jO(e){return typeof e=="object"&&e!==null&&"code"in e&&Bk(e.code)&&"message"in e&&typeof e.message=="string"}function Bk(e){return e==="NODE_VERSION_UNSUPPORTED"||e==="RUNTIME_INSTALL_FAILED"||e==="SETUP_IN_PROGRESS"||e==="SETUP_VERIFICATION_FAILED"||e==="ROLLBACK_FAILED"||e==="SERVICE_NOT_INSTALLED"||e==="SERVICE_ALREADY_INSTALLED"||e==="SERVICE_INSTALL_FAILED"||e==="SERVICE_START_FAILED"||e==="SERVICE_STOP_FAILED"||e==="SERVICE_STATUS_UNAVAILABLE"}function WO(e){return e instanceof Ve||e.message.includes("runtime")||e.message.includes("Bridge")?e.message:"The Hunsu Bridge runtime transaction failed."}function GO(e,t){return er(e.nodePath,t.nodePath)&&er(e.cliPath,t.cliPath)&&er(e.hunsuHome,t.hunsuHome)&&e.packageVersion===t.packageVersion&&er(e.runtimePath,t.runtimePath)}function er(e,t){let r=_k(e),n=_k(t);return process.platform==="win32"?r.toLowerCase()===n.toLowerCase():r===n}function _k(e){return e.replaceAll("\\","/").replace(/\/$/u,"")}function Mk(e){return Ze("ROLLBACK_FAILED",`Bridge setup rollback could not restore: ${e.join(", ")}. Run \`hunsu-bridge doctor --json\` before retrying.`)}function Ok(e,t){return{ok:!0,code:"OK",message:t.dryRun?"Hunsu Bridge setup dry run completed.":t.idempotent?"Hunsu Bridge is already installed and verified.":"Hunsu Bridge installed and verified.",value:{packageVersion:e.packageVersion,runtimePath:e.runtimePath,cliPath:e.cliPath,npmCommand:e.npmCommand,commands:{status:"npx @hunsu/bridge@next status",doctor:"npx @hunsu/bridge@next doctor",remove:"npx @hunsu/bridge@next remove"},...t}}}function Ze(e,t){return{ok:!1,code:e,message:t}}async function Uk(e=process.argv.slice(2),t=XO){let r;try{r=_m(e)}catch(o){return Er(pr(o),OR(e),t)}let n=Tt(r,"json");try{if(Tt(r,"version")||r.positionals[0]==="version")return Er(te(`Hunsu Bridge ${ye}.`,{version:ye}),n,t);if(Tt(r,"help")||r.positionals[0]==="help"||r.positionals.length===0)return n?Er(te("Hunsu Bridge command help.",{usage:Lk()}),!0,t):(t.stdout(Lk()),0);let o=r.positionals[0],i=Se(r,"home"),s=ft({home:i,env:process.env}),a=ll({paths:s});if(o==="dev"||o==="daemon"){let u=await MR({home:i,host:Se(r,"host"),port:KO(Se(r,"port")),cwd:Se(r,"cwd"),runtimePath:Se(r,"runtime-path"),webUrl:Se(r,"web-url"),development:o==="dev"}),c=te(o==="dev"?"Hunsu Bridge development daemon is ready.":"Hunsu Bridge daemon is ready.",{endpoint:u.identity.endpoint,version:u.identity.version,protocolVersion:u.identity.protocolVersion});return Er(c,n,t),await JO(u),0}let d=XR({paths:s,controlClient:a});if(o==="setup"){if((Se(r,"channel")??"next")!=="next")throw new b("RUNTIME_INSTALL_FAILED","The initial headless prerelease supports only the next channel.");let c=await Hk({paths:s,credentialStore:jr(s),serviceManager:d,...Se(r,"runtime-package")?{runtimeSource:ZR(Se(r,"runtime-package"))}:{},dryRun:Tt(r,"dry-run"),verifyRuntime:m=>VO(a,m.packageVersion,m.runtimePath)});return Er(c.ok?te(c.message,c.value):ee(c.code,c.message),n,t)}if(o==="remove"){let u=await kk({deleteData:Tt(r,"delete-data"),confirmed:Tt(r,"confirm-delete-data"),dryRun:Tt(r,"dry-run")},{paths:s,serviceManager:d});return Er(u.ok?te(u.message,u.value):ee(u.code,u.message),n,t)}if(o==="service")return Er(await qO(r,d,s),n,t);if($R(o))return LR({parsed:r,paths:s,client:a,emit:u=>Er(u,n,t)});throw new b("BRIDGE_STATE_INVALID",`Unknown command: ${o}`)}catch(o){return Er(pr(o),n,t)}}async function qO(e,t,r){let n=e.positionals[1]??"status";if(n==="status")return te("Hunsu Bridge service status is available.",await t.status());if(n==="install")return $k(r,async()=>{let o=await Qr(r).read();return o?ds(await t.install(o.serviceInput)):ee("SERVICE_INSTALL_FAILED","Run `hunsu-bridge setup` before installing the service definition.")});if(n==="uninstall")return $k(r,async()=>ds(await t.uninstall()));if(n==="start")return ds(await t.start());if(n==="stop")return ds(await t.stop());if(n==="restart")return ds(await t.restart());throw new b("BRIDGE_STATE_INVALID",`Unknown service command: ${n}`)}async function $k(e,t){let r;try{r=await So(e,"service-mutation")}catch(i){return i instanceof xt?ee(i.code,i.message):ee("SERVICE_INSTALL_FAILED","The Bridge service mutation lock could not be acquired safely.")}let n,o;try{n=await t()}catch(i){o=i}try{await r.release()}catch{return ee("SERVICE_INSTALL_FAILED","The Bridge service mutation lock could not be released safely.")}if(o!==void 0)throw o;return n}function ds(e){return e.ok?te(e.message,{manager:e.manager,changed:e.changed},e.code):ee(e.code,e.message)}async function VO(e,t,r){for(let n=0;n<100;n+=1){let o=await e.health();if(o){let i=await e.request("/v1/control/status");return{health:!0,authenticated:i.ok,version:i.ok&&typeof i.value?.version=="string"?i.value.version:o.version,runtimePath:i.ok&&typeof i.value?.runtimePath=="string"?i.value.runtimePath:"unavailable"}}await new Promise(i=>setTimeout(i,100))}return{health:!1,authenticated:!1,version:t,runtimePath:r}}async function JO(e){let t=()=>{e.close()};process.once("SIGINT",t),process.once("SIGTERM",t);try{await e.waitUntilClosed()}finally{process.off("SIGINT",t),process.off("SIGTERM",t)}}function Er(e,t,r){let n=zO(e);return t?r.stdout(JSON.stringify(n)):n.ok?(r.stdout(n.message),n.value!==void 0&&r.stdout(JSON.stringify(n.value,null,2))):(r.stderr(`${n.code}: ${n.message}`),n.recovery?.command&&r.stderr(`Recovery: ${n.recovery.command}`)),n.ok?0:1}function zO(e){try{let t=Re(e);return or(t),t}catch{return ee("DIAGNOSTICS_SENSITIVE_DATA_DETECTED","Sensitive data was removed from Bridge command output.")}}function KO(e){if(e===void 0)return;let t=Number(e);if(!Number.isInteger(t)||t<0||t>65535)throw new b("BRIDGE_STATE_INVALID","--port must be an integer from 0 through 65535.");return t}function Lk(){return`Usage: hunsu-bridge <command> [options]
|
|
132
|
+
|
|
133
|
+
Lifecycle:
|
|
134
|
+
setup [--channel next] Install an exact stable runtime and user service.
|
|
135
|
+
remove [--delete-data --confirm-delete-data]
|
|
136
|
+
service install|uninstall|start|stop|restart|status
|
|
137
|
+
dev [--host 127.0.0.1] [--port 0] [--home <path>]
|
|
138
|
+
daemon
|
|
139
|
+
|
|
140
|
+
Client commands (never start a daemon):
|
|
141
|
+
status | doctor | logs [--follow]
|
|
142
|
+
provider list|status|set codex [--binary <path>] [--codex-home <path>]|check codex|reset codex
|
|
143
|
+
workspace add <path>|list|inspect <id>|remove <id>|open <id>
|
|
144
|
+
workspace grant <id> [--scopes <csv>] | revoke <id>
|
|
145
|
+
credential rotate Rotate and revoke the local control credential.
|
|
146
|
+
pair [--workspace <id>] | pair revoke | open [--workspace <id>]
|
|
147
|
+
login | logout | remote enable|disable|status
|
|
148
|
+
|
|
149
|
+
Common options:
|
|
150
|
+
--json Emit the stable hunsu.bridge.cli-result.v1 schema.
|
|
151
|
+
--home <path> Use an explicit HUNSU_HOME for this invocation.
|
|
152
|
+
--help Show help.
|
|
153
|
+
--version Show the package version.`}var XO={stdout:e=>process.stdout.write(`${e}
|
|
154
|
+
`),stderr:e=>process.stderr.write(`${e}
|
|
155
|
+
`)};Uk().then(e=>{process.exitCode=e}).catch(()=>{process.stderr.write(`Hunsu Bridge command failed unexpectedly.
|
|
156
|
+
`),process.exitCode=1});
|