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