@reddb-io/red-skills 3.3.6 → 3.3.7
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/dist/brain.bundle.min.mjs +1 -1
- package/dist/castle-mcp.bundle.min.mjs +288 -288
- package/dist/code-nav.bundle.min.mjs +1 -1
- package/dist/dev.bundle.min.mjs +560 -560
- package/dist/memory.bundle.min.mjs +1 -1
- package/dist/redskilled.bundle.min.mjs +60 -60
- package/dist/rsp.bundle.min.mjs +1 -1
- package/package.json +1 -1
|
@@ -1,72 +1,72 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
|
|
3
|
-
var
|
|
3
|
+
var fd=Object.defineProperty;var gd=(e,n)=>()=>(e&&(n=e(e=0)),n);var hd=(e,n)=>{for(var t in n)fd(e,t,{get:n[t],enumerable:!0})};var Gs={};hd(Gs,{REDSKILLED_BIN_ENV:()=>cr,REDSKILLED_BUNDLE_ASSET:()=>Q,REDSKILLED_ENTRY_UNRESOLVED:()=>ln,RedskilledDaemonEntryError:()=>an,isRedskilledEntryPath:()=>pr,isResolvedRedskilledEntry:()=>Y,redskilledBundleCacheRoot:()=>Un,redskilledServeArgv:()=>be,requireRedskilledEntry:()=>Vn,resolveRedskilledEntry:()=>ue});import{existsSync as Uu,readdirSync as Vu}from"node:fs";import{homedir as Bu}from"node:os";import{basename as dr,dirname as ar,join as M,resolve as Hn}from"node:path";function Y(e){return"command"in e}function be(e,n={}){let t=["serve","--socket",e.socketPath,"--lease",e.leasePath,"--events",e.eventLanePath,"--session-key-hash",e.sessionKeyHash,"--machine-id-hash",e.machineIdHash,"--machine-claim",e.machineClaimPath];return n.idleMs!=null&&t.push("--idle-ms",String(n.idleMs)),n.daemonVersion!=null&&t.push("--daemon-version",n.daemonVersion),t}function Un(e=process.env){return qs(e)}function ue(e={},n={}){if(e.serverCommand)return{command:e.serverCommand,args:e.serverArgs??[],source:"server-command"};let t=n.env??process.env,r=n.exists??Uu,o=n.execPath??process.execPath,s=n.execArgv??[],i=n.callerEntry===void 0?process.argv[1]:n.callerEntry,l=(u,p)=>({command:o,args:[...s,u],source:p,entry:u}),a=t[cr];if(a)return{command:a,args:[],source:"env-redskilled-bin",entry:a};if(i&&pr(i))return l(Hn(i),"caller-entry");let d=[];for(let[u,p]of Gu(i,n.rootDir,t,n.listDir??Yu))if(d.push(u),r(u))return l(u,p);return{diagnostic:ln,searched:d,...i?{callerEntry:Hn(i)}:{}}}function Vn(e={},n={}){let t=ue(e,n);if(Y(t))return t;throw new an(t)}function pr(e){let n=dr(e);return n===Q||ur.test(n)||n==="red-skills-redskilled"||n==="red-skills-redskilled.mjs"?!0:n!=="cli.js"&&n!=="cli.mjs"&&n!=="cli.ts"?!1:qu(Hn(e))}function qu(e){let n=ar(e);for(let t=0;t<4;t++){if(dr(n)==="redskilled")return!0;let r=ar(n);if(r===n)return!1;n=r}return!1}function*Gu(e,n,t,r){if(e){let s=ar(Hn(e));yield[M(s,Q),"caller-sibling-bundle"];let i=Ku.exec(dr(e));i&&(yield[M(s,`redskilled-${i[2]}.bundle.min.mjs`),"caller-sibling-bundle"]),yield[M(s,"..","dist",Q),"caller-sibling-bundle"]}for(let s of Ju){let i=t[s];i&&(yield[M(i,"dist",Q),"plugin-root-bundle"],yield[M(i,"..","..","dist",Q),"plugin-root-bundle"])}n&&(yield[M(n,"dist",Q),"repo-bundle"],yield[M(n,"apps","redskilled","dist","cli.js"),"workspace-entry"],yield[M(n,"node_modules","@reddb-io","redskilled","dist","cli.js"),"node-modules-entry"]);let o=qs(t);yield[M(o,Q),"bundle-cache"];for(let s of zu(o,r))yield[M(o,s),"bundle-cache"]}function qs(e){if(e.RED_SKILLS_CACHE_DIR)return e.RED_SKILLS_CACHE_DIR;let n=e.XDG_CACHE_HOME||M(e.HOME||Bu(),".cache");return M(n,"red-skills","bundles")}function zu(e,n){return n(e).filter(t=>ur.test(t)).sort((t,r)=>Qu(Js(r),Js(t)))}function Js(e){return ur.exec(e)?.[1]??""}function Qu(e,n){let t=s=>s.split(".").map(i=>Number.parseInt(i,10)),[r,o]=[t(e),t(n)];for(let s=0;s<Math.max(r.length,o.length);s++){let[i,l]=[r[s],o[s]];if(Number.isNaN(i)||i===void 0)return Number.isNaN(l)||l===void 0?e.localeCompare(n):-1;if(Number.isNaN(l)||l===void 0)return 1;if(i!==l)return i-l}return 0}function Yu(e){try{return Vu(e)}catch{return[]}}var Q,ln,cr,an,Ku,ur,Ju,re=gd(()=>{"use strict";Q="redskilled.bundle.min.mjs",ln="redskilled-daemon-entry-unresolved",cr="REDSKILLED_BIN";an=class extends Error{code=ln;searched;callerEntry;constructor(n){super(`${ln}: no published ${Q} found to spawn the redskilled daemon from${n.callerEntry?` (caller entry: ${n.callerEntry}, which is NOT used as a fallback)`:""}
|
|
4
4
|
searched:
|
|
5
5
|
${n.searched.map(t=>` ${t}`).join(`
|
|
6
|
-
`)}`),this.name="RedskilledDaemonEntryError",this.searched=n.searched,n.callerEntry!=null&&(this.callerEntry=n.callerEntry)}};
|
|
7
|
-
`);return n.length>0&&n[n.length-1]===""&&n.pop(),n.map(t=>t.endsWith("\r")?t.slice(0,-1):t)}function K(e){return R(e,"invalid quoted string")}function J(e,n){if(e==="")return"";if(e.startsWith('"'))return
|
|
8
|
-
`;break;case"r":t+="\r";break;case"t":t+=" ";break;case"u":{let i=e.slice(r,r+4);if(!/^[0-9a-fA-F]{4}$/.test(i))throw K(n);let l=Number.parseInt(i,16);if(l>=55296&&l<=57343)throw K(n);t+=String.fromCharCode(l),r+=4;break}default:throw K(n)}continue}if(o<" "&&o!==" ")throw K(n);t+=o}throw K(n)}function ge(e,n,t){if(e==="")return[];let r=[],o=0,s=!1,i=!1;for(let l=0;l<e.length;l+=1){let a=e[l];if(i){i=!1;continue}a==="\\"&&s?i=!0:a==='"'?s=!s:a===n&&!s&&(r.push(e.slice(o,l).trim()),o=l+1)}if(s||i)throw K(t);return r.push(e.slice(o).trim()),r}function T(e,n,t){let r=!1,o=!1;for(let s=0;s<e.length;s+=1){let i=e[s];if(o){o=!1;continue}if(i==="\\"&&r)o=!0;else if(i==='"')r=!r;else if(i===n&&!r)return s}if(r||o)throw K(t);return-1}function
|
|
9
|
-
`:n+="\\n";break;case"\r":n+="\\r";break;case" ":n+="\\t";break;default:t<" "?n+=`\\u${t.charCodeAt(0).toString(16).padStart(4,"0")}`:n+=t}return`${n}"`}function Pe(e,n,t){Object.defineProperty(e,n,{value:t,writable:!0,enumerable:!0,configurable:!0})}var
|
|
10
|
-
`);for(let[i,l]of Object.entries(t))en(e,r+1),e.push(F(i),": ",s.paths.map(a=>q(
|
|
6
|
+
`)}`),this.name="RedskilledDaemonEntryError",this.searched=n.searched,n.callerEntry!=null&&(this.callerEntry=n.callerEntry)}};Ku=/^([a-z0-9-]+)-(.+)\.bundle\.min\.mjs$/,ur=/^redskilled-(.+)\.bundle\.min\.mjs$/,Ju=["RED_SKILLS_DEV_PLUGIN_ROOT","CLAUDE_PLUGIN_ROOT","CODEX_PLUGIN_ROOT","OPENCODE_PLUGIN_ROOT"]});import{execFileSync as Yh}from"node:child_process";import{homedir as ro}from"node:os";import{join as Fa}from"node:path";var Ye=class extends Error{constructor(n,t){super(n===0?t:`line ${n}: ${t}`),this.name="ToonError",this.line=n,this.reason=t}},fe=class extends Error{constructor(n,t){super(n===0?t:`line ${n}: ${t}`),this.name="ToonlError",this.line=n,this.reason=t}};function R(e,n){return new Ye(e,n)}function S(e,n){return new fe(e,n)}function Ee(e){return e instanceof fe?e:e instanceof Ye?new fe(e.line,e.reason):new fe(0,String(e&&e.message?e.message:e))}var j=",";function $n(e){let n=e.split(`
|
|
7
|
+
`);return n.length>0&&n[n.length-1]===""&&n.pop(),n.map(t=>t.endsWith("\r")?t.slice(0,-1):t)}function K(e){return R(e,"invalid quoted string")}function J(e,n){if(e==="")return"";if(e.startsWith('"'))return To(e,n);if(e.includes('"'))throw K(n);return e==="true"?!0:e==="false"?!1:e==="null"?null:yd(e)?Number(e):e}function ne(e,n){let t=e.trim();if(t.startsWith('"'))return[To(t,n),!0];if(t.includes('"')||/\s/.test(t))throw R(n,"expected non-empty field name");return[t,!1]}function To(e,n){if(e[0]!=='"')throw K(n);let t="",r=1;for(;r<e.length;){let o=e[r];if(r+=1,o==='"'){if(e.slice(r).trim()==="")return t;throw K(n)}if(o==="\\"){let s=e[r];switch(r+=1,s){case'"':t+='"';break;case"\\":t+="\\";break;case"n":t+=`
|
|
8
|
+
`;break;case"r":t+="\r";break;case"t":t+=" ";break;case"u":{let i=e.slice(r,r+4);if(!/^[0-9a-fA-F]{4}$/.test(i))throw K(n);let l=Number.parseInt(i,16);if(l>=55296&&l<=57343)throw K(n);t+=String.fromCharCode(l),r+=4;break}default:throw K(n)}continue}if(o<" "&&o!==" ")throw K(n);t+=o}throw K(n)}function ge(e,n,t){if(e==="")return[];let r=[],o=0,s=!1,i=!1;for(let l=0;l<e.length;l+=1){let a=e[l];if(i){i=!1;continue}a==="\\"&&s?i=!0:a==='"'?s=!s:a===n&&!s&&(r.push(e.slice(o,l).trim()),o=l+1)}if(s||i)throw K(t);return r.push(e.slice(o).trim()),r}function T(e,n,t){let r=!1,o=!1;for(let s=0;s<e.length;s+=1){let i=e[s];if(o){o=!1;continue}if(i==="\\"&&r)o=!0;else if(i==='"')r=!r;else if(i===n&&!r)return s}if(r||o)throw K(t);return-1}function yd(e){return/^-?(?:0|[1-9][0-9]*)(?:\.[0-9]+)?(?:[eE][+-]?[0-9]+)?$/.test(e)}function kd(e){return/^-?[0-9]+(?:\.[0-9]+)?(?:[eE][+-]?[0-9]+)?$/.test(e)}function Rd(e){if(Object.is(e,-0))return"0";if(!Number.isFinite(e))throw R(0,"number is not representable in TOON");return String(e)}function Ze(e){return e===null||typeof e=="boolean"||typeof e=="number"||typeof e=="string"}function q(e,n){if(e===null)return"null";if(typeof e=="boolean")return e?"true":"false";if(typeof e=="number")return Rd(e);if(typeof e=="string")return _d(e,n);throw R(0,"not a primitive")}function bd(e){return/^[A-Za-z_][A-Za-z0-9_.]*$/.test(e)}function F(e){return bd(e)?e:No(e)}function _d(e,n){return wd(e,n)?No(e):e}function wd(e,n){return e===""||e.trim()!==e||e==="true"||e==="false"||e==="null"||kd(e)||/[:"\\[\]{}]/.test(e)||/[\u0000-\u001f]/.test(e)||e.includes(n)||e.startsWith("-")}function No(e){let n='"';for(let t of e)switch(t){case'"':n+='\\"';break;case"\\":n+="\\\\";break;case`
|
|
9
|
+
`:n+="\\n";break;case"\r":n+="\\r";break;case" ":n+="\\t";break;default:t<" "?n+=`\\u${t.charCodeAt(0).toString(16).padStart(4,"0")}`:n+=t}return`${n}"`}function Pe(e,n,t){Object.defineProperty(e,n,{value:t,writable:!0,enumerable:!0,configurable:!0})}var Ot=2;function vd(e={}){return{indent:Math.max(1,e.indent??Ot),strict:e.strict??!0,expandPaths:e.expandPaths==="safe"||e.expandPaths===!0}}function Sd(e,n){let t=[],r=!1;return $n(e).forEach((o,s)=>{let i=s+1;if(o.trim()===""){r=!0;return}let l=o.length-o.replace(/^ +/,"").length;if(o[l]===" ")throw R(i,"invalid indentation");if(n.strict&&l%n.indent!==0)throw R(i,"invalid indentation");t.push({number:i,depth:Math.floor(l/n.indent),content:o.slice(l),blankBefore:r}),r=!1}),t}function G(e,n){let t=vd(n),r=Sd(e,t),o=r[0];if(o===void 0)return{};if(o.depth!==0)throw R(o.number,"invalid indentation");let s=r.length===1;if(s&&o.content.trim()==="[]")return[];if(o.content.startsWith("[")){let d;try{d=At(o.content,T(o.content,":",o.number))}catch(u){if(t.strict)throw jt(u,o.number);d=void 0}if(d!==void 0)return Pd(d,r,t)}if(s&&T(o.content,":",o.number)===-1)return J(o.content.trim(),o.number);let i={index:0},l=Lt(r,i,0,t),a=r[i.index];if(a!==void 0)throw R(a.number,"expected end of document");return l}function Lt(e,n,t,r){let o={};for(;n.index<e.length;){let s=e[n.index];if(s.depth<t)break;if(s.depth>t)throw R(s.number,"invalid indentation");let{key:i,quoted:l,value:a}=xd(e,n,t,r);Co(o,i,l,a,r,s.number)}return o}function xd(e,n,t,r){let o=e[n.index],s=o.content,i=T(s,":",o.number);if(i===-1)throw R(o.number,"expected `key: value`");let l=s.slice(0,i),a=s.slice(i+1),d=T(l,"[",o.number),u=T(l,"{",o.number);if(u!==-1&&(d===-1||u<d)){let y;try{y=Ld(l)}catch(k){if(r.strict)throw jt(k,o.number);n.index+=1;let w=St(e,n,t,a,o.number,r);return{key:l.trim(),quoted:!1,value:w}}if(a.trim()!=="")throw R(o.number,"expected keyed map rows");let b=Ed(y,e,n,t+1,r);return{key:y.key,quoted:y.keyQuoted,value:b}}if(d!==-1){let y;try{y=At(l,i)}catch(k){if(r.strict)throw jt(k,o.number);n.index+=1;let w=St(e,n,t,a,o.number,r);return{key:l.trim(),quoted:!1,value:w}}if(y.key===""&&!y.keyQuoted)throw R(o.number,"expected non-empty field name");let b=$t(y,a,e,n,t,r);return{key:y.key,quoted:y.keyQuoted,value:b}}let[p,m]=ne(l,o.number);if(p===""&&!m)throw R(o.number,"expected non-empty field name");n.index+=1;let h=St(e,n,t,a,o.number,r);return{key:p,quoted:m,value:h}}function St(e,n,t,r,o,s){let i=r.trim();if(i==="[]")return[];if(i!=="")return J(i,o);let l=e[n.index];return l!==void 0&&l.depth>t?Lt(e,n,t+1,s):{}}function Ed(e,n,t,r,o){let s={};for(t.index+=1;t.index<n.length;){let i=n[t.index];if(i.depth<r)break;if(i.depth>r)throw R(i.number,"invalid indentation");if(i.blankBefore&&o.strict)throw R(i.number,"blank line inside keyed map");let l=T(i.content,":",i.number);if(l===-1)throw R(i.number,"expected `key: value`");let[a,d]=ne(i.content.slice(0,l),i.number);if(a===""&&!d)throw R(i.number,"expected non-empty field name");let u=ge(i.content.slice(l+1).trim(),e.delimiter,i.number);if(u.length!==e.fields.length)throw R(i.number,"keyed map row length mismatch");let p={};e.fields.forEach((m,h)=>{Xe(p,m,J(u[h],i.number),o,i.number)}),Co(s,a,d,p,o,i.number),t.index+=1}return s}function Pd(e,n,t){let r=n[0],o=T(r.content,":",r.number);if(o===-1)throw R(r.number,"expected `key: value`");let s=r.content.slice(o+1),i={index:0},l=$t(e,s,n,i,0,t),a=n[i.index];if(a!==void 0)throw R(a.number,"expected end of document");return l}function $t(e,n,t,r,o,s){let i=t[r.index].number,l=n.trim();if(r.index+=1,e.fields!==void 0){if(l!=="")throw R(i,"expected tabular rows");return jd(e,e.fields,t,r,o+1,s)}if(l!==""){let a=ge(l,e.delimiter,i).map(d=>J(d,i));if(a.length!==e.len)throw R(i,"array length mismatch");return a}return Dd(e,t,r,o+1,s)}function jd(e,n,t,r,o,s){let i=[];for(;i.length<e.len;){let a=t[r.index];if(a===void 0)throw Et(t,r.index);if(a.depth<o)break;if(a.depth>o)throw R(a.number,"invalid indentation");if(a.blankBefore&&s.strict)throw R(a.number,"blank line inside array");if(!Wo(a.content,e.delimiter,a.number))break;let d=ge(a.content,e.delimiter,a.number);if(d.length!==n.length)throw R(a.number,"array row length mismatch");let u={};n.forEach((p,m)=>{Xe(u,p,J(d[m],a.number),s,a.number)}),i.push(u),r.index+=1}if(i.length!==e.len)throw Et(t,r.index);let l=t[r.index];if(l!==void 0&&l.depth>=o&&Wo(l.content,e.delimiter,l.number))throw R(l.number,"array length mismatch");return i}function Wo(e,n,t){let r=T(e,":",t);if(r===-1)return!0;let o=T(e,n,t);return o===-1?!1:o<r}function Dd(e,n,t,r,o){let s=[];for(;s.length<e.len;){let l=n[t.index];if(l===void 0||l.depth<r)throw Et(n,t.index);if(l.depth>r)throw R(l.number,"invalid indentation");if(l.blankBefore&&o.strict)throw R(l.number,"blank line inside array");s.push(Od(n,t,r,o))}let i=n[t.index];if(i!==void 0&&i.depth>=r)throw R(i.number,"array length mismatch");return s}function Od(e,n,t,r){let o=e[n.index];if(!o.content.startsWith("-"))throw R(o.number,"expected array item");let s=o.content.slice(1).replace(/^\s+/,"");if(s==="")return n.index+=1,{};if(s.startsWith("[")){let i=T(s,":",o.number),l;try{l=At(s,i)}catch{l=void 0}if(l!==void 0){let a=s.slice(i+1);return $t(l,a,e,n,t,r)}}if(T(s,":",o.number)!==-1){let i=[{number:o.number,depth:t+1,content:s,blankBefore:!1}];for(n.index+=1;n.index<e.length;){let l=e[n.index];if(l.depth<=t)break;i.push(l),n.index+=1}return Lt(i,{index:0},t+1,r)}return n.index+=1,J(s,o.number)}function Et(e,n){let t=e[n]??e[e.length-1];return R(t===void 0?1:t.number,"array length mismatch")}function At(e,n){if(n===-1)throw R(0,"array header missing colon");let t=e.slice(0,n),r=T(t,"[",0);if(r===-1)throw R(0,"invalid array header");let o,s;try{[o,s]=ne(t.slice(0,r),0)}catch{throw R(0,"invalid array header")}let i=t.slice(r+1),l=i.indexOf("]");if(l===-1)throw R(0,"invalid array header");let a=i.slice(0,l),d=/^[0-9]*/.exec(a)[0];if(d===""||d.length>1&&d.startsWith("0"))throw R(0,"invalid array header");let u=Number.parseInt(d,10),p;switch(a.slice(d.length)){case"":p=",";break;case" ":p=" ";break;case"|":p="|";break;default:throw R(0,"invalid array header")}let m=i.slice(l+1),h;if(m==="")h=void 0;else if(m.startsWith("{")&&m.endsWith("}")&&m.length>=2)try{h=Mo(m.slice(1,-1),p)}catch(y){throw R(0,y.reason==="duplicate key"?"duplicate key":"invalid array header")}else throw R(0,"invalid array header");return{key:o,keyQuoted:s,len:u,delimiter:p,fields:h}}function Ld(e){let n=T(e,"{",0);if(n===-1||!e.endsWith("}"))throw R(0,"invalid keyed map header");let t,r;try{[t,r]=ne(e.slice(0,n),0)}catch{throw R(0,"invalid keyed map header")}if(t===""&&!r)throw R(0,"expected non-empty field name");let o;try{o=Mo(e.slice(n+1,-1),j)}catch(s){throw R(0,s.reason==="duplicate key"?"duplicate key":"invalid keyed map header")}return{key:t,keyQuoted:r,delimiter:j,fields:o}}function Mo(e,n){let t=[],r=0;function o(l,a){let d=0;for(;r<e.length&&!(a&&e[r]==="}");){if(e[r]===n||e[r]==="}")throw R(0,"invalid array header");let u=r;for(;r<e.length;){let m=e[r];if(m==='"'){s();continue}if(m===n||m==="{"||m==="}")break;r+=1}let[p]=ne(e.slice(u,r),0);if(p==="")throw R(0,"invalid array header");if(d+=1,e[r]==="{"){r+=1;let m=t.length;if(o([...l,p],!0),e[r]!=="}"||t.length===m)throw R(0,"invalid array header");r+=1}else t.push([...l,p]);if(e[r]===n){if(r+=1,r>=e.length||e[r]==="}")throw R(0,"invalid array header");continue}if(a?e[r]==="}":r===e.length)break;throw R(0,"invalid array header")}if(d===0)throw R(0,"invalid array header")}function s(){for(r+=1;r<e.length;){let l=e[r];if(r+=1,l==="\\")r+=1;else if(l==='"')return}}if(o([],!1),r!==e.length)throw R(0,"invalid array header");let i=new Set;for(let l=0;l<t.length;l+=1)for(let a=l+1;a<t.length;a+=1)if($d(t[l],t[a])||Pt(t[l],t[a])||Pt(t[a],t[l]))throw R(0,"duplicate key");for(let l of t){let a=l.join("\0");if(i.has(a))throw R(0,"duplicate key");i.add(a)}return t}function $d(e,n){return e.length===n.length&&Pt(e,n)}function Pt(e,n){return n.every((t,r)=>e[r]===t)}function jt(e,n){return R(n,e.reason??String(e.message))}function Co(e,n,t,r,o,s){if(o.expandPaths&&!t&&n.includes(".")){let i=n.split(".");if(i.every(Ad)){Xe(e,i,r,o,s);return}}Xe(e,[n],r,o,s)}function Xe(e,n,t,r,o){let s=n[0],i=Object.prototype.hasOwnProperty.call(e,s);if(n.length===1){if(i&&r.strict)throw R(o,"duplicate key");Pe(e,s,t);return}if(i&&!je(e[s])){if(r.strict)throw R(o,"path expansion conflict");Pe(e,s,{})}else i||Pe(e,s,{});Xe(e[s],n.slice(1),t,r,o)}function Ad(e){return/^[A-Za-z_][A-Za-z0-9_]*$/.test(e)}function je(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function I(e,n={}){let t={nestedTabularHeaders:n.nestedTabularHeaders===!0,keyedMapCollapse:n.keyedMapCollapse===!0},r=[];return Array.isArray(e)?It(r,void 0,e,0,!1,t):je(e)?Fo(r,e,0,t):r.push(q(e,j)),r.join("")}function en(e,n){e.push(" ".repeat(n*Ot))}function Fo(e,n,t,r){for(let[o,s]of Object.entries(n))en(e,t),Dt(e,o,s,t,r)}function Dt(e,n,t,r,o){if(Array.isArray(t)){It(e,n,t,r,!1,o);return}if(je(t)){let s=o.keyedMapCollapse?Td(t,o):void 0;if(s!==void 0){e.push(F(n),"{",s.fields.map(Tt).join(j),`}:
|
|
10
|
+
`);for(let[i,l]of Object.entries(t))en(e,r+1),e.push(F(i),": ",s.paths.map(a=>q(Bo(l,a),j)).join(j),`
|
|
11
11
|
`);return}e.push(F(n),`:
|
|
12
|
-
`),
|
|
13
|
-
`)}function
|
|
12
|
+
`),Fo(e,t,r+1,o);return}e.push(F(n),": ",q(t,j),`
|
|
13
|
+
`)}function It(e,n,t,r,o,s){if(t.length===0){n!==void 0?e.push(F(n),`: []
|
|
14
14
|
`):o?e.push(`[0]:
|
|
15
15
|
`):e.push(`[]
|
|
16
|
-
`);return}if(t.every(Ze)){
|
|
17
|
-
`);return}let i=o?void 0:
|
|
18
|
-
`);for(let l of t)en(e,r+1),e.push(i.paths.map(a=>q(
|
|
19
|
-
`);return}
|
|
20
|
-
`);for(let l of t)en(e,r+1),
|
|
21
|
-
`);return}e.push("- "),
|
|
22
|
-
`)}function
|
|
23
|
-
`}function
|
|
24
|
-
`}function
|
|
25
|
-
`,
|
|
26
|
-
`;return D+=
|
|
27
|
-
`},end(){return p?"":(p=!0,h())}}}function
|
|
16
|
+
`);return}if(t.every(Ze)){xt(e,n,t.length,void 0),e.push(" "),e.push(t.map(l=>q(l,j)).join(j)),e.push(`
|
|
17
|
+
`);return}let i=o?void 0:Ho(t,s);if(i!==void 0){xt(e,n,t.length,i.fields),e.push(`
|
|
18
|
+
`);for(let l of t)en(e,r+1),e.push(i.paths.map(a=>q(Bo(l,a),j)).join(j)),e.push(`
|
|
19
|
+
`);return}xt(e,n,t.length,void 0),e.push(`
|
|
20
|
+
`);for(let l of t)en(e,r+1),Id(e,l,r+1,s)}function Id(e,n,t,r){if(Array.isArray(n)){e.push("- "),It(e,void 0,n,t,!0,r);return}if(je(n)){let o=Object.entries(n);if(o.length===0){e.push(`-
|
|
21
|
+
`);return}e.push("- "),Dt(e,o[0][0],o[0][1],t+1,r);for(let[s,i]of o.slice(1))en(e,t+1),Dt(e,s,i,t+1,r);return}e.push("- ",q(n,j),`
|
|
22
|
+
`)}function xt(e,n,t,r){n!==void 0&&e.push(F(n)),e.push("[",String(t),"]"),r!==void 0&&e.push("{",r.map(Tt).join(j),"}"),e.push(":")}function Ho(e,n){let t=Uo(e.map(r=>({value:r})),n);return t===void 0?void 0:{fields:t,paths:Vo(t)}}function Td(e,n){let t=Object.values(e);if(!(t.length<2))return Ho(t,n)}function Uo(e,n){let t=e[0]?.value;if(!je(t))return;let r=Object.keys(t).map(o=>({key:o}));if(r.length!==0){for(let{value:o}of e)if(!je(o)||Object.keys(o).length!==r.length||r.some(i=>!Object.prototype.hasOwnProperty.call(o,i.key)))return;for(let o of r){let s=e.map(({value:l})=>({value:l[o.key]}));if(s.every(({value:l})=>Ze(l)))continue;if(!n.nestedTabularHeaders)return;let i=Uo(s,n);if(i===void 0)return;o.children=i}return r}}function Vo(e,n=[]){return e.flatMap(t=>{let r=[...n,t.key];return t.children===void 0?[r]:Vo(t.children,r)})}function Bo(e,n){let t=e;for(let r of n)t=t[r];return t}function Tt(e){return e.children===void 0?F(e.key):`${F(e.key)}{${e.children.map(Tt).join(j)}}`}var Zo=[j,"|"," "];var Xo=8,es=/^[A-Za-z0-9_-]+$/,Dy=new TextEncoder,Oy=new TextDecoder;function Wd(e,n){if(!(e.startsWith("[=")&&e.endsWith("]")))return null;let t=e.slice(2,-1);if(!/^[0-9]+$/.test(t))throw S(n,"invalid trailer count");return Number.parseInt(t,10)}function ns(e,n){if(!es.test(e))throw S(n,"invalid tag")}function Md(e,n){let t=e.indexOf(":");if(t<=0)return null;let r=e.slice(0,t);if(!es.test(r)){if(/^[A-Za-z0-9_-]/.test(r)&&/^[^,[\]|{}:\t ]+$/.test(r))throw S(n,"invalid tag");return null}return{tag:r,cellsText:e.slice(t+1)}}function Cd(e,n){if(!e.startsWith("["))return null;let t=e.slice(1),r=t.indexOf("]");if(r===-1)throw S(n,"invalid header");let o=t.slice(0,r),s=o.startsWith("~"),i=s?o.slice(1):o;if(!s&&i.startsWith("="))return null;if(!Zo.includes(i)&&i!=="")throw S(n,"invalid header delimiter");let l=i===""?j:i,a=t.slice(r+1),d=null;if(!s&&a.startsWith("<")){let m=a.indexOf(">");if(m===-1)throw S(n,"invalid tag");if(d=a.slice(1,m),ns(d,n),i!=="")throw S(n,"invalid header delimiter");a=a.slice(m+1)}if(!a.startsWith("{")||!a.endsWith("}:"))throw S(n,"invalid header");let u=a.slice(1,-2),p;try{p=ge(u,l,n).map(m=>ne(m,n)[0])}catch(m){throw Ee(m)}if(p.length===0||p.some(m=>m===""))throw S(n,"invalid header fields");return{delimiter:l,fields:p,fieldText:u,continuation:s,tag:d}}function Fd(e,n,t){if(e===null||e.delimiter===void 0)throw S(t,"continuation header before header");if(e.delimiter!==n.delimiter||e.fieldText!==n.fieldText)throw S(t,"continuation header mismatch")}function Ko(e,n,t,r){let o;try{o=ge(e,n,r)}catch(s){throw Ee(s)}if(o.length!==t)throw S(r,"row arity mismatch");for(let s of o)try{J(s,r)}catch(i){throw Ee(i)}return o}function Hd(e,n,t){let r={};return e.forEach((o,s)=>{try{Pe(r,o,J(n[s],t))}catch(i){throw Ee(i)}}),r}function Ud(e,n,t){if(e.startsWith("- "))throw S(n,"reserved line prefix");let r=Wd(e,n);if(r!==null){if(t===null||t.delimiter===void 0)throw S(n,"trailer without header");if(t.rowCount!==r)throw S(n,"trailer count mismatch");return{kind:"trailer"}}let o=Cd(e,n);if(o!==null)return o.continuation?(Fd(t,o,n),{kind:"continuation"}):o.tag!==null?{kind:"tag-header",header:o}:{kind:"header",header:o};let s=Md(e,n);if(s!==null){let i=t?.taggedLanes?.get(s.tag);if(i===void 0)throw S(n,"unknown tag");return{kind:"tagged-row",tag:s.tag,cells:Ko(s.cellsText,i.delimiter,i.fields.length,n)}}if(t===null||t.delimiter===void 0)throw S(n,"row before header");return{kind:"row",cells:Ko(e,t.delimiter,t.fields.length,n)}}function Vd(e,n={}){let t=[],r=new Map,o=[],s=[],i=null,l=!1,a=!1;function d(h,y){let b=s.at(-1);if(b!==void 0&&b.lane===h.lane&&b.delimiter===h.delimiter&&b.fieldText===h.fieldText){b.rows.push(y);return}s.push({lane:h.lane,delimiter:h.delimiter,fields:h.fields,fieldText:h.fieldText,rows:[y]})}function u(){i!==null&&o.push({delimiter:i.delimiter,fields:i.fields,fieldText:i.fieldText,lane:i.lane,rows:i.rows})}function p(h,y,b){let k=r.get(h);if(k===void 0){if(r.size>=Xo)throw S(b,"too many tagged lanes");k={segments:[],current:null},r.set(h,k),t.push(h)}else k.current!==null&&k.segments.push(k.current);k.current={lane:h,delimiter:y.delimiter,fields:y.fields,fieldText:y.fieldText,rows:[]},k.delimiter=y.delimiter,k.fields=y.fields,k.fieldText=y.fieldText}if($n(e).forEach((h,y)=>{let b=y+1;if(h==="")return;let k=i===null?{taggedLanes:r}:{delimiter:i.delimiter,fields:i.fields,fieldText:i.fieldText,rowCount:i.rows.length,taggedLanes:r},w=Ud(h,b,k);if(w.kind==="trailer"){u(),i=null;return}if(w.kind!=="continuation"){if(w.kind==="tag-header"){a=!0,p(w.header.tag,w.header,b);return}if(w.kind==="header"){u(),l||(t.push(null),l=!0),i={lane:null,delimiter:w.header.delimiter,fields:w.header.fields,fieldText:w.header.fieldText,rows:[]};return}if(w.kind==="tagged-row"){a=!0;let D=r.get(w.tag).current;D.rows.push(w.cells),d(D,w.cells);return}if(i===null)throw S(b,"row before header");i.rows.push(w.cells),d(i,w.cells)}}),!a)return u(),n.preserveInterleaving===!0,o;let m=[];u();for(let h of t){if(h===null){m.push(...o);continue}let y=r.get(h);m.push(...y.segments),y.current!==null&&m.push(y.current)}return n.preserveInterleaving===!0?s:m}function de(e){return Vd(e).flatMap(n=>n.rows.map(t=>Hd(n.fields,t,0)))}function Bd(e){if(!Zo.includes(e))throw S(0,"invalid header delimiter")}function Jo(e,n,t=!1){return`[${`${t?"~":""}${e===j?"":e}`}]{${n}}:
|
|
23
|
+
`}function qo(e,n){return`[]<${e}>{${n}}:
|
|
24
|
+
`}function Nt(e,n){return n.map(F).join(e)}function Kd(e){if(!Array.isArray(e)||e.length===0)throw S(0,"TOONL header requires fields");return e.map(n=>{let t;try{[t]=ne(String(n),0)}catch(r){throw Ee(r)}if(t==="")throw S(0,"TOONL header requires fields");return t})}function Go(e,n){return e!==null&&e.length===n.length&&e.every((t,r)=>t===n[r])}function zo(e){if(e!==void 0&&(!Number.isInteger(e)||e<=0))throw S(0,"TOONL continuation cadence must be positive")}function Jd(e,n,t){return e.continuationEveryRows!==void 0&&n>=e.continuationEveryRows||e.continuationEveryBytes!==void 0&&t>=e.continuationEveryBytes}function Qo(e){if(e===null||typeof e!="object"||Array.isArray(e))throw S(0,"TOONL output requires object rows");let n=Object.keys(e);if(n.length===0)throw S(0,"TOONL output requires object rows");if(n.some(t=>!Ze(e[t])))throw S(0,"TOONL rows must be flat objects");return n}function qd(e){return JSON.stringify([...e].sort())}function Yo(e,n){let t=qd(e),r=n.get(t);return r!==void 0?r:(n.set(t,e),e)}function te({delimiter:e=j,trailer:n=!0,continuationEveryRows:t,continuationEveryBytes:r}={}){Bd(e),zo(t),zo(r);let o=null,s="",i=new Map,l=0,a=0,d=0,u=new Map,p=!1,m={continuationEveryRows:t,continuationEveryBytes:r},h=()=>o===null||!n?"":`[=${l}]
|
|
25
|
+
`,y=()=>Jd(m,a,d)?(a=0,d=0,Jo(e,s,!0)):"",b=k=>{ns(k,0);let w=u.get(k);if(w===void 0){if(u.size>=Xo)throw S(0,"too many tagged lanes");w={fields:null,fieldsByShape:new Map},u.set(k,w)}return w};return{push(k){if(p)throw S(0,"TOONL encoder is closed");let w=Yo(Qo(k),i),D="";(o===null||o.length!==w.length||o.some((me,we)=>me!==w[we]))&&(D+=h(),o=w,s=Nt(e,o),l=0,a=0,d=0,D+=Jo(e,s));let V=o.map(me=>q(k[me],e));D+=y();let C=`${V.join(e)}
|
|
26
|
+
`;return D+=C,l+=1,a+=1,d+=C.length,D},declareLane(k,w){if(p)throw S(0,"TOONL encoder is closed");let D=Kd(w),V=Nt(j,D),C=b(k);return Go(C.fields,D)?"":(C.fields=D,qo(k,V))},pushTagged(k,w){if(p)throw S(0,"TOONL encoder is closed");let D=b(k),V=Yo(Qo(w),D.fieldsByShape),C=Nt(j,V),me=V.map(Rn=>q(w[Rn],j)),we="";return Go(D.fields,V)||(D.fields=V,we+=qo(k,C)),`${we}${k}:${me.join(j)}
|
|
27
|
+
`},end(){return p?"":(p=!0,h())}}}function Wt(e){let n={app:e,version:Gd(De("__RED_BUILD_VERSION__",()=>"3.3.7")??"0.0.0-dev"),gitSha:De("__RED_BUILD_GIT_SHA__",()=>"7306852fc3ccba3ee1baf853636aeec2b1363667")??"unknown",buildTime:De("__RED_BUILD_TIME__",()=>"2026-08-02T12:31:33Z")??"unknown",bundleAsset:De("__RED_BUNDLE_ASSET__",()=>"redskilled.bundle.min.mjs")??"unknown"},t=De("__REDDB_SDK_VERSION__",()=>""),r=De("__REDDB_BINARY_TAG__",()=>"");return t&&(n.reddbSdkVersion=t),r&&(n.reddbBinaryTag=r),n}function Gd(e){return e.startsWith("v")?e.slice(1):e}function ts(e){return`${e.app} ${e.version} ${e.gitSha}`}function De(e,n){try{let t=n();return typeof t=="string"&&t.length>0?t:void 0}catch{return process.env[e.replace(/^__|__$/g,"")]}}var rs={"=":"data",":=":{to:"data",typed:!0},":":"meta"},zd=/^[a-z][a-z0-9+.-]*:\/\//i;function Qd(e,n){return typeof n=="string"?{separator:e,to:n,typed:!1,prefix:!1}:{separator:e,to:n.to,typed:n.typed??!1,prefix:n.prefix??!1}}function Yd(e=rs){return Object.entries(e).map(([n,t])=>Qd(n,t)).sort((n,t)=>t.separator.length-n.separator.length)}function Zd(e){return/^-\d+(\.\d+)?$/.test(e)}function nn(e){return!(!e||e.startsWith("-")&&!Zd(e))}function An(e){if(e==="true")return!0;if(e==="false")return!1;if(e==="null")return null;let n=Number(e);return!Number.isNaN(n)&&Number.isFinite(n)&&e.trim()!==""?n:e}function os(e){if(e==="true")return!0;if(e==="false")return!1;if(e==="null")return null;if(e.startsWith("[")&&e.endsWith("]")||e.startsWith("{")&&e.endsWith("}"))try{return JSON.parse(e)}catch{}let n=Number(e);return!Number.isNaN(n)&&Number.isFinite(n)&&e.trim()!==""?n:e.includes(",")?e.split(",").map(t=>os(t.trim())):e}function he(e,n){switch(n){case"boolean":return Xd(e);case"number":return ec(e);case"array":return e.split(",").map(t=>An(t.trim()));case"string":default:return e}}function Xd(e){let n=e.toLowerCase().trim();return n==="true"||n==="yes"||n==="1"||n==="on"}function ec(e){if(e.trim()==="")throw new TypeError(`Cannot convert "${e}" to number`);let n=Number(e);if(Number.isNaN(n))throw new TypeError(`Cannot convert "${e}" to number`);return n}function ce(e){return e.startsWith('"')&&e.endsWith('"')||e.startsWith("'")&&e.endsWith("'")?e.slice(1,-1):e}function nc(e,n={}){return e.map(t=>{let r=n[t.type];return r?r(t.value):t.value}).join("")}function E(e,n){return{type:e,value:n}}function tc(e){let n=[],t=oc(e);if(n.push(E("section-header","Usage:"),E("text"," "),E("usage-text",t),E("newline",`
|
|
28
28
|
`),E("newline",`
|
|
29
29
|
`)),e.positional&&e.positional.length>0){n.push(E("section-header","Arguments:"),E("newline",`
|
|
30
30
|
`));for(let r of e.positional)if(r.description){let o=r.variadic?`${r.name}...`:r.name;n.push(E("indent"," "),E("positional-name",`<${o}>`)),r.required||n.push(E("positional-optional"," (optional)")),n.push(E("newline",`
|
|
31
31
|
`),E("indent"," "),E("option-description",r.description),E("newline",`
|
|
32
32
|
`))}n.push(E("newline",`
|
|
33
33
|
`))}if(e.options&&Object.keys(e.options).length>0){n.push(E("section-header","Options:"),E("newline",`
|
|
34
|
-
`));let r=
|
|
35
|
-
`))}return t}function
|
|
36
|
-
`),o=r.find(i=>i.startsWith("0::"));if(o)return o.slice(3)||null;let s=r[0]?.split(":").slice(2).join(":");return s===void 0||s===""?null:s}function
|
|
37
|
-
`)}catch{return!0}},append(e,n){
|
|
38
|
-
`),t.append(e,r),n}function
|
|
34
|
+
`));let r=sc(e.options);n.push(...r)}return n}function rc(e,n){let t=tc(e);return nc(t,n)}function oc(e){let n=["[options]"];if(e.positional)for(let t of e.positional)t.variadic?n.push(t.required?`<${t.name}...>`:`[${t.name}...]`):n.push(t.required?`<${t.name}>`:`[${t.name}]`);return n.join(" ")}function sc(e,n=!1){let t=[],r=[],o=n?"global-option-flag":"option-flag",s=n?"global-option-type":"option-type",i=n?"global-option-default":"option-default",l=n?"global-option-description":"option-description";for(let[d,u]of Object.entries(e)){if(u.hidden)continue;let p=[],m=b=>{p.includes(b)||p.push(b)};u.short&&m(`-${u.short}`),m(`--${d}`);for(let b of u.aliases??[])b.length===1?m(`-${b}`):m(`--${b}`);let h=p.join(", "),y=u.type&&u.type!=="boolean"?`<${u.type}>`:void 0;r.push({flags:h,type:y,desc:u.description??"",default:u.default!==void 0?String(u.default):void 0})}let a=Math.max(...r.map(d=>d.flags.length+(d.type?d.type.length+1:0)),20);for(let d of r){let u=d.flags.length+(d.type?d.type.length+1:0),p=" ".repeat(a-u+2);t.push(E("indent"," ")),t.push(E(o,d.flags)),d.type&&(t.push(E("text"," ")),t.push(E(s,d.type))),t.push(E("text",p)),t.push(E(l,d.desc)),d.default!==void 0&&(t.push(E("text"," ")),t.push(E(i,`(default: ${d.default})`))),t.push(E("newline",`
|
|
35
|
+
`))}return t}function ss(e){let n=pc(e.options??{},e.autoShort??!1),t=Yd(e.separators??rs);return{schema:e,parse(r){return ic(r,e,n,t)},help(){return rc(e,e.formatter)}}}function ic(e,n,t,r){let o={positional:{},options:{},errors:[],rest:[]},s=new Set(r.map(u=>u.to));for(let u of s)o[u]={};let i=0,l=n.positional??[],a=0,d=!1;for(;a<e.length;){let u=e[a];if(n.stopEarly&&i>0){o.rest=e.slice(a);break}if(u==="--"&&!d){d=!0,a++;continue}if(d){if(i<l.length){let m=l[i];if(m.variadic){let h=[];for(;a<e.length;){let y=e[a];h.push(m.type?he(y,m.type):y),a++}o.positional[m.name]=h,i++}else{let h=m.type?he(u,m.type):u;o.positional[m.name]=h,i++,a++}}else n.allowUnknown!==!1&&(o.rest=o.rest??[],o.rest.push(u)),a++;continue}if(u.startsWith("--")){a=cc(u,a,e,o,t,n);continue}if(u.startsWith("-")&&u.length>1&&!yc(u)){a=uc(u,a,e,o,t,n);continue}let p=lc(u,r);if(p){let{key:m,value:h,config:y}=p,b=o,k=b[y.to]??(b[y.to]={});k[m]=y.typed?os(h):ce(h),a++;continue}if(i<l.length){let m=l[i];if(m.variadic){let y=[];for(;a<e.length&&!e[a].startsWith("-");){let b=e[a];y.push(m.type?he(b,m.type):b),a++}o.positional[m.name]=y,i++;continue}let h=m.type?he(u,m.type):u;o.positional[m.name]=h,i++}else n.allowUnknown!==!1?o.rest.push(u):o.errors.push(`Unexpected positional argument: ${u}`);a++}return fc(o,n,t),gc(o,n,l),hc(o,n,t),o}function lc(e,n){if(zd.test(e))return null;for(let t of n){if(t.prefix&&e.startsWith(t.separator)){let o=e.slice(t.separator.length),s=o.indexOf(":");if(s>0){let i=o.slice(0,s),l=o.slice(s+1);if(ac(i))return{key:i,value:l,config:t}}continue}let r=e.indexOf(t.separator);if(r>0){let o=e.slice(0,r),s=e.slice(r+t.separator.length);if(dc(o,s,t))return{key:o,value:s,config:t}}}return null}function ac(e){return e?/^[a-zA-Z_][a-zA-Z0-9_-]*$/.test(e):!1}function dc(e,n,t){return e?t.separator===":"?e.includes("/")||e.includes(".")||/^\d+$/.test(n)?!1:/^[A-Z][a-zA-Z0-9-]*$/.test(e):!((t.separator==="="||t.separator===":=")&&e.includes("/")):!1}function cc(e,n,t,r,o,s){let i=e.slice(2);if(i.startsWith("no-")){let a=i.slice(3),d=o.get(a);if(d?.negatable!==!1&&d?.type==="boolean")return r.options[d.name]=!1,n+1}if(i.includes("=")){let a=i.indexOf("="),d=i.slice(0,a),u=i.slice(a+1);return In(d,u,n+1,r,o,s)}let l=o.get(i);if(l){if(l.type!=="boolean"){let a=t[n+1];return nn(a)?In(l.name,a,n+2,r,o,s):(r.errors.push(`Option --${i} requires a value`),n+1)}return r.options[l.name]=!0,n+1}return s.strict?r.errors.push(`Unknown option: --${i}`):s.allowUnknown!==!1&&(r.options[i]=!0),n+1}function uc(e,n,t,r,o,s){let i=e.slice(1);if(i.includes("=")){let l=i.indexOf("="),a=i.slice(0,l),d=i.slice(l+1),u=Mt(a,o);return u?In(u.name,d,n+1,r,o,s):(s.strict?r.errors.push(`Unknown option: -${a}`):s.allowUnknown!==!1&&(r.options[a]=An(ce(d))),n+1)}if(i.length===1){let l=Mt(i,o);if(l){if(l.type!=="boolean"){let a=t[n+1];return nn(a)?In(l.name,a,n+2,r,o,s):(r.errors.push(`Option -${i} requires a value`),n+1)}return r.options[l.name]=!0,n+1}if(s.strict)r.errors.push(`Unknown option: -${i}`);else if(s.allowUnknown!==!1){let a=t[n+1];if(nn(a))return r.options[i]=An(ce(a)),n+2;r.options[i]=!0}return n+1}for(let l of i){let a=Mt(l,o);a?a.type==="boolean"?r.options[a.name]=!0:r.errors.push(`Option -${l} requires a value`):s.strict?r.errors.push(`Unknown option: -${l}`):s.allowUnknown!==!1&&(r.options[l]=!0)}return n+1}function In(e,n,t,r,o,s){let i=o.get(e);if(i){if(i.choices){let a=i.type?he(ce(n),i.type):ce(n);if(!i.choices.includes(a))return r.errors.push(`Invalid value for '${e}': '${n}'. Allowed: ${i.choices.join(", ")}`),t}let l=i.type?he(ce(n),i.type):ce(n);if(i.type==="array"){let a=r.options[e];Array.isArray(a)?a.push(...l):r.options[e]=l}else r.options[e]=l}else s.strict?r.errors.push(`Unknown option: --${e}`):s.allowUnknown!==!1&&(r.options[e]=An(ce(n)));return t}function pc(e,n=!1){let t=new Map,r=Object.entries(e).sort(([s],[i])=>s.localeCompare(i)),o=new Set;for(let[,s]of r)s.short&&o.add(s.short);for(let[s,i]of r){let l=i.short??"";n&&!l&&(l=mc(s,o),l&&o.add(l));let a={name:s,short:l,aliases:i.aliases??[],type:i.type??"string",description:i.description??"",required:i.required??!1,hidden:i.hidden??!1,negatable:i.negatable??!0,default:i.default,choices:i.choices,env:i.env,validate:i.validate};t.set(s,a);for(let d of a.aliases)t.set(d,a)}return t}function mc(e,n){for(let t of e){if(!/[a-zA-Z]/.test(t))continue;let r=t.toLowerCase();if(!n.has(r))return r;let o=t.toUpperCase();if(!n.has(o))return o}return""}function Mt(e,n){for(let t of n.values())if(t.short===e||t.aliases.includes(e))return t}function fc(e,n,t){for(let r of t.values())if(e.options[r.name]===void 0)if(r.env&&process.env[r.env]!==void 0){let o=process.env[r.env];e.options[r.name]=r.type?he(o,r.type):o}else r.default!==void 0&&(e.options[r.name]=r.default);for(let r of n.positional??[])e.positional[r.name]===void 0&&r.default!==void 0&&(e.positional[r.name]=r.default)}function gc(e,n,t){if(n.options)for(let[r,o]of Object.entries(n.options))o.required&&e.options[r]===void 0&&e.errors.push(`Missing required option: --${r}`);for(let r of t)r.required&&e.positional[r.name]===void 0&&e.errors.push(`Missing required argument: <${r.name}>`)}function hc(e,n,t){for(let r of t.values()){let o=e.options[r.name];if(r.validate&&o!==void 0){let s=r.validate(o);s!==!0&&e.errors.push(s)}}for(let r of n.positional??[]){let o=e.positional[r.name];if(r.validate&&o!==void 0){let s=r.validate(o);s!==!0&&e.errors.push(s)}}}function yc(e){return/^-\d+(\.\d+)?$/.test(e)}var Ct=class extends Error{flag;known;constructor(n,t){super(`unknown flag '${n}'; expected one of: ${t.join(", ")}`),this.name="UnknownFlagError",this.flag=n,this.known=t}};function kc(e){let n={};for(let[t,r]of Object.entries(e))n[t]={type:r.kind==="boolean"?"boolean":"string",...t.length===1?{short:t}:{},...r.aliases===void 0?{}:{aliases:r.aliases}};return n}function Rc(e,n){let t=new Map;for(let[o,s]of Object.entries(n))if(!(s.kind!=="value"||s.type!=="array")){t.set(o,o);for(let i of s.aliases??[])t.set(i,o)}let r=new Map;for(let o=0;o<e.length;o+=1){let s=e[o];if(s==="--")break;let i=s.match(/^--([^=]+)(?:=(.*))?$/)??s.match(/^-([^=])(?:=(.*))?$/);if(i===null)continue;let l=t.get(i[1]);if(l===void 0)continue;let a=i[2];if(a===void 0&&nn(e[o+1])&&(a=e[o+1],o+=1),a===void 0)continue;let d=r.get(l)??[];d.push(a),r.set(l,d)}return r}function ye(e,n,t={}){let o=ss({options:kc(n),separators:{},allowUnknown:!0}).parse([...e]),s={},i=Rc(e,n),l=o.errors.find(a=>/^Option --?\S+ requires a value$/.test(a));if(l!==void 0)throw new Error(l.replace(/^Option /,""));if(o.errors.length>0)throw new Error(o.errors[0]);if(t.unknownFlags==="error"){let a=new Set(Object.keys(n));for(let d of Object.keys(o.options))if(!a.has(d))throw new Ct(d.length===1?`-${d}`:`--${d}`,Object.keys(n).map(u=>u.length===1?`-${u}`:`--${u}`))}for(let[a,d]of Object.entries(n)){let u=o.options[a];u!==void 0&&(d.kind==="boolean"?s[a]=u:d.type==="array"?s[a]=(i.get(a)??[]).map(p=>d.coerce(p)):s[a]=d.coerce(String(u)))}return{values:s,positionals:o.rest}}var Ft=class extends Error{token;known;constructor(n,t){super(`unknown command '${n}'; expected one of: ${t.join(", ")}`),this.name="UnknownCommandError",this.token=n,this.known=t}};function is(e,n){let[t,...r]=e;if(t!==void 0){for(let[s,i]of Object.entries(n.commands))if(t===s||(i.aliases??[]).includes(t))return{command:s,args:r};if(n.errorOnUnknownCommand&&!t.startsWith("-"))throw new Ft(t,Object.keys(n.commands))}let o=n.keepArgvOnDefault??!0;return{command:n.default,args:o?[...e]:r}}import{appendFileSync as Oc,mkdirSync as Lc,readFileSync as hs,statSync as $c}from"node:fs";import{dirname as ks,join as Ac}from"node:path";var ls="RED_WORKER_SCOPE",as="RED_WORKER_MEMORY_CEILING",ds="RED_WORKER_SCOPE_DEGRADATION",Ut={scope:null,memory_ceiling:null,scope_degradation:null};function Vt(e){return{scope:Ht(e[ls]),memory_ceiling:Ht(e[as]),scope_degradation:Ht(e[ds])}}function tn(e){let n={};return e.scope!=null&&e.scope!==""&&(n[ls]=e.scope),e.memory_ceiling!=null&&e.memory_ceiling!==""&&(n[as]=e.memory_ceiling),e.scope_degradation!=null&&e.scope_degradation!==""&&(n[ds]=e.scope_degradation),n}function Ht(e){let n=(e??"").trim();return n===""?null:n}import{mkdirSync as wc,readdirSync as vc,readFileSync as ms,rmSync as Sc,writeFileSync as xc}from"node:fs";import{basename as Ec,join as Oe}from"node:path";import{isAbsolute as ak,join as Tn,resolve as dk}from"node:path";function bc(e){if(!e)throw new Error("root is required");return e.replace(/\/$/,"")}var cs="deaths",us="deaths.toonl";function Nn(e){return Tn(bc(e),cs)}function rn(e){return Tn(Nn(e),us)}var on="live",ps="attributions.toonl";function Wn(e){return Tn(Nn(e),on)}function Bt(e){return Tn(Nn(e),ps)}var Jt=Oe("sys","kernel","random","boot_id"),fs=1;function qt(e,n={}){let t=n.procRoot??"/proc",r=e.pid??process.pid;return{version:fs,ts:(n.now??(()=>new Date().toISOString()))(),kind:e.kind,id:e.id,pid:r,ppid:e.ppid??process.ppid,boot_id:gs(Oe(t,Jt)),cgroup:Pc(t,r),last_phase:e.last_phase}}function gs(e){try{let n=ms(e,"utf8").trim();return n===""?null:n}catch{return null}}function Pc(e,n){let t=gs(Oe(e,String(n),"cgroup"));if(t===null)return null;let r=t.split(`
|
|
36
|
+
`),o=r.find(i=>i.startsWith("0::"));if(o)return o.slice(3)||null;let s=r[0]?.split(":").slice(2).join(":");return s===void 0||s===""?null:s}function Gt(e){let n=e.id.replace(/[^A-Za-z0-9._-]/g,"_");return`${e.kind}-${n}-${e.pid}.toon`}function zt(e,n){let t=Oe(e,Gt(n));try{return wc(e,{recursive:!0,mode:448}),xc(t,te({trailer:!1}).push(Dc(n)),{encoding:"utf8",mode:384}),t}catch{return null}}function ke(e,n){try{Sc(Oe(e,Gt(n)),{force:!0})}catch{}}function Qt(e,n){let t;try{t=vc(e)}catch{return[]}let r=[];for(let o of t.sort()){if(!o.endsWith(".toon"))continue;let s=Oe(e,o);try{let l=de(ms(s,"utf8"))[0];if(l===void 0)throw new Error("anchor holds no record");r.push(jc(l))}catch(i){n?.(Ec(s),i instanceof Error?i.message:String(i))}}return r}function jc(e){let n=e.kind;if(n!=="launcher"&&n!=="worker"&&n!=="daemon")throw new Error(`presence anchor has unknown kind ${String(n)}`);return{version:Kt(e.version),ts:String(e.ts),kind:n,id:String(e.id),pid:Kt(e.pid),ppid:Kt(e.ppid),boot_id:e.boot_id==null?null:String(e.boot_id),cgroup:e.cgroup==null?null:String(e.cgroup),last_phase:String(e.last_phase)}}function Kt(e){return typeof e=="number"?e:Number(e)}function Dc(e){return{...e}}var Ic=1,Tc=new Set(["exit","signal","uncaught-exception","unhandled-rejection"]);function Nc(e){return typeof e=="string"&&Tc.has(e)}var Wc="startup";function Mc(e,n){return{...e.scope??Ut,version:Ic,ts:e.ts,kind:e.kind,id:e.id,pid:e.pid,exit_path:e.exit_path,signal:e.signal??null,exit_code:e.exit_code??null,last_phase:e.last_phase,detail:e.detail??null,...n}}function Cc(e){let n=e.resourceUsage();return{uptime_s:Math.round(e.uptime()),rss_kb:Math.round(e.memoryUsage().rss/1024),max_rss_kb:n.maxRSS,user_cpu_us:n.userCPUTime,system_cpu_us:n.systemCPUTime,minor_page_faults:n.minorPageFault,major_page_faults:n.majorPageFault,voluntary_ctx_switches:n.voluntaryContextSwitches,involuntary_ctx_switches:n.involuntaryContextSwitches}}var Zt={mkdir(e){Lc(e,{recursive:!0,mode:448})},endsClean(e){let n;try{n=$c(e).size}catch{return!0}if(n===0)return!0;try{return hs(e,"utf8").endsWith(`
|
|
37
|
+
`)}catch{return!0}},append(e,n){Oc(e,n,{encoding:"utf8",mode:384})},read(e){return hs(e,"utf8")}};function Fc(e){let n={};for(let[t,r]of Object.entries(e))n[t]=r;return n}function Hc(e,n,t=Zt){let r=te({trailer:!1}).push(Fc(n));return t.mkdir(ks(e)),t.endsClean(e)||t.append(e,`
|
|
38
|
+
`),t.append(e,r),n}function Rs(e){let n=e.endsWith(`
|
|
39
39
|
`)?e:e.slice(0,e.lastIndexOf(`
|
|
40
|
-
`)+1);return n===""?[]:de(n).map(
|
|
41
|
-
`).filter(p=>p.trim()!=="");l.push(...u),r.push({source:a,result:u.length===0?"empty":"read",detail:`${u.length} lines`})}catch(
|
|
40
|
+
`)+1);return n===""?[]:de(n).map(Uc)}function Uc(e){let n=e.exit_path;if(!Nc(n))throw new Error(`death record has unknown exit_path ${JSON.stringify(n)}`);let t=e.kind;if(t!=="launcher"&&t!=="worker"&&t!=="daemon")throw new Error(`death record has unknown kind ${JSON.stringify(t)}`);return{version:N(e.version),ts:String(e.ts),kind:t,id:String(e.id),pid:N(e.pid),exit_path:n,signal:e.signal==null?null:String(e.signal),exit_code:e.exit_code==null?null:N(e.exit_code),last_phase:String(e.last_phase),detail:e.detail==null?null:String(e.detail),scope:e.scope==null?null:String(e.scope),memory_ceiling:e.memory_ceiling==null?null:String(e.memory_ceiling),scope_degradation:e.scope_degradation==null?null:String(e.scope_degradation),uptime_s:N(e.uptime_s),rss_kb:N(e.rss_kb),max_rss_kb:N(e.max_rss_kb),user_cpu_us:N(e.user_cpu_us),system_cpu_us:N(e.system_cpu_us),minor_page_faults:N(e.minor_page_faults),major_page_faults:N(e.major_page_faults),voluntary_ctx_switches:N(e.voluntary_ctx_switches),involuntary_ctx_switches:N(e.involuntary_ctx_switches)}}function N(e){return typeof e=="number"?e:Number(e)}function bs(e,n=Zt){let t;try{t=n.read(e)}catch(r){if(r.code==="ENOENT")return[];throw r}return Rs(t)}var Vc=["SIGTERM","SIGINT","SIGHUP","SIGQUIT"],Yt=null;function _s(e){let n=e.host??process,t=e.io??Zt,r=e.clock??(()=>new Date().toISOString()),o=n.pid,s=e.scope??Vt(process.env),i=e.phase??Wc,l=null,a=e.presenceDir===void 0?Ac(ks(e.lanePath),on):e.presenceDir,d=null,u=()=>{a!==null&&(d=qt({kind:e.kind,id:e.id,last_phase:i,pid:o},{procRoot:e.procRoot}),zt(a,d))},p=k=>{if(!l){try{l=Hc(e.lanePath,Mc({ts:r(),kind:e.kind,id:e.id,pid:o,last_phase:i,scope:s,...k},Cc(n)),t)}catch{}a!==null&&d!==null&&ke(a,d)}},m={signal(k){p({exit_path:"signal",signal:k})},exit(k){p({exit_path:"exit",exit_code:k})},uncaughtException(k){p({exit_path:"uncaught-exception",detail:ys(k)})},unhandledRejection(k){p({exit_path:"unhandled-rejection",detail:ys(k)})}},y=[...(e.signals??Vc).map(k=>{let w=()=>{if(m.signal(k),!(n.listenerCount?.(k)!==1||!n.kill)){n.off(k,w);try{n.kill(o,k)}catch{}}};return[k,w]}),["uncaughtException",(...k)=>m.uncaughtException(k[0])],["unhandledRejection",(...k)=>m.unhandledRejection(k[0])],["exit",(...k)=>m.exit(typeof k[0]=="number"?k[0]:null)]];for(let[k,w]of y)n.on(k,w);let b={lanePath:e.lanePath,phase(k){i=k,l||u()},currentPhase:()=>i,written:()=>l,uninstall(){for(let[k,w]of y)n.off(k,w);a!==null&&d!==null&&ke(a,d),Yt===b&&(Yt=null)},handlers:m};return e.setActive!==!1&&(Yt=b),u(),b}function ys(e){if(e instanceof Error)return`${e.name}: ${e.message}`;try{return String(e)}catch{return"(undescribable)"}}import{mkdirSync as Bc,readdirSync as Kc,readFileSync as Mn,statSync as Jc,writeFileSync as qc}from"node:fs";import{join as xs}from"node:path";var Gc=1,zc=["/var/log/kern.log","/var/log/syslog","/var/log/messages"],Qc=512*1024;function Yc(e={}){let n=e.procRoot??"/proc",t=e.journalPaths??zc,r=[],o=xs(n,Jt),s=null;try{let a=Mn(o,"utf8").trim();s=a===""?null:a,r.push({source:o,result:s?"read":"empty",detail:s})}catch(a){r.push({source:o,result:Xt(a),detail:null})}let i=new Set;try{for(let a of Kc(n))/^\d+$/.test(a)&&i.add(Number(a));r.push({source:n,result:"read",detail:`${i.size} live pids`})}catch(a){r.push({source:n,result:Xt(a),detail:null})}let l=[];for(let a of t)try{let u=Zc(a,e.tailBytes??Qc).split(`
|
|
41
|
+
`).filter(p=>p.trim()!=="");l.push(...u),r.push({source:a,result:u.length===0?"empty":"read",detail:`${u.length} lines`})}catch(d){r.push({source:a,result:Xt(d),detail:null})}return{boot_id:s,live_pids:i,journal:l,probes:r}}function Xt(e){return e.code==="ENOENT"?"absent":"unreadable"}function Zc(e,n){let t=Jc(e).size,r=Mn(e,"utf8");return t<=n?r:r.slice(r.length-n)}var Xc=/(?:Out of memory|Memory cgroup out of memory)[^\n]*?Killed process (\d+)/,eu=/oom[-_]kill:[^\n]*?\bpid=(\d+)/,nu=/Killed (\/\S*) due to memory pressure/,tu=/\bopid=(\d+)\b/,ws=/\bsig=(\d+)\b/,ru=/\buid=(\d+)\b/,ou=/systemd-shutdown|Powering off|System is powering down|Reboot: |Unmounting file systems/,su={2:"SIGINT",9:"SIGKILL",15:"SIGTERM"};function iu(e,n,t,r){let o=e.boot_id!==null&&n.boot_id!==null&&e.boot_id!==n.boot_id,s=[...n.probes.map(p=>`${p.source}: ${p.result}${p.detail?` (${p.detail})`:""}`),`boot id: anchored under ${e.boot_id??"unknown"}, host now ${n.boot_id??"unknown"} (${o?"changed":"same"})`,`parent account: ppid ${e.ppid}`,`cgroup: ${e.cgroup??"unknown"}`],i=(p,m,h,y)=>({version:Gc,ts:r,kind:e.kind,id:e.id,pid:e.pid,last_seen:e.ts,last_phase:e.last_phase,sender_class:p,confidence:m,signal:h,host_boot_changed:o,evidence:y,checked:s}),l=o?["the host rebooted since the anchor, so this line may name a reused pid"]:[],a=n.journal.find(p=>vs(p,e.pid,Xc)||vs(p,e.pid,eu));if(a!==void 0)return i("oomd",o?"medium":"high","SIGKILL",[a,...l]);if(e.cgroup!==null)for(let p of n.journal){let m=nu.exec(p)?.[1];if(m!==void 0){if(m===e.cgroup)return i("oomd",o?"medium":"high","SIGKILL",[p,...l]);if(e.cgroup.startsWith(`${m}/`))return i("oomd","medium","SIGKILL",[p,`the killed scope ${m} is an ancestor of this process's ${e.cgroup}`,...l])}}let d=n.journal.find(p=>Number(tu.exec(p)?.[1])===e.pid&&ws.test(p));if(d!==void 0){let p=Number(ws.exec(d)?.[1]),m=ru.exec(d)?.[1];return i("user-signal",o?"medium":"high",su[p]??null,[d,...m===void 0?[]:[`sent by uid ${m}`],...l])}let u=t.find(p=>p.pid===e.ppid);if(u!==void 0&&!n.live_pids.has(e.ppid))return i("parent-death","medium",null,[`parent pid ${e.ppid} (${u.kind} ${u.id}) recorded its own death at ${u.ts} via ${u.exit_path}${u.signal?` ${u.signal}`:""}`]);if(o){let p=n.journal.find(m=>ou.test(m));return p!==void 0?i("teardown","high",null,[`host boot id changed from ${e.boot_id} to ${n.boot_id}`,p]):i("teardown","medium",null,[`host boot id changed from ${e.boot_id} to ${n.boot_id}`,"no shutdown record on any journal read: the host stopped without announcing it (a freeze or a power loss, not an orderly teardown)"])}return i("unknown","none",null,[])}function vs(e,n,t){return Number(t.exec(e)?.[1])===n}var lu=" | ";function Ss(e){return e.map(n=>n.replace(/[|\n\r]+/g," ").trim()).join(lu)}function au(e){return{version:e.version,ts:e.ts,kind:e.kind,id:e.id,pid:e.pid,last_seen:e.last_seen,last_phase:e.last_phase,sender_class:e.sender_class,confidence:e.confidence,signal:e.signal,host_boot_changed:e.host_boot_changed,evidence:Ss(e.evidence),checked:Ss(e.checked)}}function du(e){let n=te({trailer:!1});return e.map(t=>n.push(au(t))).join("")}function Es(e){let n=Wn(e.stateRoot),t=Bt(e.stateRoot),r=e.now??(()=>new Date().toISOString()),o=e.evidence??Yc({procRoot:e.procRoot,journalPaths:e.journalPaths}),s=[],i=Qt(n,p=>s.push(p)),l=bs(rn(e.stateRoot)),a=[],d=[],u=[];for(let p of i){if(o.live_pids.has(p.pid)){d.push(p);continue}if(l.find(h=>h.pid===p.pid&&h.id===p.id)!==void 0){u.push(p),ke(n,p);continue}a.push(iu(p,o,l,r())),ke(n,p)}return a.length>0&&cu(t,a),{attributions:a,alive:d,self_recorded:u,skipped:s,laneText:()=>{try{return Mn(t,"utf8")}catch{return""}}}}function Ps(e){let n=e.skipped.length===0?"":` | unreadable anchors=${e.skipped.join(",")}`;if(e.attributions.length===0)return`death reaper: no un-recorded deaths (live=${e.alive.length} self-recorded=${e.self_recorded.length})${n}`;let t=e.attributions.map(r=>` | ${r.kind} ${r.id} pid=${r.pid} ${r.sender_class}/${r.confidence} phase=${r.last_phase}`+(r.evidence[0]?` evidence="${r.evidence[0]}"`:"")).join("");return`death reaper: attributed ${e.attributions.length}${t}${n}`}function cu(e,n){try{Bc(xs(e,".."),{recursive:!0,mode:448});let t=uu(e),r=t===""||t.endsWith(`
|
|
42
42
|
`)?"":`
|
|
43
|
-
`;
|
|
44
|
-
`)){let o=r.replace(/\r$/,""),s=o.trim();if(!s||s.startsWith("#"))continue;let i=o.indexOf(":");if(i<0)continue;let l=o.length-o.trimStart().length,a=o.slice(0,i).trim();if(!a)continue;let
|
|
45
|
-
`||e[n]==="\r";)n+=1;let t=e.slice(n);if(t==="")return null;let r=
|
|
43
|
+
`;qc(e,`${t}${r}${du(n)}`,{encoding:"utf8",mode:384})}catch{}}function uu(e){try{return Mn(e,"utf8")}catch{return""}}import{join as pu}from"node:path";var mu=[".red","redskilled"],z=448;function Re(e){return pu(e,...mu)}import{execFileSync as Pu}from"node:child_process";import{readFileSync as ju}from"node:fs";import{dirname as Is,join as Du}from"node:path";import{existsSync as fu,readFileSync as Fk}from"node:fs";import{dirname as gu,join as hu}from"node:path";function js(e,n){let t=e;for(let r=0;r<16;r++){let o=hu(t,n);if(fu(o))return o;let s=gu(t);if(s===t)break;t=s}return null}function yu(e){let n=e.indexOf(" #");return(n>=0?e.slice(0,n):e).trim()}function Le(e,n){let t=[];for(let r of e.split(`
|
|
44
|
+
`)){let o=r.replace(/\r$/,""),s=o.trim();if(!s||s.startsWith("#"))continue;let i=o.indexOf(":");if(i<0)continue;let l=o.length-o.trimStart().length,a=o.slice(0,i).trim();if(!a)continue;let d=o.slice(i+1).trim();for(;t.length&&t[t.length-1].indent>=l;)t.pop();if(t.push({indent:l,key:a}),d&&t.map(p=>p.key).join(".")===n)return yu(d)}}import{createHash as ku}from"node:crypto";var Ru="project.name";function Os(e){let n=Le(e,Ru)?.trim();return n===void 0||n===""?void 0:n}var bu=8,Ls="project";function $s(e){let n=xu(e.gitCommonDir),t=(e.declaredName??"").trim(),r=t!==""?{name:t,source:"declared"}:_u(e.remoteUrl)??{name:wu(e.checkoutPath,n),source:"basename"},o=Su(n??er(e.checkoutPath));return{name:r.name,slug:`${vu(r.name)}-${o}`,hash:o,source:r.source}}function As(e){let n=(e??"").trim();if(n==="")return;let t=n.replace(/^[a-zA-Z][a-zA-Z0-9+.-]*:\/\//,""),r=/^[^/]*?:(?!\d)(.+)$/.exec(t),s=(r?r[1]:t.replace(/^[^/]*/,"")).replace(/\.git$/,"").split("/").map(i=>i.trim()).filter(i=>i!=="");if(s.length!==0)return s.slice(-2).join("/")}function _u(e){let n=As(e);return n===void 0?void 0:{name:n,source:"remote"}}function wu(e,n){let t=n===void 0?"":Ds(Eu(n));if(t!=="")return t;let r=Ds(er(e));return r===""?Ls:r}function vu(e){let t=e.split("/").map(r=>r.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")).filter(r=>r!=="").join("--");return t===""?Ls:t}function Su(e){return ku("sha256").update(e).digest("hex").slice(0,bu)}function xu(e){let n=er(e??"");return n===""?void 0:n}function er(e){let n=e.trim().replace(/\\/g,"/");return n.length>1?n.replace(/\/+$/,""):n}function Ds(e){let n=e.split("/").filter(t=>t!=="");return n[n.length-1]??""}function Eu(e){return e.split("/").filter(t=>t!=="").slice(0,-1).join("/")}var Ou=2e3;function Ts(e){return Lu(e).name}function Lu(e){let n=tr(e),t=nr(e,["rev-parse","--absolute-git-dir"])??nr(e,["rev-parse","--git-common-dir"]),r=nr(e,["remote","get-url","origin"]);return $s({checkoutPath:n.root??e,...t!==void 0?{gitCommonDir:t}:{},...r!==void 0?{remoteUrl:r}:{},...n.name!==void 0?{declaredName:n.name}:{}})}function tr(e){let n=js(e,Du(".red","config.yaml"));if(n==null)return{};let t;try{t=ju(n,"utf8")}catch{return{}}let r=Os(t),o=Is(Is(n));return{...r===void 0?{}:{name:r},configText:t,root:o}}function nr(e,n){try{let t=Pu("git",[...n],{cwd:e,encoding:"utf8",stdio:["ignore","pipe","ignore"],timeout:Ou}).trim();return t===""?void 0:t}catch{return}}import{randomUUID as pa}from"node:crypto";import{spawn as lh}from"node:child_process";import{mkdir as ah,rm as dh}from"node:fs/promises";import{dirname as ch}from"node:path";import{createHash as Iu}from"node:crypto";import{constants as lr}from"node:fs";import{mkdir as Tu,open as Nu}from"node:fs/promises";import{createConnection as Wu}from"node:net";import{tmpdir as Mu}from"node:os";import{dirname as Cu,join as sn}from"node:path";var $u="toon";function Ms(e){return e.trimStart().startsWith("{")?"json":"toon"}function or(e){let n=0;for(;e[n]===`
|
|
45
|
+
`||e[n]==="\r";)n+=1;let t=e.slice(n);if(t==="")return null;let r=Ms(t);if(r==="json"){let s=t.indexOf(`
|
|
46
46
|
`);return s<0?null:{frame:t.slice(0,s),dialect:r,rest:t.slice(s+1)}}let o=t.indexOf(`
|
|
47
47
|
|
|
48
|
-
`);return o<0?null:{frame:t.slice(0,o+1),dialect:r,rest:t.slice(o+2)}}function
|
|
48
|
+
`);return o<0?null:{frame:t.slice(0,o+1),dialect:r,rest:t.slice(o+2)}}function sr(e){let n=Ms(e)==="json"?rr:Ns,t=n===rr?Ns:rr;try{return n(e)}catch(r){try{return t(e)}catch{throw r}}}function rr(e){return JSON.parse(e)}function Ns(e){return G(e)}function ir(e,n){if(n==="toon"){let t=Au(e);if(t!==null)return t.endsWith(`
|
|
49
49
|
`)?`${t}
|
|
50
50
|
`:`${t}
|
|
51
51
|
|
|
52
52
|
`}return`${JSON.stringify(e)}
|
|
53
|
-
`}function wu(e){try{let n=JSON.stringify(e);if(n===void 0)return null;let t=I(JSON.parse(n));return t.trim()===""?null:t}catch{return null}}function Is(e,n){return!As(e)||!As(n)||n.ok!==!1?!1:typeof e.id=="string"&&typeof n.id=="string"&&n.id!==e.id}function As(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}var Ts=new Set;function Ns(e){return Ts.has(e)?"json":bu}function Ws(e){Ts.add(e)}var ju=108;async function Wn(e,n,t="resident server"){let r=e.wire,o=r??Ns(e.socketPath),s=await Cs(e,n,t,o);return r||o==="json"||!Is(n,s)?s:(Ws(e.socketPath),await Cs(e,n,t,"json"))}async function Cs(e,n,t,r){let o=e.timeoutMs??1e3;return await new Promise((s,i)=>{let l=Su(e.socketPath),a=!1,c="",u=setTimeout(()=>{p(()=>i(new Error(`${t} timed out`))),l.destroy()},o);function p(f){a||(a=!0,clearTimeout(u),f())}l.on("connect",()=>{l.write(tr(n,r))}),l.on("data",f=>{c+=f.toString("utf8");let h=er(c);h&&(c=h.rest,p(()=>{try{s(nr(h.frame))}catch(k){i(k)}}),l.end())}),l.on("error",f=>p(()=>i(f))),l.on("close",()=>{a||p(()=>i(new Error(`${t} closed without response`)))})})}function Ms(e,n,t){let r="";e.setEncoding("utf8"),e.on("error",()=>{}),e.on("data",o=>{r+=o;let s=er(r);if(!s)return;r=s.rest,e.pause();let i=l=>{if(!(e.destroyed||!e.writable))try{e.write(tr(l,s.dialect))}catch{}};(async()=>{let l;try{l=nr(s.frame),await n(l,i)}catch(a){t(a,l,i)}finally{e.end()}})()})}async function Fs(e){await vu(Pu(e),{recursive:!0,mode:448});try{return await xu(e,rr.O_CREAT|rr.O_EXCL|rr.O_RDWR)}catch(n){if(n.code!=="EEXIST")throw n;return null}}function W(e){if(!Number.isInteger(e)||e<=0)return!1;try{return process.kill(e,0),!0}catch(n){return n.code==="EPERM"}}var Du="/tmp";function Cn(e){let n=e.env??process.env,t=_u("sha256").update(e.key).digest("hex").slice(0,20),r=a=>sn(a,e.socketFileName).length<ju,o=n.XDG_RUNTIME_DIR;if(o){let a=sn(o,"red-skills",t);if(r(a))return a}let s=e.uid??(typeof process.getuid=="function"?process.getuid():"nouid"),i=sn(`red-skills-${s}`,t),l=sn(Eu(),i);return r(l)||process.platform==="win32"?l:sn(Du,i)}re();import{homedir as Zu}from"node:os";import{join as ur}from"node:path";import{spawnSync as Xu}from"node:child_process";import{createHash as ep}from"node:crypto";import{existsSync as np}from"node:fs";import{mkdir as qs,readFile as tp,writeFile as rp}from"node:fs/promises";import{dirname as op}from"node:path";var dn="@reddb-io/red-skills",Fu="https://registry.npmjs.org",Hu="canary",Ae=class extends Error{kind;cause;constructor(n,t,r){super(t),this.name="BundleFetchError",this.kind=n,this.cause=r}};function Uu(e,n,t="stable"){return`${e}-${t==="canary"?"canary":n}.bundle.min.mjs`}function Un(e){let{plugin:n,version:t,cacheDir:r,channel:o}=e;return Bn(r,Uu(n,t,o))}function Bu(e){return e==="dev"?["rsp"]:[]}function Vu(e){return`${e}.bundle.min.mjs`}function Ku(e){return Bn("dist",Vu(e))}function Ju(e,n="stable"){return`${dn}@${n==="canary"?Hu:e}`}function qu(e=dn){return`${Fu}/${e.replace("/","%2F")}`}async function cr(e,n){let{plugin:t,version:r,cacheDir:o,channel:s="stable"}=n,i=Un({plugin:t,version:r,cacheDir:o,channel:s}),l=Bu(t),a=l.map(f=>Un({plugin:f,version:r,cacheDir:o,channel:s}));if(s!=="canary"&&await e.exists(i)&&await Gu(e,a))return i;let c=Ju(r,s),u=Bn(o,`.staging-${t}-${s==="canary"?"canary":r}`),p;try{p=await e.materialize(c,u)}catch(f){throw Js(f,c)}for(let f of[t,...l]){let h=Ku(f),k=Bn(p,h);if(!await e.exists(k))throw new Ae("bundle-missing",`npm package ${c} has no ${h}`);let b=f===t?i:Un({plugin:f,version:r,cacheDir:o,channel:s});await e.writeFile(b,await e.readFile(k))}return i}async function Gu(e,n){for(let t of n)if(!await e.exists(t))return!1;return!0}async function Vs(e,n,t=dn){let r;try{r=await e.fetchText(qu(t))}catch(s){throw Js(s,t)}let o=zu(r);return{sameMajor:Qu(o,n),newest:Yu(o)}}function zu(e){let n;try{n=JSON.parse(e)}catch{return[]}if(typeof n!="object"||n===null)return[];let t=n.versions;return typeof t!="object"||t===null?[]:Object.keys(t)}function Qu(e,n){let t=dr(n);if(t===null)return null;let r=null;for(let o of e)dr(o)===t&&(r===null||Ks(o,r)>0)&&(r=o);return r}function Yu(e){let n=null;for(let t of e){let r=String(t).trim();dr(r)===null||/^\d+\.\d+\.\d+[-+]/.test(r)||(n===null||Ks(r,n)>0)&&(n=r)}return n}function dr(e){let n=/^(\d+)\.(\d+)\.(\d+)/.exec(String(e).trim());return n?Number(n[1]):null}function Ks(e,n){let t=/^(\d+)\.(\d+)\.(\d+)/.exec(e.trim()),r=/^(\d+)\.(\d+)\.(\d+)/.exec(n.trim());return!t||!r?0:Number(t[1])-Number(r[1])||Number(t[2])-Number(r[2])||Number(t[3])-Number(r[3])}function Js(e,n){let t=e instanceof Error?e.message:String(e);return/ENOENT|command not found|spawn npm/i.test(t)?new Ae("npm-unavailable",`npm is unavailable while resolving ${n}: ${t}`,e):/\b404\b|E404|not found|no matching version|notarget/i.test(t)?new Ae("package-missing",`npm could not resolve ${n}: ${t}`,e):new Ae("network",`failed to resolve ${n}: ${t}`,e)}function Bn(e,n){return e.endsWith("/")?`${e}${n}`:`${e}/${n}`}re();var sp={async materialize(e,n){await qs(n,{recursive:!0});let t=Xu("npm",["install",e,"--prefix",n,"--no-save","--no-audit","--no-fund","--ignore-scripts","--loglevel=error"],{stdio:["ignore","ignore","pipe"],encoding:"utf8"});if(t.error)throw t.error;if(t.status!==0)throw new Error(`npm install ${e} -> ${t.status}: ${(t.stderr||"").trim()}`);return ur(n,"node_modules",...dn.split("/"))},async readFile(e){return new Uint8Array(await tp(e))},async writeFile(e,n){await qs(op(e),{recursive:!0}),await rp(e,n)},async exists(e){return np(e)},sha256(e){return ep("sha256").update(e).digest("hex")},async fetchText(e){let n=await fetch(e,{redirect:"follow"});if(!n.ok)throw new Error(`GET ${e} -> ${n.status}`);return await n.text()}},ip="redskilled";function lp(e=process.env){if(e.RED_SKILLS_CACHE_DIR)return e.RED_SKILLS_CACHE_DIR;let n=e.XDG_CACHE_HOME||ur(e.HOME||Zu(),".cache");return ur(n,"red-skills","bundles")}async function ap(e={},n={},t={}){let r=ue(e,n);if(Y(r))return r;let o=t.env??n.env??process.env;try{await cr(t.bundleIO??sp,{plugin:ip,version:t.version??"",cacheDir:lp(o)})}catch{return r}return ue(e,n)}async function Gs(e={},n={},t={}){let r=await ap(e,n,t);if(Y(r))return r;let{RedskilledDaemonEntryError:o}=await Promise.resolve().then(()=>(re(),Bs));throw new o(r)}import{randomUUID as rt}from"node:crypto";import{mkdir as Mg,rm as Xl}from"node:fs/promises";import{createServer as Fg}from"node:net";import{dirname as Hg}from"node:path";import{totalmem as dp}from"node:os";function zs(e){let n=0,t=0,r=0,o=[],s=[];for(let i of e){let l=i.budget??{},a=!1;for(let[c,u]of[[l.memory_high,p=>n+=p],[l.memory_max,p=>t+=p]]){if(c==null)continue;let p=Le(c);p==null?a=!0:u(p)}l.cpu_weight!=null&&(r+=l.cpu_weight),a&&o.push(i.worker_id),i.isolated||s.push(i.worker_id)}return{version:1,worker_count:e.length,memory_high_bytes:n,memory_max_bytes:t,cpu_weight_total:r,unaccounted_workers:o.sort(),unisolated_workers:s.sort()}}function Le(e){let n=/^\s*(\d+(?:\.\d+)?)\s*([KMGT]?)(?:B)?\s*$/i.exec(e);if(!n)return null;let t={"":1,k:1024,m:1024**2,g:1024**3,t:1024**4}[n[2].toLowerCase()];return Math.round(Number(n[1])*t)}function Qs(e){if(e===null||typeof e!="object"||Array.isArray(e))return!1;let n=e;return n.version===1&&Number.isInteger(n.worker_count)&&typeof n.memory_high_bytes=="number"&&typeof n.memory_max_bytes=="number"&&typeof n.cpu_weight_total=="number"&&Array.isArray(n.unaccounted_workers)&&Array.isArray(n.unisolated_workers)}var cp="REDSKILLED_MEMORY_CEILING",up="REDSKILLED_WORKER_CEILING",pp=.7;function Ys(e){let n=e?.memory_max??e?.memory_high;if(n!=null)return Le(n)}function Vn(e){let n=0,t=[];for(let r of e){let o=Ys(r.budget);o===null?t.push(r.worker_id):o!==void 0&&(n+=o)}return{worker_count:e.length,memory_bytes:n,unaccounted_workers:t.sort()}}function Zs(e){let{ceiling:n}=e,t=Vn(e.workers),r=Ys(e.budget),o=r===void 0?null:r,s=t.memory_bytes+(r??0),i=t.worker_count+1,l=e.projectLabel!=null&&e.projectLabel!==""?` for project ${JSON.stringify(e.projectLabel)}`:"",a=`the host is already holding ${t.memory_bytes} bytes across ${t.worker_count} Worker(s)`,c=(u,p)=>({version:1,admitted:!1,verdict:u,reason:p,ceiling:n,consumption:t,requested_memory_bytes:o,projected_worker_count:i,projected_memory_bytes:s});return n.worker_count!=null&&i>n.worker_count?c("refused-over-worker-ceiling",`redskilled refused this Worker${l}: it would be Worker ${i} past a host ceiling of ${n.worker_count} Worker(s), and ${a}`):n.memory_bytes!=null&&r===null?c("refused-unaccountable-budget",`redskilled refused this Worker${l}: its declared memory budget cannot be reduced to bytes, so it cannot be proven to fit under the host ceiling of ${n.memory_bytes} bytes, and ${a}`):n.memory_bytes!=null&&s>n.memory_bytes?c("refused-over-memory-ceiling",`redskilled refused this Worker${l}: it would take the host to ${s} bytes of declared Worker memory, past the host ceiling of ${n.memory_bytes} bytes, and ${a}`):{version:1,admitted:!0,verdict:"admitted",reason:`redskilled admitted this Worker${l}: ${s} bytes of declared Worker memory against a host ceiling of ${n.memory_bytes??"unbounded"} bytes, and ${a}`,ceiling:n,consumption:t,requested_memory_bytes:o,projected_worker_count:i,projected_memory_bytes:s}}function Xs(e){let n=e.budget?.memory_max??e.budget?.memory_high;if(n!=null)return{memory_max:n,reason:`the client declared this Worker's memory ceiling (${n}), so the host derived none`};if(e.ceiling.memory_bytes==null)return{memory_max:null,reason:"this host admits Workers against no memory ceiling, so there is no accounting to derive a per-Worker ceiling from; the daemon's RSS sampling floor is the only remaining ceiling"};let t=Vn(e.workers),r=e.ceiling.memory_bytes-t.memory_bytes,o=e.ceiling.worker_count,s=o==null?r:Math.floor(e.ceiling.memory_bytes/o),i=Math.min(r,s);if(i<=0)return{memory_max:null,reason:`this host's memory ceiling of ${e.ceiling.memory_bytes} bytes is already fully committed to ${t.worker_count} Worker(s), so no positive per-Worker ceiling can be derived; the daemon's RSS sampling floor is the only remaining ceiling`};let l=o==null?`the headroom under this host's memory ceiling of ${e.ceiling.memory_bytes} bytes`:`this host's memory ceiling of ${e.ceiling.memory_bytes} bytes shared across its ${o} Worker slot(s)`;return{memory_max:String(i),reason:`derived from ${l} (ceiling source: ${e.ceiling.source})`}}function ei(e=process.env,n=dp()){let t=(e[cp]??"").trim(),r=(e[up]??"").trim(),o=mp(r);if(t!==""){let s=fp(t,n);if(s!==void 0)return{memory_bytes:s,worker_count:o,source:"declared"}}return{memory_bytes:Math.floor(n*pp),worker_count:o,source:r!==""?"declared":"host-fraction"}}function fp(e,n){let t=e.toLowerCase();if(["infinity","none","off","unbounded"].includes(t))return null;let r=/^(\d+(?:\.\d+)?)\s*%$/.exec(e);return r?Math.floor(n*(Number(r[1])/100)):Le(e)??void 0}function mp(e){if(e===""||["infinity","none","off","unbounded"].includes(e.toLowerCase()))return null;let n=Number(e);return Number.isSafeInteger(n)&&n>0?n:null}import{appendFile as gp,mkdir as hp,open as yp,readFile as kp,stat as Rp,truncate as ni}from"node:fs/promises";import{dirname as bp}from"node:path";var ti="redskilled.events.toonl";function wp(e){let n=e.worker.budget??{};return{version:1,ts:e.ts,event:e.event,worker_id:e.worker.worker_id,project_label:e.worker.project_label,pid:e.worker.pid,workspace_path:e.worker.workspace_path,log_path:e.worker.log_path??null,isolated:e.worker.isolated,unit:e.worker.unit??null,memory_high:n.memory_high??null,memory_max:n.memory_max??null,cpu_weight:n.cpu_weight??null,detail:e.detail??null,exit_code:e.exitCode??null,signal:e.signal??null,reason:e.reason??null}}var _p="daemon:";function vp(e){return{version:1,ts:e.ts,event:"daemon-stop",worker_id:`${_p}${e.pid}`,project_label:"",pid:e.pid,workspace_path:e.socketPath,log_path:null,isolated:!1,unit:null,memory_high:null,memory_max:null,cpu_weight:null,detail:e.detail,exit_code:null,signal:e.signal??null,reason:e.reason}}function ri(e){let n=te({trailer:!1}),t=Promise.resolve();async function r(o){let s=t.then(async()=>{await hp(bp(e),{recursive:!0,mode:448}),await xp(e),await gp(e,n.push(jp(o)),{encoding:"utf8",mode:384})});return t=s.catch(()=>{}),await s,o}return{path:e,record:o=>r(wp(o)),recordDaemonStop:o=>r(vp(o)),read:()=>Sp(e),flush:async()=>{await t}}}async function xp(e){let n;try{n=(await Rp(e)).size}catch(o){if(o.code==="ENOENT")return;throw o}if(n===0)return;let t=64*1024,r=await yp(e,"r");try{let o=Buffer.alloc(1);if(await r.read(o,0,1,n-1),o[0]===10)return;for(let s=n;s>0;s-=t){let i=Math.min(t,s),l=Buffer.alloc(i);await r.read(l,0,i,s-i);let a=l.lastIndexOf(10);if(a>=0){await ni(e,s-i+a+1);return}}await ni(e,0)}finally{await r.close()}}async function Sp(e){let n;try{n=await kp(e,"utf8")}catch(t){if(t.code==="ENOENT")return[];throw t}return Ep(n)}function Ep(e){let n=e.split(`
|
|
53
|
+
`}function Au(e){try{let n=JSON.stringify(e);if(n===void 0)return null;let t=I(JSON.parse(n));return t.trim()===""?null:t}catch{return null}}function Cs(e,n){return!Ws(e)||!Ws(n)||n.ok!==!1?!1:typeof e.id=="string"&&typeof n.id=="string"&&n.id!==e.id}function Ws(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}var Fs=new Set;function Hs(e){return Fs.has(e)?"json":$u}function Us(e){Fs.add(e)}var Fu=108;async function Cn(e,n,t="resident server"){let r=e.wire,o=r??Hs(e.socketPath),s=await Vs(e,n,t,o);return r||o==="json"||!Cs(n,s)?s:(Us(e.socketPath),await Vs(e,n,t,"json"))}async function Vs(e,n,t,r){let o=e.timeoutMs??1e3;return await new Promise((s,i)=>{let l=Wu(e.socketPath),a=!1,d="",u=setTimeout(()=>{p(()=>i(new Error(`${t} timed out`))),l.destroy()},o);function p(m){a||(a=!0,clearTimeout(u),m())}l.on("connect",()=>{l.write(ir(n,r))}),l.on("data",m=>{d+=m.toString("utf8");let h=or(d);h&&(d=h.rest,p(()=>{try{s(sr(h.frame))}catch(y){i(y)}}),l.end())}),l.on("error",m=>p(()=>i(m))),l.on("close",()=>{a||p(()=>i(new Error(`${t} closed without response`)))})})}function Bs(e,n,t){let r="";e.setEncoding("utf8"),e.on("error",()=>{}),e.on("data",o=>{r+=o;let s=or(r);if(!s)return;r=s.rest,e.pause();let i=l=>{if(!(e.destroyed||!e.writable))try{e.write(ir(l,s.dialect))}catch{}};(async()=>{let l;try{l=sr(s.frame),await n(l,i)}catch(a){t(a,l,i)}finally{e.end()}})()})}async function Ks(e){await Tu(Cu(e),{recursive:!0,mode:448});try{return await Nu(e,lr.O_CREAT|lr.O_EXCL|lr.O_RDWR)}catch(n){if(n.code!=="EEXIST")throw n;return null}}function W(e){if(!Number.isInteger(e)||e<=0)return!1;try{return process.kill(e,0),!0}catch(n){return n.code==="EPERM"}}var Hu="/tmp";function Fn(e){let n=e.env??process.env,t=Iu("sha256").update(e.key).digest("hex").slice(0,20),r=a=>sn(a,e.socketFileName).length<Fu,o=n.XDG_RUNTIME_DIR;if(o){let a=sn(o,"red-skills",t);if(r(a))return a}let s=e.uid??(typeof process.getuid=="function"?process.getuid():"nouid"),i=sn(`red-skills-${s}`,t),l=sn(Mu(),i);return r(l)||process.platform==="win32"?l:sn(Hu,i)}re();import{homedir as cp}from"node:os";import{join as gr}from"node:path";import{spawnSync as up}from"node:child_process";import{createHash as pp}from"node:crypto";import{existsSync as mp}from"node:fs";import{mkdir as Zs,readFile as fp,writeFile as gp}from"node:fs/promises";import{dirname as hp}from"node:path";var dn="@reddb-io/red-skills",Zu="https://registry.npmjs.org",Xu="canary",$e=class extends Error{kind;cause;constructor(n,t,r){super(t),this.name="BundleFetchError",this.kind=n,this.cause=r}};function ep(e,n,t="stable"){return`${e}-${t==="canary"?"canary":n}.bundle.min.mjs`}function Bn(e){let{plugin:n,version:t,cacheDir:r,channel:o}=e;return Kn(r,ep(n,t,o))}function np(e){return e==="dev"?["rsp"]:[]}function tp(e){return`${e}.bundle.min.mjs`}function rp(e){return Kn("dist",tp(e))}function op(e,n="stable"){return`${dn}@${n==="canary"?Xu:e}`}function sp(e=dn){return`${Zu}/${e.replace("/","%2F")}`}async function fr(e,n){let{plugin:t,version:r,cacheDir:o,channel:s="stable"}=n,i=Bn({plugin:t,version:r,cacheDir:o,channel:s}),l=np(t),a=l.map(m=>Bn({plugin:m,version:r,cacheDir:o,channel:s}));if(s!=="canary"&&await e.exists(i)&&await ip(e,a))return i;let d=op(r,s),u=Kn(o,`.staging-${t}-${s==="canary"?"canary":r}`),p;try{p=await e.materialize(d,u)}catch(m){throw Ys(m,d)}for(let m of[t,...l]){let h=rp(m),y=Kn(p,h);if(!await e.exists(y))throw new $e("bundle-missing",`npm package ${d} has no ${h}`);let b=m===t?i:Bn({plugin:m,version:r,cacheDir:o,channel:s});await e.writeFile(b,await e.readFile(y))}return i}async function ip(e,n){for(let t of n)if(!await e.exists(t))return!1;return!0}async function zs(e,n,t=dn){let r;try{r=await e.fetchText(sp(t))}catch(s){throw Ys(s,t)}let o=lp(r);return{sameMajor:ap(o,n),newest:dp(o)}}function lp(e){let n;try{n=JSON.parse(e)}catch{return[]}if(typeof n!="object"||n===null)return[];let t=n.versions;return typeof t!="object"||t===null?[]:Object.keys(t)}function ap(e,n){let t=mr(n);if(t===null)return null;let r=null;for(let o of e)mr(o)===t&&(r===null||Qs(o,r)>0)&&(r=o);return r}function dp(e){let n=null;for(let t of e){let r=String(t).trim();mr(r)===null||/^\d+\.\d+\.\d+[-+]/.test(r)||(n===null||Qs(r,n)>0)&&(n=r)}return n}function mr(e){let n=/^(\d+)\.(\d+)\.(\d+)/.exec(String(e).trim());return n?Number(n[1]):null}function Qs(e,n){let t=/^(\d+)\.(\d+)\.(\d+)/.exec(e.trim()),r=/^(\d+)\.(\d+)\.(\d+)/.exec(n.trim());return!t||!r?0:Number(t[1])-Number(r[1])||Number(t[2])-Number(r[2])||Number(t[3])-Number(r[3])}function Ys(e,n){let t=e instanceof Error?e.message:String(e);return/ENOENT|command not found|spawn npm/i.test(t)?new $e("npm-unavailable",`npm is unavailable while resolving ${n}: ${t}`,e):/\b404\b|E404|not found|no matching version|notarget/i.test(t)?new $e("package-missing",`npm could not resolve ${n}: ${t}`,e):new $e("network",`failed to resolve ${n}: ${t}`,e)}function Kn(e,n){return e.endsWith("/")?`${e}${n}`:`${e}/${n}`}re();var yp={async materialize(e,n){await Zs(n,{recursive:!0});let t=up("npm",["install",e,"--prefix",n,"--no-save","--no-audit","--no-fund","--ignore-scripts","--loglevel=error"],{stdio:["ignore","ignore","pipe"],encoding:"utf8"});if(t.error)throw t.error;if(t.status!==0)throw new Error(`npm install ${e} -> ${t.status}: ${(t.stderr||"").trim()}`);return gr(n,"node_modules",...dn.split("/"))},async readFile(e){return new Uint8Array(await fp(e))},async writeFile(e,n){await Zs(hp(e),{recursive:!0}),await gp(e,n)},async exists(e){return mp(e)},sha256(e){return pp("sha256").update(e).digest("hex")},async fetchText(e){let n=await fetch(e,{redirect:"follow"});if(!n.ok)throw new Error(`GET ${e} -> ${n.status}`);return await n.text()}},kp="redskilled";function Rp(e=process.env){if(e.RED_SKILLS_CACHE_DIR)return e.RED_SKILLS_CACHE_DIR;let n=e.XDG_CACHE_HOME||gr(e.HOME||cp(),".cache");return gr(n,"red-skills","bundles")}async function bp(e={},n={},t={}){let r=ue(e,n);if(Y(r))return r;let o=t.env??n.env??process.env;try{await fr(t.bundleIO??yp,{plugin:kp,version:t.version??"",cacheDir:Rp(o)})}catch{return r}return ue(e,n)}async function Xs(e={},n={},t={}){let r=await bp(e,n,t);if(Y(r))return r;let{RedskilledDaemonEntryError:o}=await Promise.resolve().then(()=>(re(),Gs));throw new o(r)}import{randomUUID as it}from"node:crypto";import{mkdir as Zg,rm as da}from"node:fs/promises";import{createServer as Xg}from"node:net";import{dirname as eh}from"node:path";import{totalmem as _p}from"node:os";function ei(e){let n=0,t=0,r=0,o=[],s=[];for(let i of e){let l=i.budget??{},a=!1;for(let[d,u]of[[l.memory_high,p=>n+=p],[l.memory_max,p=>t+=p]]){if(d==null)continue;let p=Ae(d);p==null?a=!0:u(p)}l.cpu_weight!=null&&(r+=l.cpu_weight),a&&o.push(i.worker_id),i.isolated||s.push(i.worker_id)}return{version:1,worker_count:e.length,memory_high_bytes:n,memory_max_bytes:t,cpu_weight_total:r,unaccounted_workers:o.sort(),unisolated_workers:s.sort()}}function Ae(e){let n=/^\s*(\d+(?:\.\d+)?)\s*([KMGT]?)(?:B)?\s*$/i.exec(e);if(!n)return null;let t={"":1,k:1024,m:1024**2,g:1024**3,t:1024**4}[n[2].toLowerCase()];return Math.round(Number(n[1])*t)}function ni(e){if(e===null||typeof e!="object"||Array.isArray(e))return!1;let n=e;return n.version===1&&Number.isInteger(n.worker_count)&&typeof n.memory_high_bytes=="number"&&typeof n.memory_max_bytes=="number"&&typeof n.cpu_weight_total=="number"&&Array.isArray(n.unaccounted_workers)&&Array.isArray(n.unisolated_workers)}var wp="REDSKILLED_MEMORY_CEILING",vp="REDSKILLED_WORKER_CEILING",Sp=.7;function ti(e){let n=e?.memory_max??e?.memory_high;if(n!=null)return Ae(n)}function Jn(e){let n=0,t=[];for(let r of e){let o=ti(r.budget);o===null?t.push(r.worker_id):o!==void 0&&(n+=o)}return{worker_count:e.length,memory_bytes:n,unaccounted_workers:t.sort()}}function ri(e){let{ceiling:n}=e,t=Jn(e.workers),r=ti(e.budget),o=r===void 0?null:r,s=t.memory_bytes+(r??0),i=t.worker_count+1,l=e.projectLabel!=null&&e.projectLabel!==""?` for project ${JSON.stringify(e.projectLabel)}`:"",a=`the host is already holding ${t.memory_bytes} bytes across ${t.worker_count} Worker(s)`,d=(u,p)=>({version:1,admitted:!1,verdict:u,reason:p,ceiling:n,consumption:t,requested_memory_bytes:o,projected_worker_count:i,projected_memory_bytes:s});return n.worker_count!=null&&i>n.worker_count?d("refused-over-worker-ceiling",`redskilled refused this Worker${l}: it would be Worker ${i} past a host ceiling of ${n.worker_count} Worker(s), and ${a}`):n.memory_bytes!=null&&r===null?d("refused-unaccountable-budget",`redskilled refused this Worker${l}: its declared memory budget cannot be reduced to bytes, so it cannot be proven to fit under the host ceiling of ${n.memory_bytes} bytes, and ${a}`):n.memory_bytes!=null&&s>n.memory_bytes?d("refused-over-memory-ceiling",`redskilled refused this Worker${l}: it would take the host to ${s} bytes of declared Worker memory, past the host ceiling of ${n.memory_bytes} bytes, and ${a}`):{version:1,admitted:!0,verdict:"admitted",reason:`redskilled admitted this Worker${l}: ${s} bytes of declared Worker memory against a host ceiling of ${n.memory_bytes??"unbounded"} bytes, and ${a}`,ceiling:n,consumption:t,requested_memory_bytes:o,projected_worker_count:i,projected_memory_bytes:s}}function oi(e){let n=e.budget?.memory_max??e.budget?.memory_high;if(n!=null)return{memory_max:n,reason:`the client declared this Worker's memory ceiling (${n}), so the host derived none`};if(e.ceiling.memory_bytes==null)return{memory_max:null,reason:"this host admits Workers against no memory ceiling, so there is no accounting to derive a per-Worker ceiling from; the daemon's RSS sampling floor is the only remaining ceiling"};let t=Jn(e.workers),r=e.ceiling.memory_bytes-t.memory_bytes,o=e.ceiling.worker_count,s=o==null?r:Math.floor(e.ceiling.memory_bytes/o),i=Math.min(r,s);if(i<=0)return{memory_max:null,reason:`this host's memory ceiling of ${e.ceiling.memory_bytes} bytes is already fully committed to ${t.worker_count} Worker(s), so no positive per-Worker ceiling can be derived; the daemon's RSS sampling floor is the only remaining ceiling`};let l=o==null?`the headroom under this host's memory ceiling of ${e.ceiling.memory_bytes} bytes`:`this host's memory ceiling of ${e.ceiling.memory_bytes} bytes shared across its ${o} Worker slot(s)`;return{memory_max:String(i),reason:`derived from ${l} (ceiling source: ${e.ceiling.source})`}}function si(e=process.env,n=_p()){let t=(e[wp]??"").trim(),r=(e[vp]??"").trim(),o=Ep(r);if(t!==""){let s=xp(t,n);if(s!==void 0)return{memory_bytes:s,worker_count:o,source:"declared"}}return{memory_bytes:Math.floor(n*Sp),worker_count:o,source:r!==""?"declared":"host-fraction"}}function xp(e,n){let t=e.toLowerCase();if(["infinity","none","off","unbounded"].includes(t))return null;let r=/^(\d+(?:\.\d+)?)\s*%$/.exec(e);return r?Math.floor(n*(Number(r[1])/100)):Ae(e)??void 0}function Ep(e){if(e===""||["infinity","none","off","unbounded"].includes(e.toLowerCase()))return null;let n=Number(e);return Number.isSafeInteger(n)&&n>0?n:null}import{appendFile as Pp,mkdir as jp,open as Dp,readFile as Op,stat as Lp,truncate as ii}from"node:fs/promises";import{dirname as $p}from"node:path";var li="redskilled.events.toonl";function Ap(e){let n=e.worker.budget??{};return{version:1,ts:e.ts,event:e.event,worker_id:e.worker.worker_id,project_label:e.worker.project_label,pid:e.worker.pid,workspace_path:e.worker.workspace_path,log_path:e.worker.log_path??null,isolated:e.worker.isolated,unit:e.worker.unit??null,memory_high:n.memory_high??null,memory_max:n.memory_max??null,cpu_weight:n.cpu_weight??null,detail:e.detail??null,exit_code:e.exitCode??null,signal:e.signal??null,reason:e.reason??null}}var Ip="daemon:";function Tp(e){return{version:1,ts:e.ts,event:"daemon-stop",worker_id:`${Ip}${e.pid}`,project_label:"",pid:e.pid,workspace_path:e.socketPath,log_path:null,isolated:!1,unit:null,memory_high:null,memory_max:null,cpu_weight:null,detail:e.detail,exit_code:null,signal:e.signal??null,reason:e.reason}}function ai(e){let n=te({trailer:!1}),t=Promise.resolve();async function r(o){let s=t.then(async()=>{await jp($p(e),{recursive:!0,mode:448}),await Np(e),await Pp(e,n.push(Fp(o)),{encoding:"utf8",mode:384})});return t=s.catch(()=>{}),await s,o}return{path:e,record:o=>r(Ap(o)),recordDaemonStop:o=>r(Tp(o)),read:()=>Wp(e),flush:async()=>{await t}}}async function Np(e){let n;try{n=(await Lp(e)).size}catch(o){if(o.code==="ENOENT")return;throw o}if(n===0)return;let t=64*1024,r=await Dp(e,"r");try{let o=Buffer.alloc(1);if(await r.read(o,0,1,n-1),o[0]===10)return;for(let s=n;s>0;s-=t){let i=Math.min(t,s),l=Buffer.alloc(i);await r.read(l,0,i,s-i);let a=l.lastIndexOf(10);if(a>=0){await ii(e,s-i+a+1);return}}await ii(e,0)}finally{await r.close()}}async function Wp(e){let n;try{n=await Op(e,"utf8")}catch(t){if(t.code==="ENOENT")return[];throw t}return Mp(n)}function Mp(e){let n=e.split(`
|
|
54
54
|
`);return n.pop(),n.length===0?[]:de(`${n.join(`
|
|
55
55
|
`)}
|
|
56
|
-
`).filter(
|
|
57
|
-
`}function Kp(e){let n=e.trim();if(!n)return null;try{return JSON.parse(n)}catch{try{return G(n)}catch{return null}}}function Jp(e){if(e===null||typeof e!="object"||Array.isArray(e))return!1;let n=e;if(n.version!==1||n.scope!=="machine"||!Number.isInteger(n.pid)||n.pid<=0||!Number.isInteger(n.uid))return!1;for(let t of["start_time","machine_id_hash","session_key_hash","socket_path","acquired_at","renewed_at"])if(typeof n[t]!="string"||n[t].length===0)return!1;return!0}function mr(e,n){if(!Array.isArray(e)||e.length===0)throw new Error(`redskilled needs an argv to register project ${JSON.stringify(n)}: a registration with nothing to run is a project the host could never start a Worker for`);return e.map((t,r)=>{if(typeof t!="string"||t==="")throw new Error(`redskilled needs every word of an argv to be a non-empty string, and word ${r} of project ${JSON.stringify(n)} is not`);return t})}function gr(e,n){if(e==null)return{};if(typeof e!="object"||Array.isArray(e))throw new Error(`redskilled needs a launch env to be a map of strings to register project ${JSON.stringify(n)}, not ${JSON.stringify(e)}`);let t={};for(let[r,o]of Object.entries(e)){if(r==="")throw new Error(`redskilled needs every launch env name of project ${JSON.stringify(n)} to be named`);if(typeof o!="string")throw new Error(`redskilled needs every launch env value to be a string, and ${JSON.stringify(r)} of project ${JSON.stringify(n)} is ${JSON.stringify(o)}`);t[r]=o}return t}var qp=3e5,Gp=.5,yr=class extends Error{constructor(t){super(`redskilled already holds a registration for project ${JSON.stringify(t.project_label)}, registered at ${t.registered_at} for a target of ${t.target} and standing until ${t.renew_by}: a project contributes one registration, so a second one is refused rather than silently replacing the first`);this.held=t;this.name="RedskilledProjectRegisteredError"}};function ki(e,n){if(n.held!=null)throw new yr(n.held);let t=hr(e.project_label,"a project label"),r=hr(e.selector,"a selector"),o=mr(e.argv,t),s=gr(e.env,t),i=hr(e.workspace_path,`a workspace path for project ${JSON.stringify(t)}`);if(!Number.isInteger(e.target)||e.target<0)throw new Error(`redskilled needs a whole, non-negative target to register project ${JSON.stringify(t)}, not ${JSON.stringify(e.target)}`);let l=e.renew_within_ms??qp;if(!Number.isFinite(l)||l<=0)throw new Error(`redskilled needs a positive renewal window to register project ${JSON.stringify(t)}, not ${JSON.stringify(e.renew_within_ms)}: a registration that lapses on arrival is a poll nobody asked for`);let a=Date.parse(n.now);if(!Number.isFinite(a))throw new Error(`redskilled needs an instant to date a registration, not ${JSON.stringify(n.now)}`);return{version:1,project_label:t,selector:r,argv:o,workspace_path:i,env:s,target:e.target,registered_at:new Date(a).toISOString(),renew_within_ms:l,renew_by:new Date(a+l).toISOString(),renewed_at:new Date(a).toISOString(),renewals:0,launch_revision:0}}var qn=class extends Error{constructor(t){super(`redskilled holds no registration for project ${JSON.stringify(t)} to renew: it lapsed or was never held, and a renewal never mints a record \u2014 register again, stating the selector, the argv and the target`);this.projectLabel=t;this.name="RedskilledProjectUnregisteredError"}};function Ri(e,n){let t=Date.parse(n.now);if(!Number.isFinite(t))throw new Error(`redskilled needs an instant to date a renewal, not ${JSON.stringify(n.now)}`);let r=n.renew_within_ms??e.renew_within_ms;if(!Number.isFinite(r)||r<=0)throw new Error(`redskilled needs a positive renewal window to renew project ${JSON.stringify(e.project_label)}, not ${JSON.stringify(n.renew_within_ms)}`);let o=n.launch==null?{env:e.env??{},launch_revision:e.launch_revision??0}:{argv:mr(n.launch.argv,e.project_label),env:gr(n.launch.env,e.project_label),launch_revision:(e.launch_revision??0)+1};return{...e,...o,renew_within_ms:r,renewed_at:new Date(t).toISOString(),renew_by:new Date(t+r).toISOString(),renewals:e.renewals+1}}function bi(e,n){let t=Date.parse(n.now);if(!Number.isFinite(t))throw new Error(`redskilled needs an instant to sustain a registration, not ${JSON.stringify(n.now)}`);let r=JSON.stringify(e.project_label),o=Math.max(0,n.liveWorkers??0),s=n.queue,i=s!=null&&s.outcome==="counted"?s.depth:null,l=i!=null&&i>0?"open-work":o>0?"live-worker":null;if(l==null){let a=i===0?"drained":"uncounted";return{registration:e,verdict:a,detail:a==="drained"?`project ${r} has nothing queued and no Worker running, so nothing holds its registration up and it lapses at ${e.renew_by}`:`no poll counted project ${r}, and an uncounted queue never sustains a registration \u2014 it stands on its own deadline of ${e.renew_by}`}}return{registration:{...e,renew_by:new Date(t+e.renew_within_ms).toISOString(),sustained_at:new Date(t).toISOString(),sustains:(e.sustains??0)+1,sustained_by:l},verdict:l,detail:l==="open-work"?`project ${r} has ${i} item(s) queued, so its registration stands past its window`:`project ${r} holds ${o} Worker(s), so its registration stands past its window`}}function zp(e,n){let t=Date.parse(e.renew_by);return Number.isFinite(t)?n>=t:!1}function wi(e,n){let t=Date.parse(e.renewed_at??e.registered_at),r=s=>Number.isFinite(s)&&n-s<=e.renew_within_ms*Gp;if(r(t))return"renewing";let o=e.sustained_at==null?Number.NaN:Date.parse(e.sustained_at);return r(o)?"self-renewing":"running-on"}function _i(e,n){let t=[],r=[];for(let o of e)(zp(o,n)?r:t).push(o);return{standing:t,lapsed:r}}function kr(e){if(e===null||typeof e!="object"||Array.isArray(e))return!1;let n=e;return n.version===1&&typeof n.project_label=="string"&&typeof n.selector=="string"&&Array.isArray(n.argv)&&n.argv.every(t=>typeof t=="string")&&typeof n.workspace_path=="string"&&Number.isInteger(n.target)&&typeof n.registered_at=="string"&&typeof n.renew_within_ms=="number"&&typeof n.renew_by=="string"&&(n.renewed_at===void 0||typeof n.renewed_at=="string")&&(n.renewals===void 0||Number.isInteger(n.renewals))&&(n.env===void 0||Qp(n.env))&&(n.launch_revision===void 0||Number.isInteger(n.launch_revision))&&(n.sustained_at===void 0||typeof n.sustained_at=="string")&&(n.sustains===void 0||Number.isInteger(n.sustains))&&(n.sustained_by===void 0||n.sustained_by==="open-work"||n.sustained_by==="live-worker")}function Qp(e){return e===null||typeof e!="object"||Array.isArray(e)?!1:Object.values(e).every(n=>typeof n=="string")}function hr(e,n){if(typeof e!="string"||e==="")throw new Error(`redskilled needs ${n} to register a project, not ${JSON.stringify(e)}`);return e}var Yp={ping:"host-read","host-state":"host-read","statusline-payload":"host-read",shutdown:"daemon-life","worker-start":"project-write","worker-stop":"project-write","worker-recycle":"project-write","worker-steer":"project-write","worker-heartbeat":"project-write","project-register":"project-write","project-renew":"project-write","project-deregister":"project-write"};function vi(e){return`worker-${e}`}function xi(e){let n=Yp[e.op]??"project-write",t=e.sessionProject??null,r=e.targetProject??null,o={version:1,op:e.op,reach:n,session_project:t,target_project:r};return n==="host-read"?{...o,permitted:!0,verdict:"permitted-host-read",reason:`redskilled permitted ${e.op}: a session reads the whole host, whichever project it was started in`}:n==="daemon-life"?{...o,permitted:!0,verdict:"permitted-daemon-life",reason:`redskilled permitted ${e.op}: it acts on the daemon's own process, not on any project's Workers`}:t==null||t===""?{...o,permitted:!0,verdict:"permitted-unattributed",reason:`redskilled permitted ${e.op}: the session named no project of its own, so there is nothing to refuse it against`}:r!=null&&r===t?{...o,permitted:!0,verdict:"permitted-own-project",reason:`redskilled permitted ${e.op}: the target belongs to project ${JSON.stringify(t)}, which is this session's own`}:{...o,permitted:!1,verdict:"refused-cross-project",reason:`redskilled refused ${e.op} from a session in project ${JSON.stringify(t)}: ${r==null?"it names no Worker of that project":`the target belongs to project ${JSON.stringify(r)}`}. A session reads the whole host and writes only its own project.`}}import{execFileSync as Zp}from"node:child_process";import{readFileSync as Xp,readdirSync as ef}from"node:fs";import{join as nf}from"node:path";function cn(e){let n=e.budget??{},t=[["MemoryMax",n.memory_max],["MemoryHigh",n.memory_high],["MemoryMax",e.memory_ceiling]];for(let[r,o]of t){if(o==null)continue;let s=Le(o);return s==null?null:{name:r,declared:o,bytes:s}}return null}function Si(e){let n=[],t=[];for(let r of e.workers){let o=cn(r);if(o==null){t.push({worker_id:r.worker_id,reason:(r.budget?.memory_max??r.budget?.memory_high??r.memory_ceiling)==null?"this Worker declared no memory budget and the host derived no ceiling for it, so the sampler has none to enforce":"this Worker's declared memory budget cannot be reduced to bytes, so the sampler has no ceiling to enforce"});continue}let s=e.rss[r.worker_id];if(typeof s!="number"||!Number.isFinite(s)){t.push({worker_id:r.worker_id,reason:"the host produced no RSS reading for this Worker on this tick, and an unmeasured Worker is never killed on suspicion"});continue}s<=o.bytes||n.push(tf(r,o,s))}return{terminations:n,unenforceable:t}}function tf(e,n,t){let r=`Worker ${JSON.stringify(e.worker_id)} of project ${JSON.stringify(e.project_label)}`;return{version:1,worker_id:e.worker_id,project_label:e.project_label,outcome:"terminated-over-memory-budget",classification:"budget-exceeded",stall:!1,budget_name:n.name,budget_declared:n.declared,budget_bytes:n.bytes,observed_rss_bytes:t,workspace_path:e.workspace_path,reason:`redskilled terminated ${r}: its tree RSS of ${t} bytes exceeded its ${n.name} budget of ${n.declared} (${n.bytes} bytes). This is a budget termination, not a stall, and the work in ${JSON.stringify(e.workspace_path)} is handed forward.`}}var rf=4096;function Ei(e,n={}){let t=n.platform??process.platform,r={rss:{},cpu_seconds:{}};if(e.length===0)return r;let o=of(t,n);if(o.size===0)return r;let s=new Map;for(let a of o.values()){let c=s.get(a.ppid);c?c.push(a.pid):s.set(a.ppid,[a.pid])}let i={},l={};for(let a of e){if(!o.has(a.pid))continue;let c=0,u=0,p=[a.pid],f=new Set;for(;p.length>0;){let h=p.pop();if(f.has(h))continue;f.add(h);let k=o.get(h);if(k){c+=k.rssBytes,u+=k.cpuSeconds;for(let b of s.get(h)??[])p.push(b)}}i[a.worker_id]=c,l[a.worker_id]=u}return{rss:i,cpu_seconds:l}}function of(e,n){return n.procRoot!=null||e==="linux"?uf(n.procRoot??"/proc"):n.psTable!=null||e==="darwin"?df(sf(n.psTable)):new Map}function sf(e){try{return(e??lf)()}catch{return""}}function lf(){return Zp("ps",["-axo","pid=,ppid=,rss=,time="],{encoding:"utf8",maxBuffer:16*1024*1024})}var af=1024;function df(e){let n=new Map;for(let t of e.split(`
|
|
58
|
-
`)){let r=t.trim().split(/\s+/);if(r.length!==4)continue;let[o,s,i]=r.slice(0,3).map(Number);if(![o,s,i].every(a=>a!=null&&Number.isSafeInteger(a)&&a>=0))continue;let l=
|
|
59
|
-
`),aliases:s,closed_since:o}}function gf(e,n,t){let r=Ie(n),o=Ie(r.data),s=Array.isArray(r.errors)?r.errors.map(Ie):[],i=kf(o.rateLimit,s),l=e.aliases.map(({alias:a,search_alias:c,project:u})=>{let p=u.owner+"/"+u.name,f=o[a],h=s.find(k=>Pi(k.path,a)||Pi(k.path,c));if(Li(f)){let k=ji(f.open_pull_requests),b=ji(f.open_issues),y=Rf(o[c]);if(k!=null&&b!=null&&y!=null)return{project_label:u.project_label,repository:p,outcome:"counted",counts:{open_pull_requests:k,open_issues:b,recently_closed:y},detail:`counted ${p} for project ${JSON.stringify(u.project_label)}`}}return i.exhausted||Ai(h)?{project_label:u.project_label,repository:p,outcome:"rate-limited",counts:null,detail:`the host token's quota was spent before ${p} answered, so this project has no counts rather than zero counts${i.reset_at==null?"":`; the quota resets at ${i.reset_at}`}`}:{project_label:u.project_label,repository:p,outcome:"unreachable",counts:null,detail:`${p} is not reachable with the host token: ${br(h?.message)||"the query returned no such repository"}`}});return{version:1,fetched_at:t.fetchedAt,request_count:1,project_count:l.length,rate_limit:i,projects:l}}function hf(e){return{version:1,fetched_at:e,request_count:0,project_count:0,rate_limit:{remaining:null,reset_at:null,exhausted:!1},projects:[]}}async function Di(e){if(e.projects.length===0)return hf(e.now);wr(e.projects,e.hostTokenRef);let n=mf(e.projects,{now:e.now,closedWindowMs:e.closedWindowMs});try{let t=await e.transport(n.query);return gf(n,t,{fetchedAt:e.now})}catch(t){let r=t instanceof Error?t.message:String(t),o=/rate limit|secondary rate|429/i.test(r);return{version:1,fetched_at:e.now,request_count:1,project_count:e.projects.length,rate_limit:{remaining:null,reset_at:null,exhausted:o},projects:e.projects.map(s=>({project_label:s.project_label,repository:`${s.owner}/${s.name}`,outcome:o?"rate-limited":"unreachable",counts:null,detail:`the activity fetch failed before ${s.owner}/${s.name} answered: ${r}`}))}}}function Oi(e){let n=e.stalenessMs??12e4,t=e.activity;if(t==null)return{version:1,fetched_at:null,age_ms:null,threshold_ms:n,stale:!1,request_count:0,rate_limit:{remaining:null,reset_at:null,exhausted:!1},projects:[],reason:"the daemon polls no repository, so there are no counts to age"};let r=Date.parse(e.now),o=Date.parse(t.fetched_at),s=Number.isFinite(r)&&Number.isFinite(o)?Math.max(0,r-o):null,i=s==null||s>n;return{version:1,fetched_at:t.fetched_at,age_ms:s,threshold_ms:n,stale:t.projects.length>0&&i,request_count:t.request_count,rate_limit:t.rate_limit,projects:t.projects.map(l=>({...l,fetched_at:t.fetched_at,age_ms:s,stale:i})),reason:t.projects.length===0?"the daemon polls no repository, so there are no counts to age":s==null?"these counts carry no readable instant, so they cannot be presented as current":i?`these counts are ${s}ms old, past the ${n}ms window`:`fetched ${s}ms ago, within the ${n}ms window`}}function $i(e){let n=e.endpoint??"https://api.github.com/graphql",t=e.fetchImpl??fetch;return async r=>{let o=await t(n,{method:"POST",headers:{authorization:`bearer ${e.token}`,"content-type":"application/json",accept:"application/vnd.github+json"},body:JSON.stringify({query:r})});if(!o.ok){let s=o.headers.get("x-ratelimit-remaining"),i=o.status===429||s==="0";throw new Error(`the activity query was refused with HTTP ${o.status}`+(i?": the host token's rate limit is spent":""))}return await o.json()}}function yf(e){if(e.length===0)throw new Error("redskilled activity fetch needs at least one registered project");if(e.length>100)throw new Error("redskilled activity fetch spans at most 100 repositories in one query");let n=new Set;for(let t of e){if(t.project_label===""||t.owner===""||t.name==="")throw new Error("redskilled activity fetch needs a project label and an owner/name for every registered project");if(n.has(t.project_label))throw new Error(`redskilled holds one repository per project, and ${JSON.stringify(t.project_label)} is registered twice`);n.add(t.project_label)}}function kf(e,n){let t=Ie(e),r=typeof t.remaining=="number"&&Number.isFinite(t.remaining)?t.remaining:null,o=typeof t.resetAt=="string"?t.resetAt:null,s=n.some(Ai);return{remaining:r,reset_at:o,exhausted:s||r===0}}function Ai(e){if(e==null)return!1;let n=br(e.type),t=br(e.message);return n==="RATE_LIMITED"||/rate limit/i.test(t)}function Pi(e,n){return Array.isArray(e)&&e.includes(n)}function ji(e){let n=Ie(e);return Number.isInteger(n.totalCount)?n.totalCount:null}function Rf(e){let n=Ie(e);return Number.isInteger(n.issueCount)?n.issueCount:null}function Ie(e){return Li(e)?e:{}}function Li(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function br(e){return typeof e=="string"?e:""}var bf=3e4,wf=4;function Ii(e){let n=e.stalenessMs??bf,t=un(e.now),r=e.sampledAt==null?null:un(e.sampledAt),o=t==null||r==null?null:Math.max(0,t-r),s=o!=null&&o<=n,i=new Set(e.reattachedWorkerIds??[]),l=e.hostState.workers.map(f=>xf(f,{rss:e.rss,sampledAt:e.sampledAt,ageMs:o,sampleFresh:s,nowMs:t,log:e.logLines?.[f.worker_id],display:e.displays?.[f.worker_id],state:i.has(f.worker_id)?"reattached":"running"})),a=l.filter(f=>f.vitals.rss_bytes==null).map(f=>f.worker_id).sort(),c=l.length-a.length,u=l.reduce((f,h)=>f+(h.vitals.rss_bytes??0),0),p=Vn(e.hostState.workers);return{version:1,generated_at:e.now,daemon:{pid:e.hostState.pid,daemon_version:e.hostState.daemon_version,protocol_version:e.hostState.protocol_version,started_at:e.hostState.started_at,machine_id_hash:e.hostState.machine_id_hash,session_key_hash:e.hostState.session_key_hash},staleness:jf({sampledAt:e.sampledAt,ageMs:o,threshold:n,workerCount:l.length,measuredCount:c,unmeasured:a}),host:{worker_count:l.length,project_count:e.hostState.projects.length,ceiling:e.ceiling,consumption:p,budget_accounting:e.hostState.budget_accounting,observed_rss_bytes:u,measured_worker_count:c,ceiling_used_fraction:e.ceiling.memory_bytes==null||e.ceiling.memory_bytes<=0?null:p.memory_bytes/e.ceiling.memory_bytes},projects:Pf(l),known_projects:Ef(e.hostState),registered_projects:(e.hostState.registrations??[]).map(f=>f.project_label).sort((f,h)=>f.localeCompare(h)),workers:l,repository_activity:Oi({activity:e.repositoryActivity??null,now:e.now,stalenessMs:e.activityStalenessMs}),...e.deaths===void 0?{}:{deaths:_f(e.deaths,e.recentDeathLimit??wf)},engine:vf(e.hostState)}}function _f(e,n){let t=[...e].sort((o,s)=>(un(s.ts)??0)-(un(o.ts)??0)),r=t.slice(0,Math.max(0,Math.floor(n))).map(o=>({kind:o.kind,id:o.id,pid:o.pid,ts:o.ts,last_seen:o.last_seen,last_phase:o.last_phase,sender_class:o.sender_class,confidence:o.confidence,signal:o.signal,evidence:o.evidence[0]??null}));return{count:t.length,recent:r,latest:r[0]??null,reaped_at:r[0]?.ts??null}}function vf(e){let n=e.upgrade,t=n?.running_version??e.daemon_version,r=n?.published_version??null,o=n?.newest_published_version??null,s=(n?.newer_published??0)>0,i=(n?.major_held??0)>0;return{running_version:t,published_version:r,newer_published:s,major_held:i,current:r==null&&o==null?null:!s&&!i}}function xf(e,n){let t=n.rss[e.worker_id],r=typeof t=="number"&&Number.isFinite(t)?t:null,o=cn(e),s=e.budget?.memory_max??e.budget?.memory_high??null,i=un(e.started_at);return{worker_id:e.worker_id,project_label:e.project_label,workspace_path:e.workspace_path,pid:e.pid,started_at:e.started_at,uptime_ms:n.nowMs==null||i==null?null:Math.max(0,n.nowMs-i),state:n.state,isolated:e.isolated,unit:e.unit??null,warnings:[...e.warnings],vitals:{rss_bytes:r,sampled_at:r==null?null:n.sampledAt,age_ms:r==null?null:n.ageMs,fresh:r!=null&&n.sampleFresh},budget:{name:o?.name??null,declared:o?.declared??s,bytes:o?.bytes??null,used_bytes:r,used_fraction:o==null||o.bytes<=0||r==null?null:r/o.bytes,enforceable:o!=null},log:Sf(n.log),display:n.display?.display??null,display_published_at:n.display?.published_at??null}}function Sf(e){let n={last_line:null,published_at:null,source:null};return e==null||e.line.trim()===""?n:{last_line:e.line,published_at:e.published_at,source:e.source}}function Ef(e){let n=new Set;for(let t of e.registrations??[])n.add(t.project_label);for(let t of e.projects)n.add(t.project_label);return[...n].sort((t,r)=>t.localeCompare(r))}function Pf(e){let n=new Map;for(let t of e){let r=n.get(t.project_label)??{workers:0,declared:0,observed:0,measured:0};r.workers+=1,r.declared+=t.budget.bytes??0,r.observed+=t.vitals.rss_bytes??0,r.measured+=t.vitals.rss_bytes==null?0:1,n.set(t.project_label,r)}return[...n.entries()].map(([t,r])=>({project_label:t,worker_count:r.workers,declared_memory_bytes:r.declared,observed_rss_bytes:r.observed,measured_worker_count:r.measured})).sort((t,r)=>t.project_label.localeCompare(r.project_label))}function jf(e){let n={sampled_at:e.sampledAt,age_ms:e.ageMs,threshold_ms:e.threshold,measured_worker_count:e.measuredCount,unmeasured_workers:e.unmeasured};return e.workerCount===0?{...n,stale:!1,reason:"the host holds no Workers, so there is nothing to measure and nothing to age"}:e.sampledAt==null||e.ageMs==null?{...n,stale:!0,reason:`this answer is stale: the daemon has taken no measurement of its ${e.workerCount} live Worker(s) yet`}:e.ageMs>e.threshold?{...n,stale:!0,reason:`this answer is stale: its measurement is ${e.ageMs}ms old, past the ${e.threshold}ms staleness window`}:{...n,stale:!1,reason:`measured ${e.ageMs}ms ago, within the ${e.threshold}ms staleness window`}}function un(e){let n=Date.parse(e);return Number.isFinite(n)?n:null}var O={mode:"local",project:null,maxWorkers:4,maxProjects:4,maxWidth:120,separator:" \xB7 ",verbose:!1};function Ti(e,n=O){let t=Tf(e,n),r=Lf(e,n),o=If(e,n),s=Nf(e,n,r,t),i=$f(n,r,o),l={detail:"host",line:s};for(let p of i){let f=Jf(s,Af(p,n,r,o),n.separator);if(l={detail:p,line:f},qf(f)<=n.maxWidth)break}let a=Sr(l.line,n.maxWidth),c=n.verbose&&l.detail==="workers"?Uf(r,n):[],u=r.length>0?"workers":"host";return{version:1,line:a,lines:[a,...c],verbose:n.verbose,mode:n.mode,project:n.project,project_match:t,detail:l.detail,degraded:l.detail!==u||a!==l.line,stale:e.staleness.stale,generated_at:e.generated_at}}function Ni(e){let n=e.options??O,t=Sr(Of,n.maxWidth);return{version:1,line:t,lines:[t],verbose:n.verbose,mode:n.mode,project:n.project,project_match:"unanswered",detail:"host",degraded:!0,stale:!0,generated_at:e.generated_at}}var Df="!unregistered",vr="\u21E1",Gn="\u2020",Of="redskilled unreachable \u2014 Worker state unknown";function $f(e,n,t){let r=[];return n.length>0&&n.length<=e.maxWorkers&&r.push("workers"),e.mode==="global"&&t.length>0&&t.length<=e.maxProjects&&r.push("projects"),r.push("host"),r}function Af(e,n,t,r){return e==="workers"?t.map(o=>Hf(o,n)):e==="projects"?r.map(Kf):[]}function Lf(e,n){return n.mode==="global"?e.workers:n.project==null?[]:e.workers.filter(t=>t.project_label===n.project)}function If(e,n){return n.mode==="global"?e.projects:e.projects.filter(t=>t.project_label===n.project)}function Tf(e,n){return xr(e,n.project)}function xr(e,n){return n==null?"unresolved":e.known_projects==null?"matched":e.known_projects.includes(n)?e.registered_projects==null||e.registered_projects.includes(n)?"matched":"name-only":"unregistered"}function Nf(e,n,t,r){let o=[];n.mode==="global"?(o.push(`host ${e.host.worker_count}w/${e.host.project_count}p`),o.push(_r(e,n))):r==="matched"?(o.push(`${n.project} ${t.length}w`),o.push(_r(e,n)),t.length===0&&o.push("idle")):r==="name-only"?(o.push(`${n.project} ${t.length}w`),o.push(_r(e,n)),o.push(Df)):o.push(Mf(n.project,r)),o.push(Wf(e));let s=Cf(e);return s!=null&&o.push(s),e.staleness.stale&&o.push(Ff(e)),o.join(" ")}function Wf(e){let n=e.engine,t=n?.running_version??e.daemon.daemon_version;return n==null||n.current!==!1?`v${t}`:`v${t}${vr}`}function Cf(e){let n=e.deaths;return n==null||n.count<=0||n.latest==null?null:`${Gn}${n.count} ${n.latest.sender_class}`}function Mf(e,n){return n==="unregistered"?`project unknown \u2014 ${e} is not registered on this host`:"project unknown \u2014 this directory resolved to no project"}function _r(e,n){let t=n.mode==="global"?e.host.observed_rss_bytes:e.projects.filter(o=>o.project_label===n.project).reduce((o,s)=>o+s.observed_rss_bytes,0),r=e.host.ceiling.memory_bytes;return n.mode==="global"&&r!=null&&r>0?`${H(t)}/${H(r)}`:H(t)}function Ff(e){let n=e.staleness.age_ms;return n==null?"!unmeasured":`!stale ${Math.round(n/1e3)}s`}function Hf(e,n){let t=Wi(e,n),r=e.vitals.rss_bytes,o=r==null?"?":e.budget.bytes==null?H(r):`${H(r)}/${H(e.budget.bytes)}`;return`${t} ${o}`}function Uf(e,n){let t=[];for(let r of e){let o=Vf(r.log.last_line);o!=null&&t.push(Sr(` ${Bf} ${Wi(r,n)}: ${o}`,n.maxWidth))}return t}var Bf="\u21B3";function Vf(e){if(e==null)return null;let n=e.replace(/[\u0000-\u001f\u007f]+/g," ").replace(/\s+/g," ").trim();return n===""?null:n}function Wi(e,n){return n.mode==="global"?`${e.project_label}:${e.worker_id}`:e.worker_id}function Kf(e){return`${e.project_label} ${e.worker_count}w ${H(e.observed_rss_bytes)}`}function Jf(e,n,t){return[e,...n].join(t)}function qf(e){return[...e].length}function Sr(e,n){if(n<=0)return"";let t=[...e];return t.length<=n?e:n===1?"\u2026":`${t.slice(0,n-1).join("")}\u2026`}function H(e){if(!Number.isFinite(e)||e<=0)return"0B";let n=["B","K","M","G","T"],t=e,r=0;for(;t>=1024&&r<n.length-1;)t/=1024,r+=1;return`${t>=100||r===0?Math.round(t).toString():t.toFixed(1).replace(/\.0$/,"")}${n[r]}`}var Er={runner:null,model:null,effort:null,origin:null,issue:null,phase:null,step:null,phase_index:null,phase_total:null,failed:!1,heartbeat:null,added:null,removed:null,tokens:null,tools:null,reasoning:null,text:null},Gf=["runner","model","effort","origin","issue","phase","step","heartbeat"],zf=["phase_index","phase_total","added","removed","tokens","tools","reasoning","text"];function Ci(e){if(e===null||typeof e!="object"||Array.isArray(e))return null;let n=e,t={...Er};for(let r of Gf){let o=n[r];t[r]=typeof o=="string"&&o.trim()!==""?o:null}for(let r of zf){let o=n[r];t[r]=typeof o=="number"&&Number.isFinite(o)?o:null}return t.failed=n.failed===!0,t}var zn=["wid","run","org","iss","bar","phase","elapsed","hb","loc","tks","tls","rsn","txt"],Te={mode:"local",project:null,maxWidth:200,maxRows:16};var Qf=" ",Mi="\u2588",Yf="\u25B6",Zf="\u2717",Xf="\u2591";function Fi(e,n=Te){let t=xr(e,n.project),r=em(e,n),o=r.slice(0,Math.max(0,Math.floor(n.maxRows))),s=o.map(p=>nm(p,n)),i=cm(s),l=o.map((p,f)=>({worker_id:p.worker_id,project_label:p.project_label,mine:n.project!=null&&p.project_label===n.project,cells:s[f],line:pn(um(s[f],i),n.maxWidth)})),a=rm(e,n,r,t),c=r.length-o.length,u=[a.line,...l.map(p=>p.line)];return c>0&&u.push(pn(`\u2026 ${c} more Worker(s) \u2014 the row budget is short, not the host`,n.maxWidth)),u.push(...om(e,n)),{version:1,generated_at:e.generated_at,mode:n.mode,project:n.project,columns:zn,header:a,rows:l,lines:u,hidden_row_count:Math.max(0,c),stale:e.staleness.stale}}function em(e,n){return n.mode==="global"?e.workers:n.project==null?[]:e.workers.filter(t=>t.project_label===n.project)}function nm(e,n){let t=e.display??Er,r=[t.runner,t.model,t.effort].filter(o=>!!o).join(" ");return{wid:n.mode==="global"?`${e.project_label}:${e.worker_id}`:e.worker_id,run:r===""?"":`run=${r}`,org:t.origin==null?"":`org=${t.origin}`,iss:t.issue==null?"":`iss=${t.issue}`,bar:tm(t),phase:[t.phase,t.step].filter(o=>!!o).join("\xB7"),elapsed:dm(e.uptime_ms),hb:`hb=${t.heartbeat??"?"}`,loc:lm(t.added,t.removed),tks:t.tokens==null?"":`tks=${am(t.tokens)}`,tls:t.tools==null?"":`tls=${t.tools}`,rsn:t.reasoning==null?"":`rsn=${t.reasoning}`,txt:t.text==null?"":`txt=${t.text}`}}function tm(e){let n=e.phase_total,t=e.phase_index;if(n==null||n<=0||t==null||t<0)return"";let r=Math.min(Math.floor(t),Math.floor(n));if(r>=n)return Mi.repeat(Math.floor(n));let o=e.failed?Zf:Yf;return`${Mi.repeat(r)}${o}${Xf.repeat(Math.floor(n)-r-1)}`}function rm(e,n,t,r){let o=(e.repository_activity?.projects??[]).find(h=>h.project_label===n.project),s={open_pull_requests:o?.counts?.open_pull_requests??null,recently_closed:o?.counts?.recently_closed??null,open_issues:o?.counts?.open_issues??null,stale:o?.stale===!0},i={memory_used_fraction:e.host.ceiling_used_fraction,memory_used_bytes:e.host.consumption.memory_bytes,memory_ceiling_bytes:e.host.ceiling.memory_bytes,worker_count:e.host.worker_count,worker_ceiling:e.host.ceiling.worker_count},l=im(t),a=o?.repository??n.project,c=e.engine??null,u=c?.running_version??e.daemon.daemon_version,p=e.deaths??null,f=[`\xBB ${a??"host"} v${u}${c!=null&&c.current===!1?vr:""}`];if(r==="unregistered"&&f.push("!unregistered"),r==="name-only"&&f.push("!lapsed"),l!=null&&f.push(l),f.push(`wrk=${t.length}/${e.host.worker_count}`),f.push(i.worker_ceiling==null?"slots=\u221E":`slots=${i.worker_count}/${i.worker_ceiling}`),f.push(sm(i)),s.open_pull_requests!=null&&f.push(`prs=${s.open_pull_requests}`),s.recently_closed!=null&&f.push(`cpr=${s.recently_closed}`),s.open_issues!=null&&f.push(`iss=${s.open_issues}`),s.stale&&f.push("!counts stale"),p!=null&&p.count>0&&p.latest!=null&&f.push(`${Gn}${p.count} ${p.latest.sender_class}`),e.staleness.stale){let h=e.staleness.age_ms;f.push(h==null?"!unmeasured":`!stale ${Math.round(h/1e3)}s`)}return{repo:a,project:n.project,project_match:r,version:u,engine:c,deaths:p,model:l,windows:i,counts:s,stale:e.staleness.stale,age_ms:e.staleness.age_ms,line:pn(f.join(" \xB7 "),n.maxWidth)}}function om(e,n){let t=e.deaths;if(t==null||t.count<=0)return[];let r=t.recent.map(s=>pn(`${Gn} ${s.kind} ${s.id} pid=${s.pid} ${s.sender_class}/${s.confidence} phase=${s.last_phase}`+(s.signal==null?"":` signal=${s.signal}`)+(s.evidence==null?"":` \u2014 ${s.evidence}`),n.maxWidth)),o=t.count-t.recent.length;return o>0&&r.push(pn(`\u2026 ${o} more posed death(s) \u2014 the lane holds them all`,n.maxWidth)),r}function sm(e){if(e.memory_ceiling_bytes==null||e.memory_ceiling_bytes<=0)return`mem=${H(e.memory_used_bytes)}`;let n=e.memory_used_fraction==null?"":` ${Math.round(e.memory_used_fraction*100)}%`;return`mem=${H(e.memory_used_bytes)}/${H(e.memory_ceiling_bytes)}${n}`}function im(e){for(let n of e){let t=n.display;if(t==null)continue;let r=[t.runner,t.model,t.effort].filter(o=>!!o);if(r.length>0)return r.join("\xB7")}return null}function lm(e,n){if(e==null&&n==null)return"";let t=[];return e!=null&&e>0&&t.push(`+${e}`),n!=null&&n>0&&t.push(`-${n}`),`loc=${t.length>0?t.join(" "):"0"}`}function am(e){if(!Number.isFinite(e)||e<=0)return"0";let n=(t,r)=>{let o=(Math.round(t*10)/10).toFixed(1);return`${o.endsWith(".0")?o.slice(0,-2):o}${r}`};return e>=1e9?n(e/1e9,"B"):e>=1e6?n(e/1e6,"M"):e>=1e3?n(e/1e3,"k"):String(Math.round(e))}function dm(e){if(e==null||!Number.isFinite(e)||e<0)return"\u2014";let n=Math.floor(e/1e3);if(n<60)return`${n}s`;let t=Math.floor(n/60);if(t<60)return`${t}m${n%60}s`;let r=Math.floor(t/60);return r<24?`${r}h${t%60}m`:`${Math.floor(r/24)}d${r%24}h`}function cm(e){let n=Object.fromEntries(zn.map(t=>[t,0]));for(let t of e)for(let r of zn)n[r]=Math.max(n[r],Hi(t[r]));return n}function um(e,n){return zn.filter(r=>n[r]>0).map(r=>pm(e[r],n[r])).join(Qf).replace(/\s+$/,"")}function pm(e,n){return e+" ".repeat(Math.max(0,n-Hi(e)))}function Hi(e){return[...e].length}function pn(e,n){if(n<=0)return"";let t=[...e];return t.length<=n?e:n===1?"\u2026":`${t.slice(0,n-1).join("")}\u2026`}var Qn=1;async function fn(e,n){return await Wn(e,n,"redskilled daemon")}function Ui(e){if(e===null||typeof e!="object"||Array.isArray(e))return!1;let n=e;return n.version===1&&typeof n.line=="string"&&Array.isArray(n.lines)&&n.lines.every(t=>typeof t=="string")&&typeof n.verbose=="boolean"&&(n.mode==="local"||n.mode==="global")&&(n.project===null||typeof n.project=="string")&&typeof n.detail=="string"&&(n.project_match===void 0||typeof n.project_match=="string")&&typeof n.degraded=="boolean"&&typeof n.stale=="boolean"&&typeof n.generated_at=="string"}function Bi(e){let n=[...e.workers??[]],t=new Map;for(let r of n)t.set(r.project_label,(t.get(r.project_label)??0)+1);return{version:1,protocol_version:Qn,daemon_version:e.daemonVersion,machine_id_hash:e.machineIdHash,session_key_hash:e.sessionKeyHash,pid:e.pid,started_at:e.startedAt,...e.scope==null?{}:{scope:e.scope},workers:n,projects:[...t.entries()].map(([r,o])=>({project_label:r,worker_count:o})).sort((r,o)=>r.project_label.localeCompare(o.project_label)),registrations:gm(e),...e.lapses==null||e.lapses.length===0?{}:{lapsed_registrations:[...e.lapses]},budget_accounting:zs(n),upgrade:hm(e)}}function gm(e){let n=e.now==null?Number.NaN:Date.parse(e.now),t=Number.isFinite(n),r=e.queue??null,o=new Map(r==null?[]:r.projects.map(s=>[s.project_label,s]));return[...e.registrations??[]].map(s=>{let i=o.get(s.project_label);return{...s,...t?{renewal:wi(s,n)}:{},...r==null||i==null?{}:{last_poll:{at:r.fetched_at,outcome:i.outcome,depth:i.depth,request_count:r.request_count,detail:i.detail}}}}).sort((s,i)=>s.project_label.localeCompare(i.project_label))}function hm(e){let n=e.daemonVersion,t=e.published?.version??null,r=e.published?.majorHold??null;return{running_version:n,published_version:t,published_unknown:+(t===null),newer_published:+(e.published?.newer===!0),replacement:e.published?.replacement??"none",checked_at:e.published?.checkedAt??null,checks:e.published?.checks??0,hold_reason:e.published?.holdReason??null,newest_published_version:e.published?.newest??null,major_held:+(r!==null),major_hold:r}}function Vi(e){if(e===null||typeof e!="object"||Array.isArray(e))return!1;let n=e;return n.version===1&&typeof n.protocol_version=="number"&&typeof n.daemon_version=="string"&&typeof n.machine_id_hash=="string"&&typeof n.session_key_hash=="string"&&Number.isInteger(n.pid)&&typeof n.started_at=="string"&&Array.isArray(n.workers)&&Array.isArray(n.projects)&&Qs(n.budget_accounting)&&(n.scope===void 0||yi(n.scope))&&(n.registrations===void 0||Array.isArray(n.registrations)&&n.registrations.every(kr))&&(n.upgrade===void 0||ym(n.upgrade))}function ym(e){if(e===null||typeof e!="object"||Array.isArray(e))return!1;let n=e;return typeof n.running_version=="string"&&(n.published_version===null||typeof n.published_version=="string")&&typeof n.published_unknown=="number"&&typeof n.newer_published=="number"&&(n.replacement==="none"||n.replacement==="pending"||n.replacement==="in-progress")&&(n.checked_at===null||typeof n.checked_at=="string")&&(n.newest_published_version===void 0||n.newest_published_version===null||typeof n.newest_published_version=="string")&&(n.major_held===void 0||typeof n.major_held=="number")&&(n.checks===void 0||typeof n.checks=="number")&&(n.hold_reason===void 0||n.hold_reason===null||typeof n.hold_reason=="string")&&(n.major_hold===void 0||n.major_hold===null||km(n.major_hold))}function km(e){if(e===null||typeof e!="object"||Array.isArray(e))return!1;let n=e;return typeof n.version=="string"&&Number.isInteger(n.running_major)&&Number.isInteger(n.held_major)&&typeof n.reason=="string"&&typeof n.action=="string"&&n.action.trim()!==""}import{spawnSync as Xn}from"node:child_process";import{existsSync as $r}from"node:fs";import{delimiter as Pm,join as el}from"node:path";import{join as Ki}from"node:path";import{existsSync as Rm}from"node:fs";import{createRequire as bm}from"node:module";var Ji="redskilled-job-object.node",we=100;function Ne(e){return{available:!1,reason:e}}function wm(e,n,t){return[Ki(t,"prebuilds",`${e}-${n}`,Ji),Ki(t,"native","build","Release",Ji)]}function qi(e={}){let n=e.platform??process.platform,t=e.arch??process.arch;if(n!=="win32")return Ne(`Job Object placement is the Windows backend (platform=${n}), so there is no native reach to load here`);let r=e.packageRoot??vm(),o=e.exists??Rm,s=wm(n,t,r),i=s.find(c=>o(c));if(i==null)return Ne(`no Job Object addon was found for ${n}-${t} (looked in ${s.join(", ")}); either install the prebuild for this platform and architecture or build the addon locally`);let l=e.requireFn??bm(import.meta.url),a;try{a=l(i)}catch(c){return Ne(`the Job Object addon at ${i} could not be loaded: ${c instanceof Error?c.message:String(c)}`)}return _m(a)?{available:!0,binding:a}:Ne(`the Job Object addon at ${i} does not export createJobObject, so it cannot be the native reach`)}function _m(e){return typeof e=="object"&&e!=null&&typeof e.createJobObject=="function"}function vm(){return new URL("..",import.meta.url).pathname}function Gi(e){let n=e??{},t=[],r=xm(n);r==null&&(n.memory_max??n.memory_high)!=null&&t.push("the declared memory budget could not be reduced to bytes, so the job carries no memory ceiling");let o;return n.cpu_weight!=null&&(n.cpu_weight<we?o=Math.max(1,Math.min(100,Math.round(n.cpu_weight))):t.push(`cpu_weight=${n.cpu_weight} is at or above the fair share of ${we}, and Windows CPU rate control is an absolute cap rather than a share, so no rate limit is set`)),{...r!=null?{memory_limit_bytes:r.bytes,memory_budget_name:r.name,memory_budget_declared:r.declared}:{},...o!=null?{cpu_rate_percent:o}:{},kill_on_close:!0,...t.length>0?{note:t.join("; ")}:{}}}function xm(e){return cn({budget:e})}var Yn=5,zi=19;function Pr(e){return{available:!1,reason:e}}var Sm="an address-space rlimit is not a resident-memory ceiling: a runtime that reserves address space it never faults in would die under a limit it never used, so no memory rlimit is set and the daemon's RSS sampling floor is the ceiling that actually holds";function Yi(e,n){let t=e??{},r=[],o;if(!n.canRenice)r.push("nice is not on this host, so no priority control was applied and the Worker competes with interactive work");else if(t.cpu_weight==null)o=Yn;else if(t.cpu_weight<we){let l=Math.round(zi*(we-t.cpu_weight)/we);o=Math.min(zi,Math.max(Yn,l))}else o=Yn,r.push(`cpu_weight=${t.cpu_weight} is at or above the fair share of ${we}, and raising a process's priority requires privilege this daemon does not have, so the Worker keeps the default yield of nice ${Yn}`);let s=Qi(t.max_processes);s==null&&t.max_processes!=null&&r.push(`max_processes=${t.max_processes} is not a positive whole number, so no ulimit -u is set`);let i=Qi(t.cpu_seconds);return i==null&&t.cpu_seconds!=null&&r.push(`cpu_seconds=${t.cpu_seconds} is not a positive whole number, so no ulimit -t is set`),{...o!=null?{nice:o}:{},...s!=null?{max_processes:s}:{},...i!=null?{cpu_seconds:i}:{},memory_ceiling:"sampling-floor",memory_ceiling_reason:Sm,...r.length>0?{note:r.join("; ")}:{}}}function Zi(e){let{limits:n}=e,t=[];return n.max_processes!=null&&t.push(`ulimit -u ${n.max_processes}`),n.cpu_seconds!=null&&t.push(`ulimit -t ${n.cpu_seconds}`),t.push(n.nice!=null&&e.nice!=null?`exec ${Em(e.nice)} -n ${n.nice} "$0" "$@"`:'exec "$0" "$@"'),["-c",t.join(`
|
|
60
|
-
`),e.command,...e.args]}function
|
|
61
|
-
`).map(t=>t.trim().split(/\s+/)[0]??"").filter(t=>t.startsWith(`${e}-`)&&t.endsWith(".service"))}function
|
|
62
|
-
`),aliases:r}}function
|
|
63
|
-
`);for(let t=n.length-1;t>=0;t-=1){let r=n[t].replace(/\r$/,"");if(r.trim()!=="")return r}return null}import{spawn as
|
|
64
|
-
`)}function
|
|
56
|
+
`).filter(Hp).map(Up)}function di(e){let n=new Map;for(let t of e)t.event!=="daemon-stop"&&(t.event==="worker-birth"?n.set(t.worker_id,Cp(t)):n.delete(t.worker_id));return[...n.values()]}function Cp(e){let n={...e.memory_high!=null?{memory_high:e.memory_high}:{},...e.memory_max!=null?{memory_max:e.memory_max}:{},...e.cpu_weight!=null?{cpu_weight:e.cpu_weight}:{}};return{worker_id:e.worker_id,project_label:e.project_label,pid:e.pid,started_at:e.ts,workspace_path:e.workspace_path,...e.log_path!=null?{log_path:e.log_path}:{},isolated:e.isolated,...e.unit!=null?{unit:e.unit}:{},...Object.keys(n).length>0?{budget:n}:{},warnings:[]}}function Fp(e){return{...e}}function Hp(e){return e.version===1&&typeof e.ts=="string"&&typeof e.worker_id=="string"&&(e.event==="worker-birth"||e.event==="worker-death"||e.event==="worker-budget-kill"||e.event==="daemon-stop")}function Up(e){return{version:1,ts:String(e.ts),event:e.event,worker_id:String(e.worker_id),project_label:oe(e.project_label)??"",pid:Number(e.pid??0),workspace_path:oe(e.workspace_path)??"",log_path:oe(e.log_path),isolated:e.isolated===!0||e.isolated==="true",unit:oe(e.unit),memory_high:oe(e.memory_high),memory_max:oe(e.memory_max),cpu_weight:e.cpu_weight==null||e.cpu_weight===""?null:Number(e.cpu_weight),detail:oe(e.detail),exit_code:e.exit_code==null||e.exit_code===""?null:Number(e.exit_code),signal:oe(e.signal),reason:oe(e.reason)}}function oe(e){return e==null||e===""?null:String(e)}function ci(e){let n=[...e.projects].sort((i,l)=>i.project_label.localeCompare(l.project_label)),t=e.backoffUntilMs??null,r=t!=null&&e.nowMs<t,o=[],s=[];for(let i of n){let l=Math.max(0,e.live[i.project_label]??0),a=Object.prototype.hasOwnProperty.call(e.queue,i.project_label),d=a?e.queue[i.project_label]??null:null,u={project_label:i.project_label,queue_depth:d,target:i.target,live:l};if(r){o.push({...u,outcome:"backing-off",wanted:0,detail:`the host refused a Worker, so no project is asked for one again before ${new Date(t).toISOString()}`});continue}if(d==null){o.push({...u,outcome:"queue-unknown",wanted:0,detail:a?`the last poll produced no depth for project ${JSON.stringify(i.project_label)}, and an absent depth is not a drained queue`:`no poll has counted project ${JSON.stringify(i.project_label)} yet, so it is not asked for a Worker on a depth nobody measured`});continue}if(d===0){o.push({...u,outcome:"queue-drained",wanted:0,detail:`project ${JSON.stringify(i.project_label)} has nothing queued, so it is asked for no Worker`});continue}let p=Math.max(0,Math.min(Math.max(0,i.target),d)-l);if(p===0){o.push({...u,outcome:"at-target",wanted:0,detail:`project ${JSON.stringify(i.project_label)} holds ${l} Worker(s) against a target of ${i.target} and a queue of ${d}, so it asks for none`});continue}o.push({...u,outcome:"asking",wanted:p,detail:`project ${JSON.stringify(i.project_label)} holds ${l} Worker(s) against a target of ${i.target} and a queue of ${d}, so it asks for ${p} more`});for(let m=0;m<p;m+=1)(s[m]??(s[m]=[])).push({project_label:i.project_label,index:l+m,argv:i.argv,workspace_path:i.workspace_path})}return{intents:o,births:s.flat()}}function ui(e){return{version:1,at:e,requested:0,granted:[],shortfall:0,refusal:null,retry_after:null,projects:[]}}function mi(e){let n=e.workers.map(Vp),t=[...new Set([...n.map(o=>o.project_label),...e.projects??[]])].filter(o=>o!=="").sort(),r=n.filter(o=>o.survives).map(o=>o.worker_id);return{version:1,running:!0,stopped:!0,reason:e.reason,socket_path:e.socketPath,daemon_version:e.daemonVersion,pid:e.pid,holding:{workers:n,projects:t},surviving:r,detail:Kp({reason:e.reason,socketPath:e.socketPath,daemonVersion:e.daemonVersion,pid:e.pid,held:n.length,projects:t.length,surviving:r.length})}}function fi(e){return{version:1,running:!1,stopped:!1,reason:"not-running",socket_path:e,daemon_version:null,pid:null,holding:{workers:[],projects:[]},surviving:[],detail:`no redskilled daemon is answering on ${JSON.stringify(e)}, so there was nothing to stop`}}function Vp(e){return{worker_id:e.worker_id,project_label:e.project_label,pid:e.pid,unit:e.unit??null,isolated:e.isolated,survives:!0}}function Bp(e){return e==="requested"?"an operator asked for it":e==="signal"?"the daemon was signalled":e==="idle"?"the daemon was idle and held nothing":e==="replaced"?"a newer published bundle is taking the session over":"no daemon was running"}function Kp(e){let n=`stopping the redskilled daemon (pid ${e.pid}, version ${e.daemonVersion}) on ${JSON.stringify(e.socketPath)}: ${Bp(e.reason)}`;return e.held===0?`${n}; it holds no Workers, so nothing survives the stop`:`${n}; it holds ${pi(e.held,"Worker")} across ${pi(e.projects,"project")}, and ${e.surviving} of them survive it \u2014 a Worker is an init-system unit, so this is a restart and not an evacuation`}function pi(e,n){return`${e} ${n}${e===1?"":"s"}`}function hr(e){if(e===null||typeof e!="object"||Array.isArray(e))return!1;let n=e,t=n.holding;return n.version===1&&typeof n.running=="boolean"&&typeof n.stopped=="boolean"&&typeof n.reason=="string"&&typeof n.socket_path=="string"&&typeof n.detail=="string"&&(n.daemon_version===null||typeof n.daemon_version=="string")&&(n.pid===null||typeof n.pid=="number")&&t!=null&&Array.isArray(t.workers)&&Array.isArray(t.projects)&&Array.isArray(n.surviving)}import{chmod as Jp,mkdir as qp,readFile as Gp,rm as zp,writeFile as Qp}from"node:fs/promises";import{dirname as gi,join as Ri}from"node:path";import{tmpdir as hi}from"node:os";var Yp="redskilled.machine.claim.toon",Zp="REDSKILLED_MACHINE_DIR",Xp=8,pe=class extends Error{constructor(t,r,o){super(nm(t,r,o));this.claimPath=t;this.reason=r;this.claim=o;this.name="RedskilledMachineHeldError"}},yi;function bi(){return yi??={pid:process.pid,startTime:new Date(Date.now()-Math.round(process.uptime()*1e3)).toISOString(),uid:typeof process.getuid=="function"?process.getuid():-1},yi}function em(e={machineIdHash:"unknown"}){let n=e.env??process.env,t=n[Zp]?.trim();if(t)return t;let o=(e.platform??process.platform)==="win32"?n.PROGRAMDATA?.trim()||hi():hi();return Ri(o,`redskilled-${e.machineIdHash}`)}function qn(e){return Ri(em(e),Yp)}function Gn(e,n,t={}){let r=t.clock??(()=>new Date().toISOString()),o=t.isPidAlive??W;async function s(){let a;try{a=await Gp(e,"utf8")}catch(u){if(u.code==="ENOENT"||yr(u))return;throw u}let d=rm(a);return om(d)?d:void 0}function i(a,d){return{version:1,scope:"machine",pid:a.pid,start_time:a.startTime,uid:a.uid,machine_id_hash:n.machineIdHash,session_key_hash:n.sessionKeyHash,socket_path:n.socketPath,acquired_at:d,renewed_at:d}}async function l(){try{return await zp(e,{force:!0}),!0}catch(a){if(yr(a))return!1;throw a}}return{claimPath:e,read:s,async claim(a){await qp(gi(e),{recursive:!0,mode:1023})!=null&&await Jp(gi(e),1023).catch(()=>{});let u=!1;for(let p=0;p<Xp;p+=1){let m=i(a,r());try{return await Qp(e,tm(m),{encoding:"utf8",mode:420,flag:"wx"}),{claimed:!0,reaped:u,claim:m}}catch(y){if(y.code!=="EEXIST"){if(yr(y))return{claimed:!1,reason:"stale-claim-not-reapable"};throw y}}let h=await s();if(!h){if(!await l())return{claimed:!1,reason:"stale-claim-not-reapable"};u=!0;continue}if(ki(h,a,n.socketPath))return{claimed:!0,reaped:u,claim:h};if(await o(h.pid))return{claimed:!1,reason:"held",claim:h};if(!await l())return{claimed:!1,reason:"stale-claim-not-reapable",claim:h};u=!0}return{claimed:!1,reason:"contended"}},async release(a){let d=await s();return!d||!ki(d,a,n.socketPath)?!1:await l()}}}function _i(e,n,t){return{kind:"machine",claim_path:e,owner_uid:t.uid,machine_id_hash:n.machineIdHash,session_key_hash:n.sessionKeyHash,socket_path:n.socketPath}}function wi(e){if(e===null||typeof e!="object"||Array.isArray(e))return!1;let n=e;return n.kind==="machine"&&typeof n.claim_path=="string"&&typeof n.owner_uid=="number"&&typeof n.machine_id_hash=="string"&&typeof n.session_key_hash=="string"&&typeof n.socket_path=="string"}function nm(e,n,t){let r=t==null?"":` \u2014 held by pid ${t.pid} (uid ${t.uid}) on socket ${JSON.stringify(t.socket_path)}`;return n==="held"?`this machine already has a redskilled daemon${r}; a second one would void the host budget, so none was started. Reach that daemon, or stop it before starting another.`:n==="stale-claim-not-reapable"?`the redskilled machine claim ${JSON.stringify(e)} is stale and cannot be removed by this user${r}; remove it as its owner, then start again. No second daemon was started.`:`the redskilled machine claim ${JSON.stringify(e)} changed hands repeatedly; no daemon was started.`}function yr(e){let n=e?.code;return n==="EACCES"||n==="EPERM"||n==="EROFS"}function ki(e,n,t){return e.pid===n.pid&&e.start_time===n.startTime&&e.socket_path===t}function tm(e){return`${I(e,{keyedMapCollapse:!0})}
|
|
57
|
+
`}function rm(e){let n=e.trim();if(!n)return null;try{return JSON.parse(n)}catch{try{return G(n)}catch{return null}}}function om(e){if(e===null||typeof e!="object"||Array.isArray(e))return!1;let n=e;if(n.version!==1||n.scope!=="machine"||!Number.isInteger(n.pid)||n.pid<=0||!Number.isInteger(n.uid))return!1;for(let t of["start_time","machine_id_hash","session_key_hash","socket_path","acquired_at","renewed_at"])if(typeof n[t]!="string"||n[t].length===0)return!1;return!0}function kr(e,n){if(!Array.isArray(e)||e.length===0)throw new Error(`redskilled needs an argv to register project ${JSON.stringify(n)}: a registration with nothing to run is a project the host could never start a Worker for`);return e.map((t,r)=>{if(typeof t!="string"||t==="")throw new Error(`redskilled needs every word of an argv to be a non-empty string, and word ${r} of project ${JSON.stringify(n)} is not`);return t})}function Rr(e,n){if(e==null)return{};if(typeof e!="object"||Array.isArray(e))throw new Error(`redskilled needs a launch env to be a map of strings to register project ${JSON.stringify(n)}, not ${JSON.stringify(e)}`);let t={};for(let[r,o]of Object.entries(e)){if(r==="")throw new Error(`redskilled needs every launch env name of project ${JSON.stringify(n)} to be named`);if(typeof o!="string")throw new Error(`redskilled needs every launch env value to be a string, and ${JSON.stringify(r)} of project ${JSON.stringify(n)} is ${JSON.stringify(o)}`);t[r]=o}return t}var sm=3e5,im=.5,_r=class extends Error{constructor(t){super(`redskilled already holds a registration for project ${JSON.stringify(t.project_label)}, registered at ${t.registered_at} for a target of ${t.target} and standing until ${t.renew_by}: a project contributes one registration, so a second one is refused rather than silently replacing the first`);this.held=t;this.name="RedskilledProjectRegisteredError"}};function vi(e,n){if(n.held!=null)throw new _r(n.held);let t=br(e.project_label,"a project label"),r=br(e.selector,"a selector"),o=kr(e.argv,t),s=Rr(e.env,t),i=br(e.workspace_path,`a workspace path for project ${JSON.stringify(t)}`);if(!Number.isInteger(e.target)||e.target<0)throw new Error(`redskilled needs a whole, non-negative target to register project ${JSON.stringify(t)}, not ${JSON.stringify(e.target)}`);let l=e.renew_within_ms??sm;if(!Number.isFinite(l)||l<=0)throw new Error(`redskilled needs a positive renewal window to register project ${JSON.stringify(t)}, not ${JSON.stringify(e.renew_within_ms)}: a registration that lapses on arrival is a poll nobody asked for`);let a=Date.parse(n.now);if(!Number.isFinite(a))throw new Error(`redskilled needs an instant to date a registration, not ${JSON.stringify(n.now)}`);return{version:1,project_label:t,selector:r,argv:o,workspace_path:i,env:s,target:e.target,registered_at:new Date(a).toISOString(),renew_within_ms:l,renew_by:new Date(a+l).toISOString(),renewed_at:new Date(a).toISOString(),renewals:0,launch_revision:0}}var zn=class extends Error{constructor(t){super(`redskilled holds no registration for project ${JSON.stringify(t)} to renew: it lapsed or was never held, and a renewal never mints a record \u2014 register again, stating the selector, the argv and the target`);this.projectLabel=t;this.name="RedskilledProjectUnregisteredError"}};function Si(e,n){let t=Date.parse(n.now);if(!Number.isFinite(t))throw new Error(`redskilled needs an instant to date a renewal, not ${JSON.stringify(n.now)}`);let r=n.renew_within_ms??e.renew_within_ms;if(!Number.isFinite(r)||r<=0)throw new Error(`redskilled needs a positive renewal window to renew project ${JSON.stringify(e.project_label)}, not ${JSON.stringify(n.renew_within_ms)}`);let o=n.launch==null?{env:e.env??{},launch_revision:e.launch_revision??0}:{argv:kr(n.launch.argv,e.project_label),env:Rr(n.launch.env,e.project_label),launch_revision:(e.launch_revision??0)+1};return{...e,...o,renew_within_ms:r,renewed_at:new Date(t).toISOString(),renew_by:new Date(t+r).toISOString(),renewals:e.renewals+1}}function xi(e,n){let t=Date.parse(n.now);if(!Number.isFinite(t))throw new Error(`redskilled needs an instant to sustain a registration, not ${JSON.stringify(n.now)}`);let r=JSON.stringify(e.project_label),o=Math.max(0,n.liveWorkers??0),s=n.queue,i=s!=null&&s.outcome==="counted"?s.depth:null,l=i!=null&&i>0?"open-work":o>0?"live-worker":null;if(l==null){let a=i===0?"drained":"uncounted";return{registration:e,verdict:a,detail:a==="drained"?`project ${r} has nothing queued and no Worker running, so nothing holds its registration up and it lapses at ${e.renew_by}`:`no poll counted project ${r}, and an uncounted queue never sustains a registration \u2014 it stands on its own deadline of ${e.renew_by}`}}return{registration:{...e,renew_by:new Date(t+e.renew_within_ms).toISOString(),sustained_at:new Date(t).toISOString(),sustains:(e.sustains??0)+1,sustained_by:l},verdict:l,detail:l==="open-work"?`project ${r} has ${i} item(s) queued, so its registration stands past its window`:`project ${r} holds ${o} Worker(s), so its registration stands past its window`}}function lm(e,n){let t=Date.parse(e.renew_by);return Number.isFinite(t)?n>=t:!1}function Ei(e,n){let t=Date.parse(e.renewed_at??e.registered_at),r=s=>Number.isFinite(s)&&n-s<=e.renew_within_ms*im;if(r(t))return"renewing";let o=e.sustained_at==null?Number.NaN:Date.parse(e.sustained_at);return r(o)?"self-renewing":"running-on"}function Pi(e,n){let t=[],r=[];for(let o of e)(lm(o,n)?r:t).push(o);return{standing:t,lapsed:r}}function wr(e){if(e===null||typeof e!="object"||Array.isArray(e))return!1;let n=e;return n.version===1&&typeof n.project_label=="string"&&typeof n.selector=="string"&&Array.isArray(n.argv)&&n.argv.every(t=>typeof t=="string")&&typeof n.workspace_path=="string"&&Number.isInteger(n.target)&&typeof n.registered_at=="string"&&typeof n.renew_within_ms=="number"&&typeof n.renew_by=="string"&&(n.renewed_at===void 0||typeof n.renewed_at=="string")&&(n.renewals===void 0||Number.isInteger(n.renewals))&&(n.env===void 0||am(n.env))&&(n.launch_revision===void 0||Number.isInteger(n.launch_revision))&&(n.sustained_at===void 0||typeof n.sustained_at=="string")&&(n.sustains===void 0||Number.isInteger(n.sustains))&&(n.sustained_by===void 0||n.sustained_by==="open-work"||n.sustained_by==="live-worker")}function am(e){return e===null||typeof e!="object"||Array.isArray(e)?!1:Object.values(e).every(n=>typeof n=="string")}function br(e,n){if(typeof e!="string"||e==="")throw new Error(`redskilled needs ${n} to register a project, not ${JSON.stringify(e)}`);return e}var dm={ping:"host-read","host-state":"host-read","statusline-payload":"host-read",shutdown:"daemon-life","worker-start":"project-write","worker-stop":"project-write","worker-recycle":"project-write","worker-steer":"project-write","worker-heartbeat":"project-write","project-register":"project-write","project-renew":"project-write","project-deregister":"project-write"};function ji(e){return`worker-${e}`}function Di(e){let n=dm[e.op]??"project-write",t=e.sessionProject??null,r=e.targetProject??null,o={version:1,op:e.op,reach:n,session_project:t,target_project:r};return n==="host-read"?{...o,permitted:!0,verdict:"permitted-host-read",reason:`redskilled permitted ${e.op}: a session reads the whole host, whichever project it was started in`}:n==="daemon-life"?{...o,permitted:!0,verdict:"permitted-daemon-life",reason:`redskilled permitted ${e.op}: it acts on the daemon's own process, not on any project's Workers`}:t==null||t===""?{...o,permitted:!0,verdict:"permitted-unattributed",reason:`redskilled permitted ${e.op}: the session named no project of its own, so there is nothing to refuse it against`}:r!=null&&r===t?{...o,permitted:!0,verdict:"permitted-own-project",reason:`redskilled permitted ${e.op}: the target belongs to project ${JSON.stringify(t)}, which is this session's own`}:{...o,permitted:!1,verdict:"refused-cross-project",reason:`redskilled refused ${e.op} from a session in project ${JSON.stringify(t)}: ${r==null?"it names no Worker of that project":`the target belongs to project ${JSON.stringify(r)}`}. A session reads the whole host and writes only its own project.`}}function Ii(e){return{generated_at:e.now,hour:Oi("hour",36e5,e),day:Oi("day",864e5,e)}}function Qn(e,n,t){let r=cn(t.now),o=t.retentionMs??864e5,s=t.limit??8192,i=e.filter(l=>{let a=cn(n(l));return a==null?!1:r==null||r-a<=o});return i.length<=s?i:i.slice(i.length-s)}function Oi(e,n,t){let r=cn(t.now),o=r==null?null:r-n,s=e==="hour"?"1h":"24h",i=t.observations.map(p=>({observation:p,at:cn(p.observed_at)})).filter(p=>p.at!=null&&Ai(p.at,o,r)).sort((p,m)=>p.at-m.at),l=t.outcomes.map(p=>cn(p.ts)).filter(p=>p!=null&&Ai(p,o,r)),a=Li(i,p=>p.tokens,"tokens",s),d=Li(i,p=>p.tools,"tools",s),u=[];return i.length===0?u.push("worker-vitals"):(a.samples===0&&u.push("worker-vitals.tokens"),d.samples===0&&u.push("worker-vitals.tools")),l.length===0&&u.push("worker-outcomes"),{window:e,window_ms:n,from:o==null?t.now:new Date(o).toISOString(),to:t.now,tokens_per_min:a,tools_per_min:d,issues_per_hour:cm(l.length,n,s),runner_share:$i("runner",i,p=>p.runner,s),model_share:$i("model",i,p=>p.model,s),unavailable:u}}function Li(e,n,t,r){let o=new Map,s=0;for(let d of e){let u=n(d.observation);if(u==null||!Number.isFinite(u))continue;s+=1;let p=o.get(d.observation.worker_id)??[];p.push({at:d.at,count:u}),o.set(d.observation.worker_id,p)}if(s===0)return{value:null,absent_reason:`no Worker published a ${t} count in the last ${r}`,samples:0};let i=0,l=null,a=null;for(let d of o.values()){if(d.length<2)continue;for(let m=1;m<d.length;m++){let h=d[m-1],y=d[m];h==null||y==null||(i+=Math.max(0,y.count-h.count))}let u=d[0],p=d[d.length-1];u!=null&&(l=l==null?u.at:Math.min(l,u.at)),p!=null&&(a=a==null?p.at:Math.max(a,p.at))}return l==null||a==null||a<=l?{value:null,absent_reason:`the last ${r} holds one sample of ${t} per Worker, and one instant spans no rate`,samples:s}:{value:i/((a-l)/6e4),absent_reason:null,samples:s}}function cm(e,n,t){return e===0?{value:null,absent_reason:`no Worker outcome was recorded in the last ${t}`,samples:0}:{value:e/(n/36e5),absent_reason:null,samples:e}}function $i(e,n,t,r){let o=new Map;for(let d of n){let u=t(d.observation);u!=null?o.set(d.observation.worker_id,u):o.has(d.observation.worker_id)||o.set(d.observation.worker_id,null)}let s=new Map,i=0,l=0;for(let d of o.values()){if(d==null){l+=1;continue}i+=1,s.set(d,(s.get(d)??0)+1)}let a=[...s.entries()].map(([d,u])=>({key:d,worker_count:u,share:u/i})).sort((d,u)=>u.worker_count-d.worker_count||d.key.localeCompare(u.key));return{dimension:e,attributed_workers:i,unattributed_workers:l,shares:a,absent_reason:a.length>0?null:o.size===0?`no Worker was observed in the last ${r}`:`no Worker published a ${e} in the last ${r}`}}function Ai(e,n,t){return n==null||t==null?!0:e>=n&&e<=t}function cn(e){let n=Date.parse(e);return Number.isFinite(n)?n:null}import{execFileSync as um}from"node:child_process";import{readFileSync as pm,readdirSync as mm}from"node:fs";import{join as fm}from"node:path";function un(e){let n=e.budget??{},t=[["MemoryMax",n.memory_max],["MemoryHigh",n.memory_high],["MemoryMax",e.memory_ceiling]];for(let[r,o]of t){if(o==null)continue;let s=Ae(o);return s==null?null:{name:r,declared:o,bytes:s}}return null}function Ti(e){let n=[],t=[];for(let r of e.workers){let o=un(r);if(o==null){t.push({worker_id:r.worker_id,reason:(r.budget?.memory_max??r.budget?.memory_high??r.memory_ceiling)==null?"this Worker declared no memory budget and the host derived no ceiling for it, so the sampler has none to enforce":"this Worker's declared memory budget cannot be reduced to bytes, so the sampler has no ceiling to enforce"});continue}let s=e.rss[r.worker_id];if(typeof s!="number"||!Number.isFinite(s)){t.push({worker_id:r.worker_id,reason:"the host produced no RSS reading for this Worker on this tick, and an unmeasured Worker is never killed on suspicion"});continue}s<=o.bytes||n.push(gm(r,o,s))}return{terminations:n,unenforceable:t}}function gm(e,n,t){let r=`Worker ${JSON.stringify(e.worker_id)} of project ${JSON.stringify(e.project_label)}`;return{version:1,worker_id:e.worker_id,project_label:e.project_label,outcome:"terminated-over-memory-budget",classification:"budget-exceeded",stall:!1,budget_name:n.name,budget_declared:n.declared,budget_bytes:n.bytes,observed_rss_bytes:t,workspace_path:e.workspace_path,reason:`redskilled terminated ${r}: its tree RSS of ${t} bytes exceeded its ${n.name} budget of ${n.declared} (${n.bytes} bytes). This is a budget termination, not a stall, and the work in ${JSON.stringify(e.workspace_path)} is handed forward.`}}var hm=4096;function Ni(e,n={}){let t=n.platform??process.platform,r={rss:{},cpu_seconds:{}};if(e.length===0)return r;let o=ym(t,n);if(o.size===0)return r;let s=new Map;for(let a of o.values()){let d=s.get(a.ppid);d?d.push(a.pid):s.set(a.ppid,[a.pid])}let i={},l={};for(let a of e){if(!o.has(a.pid))continue;let d=0,u=0,p=[a.pid],m=new Set;for(;p.length>0;){let h=p.pop();if(m.has(h))continue;m.add(h);let y=o.get(h);if(y){d+=y.rssBytes,u+=y.cpuSeconds;for(let b of s.get(h)??[])p.push(b)}}i[a.worker_id]=d,l[a.worker_id]=u}return{rss:i,cpu_seconds:l}}function ym(e,n){return n.procRoot!=null||e==="linux"?vm(n.procRoot??"/proc"):n.psTable!=null||e==="darwin"?_m(km(n.psTable)):new Map}function km(e){try{return(e??Rm)()}catch{return""}}function Rm(){return um("ps",["-axo","pid=,ppid=,rss=,time="],{encoding:"utf8",maxBuffer:16*1024*1024})}var bm=1024;function _m(e){let n=new Map;for(let t of e.split(`
|
|
58
|
+
`)){let r=t.trim().split(/\s+/);if(r.length!==4)continue;let[o,s,i]=r.slice(0,3).map(Number);if(![o,s,i].every(a=>a!=null&&Number.isSafeInteger(a)&&a>=0))continue;let l=wm(r[3]);l!=null&&n.set(o,{pid:o,ppid:s,rssBytes:i*bm,cpuSeconds:l})}return n}function wm(e){let n=e.indexOf("-"),t=n<0?0:Number(e.slice(0,n));if(!Number.isFinite(t)||t<0)return null;let r=e.slice(n+1).split(":"),o=t*86400,s=1;for(let i=r.length-1;i>=0;i--){let l=Number(r[i]);if(!Number.isFinite(l)||l<0||r[i]==="")return null;o+=l*s,s*=60}return o}function vm(e){let n=new Map,t;try{t=mm(e)}catch{return n}for(let r of t){if(!/^\d+$/.test(r))continue;let o;try{o=pm(fm(e,r,"stat"),"utf8")}catch{continue}let s=xm(o);s&&n.set(s.pid,{pid:s.pid,ppid:s.ppid,rssBytes:s.rssPages*hm,cpuSeconds:s.cpuTicks/Sm})}return n}var Sm=100;function xm(e){let n=e.lastIndexOf(")");if(n<0)return null;let t=Number(e.slice(0,e.indexOf(" "))),r=e.slice(n+1).trim().split(/\s+/),o=Number(r[1]),s=Number(r[11]),i=Number(r[12]),l=Number(r[21]);return!Number.isSafeInteger(t)||!Number.isSafeInteger(o)||!Number.isFinite(l)||!Number.isFinite(s)||!Number.isFinite(i)?null:{pid:t,ppid:o,rssPages:Math.max(0,l),cpuTicks:Math.max(0,s)+Math.max(0,i)}}var vr=class extends Error{constructor(t,r,o){super(`redskilled polls every repository with one host token ${JSON.stringify(o)}, and project ${JSON.stringify(t)} declares its own credential ${JSON.stringify(r)}: a project needing its own credential invalidates the host-scoped poller (ADR 0130 Amendment 1) rather than bending it, so the poller returns to the projects instead of reaching this repository under the wrong identity`);this.projectLabel=t;this.tokenRef=r;this.hostTokenRef=o;this.name="RedskilledSplitCredentialError"}};function xr(e,n){for(let t of e)if(t.token_ref!=null&&t.token_ref!==n)throw new vr(t.project_label,t.token_ref,n)}function Em(e,n={now:new Date(0).toISOString()}){Dm(e);let t=n.closedWindowMs??6048e5,r=Date.parse(n.now);if(!Number.isFinite(r))throw new Error(`redskilled activity fetch needs an instant, not ${JSON.stringify(n.now)}`);let o=new Date(r-Math.max(0,t)).toISOString(),s=e.map((a,d)=>({alias:`r${d}`,search_alias:`c${d}`,project:a}));return{query:["query RedskilledRepositoryActivity {"," rateLimit { remaining resetAt }",...s.flatMap(({alias:a,search_alias:d,project:u})=>{let p=JSON.stringify(u.owner),m=JSON.stringify(u.name),h=JSON.stringify(`repo:${u.owner}/${u.name} is:closed closed:>=${o}`);return[` ${a}: repository(owner: ${p}, name: ${m}) {`," nameWithOwner"," open_pull_requests: pullRequests(states: OPEN) { totalCount }"," open_issues: issues(states: OPEN) { totalCount }"," }",` ${d}: search(query: ${h}, type: ISSUE, first: 1) { issueCount }`]}),"}"].join(`
|
|
59
|
+
`),aliases:s,closed_since:o}}function Pm(e,n,t){let r=Ie(n),o=Ie(r.data),s=Array.isArray(r.errors)?r.errors.map(Ie):[],i=Om(o.rateLimit,s),l=e.aliases.map(({alias:a,search_alias:d,project:u})=>{let p=u.owner+"/"+u.name,m=o[a],h=s.find(y=>Wi(y.path,a)||Wi(y.path,d));if(Vi(m)){let y=Mi(m.open_pull_requests),b=Mi(m.open_issues),k=Lm(o[d]);if(y!=null&&b!=null&&k!=null)return{project_label:u.project_label,repository:p,outcome:"counted",counts:{open_pull_requests:y,open_issues:b,recently_closed:k},detail:`counted ${p} for project ${JSON.stringify(u.project_label)}`}}return i.exhausted||Ui(h)?{project_label:u.project_label,repository:p,outcome:"rate-limited",counts:null,detail:`the host token's quota was spent before ${p} answered, so this project has no counts rather than zero counts${i.reset_at==null?"":`; the quota resets at ${i.reset_at}`}`}:{project_label:u.project_label,repository:p,outcome:"unreachable",counts:null,detail:`${p} is not reachable with the host token: ${Sr(h?.message)||"the query returned no such repository"}`}});return{version:1,fetched_at:t.fetchedAt,request_count:1,project_count:l.length,rate_limit:i,projects:l}}function jm(e){return{version:1,fetched_at:e,request_count:0,project_count:0,rate_limit:{remaining:null,reset_at:null,exhausted:!1},projects:[]}}async function Ci(e){if(e.projects.length===0)return jm(e.now);xr(e.projects,e.hostTokenRef);let n=Em(e.projects,{now:e.now,closedWindowMs:e.closedWindowMs});try{let t=await e.transport(n.query);return Pm(n,t,{fetchedAt:e.now})}catch(t){let r=t instanceof Error?t.message:String(t),o=/rate limit|secondary rate|429/i.test(r);return{version:1,fetched_at:e.now,request_count:1,project_count:e.projects.length,rate_limit:{remaining:null,reset_at:null,exhausted:o},projects:e.projects.map(s=>({project_label:s.project_label,repository:`${s.owner}/${s.name}`,outcome:o?"rate-limited":"unreachable",counts:null,detail:`the activity fetch failed before ${s.owner}/${s.name} answered: ${r}`}))}}}function Fi(e){let n=e.stalenessMs??12e4,t=e.activity;if(t==null)return{version:1,fetched_at:null,age_ms:null,threshold_ms:n,stale:!1,request_count:0,rate_limit:{remaining:null,reset_at:null,exhausted:!1},projects:[],reason:"the daemon polls no repository, so there are no counts to age"};let r=Date.parse(e.now),o=Date.parse(t.fetched_at),s=Number.isFinite(r)&&Number.isFinite(o)?Math.max(0,r-o):null,i=s==null||s>n;return{version:1,fetched_at:t.fetched_at,age_ms:s,threshold_ms:n,stale:t.projects.length>0&&i,request_count:t.request_count,rate_limit:t.rate_limit,projects:t.projects.map(l=>({...l,fetched_at:t.fetched_at,age_ms:s,stale:i})),reason:t.projects.length===0?"the daemon polls no repository, so there are no counts to age":s==null?"these counts carry no readable instant, so they cannot be presented as current":i?`these counts are ${s}ms old, past the ${n}ms window`:`fetched ${s}ms ago, within the ${n}ms window`}}function Hi(e){let n=e.endpoint??"https://api.github.com/graphql",t=e.fetchImpl??fetch;return async r=>{let o=await t(n,{method:"POST",headers:{authorization:`bearer ${e.token}`,"content-type":"application/json",accept:"application/vnd.github+json"},body:JSON.stringify({query:r})});if(!o.ok){let s=o.headers.get("x-ratelimit-remaining"),i=o.status===429||s==="0";throw new Error(`the activity query was refused with HTTP ${o.status}`+(i?": the host token's rate limit is spent":""))}return await o.json()}}function Dm(e){if(e.length===0)throw new Error("redskilled activity fetch needs at least one registered project");if(e.length>100)throw new Error("redskilled activity fetch spans at most 100 repositories in one query");let n=new Set;for(let t of e){if(t.project_label===""||t.owner===""||t.name==="")throw new Error("redskilled activity fetch needs a project label and an owner/name for every registered project");if(n.has(t.project_label))throw new Error(`redskilled holds one repository per project, and ${JSON.stringify(t.project_label)} is registered twice`);n.add(t.project_label)}}function Om(e,n){let t=Ie(e),r=typeof t.remaining=="number"&&Number.isFinite(t.remaining)?t.remaining:null,o=typeof t.resetAt=="string"?t.resetAt:null,s=n.some(Ui);return{remaining:r,reset_at:o,exhausted:s||r===0}}function Ui(e){if(e==null)return!1;let n=Sr(e.type),t=Sr(e.message);return n==="RATE_LIMITED"||/rate limit/i.test(t)}function Wi(e,n){return Array.isArray(e)&&e.includes(n)}function Mi(e){let n=Ie(e);return Number.isInteger(n.totalCount)?n.totalCount:null}function Lm(e){let n=Ie(e);return Number.isInteger(n.issueCount)?n.issueCount:null}function Ie(e){return Vi(e)?e:{}}function Vi(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Sr(e){return typeof e=="string"?e:""}var $m=3e4,Am=4;function Bi(e){let n=e.stalenessMs??$m,t=pn(e.now),r=e.sampledAt==null?null:pn(e.sampledAt),o=t==null||r==null?null:Math.max(0,t-r),s=o!=null&&o<=n,i=new Set(e.reattachedWorkerIds??[]),l=e.hostState.workers.map(m=>Nm(m,{rss:e.rss,sampledAt:e.sampledAt,ageMs:o,sampleFresh:s,nowMs:t,log:e.logLines?.[m.worker_id],display:e.displays?.[m.worker_id],state:i.has(m.worker_id)?"reattached":"running"})),a=l.filter(m=>m.vitals.rss_bytes==null).map(m=>m.worker_id).sort(),d=l.length-a.length,u=l.reduce((m,h)=>m+(h.vitals.rss_bytes??0),0),p=Jn(e.hostState.workers);return{version:1,generated_at:e.now,daemon:{pid:e.hostState.pid,daemon_version:e.hostState.daemon_version,protocol_version:e.hostState.protocol_version,started_at:e.hostState.started_at,machine_id_hash:e.hostState.machine_id_hash,session_key_hash:e.hostState.session_key_hash},staleness:Fm({sampledAt:e.sampledAt,ageMs:o,threshold:n,workerCount:l.length,measuredCount:d,unmeasured:a}),host:{worker_count:l.length,project_count:e.hostState.projects.length,ceiling:e.ceiling,consumption:p,budget_accounting:e.hostState.budget_accounting,observed_rss_bytes:u,measured_worker_count:d,ceiling_used_fraction:e.ceiling.memory_bytes==null||e.ceiling.memory_bytes<=0?null:p.memory_bytes/e.ceiling.memory_bytes},projects:Cm(l),known_projects:Mm(e.hostState),registered_projects:(e.hostState.registrations??[]).map(m=>m.project_label).sort((m,h)=>m.localeCompare(h)),workers:l,repository_activity:Fi({activity:e.repositoryActivity??null,now:e.now,stalenessMs:e.activityStalenessMs}),...e.deaths===void 0?{}:{deaths:Im(e.deaths,e.recentDeathLimit??Am)},engine:Tm(e.hostState),...e.metrics===void 0?{}:{metrics:e.metrics}}}function Im(e,n){let t=[...e].sort((o,s)=>(pn(s.ts)??0)-(pn(o.ts)??0)),r=t.slice(0,Math.max(0,Math.floor(n))).map(o=>({kind:o.kind,id:o.id,pid:o.pid,ts:o.ts,last_seen:o.last_seen,last_phase:o.last_phase,sender_class:o.sender_class,confidence:o.confidence,signal:o.signal,evidence:o.evidence[0]??null}));return{count:t.length,recent:r,latest:r[0]??null,reaped_at:r[0]?.ts??null}}function Tm(e){let n=e.upgrade,t=n?.running_version??e.daemon_version,r=n?.published_version??null,o=n?.newest_published_version??null,s=(n?.newer_published??0)>0,i=(n?.major_held??0)>0;return{running_version:t,published_version:r,newer_published:s,major_held:i,current:r==null&&o==null?null:!s&&!i}}function Nm(e,n){let t=n.rss[e.worker_id],r=typeof t=="number"&&Number.isFinite(t)?t:null,o=un(e),s=e.budget?.memory_max??e.budget?.memory_high??null,i=pn(e.started_at);return{worker_id:e.worker_id,project_label:e.project_label,workspace_path:e.workspace_path,pid:e.pid,started_at:e.started_at,uptime_ms:n.nowMs==null||i==null?null:Math.max(0,n.nowMs-i),state:n.state,isolated:e.isolated,unit:e.unit??null,warnings:[...e.warnings],vitals:{rss_bytes:r,sampled_at:r==null?null:n.sampledAt,age_ms:r==null?null:n.ageMs,fresh:r!=null&&n.sampleFresh},budget:{name:o?.name??null,declared:o?.declared??s,bytes:o?.bytes??null,used_bytes:r,used_fraction:o==null||o.bytes<=0||r==null?null:r/o.bytes,enforceable:o!=null},log:Wm(n.log),display:n.display?.display??null,display_published_at:n.display?.published_at??null}}function Wm(e){let n={last_line:null,published_at:null,source:null};return e==null||e.line.trim()===""?n:{last_line:e.line,published_at:e.published_at,source:e.source}}function Mm(e){let n=new Set;for(let t of e.registrations??[])n.add(t.project_label);for(let t of e.projects)n.add(t.project_label);return[...n].sort((t,r)=>t.localeCompare(r))}function Cm(e){let n=new Map;for(let t of e){let r=n.get(t.project_label)??{workers:0,declared:0,observed:0,measured:0};r.workers+=1,r.declared+=t.budget.bytes??0,r.observed+=t.vitals.rss_bytes??0,r.measured+=t.vitals.rss_bytes==null?0:1,n.set(t.project_label,r)}return[...n.entries()].map(([t,r])=>({project_label:t,worker_count:r.workers,declared_memory_bytes:r.declared,observed_rss_bytes:r.observed,measured_worker_count:r.measured})).sort((t,r)=>t.project_label.localeCompare(r.project_label))}function Fm(e){let n={sampled_at:e.sampledAt,age_ms:e.ageMs,threshold_ms:e.threshold,measured_worker_count:e.measuredCount,unmeasured_workers:e.unmeasured};return e.workerCount===0?{...n,stale:!1,reason:"the host holds no Workers, so there is nothing to measure and nothing to age"}:e.sampledAt==null||e.ageMs==null?{...n,stale:!0,reason:`this answer is stale: the daemon has taken no measurement of its ${e.workerCount} live Worker(s) yet`}:e.ageMs>e.threshold?{...n,stale:!0,reason:`this answer is stale: its measurement is ${e.ageMs}ms old, past the ${e.threshold}ms staleness window`}:{...n,stale:!1,reason:`measured ${e.ageMs}ms ago, within the ${e.threshold}ms staleness window`}}function pn(e){let n=Date.parse(e);return Number.isFinite(n)?n:null}var O={mode:"local",project:null,maxWorkers:4,maxProjects:4,maxWidth:120,separator:" \xB7 ",verbose:!1};function Ki(e,n=O){let t=qm(e,n),r=Km(e,n),o=Jm(e,n),s=Gm(e,n,r,t),i=Vm(n,r,o),l={detail:"host",line:s};for(let p of i){let m=of(s,Bm(p,n,r,o),n.separator);if(l={detail:p,line:m},sf(m)<=n.maxWidth)break}let a=Dr(l.line,n.maxWidth),d=n.verbose&&l.detail==="workers"?ef(r,n):[],u=r.length>0?"workers":"host";return{version:1,line:a,lines:[a,...d],verbose:n.verbose,mode:n.mode,project:n.project,project_match:t,detail:l.detail,degraded:l.detail!==u||a!==l.line,stale:e.staleness.stale,generated_at:e.generated_at}}function Ji(e){let n=e.options??O,t=Dr(Um,n.maxWidth);return{version:1,line:t,lines:[t],verbose:n.verbose,mode:n.mode,project:n.project,project_match:"unanswered",detail:"host",degraded:!0,stale:!0,generated_at:e.generated_at}}var Hm="!unregistered",Pr="\u21E1",Yn="\u2020",Um="redskilled unreachable \u2014 Worker state unknown";function Vm(e,n,t){let r=[];return n.length>0&&n.length<=e.maxWorkers&&r.push("workers"),e.mode==="global"&&t.length>0&&t.length<=e.maxProjects&&r.push("projects"),r.push("host"),r}function Bm(e,n,t,r){return e==="workers"?t.map(o=>Xm(o,n)):e==="projects"?r.map(rf):[]}function Km(e,n){return n.mode==="global"?e.workers:n.project==null?[]:e.workers.filter(t=>t.project_label===n.project)}function Jm(e,n){return n.mode==="global"?e.projects:e.projects.filter(t=>t.project_label===n.project)}function qm(e,n){return jr(e,n.project)}function jr(e,n){return n==null?"unresolved":e.known_projects==null?"matched":e.known_projects.includes(n)?e.registered_projects==null||e.registered_projects.includes(n)?"matched":"name-only":"unregistered"}function Gm(e,n,t,r){let o=[];n.mode==="global"?(o.push(`host ${e.host.worker_count}w/${e.host.project_count}p`),o.push(Er(e,n))):r==="matched"?(o.push(`${n.project} ${t.length}w`),o.push(Er(e,n)),t.length===0&&o.push("idle")):r==="name-only"?(o.push(`${n.project} ${t.length}w`),o.push(Er(e,n)),o.push(Hm)):o.push(Ym(n.project,r)),o.push(zm(e));let s=Qm(e);return s!=null&&o.push(s),e.staleness.stale&&o.push(Zm(e)),o.join(" ")}function zm(e){let n=e.engine,t=n?.running_version??e.daemon.daemon_version;return n==null||n.current!==!1?`v${t}`:`v${t}${Pr}`}function Qm(e){let n=e.deaths;return n==null||n.count<=0||n.latest==null?null:`${Yn}${n.count} ${n.latest.sender_class}`}function Ym(e,n){return n==="unregistered"?`project unknown \u2014 ${e} is not registered on this host`:"project unknown \u2014 this directory resolved to no project"}function Er(e,n){let t=n.mode==="global"?e.host.observed_rss_bytes:e.projects.filter(o=>o.project_label===n.project).reduce((o,s)=>o+s.observed_rss_bytes,0),r=e.host.ceiling.memory_bytes;return n.mode==="global"&&r!=null&&r>0?`${H(t)}/${H(r)}`:H(t)}function Zm(e){let n=e.staleness.age_ms;return n==null?"!unmeasured":`!stale ${Math.round(n/1e3)}s`}function Xm(e,n){let t=qi(e,n),r=e.vitals.rss_bytes,o=r==null?"?":e.budget.bytes==null?H(r):`${H(r)}/${H(e.budget.bytes)}`;return`${t} ${o}`}function ef(e,n){let t=[];for(let r of e){let o=tf(r.log.last_line);o!=null&&t.push(Dr(` ${nf} ${qi(r,n)}: ${o}`,n.maxWidth))}return t}var nf="\u21B3";function tf(e){if(e==null)return null;let n=e.replace(/[\u0000-\u001f\u007f]+/g," ").replace(/\s+/g," ").trim();return n===""?null:n}function qi(e,n){return n.mode==="global"?`${e.project_label}:${e.worker_id}`:e.worker_id}function rf(e){return`${e.project_label} ${e.worker_count}w ${H(e.observed_rss_bytes)}`}function of(e,n,t){return[e,...n].join(t)}function sf(e){return[...e].length}function Dr(e,n){if(n<=0)return"";let t=[...e];return t.length<=n?e:n===1?"\u2026":`${t.slice(0,n-1).join("")}\u2026`}function H(e){if(!Number.isFinite(e)||e<=0)return"0B";let n=["B","K","M","G","T"],t=e,r=0;for(;t>=1024&&r<n.length-1;)t/=1024,r+=1;return`${t>=100||r===0?Math.round(t).toString():t.toFixed(1).replace(/\.0$/,"")}${n[r]}`}var Or={runner:null,model:null,effort:null,origin:null,issue:null,phase:null,step:null,phase_index:null,phase_total:null,failed:!1,heartbeat:null,added:null,removed:null,tokens:null,tools:null,reasoning:null,text:null},lf=["runner","model","effort","origin","issue","phase","step","heartbeat"],af=["phase_index","phase_total","added","removed","tokens","tools","reasoning","text"];function Gi(e){if(e===null||typeof e!="object"||Array.isArray(e))return null;let n=e,t={...Or};for(let r of lf){let o=n[r];t[r]=typeof o=="string"&&o.trim()!==""?o:null}for(let r of af){let o=n[r];t[r]=typeof o=="number"&&Number.isFinite(o)?o:null}return t.failed=n.failed===!0,t}var Zn=["wid","run","org","iss","bar","phase","elapsed","hb","loc","tks","tls","rsn","txt"],Te={mode:"local",project:null,maxWidth:200,maxRows:16};var df=" ",zi="\u2588",cf="\u25B6",uf="\u2717",pf="\u2591";function Qi(e,n=Te){let t=jr(e,n.project),r=mf(e,n),o=r.slice(0,Math.max(0,Math.floor(n.maxRows))),s=o.map(p=>ff(p,n)),i=vf(s),l=o.map((p,m)=>({worker_id:p.worker_id,project_label:p.project_label,mine:n.project!=null&&p.project_label===n.project,cells:s[m],line:mn(Sf(s[m],i),n.maxWidth)})),a=hf(e,n,r,t),d=r.length-o.length,u=[a.line,...l.map(p=>p.line)];return d>0&&u.push(mn(`\u2026 ${d} more Worker(s) \u2014 the row budget is short, not the host`,n.maxWidth)),u.push(...yf(e,n)),{version:1,generated_at:e.generated_at,mode:n.mode,project:n.project,columns:Zn,header:a,rows:l,lines:u,hidden_row_count:Math.max(0,d),stale:e.staleness.stale}}function mf(e,n){return n.mode==="global"?e.workers:n.project==null?[]:e.workers.filter(t=>t.project_label===n.project)}function ff(e,n){let t=e.display??Or,r=[t.runner,t.model,t.effort].filter(o=>!!o).join(" ");return{wid:n.mode==="global"?`${e.project_label}:${e.worker_id}`:e.worker_id,run:r===""?"":`run=${r}`,org:t.origin==null?"":`org=${t.origin}`,iss:t.issue==null?"":`iss=${t.issue}`,bar:gf(t),phase:[t.phase,t.step].filter(o=>!!o).join("\xB7"),elapsed:wf(e.uptime_ms),hb:`hb=${t.heartbeat??"?"}`,loc:bf(t.added,t.removed),tks:t.tokens==null?"":`tks=${_f(t.tokens)}`,tls:t.tools==null?"":`tls=${t.tools}`,rsn:t.reasoning==null?"":`rsn=${t.reasoning}`,txt:t.text==null?"":`txt=${t.text}`}}function gf(e){let n=e.phase_total,t=e.phase_index;if(n==null||n<=0||t==null||t<0)return"";let r=Math.min(Math.floor(t),Math.floor(n));if(r>=n)return zi.repeat(Math.floor(n));let o=e.failed?uf:cf;return`${zi.repeat(r)}${o}${pf.repeat(Math.floor(n)-r-1)}`}function hf(e,n,t,r){let o=(e.repository_activity?.projects??[]).find(h=>h.project_label===n.project),s={open_pull_requests:o?.counts?.open_pull_requests??null,recently_closed:o?.counts?.recently_closed??null,open_issues:o?.counts?.open_issues??null,stale:o?.stale===!0},i={memory_used_fraction:e.host.ceiling_used_fraction,memory_used_bytes:e.host.consumption.memory_bytes,memory_ceiling_bytes:e.host.ceiling.memory_bytes,worker_count:e.host.worker_count,worker_ceiling:e.host.ceiling.worker_count},l=Rf(t),a=o?.repository??n.project,d=e.engine??null,u=d?.running_version??e.daemon.daemon_version,p=e.deaths??null,m=[`\xBB ${a??"host"} v${u}${d!=null&&d.current===!1?Pr:""}`];if(r==="unregistered"&&m.push("!unregistered"),r==="name-only"&&m.push("!lapsed"),l!=null&&m.push(l),m.push(`wrk=${t.length}/${e.host.worker_count}`),m.push(i.worker_ceiling==null?"slots=\u221E":`slots=${i.worker_count}/${i.worker_ceiling}`),m.push(kf(i)),s.open_pull_requests!=null&&m.push(`prs=${s.open_pull_requests}`),s.recently_closed!=null&&m.push(`cpr=${s.recently_closed}`),s.open_issues!=null&&m.push(`iss=${s.open_issues}`),s.stale&&m.push("!counts stale"),p!=null&&p.count>0&&p.latest!=null&&m.push(`${Yn}${p.count} ${p.latest.sender_class}`),e.staleness.stale){let h=e.staleness.age_ms;m.push(h==null?"!unmeasured":`!stale ${Math.round(h/1e3)}s`)}return{repo:a,project:n.project,project_match:r,version:u,engine:d,deaths:p,model:l,windows:i,counts:s,stale:e.staleness.stale,age_ms:e.staleness.age_ms,line:mn(m.join(" \xB7 "),n.maxWidth)}}function yf(e,n){let t=e.deaths;if(t==null||t.count<=0)return[];let r=t.recent.map(s=>mn(`${Yn} ${s.kind} ${s.id} pid=${s.pid} ${s.sender_class}/${s.confidence} phase=${s.last_phase}`+(s.signal==null?"":` signal=${s.signal}`)+(s.evidence==null?"":` \u2014 ${s.evidence}`),n.maxWidth)),o=t.count-t.recent.length;return o>0&&r.push(mn(`\u2026 ${o} more posed death(s) \u2014 the lane holds them all`,n.maxWidth)),r}function kf(e){if(e.memory_ceiling_bytes==null||e.memory_ceiling_bytes<=0)return`mem=${H(e.memory_used_bytes)}`;let n=e.memory_used_fraction==null?"":` ${Math.round(e.memory_used_fraction*100)}%`;return`mem=${H(e.memory_used_bytes)}/${H(e.memory_ceiling_bytes)}${n}`}function Rf(e){for(let n of e){let t=n.display;if(t==null)continue;let r=[t.runner,t.model,t.effort].filter(o=>!!o);if(r.length>0)return r.join("\xB7")}return null}function bf(e,n){if(e==null&&n==null)return"";let t=[];return e!=null&&e>0&&t.push(`+${e}`),n!=null&&n>0&&t.push(`-${n}`),`loc=${t.length>0?t.join(" "):"0"}`}function _f(e){if(!Number.isFinite(e)||e<=0)return"0";let n=(t,r)=>{let o=(Math.round(t*10)/10).toFixed(1);return`${o.endsWith(".0")?o.slice(0,-2):o}${r}`};return e>=1e9?n(e/1e9,"B"):e>=1e6?n(e/1e6,"M"):e>=1e3?n(e/1e3,"k"):String(Math.round(e))}function wf(e){if(e==null||!Number.isFinite(e)||e<0)return"\u2014";let n=Math.floor(e/1e3);if(n<60)return`${n}s`;let t=Math.floor(n/60);if(t<60)return`${t}m${n%60}s`;let r=Math.floor(t/60);return r<24?`${r}h${t%60}m`:`${Math.floor(r/24)}d${r%24}h`}function vf(e){let n=Object.fromEntries(Zn.map(t=>[t,0]));for(let t of e)for(let r of Zn)n[r]=Math.max(n[r],Yi(t[r]));return n}function Sf(e,n){return Zn.filter(r=>n[r]>0).map(r=>xf(e[r],n[r])).join(df).replace(/\s+$/,"")}function xf(e,n){return e+" ".repeat(Math.max(0,n-Yi(e)))}function Yi(e){return[...e].length}function mn(e,n){if(n<=0)return"";let t=[...e];return t.length<=n?e:n===1?"\u2026":`${t.slice(0,n-1).join("")}\u2026`}var Xn=1;async function fn(e,n){return await Cn(e,n,"redskilled daemon")}function Zi(e){if(e===null||typeof e!="object"||Array.isArray(e))return!1;let n=e;return n.version===1&&typeof n.line=="string"&&Array.isArray(n.lines)&&n.lines.every(t=>typeof t=="string")&&typeof n.verbose=="boolean"&&(n.mode==="local"||n.mode==="global")&&(n.project===null||typeof n.project=="string")&&typeof n.detail=="string"&&(n.project_match===void 0||typeof n.project_match=="string")&&typeof n.degraded=="boolean"&&typeof n.stale=="boolean"&&typeof n.generated_at=="string"}function Xi(e){let n=[...e.workers??[]],t=new Map;for(let r of n)t.set(r.project_label,(t.get(r.project_label)??0)+1);return{version:1,protocol_version:Xn,daemon_version:e.daemonVersion,machine_id_hash:e.machineIdHash,session_key_hash:e.sessionKeyHash,pid:e.pid,started_at:e.startedAt,...e.scope==null?{}:{scope:e.scope},workers:n,projects:[...t.entries()].map(([r,o])=>({project_label:r,worker_count:o})).sort((r,o)=>r.project_label.localeCompare(o.project_label)),registrations:jf(e),...e.lapses==null||e.lapses.length===0?{}:{lapsed_registrations:[...e.lapses]},budget_accounting:ei(n),upgrade:Df(e)}}function jf(e){let n=e.now==null?Number.NaN:Date.parse(e.now),t=Number.isFinite(n),r=e.queue??null,o=new Map(r==null?[]:r.projects.map(s=>[s.project_label,s]));return[...e.registrations??[]].map(s=>{let i=o.get(s.project_label);return{...s,...t?{renewal:Ei(s,n)}:{},...r==null||i==null?{}:{last_poll:{at:r.fetched_at,outcome:i.outcome,depth:i.depth,request_count:r.request_count,detail:i.detail}}}}).sort((s,i)=>s.project_label.localeCompare(i.project_label))}function Df(e){let n=e.daemonVersion,t=e.published?.version??null,r=e.published?.majorHold??null;return{running_version:n,published_version:t,published_unknown:+(t===null),newer_published:+(e.published?.newer===!0),replacement:e.published?.replacement??"none",checked_at:e.published?.checkedAt??null,checks:e.published?.checks??0,hold_reason:e.published?.holdReason??null,newest_published_version:e.published?.newest??null,major_held:+(r!==null),major_hold:r}}function el(e){if(e===null||typeof e!="object"||Array.isArray(e))return!1;let n=e;return n.version===1&&typeof n.protocol_version=="number"&&typeof n.daemon_version=="string"&&typeof n.machine_id_hash=="string"&&typeof n.session_key_hash=="string"&&Number.isInteger(n.pid)&&typeof n.started_at=="string"&&Array.isArray(n.workers)&&Array.isArray(n.projects)&&ni(n.budget_accounting)&&(n.scope===void 0||wi(n.scope))&&(n.registrations===void 0||Array.isArray(n.registrations)&&n.registrations.every(wr))&&(n.upgrade===void 0||Of(n.upgrade))}function Of(e){if(e===null||typeof e!="object"||Array.isArray(e))return!1;let n=e;return typeof n.running_version=="string"&&(n.published_version===null||typeof n.published_version=="string")&&typeof n.published_unknown=="number"&&typeof n.newer_published=="number"&&(n.replacement==="none"||n.replacement==="pending"||n.replacement==="in-progress")&&(n.checked_at===null||typeof n.checked_at=="string")&&(n.newest_published_version===void 0||n.newest_published_version===null||typeof n.newest_published_version=="string")&&(n.major_held===void 0||typeof n.major_held=="number")&&(n.checks===void 0||typeof n.checks=="number")&&(n.hold_reason===void 0||n.hold_reason===null||typeof n.hold_reason=="string")&&(n.major_hold===void 0||n.major_hold===null||Lf(n.major_hold))}function Lf(e){if(e===null||typeof e!="object"||Array.isArray(e))return!1;let n=e;return typeof n.version=="string"&&Number.isInteger(n.running_major)&&Number.isInteger(n.held_major)&&typeof n.reason=="string"&&typeof n.action=="string"&&n.action.trim()!==""}import{spawnSync as tt}from"node:child_process";import{existsSync as Tr}from"node:fs";import{delimiter as Ff,join as cl}from"node:path";import{join as nl}from"node:path";import{existsSync as $f}from"node:fs";import{createRequire as Af}from"node:module";var tl="redskilled-job-object.node",_e=100;function Ne(e){return{available:!1,reason:e}}function If(e,n,t){return[nl(t,"prebuilds",`${e}-${n}`,tl),nl(t,"native","build","Release",tl)]}function rl(e={}){let n=e.platform??process.platform,t=e.arch??process.arch;if(n!=="win32")return Ne(`Job Object placement is the Windows backend (platform=${n}), so there is no native reach to load here`);let r=e.packageRoot??Nf(),o=e.exists??$f,s=If(n,t,r),i=s.find(d=>o(d));if(i==null)return Ne(`no Job Object addon was found for ${n}-${t} (looked in ${s.join(", ")}); either install the prebuild for this platform and architecture or build the addon locally`);let l=e.requireFn??Af(import.meta.url),a;try{a=l(i)}catch(d){return Ne(`the Job Object addon at ${i} could not be loaded: ${d instanceof Error?d.message:String(d)}`)}return Tf(a)?{available:!0,binding:a}:Ne(`the Job Object addon at ${i} does not export createJobObject, so it cannot be the native reach`)}function Tf(e){return typeof e=="object"&&e!=null&&typeof e.createJobObject=="function"}function Nf(){return new URL("..",import.meta.url).pathname}function ol(e){let n=e??{},t=[],r=Wf(n);r==null&&(n.memory_max??n.memory_high)!=null&&t.push("the declared memory budget could not be reduced to bytes, so the job carries no memory ceiling");let o;return n.cpu_weight!=null&&(n.cpu_weight<_e?o=Math.max(1,Math.min(100,Math.round(n.cpu_weight))):t.push(`cpu_weight=${n.cpu_weight} is at or above the fair share of ${_e}, and Windows CPU rate control is an absolute cap rather than a share, so no rate limit is set`)),{...r!=null?{memory_limit_bytes:r.bytes,memory_budget_name:r.name,memory_budget_declared:r.declared}:{},...o!=null?{cpu_rate_percent:o}:{},kill_on_close:!0,...t.length>0?{note:t.join("; ")}:{}}}function Wf(e){return un({budget:e})}var et=5,sl=19;function Lr(e){return{available:!1,reason:e}}var Mf="an address-space rlimit is not a resident-memory ceiling: a runtime that reserves address space it never faults in would die under a limit it never used, so no memory rlimit is set and the daemon's RSS sampling floor is the ceiling that actually holds";function ll(e,n){let t=e??{},r=[],o;if(!n.canRenice)r.push("nice is not on this host, so no priority control was applied and the Worker competes with interactive work");else if(t.cpu_weight==null)o=et;else if(t.cpu_weight<_e){let l=Math.round(sl*(_e-t.cpu_weight)/_e);o=Math.min(sl,Math.max(et,l))}else o=et,r.push(`cpu_weight=${t.cpu_weight} is at or above the fair share of ${_e}, and raising a process's priority requires privilege this daemon does not have, so the Worker keeps the default yield of nice ${et}`);let s=il(t.max_processes);s==null&&t.max_processes!=null&&r.push(`max_processes=${t.max_processes} is not a positive whole number, so no ulimit -u is set`);let i=il(t.cpu_seconds);return i==null&&t.cpu_seconds!=null&&r.push(`cpu_seconds=${t.cpu_seconds} is not a positive whole number, so no ulimit -t is set`),{...o!=null?{nice:o}:{},...s!=null?{max_processes:s}:{},...i!=null?{cpu_seconds:i}:{},memory_ceiling:"sampling-floor",memory_ceiling_reason:Mf,...r.length>0?{note:r.join("; ")}:{}}}function al(e){let{limits:n}=e,t=[];return n.max_processes!=null&&t.push(`ulimit -u ${n.max_processes}`),n.cpu_seconds!=null&&t.push(`ulimit -t ${n.cpu_seconds}`),t.push(n.nice!=null&&e.nice!=null?`exec ${Cf(e.nice)} -n ${n.nice} "$0" "$@"`:'exec "$0" "$@"'),["-c",t.join(`
|
|
60
|
+
`),e.command,...e.args]}function dl(e){let n=[];return e.nice!=null?n.push(`the Worker runs at nice ${e.nice} so it yields to interactive work`):n.push("no priority control was applied"),e.max_processes!=null&&n.push(`its processes are capped at ${e.max_processes}`),e.cpu_seconds!=null&&n.push(`its CPU time is capped at ${e.cpu_seconds} seconds`),`macOS placement applied POSIX limits: ${n.join(", ")}. macOS has no resource-group equivalent, so the Worker is charged to the daemon's own resource group, and ${e.memory_ceiling_reason}`+(e.note!=null?` (${e.note})`:"")}function $r(e){let n=e??{},t=[n.max_processes!=null?"max_processes":null,n.cpu_seconds!=null?"cpu_seconds":null].filter(r=>r!=null);return t.length===0?null:`${t.join(" and ")} ${t.length===1?"is a POSIX rlimit":"are POSIX rlimits"} honoured only by the macOS placement backend, so this placement carries no equivalent`}function il(e){if(e!=null&&!(!Number.isSafeInteger(e)||e<=0))return e}function Cf(e){return`'${e.replace(/'/g,"'\\''")}'`}var ul="REDSKILLED_PLACEMENT",nt="red-worker",Ar="/bin/sh";function pl(e=process.env,n=process.platform){let t=Lr(`POSIX rlimit and priority placement is the macOS backend (platform=${n})`);if(n==="win32")return{platform:n,systemdRun:null,userSession:!1,jobObjects:rl({platform:n}),posix:t};let r=Ne(`Job Object placement is the Windows backend (platform=${n}), so there is no native reach to load here`);if(n==="darwin")return{platform:n,systemdRun:null,userSession:!1,jobObjects:r,posix:Hf(e)};if(n!=="linux")return{platform:n,systemdRun:null,userSession:!1,jobObjects:r,posix:t};let o=(e.XDG_RUNTIME_DIR??"").trim(),s=o!==""&&Tr(cl(o,"systemd","private"));return{platform:n,systemdRun:hl("systemd-run",e),userSession:s,jobObjects:r,posix:t}}function Hf(e){return Tr(Ar)?{available:!0,shell:Ar,nice:hl("nice",e)}:Lr(`no POSIX shell was found at ${Ar}, so there is nothing to apply rlimits or priority in`)}function ml(e=process.env){let n=(e[ul]??"").trim().toLowerCase();return n===""?!0:!["off","false","0","no"].includes(n)}function Uf(e,n,t=nt){return fl(e,n,t).replace(/\.service$/,"")}function fl(e,n,t=nt){return`${Ir(t,"red-worker",24)}-${Ir(e,"project",32)}-${Ir(n,"worker",32)}.service`}function gl(e){let n=[...e.args??[]],t={...e.budget??{},...e.budget?.memory_max==null&&e.memoryCeiling?.memory_max!=null?{memory_max:e.memoryCeiling.memory_max}:{}},r=t.memory_max??t.memory_high??null,o=t.memory_high!=null||t.memory_max!=null||t.cpu_weight!=null,s=e.target??{isolation:"transient-unit"},i=p=>({isolated:!1,backend:"none",command:e.command,args:n,cwd:e.workspacePath,warning:p,...r!=null?{memoryCeiling:r}:{},environment:tn({scope:null,memory_ceiling:r,scope_degradation:p}),...o?{budgetWarning:"a budget was declared but this placement cannot enforce it: the daemon's RSS sampling is the only remaining floor"}:{}});if(s.isolation==="inherit")return i("placement target is `inherit`: the Worker is charged to the daemon's own resource group, so a memory-pressure kill can land on the daemon and every Worker it holds");if(e.enabled===!1)return i(`worker isolation disabled by ${ul}: the Worker is charged to the daemon's own resource group`);if(e.probes.platform==="win32")return Bf(e,n,t,r,o,i);if(e.probes.platform==="darwin")return Vf(e,n,t,r,i);if(e.probes.platform!=="linux")return i(`transient-unit placement is the Linux backend (platform=${e.probes.platform}): the Worker is charged to the daemon's own resource group`);if(!e.probes.systemdRun)return i("transient-unit placement unavailable: systemd-run is not on PATH; the Worker is charged to the daemon's own resource group and a memory-pressure kill will hit the whole session");if(!e.probes.userSession)return i("transient-unit placement unavailable: no systemd --user session; the Worker is charged to the daemon's own resource group and a memory-pressure kill will hit the whole session");let l=fl(e.projectLabel,e.workerId,s.unit_prefix),a=["--user","--collect","--quiet","--wait",`--unit=${l}`,`--working-directory=${e.workspacePath}`];e.pipeOutput===!0&&a.push("--pipe"),t.memory_high!=null&&a.push(`--property=MemoryHigh=${t.memory_high}`),t.memory_max!=null&&a.push(`--property=MemoryMax=${t.memory_max}`),t.cpu_weight!=null&&a.push(`--property=CPUWeight=${t.cpu_weight}`);let d=tn({scope:l,memory_ceiling:r,scope_degradation:null});for(let[p,m]of Object.entries({...e.env??{},...d}))a.push(`--setenv=${p}=${m}`);let u=$r(e.budget);return{isolated:!0,backend:"transient-unit",unit:l,command:e.probes.systemdRun,args:[...a,"--",e.command,...n],...r!=null?{memoryCeiling:r}:{},environment:d,...u!=null?{budgetWarning:u}:{}}}function Vf(e,n,t,r,o){let s=e.probes.posix;if(!s.available)return o(`POSIX limit placement unavailable: ${s.reason}. The Worker is charged to the daemon's own resource group and the daemon's RSS sampling floor is the only remaining ceiling`);let i=ll(t,{canRenice:s.nice!=null}),l=t.memory_high!=null||t.memory_max!=null,a=dl(i);return{isolated:!1,backend:"posix-limits",command:s.shell,args:al({limits:i,nice:s.nice,command:e.command,args:n}),cwd:e.workspacePath,posix:i,warning:a,...r!=null?{memoryCeiling:r}:{},environment:tn({scope:null,memory_ceiling:r,scope_degradation:a}),...l?{budgetWarning:"the declared memory budget is enforced by the daemon's RSS sampling floor rather than by the kernel: "+i.memory_ceiling_reason}:{}}}function Bf(e,n,t,r,o,s){let i=e.probes.jobObjects;if(!i.available)return s(`Job Object placement unavailable: ${i.reason}. The Worker is charged to the daemon's own resource group and the daemon's RSS sampling floor is the only remaining ceiling`);let l=ol(t),a=Uf(e.projectLabel,e.workerId,e.target?.unit_prefix);return{isolated:!0,backend:"job-object",command:e.command,args:[...n],cwd:e.workspacePath,job:{name:a,limits:l},...r!=null?{memoryCeiling:r}:{},environment:tn({scope:a,memory_ceiling:r,scope_degradation:null}),...Kf(o&&l.note!=null?`${l.note}; the daemon's RSS sampling floor is the ceiling for that budget`:null,$r(e.budget))}}function Kf(...e){let n=e.filter(t=>t!=null&&t!=="");return n.length>0?{budgetWarning:n.join("; ")}:{}}function hl(e,n){for(let t of(n.PATH??"").split(Ff)){if(!t)continue;let r=cl(t,e);if(Tr(r))return r}return null}function Ir(e,n,t){return(e||"").toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"").slice(0,t).replace(/-+$/g,"")||n}async function Nr(e,n){let t=[],r=[];for(let o of e){let s=!1;try{s=await n(o)===!0}catch{s=!1}(s?t:r).push(o)}return{alive:t,dead:r}}function yl(e){return e.unit!=null&&e.unit!==""?Jf(e.unit):W(e.pid)}function Jf(e){let n=tt("systemctl",["--user","is-active","--quiet",e],{stdio:"ignore"});return n.error!=null?!1:n.status===0}var qf="REDSKILLED_UNIT_DISCOVERY",kl="(unowned)";function Rl(e){let n=tt("systemctl",["--user","show","--property=MainPID","--value",e],{encoding:"utf8"});if(n.error!=null||n.status!==0)return null;let t=Number.parseInt((n.stdout??"").trim(),10);return Number.isInteger(t)&&t>0?t:null}function Gf(e=process.env){let n=(e[qf]??"").trim().toLowerCase();return n===""?!0:!["off","false","0","no"].includes(n)}function bl(e,n,t=process.env){return Gf(t)&&e===n}function _l(e=nt){let n=tt("systemctl",["--user","list-units","--type=service","--state=active","--plain","--no-legend","--no-pager",`${e}-*.service`],{encoding:"utf8"});return n.error!=null||n.status!==0?[]:(n.stdout??"").split(`
|
|
61
|
+
`).map(t=>t.trim().split(/\s+/)[0]??"").filter(t=>t.startsWith(`${e}-`)&&t.endsWith(".service"))}function wl(e){let n=new Set(e.held.map(o=>o.unit).filter(o=>o!=null&&o!=="")),t=new Set,r=[];for(let o of e.units)o===""||n.has(o)||t.has(o)||(t.add(o),r.push({worker_id:o.replace(/\.service$/,""),project_label:kl,pid:e.mainPid?.(o)??0,started_at:e.now,workspace_path:"",isolated:!0,unit:o,warnings:[`adopted from active unit ${JSON.stringify(o)}, which has no birth on this host's event lane: its project, its Worker id and its budget belonged to a daemon that is gone, so they are reported as unknown rather than guessed \u2014 it is counted against the host budget from here on instead of running outside it`]}));return r}function vl(e){return e.project_label.trim()!==""?e:{...e,project_label:kl,warnings:[...e.warnings,"adopted at start with no owning project on the event lane: the daemon that birthed it recorded no project label, so it is held and counted under a stated placeholder rather than dropped"]}}function Sl(e){if(e.unit!=null&&e.unit!==""){let n=tt("systemctl",["--user","stop",e.unit],{stdio:"ignore"});return n.error==null&&n.status===0}try{return process.kill(e.pid,"SIGTERM"),!0}catch{return!1}}function zf(e,n=50){if(jl(e),!Number.isInteger(n)||n<=0)throw new Error(`redskilled queue discovery needs a whole, positive batch size, not ${JSON.stringify(n)}`);let t=[];for(let r=0;r<e.length;r+=n)t.push(e.slice(r,r+n));return t}function Qf(e,n={}){let t=n.batchSize??50;if(jl(e),e.length>t)throw new Error(`redskilled queue discovery spans at most ${t} selectors in one query, and this batch holds ${e.length}: split it with planQueueDiscoveryBatches rather than dropping the remainder`);let r=e.map((i,l)=>({alias:`q${l}`,project:i}));return{query:["query RedskilledQueueDiscovery {"," rateLimit { remaining resetAt }",...r.map(({alias:i,project:l})=>` ${i}: search(query: ${JSON.stringify(l.selector)}, type: ISSUE, first: 1) { issueCount }`),"}"].join(`
|
|
62
|
+
`),aliases:r}}function Yf(e,n){let t=gn(n),r=gn(t.data),o=Array.isArray(t.errors)?t.errors.map(gn):[],s=Xf(r.rateLimit,o);return{projects:e.aliases.map(({alias:l,project:a})=>{let d=ng(r[l]);if(d!=null)return{project_label:a.project_label,outcome:"counted",depth:d,detail:`project ${JSON.stringify(a.project_label)} has ${d} item(s) matching its selector`};let u=o.find(p=>eg(p.path,l));return s.exhausted||Dl(u)?{project_label:a.project_label,outcome:"rate-limited",depth:null,detail:`the host token's quota was spent before project ${JSON.stringify(a.project_label)} answered, so this queue has no depth rather than a depth of zero`+(s.reset_at==null?"":`; the quota resets at ${s.reset_at}`)}:{project_label:a.project_label,outcome:"unreachable",depth:null,detail:`project ${JSON.stringify(a.project_label)} could not be counted with the host token: ${Wr(u?.message)||"the query returned no count for this selector"}`}}),rate_limit:s}}function Zf(e){return{version:1,fetched_at:e,request_count:0,project_count:0,batch_size:50,rate_limit:{remaining:null,reset_at:null,exhausted:!1},projects:[]}}function El(e,n,t){return{version:1,fetched_at:n,request_count:0,project_count:e.length,batch_size:50,rate_limit:{remaining:null,reset_at:null,exhausted:!1},projects:e.map(r=>({project_label:r.project_label,outcome:"unconfigured",depth:null,detail:`project ${JSON.stringify(r.project_label)} was not counted because this host polls no tracker: ${t}`}))}}async function Pl(e){if(e.projects.length===0)return Zf(e.now);let n=e.batchSize??50,t=zf(e.projects,n),r=[],o={remaining:null,reset_at:null,exhausted:!1};for(let s of t){let i=Qf(s,{batchSize:n});try{let l=await e.transport(i.query),a=Yf(i,l);r.push(...a.projects),o=xl(o,a.rate_limit)}catch(l){let a=l instanceof Error?l.message:String(l),d=/rate limit|secondary rate|429/i.test(a);o=xl(o,{remaining:null,reset_at:null,exhausted:d});for(let u of s)r.push({project_label:u.project_label,outcome:d?"rate-limited":"unreachable",depth:null,detail:`the queue fetch failed before project ${JSON.stringify(u.project_label)} answered: ${a}`})}}return{version:1,fetched_at:e.now,request_count:t.length,project_count:r.length,batch_size:n,rate_limit:o,projects:r}}function jl(e){if(e.length===0)throw new Error("redskilled queue discovery needs at least one registered project");let n=new Set;for(let t of e){if(typeof t.project_label!="string"||t.project_label==="")throw new Error("redskilled queue discovery needs a project label for every registered project");if(typeof t.selector!="string"||t.selector==="")throw new Error(`redskilled queue discovery needs a selector for project ${JSON.stringify(t.project_label)}: a project that names no work has no queue to discover`);if(n.has(t.project_label))throw new Error(`redskilled holds one selector per project, and ${JSON.stringify(t.project_label)} is registered twice`);n.add(t.project_label)}}function xl(e,n){return{remaining:n.remaining==null?e.remaining:e.remaining==null?n.remaining:Math.min(e.remaining,n.remaining),reset_at:n.reset_at??e.reset_at,exhausted:e.exhausted||n.exhausted}}function Xf(e,n){let t=gn(e),r=typeof t.remaining=="number"&&Number.isFinite(t.remaining)?t.remaining:null,o=typeof t.resetAt=="string"?t.resetAt:null;return{remaining:r,reset_at:o,exhausted:n.some(Dl)||r===0}}function Dl(e){return e==null?!1:Wr(e.type)==="RATE_LIMITED"||/rate limit/i.test(Wr(e.message))}function eg(e,n){return Array.isArray(e)&&e.includes(n)}function ng(e){let n=gn(e);return Number.isInteger(n.issueCount)?n.issueCount:null}function gn(e){return tg(e)?e:{}}function tg(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Wr(e){return typeof e=="string"?e:""}import{randomUUID as Ol}from"node:crypto";import{spawn as rg}from"node:child_process";import{closeSync as og,mkdirSync as sg,openSync as ig}from"node:fs";import{dirname as lg}from"node:path";var hn=class extends Error{constructor(n){super(n),this.name="RedskilledWorkerSpecError"}},rt=class extends Error{constructor(t,r){super(t);this.admission=r;this.name="RedskilledAdmissionError"}};function ag(e){if(e==null||e.trim()==="")return null;try{return sg(lg(e),{recursive:!0}),ig(e,"a")}catch{return null}}function dg(e){try{og(e)}catch{}}function cg(e){let n=[["project_label",e.project_label],["workspace_path",e.workspace_path],["command",e.command]];for(let[t,r]of n)if(typeof r!="string"||r.trim()==="")throw new hn(`redskilled worker spec is missing ${t}`);if(e.args!=null&&!Array.isArray(e.args))throw new hn("redskilled worker spec args must be an array")}function ug(e){if(e==null)throw new rt("redskilled refused this Worker: no host admission verdict was handed over, and an unjudged birth is an unbudgeted one");if(!e.admitted)throw new rt(e.reason,e)}function $l(e){let{spec:n,admission:t}=e;ug(t),cg(n);let r=e.env??process.env,o=e.clock??(()=>new Date().toISOString()),s=(n.worker_id??e.workerId??Ol()).trim()||Ol(),i=e.probes??pl(r),l=e.openLog===!1?null:ag(n.log_path),a=gl({workerId:s,projectLabel:n.project_label,workspacePath:n.workspace_path,command:n.command,args:n.args,budget:n.budget,...e.memoryCeiling!=null?{memoryCeiling:e.memoryCeiling}:{},target:n.placement,env:n.env,enabled:e.enabled??ml(r),probes:i,pipeOutput:l!==null}),u=(e.spawnFn??rg)(a.command,a.args,{...a.cwd!=null?{cwd:a.cwd}:{},detached:!0,stdio:l===null?"ignore":["ignore",l,l],env:a.backend==="transient-unit"?{...r}:{...r,...n.env??{},...a.environment}});if(l!==null&&dg(l),u.pid==null)throw u.once("error",()=>{}),new hn(`redskilled could not spawn ${JSON.stringify(a.command)} for worker ${s}`);let p=a.job!=null?pg(a,i,u.pid):null;u.once("error",()=>{}),u.once("exit",(b,k)=>{try{p?.job?.close()}catch{}e.onExit?.(s,b,k)}),u.unref();let m=a.job!=null?p?.job!=null:a.isolated,h=[a.warning,p?.warning,a.budgetWarning].filter(b=>b!=null);return{worker:{worker_id:s,project_label:n.project_label,pid:u.pid,started_at:o(),workspace_path:n.workspace_path,...n.log_path!=null?{log_path:n.log_path}:{},isolated:m,...a.unit!=null?{unit:a.unit}:{},...n.budget!=null?{budget:n.budget}:{},...a.memoryCeiling!=null?{memory_ceiling:a.memoryCeiling,memory_ceiling_reason:e.memoryCeiling?.reason??"this Worker's ceiling is the budget its client declared"}:{},warnings:h},admission:t,warnings:h,plan:a,child:u,...p?.job!=null?{job:p.job}:{}}}function pg(e,n,t){let r=e.job;if(r==null)return{};let o="the Worker is charged to the daemon's own resource group and the daemon's RSS sampling floor is the only remaining ceiling";if(!n.jobObjects.available)return{warning:`Job Object placement unavailable: ${n.jobObjects.reason}. ${o}`};let s;try{s=n.jobObjects.binding.createJobObject({name:r.name,limits:r.limits})}catch(i){return{warning:`Job Object ${JSON.stringify(r.name)} could not be created: ${Ll(i)}. ${o}`}}try{s.assign(t)}catch(i){try{s.close()}catch{}return{warning:`Worker pid ${t} could not be assigned to Job Object ${JSON.stringify(r.name)}: ${Ll(i)}. ${o}`}}return{job:s}}function Ll(e){return e instanceof Error?e.message:String(e)}import{open as mg,stat as fg}from"node:fs/promises";var gg=16*1024;async function Al(e,n=gg){let t;try{t=(await fg(e)).size}catch{return null}if(t<=0)return null;let r=Math.min(n,t),o;try{let s=await mg(e,"r");try{let i=Buffer.alloc(r);await s.read(i,0,r,t-r),o=i.toString("utf8")}finally{await s.close()}}catch{return null}return hg(o)}function hg(e){let n=e.split(`
|
|
63
|
+
`);for(let t=n.length-1;t>=0;t-=1){let r=n[t].replace(/\r$/,"");if(r.trim()!=="")return r}return null}import{spawn as Og}from"node:child_process";import{existsSync as Lg,readdirSync as $g}from"node:fs";import{dirname as Ag,join as Cl,resolve as Ig}from"node:path";function U(e){let n=/^(\d+)\.(\d+)\.(\d+)/.exec(String(e).trim());return n?{major:Number(n[1]),minor:Number(n[2]),patch:Number(n[3])}:null}function Mr(e,n){let t=U(e),r=U(n);return!t||!r?0:t.major-r.major||t.minor-r.minor||t.patch-r.patch}var Xb=4*60*60*1e3;re();re();import{spawnSync as yg}from"node:child_process";import{mkdir as kg,rm as Rg,writeFile as bg}from"node:fs/promises";import{existsSync as _g}from"node:fs";import{homedir as wg}from"node:os";import{dirname as vg,join as Cr}from"node:path";var We="redskilled.service",Fr="REDSKILLED_SUPERVISED",Sg="https://github.com/reddb-io/red-skills/blob/main/.red/adr/0130-redskilled-host-scoped-execution-daemon.md";function xg(e=process.env){let n=e.XDG_CONFIG_HOME?.trim()||Cr(e.HOME?.trim()||wg(),".config");return Cr(n,"systemd","user")}function Hr(e=process.env){return Cr(xg(e),We)}function Il(e,n={}){let t=n.env??process.env,r=Vn(n.override??{},n.entryLookup??{}),o=[...r.args,...be(e,n.idleMs==null?{}:{idleMs:n.idleMs})];return{unitName:We,unitPath:Hr(t),command:r.command,args:o,text:Eg(r.command,o,e)}}function Eg(e,n,t){return["[Unit]","Description=redskilled \u2014 the host-scoped execution daemon (ADR 0130)",`Documentation=${Sg}`,"","[Service]","Type=simple",`ExecStart=${[e,...n].map(Pg).join(" ")}`,"Restart=on-failure","RestartSec=1",`Environment="${Fr}=1"`,`Environment="REDSKILLED_SESSION=${Tl(t.sessionKey)}"`,"","[Install]","WantedBy=default.target",""].join(`
|
|
64
|
+
`)}function Pg(e){return/[\s"'\\$%]/.test(e)?`"${Tl(e)}"`:e}function Tl(e){return e.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace(/%/g,"%%")}async function Nl(e,n={}){let t=n.writeFile??jg,r=n.run??Ur,o=[];return await t(e.unitPath,e.text),o.push({step:"write-unit",ok:!0,detail:e.unitPath}),o.push(ot("daemon-reload",r,["systemctl","--user","daemon-reload"])),o.push(ot("enable",r,["systemctl","--user","enable","--now",e.unitName])),{unitPath:e.unitPath,installed:o.every(s=>s.ok),steps:o}}async function Wl(e={}){let n=e.removeFile??Dg,t=e.run??Ur,r=Hr(e.env??process.env),o=[ot("disable",t,["systemctl","--user","disable","--now",We])];return await n(r),o.push({step:"remove-unit",ok:!0,detail:r}),o.push(ot("daemon-reload",t,["systemctl","--user","daemon-reload"])),{unitPath:r,installed:!1,steps:o}}function Ml(e={}){let n=e.exists??_g,t=e.run??Ur,r=Hr(e.env??process.env),o=n(r);return{unitName:We,unitPath:r,installed:o,enabled:o&&t(["systemctl","--user","is-enabled",We]).status===0,active:o&&t(["systemctl","--user","is-active",We]).status===0,floor:"auto-spawn"}}function ot(e,n,t){let r=n(t),o=(r.stderr??r.stdout??"").trim();return{step:e,argv:t,ok:r.status===0,...o?{detail:o}:{}}}async function jg(e,n){await kg(vg(e),{recursive:!0}),await bg(e,n,{encoding:"utf8",mode:420})}async function Dg(e){await Rg(e,{force:!0})}function Ur(e){let n=yg(e[0],[...e.slice(1)],{encoding:"utf8"});return n.error!=null?{status:null,stderr:n.error.message}:{status:n.status,stdout:n.stdout??"",stderr:n.stderr??""}}var Fl=75,Ul=9e5,Hl="redskilled-replacement-entry-unresolved",Tg="REDSKILLED_NO_REGISTRY_PROBE",Vl="REDSKILLED_BORN_BY_REPLACEMENT";function Bl(e=process.env){return e[Vl]==="1"}function Kl(e){return e===null||typeof e=="string"?{version:e,newest:null}:{version:e.version,newest:e.newest??null}}function Jl(e){let n=e.running.trim();if(yn(n))return null;let t=e.newest?.trim()??"",r=U(t),o=U(n);return r===null||o===null||r.major<=o.major?null:{version:t,running_major:o.major,held_major:r.major,reason:`redskilled ${t} is published and this daemon runs ${n}; a major version is deliberately never adopted by the background check, because a breaking change must not arrive on a machine that is holding Workers`,action:Ng(r.major,e.supervised)}}function Ng(e,n){let t=`install the ${e}.x bundle (update this machine's plugin pin), then `;return n?`${t}re-point the unit and restart it: redskilled unit install && systemctl --user restart redskilled.service`:`${t}stop this daemon \u2014 the next client start resolves the newly installed bundle`}function ql(e){let n=e.running.trim();if(yn(n))return{act:"hold",reason:"local-build"};let t=e.published?.trim()??"";return!t||U(t)===null?{act:"hold",reason:"published-unknown"}:Mr(t,n)<=0?{act:"hold",reason:"no-newer-version"}:{act:"replace",to:t,via:e.supervised?"supervisor-exit":"self-spawn"}}function yn(e){let n=e.trim();return U(n)===null?!0:/^\d+\.\d+\.\d+[-+]/.test(n)}function Gl(e=process.env){return e[Fr]==="1"}var Vr=class extends Error{code=Hl;searched;constructor(n,t){super(`${Hl}: the published redskilled bundle ${n} exists on no reachable path and the version-pinned dispatch is disabled
|
|
65
65
|
searched:
|
|
66
66
|
${t.map(r=>` ${r}`).join(`
|
|
67
|
-
`)}`),this.name="RedskilledReplacementEntryError",this.searched=[...t]}};function
|
|
68
|
-
`}function Lg(e){let n=e.trim();if(!n)return null;try{return JSON.parse(n)}catch{try{return G(n)}catch{return null}}}function Ig(e){if(e===null||typeof e!="object"||Array.isArray(e))return!1;let n=e;if(n.version!==1||!Number.isInteger(n.pid)||n.pid<=0)return!1;for(let t of["start_time","session_key_hash","machine_id_hash","socket_path","acquired_at","renewed_at"])if(typeof n[t]!="string"||n[t].length===0)return!1;return!0}var Vr=3e5,Ug=1e4,Bg=6e4,Vg=15e3,Zl=16,Ce=class extends Error{constructor(t,r){super(`a redskilled daemon already owns ${JSON.stringify(t)}`);this.socketPath=t;this.lease=r;this.name="RedskilledAlreadyRunningError"}},Kg="no tracker transport was given to this daemon, so no queue depth was ever asked for";async function ea(e){let{paths:n}=e,t=e.daemonVersion??"0.0.0-dev",r=e.idleMs??Vr,o=e.clock??(()=>new Date().toISOString()),s=e.launch??_l,i=e.ceiling??ei();e.repositoryActivity!=null&&wr(e.repositoryActivity.projects,e.repositoryActivity.hostTokenRef);let l=e.owner??Ql(),a=e.leaseStore??Yl(n.leasePath,{sessionKeyHash:n.sessionKeyHash,machineIdHash:n.machineIdHash,socketPath:n.socketPath},{clock:o}),c=e.machineOwner??gi(),u={machineIdHash:n.machineIdHash,sessionKeyHash:n.sessionKeyHash,socketPath:n.socketPath},p=e.machineClaimStore??Jn(n.machineClaimPath,u,{clock:o});await Mg(Hg(n.socketPath),{recursive:!0,mode:448});let f=await p.claim(c);if(!f.claimed)throw f.claim?.socket_path===n.socketPath?new Ce(n.socketPath):new pe(p.claimPath,f.reason,f.claim);let h=await a.acquire(l);if(!h.acquired)throw await p.release(c).catch(()=>{}),new Ce(n.socketPath,h.lease);let k;try{k=await Jg(n.socketPath)}catch(d){throw await a.release(l).catch(()=>{}),await p.release(c).catch(()=>{}),d}let b=o(),y=e.eventLane??ri(n.eventLanePath),_=e.liveness??ll,D=e.stopWorker??ml,B=e.unitInventory??(()=>cl(n.machineClaimPath,Kn({machineIdHash:n.machineIdHash}))?ul():[]),M=e.unitMainPid??dl,fe=e.treeSampler??Ei,_e=e.readLogTail??vl,kn=e.sampleMs??Vg,eo=e.publishedVersion??(d=>Hl(d)),no=e.replaceCheckMs??Al,to=e.publishedProbeTimeoutMs??Ug,La=e.localPublishedEvidence??(d=>Ul(d,e.replacementIO?.env??process.env)),Ia=e.bornByReplacement??Il(),ro=e.replaceBootCheckMs??Bg,oo=e.supervised??Cl(),so=e.replacementIO??{},V=e.repositoryActivity,io=V?.intervalMs??6e4,He=e.queueDiscovery,lo=He?.transport??V?.transport,Ta=He?.unconfiguredReason??Kg,ao=He?.intervalMs??15e3,co=e.demandMs??15e3,Na=e.demandBackoffMs??3e4,S=new Map,le=new Set,ve=new Map,Rn=new Map,L=new Map,st=new Set,uo={},it=null,po=null,lt=null,fo=!1,at=0,dt=null,Ue="none",ct=null,mo=null,ut=null,ae=null,bn=null,Be=[],Ve=null,pt=!1,xe,Ke,Je,qe,wn,Ge,ze,Z=!1,ft=!1,_n=null,go,mt=new Promise(d=>{go=d});function Qe(d){ho(d);let m=Date.parse(d),g=_i(L.values(),m);for(let w of g.lapsed)L.delete(w.project_label),Wa(w,m);return g.lapsed}function Wa(d,m){let g=Number.isFinite(m)?new Date(m).toISOString():d.renew_by;Be.push({project_label:d.project_label,at:g,renew_by:d.renew_by,renewals:d.renewals,sustains:d.sustains??0,detail:`redskilled dropped the registration for project ${JSON.stringify(d.project_label)}: it stood until ${d.renew_by} and nothing renewed it \u2014 no session spoke for it, and no poll found it work or a Worker to hold it up`}),Be.length>Zl&&Be.splice(0,Be.length-Zl)}function ho(d){if(L.size===0)return;let m=Date.parse(d);if(!Number.isFinite(m))return;let g={};for(let v of S.values())g[v.project_label]=(g[v.project_label]??0)+1;let w=new Map((ae?.projects??[]).map(v=>[v.project_label,v]));for(let v of[...L.values()]){let j=w.get(v.project_label),ee=bi(v,{now:d,...j==null?{}:{queue:{outcome:j.outcome,depth:j.depth}},liveWorkers:g[v.project_label]??0});ee.registration!==v&&L.set(v.project_label,ee.registration)}}function vn(){let d=o();return Qe(d),Bi({now:d,daemonVersion:t,machineIdHash:n.machineIdHash,sessionKeyHash:n.sessionKeyHash,pid:l.pid,startedAt:b,scope:hi(p.claimPath,u,c),workers:[...S.values()],registrations:[...L.values()],lapses:Be,queue:ae,published:{version:po,checkedAt:lt,newer:fo,replacement:Ue,newest:ct,majorHold:mo,checks:at,holdReason:dt}})}function xn(){return Ii({hostState:vn(),ceiling:i,rss:uo,sampledAt:it,logLines:Object.fromEntries(ve),displays:Object.fromEntries(Rn),now:o(),reattachedWorkerIds:[...le],repositoryActivity:ut,...e.deaths===void 0?{}:{deaths:e.deaths}})}async function gt(){return V==null||V.projects.length===0?null:(ut=await Di({projects:V.projects,hostTokenRef:V.hostTokenRef,transport:V.transport,closedWindowMs:V.closedWindowMs,now:o()}),ut)}async function yo(){let d=o();Qe(d);let m=[...L.values()].map(g=>({project_label:g.project_label,selector:g.selector})).sort((g,w)=>g.project_label.localeCompare(w.project_label));return m.length===0?null:lo==null?(ae=hl(m,d,Ta),ae):(ae=await yl({projects:m,transport:lo,now:d,...He?.batchSize==null?{}:{batchSize:He.batchSize}}),ho(o()),ae)}async function ko(){let d=o();if(pt)return bn??ii(d);pt=!0;try{let m={};for(let A of S.values())m[A.project_label]=(m[A.project_label]??0)+1;let g={};for(let A of ae?.projects??[])g[A.project_label]=A.depth;let w=Date.parse(d),v=si({projects:[...L.values()].map(A=>({project_label:A.project_label,selector:A.selector,argv:A.argv,workspace_path:A.workspace_path,target:A.target})),queue:g,live:m,nowMs:Number.isFinite(w)?w:0,backoffUntilMs:Ve}),j=[],ee=null;for(let A of v.births){let Dn;try{Dn=ht({project_label:A.project_label,workspace_path:A.workspace_path,command:A.argv[0],args:A.argv.slice(1)})}catch(Rt){ee=Rt instanceof Error?Rt.message:String(Rt),Ve=(Number.isFinite(w)?w:Date.now())+Na;break}j.push({project_label:A.project_label,worker_id:Dn.worker.worker_id,pid:Dn.worker.pid,warnings:Dn.warnings})}return ee==null&&v.births.length>0&&(Ve=null),bn={version:1,at:d,requested:v.births.length,granted:j,shortfall:v.births.length-j.length,refusal:ee,retry_after:Ve==null?null:new Date(Ve).toISOString(),projects:v.intents},bn}finally{pt=!1}}function Ca(d){return Ti(xn(),{...O,mode:d?.mode??O.mode,project:d?.project??O.project,maxWorkers:d?.max_workers??O.maxWorkers,maxProjects:d?.max_projects??O.maxProjects,maxWidth:d?.max_width??O.maxWidth,verbose:d?.verbose??O.verbose})}function Ma(d){return Fi(xn(),{mode:d?.mode??Te.mode,project:d?.project??Te.project,maxWidth:d?.max_width??Te.maxWidth,maxRows:d?.max_rows??Te.maxRows})}function Se(d,m,g){return xi({op:d,sessionProject:m??null,targetProject:g})}async function Fa(d){let m=S.get(d.worker_id),g=Se(vi(d.command),d.session_project,m?.project_label??null);if(!g.permitted)throw new Error(g.reason);if(d.command!=="stop")throw new Error(`redskilled does not implement ${d.command}: it owns birth, death and limits, and ${d.command} is a work decision the project's own bundle makes on top of them`);let w=m!=null&&await Va(m,d.detail??"stopped by its own project");return{version:1,command:d.command,worker_id:d.worker_id,applied:w,reach:g,detail:w?`redskilled stopped Worker ${JSON.stringify(d.worker_id)} of project ${JSON.stringify(m.project_label)}`:`redskilled holds no live Worker ${JSON.stringify(d.worker_id)} to stop`}}function Sn(d){S.delete(d),le.delete(d),ve.delete(d),Rn.delete(d)}function Ro(d){let m=S.get(d.worker_id),g=Se("worker-heartbeat",d.session_project,m?.project_label??null);if(!g.permitted)throw new Error(g.reason);if(typeof d.last_log_line!="string")throw new Error("redskilled worker heartbeat last_log_line must be a string");if(m==null)return{version:1,worker_id:d.worker_id,accepted:!1,reach:g,published_at:null,detail:`redskilled holds no live Worker ${JSON.stringify(d.worker_id)} to publish a line for`};let w=o();ve.set(d.worker_id,{line:d.last_log_line,published_at:w,source:"heartbeat"});let v=d.display===void 0?null:Ci(d.display);return v!=null&&Rn.set(d.worker_id,{display:v,published_at:w}),{version:1,worker_id:d.worker_id,accepted:!0,reach:g,published_at:w,detail:`redskilled stored a line for Worker ${JSON.stringify(d.worker_id)} without reading it`}}async function Ha(d,m,g){let w=`exit code=${m??"null"} signal=${g??"null"}`;if(d.unit!=null&&d.unit!==""&&await Ua(d)){Ba(d,`its launch client ended (${w}) while unit ${JSON.stringify(d.unit)} stayed active, so the daemon holds it by unit name from here on and its death is discovered by asking the host`);return}Sn(d.worker_id),X("worker-death",d,w,{exitCode:m,signal:g}),$()}async function Ua(d){try{return await _(d)===!0}catch{return!1}}function Ba(d,m){let g=d.unit==null?null:M(d.unit);S.set(d.worker_id,{...d,...g!=null&&g>0?{pid:g}:{},warnings:[...d.warnings,m]}),le.add(d.worker_id),$()}function bo(d,m){let g=Se("project-register",m,d.project_label);if(!g.permitted)throw new Error(g.reason);let w=o();Qe(w);let v=ki(d,{now:w,held:L.get(d.project_label)});return L.set(v.project_label,v),$(),{version:1,registration:v,reach:g,detail:`redskilled holds a registration for project ${JSON.stringify(v.project_label)} at a target of ${v.target} until ${v.renew_by}, and has read neither its selector nor its argv`}}function wo(d,m={}){let g=Se("project-renew",m.sessionProject,d);if(!g.permitted)throw new Error(g.reason);let w=o();Qe(w);let v=L.get(d);if(v==null)throw new qn(d);let j=Ri(v,{now:w,...m.renewWithinMs==null?{}:{renew_within_ms:m.renewWithinMs},...m.launch==null?{}:{launch:m.launch}});return L.set(j.project_label,j),$(),{version:1,registration:j,reach:g,detail:`redskilled renewed the registration for project ${JSON.stringify(j.project_label)}, which now stands until ${j.renew_by} after renewal ${j.renewals}`+(m.launch==null?"":`, carrying launch revision ${j.launch_revision} for its next Worker`)}}function _o(d,m){let g=Se("project-deregister",m,d);if(!g.permitted)throw new Error(g.reason);let w=L.delete(d);return{version:1,project_label:d,released:w,reach:g,detail:w?`redskilled released the registration for project ${JSON.stringify(d)}`:`redskilled held no registration for project ${JSON.stringify(d)}, so there was nothing to release`}}async function Va(d,m){try{await D(d)}catch{}return Sn(d.worker_id),X("worker-death",d,m),$(),!0}function vo(d){return Zs({ceiling:i,workers:[...S.values()],budget:d.budget,projectLabel:d.project_label})}function ht(d){let m=Xs({ceiling:i,workers:[...S.values()],budget:d.budget}),g=s({spec:d,admission:vo(d),memoryCeiling:m,clock:o,onExit:(w,v,j)=>{let ee=S.get(w);if(ee==null){$();return}Ha(ee,v,j).catch(()=>{})}});return S.set(g.worker.worker_id,g.worker),X("worker-birth",g.worker,null),$(),g}function X(d,m,g,w={}){Z||y.record({event:d,worker:m,ts:o(),detail:g,...w.exitCode!==void 0?{exitCode:w.exitCode}:{},...w.signal!==void 0?{signal:w.signal}:{}}).catch(()=>{})}async function xo(){let d=[...le].map(g=>S.get(g)).filter(g=>g!=null);if(d.length===0)return[];let{dead:m}=await Ar(d,_);for(let g of m)Sn(g.worker_id),X("worker-death",g,"the host no longer confirms this Worker");return m.length>0&&$(),m}async function So(d,m){let g=S.get(d);if(!g)return!1;try{await D(g)}catch{}return Sn(d),X("worker-budget-kill",g,m),$(),!0}async function Eo(){let d=[...S.values()];if(d.length===0)return[];let m;try{m=await fe(d)}catch{return[]}let g=m.rss;uo=g,it=o(),Ka(m.cpu_seconds,it);let{terminations:w}=Si({workers:d,rss:g}),v=[];for(let j of w)await So(j.worker_id,j.reason)&&v.push(j);return v}function Ka(d,m){for(let[g,w]of Object.entries(d)){if(typeof w!="number"||!Number.isFinite(w))continue;let v=S.get(g);v&&S.set(g,{...v,cpu:{cpu_seconds:w,sampled_at:m}})}}async function Ja(){try{return to<=0?await eo(t):await new Promise(d=>{let m=setTimeout(()=>d(yt()),to);m.unref(),eo(t).then(g=>{clearTimeout(m),d(g)},()=>{clearTimeout(m),d(yt())})})}catch{return yt()}}function yt(){try{return La(t)}catch{return null}}async function Po(){if(hn(t))return at+=1,lt=o(),dt="local-build",{act:"hold",reason:"local-build"};let d=Tl(await Ja()),m=d.version;po=m,ct=d.newest??null,lt=o(),mo=Nl({running:t,newest:ct,supervised:oo});let g=Wl({running:t,published:m,supervised:oo});return fo=g.act==="replace",at+=1,dt=g.act==="hold"?g.reason:null,Ue!=="in-progress"&&(Ue=g.act==="replace"?"pending":"none"),g}async function En(){let d=await Po();if(d.act!=="replace"||Ue==="in-progress")return d;let m=Ml(d,so);return Ue="in-progress",await y.flush().catch(()=>{}),await jn({reason:"replaced"}),Fl(m,n,{...r==null?{}:{idleMs:r},io:so}),d}function qa(){Z||qe!=null||no<=0||(!Ia&&ro>0&&(wn=setTimeout(()=>{En().catch(()=>{})},ro),wn.unref()),qe=setInterval(()=>{En().catch(()=>{})},no),qe.unref())}function Ga(){Z||Ke!=null||kn<=0||(Ke=setInterval(()=>{Eo().catch(()=>{})},kn),Ke.unref())}function za(){Z||Ge!=null||V==null||V.projects.length===0||io<=0||(gt().catch(()=>{}),Ge=setInterval(()=>{gt().catch(()=>{})},io),Ge.unref())}function Qa(){Z||ze!=null||ao<=0||(ze=setInterval(()=>{yo().catch(()=>{})},ao),ze.unref())}function Ya(){Z||Je!=null||co<=0||(Je=setInterval(()=>{ko().catch(()=>{})},co),Je.unref())}function $(){Z||(xe&&clearTimeout(xe),xe=setTimeout(()=>{xo().catch(()=>{}).then(()=>jo())},r),xe.unref())}function jo(){return S.size>0?($(),"held-by-workers"):(Qe(o()),L.size>0?($(),"held-by-registrations"):(Za(),"exited"))}async function Za(){if(!hn(t)){if((await En().catch(()=>null))?.act==="replace"||ft||Z)return;if(S.size>0||L.size>0){$();return}}await jn({reason:"idle"})}function Pn(d){return ai({reason:d,socketPath:n.socketPath,daemonVersion:t,pid:l.pid,workers:[...S.values()],projects:[...L.keys()]})}function Do(d){if(_n!=null)return _n;let m=d.reason??"requested",g=d.note?.trim();return _n=y.recordDaemonStop({ts:o(),pid:l.pid,socketPath:n.socketPath,reason:m,detail:g==null||g===""?Pn(m).detail:`${Pn(m).detail} \u2014 ${g}`,...d.signal==null?{}:{signal:d.signal}}).catch(()=>{}),_n}async function jn(d={}){if(ft)return await mt;ft=!0,await Do(d),Z=!0,xe&&clearTimeout(xe),Ke&&clearInterval(Ke),qe&&clearInterval(qe),wn&&clearTimeout(wn),Ge&&clearInterval(Ge),ze&&clearInterval(ze),Je&&clearInterval(Je),await y.flush().catch(()=>{}),k.close();for(let m of st)m.destroy();return await new Promise(m=>k.once("close",()=>m())),await Xl(n.socketPath,{force:!0}),await a.release(l).catch(()=>{}),await p.release(c).catch(()=>{}),go(),await mt}let Xa=oi(await y.read().catch(()=>[])),kt=await Ar(Xa,_);for(let d of kt.alive){let m=fl(d),g=m.unit==null||W(m.pid)?null:M(m.unit);S.set(m.worker_id,g!=null&&g>0?{...m,pid:g}:m),le.add(m.worker_id)}for(let d of kt.dead)X("worker-death",d,"the Worker ended while no daemon was watching");let ed=pl({units:await Promise.resolve(B()).catch(()=>[]),held:[...S.values()],mainPid:M,now:b});for(let d of ed)S.set(d.worker_id,d),le.add(d.worker_id),X("worker-birth",d,"adopted from an active unit with no birth on this lane");for(let d of kt.alive){if(d.log_path==null||ve.has(d.worker_id))continue;let m=await _e(d.log_path).catch(()=>null);m==null||m.trim()===""||ve.set(d.worker_id,{line:m,published_at:o(),source:"rehydrated"})}k.on("connection",d=>{st.add(d),d.once("close",()=>st.delete(d)),$(),qg(d,async(m,g)=>{$();let w=await nd(m);g(w),m.op==="shutdown"&&setImmediate(()=>void jn({reason:"requested"}))})});async function nd(d){try{if(d.op==="ping")return{id:d.id,ok:!0,value:{pong:!0,protocol_version:Qn,daemon_version:t,pid:l.pid}};if(d.op==="host-state")return{id:d.id,ok:!0,value:vn()};if(d.op==="statusline-payload")return{id:d.id,ok:!0,value:xn()};if(d.op==="statusline-string")return{id:d.id,ok:!0,value:Ca(d.render)};if(d.op==="statusline-dashboard")return{id:d.id,ok:!0,value:Ma(d.dashboard)};if(d.op==="worker-heartbeat")return{id:d.id,ok:!0,value:Ro(d.heartbeat)};if(d.op==="project-register")return{id:d.id,ok:!0,value:bo(d.registration,d.session_project)};if(d.op==="project-renew")return{id:d.id,ok:!0,value:wo(d.project_label,{...d.session_project==null?{}:{sessionProject:d.session_project},...d.renew_within_ms==null?{}:{renewWithinMs:d.renew_within_ms},...d.launch==null?{}:{launch:d.launch}})};if(d.op==="project-deregister")return{id:d.id,ok:!0,value:_o(d.project_label,d.session_project)};if(d.op==="worker-command")return{id:d.id,ok:!0,value:await Fa(d.command)};if(d.op==="worker-start"){let g=Se("worker-start",d.session_project,d.spec.project_label);if(!g.permitted)return{id:d.id,ok:!1,error:g.reason};let w=ht(d.spec);return await y.flush().catch(()=>{}),{id:d.id,ok:!0,value:{worker:w.worker,admission:w.admission,warnings:w.warnings}}}if(d.op==="shutdown"){let g=Pn("requested");return await Do({reason:"requested",...d.detail==null?{}:{note:d.detail}}),{id:d.id,ok:!0,value:g}}let m=d;return{id:m.id??rt(),ok:!1,error:`unsupported redskilled op: ${m.op??"unknown"}`}}catch(m){return{id:d.id??rt(),ok:!1,error:m instanceof Error?m.message:String(m)}}}return $(),Ga(),qa(),za(),Qa(),Ya(),{socketPath:n.socketPath,lease:h.lease,startedAt:b,closed:mt,startWorker:ht,admit:vo,ceiling:()=>i,killWorkerOverBudget:So,sampleMemoryBudgets:Eo,pollRepositoryActivity:gt,pollQueueDiscovery:yo,queueDiscovery:()=>ae,driveDemand:ko,demand:()=>bn,sweepReattached:xo,publishWorkerHeartbeat:Ro,reattached:()=>[...le].map(d=>S.get(d)).filter(d=>d!=null),flushEvents:()=>y.flush(),trackWorker(d){S.set(d.worker_id,d),X("worker-birth",d,null),$()},releaseWorker(d){let m=S.get(d),g=S.delete(d);return le.delete(d),ve.delete(d),Rn.delete(d),m&&X("worker-death",m,"released by the daemon"),$(),g},workerCount:()=>S.size,registerProject:bo,renewProject:wo,deregisterProject:_o,registrations:()=>vn().registrations??[],hostState:vn,statuslinePayload:xn,evaluateIdle:jo,observePublishedVersion:Po,checkForReplacement:En,stopReport:Pn,stop:jn}}async function Jg(e){for(let n=0;n<2;n++){let t=Fg();try{return await new Promise((r,o)=>{t.once("error",o),t.listen(e,()=>{t.off("error",o),r()})}),t}catch(r){if(t.close(),r.code!=="EADDRINUSE")throw r;if(await se(e))throw new Ce(e);await Xl(e,{force:!0})}}throw new Ce(e)}async function se(e,n=250){try{return(await Wn({socketPath:e,timeoutMs:n},{id:rt(),op:"ping"},"redskilled daemon")).ok===!0}catch{return!1}}function qg(e,n){Ms(e,(t,r)=>n(t,r),(t,r,o)=>{o({id:r?.id??rt(),ok:!1,error:t instanceof Error?t.message:String(t)})})}re();var Zg=1e4,Me=class extends Error{constructor(t,r){super(`redskilled daemon is unreachable on ${JSON.stringify(t)}, so no Worker was started: ${r instanceof Error?r.message:String(r)}`);this.socketPath=t;this.cause=r;this.name="RedskilledUnreachableError"}};async function Kr(e,n={}){try{return await Xg(e,n)}catch(t){throw t instanceof pe||t instanceof Me?t:new Me(e.socketPath,t)}}async function Xg(e,n){if(await zg(Yg(e.socketPath),{recursive:!0,mode:448}),await se(e.socketPath))return"already-running";await eh(e);let t=await Fs(e.lockPath);if(!t)return await na(e,n),"joined";try{if(await se(e.socketPath))return"already-running";let r=await rh(e,n);return await na(e,n,r),"spawned"}finally{await t.close(),await Qg(e.lockPath,{force:!0})}}async function eh(e){let t=await Jn(e.machineClaimPath,{machineIdHash:e.machineIdHash,sessionKeyHash:e.sessionKeyHash,socketPath:e.socketPath}).read().catch(()=>{});if(t!=null&&t.socket_path!==e.socketPath&&W(t.pid))throw new pe(e.machineClaimPath,"held",t)}async function ra(e,n,t={}){await Kr(e,t);let r;try{r=await fn({socketPath:e.socketPath,timeoutMs:t.requestTimeoutMs??2e3},{...n,id:ta()})}catch(o){throw new Me(e.socketPath,o)}if(!r.ok)throw new Error(r.error);return r.value}async function oa(e,n={},t={}){if(!await se(e.socketPath))return di(e.socketPath);let r;try{r=await fn({socketPath:e.socketPath,timeoutMs:t.requestTimeoutMs??2e3},{id:ta(),op:"shutdown",...n.detail==null?{}:{detail:n.detail}})}catch(i){throw new Me(e.socketPath,i)}if(!r.ok)throw new Error(r.error);if(!pr(r.value))throw new Error("redskilled daemon returned a malformed stop report");let o=r.value;return await nh(e.socketPath,n.settleTimeoutMs??5e3)?o:{...o,stopped:!1,detail:`${o.detail}; the daemon accepted the stop and is still answering on ${JSON.stringify(e.socketPath)}`}}async function nh(e,n){let t=Date.now()+n;for(;;){if(!await se(e))return!0;if(Date.now()>=t)return!1;await new Promise(r=>setTimeout(r,25))}}async function sa(e,n={}){let t=await ra(e,{op:"host-state"},n);if(!Vi(t))throw new Error("redskilled daemon returned a malformed host state");return t}async function ia(e,n=void 0,t={}){let r=await ra(e,{op:"statusline-string",...t.sessionProject!=null?{session_project:t.sessionProject}:{},...n==null?{}:{render:th(n)}},t);if(!Ui(r))throw new Error("redskilled daemon returned a malformed statusline render");return r}function th(e){return{mode:e.mode,project:e.project,max_workers:e.maxWorkers,max_projects:e.maxProjects,max_width:e.maxWidth,verbose:e.verbose}}async function na(e,n,t){let r=Date.now()+(n.readyTimeoutMs??Zg);for(;;){if(await se(e.socketPath))return;if(t?.failure)throw new Error(`redskilled daemon failed to start from ${JSON.stringify(t.entry.entry??t.entry.command)} (resolved as ${t.entry.source}): ${t.failure.message}`);if(Date.now()>=r){let o=t?` from ${JSON.stringify(t.entry.entry??t.entry.command)} (resolved as ${t.entry.source})${t.exit?`, which ${t.exit}`:""}`:"";throw new Error(`redskilled daemon did not start on ${JSON.stringify(e.socketPath)}${o}`)}await new Promise(o=>setTimeout(o,25))}}async function rh(e,n){let t=n.serverCommand??(n.serverArgs!=null?process.execPath:void 0),r=await Gs({...t!=null?{serverCommand:t}:{},serverArgs:n.serverArgs},n.entryLookup??{}),o={entry:r},s=[...r.args,...be(e,n.idleMs==null?{}:{idleMs:n.idleMs})],i=Gg(r.command,s,{detached:!0,stdio:"ignore",env:{...n.env??process.env,REDSKILLED_DAEMON:"1"}});return i.on("error",l=>{o.failure=l}),i.on("exit",(l,a)=>{o.exit=a?`died on ${a}`:`exited with code ${l??-1}`}),i.unref(),o}re();import{chmod as fa,mkdir as ga,readFile as ha,stat as mh,writeFile as gh}from"node:fs/promises";import{homedir as Gr}from"node:os";import{dirname as hh,join as zr}from"node:path";import{join as oh}from"node:path";var la=["local","tmp","host"],sh="local",yn="plugins.dev.workspace.target";var Jr=class extends Error{constructor(n){super(n),this.name="WorkspaceConfigError"}};function da(e){let n=$e(e,yn),t=ah(n??"").trim();return t===""?void 0:t}function ca(e){let n=(e??"").trim();if(n==="")return{kind:"preset",preset:sh};let t=la.find(r=>r===n.toLowerCase());if(t)return{kind:"preset",preset:t};if(n.startsWith("/")||n==="~"||n.startsWith("~/"))return{kind:"custom",parentDir:n};throw new Jr(`${yn}: unknown workspace target ${JSON.stringify(n)}. Use one of the presets (${la.join(", ")}) or an absolute parent directory for Workers.`)}function ua(e,n){return e.kind==="preset"?e.preset==="host":lh(ih(e.parentDir,n),Re(n))}function ih(e,n){return e==="~"?aa(n):e.startsWith("~/")?oh(n,e.slice(2)):aa(e)}function lh(e,n){return e===n?!0:n==="/"?e.startsWith("/"):e.startsWith(`${n}/`)}function aa(e){let n=e.trim();return n.length>1?n.replace(/\/+$/,""):n}function ah(e){let n=e.trim(),t=/^(["'])(.*)\1$/.exec(n);return t?t[2]:n}re();import{createHash as dh}from"node:crypto";import{hostname as ch}from"node:os";import{join as ot}from"node:path";var Fe="redskilled.sock",uh="REDSKILLED_SESSION";function ph(e={}){let n=e.env??process.env,t=n[uh]?.trim();if(t)return t;let r=n.XDG_RUNTIME_DIR?.trim();return r||`uid:${e.uid??(typeof process.getuid=="function"?process.getuid():"nouid")}`}function fh(e={}){return pa(e.host??ch())}function ie(e={}){let n=ph(e),t=e.runtimeDir??Cn({key:`redskilled:${n}`,socketFileName:Fe,env:e.env,uid:e.uid}),r=fh(e);return{sessionKey:n,sessionKeyHash:pa(n),machineIdHash:r,runtimeDir:t,socketPath:ot(t,Fe),lockPath:ot(t,"redskilled.spawn.lock"),leasePath:ot(t,"redskilled.lease.toon"),eventLanePath:ot(t,ti),machineClaimPath:e.machineClaimPath??Kn({env:e.env,machineIdHash:r,platform:e.platform})}}function pa(e){return dh("sha256").update(e).digest("hex").slice(0,12)}var qr="run `/red-setup` (Section E3 \u2014 execution daemon), or `redskilled provision` directly";async function ya(e=Gr()){let n=Re(e),t=await Yr(n);return t===void 0?(await ga(n,{recursive:!0,mode:z}),await fa(n,z),{path:n,created:!0,tightened:!1,mode:z}):t===z?{path:n,created:!1,tightened:!1,mode:t}:(await fa(n,z),{path:n,created:!1,tightened:!0,mode:z})}var ka={needed:!1,declaredBy:`no ${yn} in view`};async function Qr(e={}){let n=e.homeDir??Gr(),t=e.declaredTarget?.trim();if(t)return ma(t,n,"stated on the command line");let r=e.projectRoot?.trim();if(!r)return ka;let o=zr(r,".red","config.yaml"),s=await ha(o,"utf8").catch(()=>{});if(s===void 0)return{needed:!1,declaredBy:`no ${o}`};let i=da(s);return i===void 0?{needed:!1,declaredBy:`${o} declares no workspace target (default local)`}:ma(i,n,o)}function ma(e,n,t){let r=`${yn}: ${e} (${t})`;try{return{needed:ua(ca(e),n),declaredBy:r}}catch{return{needed:!1,declaredBy:`${r} \u2014 off-contract, so it names no lane under the home`}}}function Ra(e){let n=[yh(e),kh(e),Rh(e),bh(e)],t=n.filter(o=>o.verdict!=="ok");return{verdict:t.some(o=>o.verdict==="missing")?"missing":t.length>0?"degraded":"ok",rows:n,findings:t}}function yh(e){let n=e.homeNeed??ka;if(!e.homePresent)return n.needed?{check:"home",verdict:"missing",evidence:`${e.homePath} does not exist, and it is needed \u2014 ${n.declaredBy}`,fix:qr}:{check:"home",verdict:"ok",evidence:`${e.homePath} is absent and unneeded \u2014 ${n.declaredBy}; the daemon never reads it`,fix:""};let t=e.homeMode??z;return t!==z?{check:"home",verdict:"degraded",evidence:`${e.homePath} is mode ${t.toString(8)}, not owner-only ${z.toString(8)}`,fix:`${qr} \u2014 it narrows the home back to owner-only`}:{check:"home",verdict:"ok",evidence:`${e.homePath} (mode ${t.toString(8)})`,fix:""}}function kh(e){return Y(e.entry)?{check:"daemon-entry",verdict:"ok",evidence:`${e.entry.entry??e.entry.command} (resolved as ${e.entry.source})`,fix:""}:{check:"daemon-entry",verdict:"missing",evidence:`no published redskilled bundle; probed ${e.entry.searched.join(", ")||"nothing"}`,fix:"install or warm the RedSkills bundle for this host, then re-run `redskilled provision`"}}function Rh(e){return e.reachable?{check:"reach",verdict:"ok",evidence:`daemon answered on ${e.socketPath}`,fix:""}:{check:"reach",verdict:"missing",evidence:`no daemon answered on ${e.socketPath}`,fix:`${qr} \u2014 it starts the daemon and waits for the socket`}}function bh(e){return{check:"supervisor-unit",verdict:"ok",evidence:e.supervisorUnit==="installed"?"redskilled.service is installed (optional supervision, Restart=on-failure)":e.supervisorUnit==="unsupported"?"optional: this host has no systemd --user session; auto-spawn is the only start path":"optional: not installed; auto-spawn already starts the daemon on first use",fix:""}}async function ba(e={}){let n=e.env??process.env,t=e.homeDir??Gr(),r=e.paths??ie({env:n}),o=Re(t),[s,i,l]=await Promise.all([Yr(o),se(r.socketPath),e.homeNeed?Promise.resolve(e.homeNeed):Qr({homeDir:t,projectRoot:e.projectRoot,declaredTarget:e.declaredTarget})]);return{homePath:o,homePresent:s!==void 0,homeMode:s,homeNeed:l,entry:ue(e.entryOverride??{},{env:n,...e.entryLookup}),socketPath:r.socketPath,reachable:i,supervisorUnit:await _h(vh(e,n,t),n)}}var wh="redskilled.service";function wa(e){return zr(e,"systemd","user",wh)}function _a(e){let n=e.socketPath?` --socket ${e.socketPath}`:"";return["[Unit]","Description=redskilled \u2014 the host-scoped execution daemon (ADR 0130)","","[Service]","Type=simple",`ExecStart=${e.command} serve${n}`,"Restart=on-failure","RestartSec=2","","[Install]","WantedBy=default.target",""].join(`
|
|
69
|
-
`)}async function
|
|
67
|
+
`)}`),this.name="RedskilledReplacementEntryError",this.searched=[...t]}};function Wg(e,n={}){let t=n.env??process.env,r=n.exists??Lg,o=n.execPath??process.execPath,s=n.callerEntry===void 0?process.argv[1]:n.callerEntry,i=`redskilled-${e}.bundle.min.mjs`,l=[],a=[[Cl(Un(t),i),"bundle-cache"]];s&&a.push([Cl(Ag(Ig(s)),i),"caller-sibling-bundle"]);for(let[d,u]of a)if(l.push(d),r(d))return{command:o,args:[d],version:e,source:u,searched:l};if(t.RED_SKILLS_NO_PINNED_DISPATCH==="1")throw new Vr(e,l);return{command:t.RED_SKILLS_NPX||"npx",args:["-y","-p",`@reddb-io/red-skills@${e}`,"red-skills-redskilled"],version:e,source:"pinned-dispatch",searched:l}}function zl(e,n={}){if(e.via==="supervisor-exit")return{via:e.via,to:e.to};let t=n.resolveEntry??(r=>Wg(r,n.env==null?{}:{env:n.env}));return{via:e.via,to:e.to,entry:t(e.to)}}function Ql(e,n,t={}){let r=t.io??{};if(e.via==="supervisor-exit"||e.entry==null)return(r.exit??Cg)(Fl),{...e,exitCode:Fl};let o=[...e.entry.args,...be(n,t.idleMs==null?{}:{idleMs:t.idleMs})];return(r.spawnSuccessor??Mg(r.env))(e.entry,o),e}function Mg(e){return(n,t)=>{let r=Og(n.command,[...t],{detached:!0,stdio:"ignore",env:{...e??process.env,REDSKILLED_DAEMON:"1",[Vl]:"1"}});r.on("error",()=>{}),r.unref()}}function Cg(e){process.exitCode=e,process.exit(e)}async function Yl(e,n=process.env,t=Fg){let r=Xl(n),o=ea(e,n);if(n[Tg]==="1")return{version:o,newest:r};let s=U(e)===null?"0.0.0":e;try{let i=await zs({fetchText:t},s);return{version:i.sameMajor??o,newest:i.newest??r}}catch{return{version:o,newest:r}}}function Zl(e,n=process.env,t){let r=t??Br;return{version:ea(e,n,r),newest:Xl(n,r)}}function Xl(e=process.env,n=Br){return ta(na(e,n))}function ea(e,n=process.env,t=Br){let r=U(e.trim())?.major;return r===void 0?null:ta(na(n,t).filter(o=>U(o)?.major===r))}function na(e,n){let t=[];for(let r of n(Un(e))){let o=/^redskilled-(.+)\.bundle\.min\.mjs$/.exec(r)?.[1];!o||U(o)===null||t.push(o)}return t}function ta(e){let n=null;for(let t of e)(n===null||Mr(t,n)>0)&&(n=t);return n}function Br(e){try{return $g(e)}catch{return[]}}async function Fg(e){let n=await fetch(e,{headers:{accept:"application/json"}});if(!n.ok)throw new Error(`registry read failed with HTTP ${n.status}`);return await n.text()}import{mkdir as Hg,readFile as Ug,rename as Vg,rm as Kr,writeFile as ra}from"node:fs/promises";import{randomUUID as Bg}from"node:crypto";import{dirname as Kg}from"node:path";var st=class extends Error{constructor(n){super(`redskilled lease ${JSON.stringify(n)} is held by another owner`),this.name="RedskilledLeaseOwnershipError"}};async function qr(e){let n;try{n=await Ug(e,"utf8")}catch(r){if(r.code==="ENOENT")return;throw r}let t=Jg(n);return qg(t)?t:void 0}var oa;function ia(){return oa??={pid:process.pid,startTime:new Date(Date.now()-Math.round(process.uptime()*1e3)).toISOString()},oa}function la(e,n,t={}){let r=t.clock??(()=>new Date().toISOString()),o=t.isPidAlive??W;async function s(){return await qr(e)}async function i(a){let d=`${e}.${a.pid}.${Bg()}.tmp`;await ra(d,sa(a),{encoding:"utf8",mode:384}),await Vg(d,e)}function l(a,d){return{version:1,pid:a.pid,start_time:a.startTime,session_key_hash:n.sessionKeyHash,machine_id_hash:n.machineIdHash,socket_path:n.socketPath,acquired_at:d,renewed_at:d}}return{read:s,async acquire(a){await Hg(Kg(e),{recursive:!0,mode:448});let d=!1;for(;;){let u=r(),p=l(a,u);try{return await ra(e,sa(p),{encoding:"utf8",mode:384,flag:"wx"}),{acquired:!0,reaped:d,lease:p}}catch(h){if(h.code!=="EEXIST")throw h}let m=await s();if(!m){await Kr(e,{force:!0}),d=!0;continue}if(Jr(m,a))return{acquired:!0,reaped:d,lease:m};if(await o(m.pid))return{acquired:!1,lease:m};await Kr(e,{force:!0}),d=!0}},async renew(a){let d=await s();if(!d||!Jr(d,a))throw new st(e);let u={...d,renewed_at:r()};return await i(u),u},async release(a){let d=await s();if(!d)return!1;if(!Jr(d,a))throw new st(e);return await Kr(e,{force:!0}),!0}}}function Jr(e,n){return e.pid===n.pid&&e.start_time===n.startTime}function sa(e){return`${I(e,{keyedMapCollapse:!0})}
|
|
68
|
+
`}function Jg(e){let n=e.trim();if(!n)return null;try{return JSON.parse(n)}catch{try{return G(n)}catch{return null}}}function qg(e){if(e===null||typeof e!="object"||Array.isArray(e))return!1;let n=e;if(n.version!==1||!Number.isInteger(n.pid)||n.pid<=0)return!1;for(let t of["start_time","session_key_hash","machine_id_hash","socket_path","acquired_at","renewed_at"])if(typeof n[t]!="string"||n[t].length===0)return!1;return!0}var Gr=3e5,nh=1e4,th=6e4,rh=15e3,aa=16,Me=class extends Error{constructor(t,r){super(`a redskilled daemon already owns ${JSON.stringify(t)}`);this.socketPath=t;this.lease=r;this.name="RedskilledAlreadyRunningError"}},oh="no tracker transport was given to this daemon, so no queue depth was ever asked for";async function ca(e){let{paths:n}=e,t=e.daemonVersion??"0.0.0-dev",r=e.idleMs??Gr,o=e.clock??(()=>new Date().toISOString()),s=e.launch??$l,i=e.ceiling??si();e.repositoryActivity!=null&&xr(e.repositoryActivity.projects,e.repositoryActivity.hostTokenRef);let l=e.owner??ia(),a=e.leaseStore??la(n.leasePath,{sessionKeyHash:n.sessionKeyHash,machineIdHash:n.machineIdHash,socketPath:n.socketPath},{clock:o}),d=e.machineOwner??bi(),u={machineIdHash:n.machineIdHash,sessionKeyHash:n.sessionKeyHash,socketPath:n.socketPath},p=e.machineClaimStore??Gn(n.machineClaimPath,u,{clock:o});await Zg(eh(n.socketPath),{recursive:!0,mode:448});let m=await p.claim(d);if(!m.claimed)throw m.claim?.socket_path===n.socketPath?new Me(n.socketPath):new pe(p.claimPath,m.reason,m.claim);let h=await a.acquire(l);if(!h.acquired)throw await p.release(d).catch(()=>{}),new Me(n.socketPath,h.lease);let y;try{y=await sh(n.socketPath)}catch(c){throw await a.release(l).catch(()=>{}),await p.release(d).catch(()=>{}),c}let b=o(),k=e.eventLane??ai(n.eventLanePath),w=e.liveness??yl,D=e.stopWorker??Sl,V=e.unitInventory??(()=>bl(n.machineClaimPath,qn({machineIdHash:n.machineIdHash}))?_l():[]),C=e.unitMainPid??Rl,me=e.treeSampler??Ni,we=e.readLogTail??Al,Rn=e.sampleMs??rh,oo=e.publishedVersion??(c=>Yl(c)),so=e.replaceCheckMs??Ul,io=e.publishedProbeTimeoutMs??nh,Va=e.localPublishedEvidence??(c=>Zl(c,e.replacementIO?.env??process.env)),Ba=e.bornByReplacement??Bl(),lo=e.replaceBootCheckMs??th,ao=e.supervised??Gl(),co=e.replacementIO??{},B=e.repositoryActivity,uo=B?.intervalMs??6e4,He=e.queueDiscovery,po=He?.transport??B?.transport,Ka=He?.unconfiguredReason??oh,mo=He?.intervalMs??15e3,fo=e.demandMs??15e3,Ja=e.demandBackoffMs??3e4,x=new Map,le=new Set,ve=new Map,bn=new Map,at=[],_n=[],A=new Map,dt=new Set,go={},ct=null,ho=null,ut=null,yo=!1,pt=0,mt=null,Ue="none",ft=null,ko=null,gt=null,ae=null,wn=null,Ve=[],Be=null,ht=!1,Se,Ke,Je,qe,vn,Ge,ze,Z=!1,yt=!1,Sn=null,Ro,kt=new Promise(c=>{Ro=c});function Qe(c){bo(c);let f=Date.parse(c),g=Pi(A.values(),f);for(let _ of g.lapsed)A.delete(_.project_label),qa(_,f);return g.lapsed}function qa(c,f){let g=Number.isFinite(f)?new Date(f).toISOString():c.renew_by;Ve.push({project_label:c.project_label,at:g,renew_by:c.renew_by,renewals:c.renewals,sustains:c.sustains??0,detail:`redskilled dropped the registration for project ${JSON.stringify(c.project_label)}: it stood until ${c.renew_by} and nothing renewed it \u2014 no session spoke for it, and no poll found it work or a Worker to hold it up`}),Ve.length>aa&&Ve.splice(0,Ve.length-aa)}function bo(c){if(A.size===0)return;let f=Date.parse(c);if(!Number.isFinite(f))return;let g={};for(let v of x.values())g[v.project_label]=(g[v.project_label]??0)+1;let _=new Map((ae?.projects??[]).map(v=>[v.project_label,v]));for(let v of[...A.values()]){let P=_.get(v.project_label),ee=xi(v,{now:c,...P==null?{}:{queue:{outcome:P.outcome,depth:P.depth}},liveWorkers:g[v.project_label]??0});ee.registration!==v&&A.set(v.project_label,ee.registration)}}function xn(){let c=o();return Qe(c),Xi({now:c,daemonVersion:t,machineIdHash:n.machineIdHash,sessionKeyHash:n.sessionKeyHash,pid:l.pid,startedAt:b,scope:_i(p.claimPath,u,d),workers:[...x.values()],registrations:[...A.values()],lapses:Ve,queue:ae,published:{version:ho,checkedAt:ut,newer:yo,replacement:Ue,newest:ft,majorHold:ko,checks:pt,holdReason:mt}})}function En(){return Bi({hostState:xn(),ceiling:i,rss:go,sampledAt:ct,logLines:Object.fromEntries(ve),displays:Object.fromEntries(bn),now:o(),reattachedWorkerIds:[...le],repositoryActivity:gt,...e.deaths===void 0?{}:{deaths:e.deaths},metrics:Ii({observations:at,outcomes:_n,now:o()})})}function Ga(c,f){at=Qn([...at,{worker_id:f,observed_at:c.published_at,tokens:c.display.tokens,tools:c.display.tools,runner:c.display.runner,model:c.display.model}],g=>g.observed_at,{now:o()})}function za(c){_n=Qn([..._n,c],f=>f.ts,{now:o()})}async function Rt(){return B==null||B.projects.length===0?null:(gt=await Ci({projects:B.projects,hostTokenRef:B.hostTokenRef,transport:B.transport,closedWindowMs:B.closedWindowMs,now:o()}),gt)}async function _o(){let c=o();Qe(c);let f=[...A.values()].map(g=>({project_label:g.project_label,selector:g.selector})).sort((g,_)=>g.project_label.localeCompare(_.project_label));return f.length===0?null:po==null?(ae=El(f,c,Ka),ae):(ae=await Pl({projects:f,transport:po,now:c,...He?.batchSize==null?{}:{batchSize:He.batchSize}}),bo(o()),ae)}async function wo(){let c=o();if(ht)return wn??ui(c);ht=!0;try{let f={};for(let $ of x.values())f[$.project_label]=(f[$.project_label]??0)+1;let g={};for(let $ of ae?.projects??[])g[$.project_label]=$.depth;let _=Date.parse(c),v=ci({projects:[...A.values()].map($=>({project_label:$.project_label,selector:$.selector,argv:$.argv,workspace_path:$.workspace_path,target:$.target})),queue:g,live:f,nowMs:Number.isFinite(_)?_:0,backoffUntilMs:Be}),P=[],ee=null;for(let $ of v.births){let Ln;try{Ln=bt({project_label:$.project_label,workspace_path:$.workspace_path,command:$.argv[0],args:$.argv.slice(1)})}catch(vt){ee=vt instanceof Error?vt.message:String(vt),Be=(Number.isFinite(_)?_:Date.now())+Ja;break}P.push({project_label:$.project_label,worker_id:Ln.worker.worker_id,pid:Ln.worker.pid,warnings:Ln.warnings})}return ee==null&&v.births.length>0&&(Be=null),wn={version:1,at:c,requested:v.births.length,granted:P,shortfall:v.births.length-P.length,refusal:ee,retry_after:Be==null?null:new Date(Be).toISOString(),projects:v.intents},wn}finally{ht=!1}}function Qa(c){return Ki(En(),{...O,mode:c?.mode??O.mode,project:c?.project??O.project,maxWorkers:c?.max_workers??O.maxWorkers,maxProjects:c?.max_projects??O.maxProjects,maxWidth:c?.max_width??O.maxWidth,verbose:c?.verbose??O.verbose})}function Ya(c){return Qi(En(),{mode:c?.mode??Te.mode,project:c?.project??Te.project,maxWidth:c?.max_width??Te.maxWidth,maxRows:c?.max_rows??Te.maxRows})}function xe(c,f,g){return Di({op:c,sessionProject:f??null,targetProject:g})}async function Za(c){let f=x.get(c.worker_id),g=xe(ji(c.command),c.session_project,f?.project_label??null);if(!g.permitted)throw new Error(g.reason);if(c.command!=="stop")throw new Error(`redskilled does not implement ${c.command}: it owns birth, death and limits, and ${c.command} is a work decision the project's own bundle makes on top of them`);let _=f!=null&&await td(f,c.detail??"stopped by its own project");return{version:1,command:c.command,worker_id:c.worker_id,applied:_,reach:g,detail:_?`redskilled stopped Worker ${JSON.stringify(c.worker_id)} of project ${JSON.stringify(f.project_label)}`:`redskilled holds no live Worker ${JSON.stringify(c.worker_id)} to stop`}}function Pn(c){x.delete(c),le.delete(c),ve.delete(c),bn.delete(c)}function vo(c){let f=x.get(c.worker_id),g=xe("worker-heartbeat",c.session_project,f?.project_label??null);if(!g.permitted)throw new Error(g.reason);if(typeof c.last_log_line!="string")throw new Error("redskilled worker heartbeat last_log_line must be a string");if(f==null)return{version:1,worker_id:c.worker_id,accepted:!1,reach:g,published_at:null,detail:`redskilled holds no live Worker ${JSON.stringify(c.worker_id)} to publish a line for`};let _=o();ve.set(c.worker_id,{line:c.last_log_line,published_at:_,source:"heartbeat"});let v=c.display===void 0?null:Gi(c.display);if(v!=null){let P={display:v,published_at:_};bn.set(c.worker_id,P),Ga(P,c.worker_id)}return{version:1,worker_id:c.worker_id,accepted:!0,reach:g,published_at:_,detail:`redskilled stored a line for Worker ${JSON.stringify(c.worker_id)} without reading it`}}async function Xa(c,f,g){let _=`exit code=${f??"null"} signal=${g??"null"}`;if(c.unit!=null&&c.unit!==""&&await ed(c)){nd(c,`its launch client ended (${_}) while unit ${JSON.stringify(c.unit)} stayed active, so the daemon holds it by unit name from here on and its death is discovered by asking the host`);return}Pn(c.worker_id),X("worker-death",c,_,{exitCode:f,signal:g}),L()}async function ed(c){try{return await w(c)===!0}catch{return!1}}function nd(c,f){let g=c.unit==null?null:C(c.unit);x.set(c.worker_id,{...c,...g!=null&&g>0?{pid:g}:{},warnings:[...c.warnings,f]}),le.add(c.worker_id),L()}function So(c,f){let g=xe("project-register",f,c.project_label);if(!g.permitted)throw new Error(g.reason);let _=o();Qe(_);let v=vi(c,{now:_,held:A.get(c.project_label)});return A.set(v.project_label,v),L(),{version:1,registration:v,reach:g,detail:`redskilled holds a registration for project ${JSON.stringify(v.project_label)} at a target of ${v.target} until ${v.renew_by}, and has read neither its selector nor its argv`}}function xo(c,f={}){let g=xe("project-renew",f.sessionProject,c);if(!g.permitted)throw new Error(g.reason);let _=o();Qe(_);let v=A.get(c);if(v==null)throw new zn(c);let P=Si(v,{now:_,...f.renewWithinMs==null?{}:{renew_within_ms:f.renewWithinMs},...f.launch==null?{}:{launch:f.launch}});return A.set(P.project_label,P),L(),{version:1,registration:P,reach:g,detail:`redskilled renewed the registration for project ${JSON.stringify(P.project_label)}, which now stands until ${P.renew_by} after renewal ${P.renewals}`+(f.launch==null?"":`, carrying launch revision ${P.launch_revision} for its next Worker`)}}function Eo(c,f){let g=xe("project-deregister",f,c);if(!g.permitted)throw new Error(g.reason);let _=A.delete(c);return{version:1,project_label:c,released:_,reach:g,detail:_?`redskilled released the registration for project ${JSON.stringify(c)}`:`redskilled held no registration for project ${JSON.stringify(c)}, so there was nothing to release`}}async function td(c,f){try{await D(c)}catch{}return Pn(c.worker_id),X("worker-death",c,f),L(),!0}function Po(c){return ri({ceiling:i,workers:[...x.values()],budget:c.budget,projectLabel:c.project_label})}function bt(c){let f=oi({ceiling:i,workers:[...x.values()],budget:c.budget}),g=s({spec:c,admission:Po(c),memoryCeiling:f,clock:o,onExit:(_,v,P)=>{let ee=x.get(_);if(ee==null){L();return}Xa(ee,v,P).catch(()=>{})}});return x.set(g.worker.worker_id,g.worker),X("worker-birth",g.worker,null),L(),g}function X(c,f,g,_={}){if(Z)return;let v=o();(c==="worker-death"||c==="worker-budget-kill")&&za({worker_id:f.worker_id,ts:v,outcome:c}),k.record({event:c,worker:f,ts:v,detail:g,..._.exitCode!==void 0?{exitCode:_.exitCode}:{},..._.signal!==void 0?{signal:_.signal}:{}}).catch(()=>{})}async function jo(){let c=[...le].map(g=>x.get(g)).filter(g=>g!=null);if(c.length===0)return[];let{dead:f}=await Nr(c,w);for(let g of f)Pn(g.worker_id),X("worker-death",g,"the host no longer confirms this Worker");return f.length>0&&L(),f}async function Do(c,f){let g=x.get(c);if(!g)return!1;try{await D(g)}catch{}return Pn(c),X("worker-budget-kill",g,f),L(),!0}async function Oo(){let c=[...x.values()];if(c.length===0)return[];let f;try{f=await me(c)}catch{return[]}let g=f.rss;go=g,ct=o(),rd(f.cpu_seconds,ct);let{terminations:_}=Ti({workers:c,rss:g}),v=[];for(let P of _)await Do(P.worker_id,P.reason)&&v.push(P);return v}function rd(c,f){for(let[g,_]of Object.entries(c)){if(typeof _!="number"||!Number.isFinite(_))continue;let v=x.get(g);v&&x.set(g,{...v,cpu:{cpu_seconds:_,sampled_at:f}})}}async function od(){try{return io<=0?await oo(t):await new Promise(c=>{let f=setTimeout(()=>c(_t()),io);f.unref(),oo(t).then(g=>{clearTimeout(f),c(g)},()=>{clearTimeout(f),c(_t())})})}catch{return _t()}}function _t(){try{return Va(t)}catch{return null}}async function Lo(){if(yn(t))return pt+=1,ut=o(),mt="local-build",{act:"hold",reason:"local-build"};let c=Kl(await od()),f=c.version;ho=f,ft=c.newest??null,ut=o(),ko=Jl({running:t,newest:ft,supervised:ao});let g=ql({running:t,published:f,supervised:ao});return yo=g.act==="replace",pt+=1,mt=g.act==="hold"?g.reason:null,Ue!=="in-progress"&&(Ue=g.act==="replace"?"pending":"none"),g}async function jn(){let c=await Lo();if(c.act!=="replace"||Ue==="in-progress")return c;let f=zl(c,co);return Ue="in-progress",await k.flush().catch(()=>{}),await On({reason:"replaced"}),Ql(f,n,{...r==null?{}:{idleMs:r},io:co}),c}function sd(){Z||qe!=null||so<=0||(!Ba&&lo>0&&(vn=setTimeout(()=>{jn().catch(()=>{})},lo),vn.unref()),qe=setInterval(()=>{jn().catch(()=>{})},so),qe.unref())}function id(){Z||Ke!=null||Rn<=0||(Ke=setInterval(()=>{Oo().catch(()=>{})},Rn),Ke.unref())}function ld(){Z||Ge!=null||B==null||B.projects.length===0||uo<=0||(Rt().catch(()=>{}),Ge=setInterval(()=>{Rt().catch(()=>{})},uo),Ge.unref())}function ad(){Z||ze!=null||mo<=0||(ze=setInterval(()=>{_o().catch(()=>{})},mo),ze.unref())}function dd(){Z||Je!=null||fo<=0||(Je=setInterval(()=>{wo().catch(()=>{})},fo),Je.unref())}function L(){Z||(Se&&clearTimeout(Se),Se=setTimeout(()=>{jo().catch(()=>{}).then(()=>$o())},r),Se.unref())}function $o(){return x.size>0?(L(),"held-by-workers"):(Qe(o()),A.size>0?(L(),"held-by-registrations"):(cd(),"exited"))}async function cd(){if(!yn(t)){if((await jn().catch(()=>null))?.act==="replace"||yt||Z)return;if(x.size>0||A.size>0){L();return}}await On({reason:"idle"})}function Dn(c){return mi({reason:c,socketPath:n.socketPath,daemonVersion:t,pid:l.pid,workers:[...x.values()],projects:[...A.keys()]})}function Ao(c){if(Sn!=null)return Sn;let f=c.reason??"requested",g=c.note?.trim();return Sn=k.recordDaemonStop({ts:o(),pid:l.pid,socketPath:n.socketPath,reason:f,detail:g==null||g===""?Dn(f).detail:`${Dn(f).detail} \u2014 ${g}`,...c.signal==null?{}:{signal:c.signal}}).catch(()=>{}),Sn}async function On(c={}){if(yt)return await kt;yt=!0,await Ao(c),Z=!0,Se&&clearTimeout(Se),Ke&&clearInterval(Ke),qe&&clearInterval(qe),vn&&clearTimeout(vn),Ge&&clearInterval(Ge),ze&&clearInterval(ze),Je&&clearInterval(Je),await k.flush().catch(()=>{}),y.close();for(let f of dt)f.destroy();return await new Promise(f=>y.once("close",()=>f())),await da(n.socketPath,{force:!0}),await a.release(l).catch(()=>{}),await p.release(d).catch(()=>{}),Ro(),await kt}let Io=await k.read().catch(()=>[]);_n=Qn(Io.filter(c=>c.event==="worker-death"||c.event==="worker-budget-kill").map(c=>({worker_id:c.worker_id,ts:c.ts,outcome:c.event})),c=>c.ts,{now:o()});let ud=di(Io),wt=await Nr(ud,w);for(let c of wt.alive){let f=vl(c),g=f.unit==null||W(f.pid)?null:C(f.unit);x.set(f.worker_id,g!=null&&g>0?{...f,pid:g}:f),le.add(f.worker_id)}for(let c of wt.dead)X("worker-death",c,"the Worker ended while no daemon was watching");let pd=wl({units:await Promise.resolve(V()).catch(()=>[]),held:[...x.values()],mainPid:C,now:b});for(let c of pd)x.set(c.worker_id,c),le.add(c.worker_id),X("worker-birth",c,"adopted from an active unit with no birth on this lane");for(let c of wt.alive){if(c.log_path==null||ve.has(c.worker_id))continue;let f=await we(c.log_path).catch(()=>null);f==null||f.trim()===""||ve.set(c.worker_id,{line:f,published_at:o(),source:"rehydrated"})}y.on("connection",c=>{dt.add(c),c.once("close",()=>dt.delete(c)),L(),ih(c,async(f,g)=>{L();let _=await md(f);g(_),f.op==="shutdown"&&setImmediate(()=>void On({reason:"requested"}))})});async function md(c){try{if(c.op==="ping")return{id:c.id,ok:!0,value:{pong:!0,protocol_version:Xn,daemon_version:t,pid:l.pid}};if(c.op==="host-state")return{id:c.id,ok:!0,value:xn()};if(c.op==="statusline-payload")return{id:c.id,ok:!0,value:En()};if(c.op==="statusline-string")return{id:c.id,ok:!0,value:Qa(c.render)};if(c.op==="statusline-dashboard")return{id:c.id,ok:!0,value:Ya(c.dashboard)};if(c.op==="worker-heartbeat")return{id:c.id,ok:!0,value:vo(c.heartbeat)};if(c.op==="project-register")return{id:c.id,ok:!0,value:So(c.registration,c.session_project)};if(c.op==="project-renew")return{id:c.id,ok:!0,value:xo(c.project_label,{...c.session_project==null?{}:{sessionProject:c.session_project},...c.renew_within_ms==null?{}:{renewWithinMs:c.renew_within_ms},...c.launch==null?{}:{launch:c.launch}})};if(c.op==="project-deregister")return{id:c.id,ok:!0,value:Eo(c.project_label,c.session_project)};if(c.op==="worker-command")return{id:c.id,ok:!0,value:await Za(c.command)};if(c.op==="worker-start"){let g=xe("worker-start",c.session_project,c.spec.project_label);if(!g.permitted)return{id:c.id,ok:!1,error:g.reason};let _=bt(c.spec);return await k.flush().catch(()=>{}),{id:c.id,ok:!0,value:{worker:_.worker,admission:_.admission,warnings:_.warnings}}}if(c.op==="shutdown"){let g=Dn("requested");return await Ao({reason:"requested",...c.detail==null?{}:{note:c.detail}}),{id:c.id,ok:!0,value:g}}let f=c;return{id:f.id??it(),ok:!1,error:`unsupported redskilled op: ${f.op??"unknown"}`}}catch(f){return{id:c.id??it(),ok:!1,error:f instanceof Error?f.message:String(f)}}}return L(),id(),sd(),ld(),ad(),dd(),{socketPath:n.socketPath,lease:h.lease,startedAt:b,closed:kt,startWorker:bt,admit:Po,ceiling:()=>i,killWorkerOverBudget:Do,sampleMemoryBudgets:Oo,pollRepositoryActivity:Rt,pollQueueDiscovery:_o,queueDiscovery:()=>ae,driveDemand:wo,demand:()=>wn,sweepReattached:jo,publishWorkerHeartbeat:vo,reattached:()=>[...le].map(c=>x.get(c)).filter(c=>c!=null),flushEvents:()=>k.flush(),trackWorker(c){x.set(c.worker_id,c),X("worker-birth",c,null),L()},releaseWorker(c){let f=x.get(c),g=x.delete(c);return le.delete(c),ve.delete(c),bn.delete(c),f&&X("worker-death",f,"released by the daemon"),L(),g},workerCount:()=>x.size,registerProject:So,renewProject:xo,deregisterProject:Eo,registrations:()=>xn().registrations??[],hostState:xn,statuslinePayload:En,evaluateIdle:$o,observePublishedVersion:Lo,checkForReplacement:jn,stopReport:Dn,stop:On}}async function sh(e){for(let n=0;n<2;n++){let t=Xg();try{return await new Promise((r,o)=>{t.once("error",o),t.listen(e,()=>{t.off("error",o),r()})}),t}catch(r){if(t.close(),r.code!=="EADDRINUSE")throw r;if(await se(e))throw new Me(e);await da(e,{force:!0})}}throw new Me(e)}async function se(e,n=250){try{return(await Cn({socketPath:e,timeoutMs:n},{id:it(),op:"ping"},"redskilled daemon")).ok===!0}catch{return!1}}function ih(e,n){Bs(e,(t,r)=>n(t,r),(t,r,o)=>{o({id:r?.id??it(),ok:!1,error:t instanceof Error?t.message:String(t)})})}re();var uh=1e4,Ce=class extends Error{constructor(t,r){super(`redskilled daemon is unreachable on ${JSON.stringify(t)}, so no Worker was started: ${r instanceof Error?r.message:String(r)}`);this.socketPath=t;this.cause=r;this.name="RedskilledUnreachableError"}};async function zr(e,n={}){try{return await ph(e,n)}catch(t){throw t instanceof pe||t instanceof Ce?t:new Ce(e.socketPath,t)}}async function ph(e,n){if(await ah(ch(e.socketPath),{recursive:!0,mode:448}),await se(e.socketPath))return"already-running";await mh(e);let t=await Ks(e.lockPath);if(!t)return await ua(e,n),"joined";try{if(await se(e.socketPath))return"already-running";let r=await hh(e,n);return await ua(e,n,r),"spawned"}finally{await t.close(),await dh(e.lockPath,{force:!0})}}async function mh(e){let t=await Gn(e.machineClaimPath,{machineIdHash:e.machineIdHash,sessionKeyHash:e.sessionKeyHash,socketPath:e.socketPath}).read().catch(()=>{});if(t!=null&&t.socket_path!==e.socketPath&&W(t.pid))throw new pe(e.machineClaimPath,"held",t)}async function ma(e,n,t={}){await zr(e,t);let r;try{r=await fn({socketPath:e.socketPath,timeoutMs:t.requestTimeoutMs??2e3},{...n,id:pa()})}catch(o){throw new Ce(e.socketPath,o)}if(!r.ok)throw new Error(r.error);return r.value}async function fa(e,n={},t={}){if(!await se(e.socketPath))return fi(e.socketPath);let r;try{r=await fn({socketPath:e.socketPath,timeoutMs:t.requestTimeoutMs??2e3},{id:pa(),op:"shutdown",...n.detail==null?{}:{detail:n.detail}})}catch(i){throw new Ce(e.socketPath,i)}if(!r.ok)throw new Error(r.error);if(!hr(r.value))throw new Error("redskilled daemon returned a malformed stop report");let o=r.value;return await fh(e.socketPath,n.settleTimeoutMs??5e3)?o:{...o,stopped:!1,detail:`${o.detail}; the daemon accepted the stop and is still answering on ${JSON.stringify(e.socketPath)}`}}async function fh(e,n){let t=Date.now()+n;for(;;){if(!await se(e))return!0;if(Date.now()>=t)return!1;await new Promise(r=>setTimeout(r,25))}}async function ga(e,n={}){let t=await ma(e,{op:"host-state"},n);if(!el(t))throw new Error("redskilled daemon returned a malformed host state");return t}async function ha(e,n=void 0,t={}){let r=await ma(e,{op:"statusline-string",...t.sessionProject!=null?{session_project:t.sessionProject}:{},...n==null?{}:{render:gh(n)}},t);if(!Zi(r))throw new Error("redskilled daemon returned a malformed statusline render");return r}function gh(e){return{mode:e.mode,project:e.project,max_workers:e.maxWorkers,max_projects:e.maxProjects,max_width:e.maxWidth,verbose:e.verbose}}async function ua(e,n,t){let r=Date.now()+(n.readyTimeoutMs??uh);for(;;){if(await se(e.socketPath))return;if(t?.failure)throw new Error(`redskilled daemon failed to start from ${JSON.stringify(t.entry.entry??t.entry.command)} (resolved as ${t.entry.source}): ${t.failure.message}`);if(Date.now()>=r){let o=t?` from ${JSON.stringify(t.entry.entry??t.entry.command)} (resolved as ${t.entry.source})${t.exit?`, which ${t.exit}`:""}`:"";throw new Error(`redskilled daemon did not start on ${JSON.stringify(e.socketPath)}${o}`)}await new Promise(o=>setTimeout(o,25))}}async function hh(e,n){let t=n.serverCommand??(n.serverArgs!=null?process.execPath:void 0),r=await Xs({...t!=null?{serverCommand:t}:{},serverArgs:n.serverArgs},n.entryLookup??{}),o={entry:r},s=[...r.args,...be(e,n.idleMs==null?{}:{idleMs:n.idleMs})],i=lh(r.command,s,{detached:!0,stdio:"ignore",env:{...n.env??process.env,REDSKILLED_DAEMON:"1"}});return i.on("error",l=>{o.failure=l}),i.on("exit",(l,a)=>{o.exit=a?`died on ${a}`:`exited with code ${l??-1}`}),i.unref(),o}re();import{chmod as va,mkdir as xa,readFile as Ea,stat as Ph,writeFile as jh}from"node:fs/promises";import{homedir as Zr}from"node:os";import{dirname as Dh,join as Xr}from"node:path";import{join as yh}from"node:path";var ya=["local","tmp","host"],kh="local",kn="plugins.dev.workspace.target";var Qr=class extends Error{constructor(n){super(n),this.name="WorkspaceConfigError"}};function Ra(e){let n=Le(e,kn),t=_h(n??"").trim();return t===""?void 0:t}function ba(e){let n=(e??"").trim();if(n==="")return{kind:"preset",preset:kh};let t=ya.find(r=>r===n.toLowerCase());if(t)return{kind:"preset",preset:t};if(n.startsWith("/")||n==="~"||n.startsWith("~/"))return{kind:"custom",parentDir:n};throw new Qr(`${kn}: unknown workspace target ${JSON.stringify(n)}. Use one of the presets (${ya.join(", ")}) or an absolute parent directory for Workers.`)}function _a(e,n){return e.kind==="preset"?e.preset==="host":bh(Rh(e.parentDir,n),Re(n))}function Rh(e,n){return e==="~"?ka(n):e.startsWith("~/")?yh(n,e.slice(2)):ka(e)}function bh(e,n){return e===n?!0:n==="/"?e.startsWith("/"):e.startsWith(`${n}/`)}function ka(e){let n=e.trim();return n.length>1?n.replace(/\/+$/,""):n}function _h(e){let n=e.trim(),t=/^(["'])(.*)\1$/.exec(n);return t?t[2]:n}re();import{createHash as wh}from"node:crypto";import{hostname as vh}from"node:os";import{join as lt}from"node:path";var Fe="redskilled.sock",Sh="REDSKILLED_SESSION";function xh(e={}){let n=e.env??process.env,t=n[Sh]?.trim();if(t)return t;let r=n.XDG_RUNTIME_DIR?.trim();return r||`uid:${e.uid??(typeof process.getuid=="function"?process.getuid():"nouid")}`}function Eh(e={}){return wa(e.host??vh())}function ie(e={}){let n=xh(e),t=e.runtimeDir??Fn({key:`redskilled:${n}`,socketFileName:Fe,env:e.env,uid:e.uid}),r=Eh(e);return{sessionKey:n,sessionKeyHash:wa(n),machineIdHash:r,runtimeDir:t,socketPath:lt(t,Fe),lockPath:lt(t,"redskilled.spawn.lock"),leasePath:lt(t,"redskilled.lease.toon"),eventLanePath:lt(t,li),machineClaimPath:e.machineClaimPath??qn({env:e.env,machineIdHash:r,platform:e.platform})}}function wa(e){return wh("sha256").update(e).digest("hex").slice(0,12)}var Yr="run `/red-setup` (Section E3 \u2014 execution daemon), or `redskilled provision` directly";async function Pa(e=Zr()){let n=Re(e),t=await no(n);return t===void 0?(await xa(n,{recursive:!0,mode:z}),await va(n,z),{path:n,created:!0,tightened:!1,mode:z}):t===z?{path:n,created:!1,tightened:!1,mode:t}:(await va(n,z),{path:n,created:!1,tightened:!0,mode:z})}var ja={needed:!1,declaredBy:`no ${kn} in view`};async function eo(e={}){let n=e.homeDir??Zr(),t=e.declaredTarget?.trim();if(t)return Sa(t,n,"stated on the command line");let r=e.projectRoot?.trim();if(!r)return ja;let o=Xr(r,".red","config.yaml"),s=await Ea(o,"utf8").catch(()=>{});if(s===void 0)return{needed:!1,declaredBy:`no ${o}`};let i=Ra(s);return i===void 0?{needed:!1,declaredBy:`${o} declares no workspace target (default local)`}:Sa(i,n,o)}function Sa(e,n,t){let r=`${kn}: ${e} (${t})`;try{return{needed:_a(ba(e),n),declaredBy:r}}catch{return{needed:!1,declaredBy:`${r} \u2014 off-contract, so it names no lane under the home`}}}function Da(e){let n=[Oh(e),Lh(e),$h(e),Ah(e)],t=n.filter(o=>o.verdict!=="ok");return{verdict:t.some(o=>o.verdict==="missing")?"missing":t.length>0?"degraded":"ok",rows:n,findings:t}}function Oh(e){let n=e.homeNeed??ja;if(!e.homePresent)return n.needed?{check:"home",verdict:"missing",evidence:`${e.homePath} does not exist, and it is needed \u2014 ${n.declaredBy}`,fix:Yr}:{check:"home",verdict:"ok",evidence:`${e.homePath} is absent and unneeded \u2014 ${n.declaredBy}; the daemon never reads it`,fix:""};let t=e.homeMode??z;return t!==z?{check:"home",verdict:"degraded",evidence:`${e.homePath} is mode ${t.toString(8)}, not owner-only ${z.toString(8)}`,fix:`${Yr} \u2014 it narrows the home back to owner-only`}:{check:"home",verdict:"ok",evidence:`${e.homePath} (mode ${t.toString(8)})`,fix:""}}function Lh(e){return Y(e.entry)?{check:"daemon-entry",verdict:"ok",evidence:`${e.entry.entry??e.entry.command} (resolved as ${e.entry.source})`,fix:""}:{check:"daemon-entry",verdict:"missing",evidence:`no published redskilled bundle; probed ${e.entry.searched.join(", ")||"nothing"}`,fix:"install or warm the RedSkills bundle for this host, then re-run `redskilled provision`"}}function $h(e){return e.reachable?{check:"reach",verdict:"ok",evidence:`daemon answered on ${e.socketPath}`,fix:""}:{check:"reach",verdict:"missing",evidence:`no daemon answered on ${e.socketPath}`,fix:`${Yr} \u2014 it starts the daemon and waits for the socket`}}function Ah(e){return{check:"supervisor-unit",verdict:"ok",evidence:e.supervisorUnit==="installed"?"redskilled.service is installed (optional supervision, Restart=on-failure)":e.supervisorUnit==="unsupported"?"optional: this host has no systemd --user session; auto-spawn is the only start path":"optional: not installed; auto-spawn already starts the daemon on first use",fix:""}}async function Oa(e={}){let n=e.env??process.env,t=e.homeDir??Zr(),r=e.paths??ie({env:n}),o=Re(t),[s,i,l]=await Promise.all([no(o),se(r.socketPath),e.homeNeed?Promise.resolve(e.homeNeed):eo({homeDir:t,projectRoot:e.projectRoot,declaredTarget:e.declaredTarget})]);return{homePath:o,homePresent:s!==void 0,homeMode:s,homeNeed:l,entry:ue(e.entryOverride??{},{env:n,...e.entryLookup}),socketPath:r.socketPath,reachable:i,supervisorUnit:await Th(Nh(e,n,t),n)}}var Ih="redskilled.service";function La(e){return Xr(e,"systemd","user",Ih)}function $a(e){let n=e.socketPath?` --socket ${e.socketPath}`:"";return["[Unit]","Description=redskilled \u2014 the host-scoped execution daemon (ADR 0130)","","[Service]","Type=simple",`ExecStart=${e.command} serve${n}`,"Restart=on-failure","RestartSec=2","","[Install]","WantedBy=default.target",""].join(`
|
|
69
|
+
`)}async function Aa(e){let n=La(e.configHome);return await no(n)!==void 0?{path:n,status:"already-present"}:(await xa(Dh(n),{recursive:!0}),await jh(n,e.unit,"utf8"),{path:n,status:"installed"})}async function Th(e,n){if(process.platform!=="linux")return"unsupported";try{return await Ea(La(e),"utf8"),"installed"}catch{return n.XDG_RUNTIME_DIR?"absent":"unsupported"}}function Nh(e,n,t){return e.configHome??n.XDG_CONFIG_HOME?.trim()??Xr(t,".config")}async function no(e){try{return(await Ph(e)).mode&511}catch{return}}import{readdir as Ta,rm as Wh,stat as Mh}from"node:fs/promises";import{dirname as Ch,join as to}from"node:path";var Fh=5*6e4,Hh="redskilled.";function Uh(e={}){let n=e.env??process.env,t=i=>Ch(Fn({key:"redskilled:reclaim-probe",socketFileName:Fe,env:i,...e.uid===void 0?{}:{uid:e.uid}})),{XDG_RUNTIME_DIR:r,...o}=n,s=[t(n),t(o)];return[...new Set(s)]}async function Na(e={}){let n=e.roots??Uh(e),t=e.graceMs??Fh,r=e.now??Date.now,o=e.isPidAlive??W,s=e.answers??Jh,i=e.dryRun===!0,l=[];for(let a of n){let d;try{d=(await Ta(a,{withFileTypes:!0})).filter(u=>u.isDirectory()).map(u=>u.name)}catch{continue}for(let u of d.sort())l.push(await Vh(to(a,u),{graceMs:t,now:r,pidAlive:o,answers:s,dryRun:i}))}return{roots:n,scanned:l.length,reclaimed:l.filter(a=>a.verdict==="reclaimed").length,dryRun:i,entries:l}}async function Vh(e,n){let t;try{t=(await Ta(e)).sort()}catch(i){return{dir:e,verdict:"failed",reason:Wa(i),removed:[]}}let r=t.filter(i=>i.startsWith(Hh));if(t.length>0&&r.length===0)return{dir:e,verdict:"foreign",reason:"holds no redskilled files",removed:[]};let o=await Bh(to(e,"redskilled.lease.toon"));if(o!==void 0)return await n.pidAlive(o.pid)?{dir:e,verdict:"live",reason:`lease pid ${o.pid} is alive`,removed:[]}:await Ia(e,t,`lease pid ${o.pid} is dead`,n);if(t.includes(Fe)&&await n.answers(to(e,Fe)))return{dir:e,verdict:"live",reason:"socket answers with no lease",removed:[]};let s=await Kh(e,n.now);return s!==void 0&&s<n.graceMs?{dir:e,verdict:"young",reason:`no lease, modified ${Math.round(s/1e3)}s ago`,removed:[]}:await Ia(e,t,t.length===0?"empty and stale":"no lease and stale",n)}async function Ia(e,n,t,r){if(r.dryRun)return{dir:e,verdict:"reclaimed",reason:`${t} (dry run)`,removed:n};try{await Wh(e,{recursive:!0,force:!0})}catch(o){return{dir:e,verdict:"failed",reason:Wa(o),removed:[]}}return{dir:e,verdict:"reclaimed",reason:t,removed:n}}async function Bh(e){try{return await qr(e)}catch{return}}async function Kh(e,n){try{return Math.max(0,n()-(await Mh(e)).mtimeMs)}catch{return}}async function Jh(e){try{return(await fn({socketPath:e,timeoutMs:250},{id:`redskilled-reclaim-${process.pid}`,op:"ping"})).ok}catch{return!1}}function Wa(e){return e instanceof Error?e.message:String(e)}var qh="plugins.dev.statusline",Gh="dev.statusline";function zh(e){let n=[],t=l=>{for(let a of[qh,Gh]){let d=`${a}.${l}`,u=Le(e,d)?.trim();if(u!=null&&u!=="")return{key:d,value:u}}},r=t("mode"),o={};r!=null&&(r.value==="local"||r.value==="global"?o.mode=r.value:n.push({...r,reason:"expected `local` or `global`"}));let s=[{leaf:"max_workers",assign:l=>{o.maxWorkers=l}},{leaf:"max_projects",assign:l=>{o.maxProjects=l}},{leaf:"max_width",assign:l=>{o.maxWidth=l}}];for(let l of s){let a=t(l.leaf);if(a==null)continue;let d=Number(a.value);Number.isInteger(d)&&d>=0?l.assign(d):n.push({...a,reason:"expected a whole number of zero or more"})}let i=t("verbose");return i!=null&&(i.value==="true"||i.value==="false"?o.verbose=i.value==="true":n.push({...i,reason:"expected `true` or `false`"})),{config:o,warnings:n}}var Qh={mode:{kind:"value",coerce:e=>e},verbose:{kind:"boolean"},project:{kind:"value",coerce:e=>e},"max-workers":{kind:"value",coerce:e=>e},"max-projects":{kind:"value",coerce:e=>e},"max-width":{kind:"value",coerce:e=>e}};function Ma(e){let{values:n,positionals:t}=ye(e,Qh),r=[],o={},s=n.mode??t.find(l=>l==="global"||l==="local");s!=null&&(s==="local"||s==="global"?o.mode=s:r.push({key:"--mode",value:s,reason:"expected `local` or `global`"})),n.project!=null&&(o.project=n.project),n.verbose!==void 0&&(o.verbose=n.verbose===!0);let i=[{flag:"max-workers",assign:l=>{o.maxWorkers=l}},{flag:"max-projects",assign:l=>{o.maxProjects=l}},{flag:"max-width",assign:l=>{o.maxWidth=l}}];for(let l of i){let a=n[l.flag];if(a==null)continue;let d=Number(a);Number.isInteger(d)&&d>=0?l.assign(d):r.push({key:`--${l.flag}`,value:a,reason:"expected a whole number of zero or more"})}return{flags:o,warnings:r}}function Ca(e={}){let n=e.configText==null?{config:{},warnings:[]}:zh(e.configText),t=e.flags??{};return{options:{...O,mode:t.mode??n.config.mode??O.mode,project:t.project!==void 0?t.project:e.project??O.project,maxWorkers:t.maxWorkers??n.config.maxWorkers??O.maxWorkers,maxProjects:t.maxProjects??n.config.maxProjects??O.maxProjects,maxWidth:t.maxWidth??n.config.maxWidth??O.maxWidth,verbose:t.verbose??n.config.verbose??O.verbose},warnings:n.warnings}}var Zh=`Usage: redskilled <command> [options]
|
|
70
70
|
|
|
71
71
|
Commands:
|
|
72
72
|
host-state (default) print the host's state as JSON
|
|
@@ -78,7 +78,7 @@ Commands:
|
|
|
78
78
|
|
|
79
79
|
Run \`redskilled <command> --help\` for a command's own usage.
|
|
80
80
|
\`--version\` (\`-v\`) prints the build stamp; both answer offline.
|
|
81
|
-
`,
|
|
81
|
+
`,Xh={serve:`Usage: redskilled serve [options]
|
|
82
82
|
|
|
83
83
|
Runs the daemon in this process. Every path is a flag and none is derived
|
|
84
84
|
(ADR 0130 rule 3); what is absent falls back to the session derivation.
|
|
@@ -142,19 +142,19 @@ Reports every session runtime dir it looked at and why it kept or removed it.
|
|
|
142
142
|
|
|
143
143
|
--dry-run the same report with nothing removed
|
|
144
144
|
--grace-ms <n> how long a dir must be idle before it is reclaimed
|
|
145
|
-
`};function
|
|
146
|
-
`:`${
|
|
147
|
-
`),0}if(
|
|
148
|
-
`);let a=
|
|
149
|
-
`),0}var
|
|
150
|
-
`),o.running&&!o.stopped?1:0}async function
|
|
151
|
-
`),0;if(o==="install"){let s=await
|
|
152
|
-
`),s.installed?0:1}if(o==="uninstall")return t(`${JSON.stringify(await
|
|
153
|
-
`),0;throw new Error(`unsupported redskilled unit action ${JSON.stringify(o)}: expected install, uninstall or status`)}async function
|
|
154
|
-
`);let l;try{l=await
|
|
155
|
-
`),l=
|
|
145
|
+
`};function ey(e){return e==="--help"||e==="-h"||e==="help"}var ny={socket:{kind:"value",coerce:e=>e},lease:{kind:"value",coerce:e=>e},events:{kind:"value",coerce:e=>e},"session-key-hash":{kind:"value",coerce:e=>e},"machine-id-hash":{kind:"value",coerce:e=>e},"machine-claim":{kind:"value",coerce:e=>e},"idle-ms":{kind:"value",coerce:e=>Number(e)},"daemon-version":{kind:"value",coerce:e=>e},"queue-endpoint":{kind:"value",coerce:e=>e},"queue-ms":{kind:"value",coerce:e=>Number(e)},"demand-ms":{kind:"value",coerce:e=>Number(e)}},Ha="REDSKILLED_HOST_TOKEN";function Ua(){try{let n=Yh("gh",["auth","token"],{encoding:"utf8",timeout:5e3,stdio:["ignore","pipe","ignore"]}).trim();return n===""?null:n}catch{return null}}function ty(e=process.env,n=Ua){let t=(e[Ha]??e.GITHUB_TOKEN??e.GH_TOKEN??"").trim();if(t!=="")return{token:t,source:"env"};let r=(n()??"").trim();return r!==""?{token:r,source:"tracker-cli"}:null}function ry(e,n=process.env,t=Ua){let r=e["queue-ms"]==null?{}:{intervalMs:e["queue-ms"]},o=ty(n,t);if(o==null)return{...r,unconfiguredReason:`no credential names a tracker for this host: ${Ha}, GITHUB_TOKEN and GH_TOKEN are all unset in the daemon's environment and \`gh auth token\` returned nothing \u2014 so no queue depth is asked for, and no depth is invented either`};let s=e["queue-endpoint"]??n.GITHUB_GRAPHQL_URL;return{...r,transport:Hi({token:o.token,...s?{endpoint:s}:{}})}}async function oy(e){if(e[0]==="--version"||e[0]==="-v"){let o=Wt("redskilled");return process.stdout.write(e.includes("--json")?`${JSON.stringify(o)}
|
|
146
|
+
`:`${ts(o)}
|
|
147
|
+
`),0}if(ey(e[0]))return process.stdout.write(Zh),0;let{command:n,args:t}=is(e,{commands:{serve:{},stop:{},"host-state":{},statusline:{},unit:{},provision:{},reclaim:{}},default:"host-state"});if(t.some(o=>o==="--help"||o==="-h"))return process.stdout.write(Xh[n]),0;if(n==="serve"){let{values:o}=ye(t,ny),s=ry(o),i=Fa(Re(ro()),"state"),l=Es({stateRoot:i});process.stderr.write(`${Ps(l)}
|
|
148
|
+
`);let a=_s({lanePath:rn(i),kind:"daemon",id:`daemon:${process.pid}`,phase:"serving"}),d=await ca({paths:gy(o),idleMs:o["idle-ms"]??Gr,daemonVersion:o["daemon-version"]??Wt("redskilled").version,deaths:l.attributions,queueDiscovery:s,...o["demand-ms"]==null?{}:{demandMs:o["demand-ms"]}});for(let u of["SIGTERM","SIGINT"])process.once(u,()=>void d.stop({reason:"signal",signal:u}).catch(()=>{}));return await d.closed,a.phase("closed"),0}if(n==="stop")return await iy(t);if(n==="statusline")return await ay(t);if(n==="unit")return await ly(t);if(n==="provision")return await cy(t);if(n==="reclaim")return await py(t);let r=await ga(ie());return process.stdout.write(`${JSON.stringify(r,null,2)}
|
|
149
|
+
`),0}var sy={reason:{kind:"value",coerce:e=>e},"settle-timeout-ms":{kind:"value",coerce:e=>Number(e)}};async function iy(e,n={}){let t=n.write??(s=>process.stdout.write(s)),{values:r}=ye(e,sy),o=await fa(n.paths??ie(),{...r.reason==null?{}:{detail:r.reason},...Number.isFinite(r["settle-timeout-ms"])?{settleTimeoutMs:r["settle-timeout-ms"]}:{}},n.client??{});return t(`${I({running:o.running,stopped:o.stopped,reason:o.reason,socket:o.socket_path,daemon_version:o.daemon_version,pid:o.pid,holding:{workers:o.holding.workers.length,projects:[...o.holding.projects]},surviving:[...o.surviving],workers:o.holding.workers.map(s=>({worker_id:s.worker_id,project_label:s.project_label,pid:s.pid,unit:s.unit,isolated:s.isolated,survives:s.survives})),detail:o.detail})}
|
|
150
|
+
`),o.running&&!o.stopped?1:0}async function ly(e,n={}){let t=n.write??(s=>process.stdout.write(s)),r=n.paths??ie(),o=e[0]??"status";if(o==="status")return t(`${JSON.stringify(Ml(n.unitIO??{}),null,2)}
|
|
151
|
+
`),0;if(o==="install"){let s=await Nl(Il(r),n.unitIO??{});return t(`${JSON.stringify(s,null,2)}
|
|
152
|
+
`),s.installed?0:1}if(o==="uninstall")return t(`${JSON.stringify(await Wl(n.unitIO??{}),null,2)}
|
|
153
|
+
`),0;throw new Error(`unsupported redskilled unit action ${JSON.stringify(o)}: expected install, uninstall or status`)}async function ay(e,n={}){let t=n.write??(a=>process.stdout.write(a)),r=n.warn??(a=>process.stderr.write(a)),o=Ma(e),s=fy(n.cwd??process.cwd()),i=Ca({...s.configText==null?{}:{configText:s.configText},project:s.label,flags:o.flags});for(let a of[...i.warnings,...o.warnings])r(`redskilled statusline: ignoring ${a.key}=${a.value} \u2014 ${a.reason}
|
|
154
|
+
`);let l;try{l=await ha(n.paths??ie(),i.options,{...n.client??{},...i.options.project==null?{}:{sessionProject:i.options.project}})}catch(a){r(`redskilled statusline: ${a instanceof Error?a.message:String(a)}
|
|
155
|
+
`),l=Ji({options:i.options,generated_at:(n.now??(()=>new Date().toISOString()))()})}return t(`${l.lines.join(`
|
|
156
156
|
`)}
|
|
157
|
-
`),0}var
|
|
158
|
-
`),p.verdict==="ok"?0:1}var
|
|
159
|
-
`),o.entries.some(s=>s.verdict==="failed")?1:0}function
|
|
160
|
-
`),process.exitCode=1});export{
|
|
157
|
+
`),0}var dy={"no-start":{kind:"boolean"},"install-unit":{kind:"boolean"},check:{kind:"boolean"},project:{kind:"value",coerce:e=>e},workspace:{kind:"value",coerce:e=>e}};async function cy(e,n={}){let t=n.write??(m=>process.stdout.write(m)),{values:r}=ye(e,dy),o=n.paths??ie(),s=n.homeDir??ro(),i=await eo({homeDir:s,declaredTarget:r.workspace,projectRoot:r.project??n.projectRoot??process.cwd()}),l=r.check||!i.needed?void 0:await Pa(s),a;if(!r.check&&!r["no-start"])try{await zr(o,n.client??{})}catch(m){a=m instanceof Error?m.message:String(m)}let d=await Oa({paths:o,homeNeed:i,...n.homeDir==null?{}:{homeDir:n.homeDir},...n.configHome==null?{}:{configHome:n.configHome},...n.client?.serverCommand==null?{}:{entryOverride:{serverCommand:n.client.serverCommand,serverArgs:n.client.serverArgs}}}),u=r["install-unit"]&&Y(d.entry)?await Aa({configHome:n.configHome??my(),unit:$a({command:[d.entry.command,...d.entry.args].join(" "),socketPath:o.socketPath})}):void 0,p=Da(d);return t(`${I({verdict:p.verdict,home:{path:l?.path??d.homePath,created:l?.created??!1,tightened:l?.tightened??!1,needed:i.needed,needed_by:i.declaredBy},socket:d.socketPath,...a==null?{}:{start_error:a},...u==null?{}:{unit:{path:u.path,status:u.status}},checks:p.rows.map(m=>({check:m.check,verdict:m.verdict,evidence:m.evidence})),fixes:p.findings.map(m=>({check:m.check,fix:m.fix}))})}
|
|
158
|
+
`),p.verdict==="ok"?0:1}var uy={"dry-run":{kind:"boolean"},"grace-ms":{kind:"value",coerce:e=>Number(e)}};async function py(e,n={}){let t=n.write??(s=>process.stdout.write(s)),{values:r}=ye(e,uy),o=await Na({...n.options??{},dryRun:r["dry-run"]===!0,...Number.isFinite(r["grace-ms"])?{graceMs:r["grace-ms"]}:{}});return t(`${I({roots:[...o.roots],scanned:o.scanned,reclaimed:o.reclaimed,dry_run:o.dryRun,entries:o.entries.map(s=>({dir:s.dir,verdict:s.verdict,reason:s.reason,removed:[...s.removed]}))})}
|
|
159
|
+
`),o.entries.some(s=>s.verdict==="failed")?1:0}function my(){let e=process.env.XDG_CONFIG_HOME?.trim();return e&&e!==""?e:Fa(ro(),".config")}function fy(e){let n=tr(e);return n.configText==null?{label:null}:{configText:n.configText,label:Ts(e)}}function gy(e){let n=ie();return{...n,socketPath:e.socket??n.socketPath,leasePath:e.lease??n.leasePath,eventLanePath:e.events??n.eventLanePath,sessionKeyHash:e["session-key-hash"]??n.sessionKeyHash,machineIdHash:e["machine-id-hash"]??n.machineIdHash,machineClaimPath:e["machine-claim"]??n.machineClaimPath}}var hy=process.argv[1]!=null&&import.meta.url===new URL(`file://${process.argv[1]}`).href;hy&&oy(process.argv.slice(2)).then(e=>{process.exitCode=e},e=>{process.stderr.write(`redskilled: ${e instanceof Error?e.message:String(e)}
|
|
160
|
+
`),process.exitCode=1});export{Ha as REDSKILLED_HOST_TOKEN_ENV,Zh as REDSKILLED_USAGE,ty as resolveRedskilledHostToken,ry as resolveServeQueueDiscovery,cy as runProvision,py as runReclaim,oy as runRedskilledCli,ay as runStatusline,iy as runStop,ly as runUnit};
|