@linzumi/cli 1.0.132 → 1.0.134
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/impl-res/index.js +83 -72
- package/dist/impl-ts/index.js +1 -1
- package/package.json +1 -1
- package/scripts/build-core-fate-ladder-parity-oracle.mjs +14 -67
package/dist/impl-ts/index.js
CHANGED
|
@@ -667,7 +667,7 @@ ${n}
|
|
|
667
667
|
`)}catch(o){n?.(o instanceof Error?o.message:String(o))}}}}function Rhe(e,n){let t=e.trim();if(t.length<=n)return t;let r="... ";return`${r}${t.slice(t.length-(n-r.length))}`}function Ehe(e){let n=Object.entries(e);return n.length<=fN?e:(n.sort(([,t],[,r])=>Date.parse(t.lastAt)-Date.parse(r.lastAt)),Object.fromEntries(n.slice(-fN)))}function xN(e,n,t,r,o=hN){let i=e.load(),s=(i[n]?.count??0)+1,a=t instanceof Error?t.message:String(t??"");return e.save(Ehe({...i,[n]:{count:s,lastError:Rhe(a===""?"the engine worker never started":a,Ihe),lastAt:new Date(r).toISOString()}})),{count:s,tripped:s>=o}}function _N(e,n){let t=e.load();if(t[n]===void 0)return!1;let{[n]:r,...o}=t;return e.save(o),!0}function bN(e,n,t=hN){let r=e.load()[n];return r!==void 0&&r.count>=t?r:void 0}function mC(e,n=fC){let t=wN.find(r=>e!==r&&e.startsWith(`${r}/`));if(t===void 0)return!1;try{return n(e).dev===n(t).dev}catch{return!1}}function vN(e,n=fC){let t=wN.find(i=>e!==i&&e.startsWith(`${i}/`));if(t===void 0)return!1;let r;try{r=n(t).dev}catch{return!1}let o=e;for(;o!==t;)try{return n(o).dev===r}catch(i){let s=typeof i=="object"&&i!==null&&"code"in i?i.code:void 0;if(s!=="ENOENT"&&s!=="ENOTDIR")return!1;let a=mN(o);if(a===o)break;o=a}return!0}function hC(e,n={}){let t=n.realpathFn??She,r;try{r=t(Phe($t(e)))}catch{return!1}return!mC(r,n.statFn??fC)}function SN(e,n=hC){let t=e.load(),r=[],o={};for(let[i,s]of Object.entries(t)){let a=!1;try{a=n(i)}catch{a=!1}a?r.push(i):o[i]=s}return r.length>0&&e.save(o),r}function gC(e){return(e instanceof Error?e.message:String(e??"")).startsWith(kN)}function CN(e,n){return`${kN}${e} on this computer: the last ${n.count} attempts there died during startup (most recent error: ${n.lastError}). Check that the folder exists and its disk/volume is mounted. The pause clears after one successful session, or on runner restart (\`linzumi connect\`) once the folder is present again.`}var hN,Ihe,fN,wN,kN,TN=F(()=>{"use strict";iC();ms();hN=3,Ihe=480,fN=50;wN=["/Volumes"];kN="coding sessions are paused for "});import{mkdirSync as Dhe,rmSync as PN,writeFileSync as Mhe,promises as IN}from"node:fs";import{join as Ahe}from"node:path";import{StringDecoder as $he}from"node:string_decoder";function Ohe(e){return`'${e.replaceAll("'","'\\''")}'`}function Lhe(e,n){return`__lz_live_out=${Ohe(n)}; if ! : >> "$__lz_live_out" 2>/dev/null; then __lz_live_out=/dev/null; fi; { ${e}${cx}`}function jhe(e){return RN.test(e)&&e.endsWith(cx)}function EN(e){let n=e.match(RN)?.[0];return n===void 0||!e.endsWith(cx)?e:e.slice(n.length,e.length-cx.length)}function DN(e){let n=e.LINZUMI_CLAUDE_LIVE_BASH?.trim().toLowerCase();return!(n==="0"||n==="false"||n==="off"||n==="no")}function MN(e){let n=e.pollIntervalMs??Fhe,t=e.maxEmittedBytesPerTool??zhe,r=new Map,o=!1,i=c=>{let l=r.get(c);if(l!==void 0){r.delete(c),l.timer!==void 0&&(clearInterval(l.timer),l.timer=void 0);try{PN(l.file,{force:!0})}catch{}}},s=async(c,l)=>{if(!l.reading){l.reading=!0;try{let p=await IN.stat(l.file);if(p.size<=l.offset)return;let m=Math.min(p.size-l.offset,qhe,t-l.emittedBytes);if(m<=0){i(c);return}let f=await IN.open(l.file,"r");try{let y=Buffer.alloc(m),{bytesRead:x}=await f.read(y,0,m,l.offset);if(x<=0)return;l.offset+=x,l.emittedBytes+=x;let w=l.decoder.write(y.subarray(0,x));w!==""&&r.get(c)===l&&e.onOutputDelta(c,w),l.emittedBytes>=t&&(e.log?.("claude_live_bash.output_budget_exhausted",{tool_use_id:c,emitted_bytes:l.emittedBytes}),i(c))}finally{await f.close()}}catch(p){r.get(c)===l&&(e.log?.("claude_live_bash.tail_read_failed",{tool_use_id:c,message:p instanceof Error?p.message:String(p)}),i(c))}finally{l.reading=!1}}},a=(c,l)=>{i(c);let p={file:l,decoder:new $he("utf8"),offset:0,emittedBytes:0,reading:!1,timer:void 0};r.set(c,p);let m=setInterval(()=>{s(c,p)},n);m.unref?.(),p.timer=m},d=(c,l)=>{if(o)return;let p=l.command;if(typeof p!="string"||p.trim()===""||l.run_in_background===!0||jhe(p))return;let m=Ahe(e.captureDir,`${c.replaceAll(/[^\w-]/g,"_")}.out`);try{Dhe(e.captureDir,{recursive:!0}),Mhe(m,"")}catch(f){e.log?.("claude_live_bash.capture_file_failed",{tool_use_id:c,message:f instanceof Error?f.message:String(f)});return}return a(c,m),{...l,command:Lhe(p,m)}};return{hookMatchers:[{matcher:"Bash",hooks:[async c=>{let l={continue:!0};if(typeof c!="object"||c===null)return l;let p=c;if(p.hook_event_name!=="PreToolUse"||p.tool_name!=="Bash"||typeof p.tool_use_id!="string"||p.tool_use_id===""||typeof p.tool_input!="object"||p.tool_input===null||p.permission_mode!=="bypassPermissions")return l;let m=d(p.tool_use_id,p.tool_input);return m===void 0?l:{continue:!0,hookSpecificOutput:{hookEventName:"PreToolUse",updatedInput:m}}}]}],wrapApprovedTool:d,settleTool:i,settleAll:()=>{for(let c of[...r.keys()])i(c)},close:()=>{o=!0;for(let c of[...r.keys()])i(c);try{PN(e.captureDir,{recursive:!0,force:!0})}catch{}}}}var RN,cx,Fhe,zhe,qhe,yC=F(()=>{"use strict";RN=/^__lz_live_out='(?:[^']|'\\'')*'; if ! : >> "\$__lz_live_out" 2>\/dev\/null; then __lz_live_out=\/dev\/null; fi; \{ /,cx=`
|
|
668
668
|
} > >(tee -a -- "$__lz_live_out") 2> >(tee -a -- "$__lz_live_out" >&2)`;Fhe=200,zhe=262144,qhe=65536});import{spawnSync as Nhe}from"node:child_process";import{existsSync as Uhe}from"node:fs";import{homedir as Bhe}from"node:os";import{basename as Jhe,posix as LN,win32 as Khe}from"node:path";function bC(e){return e==="win32"?Khe:LN}function Vhe(e,n){let t=Jhe(e).includes("fish")?`printf '%s%s%s' '${lx}' (string join ':' $PATH) '${_C}'`:`printf '%s%s%s' '${lx}' "$PATH" '${_C}'`;switch(n){case"interactive_login":return["-l","-i","-c",t];case"interactive":return["-i","-c",t];case"login":return["-l","-c",t]}}function Whe(e,n){let t=Nhe(e,[...n],{encoding:"utf8",timeout:5e3,killSignal:"SIGKILL",stdio:["ignore","pipe","ignore"]});return{stdout:typeof t.stdout=="string"?t.stdout:void 0,error:t.error}}function $f(e){return{env:e?.env??process.env,platform:e?.platform??process.platform,homeDir:e?.homeDir??Bhe(),fileExists:e?.fileExists??Uhe,runLoginShell:e?.runLoginShell}}function Hhe(e){if(e===void 0)return;let n=e.lastIndexOf(lx),t=e.lastIndexOf(_C);if(n===-1||t===-1||t<=n)return;let r=e.slice(n+lx.length,t).trim();return r===""?void 0:r}function Ghe(e){let n=$f(e);if(n.platform==="win32")return;let t=e===void 0;if(e!==void 0&&e.runLoginShell===void 0||t&&process.env.VITEST!==void 0)return;if(t&&$N)return AN;let r=n.env.SHELL?.trim(),o=n.runLoginShell??Whe,i=[];if(r!==void 0&&r!=="")for(let a of["interactive_login","interactive","login"]){let d=o(r,Vhe(r,a)),u=Hhe(d.stdout);if(u!==void 0)for(let c of u.split(":"))c!==""&&i.push(c)}let s=i.length===0?void 0:wC(i).join(":");return t&&(AN=s,$N=!0),s}function Zhe(e){let n=$f(e);if(n.platform==="win32")return[];let t=n.homeDir,r=LN.join,o=n.env.VOLTA_HOME?.trim(),i=n.env.BUN_INSTALL?.trim(),s=n.env.npm_config_prefix?.trim(),a=n.env.N_PREFIX?.trim();return wC([r(t,".local","bin"),r(t,".volta","bin"),o===void 0||o===""?void 0:r(o,"bin"),r(t,".bun","bin"),i===void 0||i===""?void 0:r(i,"bin"),r(t,".npm-global","bin"),s===void 0||s===""?void 0:r(s,"bin"),a===void 0||a===""?void 0:r(a,"bin"),r(t,".claude","local"),"/opt/homebrew/bin","/usr/local/bin"].filter(d=>d!==void 0))}function ON(e,n){return e===void 0?[]:e.split(bC(n).delimiter).filter(t=>t!=="")}function wC(e){return Array.from(new Set(e))}function jN(e){let n=$f(e);return wC([...ON(n.env.PATH,n.platform),...ON(Ghe(e),n.platform),...Zhe(e)])}function px(e){let n=e===void 0;if(n&&process.env.VITEST!==void 0)return process.env.PATH??"";if(n&&xC!==void 0)return xC;let t=$f(e),r=jN(e).join(bC(t.platform).delimiter);return r!==""&&(t.env.PATH=r),n&&(xC=r),r}function fx(e,n){let t=$f(n);if(e.includes("/")||e.includes("\\"))return t.fileExists(e)?e:void 0;let r=t.platform==="win32"?[`${e}.exe`,`${e}.cmd`,e]:[e],o=bC(t.platform).join;for(let i of jN(n))for(let s of r){let a=o(i,s);if(t.fileExists(a))return a}}function FN(e,n){return[`\`${e}\` was not found on this runner's PATH, the login-shell PATH, or the common install locations (~/.local/bin, ~/.volta/bin, ~/.bun/bin, npm-global, Homebrew).`,`If \`${e}\` works in your terminal, the runner process does not see your shell's PATH (common when the runner is launched from an app or service instead of a terminal).`,`Fix: pass ${n} "$(command -v ${e})" when starting the runner, or make sure ${e}'s directory is on your login-shell PATH.`].join(`
|
|
669
669
|
`)}var lx,_C,AN,$N,xC,vC=F(()=>{"use strict";lx="__LINZUMI_LOGIN_PATH_BEGIN__",_C="__LINZUMI_LOGIN_PATH_END__";$N=!1});import{closeSync as Qhe,openSync as Xhe,readSync as Yhe,statSync as ege}from"node:fs";function xd(e){return typeof e!="string"||e===""?e:nge.reduce((n,t)=>t.source.startsWith("\\beyJ")?n.replace(t,"<redacted>"):n.replace(t,"$1<redacted>"),e)}function zN(e,n){if(typeof e!="string"||e==="")return;if(Buffer.byteLength(e,"utf8")<=n)return e;let t=Buffer.from(e,"utf8"),r=t.length-n;for(;r<t.length&&((t[r]??0)&192)===128;)r+=1;return t.subarray(r).toString("utf8")}function age(e,n){let t;try{let{size:r}=ege(e),o=r>n?r-n:0,i=r-o;if(i<=0)return"";let s=Buffer.allocUnsafe(i);t=Xhe(e,"r");let a=Yhe(t,s,0,i,o);return s.subarray(0,a).toString("utf8")}catch{return""}finally{if(t!==void 0)try{Qhe(t)}catch{}}}function qN(e){let n=e.now??Date.now,t=e.setIntervalImpl??setInterval,r=e.clearIntervalImpl??clearInterval,o=e.readTail??age,i=Math.max(rge,e.intervalMs??tge),s=Math.max(1,e.maxTailBytes??oge),a=Math.max(1,e.maxLifecycleEvents??ige),d=[],u=!1,c,l=v=>{try{for(d.push(v);d.length>a;)d.shift()}catch{}},p=()=>{try{let v=e.backendStderrSnapshot?.();if(typeof v!="string"||v==="")return;let b=v.length>s?v.slice(v.length-s):v;return xd(b)}catch{return}},m=()=>{let v=xd(o(e.runnerLogFile,s)),b=p(),k={kind:"runner_diagnostic_log",captured_at:new Date(n()).toISOString(),lifecycle:d.map(R=>({event:R.event,at:R.atIso,...R.closeCode===void 0?{}:{close_code:R.closeCode},...R.closeReason===void 0?{}:{close_reason:xd(R.closeReason)},...R.previousSessionDurationMs===void 0?{}:{previous_session_duration_ms:R.previousSessionDurationMs},...R.reconnectCount===void 0?{}:{reconnect_count:R.reconnectCount}})),runner_log_tail:v,...b===void 0?{}:{backend_stderr:b}};return{bundle_name:"runner-diagnostics",exported_at:new Date(n()).toISOString(),diagnostics:k,telemetry_ndjson:d.map(R=>JSON.stringify(R)).join(`
|
|
670
|
-
`)}},f=Math.max(256,e.spoolTailBytes??sge),y=(v,b)=>{let k=v.diagnostics!==null&&typeof v.diagnostics=="object"&&!Array.isArray(v.diagnostics)?{...v.diagnostics}:{},R=zN(k.runner_log_tail,f),P=zN(k.backend_stderr,f);return R!==void 0&&(k.runner_log_tail=R),P!==void 0&&(k.backend_stderr=P),k.spool_reason=b instanceof Error?b.message:String(b),{...v,diagnostics:k}},x=async()=>{let v=d.length,b=m();try{await Promise.resolve(e.upload(b)),d.splice(0,v)}catch(k){let R=!1;if(e.spool!==void 0&&v>0)try{R=e.spool.append(y(b,k))}catch{R=!1}R&&d.splice(0,v);try{e.log?.("runner_diagnostics.upload_failed",{buffered_events:d.length,spooled:R,error:k instanceof Error?k.message:String(k)})}catch{}}},w=()=>{u||c!==void 0||(c=t(()=>{x()},i),c.unref?.())},S=()=>{u=!0,c!==void 0&&(r(c),c=void 0)};try{e.log?.("runner_diagnostics.enabled",{destination:"linzumi",runner_log_file:e.runnerLogFile,interval_ms:i,note:"runner lifecycle + runner-log tail + backend stderr are uploaded to Linzumi for support diagnostics (auto-deleted after 4 days)"})}catch{}return w(),{recordLifecycle:l,flushNow:x,stop:S}}var nge,tge,rge,oge,ige,sge,mx=F(()=>{"use strict";nge=[/(--token[=\s]+)\S+/gi,/(bearer\s+)[^\s,;"'\]\}]+/gi,/((?:access[_-]?token|api[_-]?key|auth[_-]?token|authorization|secret|password|refresh[_-]?token|session[_-]?token|jwt|token)["']?\s*[:=]\s*["']?)[^\s,;"'\]\}]+/gi,/\beyJ[A-Za-z0-9_-]*\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\b/g];tge=45e3,rge=5e3,oge=64*1024,ige=200,sge=16*1024});import dge from"blessed";function uge(e){if(e.indexOf("%;")===-1)return e;let n=0,t="",r=0;for(;r<e.length;){let o=e[r],i=e[r+1];if(o==="%"&&i==="%"){t+="%%",r+=2;continue}if(o==="%"&&i==="?"){n+=1,t+="%?",r+=2;continue}if(o==="%"&&i===";"){n>0&&(n-=1,t+="%;"),r+=2;continue}t+=o,r+=1}return t}function UN(e=dge){let t=e.Tput?.prototype,r=t?._compile;if(t===void 0||typeof r!="function"||t[NN]===!0)return;let o=function(s,a,d){let u=typeof d=="string"?uge(d):d;return r.call(this,s,a,u)};t._compile=o,Object.defineProperty(t,NN,{value:!0,enumerable:!1,configurable:!0,writable:!0})}var NN,BN=F(()=>{"use strict";NN="__linzumiSetulcShimInstalled"});function JN(e){return e===void 0?!1:(e.unicode=!0,e.features!==void 0&&(e.features.unicode=!0),e.brokenACS=!0,!0)}function KN(e){if(e===void 0)return;let n=e.tput,t=e.program?.tput;if(n===void 0&&t===void 0){console.warn("[blessedAcsCharsetShim] screen has no tput; ACS charset fix was NOT applied - dynamic cells may render garbled");return}JN(n),t!==void 0&&t!==n&&JN(t)}var VN=F(()=>{"use strict"});var WN,cge,Of,lge,HN,GN=F(()=>{"use strict";WN=Symbol.for("linzumi.blessedPartialScreenCrashGuard"),cge=e=>{console.warn(e)},Of=(e,n)=>{n===void 0||process.removeListener(e,n)},lge=(e,n)=>{let t=e.instances.indexOf(n);t===-1||(e.instances.splice(t,1),e.total-=1),e.global=e.instances[0]??null,e.total===0&&(Of("uncaughtException",e._exceptionHandler),Of("SIGTERM",e._sigtermHandler),Of("SIGINT",e._sigintHandler),Of("SIGQUIT",e._sigquitHandler),Of("exit",e._exitHandler),delete e._exceptionHandler,delete e._sigtermHandler,delete e._sigintHandler,delete e._sigquitHandler,delete e._exitHandler,delete e._bound),n.destroyed=!0},HN=(e,n={})=>{let t=e.prototype;switch(t[WN]){case!0:return;case void 0:break}let r=t.destroy;t[WN]=!0,t.destroy=function(){switch(this.program){case null:case void 0:(n.warn??cge)({event:"runner.tui_partial_screen_teardown",branch:"screen_destroy_missing_program",program_present:!1,action:"cleanup_partial_screen_registration"}),lge(e,this);break;default:r.call(this);break}}}});function ZN(e){if(typeof e!="function")return;let n=e;if(!(!Array.isArray(n.instances)||typeof n.total!="number"))return n}function Lf(e,n){if(typeof n=="function")try{process.removeListener(e,n)}catch{}}function pge(e,n){try{let t=e.instances.indexOf(n);return t===-1?!1:(e.instances.splice(t,1),e.total-=1,e.global=e.instances[0],e.total===0&&(e.global=null,Lf("uncaughtException",e._exceptionHandler),Lf("SIGTERM",e._sigtermHandler),Lf("SIGINT",e._sigintHandler),Lf("SIGQUIT",e._sigquitHandler),Lf("exit",e._exitHandler),delete e._exceptionHandler,delete e._sigtermHandler,delete e._sigintHandler,delete e._sigquitHandler,delete e._exitHandler,delete e._bound),!0)}catch{return!1}}function fge(e,n,t,r){let o=0;for(let i of e.instances.slice()){if(n.has(i))continue;let s=i.program===void 0,a;if(!s&&typeof i.destroy=="function")try{i.destroy()}catch(d){a=d}pge(e,i),o+=1,xo(t,"runner.tui_stranded_screen_swept",{partial_construction:s,destroy_error:a===void 0?null:a instanceof Error?a.message:String(a),...r})}return o}function QN(e,n,t={}){let r=t.sinks??{},o=t.context??{},i=new Set(e?.instances??[]);try{return n()}catch(s){let a=e===void 0?0:fge(e,i,r,o);throw xo(r,"runner.tui_screen_construction_failed",{message:s instanceof Error?s.message:String(s),stack:s instanceof Error?s.stack??null:null,swept_screens:a,...o}),s}}var XN=F(()=>{"use strict";Zu()});var jt,SC,Xs=F(()=>{"use strict";jt="1.0.
|
|
670
|
+
`)}},f=Math.max(256,e.spoolTailBytes??sge),y=(v,b)=>{let k=v.diagnostics!==null&&typeof v.diagnostics=="object"&&!Array.isArray(v.diagnostics)?{...v.diagnostics}:{},R=zN(k.runner_log_tail,f),P=zN(k.backend_stderr,f);return R!==void 0&&(k.runner_log_tail=R),P!==void 0&&(k.backend_stderr=P),k.spool_reason=b instanceof Error?b.message:String(b),{...v,diagnostics:k}},x=async()=>{let v=d.length,b=m();try{await Promise.resolve(e.upload(b)),d.splice(0,v)}catch(k){let R=!1;if(e.spool!==void 0&&v>0)try{R=e.spool.append(y(b,k))}catch{R=!1}R&&d.splice(0,v);try{e.log?.("runner_diagnostics.upload_failed",{buffered_events:d.length,spooled:R,error:k instanceof Error?k.message:String(k)})}catch{}}},w=()=>{u||c!==void 0||(c=t(()=>{x()},i),c.unref?.())},S=()=>{u=!0,c!==void 0&&(r(c),c=void 0)};try{e.log?.("runner_diagnostics.enabled",{destination:"linzumi",runner_log_file:e.runnerLogFile,interval_ms:i,note:"runner lifecycle + runner-log tail + backend stderr are uploaded to Linzumi for support diagnostics (auto-deleted after 4 days)"})}catch{}return w(),{recordLifecycle:l,flushNow:x,stop:S}}var nge,tge,rge,oge,ige,sge,mx=F(()=>{"use strict";nge=[/(--token[=\s]+)\S+/gi,/(bearer\s+)[^\s,;"'\]\}]+/gi,/((?:access[_-]?token|api[_-]?key|auth[_-]?token|authorization|secret|password|refresh[_-]?token|session[_-]?token|jwt|token)["']?\s*[:=]\s*["']?)[^\s,;"'\]\}]+/gi,/\beyJ[A-Za-z0-9_-]*\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\b/g];tge=45e3,rge=5e3,oge=64*1024,ige=200,sge=16*1024});import dge from"blessed";function uge(e){if(e.indexOf("%;")===-1)return e;let n=0,t="",r=0;for(;r<e.length;){let o=e[r],i=e[r+1];if(o==="%"&&i==="%"){t+="%%",r+=2;continue}if(o==="%"&&i==="?"){n+=1,t+="%?",r+=2;continue}if(o==="%"&&i===";"){n>0&&(n-=1,t+="%;"),r+=2;continue}t+=o,r+=1}return t}function UN(e=dge){let t=e.Tput?.prototype,r=t?._compile;if(t===void 0||typeof r!="function"||t[NN]===!0)return;let o=function(s,a,d){let u=typeof d=="string"?uge(d):d;return r.call(this,s,a,u)};t._compile=o,Object.defineProperty(t,NN,{value:!0,enumerable:!1,configurable:!0,writable:!0})}var NN,BN=F(()=>{"use strict";NN="__linzumiSetulcShimInstalled"});function JN(e){return e===void 0?!1:(e.unicode=!0,e.features!==void 0&&(e.features.unicode=!0),e.brokenACS=!0,!0)}function KN(e){if(e===void 0)return;let n=e.tput,t=e.program?.tput;if(n===void 0&&t===void 0){console.warn("[blessedAcsCharsetShim] screen has no tput; ACS charset fix was NOT applied - dynamic cells may render garbled");return}JN(n),t!==void 0&&t!==n&&JN(t)}var VN=F(()=>{"use strict"});var WN,cge,Of,lge,HN,GN=F(()=>{"use strict";WN=Symbol.for("linzumi.blessedPartialScreenCrashGuard"),cge=e=>{console.warn(e)},Of=(e,n)=>{n===void 0||process.removeListener(e,n)},lge=(e,n)=>{let t=e.instances.indexOf(n);t===-1||(e.instances.splice(t,1),e.total-=1),e.global=e.instances[0]??null,e.total===0&&(Of("uncaughtException",e._exceptionHandler),Of("SIGTERM",e._sigtermHandler),Of("SIGINT",e._sigintHandler),Of("SIGQUIT",e._sigquitHandler),Of("exit",e._exitHandler),delete e._exceptionHandler,delete e._sigtermHandler,delete e._sigintHandler,delete e._sigquitHandler,delete e._exitHandler,delete e._bound),n.destroyed=!0},HN=(e,n={})=>{let t=e.prototype;switch(t[WN]){case!0:return;case void 0:break}let r=t.destroy;t[WN]=!0,t.destroy=function(){switch(this.program){case null:case void 0:(n.warn??cge)({event:"runner.tui_partial_screen_teardown",branch:"screen_destroy_missing_program",program_present:!1,action:"cleanup_partial_screen_registration"}),lge(e,this);break;default:r.call(this);break}}}});function ZN(e){if(typeof e!="function")return;let n=e;if(!(!Array.isArray(n.instances)||typeof n.total!="number"))return n}function Lf(e,n){if(typeof n=="function")try{process.removeListener(e,n)}catch{}}function pge(e,n){try{let t=e.instances.indexOf(n);return t===-1?!1:(e.instances.splice(t,1),e.total-=1,e.global=e.instances[0],e.total===0&&(e.global=null,Lf("uncaughtException",e._exceptionHandler),Lf("SIGTERM",e._sigtermHandler),Lf("SIGINT",e._sigintHandler),Lf("SIGQUIT",e._sigquitHandler),Lf("exit",e._exitHandler),delete e._exceptionHandler,delete e._sigtermHandler,delete e._sigintHandler,delete e._sigquitHandler,delete e._exitHandler,delete e._bound),!0)}catch{return!1}}function fge(e,n,t,r){let o=0;for(let i of e.instances.slice()){if(n.has(i))continue;let s=i.program===void 0,a;if(!s&&typeof i.destroy=="function")try{i.destroy()}catch(d){a=d}pge(e,i),o+=1,xo(t,"runner.tui_stranded_screen_swept",{partial_construction:s,destroy_error:a===void 0?null:a instanceof Error?a.message:String(a),...r})}return o}function QN(e,n,t={}){let r=t.sinks??{},o=t.context??{},i=new Set(e?.instances??[]);try{return n()}catch(s){let a=e===void 0?0:fge(e,i,r,o);throw xo(r,"runner.tui_screen_construction_failed",{message:s instanceof Error?s.message:String(s),stack:s instanceof Error?s.stack??null:null,swept_screens:a,...o}),s}}var XN=F(()=>{"use strict";Zu()});var jt,SC,Xs=F(()=>{"use strict";jt="1.0.134",SC=`linzumi ${jt}`});import ea from"blessed";function u4(e){return e.includes(gx)?e.replace(wge,"").replace(vge,"").includes(gx):!1}function Sge(e){return typeof e=="object"&&e!==null&&e.name==="escape"}function e4(e){return e.mode.type==="table"?!1:(e.mode={type:"table"},!0)}function Tge(e){return kge.test(e)}function c4(e){if(!e.includes(gx))return[];let n=[];for(let t of e.matchAll(Cge))n.push(t[1]==="A"?"up":"down");return n}function Pge(e){return Tge(e)?c4(e):[]}function _x(e,n={}){let t=vt.dashboard,r={trigger:e.trigger,had_tui:t!==void 0,stdin_was_tty_at_start:vt.stdinWasTtyAtStart,stdout_was_tty_at_start:vt.stdoutWasTtyAtStart};if(t===void 0)return xo(n,"runner.tui_teardown_ok",r),{hadTui:!1,ok:!0,swallowedErrorCode:void 0};vt.dashboard=void 0,vt.stop?.(),vt.stop=void 0;try{return t.destroy(),xo(n,"runner.tui_teardown_ok",r),{hadTui:!0,ok:!0,swallowedErrorCode:void 0}}catch(o){let i=Ap(o);return xo(n,"runner.tui_teardown_tty_error",{...r,stage:"screen_destroy",code:i??null,message:o instanceof Error?o.message:String(o),swallowed:!0}),{hadTui:!0,ok:!1,swallowedErrorCode:i}}}function Mge(){_x({trigger:"crash"},{log:Ig})}function l4(e,n={log:Ig}){if(vt.degradedToHeadless)return;vt.degradedToHeadless=!0;let t=_x({trigger:"tty_write_error"},n);xo(n,"runner.tui_degraded_headless",{code:e.code??null,stage:e.stage,had_tui:t.hadTui,teardown_ok:t.ok,note:"terminal detached mid-run; console disabled, runner continues headless"});try{process.stderr.write(`linzumi runner: terminal lost (write ${e.code??"error"}); Commander TUI disabled, runner continues headless
|
|
671
671
|
`)}catch(r){nd(r)===void 0&&xo(n,"runner.tui_degrade_farewell_write_failed",{message:r instanceof Error?r.message:String(r),stage:e.stage,swallowed:!0})}}function bx(e,n){if(p4()){let r=lye(jf);if(Age(jf,e,n,Date.now()),r!==void 0){r.render(Date.now());return}dye(jf),uye(jf);let o=AC(jf,Date.now());if(o!==void 0){MC(o);return}}let t=x4(e,n);if(t!==void 0)try{process.stdout.write(`${t}
|
|
672
672
|
`)}catch(r){if(nd(r)===void 0)throw r}}function p4(){if(vt.degradedToHeadless)return!1;switch(process.env.LINZUMI_RUNNER_CONSOLE){case"dashboard":return!0;case"lines":return!1;default:return process.stdout.isTTY===!0}}function wx(){return p4()}function Age(e,n,t,r){let o=Nv(n);e.lastUpdateAtMs=r;let i=d4(e)?.key;switch(o){case"onboarding.discovery_agents_started":e.browserUrl=xe(t.kandanUrl),e.workspace=xe(t.workspace),e.runnerId=xe(Mt(t,"runnerId"));break;case"kandan.connection_stale":e.connectionStale=!0;break;case"kandan.connection_recovered":e.connectionStale=!1;break;case"runner.notice":{let s=xe(t.message);if(s===void 0)break;let a=xe(t.key)??s,d=e.notices.get(a),u=xe(t.severity)??"warning",c=Un(t.count)??(d?.count??0)+1;if(d===void 0){e.notices.set(a,{key:a,severity:u,message:s,count:c,updatedAtMs:r});for(let l of e.notices.keys()){if(e.notices.size<=hge)break;e.notices.delete(l)}}else d.severity=u,d.message=s,d.count=c,d.updatedAtMs=r;break}case"onboarding.discovery_status":{let s=xe(t.phase),a=xe(t.status),d=hx(t.metadata),u=xe(d?.worker_id);if(s!==void 0&&a!==void 0){let c=s==="conversations",l=c?s:u??s,p=e.discovery.get(l),m=c?jge(p?.metadata,d):d;e.discovery.set(l,{key:l,phase:s,status:c?Fge(p,a,d):a,placesSearched:Math.max(p?.placesSearched??0,Un(t.places_searched)??0),message:xe(t.message)??(c?p?.message:void 0),currentPlace:xe(t.current_place)??(c?p?.currentPlace:void 0),currentSource:xe(t.current_source)??(c?p?.currentSource:void 0),lastError:xe(t.last_error),metadata:m,updatedAtMs:r})}break}case"kandan.roster_seeded":{let s=Mye(t.threads)??[];for(let a of s){let d=hx(a),u=xe(Mt(d,"kandan_thread_id"));if(u===void 0)continue;let c=`linzumi:${u}`;if((e.jobs.get(c)??Array.from(e.jobs.values()).find(m=>m.linzumiThreadId===u))!==void 0)continue;let p=Un(d?.last_activity_at_ms);e.jobs.set(c,{key:c,createdAtMs:p??0,createdOrdinal:jC(e),agentProvider:void 0,linzumiThreadId:u,linzumiThreadTitle:void 0,codexThreadId:void 0,tokenUsage:void 0,lastIncomingPreview:void 0,lastIncomingAtMs:void 0,lastAssistantPreview:void 0,lastAssistantAtMs:void 0,latestCodexEventId:void 0,eventType:"idle (server roster)",creditExhaustion:void 0,queueDepth:void 0,turnId:void 0,updatedAtMs:p??0})}e.rosterTruncated=Aye(t.truncated)??e.rosterTruncated;break}case"kandan.message_queued":case"codex.turn_starting":{let s=EC(e,t,r);s.linzumiThreadId=xe(Mt(t,"linzumi_thread_id"))??s.linzumiThreadId,s.linzumiThreadTitle=S4(t)??s.linzumiThreadTitle,s.codexThreadId=xe(Mt(t,"codex_thread_id"))??s.codexThreadId,s.lastIncomingPreview=xe(t.body_preview)??s.lastIncomingPreview,s.lastIncomingAtMs=Un(t.message_received_at_ms)??s.lastIncomingAtMs,s.queueDepth=Un(t.queue_depth)??s.queueDepth,s.eventType=Cye(o),s.updatedAtMs=r;break}case"codex.notification":{let s=xe(t.token_usage_summary),a=xe(t.rate_limit_summary),d=xe(t.credit_exhaustion_summary);s!==void 0&&(e.tokenUsage=s),a!==void 0&&(e.rateLimit=r4(e.rateLimit,a)),d!==void 0&&(e.creditExhaustion=d);let u=xe(t.method),c=hx(t.metadata);if(!(xe(c?.threadId)!==void 0||xe(c?.turnId)!==void 0||xe(c?.itemId)!==void 0))break;let p=xe(c?.threadId),m=p===void 0?d4(e):vye(e,`codex:${p}`,r);m!==void 0&&(m.codexThreadId=p??m.codexThreadId,m.tokenUsage=s??m.tokenUsage,m.creditExhaustion=d??m.creditExhaustion,m.latestCodexEventId=b4(t),m.eventType=t.credit_exhaustion_detected===!0?"credit_exhausted":u??o,m.turnId=xe(c?.turnId)??m.turnId,m.updatedAtMs=r);break}case"kandan.codex_output_forwarded":case"kandan.codex_delta_forwarded":case"kandan.codex_reasoning_delta_forwarded":case"kandan.codex_command_output_forwarded":case"kandan.codex_file_change_forwarded":case"kandan.codex_web_search_progress_forwarded":{let s=EC(e,t,r);s.latestCodexEventId=xe(t.item_key)??s.latestCodexEventId,s.eventType=kye(o,t),s.turnId=xe(t.turn_id)??s.turnId,xe(t.structured_kind)==="codex_assistant_message"&&(s.lastAssistantPreview=xe(t.body_preview)??s.lastAssistantPreview,s.lastAssistantAtMs=r),s.updatedAtMs=r;break}case"claude_code.turn_starting":case"claude_code.message_queued":{let s=Dc(e,t,r);s.lastIncomingPreview=xe(t.body_preview)??s.lastIncomingPreview,s.lastIncomingAtMs=Un(t.message_received_at_ms)??s.lastIncomingAtMs,s.eventType=o==="claude_code.message_queued"?"message_queued":"turn_starting",s.updatedAtMs=r;break}case"claude_code.session_started":{let s=Dc(e,t,r);s.eventType="session_started",s.updatedAtMs=r;break}case"claude_code.turn_completed":{let s=Dc(e,t,r);s.lastAssistantPreview=xe(t.body_preview)??s.lastAssistantPreview,s.lastAssistantAtMs=r,s.eventType="turn_completed",s.updatedAtMs=r;break}case"claude_code.turn_terminal":{let s=Dc(e,t,r);s.turnId=xe(t.turn_id)??s.turnId,s.eventType=`turn_${xe(t.outcome)??"terminal"}`,s.updatedAtMs=r;break}case"claude_code.rate_limit":{let s=xe(t.rate_limit_summary);s!==void 0&&(e.rateLimit=r4(e.rateLimit,s));let a=Dc(e,t,r);a.eventType="rate_limit",a.updatedAtMs=r;break}case"claude_code.token_usage":{let s=xe(t.token_usage_summary),a=Dc(e,t,r);s!==void 0&&(e.tokenUsage=s,a.tokenUsage=s),a.eventType="token_usage",a.updatedAtMs=r;break}default:break}nye(e,o,t,i)}function AC(e,n){if(e.jobs.size===0&&e.discovery.size===0&&e.notices.size===0&&e.tokenUsage===void 0&&e.rateLimit===void 0&&e.creditExhaustion===void 0)return;let t=_d(e);switch(e.mode.type){case"table":return e.jobs.size===0&&e.discovery.size>0?$ge(e,n):qge(e,t,n);case"raw_all":return i4(e,"Raw Stream",void 0,"esc: table",e.rawLines,n);case"raw_job":{let r=e.mode.jobKey,o=e.jobs.get(r),i=`Raw Stream: ${FC(o?.linzumiThreadId)} / ${zC(o?.codexThreadId,o?.agentProvider)}`;return i4(e,i,o?.tokenUsage,"esc: table",e.rawLines.filter(s=>s.jobKey===r),n)}}}function $ge(e,n){let t=Array.from(e.discovery.values()).sort((s,a)=>yx(s.phase).localeCompare(yx(a.phase))),r=t.reduce((s,a)=>s+a.placesSearched,0),o=t.some(s=>["starting","running"].includes(s.status)),i=t.length===0?["Discovery starting 0 places Waiting for discovery agents"]:t.map(s=>[vx(s.phase).padEnd(14),Sx(s.status).padEnd(10),`${String(s.placesSearched)} places`.padEnd(10),$C(s)].join(" "));return[LC(),"","Linzumi setup","New computer connected","",`Continue in the browser: ${e.browserUrl??"open the Linzumi setup page"}`,"",Oge(t),`Workspace: ${e.workspace??"?"}`,`Runner: ${e.runnerId??"?"}`,`Status: ${o?"searching":"finished"} Places searched: ${r}`,`Last update: ${Ai(e.lastUpdateAtMs,n)}${Ac(e)}`,"","Phase Status Places Detail","------------- ---------- --------- ------------------------------",...i,""].join(`
|
|
673
673
|
`)}function yx(e){switch(e){case"projects":return"1-projects";case"conversations":return"2-conversations";default:return`3-${e}`}}function vx(e){switch(e){case"projects":return"Projects";case"conversations":return"Conversations";default:return"Discovery"}}function Sx(e){switch(e){case"starting":return"starting";case"running":return"searching";case"completed":return"done";case"failed":return"failed";default:return e}}function Oge(e){return e.length===0?"I'm waiting for the discovery agents to start.":e.some(t=>["starting","running"].includes(t.status))?"I'm scouting existing projects and coding-agent conversations.":"Discovery is finished and idle. Select a project in the browser or move on."}function $C(e){if(e.lastError!==void 0)return e.lastError;let n=OC(e);if(n!==void 0)return n;let t=zge(e.currentSource);return e.currentPlace!==void 0?t===void 0?e.currentPlace:`${t}: ${e.currentPlace}`:e.message??f4(e.phase)}function OC(e){if(e.phase!=="conversations"||!TC(e.metadata))return;let n=Un(e.metadata?.total_count)??(Un(e.metadata?.codex_count)??0)+(Un(e.metadata?.claude_code_count)??0),t=Un(e.metadata?.imported_count)??Un(e.metadata?.reported_count);return t===void 0||n<=0?void 0:`${e.status==="completed"?"Imported":"Importing"} [${Lge(t,n)}] ${t} / ${n} Codex/Claude Code conversations`}function TC(e){return xe(e?.worker_id)==="conversations-local-import"||Un(e?.imported_count)!==void 0||Un(e?.failed_import_count)!==void 0||Un(e?.total_count)!==void 0}function Lge(e,n){let r=Math.min(10,Math.max(0,Math.floor(e/n*10)));return`${"#".repeat(r)}${"-".repeat(10-r)}`}function jge(e,n){return e===void 0?n:n===void 0?e:{...e,...n,...Ff(e,n,"codex_count"),...Ff(e,n,"claude_code_count"),...Ff(e,n,"reported_count"),...Ff(e,n,"imported_count"),...Ff(e,n,"total_count")}}function Ff(e,n,t){let r=Un(e[t]),o=Un(n[t]);return r===void 0&&o===void 0?{}:{[t]:Math.max(r??0,o??0)}}function Fge(e,n,t){return e?.status==="running"&&TC(e.metadata)&&!TC(t)?e.status:n}function zge(e){switch(e){case"git":return"Git";case"codex":return"Codex";case"claude_code":return"Claude Code";case void 0:return;default:return e}}function f4(e){switch(e){case"projects":return"Checking common project folders and Git worktrees.";case"conversations":return"Checking Codex and Claude Code sessions.";default:return"Checking local context."}}function qge(e,n,t){let r=h4(e,n,t);return[LC(),"","Linzumi Commander","",`Jobs: ${n.length}${e.rosterTruncated?" (first 200 of this node's roster)":""} Last update: ${Ai(e.lastUpdateAtMs,t)}${Ac(e)}`,...m4(e.creditExhaustion),`Overall Token Usage: ${e.tokenUsage??"?"}`,`Account rate limits: ${e.rateLimit??"?"}`,"Controls: up/down select | enter raw job | r raw stream | esc table",...PC(e),"",Tye(r.rows),""].join(`
|
package/package.json
CHANGED
|
@@ -28,16 +28,18 @@ import { build } from 'esbuild';
|
|
|
28
28
|
|
|
29
29
|
const packageRoot = dirname(dirname(fileURLToPath(import.meta.url)));
|
|
30
30
|
|
|
31
|
+
// PARITY SCOPE (owner ruling 2026-07-18, failover becomes a user-decision
|
|
32
|
+
// capability): the compared surface is the SHARED F2 recovery engine only.
|
|
33
|
+
// The TS-only frozen failover rung (flag-OFF forever, superseded) is
|
|
34
|
+
// excluded: no failover constants, no failover flag case, no failover
|
|
35
|
+
// decide input/grant, no commitFailover op, no per-entry failover
|
|
36
|
+
// sub-object, and the rung vocabulary is filtered to the shared members -
|
|
37
|
+
// the ReScript commander has no automatic failover surface to compare.
|
|
31
38
|
const driverSource = `
|
|
32
39
|
import {
|
|
33
40
|
appendFateLadderEntry,
|
|
34
|
-
commitFateLadderFailoverOutcome,
|
|
35
41
|
commitFateLadderHoldDispatch,
|
|
36
42
|
createFateLadderRun,
|
|
37
|
-
crossHarnessFailoverDetail,
|
|
38
|
-
crossHarnessFailoverEnabled,
|
|
39
|
-
crossHarnessFailoverReason,
|
|
40
|
-
crossHarnessFailoverRungSlot,
|
|
41
43
|
decideFateLadderStep,
|
|
42
44
|
defaultFateLadderBudgets,
|
|
43
45
|
fateLadderBudgets,
|
|
@@ -71,22 +73,6 @@ function runJson(run) {
|
|
|
71
73
|
atMs: entry.atMs,
|
|
72
74
|
detail: entry.detail === undefined ? null : entry.detail,
|
|
73
75
|
resetAtMs: entry.resetAtMs === undefined ? null : entry.resetAtMs,
|
|
74
|
-
failover:
|
|
75
|
-
entry.failover === undefined
|
|
76
|
-
? null
|
|
77
|
-
: {
|
|
78
|
-
sourceHarness: entry.failover.sourceHarness,
|
|
79
|
-
targetHarness: entry.failover.targetHarness,
|
|
80
|
-
model: entry.failover.model === undefined ? null : entry.failover.model,
|
|
81
|
-
transpiledItemCount:
|
|
82
|
-
entry.failover.transpiledItemCount === undefined
|
|
83
|
-
? null
|
|
84
|
-
: entry.failover.transpiledItemCount,
|
|
85
|
-
redactedReasoningCount:
|
|
86
|
-
entry.failover.redactedReasoningCount === undefined
|
|
87
|
-
? null
|
|
88
|
-
: entry.failover.redactedReasoningCount,
|
|
89
|
-
},
|
|
90
76
|
})),
|
|
91
77
|
};
|
|
92
78
|
}
|
|
@@ -152,17 +138,8 @@ function runScheduleCase(caseInput) {
|
|
|
152
138
|
inPlaceResume: op.grants?.inPlaceResume === true,
|
|
153
139
|
redispatch: op.grants?.redispatch === true,
|
|
154
140
|
workerRebuild: op.grants?.workerRebuild === true,
|
|
155
|
-
crossHarnessFailover: op.grants?.crossHarnessFailover === true,
|
|
156
141
|
},
|
|
157
142
|
rateLimitResetAtMs: op.resetAtMs ?? undefined,
|
|
158
|
-
failover:
|
|
159
|
-
op.failover === undefined || op.failover === null
|
|
160
|
-
? undefined
|
|
161
|
-
: {
|
|
162
|
-
sourceHarness: op.failover.sourceHarness,
|
|
163
|
-
targetHarness: op.failover.targetHarness,
|
|
164
|
-
model: op.failover.model ?? undefined,
|
|
165
|
-
},
|
|
166
143
|
});
|
|
167
144
|
if (decision.kind !== 'stand') {
|
|
168
145
|
current = decision.run;
|
|
@@ -175,24 +152,6 @@ function runScheduleCase(caseInput) {
|
|
|
175
152
|
current = commitFateLadderHoldDispatch(current, op.nowMs);
|
|
176
153
|
steps.push({ run: runJson(current) });
|
|
177
154
|
}
|
|
178
|
-
} else if (op.op === 'commitFailover') {
|
|
179
|
-
if (current === undefined) {
|
|
180
|
-
steps.push({ skipped: true });
|
|
181
|
-
} else {
|
|
182
|
-
current = commitFateLadderFailoverOutcome(current, {
|
|
183
|
-
outcome: op.outcome,
|
|
184
|
-
atMs: op.nowMs,
|
|
185
|
-
failover: {
|
|
186
|
-
sourceHarness: op.failover.sourceHarness,
|
|
187
|
-
targetHarness: op.failover.targetHarness,
|
|
188
|
-
model: op.failover.model ?? undefined,
|
|
189
|
-
transpiledItemCount: op.failover.transpiledItemCount ?? undefined,
|
|
190
|
-
redactedReasoningCount: op.failover.redactedReasoningCount ?? undefined,
|
|
191
|
-
},
|
|
192
|
-
detail: op.detail ?? undefined,
|
|
193
|
-
});
|
|
194
|
-
steps.push({ run: runJson(current) });
|
|
195
|
-
}
|
|
196
155
|
} else if (op.op === 'append') {
|
|
197
156
|
if (current === undefined) {
|
|
198
157
|
steps.push({ skipped: true });
|
|
@@ -227,7 +186,13 @@ function runCase(input) {
|
|
|
227
186
|
switch (input.kind) {
|
|
228
187
|
case 'constants':
|
|
229
188
|
return {
|
|
230
|
-
|
|
189
|
+
// The shared recovery vocabulary only: the TS-only frozen
|
|
190
|
+
// cross_harness_failover member is excluded by name (2026-07-18
|
|
191
|
+
// ruling) - the ReScript engine's fateLadderRungs is the filtered
|
|
192
|
+
// array by construction.
|
|
193
|
+
fateLadderRungs: fateLadderRungs.filter(
|
|
194
|
+
(rung) => rung !== 'cross_harness_failover'
|
|
195
|
+
),
|
|
231
196
|
inPlaceResumeMaxAttempts,
|
|
232
197
|
fateLadderPolicies,
|
|
233
198
|
defaultFateLadderBudgets,
|
|
@@ -235,25 +200,7 @@ function runCase(input) {
|
|
|
235
200
|
redispatchAfterLocalFailureReason,
|
|
236
201
|
workerRebuildRetryReason,
|
|
237
202
|
rateLimitHoldReasonPrefix,
|
|
238
|
-
crossHarnessFailoverRungSlot,
|
|
239
|
-
crossHarnessFailoverReason,
|
|
240
|
-
crossHarnessFailoverDetailSamples: [
|
|
241
|
-
crossHarnessFailoverDetail({
|
|
242
|
-
sourceHarness: 'codex',
|
|
243
|
-
targetHarness: 'claude_code',
|
|
244
|
-
model: 'parity-model-slug',
|
|
245
|
-
transpiledItemCount: 12,
|
|
246
|
-
redactedReasoningCount: 3,
|
|
247
|
-
}),
|
|
248
|
-
crossHarnessFailoverDetail({
|
|
249
|
-
sourceHarness: 'codex',
|
|
250
|
-
targetHarness: 'claude_code',
|
|
251
|
-
model: undefined,
|
|
252
|
-
}),
|
|
253
|
-
],
|
|
254
203
|
};
|
|
255
|
-
case 'failoverFlag':
|
|
256
|
-
return crossHarnessFailoverEnabled(input.env ?? {});
|
|
257
204
|
case 'budgets':
|
|
258
205
|
return fateLadderBudgets(input.env ?? {});
|
|
259
206
|
case 'holdReason':
|