@reddb-io/red-skills 3.1.0 → 3.1.2
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 +338 -338
- package/dist/code-nav.bundle.min.mjs +1 -1
- package/dist/dev.bundle.min.mjs +592 -590
- 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,64 +1,64 @@
|
|
|
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 Yl=Object.defineProperty;var Zl=(e,t)=>()=>(e&&(t=e(e=0)),t);var Xl=(e,t)=>{for(var n in t)Yl(e,n,{get:t[n],enumerable:!0})};var Bo={};Xl(Bo,{REDSKILLED_BIN_ENV:()=>Dn,REDSKILLED_BUNDLE_ASSET:()=>q,REDSKILLED_ENTRY_UNRESOLVED:()=>ze,RedskilledDaemonEntryError:()=>Qe,isRedskilledEntryPath:()=>$n,isResolvedRedskilledEntry:()=>G,redskilledBundleCacheRoot:()=>bt,redskilledServeArgv:()=>fe,requireRedskilledEntry:()=>_t,resolveRedskilledEntry:()=>ie});import{existsSync as Dd,readdirSync as Ld}from"node:fs";import{homedir as $d}from"node:os";import{basename as On,dirname as Pn,join as W,resolve as wt}from"node:path";function G(e){return"command"in e}function fe(e,t={}){let n=["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 t.idleMs!=null&&n.push("--idle-ms",String(t.idleMs)),t.daemonVersion!=null&&n.push("--daemon-version",t.daemonVersion),n}function bt(e=process.env){return Vo(e)}function ie(e={},t={}){if(e.serverCommand)return{command:e.serverCommand,args:e.serverArgs??[],source:"server-command"};let n=t.env??process.env,r=t.exists??Dd,o=t.execPath??process.execPath,s=t.execArgv??[],i=t.callerEntry===void 0?process.argv[1]:t.callerEntry,l=(u,f)=>({command:o,args:[...s,u],source:f,entry:u}),a=n[Dn];if(a)return{command:a,args:[],source:"env-redskilled-bin",entry:a};if(i&&$n(i))return l(wt(i),"caller-entry");let c=[];for(let[u,f]of Nd(i,t.rootDir,n,t.listDir??Cd))if(c.push(u),r(u))return l(u,f);return{diagnostic:ze,searched:c,...i?{callerEntry:wt(i)}:{}}}function _t(e={},t={}){let n=ie(e,t);if(G(n))return n;throw new Qe(n)}function $n(e){let t=On(e);return t===q||Ln.test(t)||t==="red-skills-redskilled"||t==="red-skills-redskilled.mjs"?!0:t!=="cli.js"&&t!=="cli.mjs"&&t!=="cli.ts"?!1:Td(wt(e))}function Td(e){let t=Pn(e);for(let n=0;n<4;n++){if(On(t)==="redskilled")return!0;let r=Pn(t);if(r===t)return!1;t=r}return!1}function*Nd(e,t,n,r){if(e){let s=Pn(wt(e));yield[W(s,q),"caller-sibling-bundle"];let i=Ad.exec(On(e));i&&(yield[W(s,`redskilled-${i[2]}.bundle.min.mjs`),"caller-sibling-bundle"]),yield[W(s,"..","dist",q),"caller-sibling-bundle"]}for(let s of Id){let i=n[s];i&&(yield[W(i,"dist",q),"plugin-root-bundle"],yield[W(i,"..","..","dist",q),"plugin-root-bundle"])}t&&(yield[W(t,"dist",q),"repo-bundle"],yield[W(t,"apps","redskilled","dist","cli.js"),"workspace-entry"],yield[W(t,"node_modules","@reddb-io","redskilled","dist","cli.js"),"node-modules-entry"]);let o=Vo(n);yield[W(o,q),"bundle-cache"];for(let s of Wd(o,r))yield[W(o,s),"bundle-cache"]}function Vo(e){if(e.RED_SKILLS_CACHE_DIR)return e.RED_SKILLS_CACHE_DIR;let t=e.XDG_CACHE_HOME||W(e.HOME||$d(),".cache");return W(t,"red-skills","bundles")}function Wd(e,t){return t(e).filter(n=>Ln.test(n)).sort((n,r)=>Md(Ho(r),Ho(n)))}function Ho(e){return Ln.exec(e)?.[1]??""}function Md(e,t){let n=s=>s.split(".").map(i=>Number.parseInt(i,10)),[r,o]=[n(e),n(t)];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(t):-1;if(Number.isNaN(l)||l===void 0)return 1;if(i!==l)return i-l}return 0}function Cd(e){try{return Ld(e)}catch{return[]}}var q,ze,Dn,Qe,Ad,Ln,Id,X=Zl(()=>{"use strict";q="redskilled.bundle.min.mjs",ze="redskilled-daemon-entry-unresolved",Dn="REDSKILLED_BIN";Qe=class extends Error{code=ze;searched;callerEntry;constructor(t){super(`${ze}: no published ${q} found to spawn the redskilled daemon from${t.callerEntry?` (caller entry: ${t.callerEntry}, which is NOT used as a fallback)`:""}
|
|
4
4
|
searched:
|
|
5
5
|
${t.searched.map(n=>` ${n}`).join(`
|
|
6
|
-
`)}`),this.name="RedskilledDaemonEntryError",this.searched=t.searched,t.callerEntry!=null&&(this.callerEntry=t.callerEntry)}};
|
|
7
|
-
`);return t.length>0&&t[t.length-1]===""&&t.pop(),t.map(n=>n.endsWith("\r")?n.slice(0,-1):n)}function V(e){return k(e,"invalid quoted string")}function
|
|
8
|
-
`;break;case"r":n+="\r";break;case"t":n+=" ";break;case"u":{let i=e.slice(r,r+4);if(!/^[0-9a-fA-F]{4}$/.test(i))throw V(t);let
|
|
9
|
-
`:t+="\\n";break;case"\r":t+="\\r";break;case" ":t+="\\t";break;default:n<" "?t+=`\\u${n.charCodeAt(0).toString(16).padStart(4,"0")}`:t+=n}return`${t}"`}function
|
|
10
|
-
`);for(let[i,
|
|
6
|
+
`)}`),this.name="RedskilledDaemonEntryError",this.searched=t.searched,t.callerEntry!=null&&(this.callerEntry=t.callerEntry)}};Ad=/^([a-z0-9-]+)-(.+)\.bundle\.min\.mjs$/,Ln=/^redskilled-(.+)\.bundle\.min\.mjs$/,Id=["RED_SKILLS_DEV_PLUGIN_ROOT","CLAUDE_PLUGIN_ROOT","CODEX_PLUGIN_ROOT","OPENCODE_PLUGIN_ROOT"]});import{execFileSync as gm}from"node:child_process";import{homedir as El}from"node:os";import{join as hm}from"node:path";var Be=class extends Error{constructor(t,n){super(t===0?n:`line ${t}: ${n}`),this.name="ToonError",this.line=t,this.reason=n}},de=class extends Error{constructor(t,n){super(t===0?n:`line ${t}: ${n}`),this.name="ToonlError",this.line=t,this.reason=n}};function k(e,t){return new Be(e,t)}function S(e,t){return new de(e,t)}function be(e){return e instanceof de?e:e instanceof Be?new de(e.line,e.reason):new de(0,String(e&&e.message?e.message:e))}var j=",";function gt(e){let t=e.split(`
|
|
7
|
+
`);return t.length>0&&t[t.length-1]===""&&t.pop(),t.map(n=>n.endsWith("\r")?n.slice(0,-1):n)}function V(e){return k(e,"invalid quoted string")}function B(e,t){if(e==="")return"";if(e.startsWith('"'))return Yr(e,t);if(e.includes('"'))throw V(t);return e==="true"?!0:e==="false"?!1:e==="null"?null:ea(e)?Number(e):e}function Z(e,t){let n=e.trim();if(n.startsWith('"'))return[Yr(n,t),!0];if(n.includes('"')||/\s/.test(n))throw k(t,"expected non-empty field name");return[n,!1]}function Yr(e,t){if(e[0]!=='"')throw V(t);let n="",r=1;for(;r<e.length;){let o=e[r];if(r+=1,o==='"'){if(e.slice(r).trim()==="")return n;throw V(t)}if(o==="\\"){let s=e[r];switch(r+=1,s){case'"':n+='"';break;case"\\":n+="\\";break;case"n":n+=`
|
|
8
|
+
`;break;case"r":n+="\r";break;case"t":n+=" ";break;case"u":{let i=e.slice(r,r+4);if(!/^[0-9a-fA-F]{4}$/.test(i))throw V(t);let l=Number.parseInt(i,16);if(l>=55296&&l<=57343)throw V(t);n+=String.fromCharCode(l),r+=4;break}default:throw V(t)}continue}if(o<" "&&o!==" ")throw V(t);n+=o}throw V(t)}function ce(e,t,n){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===t&&!s&&(r.push(e.slice(o,l).trim()),o=l+1)}if(s||i)throw V(n);return r.push(e.slice(o).trim()),r}function T(e,t,n){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===t&&!r)return s}if(r||o)throw V(n);return-1}function ea(e){return/^-?(?:0|[1-9][0-9]*)(?:\.[0-9]+)?(?:[eE][+-]?[0-9]+)?$/.test(e)}function ta(e){return/^-?[0-9]+(?:\.[0-9]+)?(?:[eE][+-]?[0-9]+)?$/.test(e)}function na(e){if(Object.is(e,-0))return"0";if(!Number.isFinite(e))throw k(0,"number is not representable in TOON");return String(e)}function Je(e){return e===null||typeof e=="boolean"||typeof e=="number"||typeof e=="string"}function J(e,t){if(e===null)return"null";if(typeof e=="boolean")return e?"true":"false";if(typeof e=="number")return na(e);if(typeof e=="string")return oa(e,t);throw k(0,"not a primitive")}function ra(e){return/^[A-Za-z_][A-Za-z0-9_.]*$/.test(e)}function C(e){return ra(e)?e:Zr(e)}function oa(e,t){return sa(e,t)?Zr(e):e}function sa(e,t){return e===""||e.trim()!==e||e==="true"||e==="false"||e==="null"||ta(e)||/[:"\\[\]{}]/.test(e)||/[\u0000-\u001f]/.test(e)||e.includes(t)||e.startsWith("-")}function Zr(e){let t='"';for(let n of e)switch(n){case'"':t+='\\"';break;case"\\":t+="\\\\";break;case`
|
|
9
|
+
`:t+="\\n";break;case"\r":t+="\\r";break;case" ":t+="\\t";break;default:n<" "?t+=`\\u${n.charCodeAt(0).toString(16).padStart(4,"0")}`:t+=n}return`${t}"`}function _e(e,t,n){Object.defineProperty(e,t,{value:n,writable:!0,enumerable:!0,configurable:!0})}var sn=2;function ia(e={}){return{indent:Math.max(1,e.indent??sn),strict:e.strict??!0,expandPaths:e.expandPaths==="safe"||e.expandPaths===!0}}function la(e,t){let n=[],r=!1;return gt(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 k(i,"invalid indentation");if(t.strict&&l%t.indent!==0)throw k(i,"invalid indentation");n.push({number:i,depth:Math.floor(l/t.indent),content:o.slice(l),blankBefore:r}),r=!1}),n}function K(e,t){let n=ia(t),r=la(e,n),o=r[0];if(o===void 0)return{};if(o.depth!==0)throw k(o.number,"invalid indentation");let s=r.length===1;if(s&&o.content.trim()==="[]")return[];if(o.content.startsWith("[")){let c;try{c=dn(o.content,T(o.content,":",o.number))}catch(u){if(n.strict)throw rn(u,o.number);c=void 0}if(c!==void 0)return ca(c,r,n)}if(s&&T(o.content,":",o.number)===-1)return B(o.content.trim(),o.number);let i={index:0},l=ln(r,i,0,n),a=r[i.index];if(a!==void 0)throw k(a.number,"expected end of document");return l}function ln(e,t,n,r){let o={};for(;t.index<e.length;){let s=e[t.index];if(s.depth<n)break;if(s.depth>n)throw k(s.number,"invalid indentation");let{key:i,quoted:l,value:a}=aa(e,t,n,r);to(o,i,l,a,r,s.number)}return o}function aa(e,t,n,r){let o=e[t.index],s=o.content,i=T(s,":",o.number);if(i===-1)throw k(o.number,"expected `key: value`");let l=s.slice(0,i),a=s.slice(i+1),c=T(l,"[",o.number),u=T(l,"{",o.number);if(u!==-1&&(c===-1||u<c)){let y;try{y=ma(l)}catch(b){if(r.strict)throw rn(b,o.number);t.index+=1;let _=Xt(e,t,n,a,o.number,r);return{key:l.trim(),quoted:!1,value:_}}if(a.trim()!=="")throw k(o.number,"expected keyed map rows");let w=da(y,e,t,n+1,r);return{key:y.key,quoted:y.keyQuoted,value:w}}if(c!==-1){let y;try{y=dn(l,i)}catch(b){if(r.strict)throw rn(b,o.number);t.index+=1;let _=Xt(e,t,n,a,o.number,r);return{key:l.trim(),quoted:!1,value:_}}if(y.key===""&&!y.keyQuoted)throw k(o.number,"expected non-empty field name");let w=an(y,a,e,t,n,r);return{key:y.key,quoted:y.keyQuoted,value:w}}let[f,p]=Z(l,o.number);if(f===""&&!p)throw k(o.number,"expected non-empty field name");t.index+=1;let h=Xt(e,t,n,a,o.number,r);return{key:f,quoted:p,value:h}}function Xt(e,t,n,r,o,s){let i=r.trim();if(i==="[]")return[];if(i!=="")return B(i,o);let l=e[t.index];return l!==void 0&&l.depth>n?ln(e,t,n+1,s):{}}function da(e,t,n,r,o){let s={};for(n.index+=1;n.index<t.length;){let i=t[n.index];if(i.depth<r)break;if(i.depth>r)throw k(i.number,"invalid indentation");if(i.blankBefore&&o.strict)throw k(i.number,"blank line inside keyed map");let l=T(i.content,":",i.number);if(l===-1)throw k(i.number,"expected `key: value`");let[a,c]=Z(i.content.slice(0,l),i.number);if(a===""&&!c)throw k(i.number,"expected non-empty field name");let u=ce(i.content.slice(l+1).trim(),e.delimiter,i.number);if(u.length!==e.fields.length)throw k(i.number,"keyed map row length mismatch");let f={};e.fields.forEach((p,h)=>{Ke(f,p,B(u[h],i.number),o,i.number)}),to(s,a,c,f,o,i.number),n.index+=1}return s}function ca(e,t,n){let r=t[0],o=T(r.content,":",r.number);if(o===-1)throw k(r.number,"expected `key: value`");let s=r.content.slice(o+1),i={index:0},l=an(e,s,t,i,0,n),a=t[i.index];if(a!==void 0)throw k(a.number,"expected end of document");return l}function an(e,t,n,r,o,s){let i=n[r.index].number,l=t.trim();if(r.index+=1,e.fields!==void 0){if(l!=="")throw k(i,"expected tabular rows");return ua(e,e.fields,n,r,o+1,s)}if(l!==""){let a=ce(l,e.delimiter,i).map(c=>B(c,i));if(a.length!==e.len)throw k(i,"array length mismatch");return a}return pa(e,n,r,o+1,s)}function ua(e,t,n,r,o,s){let i=[];for(;i.length<e.len;){let a=n[r.index];if(a===void 0)throw tn(n,r.index);if(a.depth<o)break;if(a.depth>o)throw k(a.number,"invalid indentation");if(a.blankBefore&&s.strict)throw k(a.number,"blank line inside array");if(!Xr(a.content,e.delimiter,a.number))break;let c=ce(a.content,e.delimiter,a.number);if(c.length!==t.length)throw k(a.number,"array row length mismatch");let u={};t.forEach((f,p)=>{Ke(u,f,B(c[p],a.number),s,a.number)}),i.push(u),r.index+=1}if(i.length!==e.len)throw tn(n,r.index);let l=n[r.index];if(l!==void 0&&l.depth>=o&&Xr(l.content,e.delimiter,l.number))throw k(l.number,"array length mismatch");return i}function Xr(e,t,n){let r=T(e,":",n);if(r===-1)return!0;let o=T(e,t,n);return o===-1?!1:o<r}function pa(e,t,n,r,o){let s=[];for(;s.length<e.len;){let l=t[n.index];if(l===void 0||l.depth<r)throw tn(t,n.index);if(l.depth>r)throw k(l.number,"invalid indentation");if(l.blankBefore&&o.strict)throw k(l.number,"blank line inside array");s.push(fa(t,n,r,o))}let i=t[n.index];if(i!==void 0&&i.depth>=r)throw k(i.number,"array length mismatch");return s}function fa(e,t,n,r){let o=e[t.index];if(!o.content.startsWith("-"))throw k(o.number,"expected array item");let s=o.content.slice(1).replace(/^\s+/,"");if(s==="")return t.index+=1,{};if(s.startsWith("[")){let i=T(s,":",o.number),l;try{l=dn(s,i)}catch{l=void 0}if(l!==void 0){let a=s.slice(i+1);return an(l,a,e,t,n,r)}}if(T(s,":",o.number)!==-1){let i=[{number:o.number,depth:n+1,content:s,blankBefore:!1}];for(t.index+=1;t.index<e.length;){let l=e[t.index];if(l.depth<=n)break;i.push(l),t.index+=1}return ln(i,{index:0},n+1,r)}return t.index+=1,B(s,o.number)}function tn(e,t){let n=e[t]??e[e.length-1];return k(n===void 0?1:n.number,"array length mismatch")}function dn(e,t){if(t===-1)throw k(0,"array header missing colon");let n=e.slice(0,t),r=T(n,"[",0);if(r===-1)throw k(0,"invalid array header");let o,s;try{[o,s]=Z(n.slice(0,r),0)}catch{throw k(0,"invalid array header")}let i=n.slice(r+1),l=i.indexOf("]");if(l===-1)throw k(0,"invalid array header");let a=i.slice(0,l),c=/^[0-9]*/.exec(a)[0];if(c===""||c.length>1&&c.startsWith("0"))throw k(0,"invalid array header");let u=Number.parseInt(c,10),f;switch(a.slice(c.length)){case"":f=",";break;case" ":f=" ";break;case"|":f="|";break;default:throw k(0,"invalid array header")}let p=i.slice(l+1),h;if(p==="")h=void 0;else if(p.startsWith("{")&&p.endsWith("}")&&p.length>=2)try{h=eo(p.slice(1,-1),f)}catch(y){throw k(0,y.reason==="duplicate key"?"duplicate key":"invalid array header")}else throw k(0,"invalid array header");return{key:o,keyQuoted:s,len:u,delimiter:f,fields:h}}function ma(e){let t=T(e,"{",0);if(t===-1||!e.endsWith("}"))throw k(0,"invalid keyed map header");let n,r;try{[n,r]=Z(e.slice(0,t),0)}catch{throw k(0,"invalid keyed map header")}if(n===""&&!r)throw k(0,"expected non-empty field name");let o;try{o=eo(e.slice(t+1,-1),j)}catch(s){throw k(0,s.reason==="duplicate key"?"duplicate key":"invalid keyed map header")}return{key:n,keyQuoted:r,delimiter:j,fields:o}}function eo(e,t){let n=[],r=0;function o(l,a){let c=0;for(;r<e.length&&!(a&&e[r]==="}");){if(e[r]===t||e[r]==="}")throw k(0,"invalid array header");let u=r;for(;r<e.length;){let p=e[r];if(p==='"'){s();continue}if(p===t||p==="{"||p==="}")break;r+=1}let[f]=Z(e.slice(u,r),0);if(f==="")throw k(0,"invalid array header");if(c+=1,e[r]==="{"){r+=1;let p=n.length;if(o([...l,f],!0),e[r]!=="}"||n.length===p)throw k(0,"invalid array header");r+=1}else n.push([...l,f]);if(e[r]===t){if(r+=1,r>=e.length||e[r]==="}")throw k(0,"invalid array header");continue}if(a?e[r]==="}":r===e.length)break;throw k(0,"invalid array header")}if(c===0)throw k(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 k(0,"invalid array header");let i=new Set;for(let l=0;l<n.length;l+=1)for(let a=l+1;a<n.length;a+=1)if(ga(n[l],n[a])||nn(n[l],n[a])||nn(n[a],n[l]))throw k(0,"duplicate key");for(let l of n){let a=l.join("\0");if(i.has(a))throw k(0,"duplicate key");i.add(a)}return n}function ga(e,t){return e.length===t.length&&nn(e,t)}function nn(e,t){return t.every((n,r)=>e[r]===n)}function rn(e,t){return k(t,e.reason??String(e.message))}function to(e,t,n,r,o,s){if(o.expandPaths&&!n&&t.includes(".")){let i=t.split(".");if(i.every(ha)){Ke(e,i,r,o,s);return}}Ke(e,[t],r,o,s)}function Ke(e,t,n,r,o){let s=t[0],i=Object.prototype.hasOwnProperty.call(e,s);if(t.length===1){if(i&&r.strict)throw k(o,"duplicate key");_e(e,s,n);return}if(i&&!ve(e[s])){if(r.strict)throw k(o,"path expansion conflict");_e(e,s,{})}else i||_e(e,s,{});Ke(e[s],t.slice(1),n,r,o)}function ha(e){return/^[A-Za-z_][A-Za-z0-9_]*$/.test(e)}function ve(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function I(e,t={}){let n={nestedTabularHeaders:t.nestedTabularHeaders===!0,keyedMapCollapse:t.keyedMapCollapse===!0},r=[];return Array.isArray(e)?cn(r,void 0,e,0,!1,n):ve(e)?no(r,e,0,n):r.push(J(e,j)),r.join("")}function qe(e,t){e.push(" ".repeat(t*sn))}function no(e,t,n,r){for(let[o,s]of Object.entries(t))qe(e,n),on(e,o,s,n,r)}function on(e,t,n,r,o){if(Array.isArray(n)){cn(e,t,n,r,!1,o);return}if(ve(n)){let s=o.keyedMapCollapse?ka(n,o):void 0;if(s!==void 0){e.push(C(t),"{",s.fields.map(un).join(j),`}:
|
|
10
|
+
`);for(let[i,l]of Object.entries(n))qe(e,r+1),e.push(C(i),": ",s.paths.map(a=>J(io(l,a),j)).join(j),`
|
|
11
11
|
`);return}e.push(C(t),`:
|
|
12
|
-
`),
|
|
13
|
-
`)}function
|
|
12
|
+
`),no(e,n,r+1,o);return}e.push(C(t),": ",J(n,j),`
|
|
13
|
+
`)}function cn(e,t,n,r,o,s){if(n.length===0){t!==void 0?e.push(C(t),`: []
|
|
14
14
|
`):o?e.push(`[0]:
|
|
15
15
|
`):e.push(`[]
|
|
16
|
-
`);return}if(n.every(
|
|
17
|
-
`);return}let i=o?void 0:
|
|
18
|
-
`);for(let
|
|
19
|
-
`);return}
|
|
20
|
-
`);for(let
|
|
21
|
-
`);return}e.push("- "),
|
|
22
|
-
`)}function
|
|
23
|
-
`}function
|
|
24
|
-
`}function
|
|
25
|
-
`,y=()=>
|
|
26
|
-
`;return
|
|
27
|
-
`},end(){return f?"":(f=!0,h())}}}function
|
|
28
|
-
`),
|
|
29
|
-
`)),e.positional&&e.positional.length>0){t.push(
|
|
30
|
-
`));for(let r of e.positional)if(r.description){let o=r.variadic?`${r.name}...`:r.name;t.push(
|
|
31
|
-
`),
|
|
32
|
-
`))}t.push(
|
|
33
|
-
`))}if(e.options&&Object.keys(e.options).length>0){t.push(
|
|
34
|
-
`));let r=
|
|
35
|
-
`))}return n}function
|
|
36
|
-
`)){let o=r.replace(/\r$/,""),s=o.trim();if(!s||s.startsWith("#"))continue;let i=o.indexOf(":");if(i<0)continue;let
|
|
37
|
-
`||e[t]==="\r";)t+=1;let n=e.slice(t);if(n==="")return null;let r=
|
|
16
|
+
`);return}if(n.every(Je)){en(e,t,n.length,void 0),e.push(" "),e.push(n.map(l=>J(l,j)).join(j)),e.push(`
|
|
17
|
+
`);return}let i=o?void 0:ro(n,s);if(i!==void 0){en(e,t,n.length,i.fields),e.push(`
|
|
18
|
+
`);for(let l of n)qe(e,r+1),e.push(i.paths.map(a=>J(io(l,a),j)).join(j)),e.push(`
|
|
19
|
+
`);return}en(e,t,n.length,void 0),e.push(`
|
|
20
|
+
`);for(let l of n)qe(e,r+1),ya(e,l,r+1,s)}function ya(e,t,n,r){if(Array.isArray(t)){e.push("- "),cn(e,void 0,t,n,!0,r);return}if(ve(t)){let o=Object.entries(t);if(o.length===0){e.push(`-
|
|
21
|
+
`);return}e.push("- "),on(e,o[0][0],o[0][1],n+1,r);for(let[s,i]of o.slice(1))qe(e,n+1),on(e,s,i,n+1,r);return}e.push("- ",J(t,j),`
|
|
22
|
+
`)}function en(e,t,n,r){t!==void 0&&e.push(C(t)),e.push("[",String(n),"]"),r!==void 0&&e.push("{",r.map(un).join(j),"}"),e.push(":")}function ro(e,t){let n=oo(e.map(r=>({value:r})),t);return n===void 0?void 0:{fields:n,paths:so(n)}}function ka(e,t){let n=Object.values(e);if(!(n.length<2))return ro(n,t)}function oo(e,t){let n=e[0]?.value;if(!ve(n))return;let r=Object.keys(n).map(o=>({key:o}));if(r.length!==0){for(let{value:o}of e)if(!ve(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})=>Je(l)))continue;if(!t.nestedTabularHeaders)return;let i=oo(s,t);if(i===void 0)return;o.children=i}return r}}function so(e,t=[]){return e.flatMap(n=>{let r=[...t,n.key];return n.children===void 0?[r]:so(n.children,r)})}function io(e,t){let n=e;for(let r of t)n=n[r];return n}function un(e){return e.children===void 0?C(e.key):`${C(e.key)}{${e.children.map(un).join(j)}}`}var go=[j,"|"," "];var ho=8,yo=/^[A-Za-z0-9_-]+$/,Gm=new TextEncoder,zm=new TextDecoder;function wa(e,t){if(!(e.startsWith("[=")&&e.endsWith("]")))return null;let n=e.slice(2,-1);if(!/^[0-9]+$/.test(n))throw S(t,"invalid trailer count");return Number.parseInt(n,10)}function ko(e,t){if(!yo.test(e))throw S(t,"invalid tag")}function ba(e,t){let n=e.indexOf(":");if(n<=0)return null;let r=e.slice(0,n);if(!yo.test(r)){if(/^[A-Za-z0-9_-]/.test(r)&&/^[^,[\]|{}:\t ]+$/.test(r))throw S(t,"invalid tag");return null}return{tag:r,cellsText:e.slice(n+1)}}function _a(e,t){if(!e.startsWith("["))return null;let n=e.slice(1),r=n.indexOf("]");if(r===-1)throw S(t,"invalid header");let o=n.slice(0,r),s=o.startsWith("~"),i=s?o.slice(1):o;if(!s&&i.startsWith("="))return null;if(!go.includes(i)&&i!=="")throw S(t,"invalid header delimiter");let l=i===""?j:i,a=n.slice(r+1),c=null;if(!s&&a.startsWith("<")){let p=a.indexOf(">");if(p===-1)throw S(t,"invalid tag");if(c=a.slice(1,p),ko(c,t),i!=="")throw S(t,"invalid header delimiter");a=a.slice(p+1)}if(!a.startsWith("{")||!a.endsWith("}:"))throw S(t,"invalid header");let u=a.slice(1,-2),f;try{f=ce(u,l,t).map(p=>Z(p,t)[0])}catch(p){throw be(p)}if(f.length===0||f.some(p=>p===""))throw S(t,"invalid header fields");return{delimiter:l,fields:f,fieldText:u,continuation:s,tag:c}}function va(e,t,n){if(e===null||e.delimiter===void 0)throw S(n,"continuation header before header");if(e.delimiter!==t.delimiter||e.fieldText!==t.fieldText)throw S(n,"continuation header mismatch")}function lo(e,t,n,r){let o;try{o=ce(e,t,r)}catch(s){throw be(s)}if(o.length!==n)throw S(r,"row arity mismatch");for(let s of o)try{B(s,r)}catch(i){throw be(i)}return o}function Sa(e,t,n){let r={};return e.forEach((o,s)=>{try{_e(r,o,B(t[s],n))}catch(i){throw be(i)}}),r}function xa(e,t,n){if(e.startsWith("- "))throw S(t,"reserved line prefix");let r=wa(e,t);if(r!==null){if(n===null||n.delimiter===void 0)throw S(t,"trailer without header");if(n.rowCount!==r)throw S(t,"trailer count mismatch");return{kind:"trailer"}}let o=_a(e,t);if(o!==null)return o.continuation?(va(n,o,t),{kind:"continuation"}):o.tag!==null?{kind:"tag-header",header:o}:{kind:"header",header:o};let s=ba(e,t);if(s!==null){let i=n?.taggedLanes?.get(s.tag);if(i===void 0)throw S(t,"unknown tag");return{kind:"tagged-row",tag:s.tag,cells:lo(s.cellsText,i.delimiter,i.fields.length,t)}}if(n===null||n.delimiter===void 0)throw S(t,"row before header");return{kind:"row",cells:lo(e,n.delimiter,n.fields.length,t)}}function Ea(e,t={}){let n=[],r=new Map,o=[],s=[],i=null,l=!1,a=!1;function c(h,y){let w=s.at(-1);if(w!==void 0&&w.lane===h.lane&&w.delimiter===h.delimiter&&w.fieldText===h.fieldText){w.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 f(h,y,w){let b=r.get(h);if(b===void 0){if(r.size>=ho)throw S(w,"too many tagged lanes");b={segments:[],current:null},r.set(h,b),n.push(h)}else b.current!==null&&b.segments.push(b.current);b.current={lane:h,delimiter:y.delimiter,fields:y.fields,fieldText:y.fieldText,rows:[]},b.delimiter=y.delimiter,b.fields=y.fields,b.fieldText=y.fieldText}if(gt(e).forEach((h,y)=>{let w=y+1;if(h==="")return;let b=i===null?{taggedLanes:r}:{delimiter:i.delimiter,fields:i.fields,fieldText:i.fieldText,rowCount:i.rows.length,taggedLanes:r},_=xa(h,w,b);if(_.kind==="trailer"){u(),i=null;return}if(_.kind!=="continuation"){if(_.kind==="tag-header"){a=!0,f(_.header.tag,_.header,w);return}if(_.kind==="header"){u(),l||(n.push(null),l=!0),i={lane:null,delimiter:_.header.delimiter,fields:_.header.fields,fieldText:_.header.fieldText,rows:[]};return}if(_.kind==="tagged-row"){a=!0;let O=r.get(_.tag).current;O.rows.push(_.cells),c(O,_.cells);return}if(i===null)throw S(w,"row before header");i.rows.push(_.cells),c(i,_.cells)}}),!a)return u(),t.preserveInterleaving===!0,o;let p=[];u();for(let h of n){if(h===null){p.push(...o);continue}let y=r.get(h);p.push(...y.segments),y.current!==null&&p.push(y.current)}return t.preserveInterleaving===!0?s:p}function fn(e){return Ea(e).flatMap(t=>t.rows.map(n=>Sa(t.fields,n,0)))}function ja(e){if(!go.includes(e))throw S(0,"invalid header delimiter")}function ao(e,t,n=!1){return`[${`${n?"~":""}${e===j?"":e}`}]{${t}}:
|
|
23
|
+
`}function co(e,t){return`[]<${e}>{${t}}:
|
|
24
|
+
`}function pn(e,t){return t.map(C).join(e)}function Pa(e){if(!Array.isArray(e)||e.length===0)throw S(0,"TOONL header requires fields");return e.map(t=>{let n;try{[n]=Z(String(t),0)}catch(r){throw be(r)}if(n==="")throw S(0,"TOONL header requires fields");return n})}function uo(e,t){return e!==null&&e.length===t.length&&e.every((n,r)=>n===t[r])}function po(e){if(e!==void 0&&(!Number.isInteger(e)||e<=0))throw S(0,"TOONL continuation cadence must be positive")}function Oa(e,t,n){return e.continuationEveryRows!==void 0&&t>=e.continuationEveryRows||e.continuationEveryBytes!==void 0&&n>=e.continuationEveryBytes}function fo(e){if(e===null||typeof e!="object"||Array.isArray(e))throw S(0,"TOONL output requires object rows");let t=Object.keys(e);if(t.length===0)throw S(0,"TOONL output requires object rows");if(t.some(n=>!Je(e[n])))throw S(0,"TOONL rows must be flat objects");return t}function Da(e){return JSON.stringify([...e].sort())}function mo(e,t){let n=Da(e),r=t.get(n);return r!==void 0?r:(t.set(n,e),e)}function mn({delimiter:e=j,trailer:t=!0,continuationEveryRows:n,continuationEveryBytes:r}={}){ja(e),po(n),po(r);let o=null,s="",i=new Map,l=0,a=0,c=0,u=new Map,f=!1,p={continuationEveryRows:n,continuationEveryBytes:r},h=()=>o===null||!t?"":`[=${l}]
|
|
25
|
+
`,y=()=>Oa(p,a,c)?(a=0,c=0,ao(e,s,!0)):"",w=b=>{ko(b,0);let _=u.get(b);if(_===void 0){if(u.size>=ho)throw S(0,"too many tagged lanes");_={fields:null,fieldsByShape:new Map},u.set(b,_)}return _};return{push(b){if(f)throw S(0,"TOONL encoder is closed");let _=mo(fo(b),i),O="";(o===null||o.length!==_.length||o.some((ae,he)=>ae!==_[he]))&&(O+=h(),o=_,s=pn(e,o),l=0,a=0,c=0,O+=ao(e,s));let F=o.map(ae=>J(b[ae],e));O+=y();let M=`${F.join(e)}
|
|
26
|
+
`;return O+=M,l+=1,a+=1,c+=M.length,O},declareLane(b,_){if(f)throw S(0,"TOONL encoder is closed");let O=Pa(_),F=pn(j,O),M=w(b);return uo(M.fields,O)?"":(M.fields=O,co(b,F))},pushTagged(b,_){if(f)throw S(0,"TOONL encoder is closed");let O=w(b),F=mo(fo(_),O.fieldsByShape),M=pn(j,F),ae=F.map(st=>J(_[st],j)),he="";return uo(O.fields,F)||(O.fields=F,he+=co(b,M)),`${he}${b}:${ae.join(j)}
|
|
27
|
+
`},end(){return f?"":(f=!0,h())}}}function gn(e){let t={app:e,version:La(Se("__RED_BUILD_VERSION__",()=>"3.1.2")??"0.0.0-dev"),gitSha:Se("__RED_BUILD_GIT_SHA__",()=>"f2c351a37c544900447dd6b5775fe0a0fb63f4b7")??"unknown",buildTime:Se("__RED_BUILD_TIME__",()=>"2026-08-01T08:18:40Z")??"unknown",bundleAsset:Se("__RED_BUNDLE_ASSET__",()=>"redskilled.bundle.min.mjs")??"unknown"},n=Se("__REDDB_SDK_VERSION__",()=>""),r=Se("__REDDB_BINARY_TAG__",()=>"");return n&&(t.reddbSdkVersion=n),r&&(t.reddbBinaryTag=r),t}function La(e){return e.startsWith("v")?e.slice(1):e}function Ro(e){return`${e.app} ${e.version} ${e.gitSha}`}function Se(e,t){try{let n=t();return typeof n=="string"&&n.length>0?n:void 0}catch{return process.env[e.replace(/^__|__$/g,"")]}}var wo={"=":"data",":=":{to:"data",typed:!0},":":"meta"},$a=/^[a-z][a-z0-9+.-]*:\/\//i;function Aa(e,t){return typeof t=="string"?{separator:e,to:t,typed:!1,prefix:!1}:{separator:e,to:t.to,typed:t.typed??!1,prefix:t.prefix??!1}}function Ia(e=wo){return Object.entries(e).map(([t,n])=>Aa(t,n)).sort((t,n)=>n.separator.length-t.separator.length)}function Ta(e){return/^-\d+(\.\d+)?$/.test(e)}function Ge(e){return!(!e||e.startsWith("-")&&!Ta(e))}function ht(e){if(e==="true")return!0;if(e==="false")return!1;if(e==="null")return null;let t=Number(e);return!Number.isNaN(t)&&Number.isFinite(t)&&e.trim()!==""?t:e}function bo(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 t=Number(e);return!Number.isNaN(t)&&Number.isFinite(t)&&e.trim()!==""?t:e.includes(",")?e.split(",").map(n=>bo(n.trim())):e}function ue(e,t){switch(t){case"boolean":return Na(e);case"number":return Wa(e);case"array":return e.split(",").map(n=>ht(n.trim()));case"string":default:return e}}function Na(e){let t=e.toLowerCase().trim();return t==="true"||t==="yes"||t==="1"||t==="on"}function Wa(e){if(e.trim()==="")throw new TypeError(`Cannot convert "${e}" to number`);let t=Number(e);if(Number.isNaN(t))throw new TypeError(`Cannot convert "${e}" to number`);return t}function se(e){return e.startsWith('"')&&e.endsWith('"')||e.startsWith("'")&&e.endsWith("'")?e.slice(1,-1):e}function Ma(e,t={}){return e.map(n=>{let r=t[n.type];return r?r(n.value):n.value}).join("")}function E(e,t){return{type:e,value:t}}function Ca(e){let t=[],n=Fa(e);if(t.push(E("section-header","Usage:"),E("text"," "),E("usage-text",n),E("newline",`
|
|
28
|
+
`),E("newline",`
|
|
29
|
+
`)),e.positional&&e.positional.length>0){t.push(E("section-header","Arguments:"),E("newline",`
|
|
30
|
+
`));for(let r of e.positional)if(r.description){let o=r.variadic?`${r.name}...`:r.name;t.push(E("indent"," "),E("positional-name",`<${o}>`)),r.required||t.push(E("positional-optional"," (optional)")),t.push(E("newline",`
|
|
31
|
+
`),E("indent"," "),E("option-description",r.description),E("newline",`
|
|
32
|
+
`))}t.push(E("newline",`
|
|
33
|
+
`))}if(e.options&&Object.keys(e.options).length>0){t.push(E("section-header","Options:"),E("newline",`
|
|
34
|
+
`));let r=Ha(e.options);t.push(...r)}return t}function Ua(e,t){let n=Ca(e);return Ma(n,t)}function Fa(e){let t=["[options]"];if(e.positional)for(let n of e.positional)n.variadic?t.push(n.required?`<${n.name}...>`:`[${n.name}...]`):t.push(n.required?`<${n.name}>`:`[${n.name}]`);return t.join(" ")}function Ha(e,t=!1){let n=[],r=[],o=t?"global-option-flag":"option-flag",s=t?"global-option-type":"option-type",i=t?"global-option-default":"option-default",l=t?"global-option-description":"option-description";for(let[c,u]of Object.entries(e)){if(u.hidden)continue;let f=[],p=w=>{f.includes(w)||f.push(w)};u.short&&p(`-${u.short}`),p(`--${c}`);for(let w of u.aliases??[])w.length===1?p(`-${w}`):p(`--${w}`);let h=f.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(c=>c.flags.length+(c.type?c.type.length+1:0)),20);for(let c of r){let u=c.flags.length+(c.type?c.type.length+1:0),f=" ".repeat(a-u+2);n.push(E("indent"," ")),n.push(E(o,c.flags)),c.type&&(n.push(E("text"," ")),n.push(E(s,c.type))),n.push(E("text",f)),n.push(E(l,c.desc)),c.default!==void 0&&(n.push(E("text"," ")),n.push(E(i,`(default: ${c.default})`))),n.push(E("newline",`
|
|
35
|
+
`))}return n}function _o(e){let t=za(e.options??{},e.autoShort??!1),n=Ia(e.separators??wo);return{schema:e,parse(r){return Va(r,e,t,n)},help(){return Ua(e,e.formatter)}}}function Va(e,t,n,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=t.positional??[],a=0,c=!1;for(;a<e.length;){let u=e[a];if(t.stopEarly&&i>0){o.rest=e.slice(a);break}if(u==="--"&&!c){c=!0,a++;continue}if(c){if(i<l.length){let p=l[i];if(p.variadic){let h=[];for(;a<e.length;){let y=e[a];h.push(p.type?ue(y,p.type):y),a++}o.positional[p.name]=h,i++}else{let h=p.type?ue(u,p.type):u;o.positional[p.name]=h,i++,a++}}else t.allowUnknown!==!1&&(o.rest=o.rest??[],o.rest.push(u)),a++;continue}if(u.startsWith("--")){a=qa(u,a,e,o,n,t);continue}if(u.startsWith("-")&&u.length>1&&!ed(u)){a=Ga(u,a,e,o,n,t);continue}let f=Ba(u,r);if(f){let{key:p,value:h,config:y}=f,w=o,b=w[y.to]??(w[y.to]={});b[p]=y.typed?bo(h):se(h),a++;continue}if(i<l.length){let p=l[i];if(p.variadic){let y=[];for(;a<e.length&&!e[a].startsWith("-");){let w=e[a];y.push(p.type?ue(w,p.type):w),a++}o.positional[p.name]=y,i++;continue}let h=p.type?ue(u,p.type):u;o.positional[p.name]=h,i++}else t.allowUnknown!==!1?o.rest.push(u):o.errors.push(`Unexpected positional argument: ${u}`);a++}return Ya(o,t,n),Za(o,t,l),Xa(o,t,n),o}function Ba(e,t){if($a.test(e))return null;for(let n of t){if(n.prefix&&e.startsWith(n.separator)){let o=e.slice(n.separator.length),s=o.indexOf(":");if(s>0){let i=o.slice(0,s),l=o.slice(s+1);if(Ja(i))return{key:i,value:l,config:n}}continue}let r=e.indexOf(n.separator);if(r>0){let o=e.slice(0,r),s=e.slice(r+n.separator.length);if(Ka(o,s,n))return{key:o,value:s,config:n}}}return null}function Ja(e){return e?/^[a-zA-Z_][a-zA-Z0-9_-]*$/.test(e):!1}function Ka(e,t,n){return e?n.separator===":"?e.includes("/")||e.includes(".")||/^\d+$/.test(t)?!1:/^[A-Z][a-zA-Z0-9-]*$/.test(e):!((n.separator==="="||n.separator===":=")&&e.includes("/")):!1}function qa(e,t,n,r,o,s){let i=e.slice(2);if(i.startsWith("no-")){let a=i.slice(3),c=o.get(a);if(c?.negatable!==!1&&c?.type==="boolean")return r.options[c.name]=!1,t+1}if(i.includes("=")){let a=i.indexOf("="),c=i.slice(0,a),u=i.slice(a+1);return yt(c,u,t+1,r,o,s)}let l=o.get(i);if(l){if(l.type!=="boolean"){let a=n[t+1];return Ge(a)?yt(l.name,a,t+2,r,o,s):(r.errors.push(`Option --${i} requires a value`),t+1)}return r.options[l.name]=!0,t+1}return s.strict?r.errors.push(`Unknown option: --${i}`):s.allowUnknown!==!1&&(r.options[i]=!0),t+1}function Ga(e,t,n,r,o,s){let i=e.slice(1);if(i.includes("=")){let l=i.indexOf("="),a=i.slice(0,l),c=i.slice(l+1),u=hn(a,o);return u?yt(u.name,c,t+1,r,o,s):(s.strict?r.errors.push(`Unknown option: -${a}`):s.allowUnknown!==!1&&(r.options[a]=ht(se(c))),t+1)}if(i.length===1){let l=hn(i,o);if(l){if(l.type!=="boolean"){let a=n[t+1];return Ge(a)?yt(l.name,a,t+2,r,o,s):(r.errors.push(`Option -${i} requires a value`),t+1)}return r.options[l.name]=!0,t+1}if(s.strict)r.errors.push(`Unknown option: -${i}`);else if(s.allowUnknown!==!1){let a=n[t+1];if(Ge(a))return r.options[i]=ht(se(a)),t+2;r.options[i]=!0}return t+1}for(let l of i){let a=hn(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 t+1}function yt(e,t,n,r,o,s){let i=o.get(e);if(i){if(i.choices){let a=i.type?ue(se(t),i.type):se(t);if(!i.choices.includes(a))return r.errors.push(`Invalid value for '${e}': '${t}'. Allowed: ${i.choices.join(", ")}`),n}let l=i.type?ue(se(t),i.type):se(t);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]=ht(se(t)));return n}function za(e,t=!1){let n=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??"";t&&!l&&(l=Qa(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};n.set(s,a);for(let c of a.aliases)n.set(c,a)}return n}function Qa(e,t){for(let n of e){if(!/[a-zA-Z]/.test(n))continue;let r=n.toLowerCase();if(!t.has(r))return r;let o=n.toUpperCase();if(!t.has(o))return o}return""}function hn(e,t){for(let n of t.values())if(n.short===e||n.aliases.includes(e))return n}function Ya(e,t,n){for(let r of n.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?ue(o,r.type):o}else r.default!==void 0&&(e.options[r.name]=r.default);for(let r of t.positional??[])e.positional[r.name]===void 0&&r.default!==void 0&&(e.positional[r.name]=r.default)}function Za(e,t,n){if(t.options)for(let[r,o]of Object.entries(t.options))o.required&&e.options[r]===void 0&&e.errors.push(`Missing required option: --${r}`);for(let r of n)r.required&&e.positional[r.name]===void 0&&e.errors.push(`Missing required argument: <${r.name}>`)}function Xa(e,t,n){for(let r of n.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 t.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 ed(e){return/^-\d+(\.\d+)?$/.test(e)}var yn=class extends Error{flag;known;constructor(t,n){super(`unknown flag '${t}'; expected one of: ${n.join(", ")}`),this.name="UnknownFlagError",this.flag=t,this.known=n}};function td(e){let t={};for(let[n,r]of Object.entries(e))t[n]={type:r.kind==="boolean"?"boolean":"string",...n.length===1?{short:n}:{},...r.aliases===void 0?{}:{aliases:r.aliases}};return t}function nd(e,t){let n=new Map;for(let[o,s]of Object.entries(t))if(!(s.kind!=="value"||s.type!=="array")){n.set(o,o);for(let i of s.aliases??[])n.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=n.get(i[1]);if(l===void 0)continue;let a=i[2];if(a===void 0&&Ge(e[o+1])&&(a=e[o+1],o+=1),a===void 0)continue;let c=r.get(l)??[];c.push(a),r.set(l,c)}return r}function pe(e,t,n={}){let o=_o({options:td(t),separators:{},allowUnknown:!0}).parse([...e]),s={},i=nd(e,t),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(n.unknownFlags==="error"){let a=new Set(Object.keys(t));for(let c of Object.keys(o.options))if(!a.has(c))throw new yn(c.length===1?`-${c}`:`--${c}`,Object.keys(t).map(u=>u.length===1?`-${u}`:`--${u}`))}for(let[a,c]of Object.entries(t)){let u=o.options[a];u!==void 0&&(c.kind==="boolean"?s[a]=u:c.type==="array"?s[a]=(i.get(a)??[]).map(f=>c.coerce(f)):s[a]=c.coerce(String(u)))}return{values:s,positionals:o.rest}}var kn=class extends Error{token;known;constructor(t,n){super(`unknown command '${t}'; expected one of: ${n.join(", ")}`),this.name="UnknownCommandError",this.token=t,this.known=n}};function vo(e,t){let[n,...r]=e;if(n!==void 0){for(let[s,i]of Object.entries(t.commands))if(n===s||(i.aliases??[]).includes(n))return{command:s,args:r};if(t.errorOnUnknownCommand&&!n.startsWith("-"))throw new kn(n,Object.keys(t.commands))}let o=t.keepArgvOnDefault??!0;return{command:t.default,args:o?[...e]:r}}import{execFileSync as hd}from"node:child_process";import{readFileSync as yd}from"node:fs";import{dirname as Do,join as kd}from"node:path";import{existsSync as rd,readFileSync as Eg}from"node:fs";import{dirname as od,join as sd}from"node:path";function So(e,t){let n=e;for(let r=0;r<16;r++){let o=sd(n,t);if(rd(o))return o;let s=od(n);if(s===n)break;n=s}return null}function id(e){let t=e.indexOf(" #");return(t>=0?e.slice(0,t):e).trim()}function xe(e,t){let n=[];for(let r of e.split(`
|
|
36
|
+
`)){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 c=o.slice(i+1).trim();for(;n.length&&n[n.length-1].indent>=l;)n.pop();if(n.push({indent:l,key:a}),c&&n.map(f=>f.key).join(".")===t)return id(c)}}import{createHash as ld}from"node:crypto";var ad="project.name";function Eo(e){let t=xe(e,ad)?.trim();return t===void 0||t===""?void 0:t}var dd=8,jo="project";function Po(e){let t=md(e.gitCommonDir),n=(e.declaredName??"").trim(),r=n!==""?{name:n,source:"declared"}:cd(e.remoteUrl)??{name:ud(e.checkoutPath,t),source:"basename"},o=fd(t??Rn(e.checkoutPath));return{name:r.name,slug:`${pd(r.name)}-${o}`,hash:o,source:r.source}}function Oo(e){let t=(e??"").trim();if(t==="")return;let n=t.replace(/^[a-zA-Z][a-zA-Z0-9+.-]*:\/\//,""),r=/^[^/]*?:(?!\d)(.+)$/.exec(n),s=(r?r[1]:n.replace(/^[^/]*/,"")).replace(/\.git$/,"").split("/").map(i=>i.trim()).filter(i=>i!=="");if(s.length!==0)return s.slice(-2).join("/")}function cd(e){let t=Oo(e);return t===void 0?void 0:{name:t,source:"remote"}}function ud(e,t){let n=t===void 0?"":xo(gd(t));if(n!=="")return n;let r=xo(Rn(e));return r===""?jo:r}function pd(e){let n=e.split("/").map(r=>r.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")).filter(r=>r!=="").join("--");return n===""?jo:n}function fd(e){return ld("sha256").update(e).digest("hex").slice(0,dd)}function md(e){let t=Rn(e??"");return t===""?void 0:t}function Rn(e){let t=e.trim().replace(/\\/g,"/");return t.length>1?t.replace(/\/+$/,""):t}function xo(e){let t=e.split("/").filter(n=>n!=="");return t[t.length-1]??""}function gd(e){return e.split("/").filter(n=>n!=="").slice(0,-1).join("/")}var Rd=2e3;function Lo(e){return wd(e).name}function wd(e){let t=bn(e),n=wn(e,["rev-parse","--absolute-git-dir"])??wn(e,["rev-parse","--git-common-dir"]),r=wn(e,["remote","get-url","origin"]);return Po({checkoutPath:t.root??e,...n!==void 0?{gitCommonDir:n}:{},...r!==void 0?{remoteUrl:r}:{},...t.name!==void 0?{declaredName:t.name}:{}})}function bn(e){let t=So(e,kd(".red","config.yaml"));if(t==null)return{};let n;try{n=yd(t,"utf8")}catch{return{}}let r=Eo(n),o=Do(Do(t));return{...r===void 0?{}:{name:r},configText:n,root:o}}function wn(e,t){try{let n=hd("git",[...t],{cwd:e,encoding:"utf8",stdio:["ignore","pipe","ignore"],timeout:Rd}).trim();return n===""?void 0:n}catch{return}}import{randomUUID as Zi}from"node:crypto";import{spawn as vf}from"node:child_process";import{mkdir as Sf,rm as xf}from"node:fs/promises";import{dirname as Ef}from"node:path";import{createHash as vd}from"node:crypto";import{constants as En}from"node:fs";import{mkdir as Sd,open as xd}from"node:fs/promises";import{createConnection as Ed}from"node:net";import{tmpdir as jd}from"node:os";import{dirname as Pd,join as jn}from"node:path";var bd="toon";function Io(e){return e.trimStart().startsWith("{")?"json":"toon"}function vn(e){let t=0;for(;e[t]===`
|
|
37
|
+
`||e[t]==="\r";)t+=1;let n=e.slice(t);if(n==="")return null;let r=Io(n);if(r==="json"){let s=n.indexOf(`
|
|
38
38
|
`);return s<0?null:{frame:n.slice(0,s),dialect:r,rest:n.slice(s+1)}}let o=n.indexOf(`
|
|
39
39
|
|
|
40
|
-
`);return o<0?null:{frame:n.slice(0,o+1),dialect:r,rest:n.slice(o+2)}}function
|
|
40
|
+
`);return o<0?null:{frame:n.slice(0,o+1),dialect:r,rest:n.slice(o+2)}}function Sn(e){let t=Io(e)==="json"?_n:$o,n=t===_n?$o:_n;try{return t(e)}catch(r){try{return n(e)}catch{throw r}}}function _n(e){return JSON.parse(e)}function $o(e){return K(e)}function xn(e,t){if(t==="toon"){let n=_d(e);if(n!==null)return n.endsWith(`
|
|
41
41
|
`)?`${n}
|
|
42
42
|
`:`${n}
|
|
43
43
|
|
|
44
44
|
`}return`${JSON.stringify(e)}
|
|
45
|
-
`}function Yl(e){try{let t=JSON.stringify(e);if(t===void 0)return null;let n=A(JSON.parse(t));return n.trim()===""?null:n}catch{return null}}function _o(e,t){return!wo(e)||!wo(t)||t.ok!==!1?!1:typeof e.id=="string"&&typeof t.id=="string"&&t.id!==e.id}function wo(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}var vo=new Set;function xo(e){return vo.has(e)?"json":Ql}function So(e){vo.add(e)}var od=108;async function ft(e,t,n="resident server"){let r=e.wire,o=r??xo(e.socketPath),s=await Eo(e,t,n,o);return r||o==="json"||!_o(t,s)?s:(So(e.socketPath),await Eo(e,t,n,"json"))}async function Eo(e,t,n,r){let o=e.timeoutMs??1e3;return await new Promise((s,i)=>{let a=td(e.socketPath),l=!1,d="",u=setTimeout(()=>{f(()=>i(new Error(`${n} timed out`))),a.destroy()},o);function f(p){l||(l=!0,clearTimeout(u),p())}a.on("connect",()=>{a.write(yn(t,r))}),a.on("data",p=>{d+=p.toString("utf8");let h=gn(d);h&&(d=h.rest,f(()=>{try{s(hn(h.frame))}catch(y){i(y)}}),a.end())}),a.on("error",p=>f(()=>i(p))),a.on("close",()=>{l||f(()=>i(new Error(`${n} closed without response`)))})})}function jo(e,t,n){let r="";e.setEncoding("utf8"),e.on("error",()=>{}),e.on("data",o=>{r+=o;let s=gn(r);if(!s)return;r=s.rest,e.pause();let i=a=>{if(!(e.destroyed||!e.writable))try{e.write(yn(a,s.dialect))}catch{}};(async()=>{let a;try{a=hn(s.frame),await t(a,i)}catch(l){n(l,a,i)}finally{e.end()}})()})}async function Po(e){await Xl(rd(e),{recursive:!0,mode:448});try{return await ed(e,kn.O_CREAT|kn.O_EXCL|kn.O_RDWR)}catch(t){if(t.code!=="EEXIST")throw t;return null}}function T(e){if(!Number.isInteger(e)||e<=0)return!1;try{return process.kill(e,0),!0}catch(t){return t.code==="EPERM"}}function mt(e){let t=e.env??process.env,n=Zl("sha256").update(e.key).digest("hex").slice(0,20),r=t.XDG_RUNTIME_DIR;if(r){let s=Rn(r,"red-skills",n);if(Rn(s,e.socketFileName).length<od)return s}let o=e.uid??(typeof process.getuid=="function"?process.getuid():"nouid");return Rn(nd(),`red-skills-${o}`,n)}Z();import{homedir as jd}from"node:os";import{join as jn}from"node:path";import{spawnSync as Pd}from"node:child_process";import{createHash as Od}from"node:crypto";import{existsSync as Dd}from"node:fs";import{mkdir as No,readFile as Ld,writeFile as $d}from"node:fs/promises";import{dirname as Ad}from"node:path";var Ge="@reddb-io/red-skills",gd="https://registry.npmjs.org",hd="canary",xe=class extends Error{kind;cause;constructor(t,n,r){super(n),this.name="BundleFetchError",this.kind=t,this.cause=r}};function yd(e,t,n="stable"){return`${e}-${n==="canary"?"canary":t}.bundle.min.mjs`}function kt(e){let{plugin:t,version:n,cacheDir:r,channel:o}=e;return Rt(r,yd(t,n,o))}function kd(e){return e==="dev"?["rsp"]:[]}function Rd(e){return`${e}.bundle.min.mjs`}function wd(e){return Rt("dist",Rd(e))}function bd(e,t="stable"){return`${Ge}@${t==="canary"?hd:e}`}function _d(e=Ge){return`${gd}/${e.replace("/","%2F")}`}async function En(e,t){let{plugin:n,version:r,cacheDir:o,channel:s="stable"}=t,i=kt({plugin:n,version:r,cacheDir:o,channel:s}),a=kd(n),l=a.map(p=>kt({plugin:p,version:r,cacheDir:o,channel:s}));if(s!=="canary"&&await e.exists(i)&&await vd(e,l))return i;let d=bd(r,s),u=Rt(o,`.staging-${n}-${s==="canary"?"canary":r}`),f;try{f=await e.materialize(d,u)}catch(p){throw Io(p,d)}for(let p of[n,...a]){let h=wd(p),y=Rt(f,h);if(!await e.exists(y))throw new xe("bundle-missing",`npm package ${d} has no ${h}`);let R=p===n?i:kt({plugin:p,version:r,cacheDir:o,channel:s});await e.writeFile(R,await e.readFile(y))}return i}async function vd(e,t){for(let n of t)if(!await e.exists(n))return!1;return!0}async function $o(e,t,n=Ge){let r;try{r=await e.fetchText(_d(n))}catch(s){throw Io(s,n)}let o=xd(r);return{sameMajor:Sd(o,t),newest:Ed(o)}}function xd(e){let t;try{t=JSON.parse(e)}catch{return[]}if(typeof t!="object"||t===null)return[];let n=t.versions;return typeof n!="object"||n===null?[]:Object.keys(n)}function Sd(e,t){let n=Sn(t);if(n===null)return null;let r=null;for(let o of e)Sn(o)===n&&(r===null||Ao(o,r)>0)&&(r=o);return r}function Ed(e){let t=null;for(let n of e){let r=String(n).trim();Sn(r)===null||/^\d+\.\d+\.\d+[-+]/.test(r)||(t===null||Ao(r,t)>0)&&(t=r)}return t}function Sn(e){let t=/^(\d+)\.(\d+)\.(\d+)/.exec(String(e).trim());return t?Number(t[1]):null}function Ao(e,t){let n=/^(\d+)\.(\d+)\.(\d+)/.exec(e.trim()),r=/^(\d+)\.(\d+)\.(\d+)/.exec(t.trim());return!n||!r?0:Number(n[1])-Number(r[1])||Number(n[2])-Number(r[2])||Number(n[3])-Number(r[3])}function Io(e,t){let n=e instanceof Error?e.message:String(e);return/ENOENT|command not found|spawn npm/i.test(n)?new xe("npm-unavailable",`npm is unavailable while resolving ${t}: ${n}`,e):/\b404\b|E404|not found|no matching version|notarget/i.test(n)?new xe("package-missing",`npm could not resolve ${t}: ${n}`,e):new xe("network",`failed to resolve ${t}: ${n}`,e)}function Rt(e,t){return e.endsWith("/")?`${e}${t}`:`${e}/${t}`}Z();var Id={async materialize(e,t){await No(t,{recursive:!0});let n=Pd("npm",["install",e,"--prefix",t,"--no-save","--no-audit","--no-fund","--ignore-scripts","--loglevel=error"],{stdio:["ignore","ignore","pipe"],encoding:"utf8"});if(n.error)throw n.error;if(n.status!==0)throw new Error(`npm install ${e} -> ${n.status}: ${(n.stderr||"").trim()}`);return jn(t,"node_modules",...Ge.split("/"))},async readFile(e){return new Uint8Array(await Ld(e))},async writeFile(e,t){await No(Ad(e),{recursive:!0}),await $d(e,t)},async exists(e){return Dd(e)},sha256(e){return Od("sha256").update(e).digest("hex")},async fetchText(e){let t=await fetch(e,{redirect:"follow"});if(!t.ok)throw new Error(`GET ${e} -> ${t.status}`);return await t.text()}},Nd="redskilled";function Td(e=process.env){if(e.RED_SKILLS_CACHE_DIR)return e.RED_SKILLS_CACHE_DIR;let t=e.XDG_CACHE_HOME||jn(e.HOME||jd(),".cache");return jn(t,"red-skills","bundles")}async function Wd(e={},t={},n={}){let r=se(e,t);if(G(r))return r;let o=n.env??t.env??process.env;try{await En(n.bundleIO??Id,{plugin:Nd,version:n.version??"",cacheDir:Td(o)})}catch{return r}return se(e,t)}async function To(e={},t={},n={}){let r=await Wd(e,t,n);if(G(r))return r;let{RedskilledDaemonEntryError:o}=await Promise.resolve().then(()=>(Z(),Lo));throw new o(r)}import{randomUUID as Dt}from"node:crypto";import{mkdir as Vp,rm as Li}from"node:fs/promises";import{createServer as Jp}from"node:net";import{dirname as Bp}from"node:path";import{totalmem as Md}from"node:os";function Wo(e){let t=0,n=0,r=0,o=[],s=[];for(let i of e){let a=i.budget??{},l=!1;for(let[d,u]of[[a.memory_high,f=>t+=f],[a.memory_max,f=>n+=f]]){if(d==null)continue;let f=Se(d);f==null?l=!0:u(f)}a.cpu_weight!=null&&(r+=a.cpu_weight),l&&o.push(i.worker_id),i.isolated||s.push(i.worker_id)}return{version:1,worker_count:e.length,memory_high_bytes:t,memory_max_bytes:n,cpu_weight_total:r,unaccounted_workers:o.sort(),unisolated_workers:s.sort()}}function Se(e){let t=/^\s*(\d+(?:\.\d+)?)\s*([KMGT]?)(?:B)?\s*$/i.exec(e);if(!t)return null;let n={"":1,k:1024,m:1024**2,g:1024**3,t:1024**4}[t[2].toLowerCase()];return Math.round(Number(t[1])*n)}function Mo(e){if(e===null||typeof e!="object"||Array.isArray(e))return!1;let t=e;return t.version===1&&Number.isInteger(t.worker_count)&&typeof t.memory_high_bytes=="number"&&typeof t.memory_max_bytes=="number"&&typeof t.cpu_weight_total=="number"&&Array.isArray(t.unaccounted_workers)&&Array.isArray(t.unisolated_workers)}var Cd="REDSKILLED_MEMORY_CEILING",Ud="REDSKILLED_WORKER_CEILING",Fd=.7;function Co(e){let t=e?.memory_max??e?.memory_high;if(t!=null)return Se(t)}function Pn(e){let t=0,n=[];for(let r of e){let o=Co(r.budget);o===null?n.push(r.worker_id):o!==void 0&&(t+=o)}return{worker_count:e.length,memory_bytes:t,unaccounted_workers:n.sort()}}function Uo(e){let{ceiling:t}=e,n=Pn(e.workers),r=Co(e.budget),o=r===void 0?null:r,s=n.memory_bytes+(r??0),i=n.worker_count+1,a=e.projectLabel!=null&&e.projectLabel!==""?` for project ${JSON.stringify(e.projectLabel)}`:"",l=`the host is already holding ${n.memory_bytes} bytes across ${n.worker_count} Worker(s)`,d=(u,f)=>({version:1,admitted:!1,verdict:u,reason:f,ceiling:t,consumption:n,requested_memory_bytes:o,projected_worker_count:i,projected_memory_bytes:s});return t.worker_count!=null&&i>t.worker_count?d("refused-over-worker-ceiling",`redskilled refused this Worker${a}: it would be Worker ${i} past a host ceiling of ${t.worker_count} Worker(s), and ${l}`):t.memory_bytes!=null&&r===null?d("refused-unaccountable-budget",`redskilled refused this Worker${a}: its declared memory budget cannot be reduced to bytes, so it cannot be proven to fit under the host ceiling of ${t.memory_bytes} bytes, and ${l}`):t.memory_bytes!=null&&s>t.memory_bytes?d("refused-over-memory-ceiling",`redskilled refused this Worker${a}: it would take the host to ${s} bytes of declared Worker memory, past the host ceiling of ${t.memory_bytes} bytes, and ${l}`):{version:1,admitted:!0,verdict:"admitted",reason:`redskilled admitted this Worker${a}: ${s} bytes of declared Worker memory against a host ceiling of ${t.memory_bytes??"unbounded"} bytes, and ${l}`,ceiling:t,consumption:n,requested_memory_bytes:o,projected_worker_count:i,projected_memory_bytes:s}}function Fo(e=process.env,t=Md()){let n=(e[Cd]??"").trim(),r=(e[Ud]??"").trim(),o=Vd(r);if(n!==""){let s=Hd(n,t);if(s!==void 0)return{memory_bytes:s,worker_count:o,source:"declared"}}return{memory_bytes:Math.floor(t*Fd),worker_count:o,source:r!==""?"declared":"host-fraction"}}function Hd(e,t){let n=e.toLowerCase();if(["infinity","none","off","unbounded"].includes(n))return null;let r=/^(\d+(?:\.\d+)?)\s*%$/.exec(e);return r?Math.floor(t*(Number(r[1])/100)):Se(e)??void 0}function Vd(e){if(e===""||["infinity","none","off","unbounded"].includes(e.toLowerCase()))return null;let t=Number(e);return Number.isSafeInteger(t)&&t>0?t:null}import{appendFile as Jd,mkdir as Bd,open as Kd,readFile as qd,stat as Gd,truncate as Ho}from"node:fs/promises";import{dirname as zd}from"node:path";var Vo="redskilled.events.toonl";function Qd(e){let t=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:t.memory_high??null,memory_max:t.memory_max??null,cpu_weight:t.cpu_weight??null,detail:e.detail??null,exit_code:e.exitCode??null,signal:e.signal??null,reason:e.reason??null}}var Yd="daemon:";function Zd(e){return{version:1,ts:e.ts,event:"daemon-stop",worker_id:`${Yd}${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 Jo(e){let t=sn({trailer:!1}),n=Promise.resolve();async function r(o){let s=n.then(async()=>{await Bd(zd(e),{recursive:!0,mode:448}),await Xd(e),await Jd(e,t.push(rc(o)),{encoding:"utf8",mode:384})});return n=s.catch(()=>{}),await s,o}return{path:e,record:o=>r(Qd(o)),recordDaemonStop:o=>r(Zd(o)),read:()=>ec(e),flush:async()=>{await n}}}async function Xd(e){let t;try{t=(await Gd(e)).size}catch(o){if(o.code==="ENOENT")return;throw o}if(t===0)return;let n=64*1024,r=await Kd(e,"r");try{let o=Buffer.alloc(1);if(await r.read(o,0,1,t-1),o[0]===10)return;for(let s=t;s>0;s-=n){let i=Math.min(n,s),a=Buffer.alloc(i);await r.read(a,0,i,s-i);let l=a.lastIndexOf(10);if(l>=0){await Ho(e,s-i+l+1);return}}await Ho(e,0)}finally{await r.close()}}async function ec(e){let t;try{t=await qd(e,"utf8")}catch(n){if(n.code==="ENOENT")return[];throw n}return tc(t)}function tc(e){let t=e.split(`
|
|
46
|
-
`);return t.pop(),t.length===0?[]:
|
|
45
|
+
`}function _d(e){try{let t=JSON.stringify(e);if(t===void 0)return null;let n=I(JSON.parse(t));return n.trim()===""?null:n}catch{return null}}function To(e,t){return!Ao(e)||!Ao(t)||t.ok!==!1?!1:typeof e.id=="string"&&typeof t.id=="string"&&t.id!==e.id}function Ao(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}var No=new Set;function Wo(e){return No.has(e)?"json":bd}function Mo(e){No.add(e)}var Od=108;async function kt(e,t,n="resident server"){let r=e.wire,o=r??Wo(e.socketPath),s=await Co(e,t,n,o);return r||o==="json"||!To(t,s)?s:(Mo(e.socketPath),await Co(e,t,n,"json"))}async function Co(e,t,n,r){let o=e.timeoutMs??1e3;return await new Promise((s,i)=>{let l=Ed(e.socketPath),a=!1,c="",u=setTimeout(()=>{f(()=>i(new Error(`${n} timed out`))),l.destroy()},o);function f(p){a||(a=!0,clearTimeout(u),p())}l.on("connect",()=>{l.write(xn(t,r))}),l.on("data",p=>{c+=p.toString("utf8");let h=vn(c);h&&(c=h.rest,f(()=>{try{s(Sn(h.frame))}catch(y){i(y)}}),l.end())}),l.on("error",p=>f(()=>i(p))),l.on("close",()=>{a||f(()=>i(new Error(`${n} closed without response`)))})})}function Uo(e,t,n){let r="";e.setEncoding("utf8"),e.on("error",()=>{}),e.on("data",o=>{r+=o;let s=vn(r);if(!s)return;r=s.rest,e.pause();let i=l=>{if(!(e.destroyed||!e.writable))try{e.write(xn(l,s.dialect))}catch{}};(async()=>{let l;try{l=Sn(s.frame),await t(l,i)}catch(a){n(a,l,i)}finally{e.end()}})()})}async function Fo(e){await Sd(Pd(e),{recursive:!0,mode:448});try{return await xd(e,En.O_CREAT|En.O_EXCL|En.O_RDWR)}catch(t){if(t.code!=="EEXIST")throw t;return null}}function N(e){if(!Number.isInteger(e)||e<=0)return!1;try{return process.kill(e,0),!0}catch(t){return t.code==="EPERM"}}function Rt(e){let t=e.env??process.env,n=vd("sha256").update(e.key).digest("hex").slice(0,20),r=t.XDG_RUNTIME_DIR;if(r){let s=jn(r,"red-skills",n);if(jn(s,e.socketFileName).length<Od)return s}let o=e.uid??(typeof process.getuid=="function"?process.getuid():"nouid");return jn(jd(),`red-skills-${o}`,n)}X();import{homedir as Zd}from"node:os";import{join as Tn}from"node:path";import{spawnSync as Xd}from"node:child_process";import{createHash as ec}from"node:crypto";import{existsSync as tc}from"node:fs";import{mkdir as Go,readFile as nc,writeFile as rc}from"node:fs/promises";import{dirname as oc}from"node:path";var Ye="@reddb-io/red-skills",Ud="https://registry.npmjs.org",Fd="canary",Ee=class extends Error{kind;cause;constructor(t,n,r){super(n),this.name="BundleFetchError",this.kind=t,this.cause=r}};function Hd(e,t,n="stable"){return`${e}-${n==="canary"?"canary":t}.bundle.min.mjs`}function vt(e){let{plugin:t,version:n,cacheDir:r,channel:o}=e;return St(r,Hd(t,n,o))}function Vd(e){return e==="dev"?["rsp"]:[]}function Bd(e){return`${e}.bundle.min.mjs`}function Jd(e){return St("dist",Bd(e))}function Kd(e,t="stable"){return`${Ye}@${t==="canary"?Fd:e}`}function qd(e=Ye){return`${Ud}/${e.replace("/","%2F")}`}async function In(e,t){let{plugin:n,version:r,cacheDir:o,channel:s="stable"}=t,i=vt({plugin:n,version:r,cacheDir:o,channel:s}),l=Vd(n),a=l.map(p=>vt({plugin:p,version:r,cacheDir:o,channel:s}));if(s!=="canary"&&await e.exists(i)&&await Gd(e,a))return i;let c=Kd(r,s),u=St(o,`.staging-${n}-${s==="canary"?"canary":r}`),f;try{f=await e.materialize(c,u)}catch(p){throw qo(p,c)}for(let p of[n,...l]){let h=Jd(p),y=St(f,h);if(!await e.exists(y))throw new Ee("bundle-missing",`npm package ${c} has no ${h}`);let w=p===n?i:vt({plugin:p,version:r,cacheDir:o,channel:s});await e.writeFile(w,await e.readFile(y))}return i}async function Gd(e,t){for(let n of t)if(!await e.exists(n))return!1;return!0}async function Jo(e,t,n=Ye){let r;try{r=await e.fetchText(qd(n))}catch(s){throw qo(s,n)}let o=zd(r);return{sameMajor:Qd(o,t),newest:Yd(o)}}function zd(e){let t;try{t=JSON.parse(e)}catch{return[]}if(typeof t!="object"||t===null)return[];let n=t.versions;return typeof n!="object"||n===null?[]:Object.keys(n)}function Qd(e,t){let n=An(t);if(n===null)return null;let r=null;for(let o of e)An(o)===n&&(r===null||Ko(o,r)>0)&&(r=o);return r}function Yd(e){let t=null;for(let n of e){let r=String(n).trim();An(r)===null||/^\d+\.\d+\.\d+[-+]/.test(r)||(t===null||Ko(r,t)>0)&&(t=r)}return t}function An(e){let t=/^(\d+)\.(\d+)\.(\d+)/.exec(String(e).trim());return t?Number(t[1]):null}function Ko(e,t){let n=/^(\d+)\.(\d+)\.(\d+)/.exec(e.trim()),r=/^(\d+)\.(\d+)\.(\d+)/.exec(t.trim());return!n||!r?0:Number(n[1])-Number(r[1])||Number(n[2])-Number(r[2])||Number(n[3])-Number(r[3])}function qo(e,t){let n=e instanceof Error?e.message:String(e);return/ENOENT|command not found|spawn npm/i.test(n)?new Ee("npm-unavailable",`npm is unavailable while resolving ${t}: ${n}`,e):/\b404\b|E404|not found|no matching version|notarget/i.test(n)?new Ee("package-missing",`npm could not resolve ${t}: ${n}`,e):new Ee("network",`failed to resolve ${t}: ${n}`,e)}function St(e,t){return e.endsWith("/")?`${e}${t}`:`${e}/${t}`}X();var sc={async materialize(e,t){await Go(t,{recursive:!0});let n=Xd("npm",["install",e,"--prefix",t,"--no-save","--no-audit","--no-fund","--ignore-scripts","--loglevel=error"],{stdio:["ignore","ignore","pipe"],encoding:"utf8"});if(n.error)throw n.error;if(n.status!==0)throw new Error(`npm install ${e} -> ${n.status}: ${(n.stderr||"").trim()}`);return Tn(t,"node_modules",...Ye.split("/"))},async readFile(e){return new Uint8Array(await nc(e))},async writeFile(e,t){await Go(oc(e),{recursive:!0}),await rc(e,t)},async exists(e){return tc(e)},sha256(e){return ec("sha256").update(e).digest("hex")},async fetchText(e){let t=await fetch(e,{redirect:"follow"});if(!t.ok)throw new Error(`GET ${e} -> ${t.status}`);return await t.text()}},ic="redskilled";function lc(e=process.env){if(e.RED_SKILLS_CACHE_DIR)return e.RED_SKILLS_CACHE_DIR;let t=e.XDG_CACHE_HOME||Tn(e.HOME||Zd(),".cache");return Tn(t,"red-skills","bundles")}async function ac(e={},t={},n={}){let r=ie(e,t);if(G(r))return r;let o=n.env??t.env??process.env;try{await In(n.bundleIO??sc,{plugin:ic,version:n.version??"",cacheDir:lc(o)})}catch{return r}return ie(e,t)}async function zo(e={},t={},n={}){let r=await ac(e,t,n);if(G(r))return r;let{RedskilledDaemonEntryError:o}=await Promise.resolve().then(()=>(X(),Bo));throw new o(r)}import{randomUUID as Tt}from"node:crypto";import{mkdir as mf,rm as zi}from"node:fs/promises";import{createServer as gf}from"node:net";import{dirname as hf}from"node:path";import{totalmem as dc}from"node:os";function Qo(e){let t=0,n=0,r=0,o=[],s=[];for(let i of e){let l=i.budget??{},a=!1;for(let[c,u]of[[l.memory_high,f=>t+=f],[l.memory_max,f=>n+=f]]){if(c==null)continue;let f=je(c);f==null?a=!0:u(f)}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:t,memory_max_bytes:n,cpu_weight_total:r,unaccounted_workers:o.sort(),unisolated_workers:s.sort()}}function je(e){let t=/^\s*(\d+(?:\.\d+)?)\s*([KMGT]?)(?:B)?\s*$/i.exec(e);if(!t)return null;let n={"":1,k:1024,m:1024**2,g:1024**3,t:1024**4}[t[2].toLowerCase()];return Math.round(Number(t[1])*n)}function Yo(e){if(e===null||typeof e!="object"||Array.isArray(e))return!1;let t=e;return t.version===1&&Number.isInteger(t.worker_count)&&typeof t.memory_high_bytes=="number"&&typeof t.memory_max_bytes=="number"&&typeof t.cpu_weight_total=="number"&&Array.isArray(t.unaccounted_workers)&&Array.isArray(t.unisolated_workers)}var cc="REDSKILLED_MEMORY_CEILING",uc="REDSKILLED_WORKER_CEILING",pc=.7;function Zo(e){let t=e?.memory_max??e?.memory_high;if(t!=null)return je(t)}function Nn(e){let t=0,n=[];for(let r of e){let o=Zo(r.budget);o===null?n.push(r.worker_id):o!==void 0&&(t+=o)}return{worker_count:e.length,memory_bytes:t,unaccounted_workers:n.sort()}}function Xo(e){let{ceiling:t}=e,n=Nn(e.workers),r=Zo(e.budget),o=r===void 0?null:r,s=n.memory_bytes+(r??0),i=n.worker_count+1,l=e.projectLabel!=null&&e.projectLabel!==""?` for project ${JSON.stringify(e.projectLabel)}`:"",a=`the host is already holding ${n.memory_bytes} bytes across ${n.worker_count} Worker(s)`,c=(u,f)=>({version:1,admitted:!1,verdict:u,reason:f,ceiling:t,consumption:n,requested_memory_bytes:o,projected_worker_count:i,projected_memory_bytes:s});return t.worker_count!=null&&i>t.worker_count?c("refused-over-worker-ceiling",`redskilled refused this Worker${l}: it would be Worker ${i} past a host ceiling of ${t.worker_count} Worker(s), and ${a}`):t.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 ${t.memory_bytes} bytes, and ${a}`):t.memory_bytes!=null&&s>t.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 ${t.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 ${t.memory_bytes??"unbounded"} bytes, and ${a}`,ceiling:t,consumption:n,requested_memory_bytes:o,projected_worker_count:i,projected_memory_bytes:s}}function es(e=process.env,t=dc()){let n=(e[cc]??"").trim(),r=(e[uc]??"").trim(),o=mc(r);if(n!==""){let s=fc(n,t);if(s!==void 0)return{memory_bytes:s,worker_count:o,source:"declared"}}return{memory_bytes:Math.floor(t*pc),worker_count:o,source:r!==""?"declared":"host-fraction"}}function fc(e,t){let n=e.toLowerCase();if(["infinity","none","off","unbounded"].includes(n))return null;let r=/^(\d+(?:\.\d+)?)\s*%$/.exec(e);return r?Math.floor(t*(Number(r[1])/100)):je(e)??void 0}function mc(e){if(e===""||["infinity","none","off","unbounded"].includes(e.toLowerCase()))return null;let t=Number(e);return Number.isSafeInteger(t)&&t>0?t:null}import{appendFile as gc,mkdir as hc,open as yc,readFile as kc,stat as Rc,truncate as ts}from"node:fs/promises";import{dirname as wc}from"node:path";var ns="redskilled.events.toonl";function bc(e){let t=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:t.memory_high??null,memory_max:t.memory_max??null,cpu_weight:t.cpu_weight??null,detail:e.detail??null,exit_code:e.exitCode??null,signal:e.signal??null,reason:e.reason??null}}var _c="daemon:";function vc(e){return{version:1,ts:e.ts,event:"daemon-stop",worker_id:`${_c}${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 rs(e){let t=mn({trailer:!1}),n=Promise.resolve();async function r(o){let s=n.then(async()=>{await hc(wc(e),{recursive:!0,mode:448}),await Sc(e),await gc(e,t.push(Pc(o)),{encoding:"utf8",mode:384})});return n=s.catch(()=>{}),await s,o}return{path:e,record:o=>r(bc(o)),recordDaemonStop:o=>r(vc(o)),read:()=>xc(e),flush:async()=>{await n}}}async function Sc(e){let t;try{t=(await Rc(e)).size}catch(o){if(o.code==="ENOENT")return;throw o}if(t===0)return;let n=64*1024,r=await yc(e,"r");try{let o=Buffer.alloc(1);if(await r.read(o,0,1,t-1),o[0]===10)return;for(let s=t;s>0;s-=n){let i=Math.min(n,s),l=Buffer.alloc(i);await r.read(l,0,i,s-i);let a=l.lastIndexOf(10);if(a>=0){await ts(e,s-i+a+1);return}}await ts(e,0)}finally{await r.close()}}async function xc(e){let t;try{t=await kc(e,"utf8")}catch(n){if(n.code==="ENOENT")return[];throw n}return Ec(t)}function Ec(e){let t=e.split(`
|
|
46
|
+
`);return t.pop(),t.length===0?[]:fn(`${t.join(`
|
|
47
47
|
`)}
|
|
48
|
-
`).filter(
|
|
49
|
-
`}function wc(e){let t=e.trim();if(!t)return null;try{return JSON.parse(t)}catch{try{return K(t)}catch{return null}}}function bc(e){if(e===null||typeof e!="object"||Array.isArray(e))return!1;let t=e;if(t.version!==1||t.scope!=="machine"||!Number.isInteger(t.pid)||t.pid<=0||!Number.isInteger(t.uid))return!1;for(let n of["start_time","machine_id_hash","session_key_hash","socket_path","acquired_at","renewed_at"])if(typeof t[n]!="string"||t[n].length===0)return!1;return!0}function Ln(e,t){if(!Array.isArray(e)||e.length===0)throw new Error(`redskilled needs an argv to register project ${JSON.stringify(t)}: a registration with nothing to run is a project the host could never start a Worker for`);return e.map((n,r)=>{if(typeof n!="string"||n==="")throw new Error(`redskilled needs every word of an argv to be a non-empty string, and word ${r} of project ${JSON.stringify(t)} is not`);return n})}function $n(e,t){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(t)}, not ${JSON.stringify(e)}`);let n={};for(let[r,o]of Object.entries(e)){if(r==="")throw new Error(`redskilled needs every launch env name of project ${JSON.stringify(t)} 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(t)} is ${JSON.stringify(o)}`);n[r]=o}return n}var _c=3e5,vc=.5,In=class extends Error{constructor(n){super(`redskilled already holds a registration for project ${JSON.stringify(n.project_label)}, registered at ${n.registered_at} for a target of ${n.target} and standing until ${n.renew_by}: a project contributes one registration, so a second one is refused rather than silently replacing the first`);this.held=n;this.name="RedskilledProjectRegisteredError"}};function ss(e,t){if(t.held!=null)throw new In(t.held);let n=An(e.project_label,"a project label"),r=An(e.selector,"a selector"),o=Ln(e.argv,n),s=$n(e.env,n),i=An(e.workspace_path,`a workspace path for project ${JSON.stringify(n)}`);if(!Number.isInteger(e.target)||e.target<0)throw new Error(`redskilled needs a whole, non-negative target to register project ${JSON.stringify(n)}, not ${JSON.stringify(e.target)}`);let a=e.renew_within_ms??_c;if(!Number.isFinite(a)||a<=0)throw new Error(`redskilled needs a positive renewal window to register project ${JSON.stringify(n)}, not ${JSON.stringify(e.renew_within_ms)}: a registration that lapses on arrival is a poll nobody asked for`);let l=Date.parse(t.now);if(!Number.isFinite(l))throw new Error(`redskilled needs an instant to date a registration, not ${JSON.stringify(t.now)}`);return{version:1,project_label:n,selector:r,argv:o,workspace_path:i,env:s,target:e.target,registered_at:new Date(l).toISOString(),renew_within_ms:a,renew_by:new Date(l+a).toISOString(),renewed_at:new Date(l).toISOString(),renewals:0,launch_revision:0}}var _t=class extends Error{constructor(n){super(`redskilled holds no registration for project ${JSON.stringify(n)} 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=n;this.name="RedskilledProjectUnregisteredError"}};function is(e,t){let n=Date.parse(t.now);if(!Number.isFinite(n))throw new Error(`redskilled needs an instant to date a renewal, not ${JSON.stringify(t.now)}`);let r=t.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(t.renew_within_ms)}`);let o=t.launch==null?{env:e.env??{},launch_revision:e.launch_revision??0}:{argv:Ln(t.launch.argv,e.project_label),env:$n(t.launch.env,e.project_label),launch_revision:(e.launch_revision??0)+1};return{...e,...o,renew_within_ms:r,renewed_at:new Date(n).toISOString(),renew_by:new Date(n+r).toISOString(),renewals:e.renewals+1}}function xc(e,t){let n=Date.parse(e.renew_by);return Number.isFinite(n)?t>=n:!1}function as(e,t){let n=Date.parse(e.renewed_at??e.registered_at);return Number.isFinite(n)&&t-n<=e.renew_within_ms*vc?"renewing":"running-on"}function ls(e,t){let n=[],r=[];for(let o of e)(xc(o,t)?r:n).push(o);return{standing:n,lapsed:r}}function Nn(e){if(e===null||typeof e!="object"||Array.isArray(e))return!1;let t=e;return t.version===1&&typeof t.project_label=="string"&&typeof t.selector=="string"&&Array.isArray(t.argv)&&t.argv.every(n=>typeof n=="string")&&typeof t.workspace_path=="string"&&Number.isInteger(t.target)&&typeof t.registered_at=="string"&&typeof t.renew_within_ms=="number"&&typeof t.renew_by=="string"&&(t.renewed_at===void 0||typeof t.renewed_at=="string")&&(t.renewals===void 0||Number.isInteger(t.renewals))&&(t.env===void 0||Sc(t.env))&&(t.launch_revision===void 0||Number.isInteger(t.launch_revision))}function Sc(e){return e===null||typeof e!="object"||Array.isArray(e)?!1:Object.values(e).every(t=>typeof t=="string")}function An(e,t){if(typeof e!="string"||e==="")throw new Error(`redskilled needs ${t} to register a project, not ${JSON.stringify(e)}`);return e}var Ec={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 ds(e){return`worker-${e}`}function cs(e){let t=Ec[e.op]??"project-write",n=e.sessionProject??null,r=e.targetProject??null,o={version:1,op:e.op,reach:t,session_project:n,target_project:r};return t==="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`}:t==="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`}:n==null||n===""?{...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===n?{...o,permitted:!0,verdict:"permitted-own-project",reason:`redskilled permitted ${e.op}: the target belongs to project ${JSON.stringify(n)}, 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(n)}: ${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 jc}from"node:child_process";import{readFileSync as Pc,readdirSync as Oc}from"node:fs";import{join as Dc}from"node:path";function ze(e){let t=e.budget??{},n=[["MemoryMax",t.memory_max],["MemoryHigh",t.memory_high]];for(let[r,o]of n){if(o==null)continue;let s=Se(o);return s==null?null:{name:r,declared:o,bytes:s}}return null}function us(e){let t=[],n=[];for(let r of e.workers){let o=ze(r);if(o==null){n.push({worker_id:r.worker_id,reason:(r.budget?.memory_max??r.budget?.memory_high)==null?"this Worker declared no memory budget, so the sampler has no ceiling 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)){n.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||t.push(Lc(r,o,s))}return{terminations:t,unenforceable:n}}function Lc(e,t,n){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:t.name,budget_declared:t.declared,budget_bytes:t.bytes,observed_rss_bytes:n,workspace_path:e.workspace_path,reason:`redskilled terminated ${r}: its tree RSS of ${n} bytes exceeded its ${t.name} budget of ${t.declared} (${t.bytes} bytes). This is a budget termination, not a stall, and the work in ${JSON.stringify(e.workspace_path)} is handed forward.`}}var $c=4096;function ps(e,t={}){let n=t.platform??process.platform,r={rss:{},cpu_seconds:{}};if(e.length===0)return r;let o=Ac(n,t);if(o.size===0)return r;let s=new Map;for(let l of o.values()){let d=s.get(l.ppid);d?d.push(l.pid):s.set(l.ppid,[l.pid])}let i={},a={};for(let l of e){if(!o.has(l.pid))continue;let d=0,u=0,f=[l.pid],p=new Set;for(;f.length>0;){let h=f.pop();if(p.has(h))continue;p.add(h);let y=o.get(h);if(y){d+=y.rssBytes,u+=y.cpuSeconds;for(let R of s.get(h)??[])f.push(R)}}i[l.worker_id]=d,a[l.worker_id]=u}return{rss:i,cpu_seconds:a}}function Ac(e,t){return t.procRoot!=null||e==="linux"?Cc(t.procRoot??"/proc"):t.psTable!=null||e==="darwin"?Wc(Ic(t.psTable)):new Map}function Ic(e){try{return(e??Nc)()}catch{return""}}function Nc(){return jc("ps",["-axo","pid=,ppid=,rss=,time="],{encoding:"utf8",maxBuffer:16*1024*1024})}var Tc=1024;function Wc(e){let t=new Map;for(let n of e.split(`
|
|
50
|
-
`)){let r=n.trim().split(/\s+/);if(r.length!==4)continue;let[o,s,i]=r.slice(0,3).map(Number);if(![o,s,i].every(
|
|
51
|
-
`),aliases:s,closed_since:o}}function Vc(e,t,n){let r=Ee(t),o=Ee(r.data),s=Array.isArray(r.errors)?r.errors.map(Ee):[],i=Kc(o.rateLimit,s),a=e.aliases.map(({alias:l,search_alias:d,project:u})=>{let f=u.owner+"/"+u.name,p=o[l],h=s.find(y=>fs(y.path,l)||fs(y.path,d));if(Rs(p)){let y=ms(p.open_pull_requests),R=ms(p.open_issues),w=qc(o[d]);if(y!=null&&R!=null&&w!=null)return{project_label:u.project_label,repository:f,outcome:"counted",counts:{open_pull_requests:y,open_issues:R,recently_closed:w},detail:`counted ${f} for project ${JSON.stringify(u.project_label)}`}}return i.exhausted||ks(h)?{project_label:u.project_label,repository:f,outcome:"rate-limited",counts:null,detail:`the host token's quota was spent before ${f} 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:f,outcome:"unreachable",counts:null,detail:`${f} is not reachable with the host token: ${Wn(h?.message)||"the query returned no such repository"}`}});return{version:1,fetched_at:n.fetchedAt,request_count:1,project_count:a.length,rate_limit:i,projects:a}}function Jc(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 gs(e){if(e.projects.length===0)return Jc(e.now);Mn(e.projects,e.hostTokenRef);let t=Hc(e.projects,{now:e.now,closedWindowMs:e.closedWindowMs});try{let n=await e.transport(t.query);return Vc(t,n,{fetchedAt:e.now})}catch(n){let r=n instanceof Error?n.message:String(n),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 hs(e){let t=e.stalenessMs??12e4,n=e.activity;if(n==null)return{version:1,fetched_at:null,age_ms:null,threshold_ms:t,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(n.fetched_at),s=Number.isFinite(r)&&Number.isFinite(o)?Math.max(0,r-o):null,i=s==null||s>t;return{version:1,fetched_at:n.fetched_at,age_ms:s,threshold_ms:t,stale:n.projects.length>0&&i,request_count:n.request_count,rate_limit:n.rate_limit,projects:n.projects.map(a=>({...a,fetched_at:n.fetched_at,age_ms:s,stale:i})),reason:n.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 ${t}ms window`:`fetched ${s}ms ago, within the ${t}ms window`}}function ys(e){let t=e.endpoint??"https://api.github.com/graphql",n=e.fetchImpl??fetch;return async r=>{let o=await n(t,{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 Bc(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 t=new Set;for(let n of e){if(n.project_label===""||n.owner===""||n.name==="")throw new Error("redskilled activity fetch needs a project label and an owner/name for every registered project");if(t.has(n.project_label))throw new Error(`redskilled holds one repository per project, and ${JSON.stringify(n.project_label)} is registered twice`);t.add(n.project_label)}}function Kc(e,t){let n=Ee(e),r=typeof n.remaining=="number"&&Number.isFinite(n.remaining)?n.remaining:null,o=typeof n.resetAt=="string"?n.resetAt:null,s=t.some(ks);return{remaining:r,reset_at:o,exhausted:s||r===0}}function ks(e){if(e==null)return!1;let t=Wn(e.type),n=Wn(e.message);return t==="RATE_LIMITED"||/rate limit/i.test(n)}function fs(e,t){return Array.isArray(e)&&e.includes(t)}function ms(e){let t=Ee(e);return Number.isInteger(t.totalCount)?t.totalCount:null}function qc(e){let t=Ee(e);return Number.isInteger(t.issueCount)?t.issueCount:null}function Ee(e){return Rs(e)?e:{}}function Rs(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Wn(e){return typeof e=="string"?e:""}var Gc=3e4;function ws(e){let t=e.stalenessMs??Gc,n=Cn(e.now),r=e.sampledAt==null?null:Cn(e.sampledAt),o=n==null||r==null?null:Math.max(0,n-r),s=o!=null&&o<=t,i=new Set(e.reattachedWorkerIds??[]),a=e.hostState.workers.map(p=>zc(p,{rss:e.rss,sampledAt:e.sampledAt,ageMs:o,sampleFresh:s,nowMs:n,log:e.logLines?.[p.worker_id],state:i.has(p.worker_id)?"reattached":"running"})),l=a.filter(p=>p.vitals.rss_bytes==null).map(p=>p.worker_id).sort(),d=a.length-l.length,u=a.reduce((p,h)=>p+(h.vitals.rss_bytes??0),0),f=Pn(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:Xc({sampledAt:e.sampledAt,ageMs:o,threshold:t,workerCount:a.length,measuredCount:d,unmeasured:l}),host:{worker_count:a.length,project_count:e.hostState.projects.length,ceiling:e.ceiling,consumption:f,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:f.memory_bytes/e.ceiling.memory_bytes},projects:Zc(a),known_projects:Yc(e.hostState),workers:a,repository_activity:hs({activity:e.repositoryActivity??null,now:e.now,stalenessMs:e.activityStalenessMs})}}function zc(e,t){let n=t.rss[e.worker_id],r=typeof n=="number"&&Number.isFinite(n)?n:null,o=ze(e),s=e.budget?.memory_max??e.budget?.memory_high??null,i=Cn(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:t.nowMs==null||i==null?null:Math.max(0,t.nowMs-i),state:t.state,isolated:e.isolated,unit:e.unit??null,warnings:[...e.warnings],vitals:{rss_bytes:r,sampled_at:r==null?null:t.sampledAt,age_ms:r==null?null:t.ageMs,fresh:r!=null&&t.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:Qc(t.log)}}function Qc(e){let t={last_line:null,published_at:null,source:null};return e==null||e.line.trim()===""?t:{last_line:e.line,published_at:e.published_at,source:e.source}}function Yc(e){let t=new Set;for(let n of e.registrations??[])t.add(n.project_label);for(let n of e.projects)t.add(n.project_label);return[...t].sort((n,r)=>n.localeCompare(r))}function Zc(e){let t=new Map;for(let n of e){let r=t.get(n.project_label)??{workers:0,declared:0,observed:0,measured:0};r.workers+=1,r.declared+=n.budget.bytes??0,r.observed+=n.vitals.rss_bytes??0,r.measured+=n.vitals.rss_bytes==null?0:1,t.set(n.project_label,r)}return[...t.entries()].map(([n,r])=>({project_label:n,worker_count:r.workers,declared_memory_bytes:r.declared,observed_rss_bytes:r.observed,measured_worker_count:r.measured})).sort((n,r)=>n.project_label.localeCompare(r.project_label))}function Xc(e){let t={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?{...t,stale:!1,reason:"the host holds no Workers, so there is nothing to measure and nothing to age"}:e.sampledAt==null||e.ageMs==null?{...t,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?{...t,stale:!0,reason:`this answer is stale: its measurement is ${e.ageMs}ms old, past the ${e.threshold}ms staleness window`}:{...t,stale:!1,reason:`measured ${e.ageMs}ms ago, within the ${e.threshold}ms staleness window`}}function Cn(e){let t=Date.parse(e);return Number.isFinite(t)?t:null}var vt=1;async function Qe(e,t){return await ft(e,t,"redskilled daemon")}function bs(e){if(e===null||typeof e!="object"||Array.isArray(e))return!1;let t=e;return t.version===1&&typeof t.line=="string"&&Array.isArray(t.lines)&&t.lines.every(n=>typeof n=="string")&&typeof t.verbose=="boolean"&&(t.mode==="local"||t.mode==="global")&&(t.project===null||typeof t.project=="string")&&typeof t.detail=="string"&&(t.project_match===void 0||typeof t.project_match=="string")&&typeof t.degraded=="boolean"&&typeof t.stale=="boolean"&&typeof t.generated_at=="string"}function _s(e){let t=[...e.workers??[]],n=new Map;for(let r of t)n.set(r.project_label,(n.get(r.project_label)??0)+1);return{version:1,protocol_version:vt,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:t,projects:[...n.entries()].map(([r,o])=>({project_label:r,worker_count:o})).sort((r,o)=>r.project_label.localeCompare(o.project_label)),registrations:tu(e),budget_accounting:Wo(t),upgrade:nu(e)}}function tu(e){let t=e.now==null?Number.NaN:Date.parse(e.now),n=Number.isFinite(t),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,...n?{renewal:as(s,t)}:{},...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 nu(e){let t=e.daemonVersion,n=e.published?.version??null,r=e.published?.majorHold??null;return{running_version:t,published_version:n,published_unknown:+(n===null),newer_published:+(e.published?.newer===!0),replacement:e.published?.replacement??"none",checked_at:e.published?.checkedAt??null,newest_published_version:e.published?.newest??null,major_held:+(r!==null),major_hold:r}}function vs(e){if(e===null||typeof e!="object"||Array.isArray(e))return!1;let t=e;return t.version===1&&typeof t.protocol_version=="number"&&typeof t.daemon_version=="string"&&typeof t.machine_id_hash=="string"&&typeof t.session_key_hash=="string"&&Number.isInteger(t.pid)&&typeof t.started_at=="string"&&Array.isArray(t.workers)&&Array.isArray(t.projects)&&Mo(t.budget_accounting)&&(t.scope===void 0||os(t.scope))&&(t.registrations===void 0||Array.isArray(t.registrations)&&t.registrations.every(Nn))&&(t.upgrade===void 0||ru(t.upgrade))}function ru(e){if(e===null||typeof e!="object"||Array.isArray(e))return!1;let t=e;return typeof t.running_version=="string"&&(t.published_version===null||typeof t.published_version=="string")&&typeof t.published_unknown=="number"&&typeof t.newer_published=="number"&&(t.replacement==="none"||t.replacement==="pending"||t.replacement==="in-progress")&&(t.checked_at===null||typeof t.checked_at=="string")&&(t.newest_published_version===void 0||t.newest_published_version===null||typeof t.newest_published_version=="string")&&(t.major_held===void 0||typeof t.major_held=="number")&&(t.major_hold===void 0||t.major_hold===null||ou(t.major_hold))}function ou(e){if(e===null||typeof e!="object"||Array.isArray(e))return!1;let t=e;return typeof t.version=="string"&&Number.isInteger(t.running_major)&&Number.isInteger(t.held_major)&&typeof t.reason=="string"&&typeof t.action=="string"&&t.action.trim()!==""}import{spawnSync as Et}from"node:child_process";import{existsSync as Jn}from"node:fs";import{delimiter as fu,join as As}from"node:path";import{join as xs}from"node:path";import{existsSync as su}from"node:fs";import{createRequire as iu}from"node:module";var Ss="redskilled-job-object.node",fe=100;function je(e){return{available:!1,reason:e}}function au(e,t,n){return[xs(n,"prebuilds",`${e}-${t}`,Ss),xs(n,"native","build","Release",Ss)]}function Es(e={}){let t=e.platform??process.platform,n=e.arch??process.arch;if(t!=="win32")return je(`Job Object placement is the Windows backend (platform=${t}), so there is no native reach to load here`);let r=e.packageRoot??du(),o=e.exists??su,s=au(t,n,r),i=s.find(d=>o(d));if(i==null)return je(`no Job Object addon was found for ${t}-${n} (looked in ${s.join(", ")}); either install the prebuild for this platform and architecture or build the addon locally`);let a=e.requireFn??iu(import.meta.url),l;try{l=a(i)}catch(d){return je(`the Job Object addon at ${i} could not be loaded: ${d instanceof Error?d.message:String(d)}`)}return lu(l)?{available:!0,binding:l}:je(`the Job Object addon at ${i} does not export createJobObject, so it cannot be the native reach`)}function lu(e){return typeof e=="object"&&e!=null&&typeof e.createJobObject=="function"}function du(){return new URL("..",import.meta.url).pathname}function js(e){let t=e??{},n=[],r=cu(t);r==null&&(t.memory_max??t.memory_high)!=null&&n.push("the declared memory budget could not be reduced to bytes, so the job carries no memory ceiling");let o;return t.cpu_weight!=null&&(t.cpu_weight<fe?o=Math.max(1,Math.min(100,Math.round(t.cpu_weight))):n.push(`cpu_weight=${t.cpu_weight} is at or above the fair share of ${fe}, 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,...n.length>0?{note:n.join("; ")}:{}}}function cu(e){return ze({budget:e})}var xt=5,Ps=19;function Un(e){return{available:!1,reason:e}}var uu="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 Ds(e,t){let n=e??{},r=[],o;if(!t.canRenice)r.push("nice is not on this host, so no priority control was applied and the Worker competes with interactive work");else if(n.cpu_weight==null)o=xt;else if(n.cpu_weight<fe){let a=Math.round(Ps*(fe-n.cpu_weight)/fe);o=Math.min(Ps,Math.max(xt,a))}else o=xt,r.push(`cpu_weight=${n.cpu_weight} is at or above the fair share of ${fe}, and raising a process's priority requires privilege this daemon does not have, so the Worker keeps the default yield of nice ${xt}`);let s=Os(n.max_processes);s==null&&n.max_processes!=null&&r.push(`max_processes=${n.max_processes} is not a positive whole number, so no ulimit -u is set`);let i=Os(n.cpu_seconds);return i==null&&n.cpu_seconds!=null&&r.push(`cpu_seconds=${n.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:uu,...r.length>0?{note:r.join("; ")}:{}}}function Ls(e){let{limits:t}=e,n=[];return t.max_processes!=null&&n.push(`ulimit -u ${t.max_processes}`),t.cpu_seconds!=null&&n.push(`ulimit -t ${t.cpu_seconds}`),n.push(t.nice!=null&&e.nice!=null?`exec ${pu(e.nice)} -n ${t.nice} "$0" "$@"`:'exec "$0" "$@"'),["-c",n.join(`
|
|
52
|
-
`),e.command,...e.args]}function
|
|
53
|
-
`).map(n=>n.trim().split(/\s+/)[0]??"").filter(n=>n.startsWith(`${e}-`)&&n.endsWith(".service"))}function
|
|
54
|
-
`),aliases:r}}function xu(e,t){let n=Ye(t),r=Ye(n.data),o=Array.isArray(n.errors)?n.errors.map(Ye):[],s=Eu(r.rateLimit,o);return{projects:e.aliases.map(({alias:a,project:l})=>{let d=Pu(r[a]);if(d!=null)return{project_label:l.project_label,outcome:"counted",depth:d,detail:`project ${JSON.stringify(l.project_label)} has ${d} item(s) matching its selector`};let u=o.find(f=>ju(f.path,a));return s.exhausted||Ys(u)?{project_label:l.project_label,outcome:"rate-limited",depth:null,detail:`the host token's quota was spent before project ${JSON.stringify(l.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:l.project_label,outcome:"unreachable",depth:null,detail:`project ${JSON.stringify(l.project_label)} could not be counted with the host token: ${Kn(u?.message)||"the query returned no count for this selector"}`}}),rate_limit:s}}function Su(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:[]}}async function zs(e){if(e.projects.length===0)return Su(e.now);let t=e.batchSize??50,n=_u(e.projects,t),r=[],o={remaining:null,reset_at:null,exhausted:!1};for(let s of n){let i=vu(s,{batchSize:t});try{let a=await e.transport(i.query),l=xu(i,a);r.push(...l.projects),o=Gs(o,l.rate_limit)}catch(a){let l=a instanceof Error?a.message:String(a),d=/rate limit|secondary rate|429/i.test(l);o=Gs(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: ${l}`})}}return{version:1,fetched_at:e.now,request_count:n.length,project_count:r.length,batch_size:t,rate_limit:o,projects:r}}function Qs(e){if(e.length===0)throw new Error("redskilled queue discovery needs at least one registered project");let t=new Set;for(let n of e){if(typeof n.project_label!="string"||n.project_label==="")throw new Error("redskilled queue discovery needs a project label for every registered project");if(typeof n.selector!="string"||n.selector==="")throw new Error(`redskilled queue discovery needs a selector for project ${JSON.stringify(n.project_label)}: a project that names no work has no queue to discover`);if(t.has(n.project_label))throw new Error(`redskilled holds one selector per project, and ${JSON.stringify(n.project_label)} is registered twice`);t.add(n.project_label)}}function Gs(e,t){return{remaining:t.remaining==null?e.remaining:e.remaining==null?t.remaining:Math.min(e.remaining,t.remaining),reset_at:t.reset_at??e.reset_at,exhausted:e.exhausted||t.exhausted}}function Eu(e,t){let n=Ye(e),r=typeof n.remaining=="number"&&Number.isFinite(n.remaining)?n.remaining:null,o=typeof n.resetAt=="string"?n.resetAt:null;return{remaining:r,reset_at:o,exhausted:t.some(Ys)||r===0}}function Ys(e){return e==null?!1:Kn(e.type)==="RATE_LIMITED"||/rate limit/i.test(Kn(e.message))}function ju(e,t){return Array.isArray(e)&&e.includes(t)}function Pu(e){let t=Ye(e);return Number.isInteger(t.issueCount)?t.issueCount:null}function Ye(e){return Ou(e)?e:{}}function Ou(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Kn(e){return typeof e=="string"?e:""}var D={mode:"local",project:null,maxWorkers:4,maxProjects:4,maxWidth:120,separator:" \xB7 ",verbose:!1};function Xs(e,t=D){let n=Nu(e,t),r=Au(e,t),o=Iu(e,t),s=Tu(e,t,r,n),i=Lu(t,r,o),a={detail:"host",line:s};for(let f of i){let p=Ju(s,$u(f,t,r,o),t.separator);if(a={detail:f,line:p},Bu(p)<=t.maxWidth)break}let l=qn(a.line,t.maxWidth),d=t.verbose&&a.detail==="workers"?Uu(r,t):[],u=r.length>0?"workers":"host";return{version:1,line:l,lines:[l,...d],verbose:t.verbose,mode:t.mode,project:t.project,project_match:n,detail:a.detail,degraded:a.detail!==u||l!==a.line,stale:e.staleness.stale,generated_at:e.generated_at}}function ei(e){let t=e.options??D,n=qn(Du,t.maxWidth);return{version:1,line:n,lines:[n],verbose:t.verbose,mode:t.mode,project:t.project,project_match:"unanswered",detail:"host",degraded:!0,stale:!0,generated_at:e.generated_at}}var Du="redskilled unreachable \u2014 Worker state unknown";function Lu(e,t,n){let r=[];return t.length>0&&t.length<=e.maxWorkers&&r.push("workers"),e.mode==="global"&&n.length>0&&n.length<=e.maxProjects&&r.push("projects"),r.push("host"),r}function $u(e,t,n,r){return e==="workers"?n.map(o=>Cu(o,t)):e==="projects"?r.map(Vu):[]}function Au(e,t){return t.mode==="global"?e.workers:t.project==null?[]:e.workers.filter(n=>n.project_label===t.project)}function Iu(e,t){return t.mode==="global"?e.projects:e.projects.filter(n=>n.project_label===t.project)}function Nu(e,t){return t.project==null?"unresolved":e.known_projects==null||e.known_projects.includes(t.project)?"matched":"unregistered"}function Tu(e,t,n,r){let o=[];return t.mode==="global"?(o.push(`host ${e.host.worker_count}w/${e.host.project_count}p`),o.push(Zs(e,t))):r==="matched"?(o.push(`${t.project} ${n.length}w`),o.push(Zs(e,t)),n.length===0&&o.push("idle")):o.push(Wu(t.project,r)),e.staleness.stale&&o.push(Mu(e)),o.join(" ")}function Wu(e,t){return t==="unregistered"?`project unknown \u2014 ${e} is not registered on this host`:"project unknown \u2014 this directory resolved to no project"}function Zs(e,t){let n=t.mode==="global"?e.host.observed_rss_bytes:e.projects.filter(o=>o.project_label===t.project).reduce((o,s)=>o+s.observed_rss_bytes,0),r=e.host.ceiling.memory_bytes;return t.mode==="global"&&r!=null&&r>0?`${me(n)}/${me(r)}`:me(n)}function Mu(e){let t=e.staleness.age_ms;return t==null?"!unmeasured":`!stale ${Math.round(t/1e3)}s`}function Cu(e,t){let n=ti(e,t),r=e.vitals.rss_bytes,o=r==null?"?":e.budget.bytes==null?me(r):`${me(r)}/${me(e.budget.bytes)}`;return`${n} ${o}`}function Uu(e,t){let n=[];for(let r of e){let o=Hu(r.log.last_line);o!=null&&n.push(qn(` ${Fu} ${ti(r,t)}: ${o}`,t.maxWidth))}return n}var Fu="\u21B3";function Hu(e){if(e==null)return null;let t=e.replace(/[\u0000-\u001f\u007f]+/g," ").replace(/\s+/g," ").trim();return t===""?null:t}function ti(e,t){return t.mode==="global"?`${e.project_label}:${e.worker_id}`:e.worker_id}function Vu(e){return`${e.project_label} ${e.worker_count}w ${me(e.observed_rss_bytes)}`}function Ju(e,t,n){return[e,...t].join(n)}function Bu(e){return[...e].length}function qn(e,t){if(t<=0)return"";let n=[...e];return n.length<=t?e:t===1?"\u2026":`${n.slice(0,t-1).join("")}\u2026`}function me(e){if(!Number.isFinite(e)||e<=0)return"0B";let t=["B","K","M","G","T"],n=e,r=0;for(;n>=1024&&r<t.length-1;)n/=1024,r+=1;return`${n>=100||r===0?Math.round(n).toString():n.toFixed(1).replace(/\.0$/,"")}${t[r]}`}import{randomUUID as ni}from"node:crypto";import{spawn as Ku}from"node:child_process";import{closeSync as qu,mkdirSync as Gu,openSync as zu}from"node:fs";import{dirname as Qu}from"node:path";var Ze=class extends Error{constructor(t){super(t),this.name="RedskilledWorkerSpecError"}},jt=class extends Error{constructor(n,r){super(n);this.admission=r;this.name="RedskilledAdmissionError"}};function Yu(e){if(e==null||e.trim()==="")return null;try{return Gu(Qu(e),{recursive:!0}),zu(e,"a")}catch{return null}}function Zu(e){try{qu(e)}catch{}}function Xu(e){let t=[["project_label",e.project_label],["workspace_path",e.workspace_path],["command",e.command]];for(let[n,r]of t)if(typeof r!="string"||r.trim()==="")throw new Ze(`redskilled worker spec is missing ${n}`);if(e.args!=null&&!Array.isArray(e.args))throw new Ze("redskilled worker spec args must be an array")}function ep(e){if(e==null)throw new jt("redskilled refused this Worker: no host admission verdict was handed over, and an unjudged birth is an unbudgeted one");if(!e.admitted)throw new jt(e.reason,e)}function oi(e){let{spec:t,admission:n}=e;ep(n),Xu(t);let r=e.env??process.env,o=e.clock??(()=>new Date().toISOString()),s=(t.worker_id??e.workerId??ni()).trim()||ni(),i=e.probes??Ns(r),a=e.openLog===!1?null:Yu(t.log_path),l=Ms({workerId:s,projectLabel:t.project_label,workspacePath:t.workspace_path,command:t.command,args:t.args,budget:t.budget,target:t.placement,env:t.env,enabled:e.enabled??Ts(r),probes:i,pipeOutput:a!==null}),u=(e.spawnFn??Ku)(l.command,l.args,{...l.cwd!=null?{cwd:l.cwd}:{},detached:!0,stdio:a===null?"ignore":["ignore",a,a],env:l.isolated?{...r}:{...r,...t.env??{}}});if(a!==null&&Zu(a),u.pid==null)throw u.once("error",()=>{}),new Ze(`redskilled could not spawn ${JSON.stringify(l.command)} for worker ${s}`);let f=l.job!=null?tp(l,i,u.pid):null;u.once("error",()=>{}),u.once("exit",(R,w)=>{try{f?.job?.close()}catch{}e.onExit?.(s,R,w)}),u.unref();let p=l.job!=null?f?.job!=null:l.isolated,h=[l.warning,f?.warning,l.budgetWarning].filter(R=>R!=null);return{worker:{worker_id:s,project_label:t.project_label,pid:u.pid,started_at:o(),workspace_path:t.workspace_path,...t.log_path!=null?{log_path:t.log_path}:{},isolated:p,...l.unit!=null?{unit:l.unit}:{},...t.budget!=null?{budget:t.budget}:{},warnings:h},admission:n,warnings:h,plan:l,child:u,...f?.job!=null?{job:f.job}:{}}}function tp(e,t,n){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(!t.jobObjects.available)return{warning:`Job Object placement unavailable: ${t.jobObjects.reason}. ${o}`};let s;try{s=t.jobObjects.binding.createJobObject({name:r.name,limits:r.limits})}catch(i){return{warning:`Job Object ${JSON.stringify(r.name)} could not be created: ${ri(i)}. ${o}`}}try{s.assign(n)}catch(i){try{s.close()}catch{}return{warning:`Worker pid ${n} could not be assigned to Job Object ${JSON.stringify(r.name)}: ${ri(i)}. ${o}`}}return{job:s}}function ri(e){return e instanceof Error?e.message:String(e)}import{open as np,stat as rp}from"node:fs/promises";var op=16*1024;async function si(e,t=op){let n;try{n=(await rp(e)).size}catch{return null}if(n<=0)return null;let r=Math.min(t,n),o;try{let s=await np(e,"r");try{let i=Buffer.alloc(r);await s.read(i,0,r,n-r),o=i.toString("utf8")}finally{await s.close()}}catch{return null}return sp(o)}function sp(e){let t=e.split(`
|
|
55
|
-
`);for(let n=t.length-1;n>=0;n-=1){let r=t[n].replace(/\r$/,"");if(r.trim()!=="")return r}return null}import{spawn as
|
|
56
|
-
`)}function
|
|
48
|
+
`).filter(Oc).map(Dc)}function os(e){let t=new Map;for(let n of e)n.event!=="daemon-stop"&&(n.event==="worker-birth"?t.set(n.worker_id,jc(n)):t.delete(n.worker_id));return[...t.values()]}function jc(e){let t={...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(t).length>0?{budget:t}:{},warnings:[]}}function Pc(e){return{...e}}function Oc(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 Dc(e){return{version:1,ts:String(e.ts),event:e.event,worker_id:String(e.worker_id),project_label:ee(e.project_label)??"",pid:Number(e.pid??0),workspace_path:ee(e.workspace_path)??"",log_path:ee(e.log_path),isolated:e.isolated===!0||e.isolated==="true",unit:ee(e.unit),memory_high:ee(e.memory_high),memory_max:ee(e.memory_max),cpu_weight:e.cpu_weight==null||e.cpu_weight===""?null:Number(e.cpu_weight),detail:ee(e.detail),exit_code:e.exit_code==null||e.exit_code===""?null:Number(e.exit_code),signal:ee(e.signal),reason:ee(e.reason)}}function ee(e){return e==null||e===""?null:String(e)}function ss(e){let t=[...e.projects].sort((i,l)=>i.project_label.localeCompare(l.project_label)),n=e.backoffUntilMs??null,r=n!=null&&e.nowMs<n,o=[],s=[];for(let i of t){let l=Math.max(0,e.live[i.project_label]??0),a=Object.prototype.hasOwnProperty.call(e.queue,i.project_label),c=a?e.queue[i.project_label]??null:null,u={project_label:i.project_label,queue_depth:c,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(n).toISOString()}`});continue}if(c==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(c===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 f=Math.max(0,Math.min(Math.max(0,i.target),c)-l);if(f===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 ${c}, so it asks for none`});continue}o.push({...u,outcome:"asking",wanted:f,detail:`project ${JSON.stringify(i.project_label)} holds ${l} Worker(s) against a target of ${i.target} and a queue of ${c}, so it asks for ${f} more`});for(let p=0;p<f;p+=1)(s[p]??(s[p]=[])).push({project_label:i.project_label,index:l+p,argv:i.argv,workspace_path:i.workspace_path})}return{intents:o,births:s.flat()}}function is(e){return{version:1,at:e,requested:0,granted:[],shortfall:0,refusal:null,retry_after:null,projects:[]}}function as(e){let t=e.workers.map(Lc),n=[...new Set([...t.map(o=>o.project_label),...e.projects??[]])].filter(o=>o!=="").sort(),r=t.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:t,projects:n},surviving:r,detail:Ac({reason:e.reason,socketPath:e.socketPath,daemonVersion:e.daemonVersion,pid:e.pid,held:t.length,projects:n.length,surviving:r.length})}}function ds(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 Lc(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 $c(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 Ac(e){let t=`stopping the redskilled daemon (pid ${e.pid}, version ${e.daemonVersion}) on ${JSON.stringify(e.socketPath)}: ${$c(e.reason)}`;return e.held===0?`${t}; it holds no Workers, so nothing survives the stop`:`${t}; it holds ${ls(e.held,"Worker")} across ${ls(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 ls(e,t){return`${e} ${t}${e===1?"":"s"}`}function Wn(e){if(e===null||typeof e!="object"||Array.isArray(e))return!1;let t=e,n=t.holding;return t.version===1&&typeof t.running=="boolean"&&typeof t.stopped=="boolean"&&typeof t.reason=="string"&&typeof t.socket_path=="string"&&typeof t.detail=="string"&&(t.daemon_version===null||typeof t.daemon_version=="string")&&(t.pid===null||typeof t.pid=="number")&&n!=null&&Array.isArray(n.workers)&&Array.isArray(n.projects)&&Array.isArray(t.surviving)}import{chmod as Ic,mkdir as Tc,readFile as Nc,rm as Wc,writeFile as Mc}from"node:fs/promises";import{dirname as cs,join as ms}from"node:path";import{tmpdir as us}from"node:os";var Cc="redskilled.machine.claim.toon",Uc="REDSKILLED_MACHINE_DIR",Fc=8,le=class extends Error{constructor(n,r,o){super(Vc(n,r,o));this.claimPath=n;this.reason=r;this.claim=o;this.name="RedskilledMachineHeldError"}},ps;function gs(){return ps??={pid:process.pid,startTime:new Date(Date.now()-Math.round(process.uptime()*1e3)).toISOString(),uid:typeof process.getuid=="function"?process.getuid():-1},ps}function Hc(e={machineIdHash:"unknown"}){let t=e.env??process.env,n=t[Uc]?.trim();if(n)return n;let o=(e.platform??process.platform)==="win32"?t.PROGRAMDATA?.trim()||us():us();return ms(o,`redskilled-${e.machineIdHash}`)}function xt(e){return ms(Hc(e),Cc)}function Et(e,t,n={}){let r=n.clock??(()=>new Date().toISOString()),o=n.isPidAlive??N;async function s(){let a;try{a=await Nc(e,"utf8")}catch(u){if(u.code==="ENOENT"||Mn(u))return;throw u}let c=Jc(a);return Kc(c)?c:void 0}function i(a,c){return{version:1,scope:"machine",pid:a.pid,start_time:a.startTime,uid:a.uid,machine_id_hash:t.machineIdHash,session_key_hash:t.sessionKeyHash,socket_path:t.socketPath,acquired_at:c,renewed_at:c}}async function l(){try{return await Wc(e,{force:!0}),!0}catch(a){if(Mn(a))return!1;throw a}}return{claimPath:e,read:s,async claim(a){await Tc(cs(e),{recursive:!0,mode:1023})!=null&&await Ic(cs(e),1023).catch(()=>{});let u=!1;for(let f=0;f<Fc;f+=1){let p=i(a,r());try{return await Mc(e,Bc(p),{encoding:"utf8",mode:420,flag:"wx"}),{claimed:!0,reaped:u,claim:p}}catch(y){if(y.code!=="EEXIST"){if(Mn(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(fs(h,a,t.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 c=await s();return!c||!fs(c,a,t.socketPath)?!1:await l()}}}function hs(e,t,n){return{kind:"machine",claim_path:e,owner_uid:n.uid,machine_id_hash:t.machineIdHash,session_key_hash:t.sessionKeyHash,socket_path:t.socketPath}}function ys(e){if(e===null||typeof e!="object"||Array.isArray(e))return!1;let t=e;return t.kind==="machine"&&typeof t.claim_path=="string"&&typeof t.owner_uid=="number"&&typeof t.machine_id_hash=="string"&&typeof t.session_key_hash=="string"&&typeof t.socket_path=="string"}function Vc(e,t,n){let r=n==null?"":` \u2014 held by pid ${n.pid} (uid ${n.uid}) on socket ${JSON.stringify(n.socket_path)}`;return t==="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.`:t==="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 Mn(e){let t=e?.code;return t==="EACCES"||t==="EPERM"||t==="EROFS"}function fs(e,t,n){return e.pid===t.pid&&e.start_time===t.startTime&&e.socket_path===n}function Bc(e){return`${I(e,{keyedMapCollapse:!0})}
|
|
49
|
+
`}function Jc(e){let t=e.trim();if(!t)return null;try{return JSON.parse(t)}catch{try{return K(t)}catch{return null}}}function Kc(e){if(e===null||typeof e!="object"||Array.isArray(e))return!1;let t=e;if(t.version!==1||t.scope!=="machine"||!Number.isInteger(t.pid)||t.pid<=0||!Number.isInteger(t.uid))return!1;for(let n of["start_time","machine_id_hash","session_key_hash","socket_path","acquired_at","renewed_at"])if(typeof t[n]!="string"||t[n].length===0)return!1;return!0}function Cn(e,t){if(!Array.isArray(e)||e.length===0)throw new Error(`redskilled needs an argv to register project ${JSON.stringify(t)}: a registration with nothing to run is a project the host could never start a Worker for`);return e.map((n,r)=>{if(typeof n!="string"||n==="")throw new Error(`redskilled needs every word of an argv to be a non-empty string, and word ${r} of project ${JSON.stringify(t)} is not`);return n})}function Un(e,t){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(t)}, not ${JSON.stringify(e)}`);let n={};for(let[r,o]of Object.entries(e)){if(r==="")throw new Error(`redskilled needs every launch env name of project ${JSON.stringify(t)} 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(t)} is ${JSON.stringify(o)}`);n[r]=o}return n}var qc=3e5,Gc=.5,Hn=class extends Error{constructor(n){super(`redskilled already holds a registration for project ${JSON.stringify(n.project_label)}, registered at ${n.registered_at} for a target of ${n.target} and standing until ${n.renew_by}: a project contributes one registration, so a second one is refused rather than silently replacing the first`);this.held=n;this.name="RedskilledProjectRegisteredError"}};function ks(e,t){if(t.held!=null)throw new Hn(t.held);let n=Fn(e.project_label,"a project label"),r=Fn(e.selector,"a selector"),o=Cn(e.argv,n),s=Un(e.env,n),i=Fn(e.workspace_path,`a workspace path for project ${JSON.stringify(n)}`);if(!Number.isInteger(e.target)||e.target<0)throw new Error(`redskilled needs a whole, non-negative target to register project ${JSON.stringify(n)}, not ${JSON.stringify(e.target)}`);let l=e.renew_within_ms??qc;if(!Number.isFinite(l)||l<=0)throw new Error(`redskilled needs a positive renewal window to register project ${JSON.stringify(n)}, not ${JSON.stringify(e.renew_within_ms)}: a registration that lapses on arrival is a poll nobody asked for`);let a=Date.parse(t.now);if(!Number.isFinite(a))throw new Error(`redskilled needs an instant to date a registration, not ${JSON.stringify(t.now)}`);return{version:1,project_label:n,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 jt=class extends Error{constructor(n){super(`redskilled holds no registration for project ${JSON.stringify(n)} 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=n;this.name="RedskilledProjectUnregisteredError"}};function Rs(e,t){let n=Date.parse(t.now);if(!Number.isFinite(n))throw new Error(`redskilled needs an instant to date a renewal, not ${JSON.stringify(t.now)}`);let r=t.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(t.renew_within_ms)}`);let o=t.launch==null?{env:e.env??{},launch_revision:e.launch_revision??0}:{argv:Cn(t.launch.argv,e.project_label),env:Un(t.launch.env,e.project_label),launch_revision:(e.launch_revision??0)+1};return{...e,...o,renew_within_ms:r,renewed_at:new Date(n).toISOString(),renew_by:new Date(n+r).toISOString(),renewals:e.renewals+1}}function ws(e,t){let n=Date.parse(t.now);if(!Number.isFinite(n))throw new Error(`redskilled needs an instant to sustain a registration, not ${JSON.stringify(t.now)}`);let r=JSON.stringify(e.project_label),o=Math.max(0,t.liveWorkers??0),s=t.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(n+e.renew_within_ms).toISOString(),sustained_at:new Date(n).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 zc(e,t){let n=Date.parse(e.renew_by);return Number.isFinite(n)?t>=n:!1}function bs(e,t){let n=Date.parse(e.renewed_at??e.registered_at),r=s=>Number.isFinite(s)&&t-s<=e.renew_within_ms*Gc;if(r(n))return"renewing";let o=e.sustained_at==null?Number.NaN:Date.parse(e.sustained_at);return r(o)?"self-renewing":"running-on"}function _s(e,t){let n=[],r=[];for(let o of e)(zc(o,t)?r:n).push(o);return{standing:n,lapsed:r}}function Vn(e){if(e===null||typeof e!="object"||Array.isArray(e))return!1;let t=e;return t.version===1&&typeof t.project_label=="string"&&typeof t.selector=="string"&&Array.isArray(t.argv)&&t.argv.every(n=>typeof n=="string")&&typeof t.workspace_path=="string"&&Number.isInteger(t.target)&&typeof t.registered_at=="string"&&typeof t.renew_within_ms=="number"&&typeof t.renew_by=="string"&&(t.renewed_at===void 0||typeof t.renewed_at=="string")&&(t.renewals===void 0||Number.isInteger(t.renewals))&&(t.env===void 0||Qc(t.env))&&(t.launch_revision===void 0||Number.isInteger(t.launch_revision))&&(t.sustained_at===void 0||typeof t.sustained_at=="string")&&(t.sustains===void 0||Number.isInteger(t.sustains))&&(t.sustained_by===void 0||t.sustained_by==="open-work"||t.sustained_by==="live-worker")}function Qc(e){return e===null||typeof e!="object"||Array.isArray(e)?!1:Object.values(e).every(t=>typeof t=="string")}function Fn(e,t){if(typeof e!="string"||e==="")throw new Error(`redskilled needs ${t} to register a project, not ${JSON.stringify(e)}`);return e}var Yc={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 vs(e){return`worker-${e}`}function Ss(e){let t=Yc[e.op]??"project-write",n=e.sessionProject??null,r=e.targetProject??null,o={version:1,op:e.op,reach:t,session_project:n,target_project:r};return t==="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`}:t==="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`}:n==null||n===""?{...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===n?{...o,permitted:!0,verdict:"permitted-own-project",reason:`redskilled permitted ${e.op}: the target belongs to project ${JSON.stringify(n)}, 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(n)}: ${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 Zc}from"node:child_process";import{readFileSync as Xc,readdirSync as eu}from"node:fs";import{join as tu}from"node:path";function Ze(e){let t=e.budget??{},n=[["MemoryMax",t.memory_max],["MemoryHigh",t.memory_high]];for(let[r,o]of n){if(o==null)continue;let s=je(o);return s==null?null:{name:r,declared:o,bytes:s}}return null}function xs(e){let t=[],n=[];for(let r of e.workers){let o=Ze(r);if(o==null){n.push({worker_id:r.worker_id,reason:(r.budget?.memory_max??r.budget?.memory_high)==null?"this Worker declared no memory budget, so the sampler has no ceiling 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)){n.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||t.push(nu(r,o,s))}return{terminations:t,unenforceable:n}}function nu(e,t,n){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:t.name,budget_declared:t.declared,budget_bytes:t.bytes,observed_rss_bytes:n,workspace_path:e.workspace_path,reason:`redskilled terminated ${r}: its tree RSS of ${n} bytes exceeded its ${t.name} budget of ${t.declared} (${t.bytes} bytes). This is a budget termination, not a stall, and the work in ${JSON.stringify(e.workspace_path)} is handed forward.`}}var ru=4096;function Es(e,t={}){let n=t.platform??process.platform,r={rss:{},cpu_seconds:{}};if(e.length===0)return r;let o=ou(n,t);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,f=[a.pid],p=new Set;for(;f.length>0;){let h=f.pop();if(p.has(h))continue;p.add(h);let y=o.get(h);if(y){c+=y.rssBytes,u+=y.cpuSeconds;for(let w of s.get(h)??[])f.push(w)}}i[a.worker_id]=c,l[a.worker_id]=u}return{rss:i,cpu_seconds:l}}function ou(e,t){return t.procRoot!=null||e==="linux"?cu(t.procRoot??"/proc"):t.psTable!=null||e==="darwin"?au(su(t.psTable)):new Map}function su(e){try{return(e??iu)()}catch{return""}}function iu(){return Zc("ps",["-axo","pid=,ppid=,rss=,time="],{encoding:"utf8",maxBuffer:16*1024*1024})}var lu=1024;function au(e){let t=new Map;for(let n of e.split(`
|
|
50
|
+
`)){let r=n.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=du(r[3]);l!=null&&t.set(o,{pid:o,ppid:s,rssBytes:i*lu,cpuSeconds:l})}return t}function du(e){let t=e.indexOf("-"),n=t<0?0:Number(e.slice(0,t));if(!Number.isFinite(n)||n<0)return null;let r=e.slice(t+1).split(":"),o=n*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 cu(e){let t=new Map,n;try{n=eu(e)}catch{return t}for(let r of n){if(!/^\d+$/.test(r))continue;let o;try{o=Xc(tu(e,r,"stat"),"utf8")}catch{continue}let s=pu(o);s&&t.set(s.pid,{pid:s.pid,ppid:s.ppid,rssBytes:s.rssPages*ru,cpuSeconds:s.cpuTicks/uu})}return t}var uu=100;function pu(e){let t=e.lastIndexOf(")");if(t<0)return null;let n=Number(e.slice(0,e.indexOf(" "))),r=e.slice(t+1).trim().split(/\s+/),o=Number(r[1]),s=Number(r[11]),i=Number(r[12]),l=Number(r[21]);return!Number.isSafeInteger(n)||!Number.isSafeInteger(o)||!Number.isFinite(l)||!Number.isFinite(s)||!Number.isFinite(i)?null:{pid:n,ppid:o,rssPages:Math.max(0,l),cpuTicks:Math.max(0,s)+Math.max(0,i)}}var Bn=class extends Error{constructor(n,r,o){super(`redskilled polls every repository with one host token ${JSON.stringify(o)}, and project ${JSON.stringify(n)} 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=n;this.tokenRef=r;this.hostTokenRef=o;this.name="RedskilledSplitCredentialError"}};function Kn(e,t){for(let n of e)if(n.token_ref!=null&&n.token_ref!==t)throw new Bn(n.project_label,n.token_ref,t)}function fu(e,t={now:new Date(0).toISOString()}){hu(e);let n=t.closedWindowMs??6048e5,r=Date.parse(t.now);if(!Number.isFinite(r))throw new Error(`redskilled activity fetch needs an instant, not ${JSON.stringify(t.now)}`);let o=new Date(r-Math.max(0,n)).toISOString(),s=e.map((a,c)=>({alias:`r${c}`,search_alias:`c${c}`,project:a}));return{query:["query RedskilledRepositoryActivity {"," rateLimit { remaining resetAt }",...s.flatMap(({alias:a,search_alias:c,project:u})=>{let f=JSON.stringify(u.owner),p=JSON.stringify(u.name),h=JSON.stringify(`repo:${u.owner}/${u.name} is:closed closed:>=${o}`);return[` ${a}: repository(owner: ${f}, name: ${p}) {`," nameWithOwner"," open_pull_requests: pullRequests(states: OPEN) { totalCount }"," open_issues: issues(states: OPEN) { totalCount }"," }",` ${c}: search(query: ${h}, type: ISSUE, first: 1) { issueCount }`]}),"}"].join(`
|
|
51
|
+
`),aliases:s,closed_since:o}}function mu(e,t,n){let r=Pe(t),o=Pe(r.data),s=Array.isArray(r.errors)?r.errors.map(Pe):[],i=yu(o.rateLimit,s),l=e.aliases.map(({alias:a,search_alias:c,project:u})=>{let f=u.owner+"/"+u.name,p=o[a],h=s.find(y=>js(y.path,a)||js(y.path,c));if(As(p)){let y=Ps(p.open_pull_requests),w=Ps(p.open_issues),b=ku(o[c]);if(y!=null&&w!=null&&b!=null)return{project_label:u.project_label,repository:f,outcome:"counted",counts:{open_pull_requests:y,open_issues:w,recently_closed:b},detail:`counted ${f} for project ${JSON.stringify(u.project_label)}`}}return i.exhausted||$s(h)?{project_label:u.project_label,repository:f,outcome:"rate-limited",counts:null,detail:`the host token's quota was spent before ${f} 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:f,outcome:"unreachable",counts:null,detail:`${f} is not reachable with the host token: ${Jn(h?.message)||"the query returned no such repository"}`}});return{version:1,fetched_at:n.fetchedAt,request_count:1,project_count:l.length,rate_limit:i,projects:l}}function gu(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 Os(e){if(e.projects.length===0)return gu(e.now);Kn(e.projects,e.hostTokenRef);let t=fu(e.projects,{now:e.now,closedWindowMs:e.closedWindowMs});try{let n=await e.transport(t.query);return mu(t,n,{fetchedAt:e.now})}catch(n){let r=n instanceof Error?n.message:String(n),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 Ds(e){let t=e.stalenessMs??12e4,n=e.activity;if(n==null)return{version:1,fetched_at:null,age_ms:null,threshold_ms:t,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(n.fetched_at),s=Number.isFinite(r)&&Number.isFinite(o)?Math.max(0,r-o):null,i=s==null||s>t;return{version:1,fetched_at:n.fetched_at,age_ms:s,threshold_ms:t,stale:n.projects.length>0&&i,request_count:n.request_count,rate_limit:n.rate_limit,projects:n.projects.map(l=>({...l,fetched_at:n.fetched_at,age_ms:s,stale:i})),reason:n.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 ${t}ms window`:`fetched ${s}ms ago, within the ${t}ms window`}}function Ls(e){let t=e.endpoint??"https://api.github.com/graphql",n=e.fetchImpl??fetch;return async r=>{let o=await n(t,{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 hu(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 t=new Set;for(let n of e){if(n.project_label===""||n.owner===""||n.name==="")throw new Error("redskilled activity fetch needs a project label and an owner/name for every registered project");if(t.has(n.project_label))throw new Error(`redskilled holds one repository per project, and ${JSON.stringify(n.project_label)} is registered twice`);t.add(n.project_label)}}function yu(e,t){let n=Pe(e),r=typeof n.remaining=="number"&&Number.isFinite(n.remaining)?n.remaining:null,o=typeof n.resetAt=="string"?n.resetAt:null,s=t.some($s);return{remaining:r,reset_at:o,exhausted:s||r===0}}function $s(e){if(e==null)return!1;let t=Jn(e.type),n=Jn(e.message);return t==="RATE_LIMITED"||/rate limit/i.test(n)}function js(e,t){return Array.isArray(e)&&e.includes(t)}function Ps(e){let t=Pe(e);return Number.isInteger(t.totalCount)?t.totalCount:null}function ku(e){let t=Pe(e);return Number.isInteger(t.issueCount)?t.issueCount:null}function Pe(e){return As(e)?e:{}}function As(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Jn(e){return typeof e=="string"?e:""}var Ru=3e4;function Is(e){let t=e.stalenessMs??Ru,n=qn(e.now),r=e.sampledAt==null?null:qn(e.sampledAt),o=n==null||r==null?null:Math.max(0,n-r),s=o!=null&&o<=t,i=new Set(e.reattachedWorkerIds??[]),l=e.hostState.workers.map(p=>wu(p,{rss:e.rss,sampledAt:e.sampledAt,ageMs:o,sampleFresh:s,nowMs:n,log:e.logLines?.[p.worker_id],state:i.has(p.worker_id)?"reattached":"running"})),a=l.filter(p=>p.vitals.rss_bytes==null).map(p=>p.worker_id).sort(),c=l.length-a.length,u=l.reduce((p,h)=>p+(h.vitals.rss_bytes??0),0),f=Nn(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:Su({sampledAt:e.sampledAt,ageMs:o,threshold:t,workerCount:l.length,measuredCount:c,unmeasured:a}),host:{worker_count:l.length,project_count:e.hostState.projects.length,ceiling:e.ceiling,consumption:f,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:f.memory_bytes/e.ceiling.memory_bytes},projects:vu(l),known_projects:_u(e.hostState),registered_projects:(e.hostState.registrations??[]).map(p=>p.project_label).sort((p,h)=>p.localeCompare(h)),workers:l,repository_activity:Ds({activity:e.repositoryActivity??null,now:e.now,stalenessMs:e.activityStalenessMs})}}function wu(e,t){let n=t.rss[e.worker_id],r=typeof n=="number"&&Number.isFinite(n)?n:null,o=Ze(e),s=e.budget?.memory_max??e.budget?.memory_high??null,i=qn(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:t.nowMs==null||i==null?null:Math.max(0,t.nowMs-i),state:t.state,isolated:e.isolated,unit:e.unit??null,warnings:[...e.warnings],vitals:{rss_bytes:r,sampled_at:r==null?null:t.sampledAt,age_ms:r==null?null:t.ageMs,fresh:r!=null&&t.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:bu(t.log)}}function bu(e){let t={last_line:null,published_at:null,source:null};return e==null||e.line.trim()===""?t:{last_line:e.line,published_at:e.published_at,source:e.source}}function _u(e){let t=new Set;for(let n of e.registrations??[])t.add(n.project_label);for(let n of e.projects)t.add(n.project_label);return[...t].sort((n,r)=>n.localeCompare(r))}function vu(e){let t=new Map;for(let n of e){let r=t.get(n.project_label)??{workers:0,declared:0,observed:0,measured:0};r.workers+=1,r.declared+=n.budget.bytes??0,r.observed+=n.vitals.rss_bytes??0,r.measured+=n.vitals.rss_bytes==null?0:1,t.set(n.project_label,r)}return[...t.entries()].map(([n,r])=>({project_label:n,worker_count:r.workers,declared_memory_bytes:r.declared,observed_rss_bytes:r.observed,measured_worker_count:r.measured})).sort((n,r)=>n.project_label.localeCompare(r.project_label))}function Su(e){let t={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?{...t,stale:!1,reason:"the host holds no Workers, so there is nothing to measure and nothing to age"}:e.sampledAt==null||e.ageMs==null?{...t,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?{...t,stale:!0,reason:`this answer is stale: its measurement is ${e.ageMs}ms old, past the ${e.threshold}ms staleness window`}:{...t,stale:!1,reason:`measured ${e.ageMs}ms ago, within the ${e.threshold}ms staleness window`}}function qn(e){let t=Date.parse(e);return Number.isFinite(t)?t:null}var Pt=1;async function Xe(e,t){return await kt(e,t,"redskilled daemon")}function Ts(e){if(e===null||typeof e!="object"||Array.isArray(e))return!1;let t=e;return t.version===1&&typeof t.line=="string"&&Array.isArray(t.lines)&&t.lines.every(n=>typeof n=="string")&&typeof t.verbose=="boolean"&&(t.mode==="local"||t.mode==="global")&&(t.project===null||typeof t.project=="string")&&typeof t.detail=="string"&&(t.project_match===void 0||typeof t.project_match=="string")&&typeof t.degraded=="boolean"&&typeof t.stale=="boolean"&&typeof t.generated_at=="string"}function Ns(e){let t=[...e.workers??[]],n=new Map;for(let r of t)n.set(r.project_label,(n.get(r.project_label)??0)+1);return{version:1,protocol_version:Pt,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:t,projects:[...n.entries()].map(([r,o])=>({project_label:r,worker_count:o})).sort((r,o)=>r.project_label.localeCompare(o.project_label)),registrations:Eu(e),...e.lapses==null||e.lapses.length===0?{}:{lapsed_registrations:[...e.lapses]},budget_accounting:Qo(t),upgrade:ju(e)}}function Eu(e){let t=e.now==null?Number.NaN:Date.parse(e.now),n=Number.isFinite(t),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,...n?{renewal:bs(s,t)}:{},...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 ju(e){let t=e.daemonVersion,n=e.published?.version??null,r=e.published?.majorHold??null;return{running_version:t,published_version:n,published_unknown:+(n===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 Ws(e){if(e===null||typeof e!="object"||Array.isArray(e))return!1;let t=e;return t.version===1&&typeof t.protocol_version=="number"&&typeof t.daemon_version=="string"&&typeof t.machine_id_hash=="string"&&typeof t.session_key_hash=="string"&&Number.isInteger(t.pid)&&typeof t.started_at=="string"&&Array.isArray(t.workers)&&Array.isArray(t.projects)&&Yo(t.budget_accounting)&&(t.scope===void 0||ys(t.scope))&&(t.registrations===void 0||Array.isArray(t.registrations)&&t.registrations.every(Vn))&&(t.upgrade===void 0||Pu(t.upgrade))}function Pu(e){if(e===null||typeof e!="object"||Array.isArray(e))return!1;let t=e;return typeof t.running_version=="string"&&(t.published_version===null||typeof t.published_version=="string")&&typeof t.published_unknown=="number"&&typeof t.newer_published=="number"&&(t.replacement==="none"||t.replacement==="pending"||t.replacement==="in-progress")&&(t.checked_at===null||typeof t.checked_at=="string")&&(t.newest_published_version===void 0||t.newest_published_version===null||typeof t.newest_published_version=="string")&&(t.major_held===void 0||typeof t.major_held=="number")&&(t.checks===void 0||typeof t.checks=="number")&&(t.hold_reason===void 0||t.hold_reason===null||typeof t.hold_reason=="string")&&(t.major_hold===void 0||t.major_hold===null||Ou(t.major_hold))}function Ou(e){if(e===null||typeof e!="object"||Array.isArray(e))return!1;let t=e;return typeof t.version=="string"&&Number.isInteger(t.running_major)&&Number.isInteger(t.held_major)&&typeof t.reason=="string"&&typeof t.action=="string"&&t.action.trim()!==""}import{spawnSync as Lt}from"node:child_process";import{existsSync as Zn}from"node:fs";import{delimiter as Mu,join as qs}from"node:path";import{join as Ms}from"node:path";import{existsSync as Du}from"node:fs";import{createRequire as Lu}from"node:module";var Cs="redskilled-job-object.node",me=100;function Oe(e){return{available:!1,reason:e}}function $u(e,t,n){return[Ms(n,"prebuilds",`${e}-${t}`,Cs),Ms(n,"native","build","Release",Cs)]}function Us(e={}){let t=e.platform??process.platform,n=e.arch??process.arch;if(t!=="win32")return Oe(`Job Object placement is the Windows backend (platform=${t}), so there is no native reach to load here`);let r=e.packageRoot??Iu(),o=e.exists??Du,s=$u(t,n,r),i=s.find(c=>o(c));if(i==null)return Oe(`no Job Object addon was found for ${t}-${n} (looked in ${s.join(", ")}); either install the prebuild for this platform and architecture or build the addon locally`);let l=e.requireFn??Lu(import.meta.url),a;try{a=l(i)}catch(c){return Oe(`the Job Object addon at ${i} could not be loaded: ${c instanceof Error?c.message:String(c)}`)}return Au(a)?{available:!0,binding:a}:Oe(`the Job Object addon at ${i} does not export createJobObject, so it cannot be the native reach`)}function Au(e){return typeof e=="object"&&e!=null&&typeof e.createJobObject=="function"}function Iu(){return new URL("..",import.meta.url).pathname}function Fs(e){let t=e??{},n=[],r=Tu(t);r==null&&(t.memory_max??t.memory_high)!=null&&n.push("the declared memory budget could not be reduced to bytes, so the job carries no memory ceiling");let o;return t.cpu_weight!=null&&(t.cpu_weight<me?o=Math.max(1,Math.min(100,Math.round(t.cpu_weight))):n.push(`cpu_weight=${t.cpu_weight} is at or above the fair share of ${me}, 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,...n.length>0?{note:n.join("; ")}:{}}}function Tu(e){return Ze({budget:e})}var Ot=5,Hs=19;function Gn(e){return{available:!1,reason:e}}var Nu="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 Bs(e,t){let n=e??{},r=[],o;if(!t.canRenice)r.push("nice is not on this host, so no priority control was applied and the Worker competes with interactive work");else if(n.cpu_weight==null)o=Ot;else if(n.cpu_weight<me){let l=Math.round(Hs*(me-n.cpu_weight)/me);o=Math.min(Hs,Math.max(Ot,l))}else o=Ot,r.push(`cpu_weight=${n.cpu_weight} is at or above the fair share of ${me}, and raising a process's priority requires privilege this daemon does not have, so the Worker keeps the default yield of nice ${Ot}`);let s=Vs(n.max_processes);s==null&&n.max_processes!=null&&r.push(`max_processes=${n.max_processes} is not a positive whole number, so no ulimit -u is set`);let i=Vs(n.cpu_seconds);return i==null&&n.cpu_seconds!=null&&r.push(`cpu_seconds=${n.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:Nu,...r.length>0?{note:r.join("; ")}:{}}}function Js(e){let{limits:t}=e,n=[];return t.max_processes!=null&&n.push(`ulimit -u ${t.max_processes}`),t.cpu_seconds!=null&&n.push(`ulimit -t ${t.cpu_seconds}`),n.push(t.nice!=null&&e.nice!=null?`exec ${Wu(e.nice)} -n ${t.nice} "$0" "$@"`:'exec "$0" "$@"'),["-c",n.join(`
|
|
52
|
+
`),e.command,...e.args]}function Ks(e){let t=[];return e.nice!=null?t.push(`the Worker runs at nice ${e.nice} so it yields to interactive work`):t.push("no priority control was applied"),e.max_processes!=null&&t.push(`its processes are capped at ${e.max_processes}`),e.cpu_seconds!=null&&t.push(`its CPU time is capped at ${e.cpu_seconds} seconds`),`macOS placement applied POSIX limits: ${t.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 zn(e){let t=e??{},n=[t.max_processes!=null?"max_processes":null,t.cpu_seconds!=null?"cpu_seconds":null].filter(r=>r!=null);return n.length===0?null:`${n.join(" and ")} ${n.length===1?"is a POSIX rlimit":"are POSIX rlimits"} honoured only by the macOS placement backend, so this placement carries no equivalent`}function Vs(e){if(e!=null&&!(!Number.isSafeInteger(e)||e<=0))return e}function Wu(e){return`'${e.replace(/'/g,"'\\''")}'`}var Gs="REDSKILLED_PLACEMENT",Dt="red-worker",Qn="/bin/sh";function zs(e=process.env,t=process.platform){let n=Gn(`POSIX rlimit and priority placement is the macOS backend (platform=${t})`);if(t==="win32")return{platform:t,systemdRun:null,userSession:!1,jobObjects:Us({platform:t}),posix:n};let r=Oe(`Job Object placement is the Windows backend (platform=${t}), so there is no native reach to load here`);if(t==="darwin")return{platform:t,systemdRun:null,userSession:!1,jobObjects:r,posix:Cu(e)};if(t!=="linux")return{platform:t,systemdRun:null,userSession:!1,jobObjects:r,posix:n};let o=(e.XDG_RUNTIME_DIR??"").trim(),s=o!==""&&Zn(qs(o,"systemd","private"));return{platform:t,systemdRun:Xs("systemd-run",e),userSession:s,jobObjects:r,posix:n}}function Cu(e){return Zn(Qn)?{available:!0,shell:Qn,nice:Xs("nice",e)}:Gn(`no POSIX shell was found at ${Qn}, so there is nothing to apply rlimits or priority in`)}function Qs(e=process.env){let t=(e[Gs]??"").trim().toLowerCase();return t===""?!0:!["off","false","0","no"].includes(t)}function Uu(e,t,n=Dt){return Ys(e,t,n).replace(/\.service$/,"")}function Ys(e,t,n=Dt){return`${Yn(n,"red-worker",24)}-${Yn(e,"project",32)}-${Yn(t,"worker",32)}.service`}function Zs(e){let t=[...e.args??[]],n=e.budget??{},r=n.memory_high!=null||n.memory_max!=null||n.cpu_weight!=null,o=e.target??{isolation:"transient-unit"},s=c=>({isolated:!1,backend:"none",command:e.command,args:t,cwd:e.workspacePath,warning:c,...r?{budgetWarning:"a budget was declared but this placement cannot enforce it: the daemon's RSS sampling is the only remaining floor"}:{}});if(o.isolation==="inherit")return s("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 s(`worker isolation disabled by ${Gs}: the Worker is charged to the daemon's own resource group`);if(e.probes.platform==="win32")return Hu(e,t,r,s);if(e.probes.platform==="darwin")return Fu(e,t,s);if(e.probes.platform!=="linux")return s(`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 s("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 s("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 i=Ys(e.projectLabel,e.workerId,o.unit_prefix),l=["--user","--collect","--quiet","--wait",`--unit=${i}`,`--working-directory=${e.workspacePath}`];e.pipeOutput===!0&&l.push("--pipe"),n.memory_high!=null&&l.push(`--property=MemoryHigh=${n.memory_high}`),n.memory_max!=null&&l.push(`--property=MemoryMax=${n.memory_max}`),n.cpu_weight!=null&&l.push(`--property=CPUWeight=${n.cpu_weight}`);for(let[c,u]of Object.entries(e.env??{}))l.push(`--setenv=${c}=${u}`);let a=zn(e.budget);return{isolated:!0,backend:"transient-unit",unit:i,command:e.probes.systemdRun,args:[...l,"--",e.command,...t],...a!=null?{budgetWarning:a}:{}}}function Fu(e,t,n){let r=e.probes.posix;if(!r.available)return n(`POSIX limit placement unavailable: ${r.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 o=Bs(e.budget,{canRenice:r.nice!=null}),s=e.budget??{},i=s.memory_high!=null||s.memory_max!=null;return{isolated:!1,backend:"posix-limits",command:r.shell,args:Js({limits:o,nice:r.nice,command:e.command,args:t}),cwd:e.workspacePath,posix:o,warning:Ks(o),...i?{budgetWarning:"the declared memory budget is enforced by the daemon's RSS sampling floor rather than by the kernel: "+o.memory_ceiling_reason}:{}}}function Hu(e,t,n,r){let o=e.probes.jobObjects;if(!o.available)return r(`Job Object placement unavailable: ${o.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 s=Fs(e.budget),i=Uu(e.projectLabel,e.workerId,e.target?.unit_prefix);return{isolated:!0,backend:"job-object",command:e.command,args:[...t],cwd:e.workspacePath,job:{name:i,limits:s},...Vu(n&&s.note!=null?`${s.note}; the daemon's RSS sampling floor is the ceiling for that budget`:null,zn(e.budget))}}function Vu(...e){let t=e.filter(n=>n!=null&&n!=="");return t.length>0?{budgetWarning:t.join("; ")}:{}}function Xs(e,t){for(let n of(t.PATH??"").split(Mu)){if(!n)continue;let r=qs(n,e);if(Zn(r))return r}return null}function Yn(e,t,n){return(e||"").toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"").slice(0,n).replace(/-+$/g,"")||t}async function Xn(e,t){let n=[],r=[];for(let o of e){let s=!1;try{s=await t(o)===!0}catch{s=!1}(s?n:r).push(o)}return{alive:n,dead:r}}function ei(e){return e.unit!=null&&e.unit!==""?Bu(e.unit):N(e.pid)}function Bu(e){let t=Lt("systemctl",["--user","is-active","--quiet",e],{stdio:"ignore"});return t.error!=null?!1:t.status===0}var Ju="REDSKILLED_UNIT_DISCOVERY",ti="(unowned)";function ni(e){let t=Lt("systemctl",["--user","show","--property=MainPID","--value",e],{encoding:"utf8"});if(t.error!=null||t.status!==0)return null;let n=Number.parseInt((t.stdout??"").trim(),10);return Number.isInteger(n)&&n>0?n:null}function Ku(e=process.env){let t=(e[Ju]??"").trim().toLowerCase();return t===""?!0:!["off","false","0","no"].includes(t)}function ri(e,t,n=process.env){return Ku(n)&&e===t}function oi(e=Dt){let t=Lt("systemctl",["--user","list-units","--type=service","--state=active","--plain","--no-legend","--no-pager",`${e}-*.service`],{encoding:"utf8"});return t.error!=null||t.status!==0?[]:(t.stdout??"").split(`
|
|
53
|
+
`).map(n=>n.trim().split(/\s+/)[0]??"").filter(n=>n.startsWith(`${e}-`)&&n.endsWith(".service"))}function si(e){let t=new Set(e.held.map(o=>o.unit).filter(o=>o!=null&&o!=="")),n=new Set,r=[];for(let o of e.units)o===""||t.has(o)||n.has(o)||(n.add(o),r.push({worker_id:o.replace(/\.service$/,""),project_label:ti,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 ii(e){return e.project_label.trim()!==""?e:{...e,project_label:ti,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 li(e){if(e.unit!=null&&e.unit!==""){let t=Lt("systemctl",["--user","stop",e.unit],{stdio:"ignore"});return t.error==null&&t.status===0}try{return process.kill(e.pid,"SIGTERM"),!0}catch{return!1}}function qu(e,t=50){if(ui(e),!Number.isInteger(t)||t<=0)throw new Error(`redskilled queue discovery needs a whole, positive batch size, not ${JSON.stringify(t)}`);let n=[];for(let r=0;r<e.length;r+=t)n.push(e.slice(r,r+t));return n}function Gu(e,t={}){let n=t.batchSize??50;if(ui(e),e.length>n)throw new Error(`redskilled queue discovery spans at most ${n} 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(`
|
|
54
|
+
`),aliases:r}}function zu(e,t){let n=et(t),r=et(n.data),o=Array.isArray(n.errors)?n.errors.map(et):[],s=Yu(r.rateLimit,o);return{projects:e.aliases.map(({alias:l,project:a})=>{let c=Xu(r[l]);if(c!=null)return{project_label:a.project_label,outcome:"counted",depth:c,detail:`project ${JSON.stringify(a.project_label)} has ${c} item(s) matching its selector`};let u=o.find(f=>Zu(f.path,l));return s.exhausted||pi(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: ${er(u?.message)||"the query returned no count for this selector"}`}}),rate_limit:s}}function Qu(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 di(e,t,n){return{version:1,fetched_at:t,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: ${n}`}))}}async function ci(e){if(e.projects.length===0)return Qu(e.now);let t=e.batchSize??50,n=qu(e.projects,t),r=[],o={remaining:null,reset_at:null,exhausted:!1};for(let s of n){let i=Gu(s,{batchSize:t});try{let l=await e.transport(i.query),a=zu(i,l);r.push(...a.projects),o=ai(o,a.rate_limit)}catch(l){let a=l instanceof Error?l.message:String(l),c=/rate limit|secondary rate|429/i.test(a);o=ai(o,{remaining:null,reset_at:null,exhausted:c});for(let u of s)r.push({project_label:u.project_label,outcome:c?"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:n.length,project_count:r.length,batch_size:t,rate_limit:o,projects:r}}function ui(e){if(e.length===0)throw new Error("redskilled queue discovery needs at least one registered project");let t=new Set;for(let n of e){if(typeof n.project_label!="string"||n.project_label==="")throw new Error("redskilled queue discovery needs a project label for every registered project");if(typeof n.selector!="string"||n.selector==="")throw new Error(`redskilled queue discovery needs a selector for project ${JSON.stringify(n.project_label)}: a project that names no work has no queue to discover`);if(t.has(n.project_label))throw new Error(`redskilled holds one selector per project, and ${JSON.stringify(n.project_label)} is registered twice`);t.add(n.project_label)}}function ai(e,t){return{remaining:t.remaining==null?e.remaining:e.remaining==null?t.remaining:Math.min(e.remaining,t.remaining),reset_at:t.reset_at??e.reset_at,exhausted:e.exhausted||t.exhausted}}function Yu(e,t){let n=et(e),r=typeof n.remaining=="number"&&Number.isFinite(n.remaining)?n.remaining:null,o=typeof n.resetAt=="string"?n.resetAt:null;return{remaining:r,reset_at:o,exhausted:t.some(pi)||r===0}}function pi(e){return e==null?!1:er(e.type)==="RATE_LIMITED"||/rate limit/i.test(er(e.message))}function Zu(e,t){return Array.isArray(e)&&e.includes(t)}function Xu(e){let t=et(e);return Number.isInteger(t.issueCount)?t.issueCount:null}function et(e){return ep(e)?e:{}}function ep(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function er(e){return typeof e=="string"?e:""}var D={mode:"local",project:null,maxWorkers:4,maxProjects:4,maxWidth:120,separator:" \xB7 ",verbose:!1};function fi(e,t=D){let n=lp(e,t),r=sp(e,t),o=ip(e,t),s=ap(e,t,r,n),i=rp(t,r,o),l={detail:"host",line:s};for(let f of i){let p=hp(s,op(f,t,r,o),t.separator);if(l={detail:f,line:p},yp(p)<=t.maxWidth)break}let a=nr(l.line,t.maxWidth),c=t.verbose&&l.detail==="workers"?pp(r,t):[],u=r.length>0?"workers":"host";return{version:1,line:a,lines:[a,...c],verbose:t.verbose,mode:t.mode,project:t.project,project_match:n,detail:l.detail,degraded:l.detail!==u||a!==l.line,stale:e.staleness.stale,generated_at:e.generated_at}}function mi(e){let t=e.options??D,n=nr(np,t.maxWidth);return{version:1,line:n,lines:[n],verbose:t.verbose,mode:t.mode,project:t.project,project_match:"unanswered",detail:"host",degraded:!0,stale:!0,generated_at:e.generated_at}}var tp="!unregistered",np="redskilled unreachable \u2014 Worker state unknown";function rp(e,t,n){let r=[];return t.length>0&&t.length<=e.maxWorkers&&r.push("workers"),e.mode==="global"&&n.length>0&&n.length<=e.maxProjects&&r.push("projects"),r.push("host"),r}function op(e,t,n,r){return e==="workers"?n.map(o=>up(o,t)):e==="projects"?r.map(gp):[]}function sp(e,t){return t.mode==="global"?e.workers:t.project==null?[]:e.workers.filter(n=>n.project_label===t.project)}function ip(e,t){return t.mode==="global"?e.projects:e.projects.filter(n=>n.project_label===t.project)}function lp(e,t){return t.project==null?"unresolved":e.known_projects==null?"matched":e.known_projects.includes(t.project)?e.registered_projects==null||e.registered_projects.includes(t.project)?"matched":"name-only":"unregistered"}function ap(e,t,n,r){let o=[];return t.mode==="global"?(o.push(`host ${e.host.worker_count}w/${e.host.project_count}p`),o.push(tr(e,t))):r==="matched"?(o.push(`${t.project} ${n.length}w`),o.push(tr(e,t)),n.length===0&&o.push("idle")):r==="name-only"?(o.push(`${t.project} ${n.length}w`),o.push(tr(e,t)),o.push(tp)):o.push(dp(t.project,r)),e.staleness.stale&&o.push(cp(e)),o.join(" ")}function dp(e,t){return t==="unregistered"?`project unknown \u2014 ${e} is not registered on this host`:"project unknown \u2014 this directory resolved to no project"}function tr(e,t){let n=t.mode==="global"?e.host.observed_rss_bytes:e.projects.filter(o=>o.project_label===t.project).reduce((o,s)=>o+s.observed_rss_bytes,0),r=e.host.ceiling.memory_bytes;return t.mode==="global"&&r!=null&&r>0?`${ge(n)}/${ge(r)}`:ge(n)}function cp(e){let t=e.staleness.age_ms;return t==null?"!unmeasured":`!stale ${Math.round(t/1e3)}s`}function up(e,t){let n=gi(e,t),r=e.vitals.rss_bytes,o=r==null?"?":e.budget.bytes==null?ge(r):`${ge(r)}/${ge(e.budget.bytes)}`;return`${n} ${o}`}function pp(e,t){let n=[];for(let r of e){let o=mp(r.log.last_line);o!=null&&n.push(nr(` ${fp} ${gi(r,t)}: ${o}`,t.maxWidth))}return n}var fp="\u21B3";function mp(e){if(e==null)return null;let t=e.replace(/[\u0000-\u001f\u007f]+/g," ").replace(/\s+/g," ").trim();return t===""?null:t}function gi(e,t){return t.mode==="global"?`${e.project_label}:${e.worker_id}`:e.worker_id}function gp(e){return`${e.project_label} ${e.worker_count}w ${ge(e.observed_rss_bytes)}`}function hp(e,t,n){return[e,...t].join(n)}function yp(e){return[...e].length}function nr(e,t){if(t<=0)return"";let n=[...e];return n.length<=t?e:t===1?"\u2026":`${n.slice(0,t-1).join("")}\u2026`}function ge(e){if(!Number.isFinite(e)||e<=0)return"0B";let t=["B","K","M","G","T"],n=e,r=0;for(;n>=1024&&r<t.length-1;)n/=1024,r+=1;return`${n>=100||r===0?Math.round(n).toString():n.toFixed(1).replace(/\.0$/,"")}${t[r]}`}import{randomUUID as hi}from"node:crypto";import{spawn as kp}from"node:child_process";import{closeSync as Rp,mkdirSync as wp,openSync as bp}from"node:fs";import{dirname as _p}from"node:path";var tt=class extends Error{constructor(t){super(t),this.name="RedskilledWorkerSpecError"}},$t=class extends Error{constructor(n,r){super(n);this.admission=r;this.name="RedskilledAdmissionError"}};function vp(e){if(e==null||e.trim()==="")return null;try{return wp(_p(e),{recursive:!0}),bp(e,"a")}catch{return null}}function Sp(e){try{Rp(e)}catch{}}function xp(e){let t=[["project_label",e.project_label],["workspace_path",e.workspace_path],["command",e.command]];for(let[n,r]of t)if(typeof r!="string"||r.trim()==="")throw new tt(`redskilled worker spec is missing ${n}`);if(e.args!=null&&!Array.isArray(e.args))throw new tt("redskilled worker spec args must be an array")}function Ep(e){if(e==null)throw new $t("redskilled refused this Worker: no host admission verdict was handed over, and an unjudged birth is an unbudgeted one");if(!e.admitted)throw new $t(e.reason,e)}function ki(e){let{spec:t,admission:n}=e;Ep(n),xp(t);let r=e.env??process.env,o=e.clock??(()=>new Date().toISOString()),s=(t.worker_id??e.workerId??hi()).trim()||hi(),i=e.probes??zs(r),l=e.openLog===!1?null:vp(t.log_path),a=Zs({workerId:s,projectLabel:t.project_label,workspacePath:t.workspace_path,command:t.command,args:t.args,budget:t.budget,target:t.placement,env:t.env,enabled:e.enabled??Qs(r),probes:i,pipeOutput:l!==null}),u=(e.spawnFn??kp)(a.command,a.args,{...a.cwd!=null?{cwd:a.cwd}:{},detached:!0,stdio:l===null?"ignore":["ignore",l,l],env:a.isolated?{...r}:{...r,...t.env??{}}});if(l!==null&&Sp(l),u.pid==null)throw u.once("error",()=>{}),new tt(`redskilled could not spawn ${JSON.stringify(a.command)} for worker ${s}`);let f=a.job!=null?jp(a,i,u.pid):null;u.once("error",()=>{}),u.once("exit",(w,b)=>{try{f?.job?.close()}catch{}e.onExit?.(s,w,b)}),u.unref();let p=a.job!=null?f?.job!=null:a.isolated,h=[a.warning,f?.warning,a.budgetWarning].filter(w=>w!=null);return{worker:{worker_id:s,project_label:t.project_label,pid:u.pid,started_at:o(),workspace_path:t.workspace_path,...t.log_path!=null?{log_path:t.log_path}:{},isolated:p,...a.unit!=null?{unit:a.unit}:{},...t.budget!=null?{budget:t.budget}:{},warnings:h},admission:n,warnings:h,plan:a,child:u,...f?.job!=null?{job:f.job}:{}}}function jp(e,t,n){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(!t.jobObjects.available)return{warning:`Job Object placement unavailable: ${t.jobObjects.reason}. ${o}`};let s;try{s=t.jobObjects.binding.createJobObject({name:r.name,limits:r.limits})}catch(i){return{warning:`Job Object ${JSON.stringify(r.name)} could not be created: ${yi(i)}. ${o}`}}try{s.assign(n)}catch(i){try{s.close()}catch{}return{warning:`Worker pid ${n} could not be assigned to Job Object ${JSON.stringify(r.name)}: ${yi(i)}. ${o}`}}return{job:s}}function yi(e){return e instanceof Error?e.message:String(e)}import{open as Pp,stat as Op}from"node:fs/promises";var Dp=16*1024;async function Ri(e,t=Dp){let n;try{n=(await Op(e)).size}catch{return null}if(n<=0)return null;let r=Math.min(t,n),o;try{let s=await Pp(e,"r");try{let i=Buffer.alloc(r);await s.read(i,0,r,n-r),o=i.toString("utf8")}finally{await s.close()}}catch{return null}return Lp(o)}function Lp(e){let t=e.split(`
|
|
55
|
+
`);for(let n=t.length-1;n>=0;n-=1){let r=t[n].replace(/\r$/,"");if(r.trim()!=="")return r}return null}import{spawn as Jp}from"node:child_process";import{existsSync as Kp,readdirSync as qp}from"node:fs";import{dirname as Gp,join as xi,resolve as zp}from"node:path";function U(e){let t=/^(\d+)\.(\d+)\.(\d+)/.exec(String(e).trim());return t?{major:Number(t[1]),minor:Number(t[2]),patch:Number(t[3])}:null}function rr(e,t){let n=U(e),r=U(t);return!n||!r?0:n.major-r.major||n.minor-r.minor||n.patch-r.patch}var Dy=4*60*60*1e3;X();X();import{spawnSync as $p}from"node:child_process";import{mkdir as Ap,rm as Ip,writeFile as Tp}from"node:fs/promises";import{existsSync as Np}from"node:fs";import{homedir as Wp}from"node:os";import{dirname as Mp,join as or}from"node:path";var De="redskilled.service",sr="REDSKILLED_SUPERVISED",Cp="https://github.com/reddb-io/red-skills/blob/main/.red/adr/0130-redskilled-host-scoped-execution-daemon.md";function Up(e=process.env){let t=e.XDG_CONFIG_HOME?.trim()||or(e.HOME?.trim()||Wp(),".config");return or(t,"systemd","user")}function ir(e=process.env){return or(Up(e),De)}function wi(e,t={}){let n=t.env??process.env,r=_t(t.override??{},t.entryLookup??{}),o=[...r.args,...fe(e,t.idleMs==null?{}:{idleMs:t.idleMs})];return{unitName:De,unitPath:ir(n),command:r.command,args:o,text:Fp(r.command,o,e)}}function Fp(e,t,n){return["[Unit]","Description=redskilled \u2014 the host-scoped execution daemon (ADR 0130)",`Documentation=${Cp}`,"","[Service]","Type=simple",`ExecStart=${[e,...t].map(Hp).join(" ")}`,"Restart=on-failure","RestartSec=1",`Environment="${sr}=1"`,`Environment="REDSKILLED_SESSION=${bi(n.sessionKey)}"`,"","[Install]","WantedBy=default.target",""].join(`
|
|
56
|
+
`)}function Hp(e){return/[\s"'\\$%]/.test(e)?`"${bi(e)}"`:e}function bi(e){return e.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace(/%/g,"%%")}async function _i(e,t={}){let n=t.writeFile??Vp,r=t.run??lr,o=[];return await n(e.unitPath,e.text),o.push({step:"write-unit",ok:!0,detail:e.unitPath}),o.push(At("daemon-reload",r,["systemctl","--user","daemon-reload"])),o.push(At("enable",r,["systemctl","--user","enable","--now",e.unitName])),{unitPath:e.unitPath,installed:o.every(s=>s.ok),steps:o}}async function vi(e={}){let t=e.removeFile??Bp,n=e.run??lr,r=ir(e.env??process.env),o=[At("disable",n,["systemctl","--user","disable","--now",De])];return await t(r),o.push({step:"remove-unit",ok:!0,detail:r}),o.push(At("daemon-reload",n,["systemctl","--user","daemon-reload"])),{unitPath:r,installed:!1,steps:o}}function Si(e={}){let t=e.exists??Np,n=e.run??lr,r=ir(e.env??process.env),o=t(r);return{unitName:De,unitPath:r,installed:o,enabled:o&&n(["systemctl","--user","is-enabled",De]).status===0,active:o&&n(["systemctl","--user","is-active",De]).status===0,floor:"auto-spawn"}}function At(e,t,n){let r=t(n),o=(r.stderr??r.stdout??"").trim();return{step:e,argv:n,ok:r.status===0,...o?{detail:o}:{}}}async function Vp(e,t){await Ap(Mp(e),{recursive:!0}),await Tp(e,t,{encoding:"utf8",mode:420})}async function Bp(e){await Ip(e,{force:!0})}function lr(e){let t=$p(e[0],[...e.slice(1)],{encoding:"utf8"});return t.error!=null?{status:null,stderr:t.error.message}:{status:t.status,stdout:t.stdout??"",stderr:t.stderr??""}}var Ei=75,Pi=9e5,ji="redskilled-replacement-entry-unresolved",Qp="REDSKILLED_NO_REGISTRY_PROBE",Oi="REDSKILLED_BORN_BY_REPLACEMENT";function Di(e=process.env){return e[Oi]==="1"}function Li(e){return e===null||typeof e=="string"?{version:e,newest:null}:{version:e.version,newest:e.newest??null}}function $i(e){let t=e.running.trim();if(nt(t))return null;let n=e.newest?.trim()??"",r=U(n),o=U(t);return r===null||o===null||r.major<=o.major?null:{version:n,running_major:o.major,held_major:r.major,reason:`redskilled ${n} is published and this daemon runs ${t}; 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:Yp(r.major,e.supervised)}}function Yp(e,t){let n=`install the ${e}.x bundle (update this machine's plugin pin), then `;return t?`${n}re-point the unit and restart it: redskilled unit install && systemctl --user restart redskilled.service`:`${n}stop this daemon \u2014 the next client start resolves the newly installed bundle`}function Ai(e){let t=e.running.trim();if(nt(t))return{act:"hold",reason:"local-build"};let n=e.published?.trim()??"";return!n||U(n)===null?{act:"hold",reason:"published-unknown"}:rr(n,t)<=0?{act:"hold",reason:"no-newer-version"}:{act:"replace",to:n,via:e.supervised?"supervisor-exit":"self-spawn"}}function nt(e){let t=e.trim();return U(t)===null?!0:/^\d+\.\d+\.\d+[-+]/.test(t)}function Ii(e=process.env){return e[sr]==="1"}var ar=class extends Error{code=ji;searched;constructor(t,n){super(`${ji}: the published redskilled bundle ${t} exists on no reachable path and the version-pinned dispatch is disabled
|
|
57
57
|
searched:
|
|
58
58
|
${n.map(r=>` ${r}`).join(`
|
|
59
|
-
`)}`),this.name="RedskilledReplacementEntryError",this.searched=[...n]}};function
|
|
60
|
-
`}function Wp(e){let t=e.trim();if(!t)return null;try{return JSON.parse(t)}catch{try{return K(t)}catch{return null}}}function Mp(e){if(e===null||typeof e!="object"||Array.isArray(e))return!1;let t=e;if(t.version!==1||!Number.isInteger(t.pid)||t.pid<=0)return!1;for(let n of["start_time","session_key_hash","machine_id_hash","socket_path","acquired_at","renewed_at"])if(typeof t[n]!="string"||t[n].length===0)return!1;return!0}var rr=3e5,Kp=15e3,Oe=class extends Error{constructor(n,r){super(`a redskilled daemon already owns ${JSON.stringify(n)}`);this.socketPath=n;this.lease=r;this.name="RedskilledAlreadyRunningError"}};async function $i(e){let{paths:t}=e,n=e.daemonVersion??"0.0.0-dev",r=e.idleMs??rr,o=e.clock??(()=>new Date().toISOString()),s=e.launch??oi,i=e.ceiling??Fo();e.repositoryActivity!=null&&Mn(e.repositoryActivity.projects,e.repositoryActivity.hostTokenRef);let a=e.owner??Oi(),l=e.leaseStore??Di(t.leasePath,{sessionKeyHash:t.sessionKeyHash,machineIdHash:t.machineIdHash,socketPath:t.socketPath},{clock:o}),d=e.machineOwner??ns(),u={machineIdHash:t.machineIdHash,sessionKeyHash:t.sessionKeyHash,socketPath:t.socketPath},f=e.machineClaimStore??bt(t.machineClaimPath,u,{clock:o});await Vp(Bp(t.socketPath),{recursive:!0,mode:448});let p=await f.claim(d);if(!p.claimed)throw p.claim?.socket_path===t.socketPath?new Oe(t.socketPath):new ie(f.claimPath,p.reason,p.claim);let h=await l.acquire(a);if(!h.acquired)throw await f.release(d).catch(()=>{}),new Oe(t.socketPath,h.lease);let y;try{y=await qp(t.socketPath)}catch(c){throw await l.release(a).catch(()=>{}),await f.release(d).catch(()=>{}),c}let R=o(),w=e.eventLane??Jo(t.eventLanePath),_=e.liveness??Us,P=e.stopWorker??qs,F=e.unitInventory??(()=>Vs(t.machineClaimPath,wt({machineIdHash:t.machineIdHash}))?Js():[]),M=e.unitMainPid??Hs,ae=e.treeSampler??ps,ge=e.readLogTail??si,tt=e.sampleMs??Kp,da=e.publishedVersion??(c=>_i(c)),pr=e.replaceCheckMs??mi,fr=e.supervised??Ri(),mr=e.replacementIO??{},H=e.repositoryActivity,gr=H?.intervalMs??6e4,nt=e.queueDiscovery,$t=nt?.transport??H?.transport,hr=nt?.intervalMs??15e3,yr=e.demandMs??15e3,ca=e.demandBackoffMs??3e4,S=new Map,ne=new Set,he=new Map,N=new Map,At=new Set,kr={},It=null,Rr=null,wr=null,br=!1,$e="none",Nt=null,_r=null,Tt=null,Ae=null,rt=null,Ie=null,Wt=!1,ye,Ne,Te,We,Me,Ce,re=!1,vr=!1,ot=null,xr,Mt=new Promise(c=>{xr=c});function Ue(c){let m=ls(N.values(),c);for(let g of m.lapsed)N.delete(g.project_label);return m.lapsed}function st(){let c=o();return Ue(Date.parse(c)),_s({now:c,daemonVersion:n,machineIdHash:t.machineIdHash,sessionKeyHash:t.sessionKeyHash,pid:a.pid,startedAt:R,scope:rs(f.claimPath,u,d),workers:[...S.values()],registrations:[...N.values()],queue:Ae,published:{version:Rr,checkedAt:wr,newer:br,replacement:$e,newest:Nt,majorHold:_r}})}function Ct(){return ws({hostState:st(),ceiling:i,rss:kr,sampledAt:It,logLines:Object.fromEntries(he),now:o(),reattachedWorkerIds:[...ne],repositoryActivity:Tt})}async function Ut(){return H==null||H.projects.length===0?null:(Tt=await gs({projects:H.projects,hostTokenRef:H.hostTokenRef,transport:H.transport,closedWindowMs:H.closedWindowMs,now:o()}),Tt)}async function Sr(){if($t==null)return null;let c=o();Ue(Date.parse(c));let m=[...N.values()].map(g=>({project_label:g.project_label,selector:g.selector})).sort((g,b)=>g.project_label.localeCompare(b.project_label));return m.length===0?null:(Ae=await zs({projects:m,transport:$t,now:c,...nt?.batchSize==null?{}:{batchSize:nt.batchSize}}),Ae)}async function Er(){let c=o();if(Wt)return rt??qo(c);Wt=!0;try{let m={};for(let L of S.values())m[L.project_label]=(m[L.project_label]??0)+1;let g={};for(let L of Ae?.projects??[])g[L.project_label]=L.depth;let b=Date.parse(c),j=Ko({projects:[...N.values()].map(L=>({project_label:L.project_label,selector:L.selector,argv:L.argv,workspace_path:L.workspace_path,target:L.target})),queue:g,live:m,nowMs:Number.isFinite(b)?b:0,backoffUntilMs:Ie}),O=[],Vt=null;for(let L of j.births){let dt;try{dt=Ft({project_label:L.project_label,workspace_path:L.workspace_path,command:L.argv[0],args:L.argv.slice(1)})}catch(Jt){Vt=Jt instanceof Error?Jt.message:String(Jt),Ie=(Number.isFinite(b)?b:Date.now())+ca;break}O.push({project_label:L.project_label,worker_id:dt.worker.worker_id,pid:dt.worker.pid,warnings:dt.warnings})}return Vt==null&&j.births.length>0&&(Ie=null),rt={version:1,at:c,requested:j.births.length,granted:O,shortfall:j.births.length-O.length,refusal:Vt,retry_after:Ie==null?null:new Date(Ie).toISOString(),projects:j.intents},rt}finally{Wt=!1}}function ua(c){return Xs(Ct(),{...D,mode:c?.mode??D.mode,project:c?.project??D.project,maxWorkers:c?.max_workers??D.maxWorkers,maxProjects:c?.max_projects??D.maxProjects,maxWidth:c?.max_width??D.maxWidth,verbose:c?.verbose??D.verbose})}function ke(c,m,g){return cs({op:c,sessionProject:m??null,targetProject:g})}async function pa(c){let m=S.get(c.worker_id),g=ke(ds(c.command),c.session_project,m?.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 b=m!=null&&await ha(m,c.detail??"stopped by its own project");return{version:1,command:c.command,worker_id:c.worker_id,applied:b,reach:g,detail:b?`redskilled stopped Worker ${JSON.stringify(c.worker_id)} of project ${JSON.stringify(m.project_label)}`:`redskilled holds no live Worker ${JSON.stringify(c.worker_id)} to stop`}}function it(c){S.delete(c),ne.delete(c),he.delete(c)}function jr(c){let m=S.get(c.worker_id),g=ke("worker-heartbeat",c.session_project,m?.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(m==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 b=o();return he.set(c.worker_id,{line:c.last_log_line,published_at:b,source:"heartbeat"}),{version:1,worker_id:c.worker_id,accepted:!0,reach:g,published_at:b,detail:`redskilled stored a line for Worker ${JSON.stringify(c.worker_id)} without reading it`}}async function fa(c,m,g){let b=`exit code=${m??"null"} signal=${g??"null"}`;if(c.unit!=null&&c.unit!==""&&await ma(c)){ga(c,`its launch client ended (${b}) 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}it(c.worker_id),Q("worker-death",c,b,{exitCode:m,signal:g}),$()}async function ma(c){try{return await _(c)===!0}catch{return!1}}function ga(c,m){let g=c.unit==null?null:M(c.unit);S.set(c.worker_id,{...c,...g!=null&&g>0?{pid:g}:{},warnings:[...c.warnings,m]}),ne.add(c.worker_id),$()}function Pr(c,m){let g=ke("project-register",m,c.project_label);if(!g.permitted)throw new Error(g.reason);let b=o();Ue(Date.parse(b));let j=ss(c,{now:b,held:N.get(c.project_label)});return N.set(j.project_label,j),$(),{version:1,registration:j,reach:g,detail:`redskilled holds a registration for project ${JSON.stringify(j.project_label)} at a target of ${j.target} until ${j.renew_by}, and has read neither its selector nor its argv`}}function Or(c,m={}){let g=ke("project-renew",m.sessionProject,c);if(!g.permitted)throw new Error(g.reason);let b=o();Ue(Date.parse(b));let j=N.get(c);if(j==null)throw new _t(c);let O=is(j,{now:b,...m.renewWithinMs==null?{}:{renew_within_ms:m.renewWithinMs},...m.launch==null?{}:{launch:m.launch}});return N.set(O.project_label,O),$(),{version:1,registration:O,reach:g,detail:`redskilled renewed the registration for project ${JSON.stringify(O.project_label)}, which now stands until ${O.renew_by} after renewal ${O.renewals}`+(m.launch==null?"":`, carrying launch revision ${O.launch_revision} for its next Worker`)}}function Dr(c,m){let g=ke("project-deregister",m,c);if(!g.permitted)throw new Error(g.reason);let b=N.delete(c);return{version:1,project_label:c,released:b,reach:g,detail:b?`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 ha(c,m){try{await P(c)}catch{}return it(c.worker_id),Q("worker-death",c,m),$(),!0}function Lr(c){return Uo({ceiling:i,workers:[...S.values()],budget:c.budget,projectLabel:c.project_label})}function Ft(c){let m=s({spec:c,admission:Lr(c),clock:o,onExit:(g,b,j)=>{let O=S.get(g);if(O==null){$();return}fa(O,b,j).catch(()=>{})}});return S.set(m.worker.worker_id,m.worker),Q("worker-birth",m.worker,null),$(),m}function Q(c,m,g,b={}){re||w.record({event:c,worker:m,ts:o(),detail:g,...b.exitCode!==void 0?{exitCode:b.exitCode}:{},...b.signal!==void 0?{signal:b.signal}:{}}).catch(()=>{})}async function $r(){let c=[...ne].map(g=>S.get(g)).filter(g=>g!=null);if(c.length===0)return[];let{dead:m}=await Bn(c,_);for(let g of m)it(g.worker_id),Q("worker-death",g,"the host no longer confirms this Worker");return m.length>0&&$(),m}async function Ar(c,m){let g=S.get(c);if(!g)return!1;try{await P(g)}catch{}return it(c),Q("worker-budget-kill",g,m),$(),!0}async function Ir(){let c=[...S.values()];if(c.length===0)return[];let m;try{m=await ae(c)}catch{return[]}let g=m.rss;kr=g,It=o(),ya(m.cpu_seconds,It);let{terminations:b}=us({workers:c,rss:g}),j=[];for(let O of b)await Ar(O.worker_id,O.reason)&&j.push(O);return j}function ya(c,m){for(let[g,b]of Object.entries(c)){if(typeof b!="number"||!Number.isFinite(b))continue;let j=S.get(g);j&&S.set(g,{...j,cpu:{cpu_seconds:b,sampled_at:m}})}}async function Nr(){let c;try{c=gi(await da(n))}catch{c={version:null,newest:null}}let m=c.version;Rr=m,Nt=c.newest??null,wr=o(),_r=hi({running:n,newest:Nt,supervised:fr});let g=yi({running:n,published:m,supervised:fr});return br=g.act==="replace",$e!=="in-progress"&&($e=g.act==="replace"?"pending":"none"),g}async function Tr(){let c=await Nr();if(c.act!=="replace"||$e==="in-progress")return c;let m=wi(c,mr);return $e="in-progress",await w.flush().catch(()=>{}),await lt({reason:"replaced"}),bi(m,t,{...r==null?{}:{idleMs:r},io:mr}),c}function ka(){re||We!=null||pr<=0||(We=setInterval(()=>{Tr().catch(()=>{})},pr),We.unref())}function Ra(){re||Ne!=null||tt<=0||(Ne=setInterval(()=>{Ir().catch(()=>{})},tt),Ne.unref())}function wa(){re||Me!=null||H==null||H.projects.length===0||gr<=0||(Ut().catch(()=>{}),Me=setInterval(()=>{Ut().catch(()=>{})},gr),Me.unref())}function ba(){re||Ce!=null||$t==null||hr<=0||(Ce=setInterval(()=>{Sr().catch(()=>{})},hr),Ce.unref())}function _a(){re||Te!=null||yr<=0||(Te=setInterval(()=>{Er().catch(()=>{})},yr),Te.unref())}function $(){re||(ye&&clearTimeout(ye),ye=setTimeout(()=>{$r().catch(()=>{}).then(()=>Wr())},r),ye.unref())}function Wr(){return S.size>0?($(),"held-by-workers"):(Ue(Date.parse(o())),N.size>0?($(),"held-by-registrations"):(lt({reason:"idle"}),"exited"))}function at(c){return zo({reason:c,socketPath:t.socketPath,daemonVersion:n,pid:a.pid,workers:[...S.values()],projects:[...N.keys()]})}function Mr(c){if(ot!=null)return ot;let m=c.reason??"requested",g=c.note?.trim();return ot=w.recordDaemonStop({ts:o(),pid:a.pid,socketPath:t.socketPath,reason:m,detail:g==null||g===""?at(m).detail:`${at(m).detail} \u2014 ${g}`,...c.signal==null?{}:{signal:c.signal}}).catch(()=>{}),ot}async function lt(c={}){if(vr)return await Mt;vr=!0,await Mr(c),re=!0,ye&&clearTimeout(ye),Ne&&clearInterval(Ne),We&&clearInterval(We),Me&&clearInterval(Me),Ce&&clearInterval(Ce),Te&&clearInterval(Te),await w.flush().catch(()=>{}),y.close();for(let m of At)m.destroy();return await new Promise(m=>y.once("close",()=>m())),await Li(t.socketPath,{force:!0}),await l.release(a).catch(()=>{}),await f.release(d).catch(()=>{}),xr(),await Mt}let va=Bo(await w.read().catch(()=>[])),Ht=await Bn(va,_);for(let c of Ht.alive){let m=Ks(c),g=m.unit==null||T(m.pid)?null:M(m.unit);S.set(m.worker_id,g!=null&&g>0?{...m,pid:g}:m),ne.add(m.worker_id)}for(let c of Ht.dead)Q("worker-death",c,"the Worker ended while no daemon was watching");let xa=Bs({units:await Promise.resolve(F()).catch(()=>[]),held:[...S.values()],mainPid:M,now:R});for(let c of xa)S.set(c.worker_id,c),ne.add(c.worker_id),Q("worker-birth",c,"adopted from an active unit with no birth on this lane");for(let c of Ht.alive){if(c.log_path==null||he.has(c.worker_id))continue;let m=await ge(c.log_path).catch(()=>null);m==null||m.trim()===""||he.set(c.worker_id,{line:m,published_at:o(),source:"rehydrated"})}y.on("connection",c=>{At.add(c),c.once("close",()=>At.delete(c)),$(),Gp(c,async(m,g)=>{$();let b=await Sa(m);g(b),m.op==="shutdown"&&setImmediate(()=>void lt({reason:"requested"}))})});async function Sa(c){try{if(c.op==="ping")return{id:c.id,ok:!0,value:{pong:!0,protocol_version:vt,daemon_version:n,pid:a.pid}};if(c.op==="host-state")return{id:c.id,ok:!0,value:st()};if(c.op==="statusline-payload")return{id:c.id,ok:!0,value:Ct()};if(c.op==="statusline-string")return{id:c.id,ok:!0,value:ua(c.render)};if(c.op==="worker-heartbeat")return{id:c.id,ok:!0,value:jr(c.heartbeat)};if(c.op==="project-register")return{id:c.id,ok:!0,value:Pr(c.registration,c.session_project)};if(c.op==="project-renew")return{id:c.id,ok:!0,value:Or(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:Dr(c.project_label,c.session_project)};if(c.op==="worker-command")return{id:c.id,ok:!0,value:await pa(c.command)};if(c.op==="worker-start"){let g=ke("worker-start",c.session_project,c.spec.project_label);if(!g.permitted)return{id:c.id,ok:!1,error:g.reason};let b=Ft(c.spec);return await w.flush().catch(()=>{}),{id:c.id,ok:!0,value:{worker:b.worker,admission:b.admission,warnings:b.warnings}}}if(c.op==="shutdown"){let g=at("requested");return await Mr({reason:"requested",...c.detail==null?{}:{note:c.detail}}),{id:c.id,ok:!0,value:g}}let m=c;return{id:m.id??Dt(),ok:!1,error:`unsupported redskilled op: ${m.op??"unknown"}`}}catch(m){return{id:c.id??Dt(),ok:!1,error:m instanceof Error?m.message:String(m)}}}return $(),Ra(),ka(),wa(),ba(),_a(),{socketPath:t.socketPath,lease:h.lease,startedAt:R,closed:Mt,startWorker:Ft,admit:Lr,ceiling:()=>i,killWorkerOverBudget:Ar,sampleMemoryBudgets:Ir,pollRepositoryActivity:Ut,pollQueueDiscovery:Sr,queueDiscovery:()=>Ae,driveDemand:Er,demand:()=>rt,sweepReattached:$r,publishWorkerHeartbeat:jr,reattached:()=>[...ne].map(c=>S.get(c)).filter(c=>c!=null),flushEvents:()=>w.flush(),trackWorker(c){S.set(c.worker_id,c),Q("worker-birth",c,null),$()},releaseWorker(c){let m=S.get(c),g=S.delete(c);return ne.delete(c),he.delete(c),m&&Q("worker-death",m,"released by the daemon"),$(),g},workerCount:()=>S.size,registerProject:Pr,renewProject:Or,deregisterProject:Dr,registrations:()=>st().registrations??[],hostState:st,statuslinePayload:Ct,evaluateIdle:Wr,observePublishedVersion:Nr,checkForReplacement:Tr,stopReport:at,stop:lt}}async function qp(e){for(let t=0;t<2;t++){let n=Jp();try{return await new Promise((r,o)=>{n.once("error",o),n.listen(e,()=>{n.off("error",o),r()})}),n}catch(r){if(n.close(),r.code!=="EADDRINUSE")throw r;if(await ee(e))throw new Oe(e);await Li(e,{force:!0})}}throw new Oe(e)}async function ee(e,t=250){try{return(await ft({socketPath:e,timeoutMs:t},{id:Dt(),op:"ping"},"redskilled daemon")).ok===!0}catch{return!1}}function Gp(e,t){jo(e,(n,r)=>t(n,r),(n,r,o)=>{o({id:r?.id??Dt(),ok:!1,error:n instanceof Error?n.message:String(n)})})}Z();var Xp=1e4,De=class extends Error{constructor(n,r){super(`redskilled daemon is unreachable on ${JSON.stringify(n)}, so no Worker was started: ${r instanceof Error?r.message:String(r)}`);this.socketPath=n;this.cause=r;this.name="RedskilledUnreachableError"}};async function or(e,t={}){try{return await ef(e,t)}catch(n){throw n instanceof ie||n instanceof De?n:new De(e.socketPath,n)}}async function ef(e,t){if(await Qp(Zp(e.socketPath),{recursive:!0,mode:448}),await ee(e.socketPath))return"already-running";await tf(e);let n=await Po(e.lockPath);if(!n)return await Ai(e,t),"joined";try{if(await ee(e.socketPath))return"already-running";let r=await of(e,t);return await Ai(e,t,r),"spawned"}finally{await n.close(),await Yp(e.lockPath,{force:!0})}}async function tf(e){let n=await bt(e.machineClaimPath,{machineIdHash:e.machineIdHash,sessionKeyHash:e.sessionKeyHash,socketPath:e.socketPath}).read().catch(()=>{});if(n!=null&&n.socket_path!==e.socketPath&&T(n.pid))throw new ie(e.machineClaimPath,"held",n)}async function Ni(e,t,n={}){await or(e,n);let r;try{r=await Qe({socketPath:e.socketPath,timeoutMs:n.requestTimeoutMs??2e3},{...t,id:Ii()})}catch(o){throw new De(e.socketPath,o)}if(!r.ok)throw new Error(r.error);return r.value}async function Ti(e,t={},n={}){if(!await ee(e.socketPath))return Qo(e.socketPath);let r;try{r=await Qe({socketPath:e.socketPath,timeoutMs:n.requestTimeoutMs??2e3},{id:Ii(),op:"shutdown",...t.detail==null?{}:{detail:t.detail}})}catch(i){throw new De(e.socketPath,i)}if(!r.ok)throw new Error(r.error);if(!On(r.value))throw new Error("redskilled daemon returned a malformed stop report");let o=r.value;return await nf(e.socketPath,t.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 nf(e,t){let n=Date.now()+t;for(;;){if(!await ee(e))return!0;if(Date.now()>=n)return!1;await new Promise(r=>setTimeout(r,25))}}async function Wi(e,t={}){let n=await Ni(e,{op:"host-state"},t);if(!vs(n))throw new Error("redskilled daemon returned a malformed host state");return n}async function Mi(e,t=void 0,n={}){let r=await Ni(e,{op:"statusline-string",...n.sessionProject!=null?{session_project:n.sessionProject}:{},...t==null?{}:{render:rf(t)}},n);if(!bs(r))throw new Error("redskilled daemon returned a malformed statusline render");return r}function rf(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 Ai(e,t,n){let r=Date.now()+(t.readyTimeoutMs??Xp);for(;;){if(await ee(e.socketPath))return;if(n?.failure)throw new Error(`redskilled daemon failed to start from ${JSON.stringify(n.entry.entry??n.entry.command)} (resolved as ${n.entry.source}): ${n.failure.message}`);if(Date.now()>=r){let o=n?` from ${JSON.stringify(n.entry.entry??n.entry.command)} (resolved as ${n.entry.source})${n.exit?`, which ${n.exit}`:""}`:"";throw new Error(`redskilled daemon did not start on ${JSON.stringify(e.socketPath)}${o}`)}await new Promise(o=>setTimeout(o,25))}}async function of(e,t){let n=t.serverCommand??(t.serverArgs!=null?process.execPath:void 0),r=await To({...n!=null?{serverCommand:n}:{},serverArgs:t.serverArgs},t.entryLookup??{}),o={entry:r},s=[...r.args,...pe(e,t.idleMs==null?{}:{idleMs:t.idleMs})],i=zp(r.command,s,{detached:!0,stdio:"ignore",env:{...t.env??process.env,REDSKILLED_DAEMON:"1"}});return i.on("error",a=>{o.failure=a}),i.on("exit",(a,l)=>{o.exit=l?`died on ${l}`:`exited with code ${a??-1}`}),i.unref(),o}Z();import{chmod as Bi,mkdir as qi,readFile as Gi,stat as kf,writeFile as Rf}from"node:fs/promises";import{homedir as ar}from"node:os";import{dirname as wf,join as lr}from"node:path";import{join as sf}from"node:path";var af=[".red","redskilled"],z=448;function Xe(e){return sf(e,...af)}import{join as lf}from"node:path";var Ci=["local","tmp","host"],df="local",et="plugins.dev.workspace.target";var sr=class extends Error{constructor(t){super(t),this.name="WorkspaceConfigError"}};function Fi(e){let t=ve(e,et),n=pf(t??"").trim();return n===""?void 0:n}function Hi(e){let t=(e??"").trim();if(t==="")return{kind:"preset",preset:df};let n=Ci.find(r=>r===t.toLowerCase());if(n)return{kind:"preset",preset:n};if(t.startsWith("/")||t==="~"||t.startsWith("~/"))return{kind:"custom",parentDir:t};throw new sr(`${et}: unknown workspace target ${JSON.stringify(t)}. Use one of the presets (${Ci.join(", ")}) or an absolute parent directory for Workers.`)}function Vi(e,t){return e.kind==="preset"?e.preset==="host":uf(cf(e.parentDir,t),Xe(t))}function cf(e,t){return e==="~"?Ui(t):e.startsWith("~/")?lf(t,e.slice(2)):Ui(e)}function uf(e,t){return e===t?!0:t==="/"?e.startsWith("/"):e.startsWith(`${t}/`)}function Ui(e){let t=e.trim();return t.length>1?t.replace(/\/+$/,""):t}function pf(e){let t=e.trim(),n=/^(["'])(.*)\1$/.exec(t);return n?n[2]:t}Z();import{createHash as ff}from"node:crypto";import{hostname as mf}from"node:os";import{join as Lt}from"node:path";var Le="redskilled.sock",gf="REDSKILLED_SESSION";function hf(e={}){let t=e.env??process.env,n=t[gf]?.trim();if(n)return n;let r=t.XDG_RUNTIME_DIR?.trim();return r||`uid:${e.uid??(typeof process.getuid=="function"?process.getuid():"nouid")}`}function yf(e={}){return Ji(e.host??mf())}function te(e={}){let t=hf(e),n=e.runtimeDir??mt({key:`redskilled:${t}`,socketFileName:Le,env:e.env,uid:e.uid}),r=yf(e);return{sessionKey:t,sessionKeyHash:Ji(t),machineIdHash:r,runtimeDir:n,socketPath:Lt(n,Le),lockPath:Lt(n,"redskilled.spawn.lock"),leasePath:Lt(n,"redskilled.lease.toon"),eventLanePath:Lt(n,Vo),machineClaimPath:e.machineClaimPath??wt({env:e.env,machineIdHash:r,platform:e.platform})}}function Ji(e){return ff("sha256").update(e).digest("hex").slice(0,12)}var ir="run `/red-setup` (Section E3 \u2014 execution daemon), or `redskilled provision` directly";async function zi(e=ar()){let t=Xe(e),n=await cr(t);return n===void 0?(await qi(t,{recursive:!0,mode:z}),await Bi(t,z),{path:t,created:!0,tightened:!1,mode:z}):n===z?{path:t,created:!1,tightened:!1,mode:n}:(await Bi(t,z),{path:t,created:!1,tightened:!0,mode:z})}var Qi={needed:!1,declaredBy:`no ${et} in view`};async function dr(e={}){let t=e.homeDir??ar(),n=e.declaredTarget?.trim();if(n)return Ki(n,t,"stated on the command line");let r=e.projectRoot?.trim();if(!r)return Qi;let o=lr(r,".red","config.yaml"),s=await Gi(o,"utf8").catch(()=>{});if(s===void 0)return{needed:!1,declaredBy:`no ${o}`};let i=Fi(s);return i===void 0?{needed:!1,declaredBy:`${o} declares no workspace target (default local)`}:Ki(i,t,o)}function Ki(e,t,n){let r=`${et}: ${e} (${n})`;try{return{needed:Vi(Hi(e),t),declaredBy:r}}catch{return{needed:!1,declaredBy:`${r} \u2014 off-contract, so it names no lane under the home`}}}function Yi(e){let t=[bf(e),_f(e),vf(e),xf(e)],n=t.filter(o=>o.verdict!=="ok");return{verdict:n.some(o=>o.verdict==="missing")?"missing":n.length>0?"degraded":"ok",rows:t,findings:n}}function bf(e){let t=e.homeNeed??Qi;if(!e.homePresent)return t.needed?{check:"home",verdict:"missing",evidence:`${e.homePath} does not exist, and it is needed \u2014 ${t.declaredBy}`,fix:ir}:{check:"home",verdict:"ok",evidence:`${e.homePath} is absent and unneeded \u2014 ${t.declaredBy}; the daemon never reads it`,fix:""};let n=e.homeMode??z;return n!==z?{check:"home",verdict:"degraded",evidence:`${e.homePath} is mode ${n.toString(8)}, not owner-only ${z.toString(8)}`,fix:`${ir} \u2014 it narrows the home back to owner-only`}:{check:"home",verdict:"ok",evidence:`${e.homePath} (mode ${n.toString(8)})`,fix:""}}function _f(e){return G(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 vf(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:`${ir} \u2014 it starts the daemon and waits for the socket`}}function xf(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 Zi(e={}){let t=e.env??process.env,n=e.homeDir??ar(),r=e.paths??te({env:t}),o=Xe(n),[s,i,a]=await Promise.all([cr(o),ee(r.socketPath),e.homeNeed?Promise.resolve(e.homeNeed):dr({homeDir:n,projectRoot:e.projectRoot,declaredTarget:e.declaredTarget})]);return{homePath:o,homePresent:s!==void 0,homeMode:s,homeNeed:a,entry:se(e.entryOverride??{},{env:t,...e.entryLookup}),socketPath:r.socketPath,reachable:i,supervisorUnit:await Ef(jf(e,t,n),t)}}var Sf="redskilled.service";function Xi(e){return lr(e,"systemd","user",Sf)}function ea(e){let t=e.socketPath?` --socket ${e.socketPath}`:"";return["[Unit]","Description=redskilled \u2014 the host-scoped execution daemon (ADR 0130)","","[Service]","Type=simple",`ExecStart=${e.command} serve${t}`,"Restart=on-failure","RestartSec=2","","[Install]","WantedBy=default.target",""].join(`
|
|
61
|
-
`)}async function
|
|
59
|
+
`)}`),this.name="RedskilledReplacementEntryError",this.searched=[...n]}};function Zp(e,t={}){let n=t.env??process.env,r=t.exists??Kp,o=t.execPath??process.execPath,s=t.callerEntry===void 0?process.argv[1]:t.callerEntry,i=`redskilled-${e}.bundle.min.mjs`,l=[],a=[[xi(bt(n),i),"bundle-cache"]];s&&a.push([xi(Gp(zp(s)),i),"caller-sibling-bundle"]);for(let[c,u]of a)if(l.push(c),r(c))return{command:o,args:[c],version:e,source:u,searched:l};if(n.RED_SKILLS_NO_PINNED_DISPATCH==="1")throw new ar(e,l);return{command:n.RED_SKILLS_NPX||"npx",args:["-y","-p",`@reddb-io/red-skills@${e}`,"red-skills-redskilled"],version:e,source:"pinned-dispatch",searched:l}}function Ti(e,t={}){if(e.via==="supervisor-exit")return{via:e.via,to:e.to};let n=t.resolveEntry??(r=>Zp(r,t.env==null?{}:{env:t.env}));return{via:e.via,to:e.to,entry:n(e.to)}}function Ni(e,t,n={}){let r=n.io??{};if(e.via==="supervisor-exit"||e.entry==null)return(r.exit??ef)(Ei),{...e,exitCode:Ei};let o=[...e.entry.args,...fe(t,n.idleMs==null?{}:{idleMs:n.idleMs})];return(r.spawnSuccessor??Xp(r.env))(e.entry,o),e}function Xp(e){return(t,n)=>{let r=Jp(t.command,[...n],{detached:!0,stdio:"ignore",env:{...e??process.env,REDSKILLED_DAEMON:"1",[Oi]:"1"}});r.on("error",()=>{}),r.unref()}}function ef(e){process.exitCode=e,process.exit(e)}async function Wi(e,t=process.env,n=tf){let r=Ci(t),o=Ui(e,t);if(t[Qp]==="1")return{version:o,newest:r};let s=U(e)===null?"0.0.0":e;try{let i=await Jo({fetchText:n},s);return{version:i.sameMajor??o,newest:i.newest??r}}catch{return{version:o,newest:r}}}function Mi(e,t=process.env,n){let r=n??dr;return{version:Ui(e,t,r),newest:Ci(t,r)}}function Ci(e=process.env,t=dr){return Hi(Fi(e,t))}function Ui(e,t=process.env,n=dr){let r=U(e.trim())?.major;return r===void 0?null:Hi(Fi(t,n).filter(o=>U(o)?.major===r))}function Fi(e,t){let n=[];for(let r of t(bt(e))){let o=/^redskilled-(.+)\.bundle\.min\.mjs$/.exec(r)?.[1];!o||U(o)===null||n.push(o)}return n}function Hi(e){let t=null;for(let n of e)(t===null||rr(n,t)>0)&&(t=n);return t}function dr(e){try{return qp(e)}catch{return[]}}async function tf(e){let t=await fetch(e,{headers:{accept:"application/json"}});if(!t.ok)throw new Error(`registry read failed with HTTP ${t.status}`);return await t.text()}import{mkdir as nf,readFile as rf,rename as of,rm as cr,writeFile as Vi}from"node:fs/promises";import{randomUUID as sf}from"node:crypto";import{dirname as lf}from"node:path";var It=class extends Error{constructor(t){super(`redskilled lease ${JSON.stringify(t)} is held by another owner`),this.name="RedskilledLeaseOwnershipError"}};async function pr(e){let t;try{t=await rf(e,"utf8")}catch(r){if(r.code==="ENOENT")return;throw r}let n=af(t);return df(n)?n:void 0}var Bi;function Ki(){return Bi??={pid:process.pid,startTime:new Date(Date.now()-Math.round(process.uptime()*1e3)).toISOString()},Bi}function qi(e,t,n={}){let r=n.clock??(()=>new Date().toISOString()),o=n.isPidAlive??N;async function s(){return await pr(e)}async function i(a){let c=`${e}.${a.pid}.${sf()}.tmp`;await Vi(c,Ji(a),{encoding:"utf8",mode:384}),await of(c,e)}function l(a,c){return{version:1,pid:a.pid,start_time:a.startTime,session_key_hash:t.sessionKeyHash,machine_id_hash:t.machineIdHash,socket_path:t.socketPath,acquired_at:c,renewed_at:c}}return{read:s,async acquire(a){await nf(lf(e),{recursive:!0,mode:448});let c=!1;for(;;){let u=r(),f=l(a,u);try{return await Vi(e,Ji(f),{encoding:"utf8",mode:384,flag:"wx"}),{acquired:!0,reaped:c,lease:f}}catch(h){if(h.code!=="EEXIST")throw h}let p=await s();if(!p){await cr(e,{force:!0}),c=!0;continue}if(ur(p,a))return{acquired:!0,reaped:c,lease:p};if(await o(p.pid))return{acquired:!1,lease:p};await cr(e,{force:!0}),c=!0}},async renew(a){let c=await s();if(!c||!ur(c,a))throw new It(e);let u={...c,renewed_at:r()};return await i(u),u},async release(a){let c=await s();if(!c)return!1;if(!ur(c,a))throw new It(e);return await cr(e,{force:!0}),!0}}}function ur(e,t){return e.pid===t.pid&&e.start_time===t.startTime}function Ji(e){return`${I(e,{keyedMapCollapse:!0})}
|
|
60
|
+
`}function af(e){let t=e.trim();if(!t)return null;try{return JSON.parse(t)}catch{try{return K(t)}catch{return null}}}function df(e){if(e===null||typeof e!="object"||Array.isArray(e))return!1;let t=e;if(t.version!==1||!Number.isInteger(t.pid)||t.pid<=0)return!1;for(let n of["start_time","session_key_hash","machine_id_hash","socket_path","acquired_at","renewed_at"])if(typeof t[n]!="string"||t[n].length===0)return!1;return!0}var fr=3e5,yf=1e4,kf=6e4,Rf=15e3,Gi=16,Le=class extends Error{constructor(n,r){super(`a redskilled daemon already owns ${JSON.stringify(n)}`);this.socketPath=n;this.lease=r;this.name="RedskilledAlreadyRunningError"}},wf="no tracker transport was given to this daemon, so no queue depth was ever asked for";async function Qi(e){let{paths:t}=e,n=e.daemonVersion??"0.0.0-dev",r=e.idleMs??fr,o=e.clock??(()=>new Date().toISOString()),s=e.launch??ki,i=e.ceiling??es();e.repositoryActivity!=null&&Kn(e.repositoryActivity.projects,e.repositoryActivity.hostTokenRef);let l=e.owner??Ki(),a=e.leaseStore??qi(t.leasePath,{sessionKeyHash:t.sessionKeyHash,machineIdHash:t.machineIdHash,socketPath:t.socketPath},{clock:o}),c=e.machineOwner??gs(),u={machineIdHash:t.machineIdHash,sessionKeyHash:t.sessionKeyHash,socketPath:t.socketPath},f=e.machineClaimStore??Et(t.machineClaimPath,u,{clock:o});await mf(hf(t.socketPath),{recursive:!0,mode:448});let p=await f.claim(c);if(!p.claimed)throw p.claim?.socket_path===t.socketPath?new Le(t.socketPath):new le(f.claimPath,p.reason,p.claim);let h=await a.acquire(l);if(!h.acquired)throw await f.release(c).catch(()=>{}),new Le(t.socketPath,h.lease);let y;try{y=await bf(t.socketPath)}catch(d){throw await a.release(l).catch(()=>{}),await f.release(c).catch(()=>{}),d}let w=o(),b=e.eventLane??rs(t.eventLanePath),_=e.liveness??ei,O=e.stopWorker??li,F=e.unitInventory??(()=>ri(t.machineClaimPath,xt({machineIdHash:t.machineIdHash}))?oi():[]),M=e.unitMainPid??ni,ae=e.treeSampler??Es,he=e.readLogTail??Ri,st=e.sampleMs??Rf,_r=e.publishedVersion??(d=>Wi(d)),vr=e.replaceCheckMs??Pi,Sr=e.publishedProbeTimeoutMs??yf,Ol=e.localPublishedEvidence??(d=>Mi(d,e.replacementIO?.env??process.env)),Dl=e.bornByReplacement??Di(),xr=e.replaceBootCheckMs??kf,Er=e.supervised??Ii(),jr=e.replacementIO??{},H=e.repositoryActivity,Pr=H?.intervalMs??6e4,Ie=e.queueDiscovery,Or=Ie?.transport??H?.transport,Ll=Ie?.unconfiguredReason??wf,Dr=Ie?.intervalMs??15e3,Lr=e.demandMs??15e3,$l=e.demandBackoffMs??3e4,x=new Map,re=new Set,ye=new Map,A=new Map,Wt=new Set,$r={},Mt=null,Ar=null,Ct=null,Ir=!1,Ut=0,Ft=null,Te="none",Ht=null,Tr=null,Vt=null,oe=null,it=null,Ne=[],We=null,Bt=!1,ke,Me,Ce,Ue,lt,Fe,He,Q=!1,Jt=!1,at=null,Nr,Kt=new Promise(d=>{Nr=d});function Ve(d){Wr(d);let m=Date.parse(d),g=_s(A.values(),m);for(let R of g.lapsed)A.delete(R.project_label),Al(R,m);return g.lapsed}function Al(d,m){let g=Number.isFinite(m)?new Date(m).toISOString():d.renew_by;Ne.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`}),Ne.length>Gi&&Ne.splice(0,Ne.length-Gi)}function Wr(d){if(A.size===0)return;let m=Date.parse(d);if(!Number.isFinite(m))return;let g={};for(let v of x.values())g[v.project_label]=(g[v.project_label]??0)+1;let R=new Map((oe?.projects??[]).map(v=>[v.project_label,v]));for(let v of[...A.values()]){let P=R.get(v.project_label),we=ws(v,{now:d,...P==null?{}:{queue:{outcome:P.outcome,depth:P.depth}},liveWorkers:g[v.project_label]??0});we.registration!==v&&A.set(v.project_label,we.registration)}}function dt(){let d=o();return Ve(d),Ns({now:d,daemonVersion:n,machineIdHash:t.machineIdHash,sessionKeyHash:t.sessionKeyHash,pid:l.pid,startedAt:w,scope:hs(f.claimPath,u,c),workers:[...x.values()],registrations:[...A.values()],lapses:Ne,queue:oe,published:{version:Ar,checkedAt:Ct,newer:Ir,replacement:Te,newest:Ht,majorHold:Tr,checks:Ut,holdReason:Ft}})}function qt(){return Is({hostState:dt(),ceiling:i,rss:$r,sampledAt:Mt,logLines:Object.fromEntries(ye),now:o(),reattachedWorkerIds:[...re],repositoryActivity:Vt})}async function Gt(){return H==null||H.projects.length===0?null:(Vt=await Os({projects:H.projects,hostTokenRef:H.hostTokenRef,transport:H.transport,closedWindowMs:H.closedWindowMs,now:o()}),Vt)}async function Mr(){let d=o();Ve(d);let m=[...A.values()].map(g=>({project_label:g.project_label,selector:g.selector})).sort((g,R)=>g.project_label.localeCompare(R.project_label));return m.length===0?null:Or==null?(oe=di(m,d,Ll),oe):(oe=await ci({projects:m,transport:Or,now:d,...Ie?.batchSize==null?{}:{batchSize:Ie.batchSize}}),Wr(o()),oe)}async function Cr(){let d=o();if(Bt)return it??is(d);Bt=!0;try{let m={};for(let $ of x.values())m[$.project_label]=(m[$.project_label]??0)+1;let g={};for(let $ of oe?.projects??[])g[$.project_label]=$.depth;let R=Date.parse(d),v=ss({projects:[...A.values()].map($=>({project_label:$.project_label,selector:$.selector,argv:$.argv,workspace_path:$.workspace_path,target:$.target})),queue:g,live:m,nowMs:Number.isFinite(R)?R:0,backoffUntilMs:We}),P=[],we=null;for(let $ of v.births){let mt;try{mt=zt({project_label:$.project_label,workspace_path:$.workspace_path,command:$.argv[0],args:$.argv.slice(1)})}catch(Zt){we=Zt instanceof Error?Zt.message:String(Zt),We=(Number.isFinite(R)?R:Date.now())+$l;break}P.push({project_label:$.project_label,worker_id:mt.worker.worker_id,pid:mt.worker.pid,warnings:mt.warnings})}return we==null&&v.births.length>0&&(We=null),it={version:1,at:d,requested:v.births.length,granted:P,shortfall:v.births.length-P.length,refusal:we,retry_after:We==null?null:new Date(We).toISOString(),projects:v.intents},it}finally{Bt=!1}}function Il(d){return fi(qt(),{...D,mode:d?.mode??D.mode,project:d?.project??D.project,maxWorkers:d?.max_workers??D.maxWorkers,maxProjects:d?.max_projects??D.maxProjects,maxWidth:d?.max_width??D.maxWidth,verbose:d?.verbose??D.verbose})}function Re(d,m,g){return Ss({op:d,sessionProject:m??null,targetProject:g})}async function Tl(d){let m=x.get(d.worker_id),g=Re(vs(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 R=m!=null&&await Cl(m,d.detail??"stopped by its own project");return{version:1,command:d.command,worker_id:d.worker_id,applied:R,reach:g,detail:R?`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 ct(d){x.delete(d),re.delete(d),ye.delete(d)}function Ur(d){let m=x.get(d.worker_id),g=Re("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 R=o();return ye.set(d.worker_id,{line:d.last_log_line,published_at:R,source:"heartbeat"}),{version:1,worker_id:d.worker_id,accepted:!0,reach:g,published_at:R,detail:`redskilled stored a line for Worker ${JSON.stringify(d.worker_id)} without reading it`}}async function Nl(d,m,g){let R=`exit code=${m??"null"} signal=${g??"null"}`;if(d.unit!=null&&d.unit!==""&&await Wl(d)){Ml(d,`its launch client ended (${R}) 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}ct(d.worker_id),Y("worker-death",d,R,{exitCode:m,signal:g}),L()}async function Wl(d){try{return await _(d)===!0}catch{return!1}}function Ml(d,m){let g=d.unit==null?null:M(d.unit);x.set(d.worker_id,{...d,...g!=null&&g>0?{pid:g}:{},warnings:[...d.warnings,m]}),re.add(d.worker_id),L()}function Fr(d,m){let g=Re("project-register",m,d.project_label);if(!g.permitted)throw new Error(g.reason);let R=o();Ve(R);let v=ks(d,{now:R,held:A.get(d.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 Hr(d,m={}){let g=Re("project-renew",m.sessionProject,d);if(!g.permitted)throw new Error(g.reason);let R=o();Ve(R);let v=A.get(d);if(v==null)throw new jt(d);let P=Rs(v,{now:R,...m.renewWithinMs==null?{}:{renew_within_ms:m.renewWithinMs},...m.launch==null?{}:{launch:m.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}`+(m.launch==null?"":`, carrying launch revision ${P.launch_revision} for its next Worker`)}}function Vr(d,m){let g=Re("project-deregister",m,d);if(!g.permitted)throw new Error(g.reason);let R=A.delete(d);return{version:1,project_label:d,released:R,reach:g,detail:R?`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 Cl(d,m){try{await O(d)}catch{}return ct(d.worker_id),Y("worker-death",d,m),L(),!0}function Br(d){return Xo({ceiling:i,workers:[...x.values()],budget:d.budget,projectLabel:d.project_label})}function zt(d){let m=s({spec:d,admission:Br(d),clock:o,onExit:(g,R,v)=>{let P=x.get(g);if(P==null){L();return}Nl(P,R,v).catch(()=>{})}});return x.set(m.worker.worker_id,m.worker),Y("worker-birth",m.worker,null),L(),m}function Y(d,m,g,R={}){Q||b.record({event:d,worker:m,ts:o(),detail:g,...R.exitCode!==void 0?{exitCode:R.exitCode}:{},...R.signal!==void 0?{signal:R.signal}:{}}).catch(()=>{})}async function Jr(){let d=[...re].map(g=>x.get(g)).filter(g=>g!=null);if(d.length===0)return[];let{dead:m}=await Xn(d,_);for(let g of m)ct(g.worker_id),Y("worker-death",g,"the host no longer confirms this Worker");return m.length>0&&L(),m}async function Kr(d,m){let g=x.get(d);if(!g)return!1;try{await O(g)}catch{}return ct(d),Y("worker-budget-kill",g,m),L(),!0}async function qr(){let d=[...x.values()];if(d.length===0)return[];let m;try{m=await ae(d)}catch{return[]}let g=m.rss;$r=g,Mt=o(),Ul(m.cpu_seconds,Mt);let{terminations:R}=xs({workers:d,rss:g}),v=[];for(let P of R)await Kr(P.worker_id,P.reason)&&v.push(P);return v}function Ul(d,m){for(let[g,R]of Object.entries(d)){if(typeof R!="number"||!Number.isFinite(R))continue;let v=x.get(g);v&&x.set(g,{...v,cpu:{cpu_seconds:R,sampled_at:m}})}}async function Fl(){try{return Sr<=0?await _r(n):await new Promise(d=>{let m=setTimeout(()=>d(Qt()),Sr);m.unref(),_r(n).then(g=>{clearTimeout(m),d(g)},()=>{clearTimeout(m),d(Qt())})})}catch{return Qt()}}function Qt(){try{return Ol(n)}catch{return null}}async function Gr(){if(nt(n))return Ut+=1,Ct=o(),Ft="local-build",{act:"hold",reason:"local-build"};let d=Li(await Fl()),m=d.version;Ar=m,Ht=d.newest??null,Ct=o(),Tr=$i({running:n,newest:Ht,supervised:Er});let g=Ai({running:n,published:m,supervised:Er});return Ir=g.act==="replace",Ut+=1,Ft=g.act==="hold"?g.reason:null,Te!=="in-progress"&&(Te=g.act==="replace"?"pending":"none"),g}async function ut(){let d=await Gr();if(d.act!=="replace"||Te==="in-progress")return d;let m=Ti(d,jr);return Te="in-progress",await b.flush().catch(()=>{}),await ft({reason:"replaced"}),Ni(m,t,{...r==null?{}:{idleMs:r},io:jr}),d}function Hl(){Q||Ue!=null||vr<=0||(!Dl&&xr>0&&(lt=setTimeout(()=>{ut().catch(()=>{})},xr),lt.unref()),Ue=setInterval(()=>{ut().catch(()=>{})},vr),Ue.unref())}function Vl(){Q||Me!=null||st<=0||(Me=setInterval(()=>{qr().catch(()=>{})},st),Me.unref())}function Bl(){Q||Fe!=null||H==null||H.projects.length===0||Pr<=0||(Gt().catch(()=>{}),Fe=setInterval(()=>{Gt().catch(()=>{})},Pr),Fe.unref())}function Jl(){Q||He!=null||Dr<=0||(He=setInterval(()=>{Mr().catch(()=>{})},Dr),He.unref())}function Kl(){Q||Ce!=null||Lr<=0||(Ce=setInterval(()=>{Cr().catch(()=>{})},Lr),Ce.unref())}function L(){Q||(ke&&clearTimeout(ke),ke=setTimeout(()=>{Jr().catch(()=>{}).then(()=>zr())},r),ke.unref())}function zr(){return x.size>0?(L(),"held-by-workers"):(Ve(o()),A.size>0?(L(),"held-by-registrations"):(ql(),"exited"))}async function ql(){if(!nt(n)){if((await ut().catch(()=>null))?.act==="replace"||Jt||Q)return;if(x.size>0||A.size>0){L();return}}await ft({reason:"idle"})}function pt(d){return as({reason:d,socketPath:t.socketPath,daemonVersion:n,pid:l.pid,workers:[...x.values()],projects:[...A.keys()]})}function Qr(d){if(at!=null)return at;let m=d.reason??"requested",g=d.note?.trim();return at=b.recordDaemonStop({ts:o(),pid:l.pid,socketPath:t.socketPath,reason:m,detail:g==null||g===""?pt(m).detail:`${pt(m).detail} \u2014 ${g}`,...d.signal==null?{}:{signal:d.signal}}).catch(()=>{}),at}async function ft(d={}){if(Jt)return await Kt;Jt=!0,await Qr(d),Q=!0,ke&&clearTimeout(ke),Me&&clearInterval(Me),Ue&&clearInterval(Ue),lt&&clearTimeout(lt),Fe&&clearInterval(Fe),He&&clearInterval(He),Ce&&clearInterval(Ce),await b.flush().catch(()=>{}),y.close();for(let m of Wt)m.destroy();return await new Promise(m=>y.once("close",()=>m())),await zi(t.socketPath,{force:!0}),await a.release(l).catch(()=>{}),await f.release(c).catch(()=>{}),Nr(),await Kt}let Gl=os(await b.read().catch(()=>[])),Yt=await Xn(Gl,_);for(let d of Yt.alive){let m=ii(d),g=m.unit==null||N(m.pid)?null:M(m.unit);x.set(m.worker_id,g!=null&&g>0?{...m,pid:g}:m),re.add(m.worker_id)}for(let d of Yt.dead)Y("worker-death",d,"the Worker ended while no daemon was watching");let zl=si({units:await Promise.resolve(F()).catch(()=>[]),held:[...x.values()],mainPid:M,now:w});for(let d of zl)x.set(d.worker_id,d),re.add(d.worker_id),Y("worker-birth",d,"adopted from an active unit with no birth on this lane");for(let d of Yt.alive){if(d.log_path==null||ye.has(d.worker_id))continue;let m=await he(d.log_path).catch(()=>null);m==null||m.trim()===""||ye.set(d.worker_id,{line:m,published_at:o(),source:"rehydrated"})}y.on("connection",d=>{Wt.add(d),d.once("close",()=>Wt.delete(d)),L(),_f(d,async(m,g)=>{L();let R=await Ql(m);g(R),m.op==="shutdown"&&setImmediate(()=>void ft({reason:"requested"}))})});async function Ql(d){try{if(d.op==="ping")return{id:d.id,ok:!0,value:{pong:!0,protocol_version:Pt,daemon_version:n,pid:l.pid}};if(d.op==="host-state")return{id:d.id,ok:!0,value:dt()};if(d.op==="statusline-payload")return{id:d.id,ok:!0,value:qt()};if(d.op==="statusline-string")return{id:d.id,ok:!0,value:Il(d.render)};if(d.op==="worker-heartbeat")return{id:d.id,ok:!0,value:Ur(d.heartbeat)};if(d.op==="project-register")return{id:d.id,ok:!0,value:Fr(d.registration,d.session_project)};if(d.op==="project-renew")return{id:d.id,ok:!0,value:Hr(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:Vr(d.project_label,d.session_project)};if(d.op==="worker-command")return{id:d.id,ok:!0,value:await Tl(d.command)};if(d.op==="worker-start"){let g=Re("worker-start",d.session_project,d.spec.project_label);if(!g.permitted)return{id:d.id,ok:!1,error:g.reason};let R=zt(d.spec);return await b.flush().catch(()=>{}),{id:d.id,ok:!0,value:{worker:R.worker,admission:R.admission,warnings:R.warnings}}}if(d.op==="shutdown"){let g=pt("requested");return await Qr({reason:"requested",...d.detail==null?{}:{note:d.detail}}),{id:d.id,ok:!0,value:g}}let m=d;return{id:m.id??Tt(),ok:!1,error:`unsupported redskilled op: ${m.op??"unknown"}`}}catch(m){return{id:d.id??Tt(),ok:!1,error:m instanceof Error?m.message:String(m)}}}return L(),Vl(),Hl(),Bl(),Jl(),Kl(),{socketPath:t.socketPath,lease:h.lease,startedAt:w,closed:Kt,startWorker:zt,admit:Br,ceiling:()=>i,killWorkerOverBudget:Kr,sampleMemoryBudgets:qr,pollRepositoryActivity:Gt,pollQueueDiscovery:Mr,queueDiscovery:()=>oe,driveDemand:Cr,demand:()=>it,sweepReattached:Jr,publishWorkerHeartbeat:Ur,reattached:()=>[...re].map(d=>x.get(d)).filter(d=>d!=null),flushEvents:()=>b.flush(),trackWorker(d){x.set(d.worker_id,d),Y("worker-birth",d,null),L()},releaseWorker(d){let m=x.get(d),g=x.delete(d);return re.delete(d),ye.delete(d),m&&Y("worker-death",m,"released by the daemon"),L(),g},workerCount:()=>x.size,registerProject:Fr,renewProject:Hr,deregisterProject:Vr,registrations:()=>dt().registrations??[],hostState:dt,statuslinePayload:qt,evaluateIdle:zr,observePublishedVersion:Gr,checkForReplacement:ut,stopReport:pt,stop:ft}}async function bf(e){for(let t=0;t<2;t++){let n=gf();try{return await new Promise((r,o)=>{n.once("error",o),n.listen(e,()=>{n.off("error",o),r()})}),n}catch(r){if(n.close(),r.code!=="EADDRINUSE")throw r;if(await te(e))throw new Le(e);await zi(e,{force:!0})}}throw new Le(e)}async function te(e,t=250){try{return(await kt({socketPath:e,timeoutMs:t},{id:Tt(),op:"ping"},"redskilled daemon")).ok===!0}catch{return!1}}function _f(e,t){Uo(e,(n,r)=>t(n,r),(n,r,o)=>{o({id:r?.id??Tt(),ok:!1,error:n instanceof Error?n.message:String(n)})})}X();var jf=1e4,$e=class extends Error{constructor(n,r){super(`redskilled daemon is unreachable on ${JSON.stringify(n)}, so no Worker was started: ${r instanceof Error?r.message:String(r)}`);this.socketPath=n;this.cause=r;this.name="RedskilledUnreachableError"}};async function mr(e,t={}){try{return await Pf(e,t)}catch(n){throw n instanceof le||n instanceof $e?n:new $e(e.socketPath,n)}}async function Pf(e,t){if(await Sf(Ef(e.socketPath),{recursive:!0,mode:448}),await te(e.socketPath))return"already-running";await Of(e);let n=await Fo(e.lockPath);if(!n)return await Yi(e,t),"joined";try{if(await te(e.socketPath))return"already-running";let r=await $f(e,t);return await Yi(e,t,r),"spawned"}finally{await n.close(),await xf(e.lockPath,{force:!0})}}async function Of(e){let n=await Et(e.machineClaimPath,{machineIdHash:e.machineIdHash,sessionKeyHash:e.sessionKeyHash,socketPath:e.socketPath}).read().catch(()=>{});if(n!=null&&n.socket_path!==e.socketPath&&N(n.pid))throw new le(e.machineClaimPath,"held",n)}async function Xi(e,t,n={}){await mr(e,n);let r;try{r=await Xe({socketPath:e.socketPath,timeoutMs:n.requestTimeoutMs??2e3},{...t,id:Zi()})}catch(o){throw new $e(e.socketPath,o)}if(!r.ok)throw new Error(r.error);return r.value}async function el(e,t={},n={}){if(!await te(e.socketPath))return ds(e.socketPath);let r;try{r=await Xe({socketPath:e.socketPath,timeoutMs:n.requestTimeoutMs??2e3},{id:Zi(),op:"shutdown",...t.detail==null?{}:{detail:t.detail}})}catch(i){throw new $e(e.socketPath,i)}if(!r.ok)throw new Error(r.error);if(!Wn(r.value))throw new Error("redskilled daemon returned a malformed stop report");let o=r.value;return await Df(e.socketPath,t.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 Df(e,t){let n=Date.now()+t;for(;;){if(!await te(e))return!0;if(Date.now()>=n)return!1;await new Promise(r=>setTimeout(r,25))}}async function tl(e,t={}){let n=await Xi(e,{op:"host-state"},t);if(!Ws(n))throw new Error("redskilled daemon returned a malformed host state");return n}async function nl(e,t=void 0,n={}){let r=await Xi(e,{op:"statusline-string",...n.sessionProject!=null?{session_project:n.sessionProject}:{},...t==null?{}:{render:Lf(t)}},n);if(!Ts(r))throw new Error("redskilled daemon returned a malformed statusline render");return r}function Lf(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 Yi(e,t,n){let r=Date.now()+(t.readyTimeoutMs??jf);for(;;){if(await te(e.socketPath))return;if(n?.failure)throw new Error(`redskilled daemon failed to start from ${JSON.stringify(n.entry.entry??n.entry.command)} (resolved as ${n.entry.source}): ${n.failure.message}`);if(Date.now()>=r){let o=n?` from ${JSON.stringify(n.entry.entry??n.entry.command)} (resolved as ${n.entry.source})${n.exit?`, which ${n.exit}`:""}`:"";throw new Error(`redskilled daemon did not start on ${JSON.stringify(e.socketPath)}${o}`)}await new Promise(o=>setTimeout(o,25))}}async function $f(e,t){let n=t.serverCommand??(t.serverArgs!=null?process.execPath:void 0),r=await zo({...n!=null?{serverCommand:n}:{},serverArgs:t.serverArgs},t.entryLookup??{}),o={entry:r},s=[...r.args,...fe(e,t.idleMs==null?{}:{idleMs:t.idleMs})],i=vf(r.command,s,{detached:!0,stdio:"ignore",env:{...t.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}X();import{chmod as dl,mkdir as ul,readFile as pl,stat as Jf,writeFile as Kf}from"node:fs/promises";import{homedir as yr}from"node:os";import{dirname as qf,join as kr}from"node:path";import{join as Af}from"node:path";var If=[".red","redskilled"],z=448;function rt(e){return Af(e,...If)}import{join as Tf}from"node:path";var rl=["local","tmp","host"],Nf="local",ot="plugins.dev.workspace.target";var gr=class extends Error{constructor(t){super(t),this.name="WorkspaceConfigError"}};function sl(e){let t=xe(e,ot),n=Cf(t??"").trim();return n===""?void 0:n}function il(e){let t=(e??"").trim();if(t==="")return{kind:"preset",preset:Nf};let n=rl.find(r=>r===t.toLowerCase());if(n)return{kind:"preset",preset:n};if(t.startsWith("/")||t==="~"||t.startsWith("~/"))return{kind:"custom",parentDir:t};throw new gr(`${ot}: unknown workspace target ${JSON.stringify(t)}. Use one of the presets (${rl.join(", ")}) or an absolute parent directory for Workers.`)}function ll(e,t){return e.kind==="preset"?e.preset==="host":Mf(Wf(e.parentDir,t),rt(t))}function Wf(e,t){return e==="~"?ol(t):e.startsWith("~/")?Tf(t,e.slice(2)):ol(e)}function Mf(e,t){return e===t?!0:t==="/"?e.startsWith("/"):e.startsWith(`${t}/`)}function ol(e){let t=e.trim();return t.length>1?t.replace(/\/+$/,""):t}function Cf(e){let t=e.trim(),n=/^(["'])(.*)\1$/.exec(t);return n?n[2]:t}X();import{createHash as Uf}from"node:crypto";import{hostname as Ff}from"node:os";import{join as Nt}from"node:path";var Ae="redskilled.sock",Hf="REDSKILLED_SESSION";function Vf(e={}){let t=e.env??process.env,n=t[Hf]?.trim();if(n)return n;let r=t.XDG_RUNTIME_DIR?.trim();return r||`uid:${e.uid??(typeof process.getuid=="function"?process.getuid():"nouid")}`}function Bf(e={}){return al(e.host??Ff())}function ne(e={}){let t=Vf(e),n=e.runtimeDir??Rt({key:`redskilled:${t}`,socketFileName:Ae,env:e.env,uid:e.uid}),r=Bf(e);return{sessionKey:t,sessionKeyHash:al(t),machineIdHash:r,runtimeDir:n,socketPath:Nt(n,Ae),lockPath:Nt(n,"redskilled.spawn.lock"),leasePath:Nt(n,"redskilled.lease.toon"),eventLanePath:Nt(n,ns),machineClaimPath:e.machineClaimPath??xt({env:e.env,machineIdHash:r,platform:e.platform})}}function al(e){return Uf("sha256").update(e).digest("hex").slice(0,12)}var hr="run `/red-setup` (Section E3 \u2014 execution daemon), or `redskilled provision` directly";async function fl(e=yr()){let t=rt(e),n=await wr(t);return n===void 0?(await ul(t,{recursive:!0,mode:z}),await dl(t,z),{path:t,created:!0,tightened:!1,mode:z}):n===z?{path:t,created:!1,tightened:!1,mode:n}:(await dl(t,z),{path:t,created:!1,tightened:!0,mode:z})}var ml={needed:!1,declaredBy:`no ${ot} in view`};async function Rr(e={}){let t=e.homeDir??yr(),n=e.declaredTarget?.trim();if(n)return cl(n,t,"stated on the command line");let r=e.projectRoot?.trim();if(!r)return ml;let o=kr(r,".red","config.yaml"),s=await pl(o,"utf8").catch(()=>{});if(s===void 0)return{needed:!1,declaredBy:`no ${o}`};let i=sl(s);return i===void 0?{needed:!1,declaredBy:`${o} declares no workspace target (default local)`}:cl(i,t,o)}function cl(e,t,n){let r=`${ot}: ${e} (${n})`;try{return{needed:ll(il(e),t),declaredBy:r}}catch{return{needed:!1,declaredBy:`${r} \u2014 off-contract, so it names no lane under the home`}}}function gl(e){let t=[Gf(e),zf(e),Qf(e),Yf(e)],n=t.filter(o=>o.verdict!=="ok");return{verdict:n.some(o=>o.verdict==="missing")?"missing":n.length>0?"degraded":"ok",rows:t,findings:n}}function Gf(e){let t=e.homeNeed??ml;if(!e.homePresent)return t.needed?{check:"home",verdict:"missing",evidence:`${e.homePath} does not exist, and it is needed \u2014 ${t.declaredBy}`,fix:hr}:{check:"home",verdict:"ok",evidence:`${e.homePath} is absent and unneeded \u2014 ${t.declaredBy}; the daemon never reads it`,fix:""};let n=e.homeMode??z;return n!==z?{check:"home",verdict:"degraded",evidence:`${e.homePath} is mode ${n.toString(8)}, not owner-only ${z.toString(8)}`,fix:`${hr} \u2014 it narrows the home back to owner-only`}:{check:"home",verdict:"ok",evidence:`${e.homePath} (mode ${n.toString(8)})`,fix:""}}function zf(e){return G(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 Qf(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:`${hr} \u2014 it starts the daemon and waits for the socket`}}function Yf(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 hl(e={}){let t=e.env??process.env,n=e.homeDir??yr(),r=e.paths??ne({env:t}),o=rt(n),[s,i,l]=await Promise.all([wr(o),te(r.socketPath),e.homeNeed?Promise.resolve(e.homeNeed):Rr({homeDir:n,projectRoot:e.projectRoot,declaredTarget:e.declaredTarget})]);return{homePath:o,homePresent:s!==void 0,homeMode:s,homeNeed:l,entry:ie(e.entryOverride??{},{env:t,...e.entryLookup}),socketPath:r.socketPath,reachable:i,supervisorUnit:await Xf(em(e,t,n),t)}}var Zf="redskilled.service";function yl(e){return kr(e,"systemd","user",Zf)}function kl(e){let t=e.socketPath?` --socket ${e.socketPath}`:"";return["[Unit]","Description=redskilled \u2014 the host-scoped execution daemon (ADR 0130)","","[Service]","Type=simple",`ExecStart=${e.command} serve${t}`,"Restart=on-failure","RestartSec=2","","[Install]","WantedBy=default.target",""].join(`
|
|
61
|
+
`)}async function Rl(e){let t=yl(e.configHome);return await wr(t)!==void 0?{path:t,status:"already-present"}:(await ul(qf(t),{recursive:!0}),await Kf(t,e.unit,"utf8"),{path:t,status:"installed"})}async function Xf(e,t){if(process.platform!=="linux")return"unsupported";try{return await pl(yl(e),"utf8"),"installed"}catch{return t.XDG_RUNTIME_DIR?"absent":"unsupported"}}function em(e,t,n){return e.configHome??t.XDG_CONFIG_HOME?.trim()??kr(n,".config")}async function wr(e){try{return(await Jf(e)).mode&511}catch{return}}import{readdir as bl,rm as tm,stat as nm}from"node:fs/promises";import{dirname as rm,join as br}from"node:path";var om=5*6e4,sm="redskilled.";function im(e={}){let t=e.env??process.env,n=i=>rm(Rt({key:"redskilled:reclaim-probe",socketFileName:Ae,env:i,...e.uid===void 0?{}:{uid:e.uid}})),{XDG_RUNTIME_DIR:r,...o}=t,s=[n(t),n(o)];return[...new Set(s)]}async function _l(e={}){let t=e.roots??im(e),n=e.graceMs??om,r=e.now??Date.now,o=e.isPidAlive??N,s=e.answers??cm,i=e.dryRun===!0,l=[];for(let a of t){let c;try{c=(await bl(a,{withFileTypes:!0})).filter(u=>u.isDirectory()).map(u=>u.name)}catch{continue}for(let u of c.sort())l.push(await lm(br(a,u),{graceMs:n,now:r,pidAlive:o,answers:s,dryRun:i}))}return{roots:t,scanned:l.length,reclaimed:l.filter(a=>a.verdict==="reclaimed").length,dryRun:i,entries:l}}async function lm(e,t){let n;try{n=(await bl(e)).sort()}catch(i){return{dir:e,verdict:"failed",reason:vl(i),removed:[]}}let r=n.filter(i=>i.startsWith(sm));if(n.length>0&&r.length===0)return{dir:e,verdict:"foreign",reason:"holds no redskilled files",removed:[]};let o=await am(br(e,"redskilled.lease.toon"));if(o!==void 0)return await t.pidAlive(o.pid)?{dir:e,verdict:"live",reason:`lease pid ${o.pid} is alive`,removed:[]}:await wl(e,n,`lease pid ${o.pid} is dead`,t);if(n.includes(Ae)&&await t.answers(br(e,Ae)))return{dir:e,verdict:"live",reason:"socket answers with no lease",removed:[]};let s=await dm(e,t.now);return s!==void 0&&s<t.graceMs?{dir:e,verdict:"young",reason:`no lease, modified ${Math.round(s/1e3)}s ago`,removed:[]}:await wl(e,n,n.length===0?"empty and stale":"no lease and stale",t)}async function wl(e,t,n,r){if(r.dryRun)return{dir:e,verdict:"reclaimed",reason:`${n} (dry run)`,removed:t};try{await tm(e,{recursive:!0,force:!0})}catch(o){return{dir:e,verdict:"failed",reason:vl(o),removed:[]}}return{dir:e,verdict:"reclaimed",reason:n,removed:t}}async function am(e){try{return await pr(e)}catch{return}}async function dm(e,t){try{return Math.max(0,t()-(await nm(e)).mtimeMs)}catch{return}}async function cm(e){try{return(await Xe({socketPath:e,timeoutMs:250},{id:`redskilled-reclaim-${process.pid}`,op:"ping"})).ok}catch{return!1}}function vl(e){return e instanceof Error?e.message:String(e)}var um="plugins.dev.statusline",pm="dev.statusline";function fm(e){let t=[],n=l=>{for(let a of[um,pm]){let c=`${a}.${l}`,u=xe(e,c)?.trim();if(u!=null&&u!=="")return{key:c,value:u}}},r=n("mode"),o={};r!=null&&(r.value==="local"||r.value==="global"?o.mode=r.value:t.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=n(l.leaf);if(a==null)continue;let c=Number(a.value);Number.isInteger(c)&&c>=0?l.assign(c):t.push({...a,reason:"expected a whole number of zero or more"})}let i=n("verbose");return i!=null&&(i.value==="true"||i.value==="false"?o.verbose=i.value==="true":t.push({...i,reason:"expected `true` or `false`"})),{config:o,warnings:t}}var mm={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 Sl(e){let{values:t,positionals:n}=pe(e,mm),r=[],o={},s=t.mode??n.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`"})),t.project!=null&&(o.project=t.project),t.verbose!==void 0&&(o.verbose=t.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=t[l.flag];if(a==null)continue;let c=Number(a);Number.isInteger(c)&&c>=0?l.assign(c):r.push({key:`--${l.flag}`,value:a,reason:"expected a whole number of zero or more"})}return{flags:o,warnings:r}}function xl(e={}){let t=e.configText==null?{config:{},warnings:[]}:fm(e.configText),n=e.flags??{};return{options:{...D,mode:n.mode??t.config.mode??D.mode,project:n.project!==void 0?n.project:e.project??D.project,maxWorkers:n.maxWorkers??t.config.maxWorkers??D.maxWorkers,maxProjects:n.maxProjects??t.config.maxProjects??D.maxProjects,maxWidth:n.maxWidth??t.config.maxWidth??D.maxWidth,verbose:n.verbose??t.config.verbose??D.verbose},warnings:t.warnings}}var ym=`Usage: redskilled <command> [options]
|
|
62
62
|
|
|
63
63
|
Commands:
|
|
64
64
|
host-state (default) print the host's state as JSON
|
|
@@ -70,7 +70,7 @@ Commands:
|
|
|
70
70
|
|
|
71
71
|
Run \`redskilled <command> --help\` for a command's own usage.
|
|
72
72
|
\`--version\` (\`-v\`) prints the build stamp; both answer offline.
|
|
73
|
-
`,
|
|
73
|
+
`,km={serve:`Usage: redskilled serve [options]
|
|
74
74
|
|
|
75
75
|
Runs the daemon in this process. Every path is a flag and none is derived
|
|
76
76
|
(ADR 0130 rule 3); what is absent falls back to the session derivation.
|
|
@@ -134,18 +134,18 @@ Reports every session runtime dir it looked at and why it kept or removed it.
|
|
|
134
134
|
|
|
135
135
|
--dry-run the same report with nothing removed
|
|
136
136
|
--grace-ms <n> how long a dir must be idle before it is reclaimed
|
|
137
|
-
`};function
|
|
138
|
-
`:`${
|
|
139
|
-
`),0}if(
|
|
140
|
-
`),0}var
|
|
141
|
-
`),o.running&&!o.stopped?1:0}async function
|
|
142
|
-
`),0;if(o==="install"){let s=await
|
|
143
|
-
`),s.installed?0:1}if(o==="uninstall")return n(`${JSON.stringify(await
|
|
144
|
-
`),0;throw new Error(`unsupported redskilled unit action ${JSON.stringify(o)}: expected install, uninstall or status`)}async function
|
|
145
|
-
`);let
|
|
146
|
-
`),
|
|
137
|
+
`};function Rm(e){return e==="--help"||e==="-h"||e==="help"}var wm={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)}},jl="REDSKILLED_HOST_TOKEN";function Pl(){try{let t=gm("gh",["auth","token"],{encoding:"utf8",timeout:5e3,stdio:["ignore","pipe","ignore"]}).trim();return t===""?null:t}catch{return null}}function bm(e=process.env,t=Pl){let n=(e[jl]??e.GITHUB_TOKEN??e.GH_TOKEN??"").trim();if(n!=="")return{token:n,source:"env"};let r=(t()??"").trim();return r!==""?{token:r,source:"tracker-cli"}:null}function _m(e,t=process.env,n=Pl){let r=e["queue-ms"]==null?{}:{intervalMs:e["queue-ms"]},o=bm(t,n);if(o==null)return{...r,unconfiguredReason:`no credential names a tracker for this host: ${jl}, 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"]??t.GITHUB_GRAPHQL_URL;return{...r,transport:Ls({token:o.token,...s?{endpoint:s}:{}})}}async function vm(e){if(e[0]==="--version"||e[0]==="-v"){let o=gn("redskilled");return process.stdout.write(e.includes("--json")?`${JSON.stringify(o)}
|
|
138
|
+
`:`${Ro(o)}
|
|
139
|
+
`),0}if(Rm(e[0]))return process.stdout.write(ym),0;let{command:t,args:n}=vo(e,{commands:{serve:{},stop:{},"host-state":{},statusline:{},unit:{},provision:{},reclaim:{}},default:"host-state"});if(n.some(o=>o==="--help"||o==="-h"))return process.stdout.write(km[t]),0;if(t==="serve"){let{values:o}=pe(n,wm),s=_m(o),i=await Qi({paths:Im(o),idleMs:o["idle-ms"]??fr,daemonVersion:o["daemon-version"]??gn("redskilled").version,queueDiscovery:s,...o["demand-ms"]==null?{}:{demandMs:o["demand-ms"]}});for(let l of["SIGTERM","SIGINT"])process.once(l,()=>void i.stop({reason:"signal",signal:l}).catch(()=>{}));return await i.closed,0}if(t==="stop")return await xm(n);if(t==="statusline")return await jm(n);if(t==="unit")return await Em(n);if(t==="provision")return await Om(n);if(t==="reclaim")return await Lm(n);let r=await tl(ne());return process.stdout.write(`${JSON.stringify(r,null,2)}
|
|
140
|
+
`),0}var Sm={reason:{kind:"value",coerce:e=>e},"settle-timeout-ms":{kind:"value",coerce:e=>Number(e)}};async function xm(e,t={}){let n=t.write??(s=>process.stdout.write(s)),{values:r}=pe(e,Sm),o=await el(t.paths??ne(),{...r.reason==null?{}:{detail:r.reason},...Number.isFinite(r["settle-timeout-ms"])?{settleTimeoutMs:r["settle-timeout-ms"]}:{}},t.client??{});return n(`${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})}
|
|
141
|
+
`),o.running&&!o.stopped?1:0}async function Em(e,t={}){let n=t.write??(s=>process.stdout.write(s)),r=t.paths??ne(),o=e[0]??"status";if(o==="status")return n(`${JSON.stringify(Si(t.unitIO??{}),null,2)}
|
|
142
|
+
`),0;if(o==="install"){let s=await _i(wi(r),t.unitIO??{});return n(`${JSON.stringify(s,null,2)}
|
|
143
|
+
`),s.installed?0:1}if(o==="uninstall")return n(`${JSON.stringify(await vi(t.unitIO??{}),null,2)}
|
|
144
|
+
`),0;throw new Error(`unsupported redskilled unit action ${JSON.stringify(o)}: expected install, uninstall or status`)}async function jm(e,t={}){let n=t.write??(a=>process.stdout.write(a)),r=t.warn??(a=>process.stderr.write(a)),o=Sl(e),s=Am(t.cwd??process.cwd()),i=xl({...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}
|
|
145
|
+
`);let l;try{l=await nl(t.paths??ne(),i.options,{...t.client??{},...i.options.project==null?{}:{sessionProject:i.options.project}})}catch(a){r(`redskilled statusline: ${a instanceof Error?a.message:String(a)}
|
|
146
|
+
`),l=mi({options:i.options,generated_at:(t.now??(()=>new Date().toISOString()))()})}return n(`${l.lines.join(`
|
|
147
147
|
`)}
|
|
148
|
-
`),0}var
|
|
149
|
-
`),f.verdict==="ok"?0:1}var
|
|
150
|
-
`),o.entries.some(s=>s.verdict==="failed")?1:0}function
|
|
151
|
-
`),process.exitCode=1});export{
|
|
148
|
+
`),0}var Pm={"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 Om(e,t={}){let n=t.write??(p=>process.stdout.write(p)),{values:r}=pe(e,Pm),o=t.paths??ne(),s=t.homeDir??El(),i=await Rr({homeDir:s,declaredTarget:r.workspace,projectRoot:r.project??t.projectRoot??process.cwd()}),l=r.check||!i.needed?void 0:await fl(s),a;if(!r.check&&!r["no-start"])try{await mr(o,t.client??{})}catch(p){a=p instanceof Error?p.message:String(p)}let c=await hl({paths:o,homeNeed:i,...t.homeDir==null?{}:{homeDir:t.homeDir},...t.configHome==null?{}:{configHome:t.configHome},...t.client?.serverCommand==null?{}:{entryOverride:{serverCommand:t.client.serverCommand,serverArgs:t.client.serverArgs}}}),u=r["install-unit"]&&G(c.entry)?await Rl({configHome:t.configHome??$m(),unit:kl({command:[c.entry.command,...c.entry.args].join(" "),socketPath:o.socketPath})}):void 0,f=gl(c);return n(`${I({verdict:f.verdict,home:{path:l?.path??c.homePath,created:l?.created??!1,tightened:l?.tightened??!1,needed:i.needed,needed_by:i.declaredBy},socket:c.socketPath,...a==null?{}:{start_error:a},...u==null?{}:{unit:{path:u.path,status:u.status}},checks:f.rows.map(p=>({check:p.check,verdict:p.verdict,evidence:p.evidence})),fixes:f.findings.map(p=>({check:p.check,fix:p.fix}))})}
|
|
149
|
+
`),f.verdict==="ok"?0:1}var Dm={"dry-run":{kind:"boolean"},"grace-ms":{kind:"value",coerce:e=>Number(e)}};async function Lm(e,t={}){let n=t.write??(s=>process.stdout.write(s)),{values:r}=pe(e,Dm),o=await _l({...t.options??{},dryRun:r["dry-run"]===!0,...Number.isFinite(r["grace-ms"])?{graceMs:r["grace-ms"]}:{}});return n(`${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]}))})}
|
|
150
|
+
`),o.entries.some(s=>s.verdict==="failed")?1:0}function $m(){let e=process.env.XDG_CONFIG_HOME?.trim();return e&&e!==""?e:hm(El(),".config")}function Am(e){let t=bn(e);return t.configText==null?{label:null}:{configText:t.configText,label:Lo(e)}}function Im(e){let t=ne();return{...t,socketPath:e.socket??t.socketPath,leasePath:e.lease??t.leasePath,eventLanePath:e.events??t.eventLanePath,sessionKeyHash:e["session-key-hash"]??t.sessionKeyHash,machineIdHash:e["machine-id-hash"]??t.machineIdHash,machineClaimPath:e["machine-claim"]??t.machineClaimPath}}var Tm=process.argv[1]!=null&&import.meta.url===new URL(`file://${process.argv[1]}`).href;Tm&&vm(process.argv.slice(2)).then(e=>{process.exitCode=e},e=>{process.stderr.write(`redskilled: ${e instanceof Error?e.message:String(e)}
|
|
151
|
+
`),process.exitCode=1});export{jl as REDSKILLED_HOST_TOKEN_ENV,ym as REDSKILLED_USAGE,bm as resolveRedskilledHostToken,_m as resolveServeQueueDiscovery,Om as runProvision,Lm as runReclaim,vm as runRedskilledCli,jm as runStatusline,xm as runStop,Em as runUnit};
|