@kynver-app/runtime 0.2.32 → 0.2.33

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/cli.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- var zw=Object.defineProperty;var D=(e,r,t)=>()=>{if(t)throw t[0];try{return e&&(r=e(e=0)),r}catch(n){throw t=[n],n}};var Xw=(e,r)=>{for(var t in r)zw(e,t,{get:r[t],enumerable:!0})};import{existsSync as Qw,mkdirSync as Zw,readFileSync as Vl,readdirSync as nF,renameSync as eC,rmSync as rC,statSync as Lp,writeFileSync as tC}from"node:fs";import{randomBytes as nC}from"node:crypto";import Up from"node:path";function Kr(e){console.error(e),process.exit(1)}function pe(e){return process.platform!=="win32"?e:{windowsHide:!0,...e}}function K(e,r){return e||Kr(`missing ${r}`),e}function rn(e){try{return JSON.parse(e)}catch{return null}}function P(e,r){try{return JSON.parse(Vl(e,"utf8"))}catch(t){if(arguments.length>1)return r;Kr(`failed to read ${e}: ${t.message}`)}}function ue(e,r){Zw(Up.dirname(e),{recursive:!0});let t=`${e}.${process.pid}.${nC(4).toString("hex")}.tmp`;try{tC(t,`${JSON.stringify(r,null,2)}
2
+ var zw=Object.defineProperty;var D=(e,r,t)=>()=>{if(t)throw t[0];try{return e&&(r=e(e=0)),r}catch(n){throw t=[n],n}};var Xw=(e,r)=>{for(var t in r)zw(e,t,{get:r[t],enumerable:!0})};import{existsSync as Qw,mkdirSync as Zw,readFileSync as Vl,readdirSync as sF,renameSync as eC,rmSync as rC,statSync as Lp,writeFileSync as tC}from"node:fs";import{randomBytes as nC}from"node:crypto";import Up from"node:path";function Kr(e){console.error(e),process.exit(1)}function pe(e){return process.platform!=="win32"?e:{windowsHide:!0,...e}}function K(e,r){return e||Kr(`missing ${r}`),e}function rn(e){try{return JSON.parse(e)}catch{return null}}function P(e,r){try{return JSON.parse(Vl(e,"utf8"))}catch(t){if(arguments.length>1)return r;Kr(`failed to read ${e}: ${t.message}`)}}function ue(e,r){Zw(Up.dirname(e),{recursive:!0});let t=`${e}.${process.pid}.${nC(4).toString("hex")}.tmp`;try{tC(t,`${JSON.stringify(r,null,2)}
3
3
  `),eC(t,e)}catch(n){try{rC(t,{force:!0})}catch{}throw n}}function _(e){return String(e||"").toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"worker"}function Bp(e){return _(`${new Date().toISOString().replace(/[-:]/g,"").replace(/\..+/,"Z")}-${e}`)}function $e(e){return String(e).replace(/\/+$/,"")}function ci(e){return String(e||"").replace(/\s+/g," ").trim()}function ui(e){try{return Lp(e).size}catch{return 0}}function di(e){try{return Lp(e).mtime.toISOString()}catch{return null}}function pi(e,r){return Qw(e)?Vl(e,"utf8").split(`
4
4
  `).slice(-r).join(`
5
5
  `):""}function Wp(e){return e?Vl(Up.resolve(e),"utf8"):""}function ht(e){Atomics.wait(new Int32Array(new SharedArrayBuffer(4)),0,0,e)}function $r(e){return new Promise(r=>setTimeout(r,e))}function $(e){if(!e)return!1;try{return process.kill(e,0),!0}catch{return!1}}function dr(e,r){try{process.kill(-e,r)}catch{process.kill(e,r)}}function Fp(e){let r=null,t=-1/0;for(let n of e){if(!n)continue;let o=Date.parse(n);Number.isFinite(o)&&o>t&&(t=o,r=n)}return r}function Gl(e){return Math.max(0,Math.round((Date.now()-e)/1e3))}var E=D(()=>{"use strict"});function dC(e){let r=e[uC];return r?new Set(r.split(/[\s,]+/).map(t=>t.trim()).filter(Boolean)):new Set}function pC(e,r={}){return sC.has(e)?!0:lC.has(e)||r.operatorAllow?.has(e)||cC.some(t=>e.endsWith(t))?!1:iC.some(t=>e.endsWith(t))}function Yl(e){let r=dC(e),t={...e};for(let n of Object.keys(t))pC(n,{operatorAllow:r})&&delete t[n];return t}var oC,sC,iC,aC,lC,cC,uC,Jl=D(()=>{"use strict";oC=["ANTHROPIC_API_KEY","ANALYST_API_KEY","RECRUITER_API_KEY","AUTH_SECRET","NEXTAUTH_SECRET","DATABASE_URL","PRODUCTION_DATABASE_URL","KYNVER_PRODUCTION_DATABASE_URL","REDIS_URL","GOOGLE_CLIENT_SECRET","GITHUB_CLIENT_SECRET","KYNVER_API_KEY","KYNVER_SERVICE_SECRET","KYNVER_RUNTIME_SECRET","KYNVER_CRON_SECRET","OPENCLAW_CRON_SECRET","QSTASH_TOKEN","QSTASH_CURRENT_SIGNING_KEY","QSTASH_NEXT_SIGNING_KEY","TOOL_SECRETS_KEK","TOOL_EXECUTOR_DISPATCH_SECRET","CLOUDFLARE_API_TOKEN","STRIPE_SECRET_KEY","STRIPE_WEBHOOK_SECRET","STRIPE_IDENTITY_WEBHOOK_SECRET","VOYAGE_API_KEY","PERPLEXITY_API_KEY","FRED_API_KEY","FMP_API_KEY","CURSOR_API_KEY","MEMORY_CONTENT_KEK","LLM_BYOK_KEK","KYNVER_COMMAND_AUTH_KEY","KYNVER_INSTRUCTION_BUNDLE_KEY","KYNVER_MEMORY_LEDGER_KEY","KYNVER_JWKS_PRIVATE_KEY_JWK"],sC=new Set(oC),iC=["_SECRET","_API_KEY","_KEK","_KEY","_TOKEN","_PASSWORD","_PASSPHRASE","_SALT"],aC=["GITHUB_TOKEN","GH_TOKEN","CLAUDE_CODE_OAUTH_TOKEN","CODEX_API_KEY"],lC=new Set(aC),cC=["_PUBLIC_KEY"],uC="KYNVER_WORKER_ENV_ALLOW"});import{spawnSync as Kp}from"node:child_process";function me(e,r,t={}){let n=Kp("git",r,pe({cwd:e,encoding:"utf8"}));if(n.status!==0&&!t.allowFailure){let o=`git ${r.join(" ")} failed: ${n.stderr||n.stdout}`;if(t.throwError)throw new Error(o);Kr(o)}return n.stdout||""}function $p(e){me(e,["rev-parse","--show-toplevel"])}function ko(e){return me(e,["status","--short"],{allowFailure:!0}).split(`
@@ -12,7 +12,7 @@ ${e.stderr}`.trim(),t=A_(r);if(!t||!xo(t)){let o=_o(r||`exit ${e.exitCode}`,180)
12
12
  `)}function wt(e=be){return $m(e)?hc(jm(e,"utf8")):new Map}function Do(e=be,r={}){let t=wt(e),n=0,o=0;for(let[s,i]of t){if(!r.override&&process.env[s]!=null){o++;continue}process.env[s]=i,n++}return{path:e,loaded:n,skipped:o}}function Ti(e,r={}){let t=r.filePath??be,n=$m(t)?jm(t,"utf8"):"",o=hc(n),s=[],i=[];for(let u of r.removeKeys??[])o.delete(u)&&i.push(u);for(let[u,d]of Object.entries(e)){if(d===void 0)continue;let m=o.get(u);o.set(u,d),m!==d&&s.push(u)}let a=hc(n),l=a.size!==o.size;if(!l){for(let[u,d]of o)if(a.get(u)!==d){l=!0;break}}let c=gx(o);return l&&(px(Vm.dirname(t),{recursive:!0}),mx(t,c,{mode:384})),{path:t,changed:l,keysWritten:s,keysRemoved:i}}var be,nr=D(()=>{"use strict";be=Vm.join(fx(),".kynver",".env")});var kc,Mo=D(()=>{"use strict";kc="1.5G"});import{spawnSync as hx}from"node:child_process";function Uo(){return process.env.KYNVER_BUILD_SKIP_SYSTEMD==="1"||process.env.KYNVER_BUILD_SKIP_SYSTEMD==="true"?!1:Lo!==void 0?Lo:process.platform!=="linux"?(Lo=!1,!1):(Lo=hx("systemd-run",["--version"],{encoding:"utf8",stdio:["ignore","ignore","pipe"]}).status===0,Lo)}function yc(e){let r=e.memoryMax??process.env.KYNVER_BUILD_SYSTEMD_MEMORY_MAX??kc,t=e.memorySwapMax??process.env.KYNVER_BUILD_SYSTEMD_MEMORY_SWAP_MAX??"2G",n=["systemd-run","--scope","--collect","-p",`MemoryMax=${r}`,"-p",`MemorySwapMax=${t}`];return e.cwd&&n.push("--working-directory",e.cwd),n.push("--",...e.command),n}var Lo,Ni=D(()=>{"use strict";Mo()});import{realpathSync as kx}from"node:fs";function vn(e=process.argv[1]){let r=process.env.KYNVER_BIN?.trim();if(r)return r;let t=e?.trim();if(!t)return"kynver";try{return kx.native(t)}catch{return t}}function Ym(e){return/\s/.test(e)?`"${e.replace(/"/g,'\\"')}"`:e}var Di=D(()=>{"use strict"});import{existsSync as yx,mkdirSync as Rx,writeFileSync as vx}from"node:fs";import{homedir as bx}from"node:os";import qm from"node:path";import{spawnSync as Jm}from"node:child_process";function Sx(){return qm.join(bx(),".config","systemd","user")}function wx(e){let r=Ym(e.kynverBin?.trim()||vn());return["[Unit]","Description=Kynver AgentOS daemon (keeper-supervised pipeline + cron tick)","After=network-online.target","","[Service]","Type=simple",`EnvironmentFile=${e.envFilePath}`,`ExecStart=${r} daemon --run ${e.runId} --agent-os-id ${e.agentOsId} --execute`,"Restart=always","RestartSec=10","","[Install]","WantedBy=default.target",""].join(`
13
13
  `)}function Mi(e,r){if(!Uo())return{supported:!1,unitPath:null,written:!1,enabled:!1,started:!1,note:process.platform==="linux"?"systemd-run not available \u2014 install user service manually or run `kynver daemon` under your supervisor.":"systemd user units are only supported on Linux; use `kynver daemon` manually on macOS/Windows."};let t=Sx(),n=qm.join(t,Ct),o=wx(e);if(!r)return{supported:!0,unitPath:n,written:!1,enabled:!1,started:!1,note:"Dry-run \u2014 pass --execute to write and enable the user unit."};Rx(t,{recursive:!0});let s=yx(n);vx(n,o,"utf8");let i=Jm("systemctl",["--user","daemon-reload"],{encoding:"utf8"});if(i.status!==0)return{supported:!0,unitPath:n,written:!0,enabled:!1,started:!1,note:`Wrote ${n} but systemctl --user daemon-reload failed: ${i.stderr||i.stdout}`};let a=Jm("systemctl",["--user","enable","--now",Ct],{encoding:"utf8"});return{supported:!0,unitPath:n,written:!s||!0,enabled:a.status===0,started:a.status===0,note:a.status===0?`Enabled and started ${Ct}`:`Wrote ${n} but enable failed: ${a.stderr||a.stdout}`}}var Ct,Bo=D(()=>{"use strict";Ni();Di();Ct="kynver-cron-daemon.service"});import{existsSync as Cx,readFileSync as _x}from"node:fs";function bn(){if(process.platform==="win32")return"win32";if(process.platform==="darwin")return"darwin";if(process.platform==="linux"){if(process.env.WSL_DISTRO_NAME?.trim())return"wsl";try{if(Cx("/proc/version")){let e=_x("/proc/version","utf8");if(/microsoft/i.test(e))return"wsl"}}catch{}return"linux"}return"linux"}function Wo(e){return e==="linux"}var Fo=D(()=>{"use strict"});function zm(e){return e===!0||e==="true"||e==="1"||e==="yes"||e==="on"}function xx(e){return"keeper"}function Xm(e,r,t={}){if(zm(t.installSystemd)||zm(t["install-systemd"]))return Wo(r)?"systemd":"keeper";let n=e.daemonSupervisionOwner;return n==="systemd"&&Wo(r)?"systemd":n==="keeper"?"keeper":xx(r)}function Ex(){return{KYNVER_CRON_DAEMON_PRESENT:"1"}}function Rc(e,r){let t=["Daemon restart hardening is Kynver-owned: `kynver start` runs the in-process keeper by default (crash + heartbeat-stall respawn)."];return e==="linux"?t.push("For logout-surviving supervision on Linux: `kynver start --install-systemd` (or `kynver cron install --install-systemd`)."):e==="wsl"?t.push("WSL: run `kynver start` in a persistent tmux/screen session, or use Windows `start-tier2-wsl.ps1` which delegates to the keeper."):e==="darwin"?t.push("macOS: run `kynver start` under launchd or a terminal multiplexer for session survival."):e==="win32"&&t.push("Native Windows: prefer WSL (`kynver start` inside WSL). Native console daemon is blocked unless KYNVER_DAEMON_ALLOW_NATIVE_WINDOWS=1."),r==="systemd"&&t.push("This box is configured for systemd user-unit supervision (~/.config/systemd/user/kynver-cron-daemon.service)."),t}function vc(e,r={},t){let n=t??bn(),o=Xm(e,n,r);return{hostKind:n,owner:o,envUpdates:Ex(),guidance:Rc(n,o)}}var Li=D(()=>{"use strict";Fo()});import{existsSync as Px}from"node:fs";import Qm from"node:path";import{homedir as Zm}from"node:os";function Ix(e,r){let t={};e.daemonSupervisionOwner||(t.daemonSupervisionOwner=r.owner);let n=r.agentOsId.trim();n&&e.agentOsId?.trim()!==n&&(t.agentOsId=n);let o=r.runId.trim();return o&&e.defaultDaemonRunId?.trim()!==o&&(t.defaultDaemonRunId=o),t}function Ax(){return Qm.join(Zm(),".config","systemd","user",Ct)}function Sn(){return Px(Ax())}function wn(e,r={},t,n){let o=vc(e,r,t),s=Ix(e,{agentOsId:n?.agentOsId??"",runId:n?.runId??"",owner:o.owner}),i={...e,...s},a=!1;Object.keys(s).length>0&&(ye(i),a=!0);let l=Ti(o.envUpdates,{filePath:be});return{policy:o,configPath:F(Qm.join(Zm(),".kynver","config.json")),envFilePath:F(l.path),envChanged:l.changed,configUpdated:a}}function Ui(e,r){return e.daemonSupervisionOwner==="systemd"&&Sn()?"systemd":e.daemonSupervisionOwner??"keeper"}var _t=D(()=>{"use strict";nr();rr();A();Bo();Li()});import Ox from"node:os";function Ho(e,r){let t=(r??Ox.hostname()).trim().toLowerCase().replace(/\s+/g,"-")||"unknown-host";return`${e}:${t}`}function ef(e){return e.trim().toLowerCase().replace(/\s+/g,"-")}function Ko(e,r){let t=e.trim();if(!t)return Ho(r);let n=t.indexOf(":");if(n>=0){let o=t.slice(0,n).trim().toLowerCase()||r,s=ef(t.slice(n+1));return s?`${o}:${s}`:Ho(o)}return`${r}:${ef(t)}`}function Cn(e){let r=e.explicitBoxId?.trim()||e.env?.KYNVER_BOX_ID?.trim()||e.config?.boxId?.trim();return r?Ko(r,e.boxKind):Ho(e.boxKind,e.hostLabel)}var _n=D(()=>{"use strict";we();we()});import{spawnSync as Tx}from"node:child_process";function Nx(){if(!Sn())return!1;let e=Tx("systemctl",["--user","is-active",Ct],{encoding:"utf8",stdio:["ignore","pipe","ignore"]}),r=(e.stdout||"").trim();return e.status===0&&(r==="active"||r==="activating")}function Bi(e,r={}){let t=r.envFilePath??be,o=wt(t).get("KYNVER_CRON_DAEMON_PRESENT")==="1",s=Sn(),i=r.systemdUnitActive?.()??Nx(),a=e.daemonSupervisionOwner??null;a||(i?a="systemd":o&&(a="keeper"));let l=!!e.daemonSupervisionOwner||i||o&&a==="keeper";return{owner:a,daemonPresentSignal:o,systemdUnitInstalled:s,systemdUnitActive:i,effectivelyConfigured:l}}var bc=D(()=>{"use strict";nr();Bo();_t()});import{existsSync as Dx,readFileSync as Mx}from"node:fs";import{homedir as Lx}from"node:os";import Ux from"node:path";function Bx(){return Ux.join(Lx(),".kynver","credentials")}function Wx(){try{let e=Bx();if(!Dx(e))return{hasScopedRunnerToken:!1};let r=JSON.parse(Mx(e,"utf8")),t=r.runnerToken?.trim();return{runnerTokenAgentOsId:r.runnerTokenAgentOsId?.trim(),hasScopedRunnerToken:!!t?.startsWith("krc1.")}}catch{return{hasScopedRunnerToken:!1}}}function Fx(e,r,t){let n=r.KYNVER_AGENT_OS_ID?.trim(),o=t.hasScopedRunnerToken?t.runnerTokenAgentOsId:void 0,s=e.agentOsId?.trim();return s&&o&&o!==s?{ambiguous:`saved runner token is for ${o}, config has ${s}`}:s&&n&&n!==s?{ambiguous:`KYNVER_AGENT_OS_ID is ${n}, config has ${s}`}:s?{}:n&&o&&n!==o?{ambiguous:`KYNVER_AGENT_OS_ID is ${n}, saved runner token is for ${o}`}:o?{value:o}:n?{value:n}:{}}function Hx(e,r=process.env){let t={},n=[],o=[],s=Wx(),i=Fx(e,r,s);if(i.ambiguous&&o.push(i.ambiguous),!e.apiBaseUrl?.trim()){let u=r.KYNVER_API_URL?.trim()||r.KYNVER_CRON_FIRE_BASE_URL?.trim();u&&(t.apiBaseUrl=$e(u),n.push("apiBaseUrl"))}if(!e.agentOsId?.trim()&&i.value&&(t.agentOsId=i.value,n.push("agentOsId")),!e.agentOsSlug?.trim()&&r.KYNVER_AGENT_OS_SLUG?.trim()&&(t.agentOsSlug=r.KYNVER_AGENT_OS_SLUG.trim(),n.push("agentOsSlug")),!e.defaultRepo?.trim()){let u=r.KYNVER_DEFAULT_REPO?.trim()||r.KYNVER_HARNESS_REPO?.trim()||on()?.repo;u&&(t.defaultRepo=u,n.push("defaultRepo"))}let a=Se(r,{...e,...t});e.boxKind?.trim()||(t.boxKind=a.boxKind,n.push("boxKind"));let l=r.KYNVER_BOX_ID?.trim();!e.boxId?.trim()&&l&&(t.boxId=Ko(l,a.boxKind),n.push("boxId"));let c=je({...e,...t},r);if(c.identity&&!e.runnerId?.trim()&&c.identity.runnerId&&(t.runnerId=c.identity.runnerId,n.push("runnerId")),!e.daemonSupervisionOwner){let u=Bi({...e,...t});u.systemdUnitActive||u.systemdUnitInstalled&&u.owner==="systemd"?(t.daemonSupervisionOwner="systemd",n.push("daemonSupervisionOwner")):u.daemonPresentSignal&&(t.daemonSupervisionOwner="keeper",n.push("daemonSupervisionOwner"))}return{updates:t,fields:n,skippedAmbiguous:o}}function xn(e={}){let r=v(),{updates:t,fields:n,skippedAmbiguous:o}=Hx(r);if(Object.keys(t).length===0)return{updated:!1,fields:[],skippedAmbiguous:o};if(e.dryRun)return{updated:!0,fields:n,skippedAmbiguous:o};let s=$o({...r,...t});return ye(s),wn(s,{},void 0,{agentOsId:s.agentOsId??"",runId:s.defaultDaemonRunId??""}),{updated:!0,fields:n,skippedAmbiguous:o}}var Wi=D(()=>{"use strict";yo();we();_n();A();_t();bc();E();yt()});var tf={};Xw(tf,{runDeviceLogin:()=>Sc});import rf from"node:os";function Kx(e){let r=(typeof e.apiBaseUrl=="string"?e.apiBaseUrl:void 0)||(typeof e.baseUrl=="string"?e.baseUrl:void 0)||process.env.KYNVER_API_URL||v().apiBaseUrl;return r?$e(String(r)):void 0}async function $x(e){await new Promise(r=>setTimeout(r,e))}async function Sc(e){let r=Kx(e);if(!r)return console.error("kynver login (device flow) requires a Kynver URL \u2014 pass --api-base-url https://your-kynver-site, set KYNVER_API_URL, or run `kynver setup` first."),{ok:!1};let t=`${rf.hostname()} (${rf.platform()})`,n;try{let a=await fetch(`${r}/api/auth/device/code`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({clientName:t})});if(!a.ok)return console.error(`Could not start device authorization (${a.status}).`),{ok:!1};n=await a.json()}catch(a){return console.error(`Could not reach ${r}: ${a.message}`),{ok:!1}}let o=n.verification_uri_complete||n.verification_uri;console.log(""),console.log(" Authorize this machine:"),console.log(` 1. Open: ${o}`),console.log(` 2. Confirm the code: ${n.user_code}`),console.log(""),console.log(" Waiting for approval\u2026");let s=Date.now()+n.expires_in*1e3,i=Math.max(1,n.interval)*1e3;for(;Date.now()<s;){await $x(i);let a;try{a=await(await fetch(`${r}/api/auth/device/token`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({device_code:n.device_code})})).json().catch(()=>({}))}catch{continue}switch(a.status){case"approved":return a.api_key?(jo(a.api_key),console.log(" Approved \u2014 this machine is now linked to your Kynver account."),{ok:!0,apiKey:a.api_key}):{ok:!1};case"slow_down":i+=2e3;break;case"authorization_pending":typeof a.interval=="number"&&(i=Math.max(i,a.interval*1e3));break;case"access_denied":return console.error(" Request was denied in the browser."),{ok:!1};case"expired_token":return console.error(" The code expired before it was approved. Run `kynver login` again."),{ok:!1};default:break}}return console.error(" Timed out waiting for approval. Run `kynver login` again."),{ok:!1}}var wc=D(()=>{"use strict";A();E()});import{existsSync as nf,mkdirSync as of,readFileSync as Cc,writeFileSync as sf}from"node:fs";import{homedir as jx,totalmem as Vx}from"node:os";import _c from"node:path";import Gx from"node:os";function xt(e){let r=String(e??"").trim();if(!r)return{ok:!1,reason:"missing"};let t=r.toLowerCase();return Jx.has(t)?{ok:!1,value:r,reason:"placeholder"}:Yx.test(r)?{ok:!0,value:r}:{ok:!1,value:r,reason:"not a UUID"}}function En(e){let r=xt(e),t=r.value??String(e??"").trim(),n=t?`"${t}"`:"<empty>",o=r.reason==="placeholder"?"looks like a placeholder":r.reason??"is invalid";return[`Invalid AgentOS id ${n}: ${o}.`,"AgentOS ids are UUIDs from the AgentOS registry, not slugs or examples (for example, not `aos`).","Fix: run `kynver bootstrap` to relink this runner, or run `kynver setup --agent-os-id <uuid>` / pass `--agent-os-id <uuid>` after copying the id from Command Center.","If this came from stale ~/.kynver/config.json, remove or replace the agentOsId value before starting the daemon."].join(" ")}function v(){if(!nf(Fi))return{};try{return JSON.parse(Cc(Fi,"utf8"))}catch{return{}}}function ye(e){of(Hi,{recursive:!0}),sf(Fi,`${JSON.stringify($o(e),null,2)}
14
14
  `,{mode:384})}function $o(e){return{...e,...e.harnessRoot?.trim()?{harnessRoot:Me(e.harnessRoot.trim())}:{},...e.defaultRepo?.trim()?{defaultRepo:Me(e.defaultRepo.trim())}:{}}}function Pn(e){return $o(e)}function qx(e,r){let t=Vo(),n=(typeof r.apiBaseUrl=="string"?r.apiBaseUrl:void 0)||process.env.KYNVER_API_URL?.trim()||process.env.KYNVER_CRON_FIRE_BASE_URL?.trim()||process.env.OPENCLAW_CRON_FIRE_BASE_URL?.trim()||e.apiBaseUrl?.trim(),o=(typeof r.agentOsId=="string"?r.agentOsId:void 0)||e.agentOsId?.trim()||process.env.KYNVER_AGENT_OS_ID?.trim()||(t.runnerToken?.trim().startsWith("krc1.")?t.runnerTokenAgentOsId?.trim():void 0),i=(typeof r.repo=="string"?r.repo:r.discoverRepo===!0||r.discoverRepo==="true"?nn()?.repo:void 0)||e.defaultRepo?.trim()||process.env.KYNVER_DEFAULT_REPO?.trim()||process.env.KYNVER_HARNESS_REPO?.trim()||on()?.repo,a=(typeof r.harnessRoot=="string"?r.harnessRoot:void 0)||e.harnessRoot?.trim()||process.env.KYNVER_HARNESS_ROOT?.trim()||process.env.OPUS_HARNESS_ROOT?.trim(),l=(typeof r.boxId=="string"?r.boxId:void 0)||(typeof r["box-id"]=="string"?String(r["box-id"]):void 0)||e.boxId?.trim()||process.env.KYNVER_BOX_ID?.trim(),c=(typeof r.runnerId=="string"?r.runnerId:void 0)||(typeof r["runner-id"]=="string"?String(r["runner-id"]):void 0)||e.runnerId?.trim()||process.env.KYNVER_RUNTIME_ID?.trim()||process.env.OPENCLAW_RUNTIME_ID?.trim();return{...n?{apiBaseUrl:$e(n)}:{},...o?{agentOsId:o}:{},...i?{defaultRepo:i}:{},...a?{harnessRoot:a}:{},...l?{boxId:l}:{},...c?{runnerId:c}:{},...typeof r.agentOsSlug=="string"?{agentOsSlug:r.agentOsSlug}:e.agentOsSlug?{agentOsSlug:e.agentOsSlug}:{}}}function zx(e,r,t=Vx()){let n=typeof r.maxWorkers=="string"?r.maxWorkers:typeof r.maxConcurrentWorkers=="string"?r.maxConcurrentWorkers:void 0,o=typeof r.boxKind=="string"?r.boxKind:typeof r["box-kind"]=="string"?String(r["box-kind"]):void 0,s=Se(process.env,{...e,...o?{boxKind:jr(o)}:{}}).boxKind,i=pr({diskPath:typeof r.diskPath=="string"?r.diskPath:"/"}),a=gc({totalMemBytes:t,diskPath:i.path,diskGateOk:i.ok,diskFreeBytes:i.freeBytes,config:e});if(n){let l=Math.max(1,Math.floor(Number(n))),c=tr(s,l);return c!==l&&console.warn(`[kynver] --max-workers ${l} clamped to ${c} for the ${s} pool (pool cap); the persisted value is ${c}`),{maxConcurrentWorkers:c,maxConcurrentWorkersSource:"setup-flag",boxKind:s}}if(e.maxConcurrentWorkers!==void 0&&e.maxConcurrentWorkers!==null){let l=Math.max(1,Math.floor(Number(e.maxConcurrentWorkers)));return sn(s,l)?{maxConcurrentWorkers:Ro(s,a.recommendedMaxWorkers),maxConcurrentWorkersSource:"setup-auto",boxKind:s}:{maxConcurrentWorkers:tr(s,l),maxConcurrentWorkersSource:e.maxConcurrentWorkersSource??"operator",boxKind:s}}return{maxConcurrentWorkers:Ro(s,a.recommendedMaxWorkers),maxConcurrentWorkersSource:"setup-auto",boxKind:s}}function Vo(){if(!nf(Pr))return{};try{return JSON.parse(Cc(Pr,"utf8"))}catch{return{}}}function af(e){of(Hi,{recursive:!0}),sf(Pr,`${JSON.stringify(e,null,2)}
15
- `,{mode:384})}function X(){return process.env.KYNVER_API_KEY?process.env.KYNVER_API_KEY:Vo().apiKey}function jo(e){af({...Vo(),apiKey:e})}function or(e){let r=Vo();if(!!r.runnerToken&&!!e&&r.runnerTokenAgentOsId===e)return r.runnerToken;let n=process.env.KYNVER_RUNNER_TOKEN?.trim();if(n)return n;if(r.runnerToken&&!(e&&r.runnerTokenAgentOsId&&r.runnerTokenAgentOsId!==e))return r.runnerToken}function mr(e,r){af({...Vo(),runnerToken:r,runnerTokenAgentOsId:e})}function L(e){let r=Go(e);return r||Ve("requires --base-url, KYNVER_API_URL, KYNVER_CRON_FIRE_BASE_URL, or ~/.kynver/config.json apiBaseUrl"),r}function Ki(e){return Go(e)}function Go(e){let r=e||process.env.KYNVER_API_URL||process.env.KYNVER_CRON_FIRE_BASE_URL||process.env.OPENCLAW_CRON_FIRE_BASE_URL||v().apiBaseUrl;return r?$e(String(r)):void 0}function Xx(e,r){let t=e||or(r)||(r?void 0:or(v().agentOsId));if(t)return String(t);let n=process.env.KYNVER_RUNTIME_SECRET||process.env.KYNVER_CRON_SECRET||process.env.OPENCLAW_CRON_SECRET;if(n)return console.warn("[kynver] using deployment-level callback secret; run `kynver runner credential --agent-os-id <id>` for a scoped token"),String(n)}async function xc(e,r,t){let n=Xx(e,r);if(n)return{ok:!0,secret:n};let o=X(),s=Go(t?.baseUrl);if(o&&r&&s)try{let i=await Ir(r,{baseUrl:s,apiKey:o});return mr(r,i),{ok:!0,secret:i}}catch(i){return{ok:!1,reason:`runner credential mint failed: ${i.message}`}}return{ok:!1,reason:"no runner credential: requires --secret, KYNVER_RUNNER_TOKEN, a scoped runner token (`kynver runner credential`), ~/.kynver/credentials runnerToken, or KYNVER_API_KEY + API base URL to mint one"}}async function q(e,r,t){let n=await xc(e,r,t);if(n.ok)return n.secret;Ve(n.reason)}async function lf(e,r){let t=X(),n=Go(r?.baseUrl);if(!t||!e||!n)return null;try{let o=await Ir(e,{baseUrl:n,apiKey:t});return mr(e,o),o}catch{return null}}async function cf(e,r,t){let n=X(),o=Go(t?.baseUrl);if(!n)return{ok:!1,reason:"KYNVER_API_KEY is required to refresh a rejected runner token"};if(!r)return{ok:!1,reason:"agentOsId is required to refresh a rejected runner token"};if(!o)return{ok:!1,reason:"KYNVER_API_URL or --base-url is required to refresh a rejected runner token"};try{let s=await Ir(r,{baseUrl:o,apiKey:n});return s&&s!==e?(mr(r,s),{ok:!0,token:s}):{ok:!1,reason:"runner credential refresh returned the rejected token"}}catch(s){return{ok:!1,reason:s.message}}}async function Ir(e,r){let t=r?.apiKey||X();if(!t)throw new Error("API key required \u2014 run `kynver login` first");let o=`${L(r?.baseUrl)}/api/agent-os/by-id/${encodeURIComponent(e)}/runner-credentials`,s=await fetch(o,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${t}`},body:JSON.stringify({})}),i=await s.text(),a=null;try{a=JSON.parse(i)}catch{a=null}if(!s.ok||!a?.token)throw new Error(`runner credential mint failed (${s.status}): ${a?.error??i.slice(0,200)}`);return a.token}async function uf(e){let r=(e.agentOsId?String(e.agentOsId):v().agentOsId)||"";r||Ve("runner credential requires --agent-os-id or agentOsId in ~/.kynver/config.json");try{let t=await Ir(r,{baseUrl:e.baseUrl?String(e.baseUrl):void 0});mr(r,t),console.log(JSON.stringify({ok:!0,agentOsId:r,credentialsPath:F(Pr),tokenPrefix:`${t.slice(0,12)}\u2026`,note:"Scoped runner token saved; callbacks use X-Kynver-Runner-Token."},null,2))}catch(t){console.error(t instanceof Error?t.message:String(t)),process.exit(1)}}async function df(e){let r=(e.agentOsId?String(e.agentOsId):v().agentOsId)||"";r||Ve("runner credential list requires --agent-os-id or agentOsId in ~/.kynver/config.json");let t=X();t||Ve("API key required \u2014 run `kynver login` first");let o=`${L(e.baseUrl?String(e.baseUrl):void 0)}/api/agent-os/by-id/${encodeURIComponent(r)}/runner-credentials`;try{let s=await fetch(o,{headers:{Authorization:`Bearer ${t}`}}),i=await s.text(),a=JSON.parse(i);s.ok||(console.error(`runner credential list failed (${s.status}): ${a?.error??i.slice(0,200)}`),process.exit(1)),console.log(JSON.stringify({ok:!0,agentOsId:r,credentials:a.credentials??[]},null,2))}catch(s){console.error(s instanceof Error?s.message:String(s)),process.exit(1)}}async function pf(e){let r=(e.agentOsId?String(e.agentOsId):v().agentOsId)||"";r||Ve("runner credential revoke requires --agent-os-id or agentOsId in ~/.kynver/config.json");let t=e.tokenId?String(e.tokenId):"";t||Ve("runner credential revoke requires --token-id <tokenId>");let n=X();n||Ve("API key required \u2014 run `kynver login` first");let s=`${L(e.baseUrl?String(e.baseUrl):void 0)}/api/agent-os/by-id/${encodeURIComponent(r)}/runner-credentials`;try{let i=await fetch(s,{method:"DELETE",headers:{"Content-Type":"application/json",Authorization:`Bearer ${n}`},body:JSON.stringify({tokenId:t})}),a=await i.text(),l=JSON.parse(a);i.ok||(console.error(`runner credential revoke failed (${i.status}): ${l?.error??a.slice(0,200)}`),process.exit(1)),console.log(JSON.stringify({ok:!0,agentOsId:r,tokenId:t,revoked:!0},null,2))}catch(i){console.error(i instanceof Error?i.message:String(i)),process.exit(1)}}async function mf(e){let r=(e.agentOsId?String(e.agentOsId):v().agentOsId)||"";r||Ve("runner credential rotate requires --agent-os-id or agentOsId in ~/.kynver/config.json");let t=e.tokenId?String(e.tokenId):"";t||Ve("runner credential rotate requires --token-id <tokenId>");let n=X();n||Ve("API key required \u2014 run `kynver login` first");let s=`${L(e.baseUrl?String(e.baseUrl):void 0)}/api/agent-os/by-id/${encodeURIComponent(r)}/runner-credentials`;try{let i=await fetch(s,{method:"PATCH",headers:{"Content-Type":"application/json",Authorization:`Bearer ${n}`},body:JSON.stringify({tokenId:t})}),a=await i.text(),l=JSON.parse(a);(!i.ok||!l?.token)&&(console.error(`runner credential rotate failed (${i.status}): ${l?.error??a.slice(0,200)}`),process.exit(1)),mr(r,l.token),console.log(JSON.stringify({ok:!0,agentOsId:r,tokenId:l.tokenId,tokenPrefix:`${l.token.slice(0,12)}\u2026`,expiresAt:l.expiresAt??null,credentialsPath:F(Pr),note:"New token saved to ~/.kynver/credentials."},null,2))}catch(i){console.error(i instanceof Error?i.message:String(i)),process.exit(1)}}function ff(e){let r=v().agentOsId,t=(e.agentOsId?String(e.agentOsId):r)||"",n=process.env.KYNVER_RUNNER_TOKEN?.trim(),o=(()=>{try{let u=Cc(Pr,"utf8");return JSON.parse(u)}catch{return{}}})(),s=o.runnerToken,i=o.runnerTokenAgentOsId,a=n||s,l=a?.startsWith("krc1.")??!1,c=!t||!i||i===t;console.log(JSON.stringify({ok:!0,agentOsId:t||r||null,source:n?"env:KYNVER_RUNNER_TOKEN":s?"credentials-file":"none",hasToken:!!a,isScoped:l,tokenPrefix:a?`${a.slice(0,12)}\u2026`:null,storedAgentOsId:i??null,boundToRequestedWorkspace:c,credentialsPath:F(Pr),...c?{}:{warning:`Stored token is bound to workspace ${i??"(unknown)"} but ${t} was requested. Run \`kynver runner credential --agent-os-id ${t}\` to mint a new one.`}},null,2))}function Ve(e){console.error(e),process.exit(1)}function Yo(e){let r={};for(let t=0;t<e.length;t++){let n=e[t];if(!n.startsWith("--"))continue;let o=n.slice(2).replace(/-([a-z])/g,(i,a)=>a.toUpperCase()),s=e[t+1];!s||s.startsWith("--")?r[o]=!0:(r[o]=s,t++)}return r}async function $i(e){xn();let r=v(),t=pr({diskPath:typeof e.diskPath=="string"?e.diskPath:"/"}),n=gc({totalMemBytes:Gx.totalmem(),diskPath:t.path,diskGateOk:t.ok,diskFreeBytes:t.freeBytes,config:r}),o=zx(r,e),s=$o({...r,...qx(r,e),...o,workerProvider:typeof e.provider=="string"?e.provider:r.workerProvider||"cursor",...e.chatOauth===!0?{chatUseClaudeOauth:!0}:{}});s.agentOsId&&!xt(s.agentOsId).ok&&Ve(En(s.agentOsId));let i=je(s,process.env);i.identity&&(s.runnerId?.trim()||(s.runnerId=i.identity.runnerId),!s.harnessRoot?.trim()&&(i.identity.harnessRootSource==="box_scoped"||i.identity.harnessRootSource==="legacy_migrated")&&(s.harnessRoot=i.identity.harnessRoot)),ye(s);let a=Se(process.env,s),l=wn(s,e);l.configUpdated&&(s=v());let c,u=X(),d=s.agentOsId;if(u&&d)try{let m=await Ir(d,{baseUrl:typeof e.apiBaseUrl=="string"?e.apiBaseUrl:s.apiBaseUrl,apiKey:u});mr(d,m),c="Scoped runner token minted and saved to ~/.kynver/credentials."}catch(m){c=`Runner token not minted: ${m instanceof Error?m.message:String(m)}. Run \`kynver runner credential\` after fixing the cause (a 403 usually means the account has no AgentOS access yet \u2014 \`kynver bootstrap\` self-provisions it).`}console.log(JSON.stringify({ok:!0,configPath:F(Fi),config:Pn(s),boxKind:s.boxKind,boxKindSource:a.source,workerCapRecommendation:n,daemonSupervision:{hostKind:l.policy.hostKind,owner:l.policy.owner,envFilePath:l.envFilePath},...a.warnings.length?{boxIdentityWarnings:a.warnings}:{},note:c??"boxKind and maxConcurrentWorkers persisted; override with --box-kind and --max-workers. Run `kynver login` + `kynver runner credential` for scoped callbacks."},null,2))}async function gf(e){let r=typeof e.apiKey=="string"?e.apiKey:process.env.KYNVER_API_KEY;if(r){jo(r),console.log(JSON.stringify({ok:!0,credentialsPath:F(Pr)},null,2));return}let{runDeviceLogin:t}=await Promise.resolve().then(()=>(wc(),tf));(await t(e)).ok||process.exit(1),console.log(JSON.stringify({ok:!0,credentialsPath:F(Pr)},null,2))}var Hi,Fi,Pr,Yx,Jx,x$,E$,A=D(()=>{"use strict";yo();rr();E();we();an();wo();So();_t();Wi();yt();Hi=_c.join(jx(),".kynver"),Fi=_c.join(Hi,"config.json"),Pr=_c.join(Hi,"credentials"),Yx=/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,Jx=new Set(["aos","aos-1","agent-os-id","agentosid","agent_os_id","<agent-os-id>","<agentosid>","todo","changeme","change-me","placeholder"]);x$=500*1024*1024,E$=4*1024*1024*1024});A();import{mkdirSync as Gw,realpathSync as qW}from"node:fs";import{fileURLToPath as zW}from"node:url";A();E();wc();import Qx from"node:os";function Zx(e){let r=(typeof e.apiBaseUrl=="string"?e.apiBaseUrl:void 0)||(typeof e.baseUrl=="string"?e.baseUrl:void 0)||process.env.KYNVER_API_URL||v().apiBaseUrl;return r?$e(String(r)):void 0}function kf(e){return`${e?$e(e):"https://www.kynver.com"}/agent-os/early-access`}function hf(e){return["This account does not have Agentic OS access yet \u2014 access is admin-approved.",`Request access at ${kf(e)} .`,"Once your account is approved, it will work here as-is: just re-run `kynver bootstrap`."].join(`
15
+ `,{mode:384})}function X(){return process.env.KYNVER_API_KEY?process.env.KYNVER_API_KEY:Vo().apiKey}function jo(e){af({...Vo(),apiKey:e})}function or(e){let r=Vo();if(!!r.runnerToken&&!!e&&r.runnerTokenAgentOsId===e)return r.runnerToken;let n=process.env.KYNVER_RUNNER_TOKEN?.trim();if(n)return n;if(r.runnerToken&&!(e&&r.runnerTokenAgentOsId&&r.runnerTokenAgentOsId!==e))return r.runnerToken}function mr(e,r){af({...Vo(),runnerToken:r,runnerTokenAgentOsId:e})}function L(e){let r=Go(e);return r||Ve("requires --base-url, KYNVER_API_URL, KYNVER_CRON_FIRE_BASE_URL, or ~/.kynver/config.json apiBaseUrl"),r}function Ki(e){return Go(e)}function Go(e){let r=e||process.env.KYNVER_API_URL||process.env.KYNVER_CRON_FIRE_BASE_URL||process.env.OPENCLAW_CRON_FIRE_BASE_URL||v().apiBaseUrl;return r?$e(String(r)):void 0}function Xx(e,r){let t=e||or(r)||(r?void 0:or(v().agentOsId));if(t)return String(t);let n=process.env.KYNVER_RUNTIME_SECRET||process.env.KYNVER_CRON_SECRET||process.env.OPENCLAW_CRON_SECRET;if(n)return console.warn("[kynver] using deployment-level callback secret; run `kynver runner credential --agent-os-id <id>` for a scoped token"),String(n)}async function xc(e,r,t){let n=Xx(e,r);if(n)return{ok:!0,secret:n};let o=X(),s=Go(t?.baseUrl);if(o&&r&&s)try{let i=await Ir(r,{baseUrl:s,apiKey:o});return mr(r,i),{ok:!0,secret:i}}catch(i){return{ok:!1,reason:`runner credential mint failed: ${i.message}`}}return{ok:!1,reason:"no runner credential: requires --secret, KYNVER_RUNNER_TOKEN, a scoped runner token (`kynver runner credential`), ~/.kynver/credentials runnerToken, or KYNVER_API_KEY + API base URL to mint one"}}async function q(e,r,t){let n=await xc(e,r,t);if(n.ok)return n.secret;Ve(n.reason)}async function lf(e,r){let t=X(),n=Go(r?.baseUrl);if(!t||!e||!n)return null;try{let o=await Ir(e,{baseUrl:n,apiKey:t});return mr(e,o),o}catch{return null}}async function cf(e,r,t){let n=X(),o=Go(t?.baseUrl);if(!n)return{ok:!1,reason:"KYNVER_API_KEY is required to refresh a rejected runner token"};if(!r)return{ok:!1,reason:"agentOsId is required to refresh a rejected runner token"};if(!o)return{ok:!1,reason:"KYNVER_API_URL or --base-url is required to refresh a rejected runner token"};try{let s=await Ir(r,{baseUrl:o,apiKey:n});return s&&s!==e?(mr(r,s),{ok:!0,token:s}):{ok:!1,reason:"runner credential refresh returned the rejected token"}}catch(s){return{ok:!1,reason:s.message}}}async function Ir(e,r){let t=r?.apiKey||X();if(!t)throw new Error("API key required \u2014 run `kynver login` first");let o=`${L(r?.baseUrl)}/api/agent-os/by-id/${encodeURIComponent(e)}/runner-credentials`,s=await fetch(o,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${t}`},body:JSON.stringify({})}),i=await s.text(),a=null;try{a=JSON.parse(i)}catch{a=null}if(!s.ok||!a?.token)throw new Error(`runner credential mint failed (${s.status}): ${a?.error??i.slice(0,200)}`);return a.token}async function uf(e){let r=(e.agentOsId?String(e.agentOsId):v().agentOsId)||"";r||Ve("runner credential requires --agent-os-id or agentOsId in ~/.kynver/config.json");try{let t=await Ir(r,{baseUrl:e.baseUrl?String(e.baseUrl):void 0});mr(r,t),console.log(JSON.stringify({ok:!0,agentOsId:r,credentialsPath:F(Pr),tokenPrefix:`${t.slice(0,12)}\u2026`,note:"Scoped runner token saved; callbacks use X-Kynver-Runner-Token."},null,2))}catch(t){console.error(t instanceof Error?t.message:String(t)),process.exit(1)}}async function df(e){let r=(e.agentOsId?String(e.agentOsId):v().agentOsId)||"";r||Ve("runner credential list requires --agent-os-id or agentOsId in ~/.kynver/config.json");let t=X();t||Ve("API key required \u2014 run `kynver login` first");let o=`${L(e.baseUrl?String(e.baseUrl):void 0)}/api/agent-os/by-id/${encodeURIComponent(r)}/runner-credentials`;try{let s=await fetch(o,{headers:{Authorization:`Bearer ${t}`}}),i=await s.text(),a=JSON.parse(i);s.ok||(console.error(`runner credential list failed (${s.status}): ${a?.error??i.slice(0,200)}`),process.exit(1)),console.log(JSON.stringify({ok:!0,agentOsId:r,credentials:a.credentials??[]},null,2))}catch(s){console.error(s instanceof Error?s.message:String(s)),process.exit(1)}}async function pf(e){let r=(e.agentOsId?String(e.agentOsId):v().agentOsId)||"";r||Ve("runner credential revoke requires --agent-os-id or agentOsId in ~/.kynver/config.json");let t=e.tokenId?String(e.tokenId):"";t||Ve("runner credential revoke requires --token-id <tokenId>");let n=X();n||Ve("API key required \u2014 run `kynver login` first");let s=`${L(e.baseUrl?String(e.baseUrl):void 0)}/api/agent-os/by-id/${encodeURIComponent(r)}/runner-credentials`;try{let i=await fetch(s,{method:"DELETE",headers:{"Content-Type":"application/json",Authorization:`Bearer ${n}`},body:JSON.stringify({tokenId:t})}),a=await i.text(),l=JSON.parse(a);i.ok||(console.error(`runner credential revoke failed (${i.status}): ${l?.error??a.slice(0,200)}`),process.exit(1)),console.log(JSON.stringify({ok:!0,agentOsId:r,tokenId:t,revoked:!0},null,2))}catch(i){console.error(i instanceof Error?i.message:String(i)),process.exit(1)}}async function mf(e){let r=(e.agentOsId?String(e.agentOsId):v().agentOsId)||"";r||Ve("runner credential rotate requires --agent-os-id or agentOsId in ~/.kynver/config.json");let t=e.tokenId?String(e.tokenId):"";t||Ve("runner credential rotate requires --token-id <tokenId>");let n=X();n||Ve("API key required \u2014 run `kynver login` first");let s=`${L(e.baseUrl?String(e.baseUrl):void 0)}/api/agent-os/by-id/${encodeURIComponent(r)}/runner-credentials`;try{let i=await fetch(s,{method:"PATCH",headers:{"Content-Type":"application/json",Authorization:`Bearer ${n}`},body:JSON.stringify({tokenId:t})}),a=await i.text(),l=JSON.parse(a);(!i.ok||!l?.token)&&(console.error(`runner credential rotate failed (${i.status}): ${l?.error??a.slice(0,200)}`),process.exit(1)),mr(r,l.token),console.log(JSON.stringify({ok:!0,agentOsId:r,tokenId:l.tokenId,tokenPrefix:`${l.token.slice(0,12)}\u2026`,expiresAt:l.expiresAt??null,credentialsPath:F(Pr),note:"New token saved to ~/.kynver/credentials."},null,2))}catch(i){console.error(i instanceof Error?i.message:String(i)),process.exit(1)}}function ff(e){let r=v().agentOsId,t=(e.agentOsId?String(e.agentOsId):r)||"",n=process.env.KYNVER_RUNNER_TOKEN?.trim(),o=(()=>{try{let u=Cc(Pr,"utf8");return JSON.parse(u)}catch{return{}}})(),s=o.runnerToken,i=o.runnerTokenAgentOsId,a=n||s,l=a?.startsWith("krc1.")??!1,c=!t||!i||i===t;console.log(JSON.stringify({ok:!0,agentOsId:t||r||null,source:n?"env:KYNVER_RUNNER_TOKEN":s?"credentials-file":"none",hasToken:!!a,isScoped:l,tokenPrefix:a?`${a.slice(0,12)}\u2026`:null,storedAgentOsId:i??null,boundToRequestedWorkspace:c,credentialsPath:F(Pr),...c?{}:{warning:`Stored token is bound to workspace ${i??"(unknown)"} but ${t} was requested. Run \`kynver runner credential --agent-os-id ${t}\` to mint a new one.`}},null,2))}function Ve(e){console.error(e),process.exit(1)}function Yo(e){let r={};for(let t=0;t<e.length;t++){let n=e[t];if(!n.startsWith("--"))continue;let o=n.slice(2).replace(/-([a-z])/g,(i,a)=>a.toUpperCase()),s=e[t+1];!s||s.startsWith("--")?r[o]=!0:(r[o]=s,t++)}return r}async function $i(e){xn();let r=v(),t=pr({diskPath:typeof e.diskPath=="string"?e.diskPath:"/"}),n=gc({totalMemBytes:Gx.totalmem(),diskPath:t.path,diskGateOk:t.ok,diskFreeBytes:t.freeBytes,config:r}),o=zx(r,e),s=$o({...r,...qx(r,e),...o,workerProvider:typeof e.provider=="string"?e.provider:r.workerProvider||"cursor",...e.chatOauth===!0?{chatUseClaudeOauth:!0}:{}});s.agentOsId&&!xt(s.agentOsId).ok&&Ve(En(s.agentOsId));let i=je(s,process.env);i.identity&&(s.runnerId?.trim()||(s.runnerId=i.identity.runnerId),!s.harnessRoot?.trim()&&(i.identity.harnessRootSource==="box_scoped"||i.identity.harnessRootSource==="legacy_migrated")&&(s.harnessRoot=i.identity.harnessRoot)),ye(s);let a=Se(process.env,s),l=wn(s,e);l.configUpdated&&(s=v());let c,u=X(),d=s.agentOsId;if(u&&d)try{let m=await Ir(d,{baseUrl:typeof e.apiBaseUrl=="string"?e.apiBaseUrl:s.apiBaseUrl,apiKey:u});mr(d,m),c="Scoped runner token minted and saved to ~/.kynver/credentials."}catch(m){c=`Runner token not minted: ${m instanceof Error?m.message:String(m)}. Run \`kynver runner credential\` after fixing the cause (a 403 usually means the account has no AgentOS access yet \u2014 \`kynver bootstrap\` self-provisions it).`}console.log(JSON.stringify({ok:!0,configPath:F(Fi),config:Pn(s),boxKind:s.boxKind,boxKindSource:a.source,workerCapRecommendation:n,daemonSupervision:{hostKind:l.policy.hostKind,owner:l.policy.owner,envFilePath:l.envFilePath},...a.warnings.length?{boxIdentityWarnings:a.warnings}:{},note:c??"boxKind and maxConcurrentWorkers persisted; override with --box-kind and --max-workers. Run `kynver login` + `kynver runner credential` for scoped callbacks."},null,2))}async function gf(e){let r=typeof e.apiKey=="string"?e.apiKey:process.env.KYNVER_API_KEY;if(r){jo(r),console.log(JSON.stringify({ok:!0,credentialsPath:F(Pr)},null,2));return}let{runDeviceLogin:t}=await Promise.resolve().then(()=>(wc(),tf));(await t(e)).ok||process.exit(1),console.log(JSON.stringify({ok:!0,credentialsPath:F(Pr)},null,2))}var Hi,Fi,Pr,Yx,Jx,P$,I$,A=D(()=>{"use strict";yo();rr();E();we();an();wo();So();_t();Wi();yt();Hi=_c.join(jx(),".kynver"),Fi=_c.join(Hi,"config.json"),Pr=_c.join(Hi,"credentials"),Yx=/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,Jx=new Set(["aos","aos-1","agent-os-id","agentosid","agent_os_id","<agent-os-id>","<agentosid>","todo","changeme","change-me","placeholder"]);P$=500*1024*1024,I$=4*1024*1024*1024});A();import{mkdirSync as Gw,realpathSync as qW}from"node:fs";import{fileURLToPath as zW}from"node:url";A();E();wc();import Qx from"node:os";function Zx(e){let r=(typeof e.apiBaseUrl=="string"?e.apiBaseUrl:void 0)||(typeof e.baseUrl=="string"?e.baseUrl:void 0)||process.env.KYNVER_API_URL||v().apiBaseUrl;return r?$e(String(r)):void 0}function kf(e){return`${e?$e(e):"https://www.kynver.com"}/agent-os/early-access`}function hf(e){return["This account does not have Agentic OS access yet \u2014 access is admin-approved.",`Request access at ${kf(e)} .`,"Once your account is approved, it will work here as-is: just re-run `kynver bootstrap`."].join(`
16
16
  `)}function eE(e,r){return[`Could not reach ${e} (${r}).`,"This looks like a network or URL problem, not an account problem \u2014 check the","--api-base-url value and your connection, then re-run `kynver bootstrap`."].join(`
17
17
  `)}async function rE(e,r){try{let t=await fetch(`${e}/api/agent-os/provision`,{method:"POST",headers:{Authorization:`Bearer ${r}`}});if(t.ok)return{ok:!0,status:t.status};let n=await t.json().catch(()=>null);return{ok:!1,status:t.status,error:n?.error}}catch(t){return{ok:!1,status:0,error:t instanceof Error?t.message:String(t)}}}async function tE(e,r,t=fetch){let n;try{n=await t(`${e}/api/agent-os`,{headers:{Authorization:`Bearer ${r}`}})}catch(i){return{ok:!1,kind:"network",detail:i.message}}if(n.status===401||n.status===403)return{ok:!1,kind:"access_denied",status:n.status};if(!n.ok)return{ok:!1,kind:"server_error",status:n.status};let o=await n.json().catch(()=>null);if(!o?.primarySlug)return{ok:!1,kind:"no_workspace",status:n.status};let s=o.items?.find(i=>i.slug===o.primarySlug);return s?.id&&s.slug?{ok:!0,primary:{id:s.id,slug:s.slug}}:{ok:!0,primary:{id:"",slug:o.primarySlug}}}function nE(e){return/\((?:401|403)\)/.test(e)?"access_denied":"transient"}async function ji(e){let r=Zx(e);r||(console.error("kynver bootstrap requires a Kynver URL \u2014 pass --api-base-url https://www.kynver.com or set KYNVER_API_URL."),process.exit(1)),X()||(typeof e.apiKey=="string"?jo(e.apiKey):(await Sc({...e,apiBaseUrl:r})).ok||process.exit(1));let t=X();t||(console.error("No API key after login \u2014 aborting."),process.exit(1));let n=await rE(r,t);!n.ok&&n.status!==401&&n.status!==403&&console.error(`Workspace self-provision failed (${n.status||"network error"}${n.error?`: ${n.error}`:""}) \u2014 continuing with existing access, if any.`);let o=await tE(r,t);if(!o.ok){switch(o.kind){case"access_denied":console.error(hf(r));break;case"no_workspace":console.error(["Could not resolve an AgentOS workspace for this account.","If your account has not been approved for Agentic OS yet (access is admin-approved),",`request it at ${kf(r)} \u2014 once approved, re-run \`kynver bootstrap\`.`].join(`
18
18
  `));break;case"network":console.error(eE(r,o.detail));break;case"server_error":console.error(`Kynver returned an unexpected error (${o.status}) while resolving your workspace \u2014 retry \`kynver bootstrap\` in a moment.`);break}process.exit(1)}let s=o.primary,i={...e,apiBaseUrl:r,agentOsSlug:s.slug,...s.id?{agentOsId:s.id}:{},...typeof e.repo=="string"?{}:{discoverRepo:!0}};if(await $i(i),s.id&&!or(s.id))try{let a=await Ir(s.id,{baseUrl:r,apiKey:t});mr(s.id,a)}catch(a){let l=a.message;nE(l)==="access_denied"&&(console.error(`Runner credential mint was refused: ${l}`),console.error(hf(r)),process.exit(1)),console.error([`Runner credential mint did not succeed yet (${l}).`,"This is usually transient \u2014 `kynver start` retries automatically, or run",`\`kynver runner credential --agent-os-id ${s.id}\` once the server is reachable.`].join(`
@@ -91,7 +91,7 @@ ${n}`,s=AO(e.personaSlug);return!!(r.startsWith(EO)||r===PO||r.startsWith("daemo
91
91
  `)}function ku(e){if(typeof e!="string")return null;let r=e.trim();return r.length?r:null}function JO(e){return ku(e.prUrlHint)??Xh(e.status.finalResult)??ku(e.worker.taskPrUrl)??null}function qO(e){let{snapshot:r,canonical:t,workerName:n,exec:o}=e,s=!1,i=!1,a=r.headCommit??Ut(r.worktreePath,o)??void 0;if(r.changedFiles.length>0){let l=hs({worktreePath:r.worktreePath,branch:r.branch,commitMessage:`chore(harness): update PR handoff for ${n}`,hasDirtyFiles:!0,exec:o});if(!l.ok)return{ok:!1,reason:`PR-ready handoff blocked: ${l.detail??"git commit/push failed"}`,nextAction:"Commit and push the dirty worker changes to the existing PR branch, then rerun `kynver worker complete`."};s=l.committed,i=l.pushed,a=l.headCommit??a}if(t.headRefName!==r.branch){let l=nk({worktreePath:r.worktreePath,remoteBranch:t.headRefName,exec:o});if(!l.ok)return{ok:!1,reason:`PR-ready handoff blocked: ${l.detail??"git push to canonical PR branch failed"}`,nextAction:"Push worker commits to the canonical PR branch, then rerun `kynver worker complete`."};i=!0,a=Ut(r.worktreePath,o)??a}return{ok:!0,prUrl:t.url,headCommit:a,committed:s,pushed:i}}function hu(e){if(e.snapshot.changedFiles.length===0)return{ok:!0,prUrl:e.prUrl,headCommit:e.snapshot.headCommit??Ut(e.snapshot.worktreePath,e.exec)??void 0};let r=hs({worktreePath:e.snapshot.worktreePath,branch:e.snapshot.branch,commitMessage:e.commitMessage,hasDirtyFiles:!0,exec:e.exec});return r.ok?{ok:!0,prUrl:e.prUrl,headCommit:r.headCommit??e.snapshot.headCommit??void 0,committed:r.committed,pushed:r.pushed}:{ok:!1,reason:`PR-ready handoff blocked: ${r.detail??"git commit/push failed"}`,nextAction:"Commit and push the dirty worker changes to the existing PR branch, then rerun `kynver worker complete`."}}function yu(e,r=Aa){let t=JO(e),n=Zh(e.status,{prUrl:t,headCommit:null}),o=e.run.baseCommit?.trim()||e.run.base?.trim()||"origin/main";if(!Qh({dispatched:e.worker.dispatched,routingRule:e.worker.routingRule,personaSlug:e.worker.personaSlug,prUrl:t,taskTitle:e.worker.taskTitle,executorRef:e.worker.executorRef,parentTaskId:e.worker.parentTaskId,taskPrUrl:e.worker.taskPrUrl,repairTargetPrUrl:e.worker.repairTargetPrUrl,baseRef:o,exec:r,worker:e.worker,snapshot:n}).required)return t?hu({snapshot:n,prUrl:t,commitMessage:`chore(harness): update PR handoff for ${e.worker.name}`,exec:r}):{ok:!0};if(t)return hu({snapshot:n,prUrl:t,commitMessage:`chore(harness): update PR handoff for ${e.worker.name}`,exec:r});if(!VO(r)){let R=n.changedFiles.length;return{ok:!1,reason:`PR-ready handoff blocked: ${R?`${R} uncommitted change(s) with no PR URL`:"committed branch with no PR URL"}`,nextAction:"Install and authenticate GitHub CLI (`gh auth login`), then commit, push, and run `gh pr create` (or rerun `kynver worker complete` after the PR exists)."}}let i=tk(n.worktreePath,r);if(!i)return{ok:!1,reason:"PR-ready handoff blocked: could not resolve github.com origin for the worktree",nextAction:"Ensure `origin` points at GitHub, push the branch, open a PR, and rerun `kynver worker complete`."};let a=e.worker.repairTargetPrUrl?.trim();if(a){let R=!1,C=!1,I=n.headCommit??Ut(n.worktreePath,r)??void 0;if(n.changedFiles.length>0){let w=hs({worktreePath:n.worktreePath,branch:n.branch,commitMessage:`fix(harness): repair target PR ${a}`,hasDirtyFiles:!0,exec:r});if(!w.ok)return{ok:!1,reason:`PR-ready handoff blocked: ${w.detail??"git commit/push failed"}`,nextAction:"Commit and push to the target PR branch, then rerun `kynver worker complete`."};R=w.committed,C=w.pushed,I=w.headCommit??I}else{let w=r.git(n.worktreePath,["push","-u","origin",n.branch]);if(w.status!==0&&!/already up to date/i.test(w.stderr||w.stdout))return{ok:!1,reason:`PR-ready handoff blocked: ${w.stderr||w.stdout||"git push failed"}`,nextAction:"Push the target branch to origin, then rerun `kynver worker complete`."};C=w.status===0}return{ok:!0,prUrl:a,headCommit:I,committed:R,pushed:C}}let l=ku(e.worker.taskId),c=[];if(l){c=fu(n.worktreePath,i,l,r);let R=ak(c);if(R){let C=qO({snapshot:n,canonical:R,workerName:e.worker.name,exec:r});return C.ok&&C.prUrl&&gu({worktreePath:n.worktreePath,repo:i,rows:c,canonicalPrUrl:C.prUrl,exec:r}),C}}let u=Ia(n.worktreePath,i,n.branch,r);if(u)return hu({snapshot:n,prUrl:u,commitMessage:`chore(harness): update PR handoff for ${e.worker.name}`,exec:r});let d=n.changedFiles.length>0,m=!1,f=!1,p=n.headCommit??void 0,g=hs({worktreePath:n.worktreePath,branch:n.branch,commitMessage:`chore(harness): PR-ready handoff for ${e.worker.name}`,hasDirtyFiles:d,exec:r});if(d&&!g.ok)return{ok:!1,reason:`PR-ready handoff blocked: ${g.detail??"git commit/push failed"}`,nextAction:"Commit and push the branch, run `gh pr create`, then rerun `kynver worker complete`."};if(d){if(m=g.committed,f=g.pushed,!g.ok)return{ok:!1,reason:`PR-ready handoff blocked: ${g.detail??"git push failed"}`,nextAction:"Fix git auth or merge conflicts, push the branch, run `gh pr create`, then rerun `kynver worker complete`."}}else{let R=r.git(n.worktreePath,["push","-u","origin",n.branch]);if(R.status!==0&&!/already up to date/i.test(R.stderr||R.stdout))return{ok:!1,reason:`PR-ready handoff blocked: ${R.stderr||R.stdout||R.error||"git push failed"}`,nextAction:"Push the branch to origin, run `gh pr create`, then rerun `kynver worker complete`."};f=R.status===0}p=g.headCommit??p??Ut(n.worktreePath,r)??void 0;let y=p?uk(n.worktreePath,i,p,r):null;if(y)return{ok:!0,prUrl:y.prUrl,headCommit:p,committed:m,pushed:f,created:!1};let k=e.run.base?.trim()||"main",h=ok({worktreePath:n.worktreePath,repo:i,branch:n.branch,base:k.replace(/^origin\//,""),title:GO(e.worker.name,e.worker.runId),body:YO(e.worker.taskId,e.worker.name,e.worker.runId),exec:r});if(!h.ok||!h.prUrl){if(qh(h.detail))return{ok:!0,headCommit:p??void 0,committed:m,pushed:f};let R=n.changedFiles.length;return{ok:!1,reason:`PR-ready handoff blocked: ${R?`${R} uncommitted change(s) and no PR URL after handoff attempt`:"no PR URL after handoff attempt"}${h.detail?` (${h.detail})`:""}`,nextAction:"Run `gh pr create` on the worker branch (or fix `gh` auth), attach the PR URL to the task, then rerun `kynver worker complete`."}}if(l&&h.prUrl){let C=[...c.length>0?c:fu(n.worktreePath,i,l,r),{url:h.prUrl,number:Number.parseInt(h.prUrl.match(/\/pull\/(\d+)/)?.[1]??"",10)||0,headRefName:n.branch,createdAt:""}];gu({worktreePath:n.worktreePath,repo:i,rows:C,canonicalPrUrl:h.prUrl,exec:r})}return{ok:!0,prUrl:h.prUrl,headCommit:p??void 0,committed:m,pushed:f,created:h.created}}se();Jr();dc();M();se();E();import zO from"node:path";var XO=new Set(["awaiting_review","blocked","done","needs_input","waiting","scheduled","ready","cancelled","failed"]);function dk(e){return!!(typeof e.completionReportedAt=="string"&&e.completionReportedAt.trim())}function QO(e){if(typeof e=="string"){let r=e.trim();return r.length?r:null}if(e&&typeof e=="object"&&!Array.isArray(e)){let r=e,t=r.summary??r.finalSummary??r.message;if(typeof t=="string"&&t.trim())return t.trim();try{return JSON.stringify(e)}catch{return null}}return null}function rt(e){let r=e.finalResult??null,t=typeof e.lastHeartbeatSummary=="string"?e.lastHeartbeatSummary:QO(r);return{finalResult:r??t??"completed",summary:t}}function Oa(e,r,t){if(dk(e)&&e.status==="done"&&e.completionSnapshot!=null)return;let n=new Date().toISOString(),o=rt(r),s=t?.source?.trim();e.completionReportedAt=n,e.completionSnapshot=o,e.status="done",s&&(e.completionAckSource=s),j(e.runId,e),e.workerDir&&ga(e.workerDir)}function ZO(e){let r=new Map,n=e.response?.tick?.filteredItems;if(!Array.isArray(n))return r;for(let o of n){if(o.kind!=="task"||typeof o.id!="string")continue;let s=typeof o.taskStatus=="string"?o.taskStatus.trim():"";s&&r.set(o.id,s)}return r}function pk(e,r){let t=ZO(r);if(t.size===0)return[];let n=H(e),o=[];for(let s of Object.keys(n.workers||{})){let i=P(zO.join(T(n.id),"workers",_(s),"worker.json"),void 0);if(!i?.taskId||dk(i))continue;let a=t.get(i.taskId);if(!a||a==="running"||!XO.has(a))continue;let l=B(i,{base:n.base,baseCommit:n.baseCommit});Oa(i,l,{source:`board-task-${a}`}),o.push({worker:s,taskId:i.taskId,taskStatus:a})}return o}Eo();function Ta(e){return e==null?!1:typeof e=="string"?e.trim().length>0:typeof e=="object"&&!Array.isArray(e)?Object.keys(e).length>0:!0}function eT(e){let r=e.lastHeartbeatPhase?.trim();if(!r||r==="complete")return null;let t=e.lastHeartbeatSummary?.trim();return t?{summary:t,handoffState:"exited_without_complete_heartbeat",lastHeartbeatPhase:r,...e.heartbeatBlocker?{blocker:e.heartbeatBlocker}:{}}:null}function rT(e){let r=_i(e);return r?{summary:r.reason,handoffState:"exit_failure",blocked:r.blocked}:null}function tT(e){let r=e.status.attention.reason?.trim()||e.status.error?.trim()||"process exited without a final result";return{summary:`Worker exited with an error: ${r}`,handoffState:"exited_without_final_result",blocked:!0,attentionState:e.status.attention.state,attentionReason:r,...e.heartbeat.lastHeartbeatPhase?{lastHeartbeatPhase:e.heartbeat.lastHeartbeatPhase}:{},...e.heartbeat.lastHeartbeatSummary?{lastHeartbeatSummary:e.heartbeat.lastHeartbeatSummary}:{},...e.heartbeat.heartbeatBlocker?{blocker:e.heartbeat.heartbeatBlocker}:{}}}function Na(e){let{worker:r,status:t}=e;if(Ta(t.finalResult)){let u=ve(r.heartbeatPath),d=xr(u),m=Ta(d)&&JSON.stringify(d)===JSON.stringify(t.finalResult)?"heartbeat_complete":"stdout_stream";return{finalResult:t.finalResult,source:m,snapshot:rt(t)}}if(t.alive)return null;let n=mn(r.stdoutPath);if(Ta(n.finalResult)){let u={...t,finalResult:n.finalResult};return{finalResult:n.finalResult,source:"stdout_stream",snapshot:rt(u)}}let o=ve(r.heartbeatPath),s=xr(o);if(Ta(s)){let u={...t,finalResult:s,lastHeartbeatPhase:o.lastHeartbeatPhase,lastHeartbeatSummary:o.lastHeartbeatSummary};return{finalResult:s,source:"heartbeat_complete",snapshot:rt(u)}}let i=rT(t.error??n.error);if(i){let u={...t,finalResult:i};return{finalResult:i,source:"exit_failure",snapshot:rt(u)}}let a=eT(o);if(a){let u={...t,finalResult:a,lastHeartbeatPhase:o.lastHeartbeatPhase,lastHeartbeatSummary:o.lastHeartbeatSummary};return{finalResult:a,source:"heartbeat_summary",snapshot:rt(u)}}let l=tT({status:t,heartbeat:o}),c={...t,finalResult:l,lastHeartbeatPhase:o.lastHeartbeatPhase,lastHeartbeatSummary:o.lastHeartbeatSummary};return{finalResult:l,source:"exit_no_final_result",snapshot:rt(c)}}function Da(e,r){return e.completionSnapshot?.finalResult!=null?!1:(e.completionSnapshot=r.snapshot,e.completionHandoffSource=r.source,!0)}Eo();function Ma(e){return e.filter(r=>{let t=r.trim(),n=t.startsWith("??")?t.slice(2).trim():t.length>3?t.slice(3).trim():t;return n!=="node_modules"&&!n.startsWith("node_modules/")})}function mk(e){let r=e.trim();return r.startsWith("??")?r.slice(2).trim():r.length>3&&/^[ MADRCU?!]{2} /.test(r.slice(0,3))?r.slice(3).trim():r}function fk(e){return Array.isArray(e)?e.map(r=>typeof r=="string"?r.trim():"").filter(Boolean):[]}function gk(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:null}function kk(e){let r=gk(e);if(!r)return[];let t=gk(r.worktreeHandoff),n=fk(t?.disposableArtifactsRemoved);return n.length?n:fk(r.disposableArtifactsRemoved)}function hk(e){return e.replace(/\\/g,"/").replace(/^\.\//,"").replace(/\/+$/,"")}function yk(e,r){let t=Ma(e);if(t.length===0)return!0;if(r.length===0)return!1;let n=new Set(r.map(o=>hk(o)));return t.every(o=>{let s=hk(mk(o));return n.has(s)})}function La(e){if(typeof e!="string")return null;let r=e.trim();return r.length?r:null}function Rk(e){return Array.isArray(e)?e.map(r=>typeof r=="string"?r.trim():"").filter(Boolean):[]}function nT(e){return e==null?!1:typeof e=="string"?e.trim().length>0:typeof e=="boolean"?e:Array.isArray(e)?e.length>0:typeof e=="object"?Object.keys(e).length>0:!0}function oT(e){let r=Rk(e.disposableArtifactsRemoved),t=kk(e.finalResult);return[...new Set([...r,...t])]}function vk(e){let r=Rk(e.changedFiles),t=Ma(r),n=oT(e),o=t.length===0||yk(r,n);return La(e.prUrl)?o?{allowed:!0,state:"pr_handoff",materialDirtyCount:0}:{allowed:!1,state:"dirty_worktree",materialDirtyCount:t.length,detail:`Worktree has ${t.length} uncommitted change(s) with a PR attached; commit or discard before completing`}:La(e.headCommit)?o?{allowed:!0,state:"commit_handoff",materialDirtyCount:0}:{allowed:!1,state:"dirty_worktree",materialDirtyCount:t.length,detail:`Worktree has ${t.length} uncommitted change(s) on top of a commit; commit or discard before completing`}:La(e.artifactBundlePath)||La(e.patchPath)?o?{allowed:!0,state:"commit_handoff",materialDirtyCount:0}:{allowed:!1,state:"dirty_worktree",materialDirtyCount:t.length,detail:`Worktree has ${t.length} uncommitted change(s) with a patch/bundle handoff; clean the tree before completing`}:o?{allowed:!0,state:"clean",materialDirtyCount:0}:nT(e.finalResult)?{allowed:!1,state:"dirty_worktree_no_pr",materialDirtyCount:t.length,detail:`Worktree has ${t.length} uncommitted change(s) with no commit or PR; commit, open a PR, discard, or remove one-off files via \`kynver worker discard-disposable\` before completing`}:{allowed:!1,state:"dirty_worktree",materialDirtyCount:t.length,detail:`Worktree has ${t.length} uncommitted change(s) with no final result`}}var He={storeFailures:0,completionReplaysObserved:0,completionReplaysShortCircuited:0,agedReceiptsPruned:0};function Lr(e=process.env){return Ge(e).flags.dispatchReceipts}function Ru(e){return Lr(e)!=="off"}function vu(e,r){return`dispatch:${e}:${r.taskId}:${r.leaseToken}`}function Rs(e,r,t){if(!Ru())return;let n=Y();if(n)try{n.recordOperationReceipt({idempotencyKey:vu(e,r),operation:`dispatch-${e}`,resultJson:t===void 0?null:JSON.stringify(t)})}catch{He.storeFailures+=1}}function Sk(e){Rs("claim",e,{runId:e.runId,workerName:e.workerName,provider:e.provider})}function Ua(e){Rs("spawned",e)}function $n(e,r){Rs("released",e,{reasonClass:r})}function wk(e){Rs("completion-sent",e)}function bu(e,r){Rs("completion-acked",e,{outcome:r})}function Ck(e){if(!Ru())return!1;let r=Y();if(!r)return!1;try{let t=r.getOperationReceipt(vu("completion-acked",e));if(t){let n=null;try{n=t.resultJson?JSON.parse(t.resultJson).outcome??null:null}catch{n=null}if(n==="acknowledged")return He.completionReplaysObserved+=1,!0}}catch{He.storeFailures+=1}return!1}function Su(e){let r=String(e??"").split(":")[0]?.trim()??"";return r.length>0?r.slice(0,64):"unknown"}function _k(e){if(Lr()!=="enforce")return!1;let r=Y();if(!r)return!1;try{let t=r.getOperationReceipt(vu("completion-acked",e));if(!t)return!1;let n=null;try{n=t.resultJson?JSON.parse(t.resultJson).outcome??null:null}catch{n=null}return n==="acknowledged"?(He.completionReplaysShortCircuited+=1,!0):!1}catch{return He.storeFailures+=1,!1}}var sT=600*1e3;function xk(e,r){if(Lr()!=="enforce")return;let t=Y();if(t)try{t.recordOperationReceipt({idempotencyKey:`dispatch:start-failed:${e}:${r}`,operation:"dispatch-start-failed",resultJson:JSON.stringify({runId:r})})}catch{He.storeFailures+=1}}function Ek(e,r){if(Lr()!=="enforce")return[];let t=Y();if(!t)return[];let n=r?.nowMs??Date.now(),o=r?.windowMs??sT;try{return t.listOperationReceipts({operation:"dispatch-start-failed",recordedAfter:new Date(n-o).toISOString(),limit:200}).filter(s=>{try{return s.resultJson?JSON.parse(s.resultJson).runId===e:!1}catch{return!1}}).map(s=>{let i=s.idempotencyKey.slice(22);return i.slice(0,i.length-(e.length+1))}).filter(s=>s.length>0)}catch{return He.storeFailures+=1,[]}}function ys(e){let r=e.split(":")[0]??"",t=Number(r);return Number.isInteger(t)&&t>=0?t:null}var iT=900*1e3,bk=10080*60*1e3,aT=1440*60*1e3,lT=500,cT=300;function Pk(e){let r={scannedClaims:0,strandedClaimCandidates:0,prunedReceipts:0};if(!Ru())return r;let t=Y();if(!t)return r;let n=e?.nowMs??Date.now(),o=e?.strandedAfterMs??iT;try{let s=t.listOperationReceipts({operation:"dispatch-claim",recordedAfter:new Date(n-bk).toISOString(),limit:lT}),i=0,a=[];for(let c of s){let u=c.idempotencyKey.slice(15),d=Date.parse(c.recordedAt);if(!Number.isFinite(d)||n-d<o)continue;let m=t.getOperationReceipt(`dispatch:spawned:${u}`),f=t.getOperationReceipt(`dispatch:released:${u}`);if(m||f){n-d>=aT&&a.length+5<=cT&&a.push(c.idempotencyKey,`dispatch:spawned:${u}`,`dispatch:released:${u}`,`dispatch:completion-sent:${u}`,`dispatch:completion-acked:${u}`);continue}let p=u.split(":")[0]??"",g=ys(u.slice(p.length+1));if((p?t.listOperationReceipts({keyPrefix:`dispatch:completion-acked:${p}:`,limit:10}):[]).some(R=>{if(g===null)return!0;let C=R.idempotencyKey.slice(`dispatch:completion-acked:${p}:`.length),I=ys(C);return I===null||I>=g}))continue;let h=!1;if(e?.hasLiveWorker&&c.resultJson)try{let R=JSON.parse(c.resultJson);R.runId&&R.workerName&&(h=e.hasLiveWorker({runId:R.runId,workerName:R.workerName}))}catch{h=!1}h||(i+=1)}let l=a.length>0?t.deleteOperationReceiptsByKeys(a):0;if(Lr()==="enforce"){let c=t.listOperationReceipts({limit:100}).filter(u=>{let d=Date.parse(u.recordedAt);return Number.isFinite(d)&&n-d>=bk}).map(u=>u.idempotencyKey);if(c.length>0){let u=t.deleteOperationReceiptsByKeys(c);l+=u,He.agedReceiptsPruned+=u}}return{scannedClaims:s.length,strandedClaimCandidates:i,prunedReceipts:l}}catch{return He.storeFailures+=1,r}}function Ik(){return{"dispatchReceipts.storeFailures":He.storeFailures,"dispatchReceipts.completionReplaysObserved":He.completionReplaysObserved,"dispatchReceipts.completionReplaysShortCircuited":He.completionReplaysShortCircuited,"dispatchReceipts.agedReceiptsPruned":He.agedReceiptsPruned}}var jn=900*1e3,_u="admission-shadow",wu="worker-slot:",tt={storeFailures:0,missingForLive:0,deadSlotsReleased:0},Cu=!1;function Ak(){Cu=!1}function Ur(e=process.env){return Ge(e).flags.admission}function Ba(e,r){return`${wu}${e}:${r}`}function Ok(e,r){if(Ur()==="off")return;let t=Y();if(t)try{t.tryReserveAdmission(Ba(e,r),_u,jn)}catch{tt.storeFailures+=1}}function vs(e,r){if(Ur()==="off")return;let t=Y();if(t)try{t.releaseAdmission(Ba(e,r),_u)}catch{tt.storeFailures+=1}}function Tk(e){let r={liveReservations:0,refreshed:0,deadReleased:0,missingForLive:0,orphaned:0,adoptionPass:!1};if(Ur()==="off")return r;let t=Y();if(!t)return r;try{let n=new Set(e.liveWorkers.map(m=>Ba(m.runId,m.workerName))),o=t.listAdmissionReservations({keyPrefix:wu,limit:500}),s=new Set(o.map(m=>m.key)),i=[...n].filter(m=>!s.has(m)).length,a=o.filter(m=>!n.has(m.key)).length,l=!Cu;Cu=!0,!l&&i>0&&(tt.missingForLive+=i);let c=0;for(let m of e.liveWorkers)t.tryReserveAdmission(Ba(m.runId,m.workerName),_u,jn),c+=1;let u=0;for(let m of o)n.has(m.key)||t.releaseAdmission(m.key,m.owner)&&(u+=1,tt.deadSlotsReleased+=1);return{liveReservations:t.listAdmissionReservations({keyPrefix:wu,limit:500}).length,refreshed:c,deadReleased:u,missingForLive:i,orphaned:a,adoptionPass:l}}catch{return tt.storeFailures+=1,r}}function Nk(){return{"admission.storeFailures":tt.storeFailures,"admission.missingForLive":tt.missingForLive,"admission.deadSlotsReleased":tt.deadSlotsReleased}}var xu="worker-slot-n:",Wa=64;function Dk(e){return`${xu}${e}`}function Fa(e,r){return`${e}:${r}`}var nt={enforceStoreFailures:0,admissionsRefusedSlots:0,admissionsRefusedDiskBackstop:0};function Mk(e){if(Ur()!=="enforce")return{admitted:!0};let r=Y();if(!r)return{admitted:!0};let t=Math.max(0,Math.min(Wa,Math.floor(e.maxSlots)));if(e.diskActiveWorkers>=t)return nt.admissionsRefusedDiskBackstop+=1,{admitted:!1,reason:"disk_backstop"};try{let n=Fa(e.runId,e.workerName);for(let o=0;o<t;o+=1)if(r.tryReserveAdmission(Dk(o),n,jn).acquired)return{admitted:!0,slot:o};return nt.admissionsRefusedSlots+=1,{admitted:!1,reason:"slots_exhausted"}}catch{return nt.enforceStoreFailures+=1,{admitted:!0}}}function ot(e,r){if(Ur()==="off")return;let t=Y();if(t)try{let n=Fa(e,r),o=t.listAdmissionReservations({keyPrefix:xu,limit:Wa});for(let s of o)s.owner===n&&t.releaseAdmission(s.key,n)}catch{nt.enforceStoreFailures+=1}}function Lk(e){let r={refreshed:0,deadReleased:0,adopted:0};if(Ur()!=="enforce")return r;let t=Y();if(!t)return r;try{let n=new Set(e.liveWorkers.map(c=>Fa(c.runId,c.workerName))),o=t.listAdmissionReservations({keyPrefix:xu,limit:Wa}),s=0,i=0,a=new Set;for(let c of o)n.has(c.owner)?(t.tryReserveAdmission(c.key,c.owner,jn),a.add(c.owner),s+=1):t.releaseAdmission(c.key,c.owner)&&(i+=1);let l=0;for(let c of e.liveWorkers){let u=Fa(c.runId,c.workerName);if(!a.has(u)){for(let d=0;d<Wa;d+=1)if(t.tryReserveAdmission(Dk(d),u,jn).acquired){l+=1;break}}}return{refreshed:s,deadReleased:i,adopted:l}}catch{return nt.enforceStoreFailures+=1,r}}function Uk(){return{"admission.enforceStoreFailures":nt.enforceStoreFailures,"admission.refusedSlotsExhausted":nt.admissionsRefusedSlots,"admission.refusedDiskBackstop":nt.admissionsRefusedDiskBackstop}}E();E();import uT from"node:path";var dT=/^[a-z0-9][a-z0-9._-]{0,127}$/i,pT=/^[a-z0-9][a-z0-9._-]{0,63}$/i,Eu=new Set(["undefined","null"]),Bk="usage: kynver worker <action> --run RUN_ID --name WORKER_NAME";function Ha(e){let r=e.trim();if(!dT.test(r))throw new Error(`invalid run id: ${e}`);return r}function mT(e){let r=e.trim();if(!pT.test(r))throw new Error(`invalid worker name: ${e}`);return r}function Pu(e){return typeof e=="string"?e.trim():""}function kr(e){let r=Pu(e.run),t=Pu(e.name);return(!r||Eu.has(r))&&Kr(`missing --run RUN_ID (${Bk})`),(!t||Eu.has(t))&&Kr(`missing --name WORKER_NAME (${Bk})`),{runId:Ha(r),workerName:mT(t)}}function Iu(e){let r=Pu(e.run);return(!r||Eu.has(r))&&Kr("missing --run RUN_ID (usage: kynver run status --run RUN_ID)"),Ha(r)}function Wk(e){let r=uT.resolve(e);if(r.includes(".."))throw new Error("repo path must not contain .. segments");return r}import{existsSync as fT,mkdirSync as gT,readFileSync as hT,writeFileSync as kT}from"node:fs";import{homedir as yT}from"node:os";import Fk from"node:path";var RT=/\b(out of usage|increase limits?|switch to auto|ask your admin to increase your limit|(?:hit|reached|exceeded|over) (?:your |the )?usage limits?|usage limits? (?:hit|reached|exceeded)|exceeded your (?:current )?quota|quota (?:exceeded|exhausted)|insufficient_quota|insufficient (?:credits?|quota)|credits? exhausted|credit balance is too low|billing hard limit|check your plan and billing|402 payment required|provider quota exhausted|provider_quota_exhausted)\b/i,vT=30,bT=5,ST=240;function wT(e){let r=e?.trim();return!!(r&&RT.test(r))}function CT(){let e=(process.env.KYNVER_PROVIDER_QUOTA_PREFLIGHT??"on").trim().toLowerCase();return e!=="off"&&e!=="0"&&e!=="false"&&e!=="no"}function Au(){let e=Number.parseInt(process.env.KYNVER_PROVIDER_QUOTA_COOLDOWN_MINUTES??"",10);return Number.isFinite(e)?Math.min(ST,Math.max(bT,e)):vT}function Hk(){let e=process.env.KYNVER_PROVIDER_QUOTA_STORE_PATH?.trim();return e||Fk.join(yT(),".kynver","provider-quota-cooldowns.json")}function bs(e){return(e??"").trim().toLowerCase()}function Ou(){let e=Hk();if(!fT(e))return{};try{let r=JSON.parse(hT(e,"utf8"));if(!r||typeof r!="object"||Array.isArray(r))return{};let t={};for(let[n,o]of Object.entries(r)){if(!o||typeof o!="object")continue;let{lastExhaustedAt:s,reason:i}=o;typeof s!="string"||!Number.isFinite(Date.parse(s))||(t[bs(n)]={lastExhaustedAt:s,reason:typeof i=="string"?i.slice(0,500):""})}return t}catch{return{}}}function Tu(e){let r=Hk();try{gT(Fk.dirname(r),{recursive:!0}),kT(r,`${JSON.stringify(e,null,2)}
92
92
  `,"utf8")}catch{}}function _T(e,r,t=Date.now()){let n=bs(e);if(!n)return;let o=Ou();o[n]={lastExhaustedAt:new Date(t).toISOString(),reason:r.trim().slice(0,500)},Tu(o),Ff(n,Au()*6e4)}function xT(e){let r=bs(e);if(!r)return!1;Hf(r);let t=Ou();return r in t?(delete t[r],Tu(t),!0):!1}function Kk(e,r=Date.now()){if(!CT())return{ok:!0};let t=bs(e);if(!t)return{ok:!0};let n=Ou(),o=n[t],s=!!(o&&Number.isFinite(Date.parse(o.lastExhaustedAt))&&Date.parse(o.lastExhaustedAt)+Au()*6e4>r),i=Kf(t,s);if(i)return i.blocked?{ok:!1,provider:t,reason:`provider "${t}" is inside its local quota cooldown`+(i.retryAtIso?` \u2014 preflight declines spawn until ${i.retryAtIso}`:""),retryAtIso:i.retryAtIso??new Date(r).toISOString()}:{ok:!0};if(!o)return{ok:!0};let a=Date.parse(o.lastExhaustedAt),l=a+Au()*6e4;if(!Number.isFinite(a)||l<=r)return delete n[t],Tu(n),{ok:!0};let c=new Date(l).toISOString();return{ok:!1,provider:t,reason:`provider "${t}" reported quota exhaustion at ${o.lastExhaustedAt} \u2014 local preflight declines spawn until ${c}`+(o.reason?` (${o.reason.slice(0,160)})`:""),retryAtIso:c}}function ET(e){if(typeof e=="string"){let r=e.trim();return r.length?r:null}if(e&&typeof e=="object"&&!Array.isArray(e)){let r=e;for(let t of["result","summary","error"]){let n=r[t];if(typeof n=="string"&&n.trim())return n.trim()}}return null}function $k(e){let r=bs(e.provider);if(!r)return"none";let t=ET(e.finalResult)??(typeof e.error=="string"&&e.error.trim()?e.error.trim():null);return t?wT(t)?(_T(r,t,e.nowMs??Date.now()),"recorded"):xT(r)?"cleared":"none":"none"}function jk(e){let r=e.usage;return!r||r.inputTokens===void 0&&r.outputTokens===void 0?null:{provider:e.provider?.trim()||"unknown",model:r.model?.trim()||e.model?.trim()||null,inputTokens:r.inputTokens??null,outputTokens:r.outputTokens??null}}async function Vk(e,r,t){let n=await fetch(e,{method:"POST",headers:Fe(r),body:JSON.stringify(t)}),o=null;try{o=await n.json()}catch{o=null}return{ok:n.ok,status:n.status,parsed:o}}function PT(e){if(e&&typeof e=="object"){let r=e.error;if(typeof r=="string"&&r.trim())return r.trim()}}function Gk(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:null}function Ss(e){if(typeof e!="string")return null;let r=e.trim();return r.length?r:null}function IT(e){return e.completionBlocker?`blocked:${e.completionBlocker}`:e.completionOutcome?e.completionOutcome:e.completionReportedAt?"completion_acknowledged":e.finished?"worker_finished":"in_progress"}function AT(e){return e.completionBlocker?"Resolve completion blocker, then rerun `kynver worker complete`.":e.completionOutcome==="review_scheduled"||e.completionOutcome==="review_already_scheduled"?"Await review lane and landing decision in Command Center.":e.completionOutcome==="needs_attention"?"Inspect blocker/attention reason in Command Center and dispatch a repair task.":e.finished&&!e.completionReportedAt?"Post completion acknowledgement to AgentOS (`kynver worker complete`).":null}function Jk(e){let r=e?.trim();return r?/completion acknowledged but board not advanced/i.test(r)&&/task already terminal/i.test(r):!1}function OT(e){return e.prUrl?"pr_handoff":e.headCommit?"commit_handoff":e.changedFiles.length>0?"dirty_worktree":"none"}function Vn(e,r){(e.completionBlocker??void 0)!==(r??void 0)&&(r?e.completionBlocker=r:delete e.completionBlocker,j(e.runId,e))}function TT(e){e.completionBlocker&&(delete e.completionBlocker,j(e.runId,e))}function ws(e){return e?{base:e.base,baseCommit:e.baseCommit}:{}}function NT(e,r){return{...e,...r.prUrl?{prUrl:r.prUrl}:{},...r.headCommit?{headCommit:r.headCommit}:{}}}async function _s(e){let{runId:r,workerName:t}=kr(e),n=Ee(r,t),o=H(n.runId),s=B(n,ws(o)),i=(e.agentOsId?String(e.agentOsId):n.agentOsId)||"",a=(e.taskId?String(e.taskId):n.taskId)||null;if(!ke(s))return{ok:!0,skipped:!0,reason:"worker-not-finished"};if(n.localOnly)return{ok:!0,skipped:!0,reason:"local-only-worker"};if(!i)return{ok:!1,reason:"missing agentOsId"};let l=e.force===!0||e.force==="true";if(!l&&Lt(n))return{ok:!0,skipped:!0,reason:"completion-already-acknowledged",httpStatus:200};if(!l&&du(n)&&TT(n),!s.finalResult&&s.alive===!1){let x=Na({worker:n,status:s});x&&Da(n,x)&&(j(n.runId,n),n=Ee(r,t),s=B(n,ws(o)))}if(!(e.skipPrHandoff===!0||e.skipPrHandoff==="true")&&!n.steerRestartRequired&&n.dispatched&&a){let x=yu({worker:n,run:o,status:s});if(!x.ok)return Vn(n,x.reason),{ok:!1,reason:x.reason,nextAction:x.nextAction,completionBlocked:!0};(x.prUrl||x.headCommit)&&(s=B(n,ws(o)),s=NT(s,x))}let u=s.gitAncestry.headIsAncestorOfBase===!1&&s.gitAncestry.head?s.gitAncestry.head:s.headCommit;if(n.dispatched&&!n.steerRestartRequired){let x=vk({changedFiles:s.changedFiles,finalResult:s.finalResult,prUrl:s.prUrl,headCommit:u,disposableArtifactsRemoved:n.disposableArtifactsRemoved});if(!x.allowed){let J=x.detail??`worktree completion blocked (${x.state})`;return Vn(n,J),{ok:!1,reason:J,nextAction:"Clean the worktree (commit, open a PR, or `kynver worker discard-disposable --path <file>`), then rerun `kynver worker complete`.",completionBlocked:!0}}}try{$k({provider:n.provider??s.provider??null,finalResult:s.finalResult})}catch{}let d=L(e.baseUrl?String(e.baseUrl):void 0),m=e.secret?String(e.secret):void 0,f=await q(m,i,{baseUrl:d});a&&(await va({worker:n,agentOsId:i,baseUrl:d,secret:f}),n=Ee(r,t));let p=`${d}/api/agent-os/by-id/${encodeURIComponent(i)}/harness/completion`,g={...s};n.disposableArtifactsRemoved?.length&&(g.disposableArtifactsRemoved=n.disposableArtifactsRemoved),n.steerRestartRequired&&(g.steerRestartRequired=!0,g.pendingSteerEventIds=n.pendingSteerEventIds??[],n.dispatchSteerFenceEventId!=null&&(g.dispatchSteerFenceEventId=n.dispatchSteerFenceEventId));let y=jk({usage:s.usage,provider:n.provider??s.provider??null,model:typeof n.model=="string"?n.model:s.model??null}),k={source:"kynver-harness",agentOsId:i,runId:n.runId,workerName:n.name,taskId:a,leaseToken:n.leaseToken??null,startedAt:n.startedAt,finishedAt:s.lastActivityAt||new Date().toISOString(),...y?{workerUsage:y}:{},status:n.leaseToken?{...g,leaseToken:n.leaseToken}:g,workerInjection:{instructionPolicyFingerprint:n.instructionPolicyFingerprint??null,instructionPolicyEvidence:n.instructionPolicyEvidence??null,memoryQualityCapture:n.memoryQualityCapture??null,policyAt:n.instructionPolicyEvidence&&typeof n.instructionPolicyEvidence=="object"&&"policyAt"in n.instructionPolicyEvidence&&typeof n.instructionPolicyEvidence.policyAt=="string"?n.instructionPolicyEvidence.policyAt:null,personaSlug:n.personaSlug??null,personaEvidence:n.personaEvidence??null,contextEnvelopeEvidence:n.contextEnvelopeEvidence??null}},h=a&&n.leaseToken?{taskId:a,leaseToken:n.leaseToken}:null;if(h){if(Ck(h),_k(h)){let x={completionReportedAt:new Date().toISOString(),completionOutcome:"acknowledged",completionResponse:{replayShortCircuited:!0}};return xa(n,n.runId,x),Oa(n,s,{source:"harness-completion"}),Vn(n,void 0),vs(n.runId,n.name),ot(n.runId,n.name),{ok:!0,httpStatus:200,response:{ok:!0,replayShortCircuited:!0},reason:"completion_replay_short_circuited",...s.prUrl?{prHandoff:{prUrl:s.prUrl}}:{}}}wk(h)}let R=await Vk(p,f,k);if((R.status===401||R.status===403)&&!m){let x=await lf(i,{baseUrl:d});x&&x!==f&&(f=x,R=await Vk(p,f,k))}if(R.ok){let x=Gh(R.parsed);if(!Yh(x)){let G=`completion acknowledged but board not advanced: ${x.detail??(x.routeOutcome?`harness completion returned ${x.routeOutcome}`:"harness completion did not advance the linked task")}`;Vn(n,G);let le={completionReportedAt:new Date().toISOString(),completionOutcome:"rejected",completionResponse:R.parsed};return xa(n,n.runId,le),h&&bu(h,"rejected"),{ok:!1,httpStatus:R.status,response:R.parsed,reason:G,completionBlocked:!0}}Vn(n,void 0);let J=x.routeOutcome??"acknowledged",V={completionReportedAt:new Date().toISOString(),completionOutcome:"acknowledged",completionResponse:R.parsed};xa(n,n.runId,V),Oa(n,s,{source:"harness-completion"}),h&&bu(h,"acknowledged"),vs(n.runId,n.name),ot(n.runId,n.name);let N=s.prUrl;return{ok:!0,httpStatus:R.status,response:R.parsed,reason:J,...N?{prHandoff:{prUrl:N}}:{}}}let C=R.status===401||R.status===403,I=PT(R.parsed)??(C?"runner token unauthorized":"non-2xx response"),w=C?`completion replay rejected (${R.status}): ${I}`:`completion replay failed (${R.status}): ${I}`;return Vn(n,w),{ok:!1,httpStatus:R.status,response:R.parsed,completionBlocked:!0}}async function Du(e){try{let{runId:r,workerName:t}=kr(e),n=Ee(r,t),o=H(n.runId),s=B(n,ws(o)),i=(e.agentOsId?String(e.agentOsId):n.agentOsId)||"",a=(e.taskId?String(e.taskId):n.taskId)||null;if(!ke(s)){console.log(JSON.stringify({worker:n.name,runId:n.runId,status:"skipped",reason:"worker-not-finished",workerStatus:s.status,alive:s.alive},null,2));return}if(n.localOnly){console.log(JSON.stringify({worker:n.name,runId:n.runId,status:"skipped",reason:"local-only-worker"},null,2));return}i||(console.error("worker complete requires --agent-os-id (or an agentOsId persisted at worker start)"),process.exit(1));let l=await _s(e);console.log(JSON.stringify({worker:n.name,runId:n.runId,...l.skipped?{status:"skipped"}:{},...l.reason?{reason:l.reason}:{},...l.nextAction?{nextAction:l.nextAction}:{},...l.completionBlocked?{completionBlocked:l.completionBlocked}:{},agentOsId:i,taskId:a,httpStatus:l.httpStatus,response:l.response},null,2)),l.ok||process.exit(1)}catch(r){console.error(`worker complete failed: ${r.message}`),process.exit(1)}}function qk(e){let{runId:r,workerName:t}=kr(e),n=Ee(r,t),o=H(n.runId),s=B(n,ws(o));ue(Cs.join(n.workerDir,"last-status.json"),s),console.log(JSON.stringify(s,null,2))}function DT(e){return{full:`kynver worker list --run ${e} --full`,blocked:`kynver worker list --run ${e} --blocked`,running:`kynver worker list --run ${e} --running`,task:`kynver worker list --run ${e} --task <task-id>`,worker:`kynver worker list --run ${e} --worker <worker>`,runFull:`kynver run status --run ${e} --full`,workerFull:`kynver worker status --run ${e} --name <worker>`,workerTail:`kynver worker tail --run ${e} --name <worker> --lines 80`}}function Nu(e){if(typeof e!="string")return;let r=e.trim();return r.length?r:void 0}function MT(e){let r={};(e.blocked===!0||e.blocked==="true")&&(r.blocked=!0),(e.running===!0||e.running==="true")&&(r.running=!0);let t=Nu(e.task??e.taskId);t&&(r.task=t);let n=Nu(e.worker??e.name);n&&(r.worker=n);let o=Nu(e.status);return o&&(r.status=o),r}function LT(e,r){if(r.blocked){let t=typeof e.attention=="string"?e.attention:"",n=typeof e.status=="string"?e.status:"";if(!(t==="blocked"||t==="needs_attention"||t==="stale"||n==="blocked"))return!1}return!(r.running&&!(e.status==="running"&&e.attention!=="blocked"&&e.attention!=="needs_attention")||typeof r.task=="string"&&e.taskId!==r.task||typeof r.worker=="string"&&e.worker!==r.worker||typeof r.status=="string"&&e.status!==r.status)}function zk(e,r){let t=MT(r);if(Object.keys(t).length===0)return e;let n=e.workers.filter(s=>LT(s,t)),o={...e,workerCount:n.length,needsAttention:n.filter(s=>s.attention&&s.attention!=="ok"&&s.attention!=="done").map(s=>s.worker),workers:n,activeFilters:t};return e.summary&&(o.summary={statusCounts:st(n,"status"),attentionCounts:st(n,"attention"),lifecycleCounts:st(n,"lifecycleStage")}),e.controller&&(o.controller=Zk(n)),o}function Xk(e){let r=Iu(e),t=e.full===!0||e.full==="true",n=zk(t?xs(r):Es(r),e),o=n.workers;console.log(JSON.stringify({runId:n.runId,status:n.status,projection:t?"full":"compact",workerCount:n.workerCount,...n.activeFilters?{activeFilters:n.activeFilters}:{},...t?{}:{resultContract:{projection:"compact",rawWorkerPayloadsOmitted:!0,deepDetailAvailableVia:["--full","worker status","worker tail","run status --full"]},drilldownCommands:DT(r)},needsAttention:n.needsAttention,..."summary"in n?{summary:n.summary}:{},..."controller"in n?{controller:n.controller}:{},workers:o},null,2))}function Qk(e){let{run:r,workerName:t,worker:n}=e,o=B(n,{base:r.base,baseCommit:r.baseCommit}),s=o.gitAncestry.headIsAncestorOfBase===!1&&o.gitAncestry.head?o.gitAncestry.head:void 0,i=fn({alive:o.alive,finalResult:o.finalResult,changedFiles:o.changedFiles,gitAncestry:o.gitAncestry,headCommit:s}),a=n.completionBlocker,l=typeof a=="string"&&a?a:void 0,c=Jk(l)?void 0:l,u=c?"blocked":o.status,d=c?"blocked":o.attention.state,m=Gk(n.completionResponse),f=Gk(m?.task),p=Ss(m?.outcome),g=Ss(m?.status),y=Array.isArray(m?.warnings)?m.warnings.filter(w=>typeof w=="string"&&w.trim().length>0):[],k=Ss(f?.prUrl)??Ss(m?.prUrl),h=Ss(n.completionReportedAt),R=IT({finished:ke(o),completionBlocker:c,completionOutcome:p,completionReportedAt:h}),C=AT({completionBlocker:c,completionOutcome:p,completionReportedAt:h,finished:ke(o)}),I=OT({changedFiles:o.changedFiles,headCommit:s,prUrl:k??void 0});return{worker:o.worker,status:u,attention:d,attentionReason:c??o.attention.reason,landingBlocked:o.finalResult?d==="needs_attention"||d==="blocked":!1,exitedWithoutFinalResult:!o.finalResult&&!o.alive,salvageState:i?.salvageable?"review_needed":"none",salvageReason:i?.salvageable?i.attentionReason:void 0,pid:o.pid,alive:o.alive,currentTool:o.currentTool,lastActivityAt:o.lastActivityAt,lastHeartbeatPhase:o.lastHeartbeatPhase,lastHeartbeatSummary:o.lastHeartbeatSummary,heartbeatBlocker:o.heartbeatBlocker,changedFileCount:o.changedFiles.length,changedFiles:o.changedFiles,branch:o.branch,taskId:n.taskId??null,planId:n.planId??null,instructionPolicyFingerprint:typeof n.instructionPolicyFingerprint=="string"?n.instructionPolicyFingerprint:null,instructionPolicyRuleCount:(()=>{let w=n.instructionPolicyEvidence;if(!w||typeof w!="object")return null;let x=w.ruleSlugs;return Array.isArray(x)?x.length:null})(),leaseOwner:n.leaseOwner??null,model:typeof n.model=="string"?n.model:void 0,routingRule:typeof n.routingRule=="string"?n.routingRule:void 0,requestedModel:typeof n.requestedModel=="string"?n.requestedModel:void 0,headCommit:s,prUrl:k,handoffState:I,gitAncestry:o.gitAncestry,finalResult:o.finalResult,lifecycleStage:R,completionReportedAt:h,completionOutcome:n.completionOutcome??null,completionRouteStatus:g,completionRouteOutcome:p,completionWarnings:y,completionBlocker:c??null,checkpoint:{phase:o.lastHeartbeatPhase,summary:o.lastHeartbeatSummary,blocker:o.heartbeatBlocker},lastCommandHint:o.currentTool??o.lastHeartbeatSummary,failureReason:c??o.error??null,nextAction:C,ancestry:o.gitAncestry.relation,ancestryChecked:o.gitAncestry.checked}}function UT(e){let r=typeof e.status=="string"?e.status:"",t=typeof e.completionBlocker=="string"&&e.completionBlocker.trim().length>0?e.completionBlocker:void 0;return t&&!Jk(t)?!1:typeof e.completionReportedAt=="string"&&e.completionReportedAt.trim()||e.completionOutcome==="acknowledged"?!0:r==="done"}function BT(e,r){return{worker:e,status:"done",attention:"done",attentionReason:"metadata terminal worker; full status skipped in compact snapshot",alive:!1,pid:typeof r.pid=="number"?r.pid:void 0,branch:typeof r.branch=="string"?r.branch:void 0,taskId:r.taskId??null,planId:r.planId??null,model:typeof r.model=="string"?r.model:void 0,routingRule:typeof r.routingRule=="string"?r.routingRule:void 0,requestedModel:typeof r.requestedModel=="string"?r.requestedModel:void 0,lifecycleStage:r.completionReportedAt?"completion_acknowledged":"worker_finished",completionReportedAt:typeof r.completionReportedAt=="string"?r.completionReportedAt:null,completionOutcome:r.completionOutcome??null,localOnly:r.localOnly===!0,compactStatus:!0}}function st(e,r){let t={};for(let n of e){let o=n[r],s=typeof o=="string"&&o.trim()?o:"unknown";t[s]=(t[s]??0)+1}return t}function Yk(e){if(e.attention!=="blocked")return!1;let r=typeof e.attentionReason=="string"?e.attentionReason:"";return r.includes("cli-config.json.tmp")||r.includes("Invalid authentication credentials")||r.includes("provider CLI is missing or not on PATH")||r.includes("unknown command:")}function Zk(e){let r=e.filter(Yk),t=e.filter(n=>{if(Yk(n))return!1;let o=n.attention;return o==="needs_attention"||o==="blocked"||o==="stale"||n.status==="running"});return{actionableCount:t.length,runningCount:e.filter(n=>n.status==="running").length,blockedCount:e.filter(n=>n.attention==="blocked").length,staleCount:e.filter(n=>n.attention==="stale").length,needsAttentionCount:e.filter(n=>n.attention==="needs_attention").length,doneCount:e.filter(n=>n.status==="done").length,systemHealthBlockerCount:r.length,systemHealthBlockers:r.slice(0,10).map(n=>({worker:n.worker,status:n.status,attention:n.attention,attentionReason:n.attentionReason,model:n.model,routingRule:n.routingRule,lastActivityAt:n.lastActivityAt})),actionableWorkers:t.slice(0,25).map(n=>({worker:n.worker,status:n.status,attention:n.attention,attentionReason:n.attentionReason,taskId:n.taskId,planId:n.planId,model:n.model,routingRule:n.routingRule,lastActivityAt:n.lastActivityAt,nextAction:n.nextAction}))}}function ey(e,r,t){let n={runId:e.id,name:e.name,status:Io(e.status,r),repo:e.repo,workerCount:r.length,needsAttention:r.filter(o=>o.attention&&o.attention!=="ok"&&o.attention!=="done").map(o=>o.worker),workers:r};return t&&(n.summary={statusCounts:st(r,"status"),attentionCounts:st(r,"attention"),lifecycleCounts:st(r,"lifecycleStage")},n.controller=Zk(r)),n}function WT(e){return e.status==="done"&&e.attention==="done"}function xs(e){let r=H(e),n=Object.keys(r.workers||{}).map(s=>{let i=P(Cs.join(T(r.id),"workers",_(s),"worker.json"),void 0);return i?Qk({run:r,workerName:s,worker:i}):{worker:s,status:"missing",attention:"needs_attention",attentionReason:"worker.json not found"}}),o=ey(r,n,!1);return ue(Cs.join(T(r.id),"last-board.json"),o),o}function Es(e){let r=H(e),n=Object.keys(r.workers||{}).map(i=>{let a=P(Cs.join(T(r.id),"workers",_(i),"worker.json"),void 0);return a?UT(a)?BT(i,a):Qk({run:r,workerName:i,worker:a}):{worker:i,status:"missing",attention:"needs_attention",attentionReason:"worker.json not found"}}),o=n.filter(i=>!WT(i)),s=ey(r,o,!0);return s.status=Io(r.status,n),s.summary={...s.summary??{},totalWorkerCount:n.length,shownWorkerCount:o.length,omittedTerminalDoneWorkerCount:n.length-o.length,allStatusCounts:st(n,"status"),allAttentionCounts:st(n,"attention")},ue(Cs.join(T(r.id),"last-board-compact.json"),s),s}async function ry(e,r){let t=String(e.run||""),n=String(e.agentOsId||"");if(!t||!n)return null;let o=xs(t),s=L(e.baseUrl?String(e.baseUrl):void 0),i=await q(e.secret?String(e.secret):void 0,n,{baseUrl:s}),a=`${s}/api/agent-os/by-id/${encodeURIComponent(n)}/harness/snapshot`,l=await te(a,i,{agentOsId:n,runId:t,source:r,snapshot:o},{agentOsId:n,baseUrl:s});return{ok:l.ok,httpStatus:l.status,response:l.response,authRefreshed:l.refreshedAuth,authRefreshFailure:l.authRefreshFailure}}function FT(e){return{full:`kynver run status --run ${e} --full`,blocked:`kynver status --run ${e} --blocked`,running:`kynver status --run ${e} --running`,task:`kynver status --run ${e} --task <task-id>`,worker:`kynver status --run ${e} --worker <worker>`,workersFull:`kynver worker list --run ${e} --full`,workerFull:`kynver worker status --run ${e} --name <worker>`,workerTail:`kynver worker tail --run ${e} --name <worker> --lines 80`,monitorTick:`kynver monitor status --run ${e} --tick`}}function ty(e){let r=Iu(e),t=e.full===!0||e.full==="true",n=zk(t?xs(r):Es(r),e);n.projection=t?"full":"compact",t||(n.resultContract={projection:"compact",rawWorkerPayloadsOmitted:!0,omittedWorkerFields:["finalResult","changedFiles","gitAncestry","completionResponse","stdout/stderr tails"],deepDetailAvailableVia:["--full","worker status","worker tail","monitor status --tick"]},n.drilldownCommands=FT(r)),console.log(JSON.stringify(n,null,2))}function ny(e){let{runId:r,workerName:t}=kr(e),n=Ee(r,t),o=pi(n.stdoutPath,Number(e.lines||40));if(e.raw===!0||e.raw==="true"){process.stdout.write(o);return}for(let s of o.split(`
93
93
  `).filter(Boolean)){let i=rn(s),a=i?_m(i):s;a&&console.log(a)}}function oy(e){let{runId:r,workerName:t}=kr(e),n=Ee(r,t);if(!$(n.pid)){console.log(JSON.stringify({worker:n.name,pid:n.pid,status:"not_running"},null,2));return}if(dr(n.pid,"SIGTERM"),ht(1500),$(n.pid)){dr(n.pid,"SIGKILL"),console.log(JSON.stringify({worker:n.name,pid:n.pid,status:"sigkill_sent"},null,2));return}console.log(JSON.stringify({worker:n.name,pid:n.pid,status:"stopped"},null,2))}E();A();M();E();function HT(e){if(!e||typeof e!="object"||Array.isArray(e))return null;let r=e;if(!Array.isArray(r.pendingSteers))return null;let t=r.pendingSteers.flatMap(n=>{if(!n||typeof n!="object"||Array.isArray(n))return[];let o=n;return!Number.isInteger(o.id)||Number(o.id)<0?[]:[{id:Number(o.id),message:typeof o.message=="string"?o.message:"Operator updated the task",createdAt:typeof o.createdAt=="string"?o.createdAt:new Date(0).toISOString()}]});return{dispatchSteerFenceEventId:Number.isInteger(r.dispatchSteerFenceEventId)&&Number(r.dispatchSteerFenceEventId)>=0?Number(r.dispatchSteerFenceEventId):0,lastSteerEventId:Number.isInteger(r.lastSteerEventId)&&Number(r.lastSteerEventId)>=0?Number(r.lastSteerEventId):null,pendingSteers:t}}async function sy(e){let{worker:r}=e;if(!r.agentOsId||!r.taskId)return!1;let t=`${e.baseUrl}/api/agent-os/by-id/${encodeURIComponent(r.agentOsId)}/tasks/${encodeURIComponent(r.taskId)}/steer-delivery`,n=await Mn(t,e.secret);if(!n.ok)return!1;let o=HT(n.response);if(!o?.pendingSteers.length)return!1;let s=o.pendingSteers.map(a=>a.id),i=r.steerRestartRequestedAt??new Date().toISOString();if(r.steerRestartRequired=!0,r.steerRestartRequestedAt=i,r.pendingSteerEventIds=s,r.dispatchSteerFenceEventId??=o.dispatchSteerFenceEventId,j(e.runId,r),$(r.pid)){let a=Date.now()-new Date(i).getTime();dr(r.pid,a>=5e3?"SIGKILL":"SIGTERM")}return!0}var GT=5e3,YT=360*60*1e3,JT=3,qT=5e3;function zT(e){let{runId:r,workerName:t}=kr(e);return{run:r,name:t,agentOsId:e.agentOsId?String(e.agentOsId):void 0,pollMs:Number(e.pollMs)>0?Math.floor(Number(e.pollMs)):void 0,maxTotalMs:Number(e.maxTotalMs)>0?Math.floor(Number(e.maxTotalMs)):void 0,completeAttempts:Number(e.completeAttempts)>0?Math.floor(Number(e.completeAttempts)):void 0,completeBackoffMs:Number(e.completeBackoffMs)>0?Math.floor(Number(e.completeBackoffMs)):void 0,baseUrl:e.baseUrl?String(e.baseUrl):void 0,secret:e.secret?String(e.secret):void 0}}async function Gn(e){let r=zT(e),t=r.pollMs??GT,n=r.maxTotalMs??YT,o=r.completeAttempts??JT,s=r.completeBackoffMs??qT,i=Ee(r.run,r.name);if(!i.agentOsId||!i.taskId)return{worker:i.name,runId:i.runId,outcome:"missing_link",attempts:0,reason:"worker has no agentOsId/taskId \u2014 nothing to attribute completion to"};if(Lt(i))return{worker:i.name,runId:i.runId,outcome:"completed",httpStatus:200,attempts:0,reason:"completion-already-acknowledged"};let a=Date.now(),l=L(r.baseUrl),c=r.secret;for(;;){if(i=Ee(r.run,r.name),Lt(i))return{worker:i.name,runId:i.runId,outcome:"completed",httpStatus:200,attempts:0,reason:"completion-already-acknowledged"};let m=B(i);if(ke(m)||!$(i.pid))break;try{c??=await q(void 0,i.agentOsId,{baseUrl:l}),await sy({runId:r.run,worker:i,baseUrl:l,secret:c})}catch{}if(Date.now()-a>n)return{worker:i.name,runId:i.runId,outcome:"timed_out",attempts:0,reason:`worker did not finish within ${n}ms`};ht(t)}let u,d;for(let m=1;m<=o;m++){let f=await _s({run:r.run,name:r.name,...r.agentOsId?{agentOsId:r.agentOsId}:{},...r.baseUrl?{baseUrl:r.baseUrl}:{},...r.secret?{secret:r.secret}:{}});if(u=f.httpStatus,f.ok)return{worker:i.name,runId:i.runId,outcome:"completed",httpStatus:f.httpStatus,attempts:m};if(f.httpStatus===401||f.httpStatus===403)return d=typeof f.reason=="string"?f.reason:"completion replay refused",{worker:i.name,runId:i.runId,outcome:"blocked",httpStatus:f.httpStatus,attempts:m,reason:d};d=typeof f.reason=="string"?f.reason:"transient failure",m<o&&ht(s)}return{worker:i.name,runId:i.runId,outcome:"blocked",httpStatus:u,attempts:o,reason:d??"completion failed after retries"}}async function ay(e){try{let r=await Gn(e);console.log(JSON.stringify(r,null,2)),(r.outcome==="missing_link"||r.outcome==="timed_out")&&process.exit(1),process.exit(0)}catch(r){console.error(`worker auto-complete failed: ${r.message}`),process.exit(1)}}function ly(e){let r=e.nodeExecutable??process.execPath,t=Hn({importMetaUrl:import.meta.url,explicitCliPath:e.cliPath,nodeExecutable:r});if(!t)return;let n=t.cliPath;if(!$T(n))return;let o=VT.join(e.workerDir,"auto-complete.log"),s;try{s=jT(o,"a")}catch{s=void 0}let i=["ignore",s??"ignore",s??"ignore"],a=[...t.argsPrefix,"worker","auto-complete","--run",e.runId,"--name",e.workerName];e.agentOsId&&a.push("--agent-os-id",e.agentOsId),e.baseUrl&&a.push("--base-url",e.baseUrl),e.secret&&a.push("--secret",e.secret);try{let l=KT(t.command,a,pe({detached:!0,stdio:i,env:process.env}));return s!==void 0&&iy(s),l.unref(),{pid:l.pid,logPath:o,cliPath:n}}catch{if(s!==void 0)try{iy(s)}catch{}return}}function cy(e){let r=e.branch?.trim()||"unknown branch",t=e.pid!=null?`pid ${e.pid}`:"pid pending";return`Harness worker started: ${e.worker} (${t}, ${r})`}function Mu(e){return JSON.stringify(e,null,2)}Oe();function uy(e,r,t){me(e,["fetch","origin",t,"--prune"],{allowFailure:!0});let n=`origin/${t}`,o=ee(e,["worktree","add","-B",t,r,n]);if(o.status===0)return;let s=ee(e,["worktree","add","-b",t,r,"HEAD"]);if(s.status!==0){let i=o.stderr||o.stdout||s.stderr||s.stdout||"git worktree add failed for repair target branch";throw new Error(i)}}we();_n();A();function Lu(e,r){let t=typeof r.name=="string"?r.name.trim():"";if(!t||t==="undefined"||t==="null")throw new Error(`worker name is required and must be a real identifier (got: ${JSON.stringify(r.name)})`);let n=_(t);if(e.workers?.[n])throw new Error(`worker already exists in run ${e.id}: ${n}`);if(!r.task)throw new Error(`missing task text for worker ${n}`);let o=r.routingRule||r.requestedModel?{provider:r.provider||Zr,model:r.model,rule:r.routingRule||"explicit:spawn",requestedModel:r.requestedModel??r.model}:ya({explicitModel:r.model,explicitProvider:r.provider,explicitProviderIsOperatorOverride:!!r.provider?.trim()}),s=Vh(o.provider),i=o.model;if(s.preflightModel){let G=s.preflightModel(r.model);if(!G.ok)throw new Error(`model preflight failed for provider "${s.name}": ${G.note??"invalid model/provider combination"}`);G.normalized&&console.error(`[supervisor] ${n}: ${G.note}`),i=G.model}let{worktreesDir:a}=re(),l=Yn.join(T(e.id),"workers",n);QT(l,{recursive:!0});let c=Yn.join(a,e.id,n),u=r.repairTargetBranch?.trim()||void 0,d=u||r.branch||`agent/${e.id}/${n}`;if(XT(c))throw new Error(`worktree path already exists: ${c}`);if(me(e.repo,["fetch","origin","--prune"],{allowFailure:!0}),u)uy(e.repo,c,u);else{let G=Mh({baseCommit:e.baseCommit,base:e.base,verifyRef:le=>me(e.repo,["rev-parse","--verify","--quiet",`${le}^{commit}`],{allowFailure:!0}).trim().length>0});G.repaired&&(console.error(`[supervisor] ${n}: run baseCommit ${e.baseCommit||"<empty>"} invalid \u2014 repaired to ${G.ref} (${G.source})`),e.baseCommit=me(e.repo,["rev-parse",G.ref],{allowFailure:!0}).trim()||G.ref,Le(e)),me(e.repo,["worktree","add","-b",d,c,e.baseCommit],{throwError:!0})}let m=Yn.join(l,"stdout.jsonl"),f=Yn.join(l,"stderr.log"),p=Yn.join(l,"heartbeat.jsonl"),g=Wh({task:r.task,ownedPaths:r.ownedPaths||[],worktreePath:c,heartbeatPath:p,planId:r.planId,taskId:r.taskId,instructionPolicyMarkdown:r.instructionPolicyMarkdown,memoryQualityMarkdown:r.memoryQualityPromptMarkdown??r.memoryQualityCapture?.promptMarkdown??null,personaMarkdown:r.personaMarkdown,contextEnvelopeMarkdown:r.contextEnvelopeMarkdown,runtimeEnvelopeMarkdown:r.runtimeEnvelopeMarkdown,model:i,repairTargetPrUrl:r.repairTargetPrUrl,repairTargetBranch:r.repairTargetBranch??(u||void 0)}),y=process.env.KYNVER_HARNESS_TASK_ID,k=process.env.KYNVER_HARNESS_AGENT_OS_ID;r.taskId&&(process.env.KYNVER_HARNESS_TASK_ID=String(r.taskId)),r.agentOsId&&(process.env.KYNVER_HARNESS_AGENT_OS_ID=String(r.agentOsId));let h=Pa({title:r.taskTitle,personaSlug:r.personaSlug,parentTaskId:r.parentTaskId,executorRef:r.executorRef}),R,C=r.workerMcpToken?.trim();if(C&&s.name==="claude"&&Fn()){let G=Ki();G&&r.agentOsId&&r.taskId?(R=lh({workerDir:l,token:C,apiBaseUrl:G,agentOsId:String(r.agentOsId),taskId:String(r.taskId)}),console.error(`[supervisor] ${n}: worker MCP tools enabled (config in workerDir)`)):console.error(`[supervisor] ${n}: worker MCP tools skipped (missing API base URL or task identity) \u2014 spawning without tools`)}let I;try{I=s.start({name:n,task:r.task,ownedPaths:r.ownedPaths,model:i,branch:d,worktreePath:c,workerDir:l,stdoutPath:m,stderrPath:f,heartbeatPath:p,prompt:g,reviewWorker:h,executionMode:r.executionMode??"write",...R?{mcpConfigPath:R,mcpAllowedTools:ih(r.workerMcpCapabilities)}:{}})}catch(G){throw R&&ga(l),me(e.repo,["worktree","remove","--force",c],{allowFailure:!0}),me(e.repo,["branch","-D",d],{allowFailure:!0}),G}finally{y===void 0?delete process.env.KYNVER_HARNESS_TASK_ID:process.env.KYNVER_HARNESS_TASK_ID=y,k===void 0?delete process.env.KYNVER_HARNESS_AGENT_OS_ID:process.env.KYNVER_HARNESS_AGENT_OS_ID=k}let w=_h(I.model,i,s.defaultModel),x=v(),J=Se(process.env,x),V=qe().runnerId,N=Cn({boxKind:J.boxKind,config:x,env:process.env}),Q={name:n,runId:e.id,status:"running",pid:I.pid,model:w,provider:o.provider,branch:d,worktreePath:c,workerDir:l,stdoutPath:m,stderrPath:f,heartbeatPath:p,ownedPaths:r.ownedPaths,...r.agentOsId?{agentOsId:String(r.agentOsId)}:{},...r.taskId?{taskId:String(r.taskId)}:{},...r.planId?{planId:String(r.planId)}:{},...r.instructionPolicyFingerprint?{instructionPolicyFingerprint:String(r.instructionPolicyFingerprint)}:{},...r.instructionPolicyEvidence?{instructionPolicyEvidence:r.instructionPolicyEvidence}:{},...r.memoryQualityCapture?{memoryQualityCapture:r.memoryQualityCapture}:{},...r.personaSlug?{personaSlug:String(r.personaSlug)}:{},...r.personaEvidence?{personaEvidence:r.personaEvidence}:{},...r.contextEnvelopeEvidence?{contextEnvelopeEvidence:r.contextEnvelopeEvidence}:{},...r.runtimeEnvelopeEvidence?{runtimeEnvelopeEvidence:r.runtimeEnvelopeEvidence}:{},...r.leaseOwner?{leaseOwner:String(r.leaseOwner)}:{},...r.leaseToken?{leaseToken:String(r.leaseToken)}:{},...r.dispatched?{dispatched:!0}:{},...!r.agentOsId||!r.taskId?{localOnly:!0}:{},routingRule:o.rule,...o.requestedModel?{requestedModel:o.requestedModel}:{},...o.orchestrationAudit?{orchestrationAudit:o.orchestrationAudit}:{},...r.executorRef?{executorRef:String(r.executorRef)}:{},...r.parentTaskId?{parentTaskId:String(r.parentTaskId)}:{},...r.taskTitle?{taskTitle:String(r.taskTitle)}:{},...r.taskPrUrl?{taskPrUrl:String(r.taskPrUrl)}:{},...r.repairTargetPrUrl?{repairTargetPrUrl:String(r.repairTargetPrUrl)}:{},...r.repairTargetBranch?{repairTargetBranch:String(r.repairTargetBranch)}:{},executionMode:r.executionMode??"write",boxKind:J.boxKind,boxId:N,runtimeId:V,startedAt:new Date().toISOString()};if(j(e.id,Q),e.workers={...e.workers||{},[n]:{workerDir:l,statusPath:Yn.join(l,"worker.json")}},e.status="running",Le(e),Q.agentOsId&&Q.taskId){let G;try{G=ly({runId:e.id,workerName:n,workerDir:l,agentOsId:Q.agentOsId})}catch(le){let Z=`completion sidecar failed to spawn: ${le.message}`;Q.completionBlocker=Z,j(e.id,Q)}if(G)G.pid&&(Q.completionSidecarPid=G.pid,j(e.id,Q));else{let le="completion sidecar failed to spawn (CLI not found or spawn error)";Q.completionBlocker=le,Q.completionSidecarSpawnFailedAt=new Date().toISOString(),j(e.id,Q)}}return Q}async function dy(e){let r=H(String(e.run)),t=typeof e.name=="string"?e.name.trim():"";t||(console.error("worker start failed: --name is required"),process.exit(1));let n=e.task?String(e.task):Wp(e.taskFile?String(e.taskFile):void 0);n||(console.error("missing --task or --task-file"),process.exit(1));let o=!!(e.agentOsId&&e.taskId),s=e.localOnly===!0||e.localOnly==="true";!o&&!s&&(e.agentOsId||e.taskId)&&(console.error("worker start: board-linked workers require both --agent-os-id and --task-id (or pass --local-only for direct runs)"),process.exit(1));let i=e.wait===!0||e.wait==="true",a=e.emitJson===!0||e.emitJson==="true",l;try{l=Lu(r,{name:t,task:n,ownedPaths:e.owned?String(e.owned).split(",").map(d=>d.trim()).filter(Boolean):[],model:e.model?String(e.model):void 0,branch:e.branch?String(e.branch):void 0,agentOsId:e.agentOsId?String(e.agentOsId):void 0,taskId:e.taskId?String(e.taskId):void 0,provider:e.provider?String(e.provider):void 0});let u={runId:r.id,worker:l.name,pid:l.pid,branch:l.branch,worktreePath:l.worktreePath,workerDir:l.workerDir};a?console.log(Mu(u)):(console.log(cy(u)),console.error(Mu(u)))}catch(u){console.error(`worker start failed: ${u.message}`),process.exit(1)}if(!i||!l)return;let c=await Gn({run:String(e.run),name:l.name,...l.agentOsId?{agentOsId:l.agentOsId}:{},...e.baseUrl?{baseUrl:String(e.baseUrl)}:{},...e.secret?{secret:String(e.secret)}:{}});console.error(JSON.stringify({event:"start_wait_outcome",...c})),c.outcome==="timed_out"&&(process.exitCode=1)}function ZT(e){return e.KYNVER_RUNNER_TOKEN?.trim()||e.OPENCLAW_RUNNER_TOKEN?.trim()||null}function eN(e){return e.KYNVER_API_KEY?.trim()||e.KYNVER_RUNTIME_SECRET?.trim()||null}async function py(e,r={}){let t=r.env??process.env,n=r.nowMs??Date.now(),o=r.timeoutMs??8e3,s=new Date(n).toISOString(),i=r.fetcher??fetch,a=ZT(t),l=eN(t),c="none",u={};if(a)c="runner_token",u["X-Kynver-Runner-Token"]=a;else if(l)c="api_key",u["X-Kynver-Service-Secret"]=l;else return{reachable:!1,authSource:"none",endpoint:null,httpStatus:null,responseMs:null,probedAt:s,error:"No runner token or API key found \u2014 set KYNVER_RUNNER_TOKEN or complete M0.3 install"};let d=`${e.apiBaseUrl}/api/agent-os/runner-token/verify`,m=Date.now();try{let f=AbortSignal.timeout(o),p=await i(d,{method:"GET",headers:{...u,Accept:"application/json","X-Kynver-Agent-Os-Id":e.agentOsId},signal:f}),g=Date.now()-m,y=p.status<500;return{reachable:y,authSource:c,endpoint:d,httpStatus:p.status,responseMs:g,probedAt:s,error:y?null:`MCP endpoint returned HTTP ${p.status} \u2014 server error or misconfigured KYNVER_API_URL`}}catch(f){let p=Date.now()-m,g=f instanceof Error?f.message:String(f);return{reachable:!1,authSource:c,endpoint:d,httpStatus:null,responseMs:p,probedAt:s,error:`MCP endpoint unreachable: ${g}`}}}function rN(e,r){let t=e.KYNVER_API_URL?.trim()||e.KYNVER_CRON_FIRE_BASE_URL?.trim()||r.apiBaseUrl?.trim()||null;return t?t.replace(/\/+$/,""):null}function tN(e,r){return(e.KYNVER_DEFAULT_REPO?.trim()||e.KYNVER_HARNESS_REPO?.trim()||r.defaultRepo?.trim()||null)??null}function nN(e,r,t){let n=e.KYNVER_HARNESS_ROOT?.trim()||r.harnessRoot?.trim()||null;return n||t||null}function my(e,r={}){let t=r.env??process.env,n=r.nowMs??Date.now(),o=r.config??{},s=rN(t,o);if(!s)return{ok:!1,code:"missing_api_base_url",detail:"No API base URL found. Set KYNVER_API_URL, or run `kynver setup --api-base-url <url>`."};let i=(t.KYNVER_AGENT_OS_ID??t.OPENCLAW_AGENT_OS_ID??o.agentOsId??"").trim();if(i&&i!==e.agentOsId)return{ok:!1,code:"workspace_mismatch",detail:`envelope workspace "${e.agentOsId}" does not match local config "${i}"`};let a=tN(t,o),l=nN(t,o,a);return{ok:!0,context:{jobId:e.jobId,agentOsId:e.agentOsId,taskId:e.taskId,repoPath:a,worktreeBase:l,apiBaseUrl:s,hydratedAt:new Date(n).toISOString()}}}E();import{createHash as fy}from"node:crypto";function it(e){let r=e.replace(/\r\n/g,`
94
- `).trimEnd();return fy("sha256").update(r,"utf8").digest("hex")}function Jn(e){if(e==null)return null;let r=e.trim();return r?fy("sha256").update(r,"utf8").digest("hex"):null}A();var ae=class extends Error{kind;httpStatus;constructor(r,t,n){super(t),this.name="PlanPersistError",this.kind=r,this.httpStatus=n}};function Ps(e,r){return e===401||e===403?new ae("auth",r,e):e>=500?new ae("server",r,e):new ae("permanent",r,e)}function Uu(e){let r=e instanceof Error?e.message:String(e);return/ECONNREFUSED|ENOTFOUND|ETIMEDOUT|fetch failed|network/i.test(r)?new ae("network",r):new ae("tool_interruption",r)}function gy(e){return e!=="permanent"}function $a(e){let r={"Content-Type":"application/json"};return e&&(r.Authorization=`Bearer ${e}`),r}async function ja(e){let r=await e.text();try{return JSON.parse(r)}catch{return r}}async function hy(e,r,t={}){let n=L(t.baseUrl),o=t.apiKey??X(),s=t.fetchFn??fetch,i=`${n}/api/agent-os/${encodeURIComponent(e)}/plans/${encodeURIComponent(r)}`;try{let a=await s(i,{method:"GET",headers:$a(o)}),l=await ja(a);if(!a.ok){let c=typeof l=="object"&&l&&"error"in l?String(l.error):`GET plan failed (${a.status})`;throw Ps(a.status,c)}return l}catch(a){throw a instanceof ae?a:Uu(a)}}async function ky(e,r={}){let t=L(r.baseUrl),n=r.apiKey??X(),o=r.fetchFn??fetch,s=e.agentOsSlug;try{if(e.operation==="create"){let m=`${t}/api/agent-os/${encodeURIComponent(s)}/plans`,f={title:e.title,summary:e.summary??null,slug:e.planSlug??null,sourceRefs:Ka(e),initialVersion:{title:e.title,body:e.body,summary:e.summary??null,changeSummary:e.changeSummary??null,author:e.author??null,sourceRefs:Ka(e)}},p=await o(m,{method:"POST",headers:$a(n),body:JSON.stringify(f)}),g=await ja(p);if(!p.ok){let k=typeof g=="object"&&g&&"error"in g?String(g.error):`create plan failed (${p.status})`;throw Ps(p.status,k)}let y=g;return{planId:y.plan.id,versionId:y.version.id,versionNumber:y.version.versionNumber}}let i=e.planId;if(!i)throw new ae("permanent","planId is required for this operation");if(e.operation==="update_metadata"){let m=`${t}/api/agent-os/${encodeURIComponent(s)}/plans/${encodeURIComponent(i)}`,f={title:e.title,summary:e.summary??null,sourceRefs:Ka(e)},p=await o(m,{method:"PATCH",headers:$a(n),body:JSON.stringify(f)}),g=await ja(p);if(!p.ok){let k=typeof g=="object"&&g&&"error"in g?String(g.error):`update plan failed (${p.status})`;throw Ps(p.status,k)}let y=g;return{planId:y.id,versionId:y.currentVersionId,versionNumber:null}}let a=`${t}/api/agent-os/${encodeURIComponent(s)}/plans/${encodeURIComponent(i)}/versions`,l={title:e.title,body:e.body,summary:e.summary??null,changeSummary:e.changeSummary??null,author:e.author??null,sourceRefs:Ka(e),markCurrent:e.markCurrent!==!1},c=await o(a,{method:"POST",headers:$a(n),body:JSON.stringify(l)}),u=await ja(c);if(!c.ok){let m=typeof u=="object"&&u&&"error"in u?String(u.error):`add version failed (${c.status})`;throw Ps(c.status,m)}let d=u;return{planId:d.version.planId,versionId:d.version.id,versionNumber:d.version.versionNumber}}catch(i){throw i instanceof ae?i:Uu(i)}}function Ka(e){let r={...e.sourceRefs??{}};return e.model&&(r.model=e.model),Object.keys(r).length?r:e.sourceRefs??null}import{createHash as oN}from"node:crypto";function Va(e){let r={operation:e.operation,agentOsSlug:e.agentOsSlug,planId:e.planId??null,planSlug:e.planSlug??null,title:e.title.trim(),summaryHash:Jn(e.summary),bodyHash:it(e.body),changeSummary:e.changeSummary?.trim()??null,markCurrent:e.markCurrent??!0};return oN("sha256").update(JSON.stringify(r),"utf8").digest("hex")}import{mkdirSync as yy}from"node:fs";import{homedir as sN}from"node:os";import qn from"node:path";function Ga(){let e=process.env.KYNVER_STATE_ROOT;return e?qn.resolve(e):qn.join(sN(),".kynver","state")}function Ya(){return qn.join(Ga(),"plan-outbox")}function iN(){return qn.join(Ga(),"plan-outbox-archive")}function at(){let e=Ya(),r=iN();return yy(e,{recursive:!0}),yy(r,{recursive:!0}),{outboxDir:e,archiveDir:r}}function Is(e){if(e.startsWith("/tmp/")||e.startsWith("/var/folders/"))return!0;let r=qn.resolve(e);return r.startsWith("/tmp/")||r.startsWith(qn.join("/var","folders"))}import{existsSync as aN,renameSync as lN}from"node:fs";var cN=600*1e3,De={storeFailures:0,corruptItemsSeen:0,corruptItemsQuarantined:0,duplicateDrainsObserved:0,halfArchivesCompleted:0};function zn(e=process.env){return Ge(e).flags.planOutbox}function uN(e){return`plan-outbox:persisted:${e}`}function Ry(e){return`plan-outbox:archived:${e}`}function Ja(e,r=()=>new Date){let t=zn();if(t==="off"||(De.corruptItemsSeen+=1,t!=="enforce"))return!1;let n=r().toISOString().replace(/[:.]/g,"-"),o=!1;for(let s of e)try{aN(s)&&(lN(s,`${s}.corrupt-${n}`),o=!0)}catch{De.storeFailures+=1}return o&&(De.corruptItemsQuarantined+=1),o}function vy(e,r){let t=zn();if(t==="off")return{proceed:!0,deduplicated:!1};let n=Y();if(!n)return{proceed:!0,deduplicated:!1};try{return n.tryReserveAdmission(`plan-outbox:${e}`,r,cN).acquired?{proceed:!0,deduplicated:!1}:(De.duplicateDrainsObserved+=1,t==="enforce"?{proceed:!1,deduplicated:!0}:{proceed:!0,deduplicated:!1})}catch{return De.storeFailures+=1,{proceed:!0,deduplicated:!1}}}function As(e,r){if(zn()==="off")return;let t=Y();if(t)try{t.releaseAdmission(`plan-outbox:${e}`,r)}catch{De.storeFailures+=1}}function by(e,r){if(zn()==="off")return;let t=Y();if(t)try{t.recordOperationReceipt({idempotencyKey:uN(e),operation:"plan-outbox-persisted",resultJson:JSON.stringify({planId:r})})}catch{De.storeFailures+=1}}function Sy(e){if(zn()==="off")return;let r=Y();if(r)try{r.recordOperationReceipt({idempotencyKey:Ry(e),operation:"plan-outbox-archived"})}catch{De.storeFailures+=1}}function wy(e,r){if(zn()!=="enforce")return!1;let t=Y();if(!t)return!1;try{return t.getOperationReceipt(Ry(e))?(r(),De.halfArchivesCompleted+=1,!0):!1}catch{return De.storeFailures+=1,!1}}function Cy(){return{"planOutbox.storeFailures":De.storeFailures,"planOutbox.corruptItemsSeen":De.corruptItemsSeen,"planOutbox.corruptItemsQuarantined":De.corruptItemsQuarantined,"planOutbox.duplicateDrainsObserved":De.duplicateDrainsObserved,"planOutbox.halfArchivesCompleted":De.halfArchivesCompleted}}import{existsSync as Os,readFileSync as _y,renameSync as Bu,readdirSync as dN,rmSync as pN,writeFileSync as mN,unlinkSync as Q2}from"node:fs";import ze from"node:path";import{randomBytes as fN,randomUUID as gN}from"node:crypto";var hN=12;function Wu(e,r,t){let n=`${e}.${process.pid}.${fN(4).toString("hex")}.tmp`;try{mN(n,r,t!==void 0?{mode:t}:void 0),Bu(n,e)}catch(o){try{pN(n,{force:!0})}catch{}throw o}}function Xn(){let{outboxDir:e}=at(),r=dN(e).filter(n=>n.endsWith(".json")),t=[];for(let n of r){let o=ze.join(e,n),s=Hu(o);if(s===null&&Os(o)){let i=o.replace(/\.json$/,".body.md");Ja([o,i]);continue}s&&s.queueStatus==="queued"&&t.push(s)}return t.sort((n,o)=>n.createdAt.localeCompare(o.createdAt))}function Fu(e){for(let r of Xn())if(r.idempotencyKey===e)return r;return null}function Hu(e){if(!Os(e))return null;try{return JSON.parse(_y(e,"utf8"))}catch{return null}}function xy(e){let{outboxDir:r}=at(),t=ze.join(r,e.bodyPath);return _y(t,"utf8")}function qa(e,r){let{outboxDir:t}=at(),n=new Date().toISOString(),o=r.existing?.id??gN(),s=r.existing?.bodyPath??`${o}.body.md`,i=ze.join(t,`${o}.json`),a=ze.join(t,s);r.existing||Wu(a,e.body);let l={id:o,idempotencyKey:Va(e),operation:e.operation,agentOsSlug:e.agentOsSlug,planId:e.planId??r.existing?.planId??null,planSlug:e.planSlug??r.existing?.planSlug??null,title:e.title,summary:e.summary??null,bodyPath:s,bodyHash:it(e.body),author:e.author??null,model:e.model??null,sourceRefs:e.sourceRefs??null,changeSummary:e.changeSummary??null,markCurrent:e.markCurrent??!0,createdAt:r.existing?.createdAt??n,updatedAt:n,retryCount:(r.existing?.retryCount??0)+(r.existing?1:0),maxRetries:e.maxRetries??r.existing?.maxRetries??hN,lastError:r.lastError,lastFailureKind:r.lastFailureKind,queueStatus:"queued",userStatus:"queued for retry",readbackEvidence:null};return Wu(i,`${JSON.stringify(l,null,2)}
94
+ `).trimEnd();return fy("sha256").update(r,"utf8").digest("hex")}function Jn(e){if(e==null)return null;let r=e.trim();return r?fy("sha256").update(r,"utf8").digest("hex"):null}A();var ae=class extends Error{kind;httpStatus;constructor(r,t,n){super(t),this.name="PlanPersistError",this.kind=r,this.httpStatus=n}};function Ps(e,r){return e===401||e===403?new ae("auth",r,e):e>=500?new ae("server",r,e):new ae("permanent",r,e)}function Uu(e){let r=e instanceof Error?e.message:String(e);return/ECONNREFUSED|ENOTFOUND|ETIMEDOUT|fetch failed|network/i.test(r)?new ae("network",r):new ae("tool_interruption",r)}function gy(e){return e!=="permanent"}function $a(e){let r={"Content-Type":"application/json"};return e&&(r.Authorization=`Bearer ${e}`),r}async function ja(e){let r=await e.text();try{return JSON.parse(r)}catch{return r}}async function hy(e,r,t={}){let n=L(t.baseUrl),o=t.apiKey??X(),s=t.fetchFn??fetch,i=`${n}/api/agent-os/${encodeURIComponent(e)}/plans/${encodeURIComponent(r)}`;try{let a=await s(i,{method:"GET",headers:$a(o)}),l=await ja(a);if(!a.ok){let c=typeof l=="object"&&l&&"error"in l?String(l.error):`GET plan failed (${a.status})`;throw Ps(a.status,c)}return l}catch(a){throw a instanceof ae?a:Uu(a)}}async function ky(e,r={}){let t=L(r.baseUrl),n=r.apiKey??X(),o=r.fetchFn??fetch,s=e.agentOsSlug;try{if(e.operation==="create"){let m=`${t}/api/agent-os/${encodeURIComponent(s)}/plans`,f={title:e.title,summary:e.summary??null,slug:e.planSlug??null,sourceRefs:Ka(e),initialVersion:{title:e.title,body:e.body,summary:e.summary??null,changeSummary:e.changeSummary??null,author:e.author??null,sourceRefs:Ka(e)}},p=await o(m,{method:"POST",headers:$a(n),body:JSON.stringify(f)}),g=await ja(p);if(!p.ok){let k=typeof g=="object"&&g&&"error"in g?String(g.error):`create plan failed (${p.status})`;throw Ps(p.status,k)}let y=g;return{planId:y.plan.id,versionId:y.version.id,versionNumber:y.version.versionNumber}}let i=e.planId;if(!i)throw new ae("permanent","planId is required for this operation");if(e.operation==="update_metadata"){let m=`${t}/api/agent-os/${encodeURIComponent(s)}/plans/${encodeURIComponent(i)}`,f={title:e.title,summary:e.summary??null,sourceRefs:Ka(e)},p=await o(m,{method:"PATCH",headers:$a(n),body:JSON.stringify(f)}),g=await ja(p);if(!p.ok){let k=typeof g=="object"&&g&&"error"in g?String(g.error):`update plan failed (${p.status})`;throw Ps(p.status,k)}let y=g;return{planId:y.id,versionId:y.currentVersionId,versionNumber:null}}let a=`${t}/api/agent-os/${encodeURIComponent(s)}/plans/${encodeURIComponent(i)}/versions`,l={title:e.title,body:e.body,summary:e.summary??null,changeSummary:e.changeSummary??null,author:e.author??null,sourceRefs:Ka(e),markCurrent:e.markCurrent!==!1},c=await o(a,{method:"POST",headers:$a(n),body:JSON.stringify(l)}),u=await ja(c);if(!c.ok){let m=typeof u=="object"&&u&&"error"in u?String(u.error):`add version failed (${c.status})`;throw Ps(c.status,m)}let d=u;return{planId:d.version.planId,versionId:d.version.id,versionNumber:d.version.versionNumber}}catch(i){throw i instanceof ae?i:Uu(i)}}function Ka(e){let r={...e.sourceRefs??{}};return e.model&&(r.model=e.model),Object.keys(r).length?r:e.sourceRefs??null}import{createHash as oN}from"node:crypto";function Va(e){let r={operation:e.operation,agentOsSlug:e.agentOsSlug,planId:e.planId??null,planSlug:e.planSlug??null,title:e.title.trim(),summaryHash:Jn(e.summary),bodyHash:it(e.body),changeSummary:e.changeSummary?.trim()??null,markCurrent:e.markCurrent??!0};return oN("sha256").update(JSON.stringify(r),"utf8").digest("hex")}import{mkdirSync as yy}from"node:fs";import{homedir as sN}from"node:os";import qn from"node:path";function Ga(){let e=process.env.KYNVER_STATE_ROOT;return e?qn.resolve(e):qn.join(sN(),".kynver","state")}function Ya(){return qn.join(Ga(),"plan-outbox")}function iN(){return qn.join(Ga(),"plan-outbox-archive")}function at(){let e=Ya(),r=iN();return yy(e,{recursive:!0}),yy(r,{recursive:!0}),{outboxDir:e,archiveDir:r}}function Is(e){if(e.startsWith("/tmp/")||e.startsWith("/var/folders/"))return!0;let r=qn.resolve(e);return r.startsWith("/tmp/")||r.startsWith(qn.join("/var","folders"))}import{existsSync as aN,renameSync as lN}from"node:fs";var cN=600*1e3,De={storeFailures:0,corruptItemsSeen:0,corruptItemsQuarantined:0,duplicateDrainsObserved:0,halfArchivesCompleted:0};function zn(e=process.env){return Ge(e).flags.planOutbox}function uN(e){return`plan-outbox:persisted:${e}`}function Ry(e){return`plan-outbox:archived:${e}`}function Ja(e,r=()=>new Date){let t=zn();if(t==="off"||(De.corruptItemsSeen+=1,t!=="enforce"))return!1;let n=r().toISOString().replace(/[:.]/g,"-"),o=!1;for(let s of e)try{aN(s)&&(lN(s,`${s}.corrupt-${n}`),o=!0)}catch{De.storeFailures+=1}return o&&(De.corruptItemsQuarantined+=1),o}function vy(e,r){let t=zn();if(t==="off")return{proceed:!0,deduplicated:!1};let n=Y();if(!n)return{proceed:!0,deduplicated:!1};try{return n.tryReserveAdmission(`plan-outbox:${e}`,r,cN).acquired?{proceed:!0,deduplicated:!1}:(De.duplicateDrainsObserved+=1,t==="enforce"?{proceed:!1,deduplicated:!0}:{proceed:!0,deduplicated:!1})}catch{return De.storeFailures+=1,{proceed:!0,deduplicated:!1}}}function As(e,r){if(zn()==="off")return;let t=Y();if(t)try{t.releaseAdmission(`plan-outbox:${e}`,r)}catch{De.storeFailures+=1}}function by(e,r){if(zn()==="off")return;let t=Y();if(t)try{t.recordOperationReceipt({idempotencyKey:uN(e),operation:"plan-outbox-persisted",resultJson:JSON.stringify({planId:r})})}catch{De.storeFailures+=1}}function Sy(e){if(zn()==="off")return;let r=Y();if(r)try{r.recordOperationReceipt({idempotencyKey:Ry(e),operation:"plan-outbox-archived"})}catch{De.storeFailures+=1}}function wy(e,r){if(zn()!=="enforce")return!1;let t=Y();if(!t)return!1;try{return t.getOperationReceipt(Ry(e))?(r(),De.halfArchivesCompleted+=1,!0):!1}catch{return De.storeFailures+=1,!1}}function Cy(){return{"planOutbox.storeFailures":De.storeFailures,"planOutbox.corruptItemsSeen":De.corruptItemsSeen,"planOutbox.corruptItemsQuarantined":De.corruptItemsQuarantined,"planOutbox.duplicateDrainsObserved":De.duplicateDrainsObserved,"planOutbox.halfArchivesCompleted":De.halfArchivesCompleted}}import{existsSync as Os,readFileSync as _y,renameSync as Bu,readdirSync as dN,rmSync as pN,writeFileSync as mN,unlinkSync as ez}from"node:fs";import ze from"node:path";import{randomBytes as fN,randomUUID as gN}from"node:crypto";var hN=12;function Wu(e,r,t){let n=`${e}.${process.pid}.${fN(4).toString("hex")}.tmp`;try{mN(n,r,t!==void 0?{mode:t}:void 0),Bu(n,e)}catch(o){try{pN(n,{force:!0})}catch{}throw o}}function Xn(){let{outboxDir:e}=at(),r=dN(e).filter(n=>n.endsWith(".json")),t=[];for(let n of r){let o=ze.join(e,n),s=Hu(o);if(s===null&&Os(o)){let i=o.replace(/\.json$/,".body.md");Ja([o,i]);continue}s&&s.queueStatus==="queued"&&t.push(s)}return t.sort((n,o)=>n.createdAt.localeCompare(o.createdAt))}function Fu(e){for(let r of Xn())if(r.idempotencyKey===e)return r;return null}function Hu(e){if(!Os(e))return null;try{return JSON.parse(_y(e,"utf8"))}catch{return null}}function xy(e){let{outboxDir:r}=at(),t=ze.join(r,e.bodyPath);return _y(t,"utf8")}function qa(e,r){let{outboxDir:t}=at(),n=new Date().toISOString(),o=r.existing?.id??gN(),s=r.existing?.bodyPath??`${o}.body.md`,i=ze.join(t,`${o}.json`),a=ze.join(t,s);r.existing||Wu(a,e.body);let l={id:o,idempotencyKey:Va(e),operation:e.operation,agentOsSlug:e.agentOsSlug,planId:e.planId??r.existing?.planId??null,planSlug:e.planSlug??r.existing?.planSlug??null,title:e.title,summary:e.summary??null,bodyPath:s,bodyHash:it(e.body),author:e.author??null,model:e.model??null,sourceRefs:e.sourceRefs??null,changeSummary:e.changeSummary??null,markCurrent:e.markCurrent??!0,createdAt:r.existing?.createdAt??n,updatedAt:n,retryCount:(r.existing?.retryCount??0)+(r.existing?1:0),maxRetries:e.maxRetries??r.existing?.maxRetries??hN,lastError:r.lastError,lastFailureKind:r.lastFailureKind,queueStatus:"queued",userStatus:"queued for retry",readbackEvidence:null};return Wu(i,`${JSON.stringify(l,null,2)}
95
95
  `,384),l}function Ey(e){let{outboxDir:r}=at(),t=ze.join(r,`${e.id}.json`);Wu(t,`${JSON.stringify(e,null,2)}
96
96
  `,384)}function Py(e){Sy(e.id),za(e)}function za(e){let{outboxDir:r,archiveDir:t}=at(),n=ze.join(r,`${e.id}.json`),o=ze.join(r,e.bodyPath),s=ze.join(t,`${e.id}.json`),i=ze.join(t,e.bodyPath);Os(o)&&Bu(o,i),Os(n)&&Bu(n,s)}function Iy(e){let{archiveDir:r}=at();return Os(ze.join(r,e.bodyPath))?(za(e),!0):!1}function Bt(e){let{outboxDir:r}=at();return{jsonPath:ze.join(r,`${e.id}.json`),bodyPath:ze.join(r,e.bodyPath)}}function Ay(e,r){return{operation:e.operation,agentOsSlug:e.agentOsSlug,planId:e.planId,planSlug:e.planSlug,title:e.title,summary:e.summary,body:r,changeSummary:e.changeSummary??void 0,author:e.author??void 0,model:e.model??void 0,sourceRefs:e.sourceRefs,markCurrent:e.markCurrent??!0,maxRetries:e.maxRetries}}async function Oy(e,r,t={}){let n=await hy(e,r.planId,t),o=n.plan,s=n.currentVersion;if(o.title.trim()!==r.title.trim())throw new ae("verification_failed",`title mismatch: expected "${r.title}", got "${o.title}"`);let i=Jn(r.summary),a=Jn(o.summary);if(i!==a)throw new ae("verification_failed","summary mismatch on readback");if(r.versionId&&o.currentVersionId!==r.versionId)throw new ae("verification_failed",`currentVersionId mismatch: expected ${r.versionId}, got ${o.currentVersionId}`);if(r.versionNumber!=null&&(!s||s.versionNumber!==r.versionNumber))throw new ae("verification_failed",`versionNumber mismatch: expected ${r.versionNumber}, got ${s?.versionNumber??"none"}`);let l=s?.body??"",c=it(l);if(r.bodyHash&&c!==r.bodyHash)throw new ae("verification_failed","body hash mismatch on readback");return{planId:o.id,currentVersionId:o.currentVersionId,versionNumber:s?.versionNumber??null,title:o.title,summary:o.summary,bodyHash:r.bodyHash||c,readAt:new Date().toISOString()}}function Ty(e,r){return{planId:r.planId,title:e.title,summary:e.summary??null,body:e.body,bodyHash:it(e.body),versionId:r.versionId,versionNumber:r.versionNumber}}var Ny="persisted and read back",kN="queued for retry",Ku="failed and needs action";async function Ts(e,r={}){e.bodyPathHint&&Is(e.bodyPathHint);let t=Va(e),n=Fu(t);if(n?.readbackEvidence)return{userStatus:Ny,outboxId:n.id,planId:n.readbackEvidence.planId,readbackEvidence:n.readbackEvidence,idempotencyKey:t};if(e.immediateFailure)return Dy(e,e.immediateFailure.message,e.immediateFailure.kind,n);let o=r.writePlan??ky,s=r.verifyReadback??Oy;try{let i=await o(e,r),a={...e,planId:i.planId},l=Ty(a,i),c=await s(e.agentOsSlug,yN(e,l),r);return by(t,i.planId??null),n&&Py(n),{userStatus:Ny,planId:i.planId,versionId:i.versionId??void 0,readbackEvidence:c,idempotencyKey:t}}catch(i){let a=i instanceof ae?i:new ae("tool_interruption",i instanceof Error?i.message:String(i));if(!gy(a.kind)){let l=qa(e,{lastError:a.message,lastFailureKind:a.kind,existing:n??void 0}),c=Bt(l),u=My(l,a.message);return{userStatus:Ku,outboxId:u.id,outboxPath:c.jsonPath,bodyPath:c.bodyPath,lastError:a.message,idempotencyKey:t}}return Dy(e,a.message,a.kind,n)}}function yN(e,r){return e.operation==="update_metadata"?{...r,body:"",bodyHash:""}:r}function Dy(e,r,t,n){let o=qa(e,{lastError:r,lastFailureKind:t,existing:n??void 0}),s=Bt(o);if(o.retryCount>=o.maxRetries){let i=My(o,r);return{userStatus:Ku,outboxId:i.id,outboxPath:s.jsonPath,bodyPath:s.bodyPath,lastError:r,idempotencyKey:o.idempotencyKey}}return{userStatus:kN,outboxId:o.id,outboxPath:s.jsonPath,bodyPath:s.bodyPath,lastError:r,idempotencyKey:o.idempotencyKey}}function My(e,r){let t={...e,queueStatus:"failed",userStatus:Ku,lastError:r,updatedAt:new Date().toISOString()};return Ey(t),t}import{existsSync as RN}from"node:fs";import vN from"node:os";import bN from"node:path";async function $u(e={},r={}){let t=Xn().filter(i=>e.outboxId?i.id===e.outboxId:!0),n=e.max&&e.max>0?t.slice(0,e.max):t,o={processed:0,succeeded:0,stillQueued:0,failed:0,results:[]},s=`${vN.hostname()}:${process.pid}`;for(let i of n){if(wy(i.id,()=>za(i))){o.processed+=1,o.succeeded+=1,o.results.push({outboxId:i.id,userStatus:"persisted and read back",lastError:void 0});continue}if(!vy(i.id,s).proceed){o.deduplicated=(o.deduplicated??0)+1,o.results.push({outboxId:i.id,userStatus:"queued for retry",lastError:"skipped: another drainer holds this item's lease",skipped:!0});continue}o.processed+=1;let l;try{l=xy(i)}catch(d){let{jsonPath:m,bodyPath:f}=Bt(i);if(!RN(m)){As(i.id,s),o.processed-=1,o.deduplicated=(o.deduplicated??0)+1,o.results.push({outboxId:i.id,userStatus:"queued for retry",lastError:"skipped: item archived by a concurrent drainer",skipped:!0});continue}if(Iy(i)){As(i.id,s),o.succeeded+=1,o.results.push({outboxId:i.id,userStatus:"persisted and read back",lastError:void 0});continue}let p=Ja([m,f]);if(As(i.id,s),!p)throw d;o.failed+=1,o.results.push({outboxId:i.id,userStatus:"failed and needs action",lastError:`outbox body unreadable \u2014 quarantined: ${d.message}`});continue}let c=Ay(i,l),u;try{u=await Ts(c,r)}finally{As(i.id,s)}u.userStatus==="persisted and read back"?o.succeeded+=1:u.userStatus==="failed and needs action"?o.failed+=1:o.stillQueued+=1,o.results.push({outboxId:i.id,userStatus:u.userStatus,lastError:u.lastError})}return o}function ju(e){let r=bN.join(Ya(),`${e}.json`);return Hu(r)}function Vu(e){let r=Bt(e);return["## Plan persistence risk","",`AgentOS plan write is **not** confirmed (${e.userStatus}).`,`- outboxId: \`${e.id}\``,e.planId?`- planId: \`${e.planId}\``:"- planId: (pending \u2014 create not yet applied)",`- outbox: \`${r.jsonPath}\``,`- body: \`${r.bodyPath}\``,"","Drain when approval/connectivity returns: `kynver plan outbox drain`"].join(`
97
97
  `)}function Gu(e){let r=e.metadata&&typeof e.metadata=="object"?e.metadata:null,t=typeof e.planPersistenceOutboxId=="string"&&e.planPersistenceOutboxId||(r&&typeof r.planPersistenceOutboxId=="string"?r.planPersistenceOutboxId:void 0);return t?{outboxId:t,jsonPath:typeof e.planPersistenceOutboxPath=="string"?e.planPersistenceOutboxPath:r&&typeof r.planPersistenceOutboxPath=="string"?r.planPersistenceOutboxPath:void 0,bodyPath:typeof e.planPersistenceBodyPath=="string"?e.planPersistenceBodyPath:r&&typeof r.planPersistenceBodyPath=="string"?r.planPersistenceBodyPath:void 0}:null}M();function Yu(e){return e?.trim()?e.trim():null}function Ly(e,r){let t=Yu(e.boxKind),n=Yu(e.runnerId),o=Yu(e.harnessRoot);return t&&t!==r.boxKind?{ok:!1,reason:`run ${e.id} belongs to box "${t}" but this host is "${r.boxKind}" \u2014 use a run under ${r.harnessRoot}`}:n&&n!==r.runnerId?{ok:!1,reason:`run ${e.id} is bound to runner "${n}" but this host is "${r.runnerId}"`}:o&&o!==r.harnessRoot?{ok:!1,reason:`run ${e.id} harness root "${o}" does not match this host "${r.harnessRoot}"`}:!t||!n||!o?(e.boxKind=r.boxKind,e.runnerId=r.runnerId,e.harnessRoot=r.harnessRoot,Le(e),{ok:!0,stamped:!0}):{ok:!0}}A();yt();function Uy(e=process.env){return je(v(),e,{requireExplicitBoxKind:!0})}function By(e){return[...e.errors,...e.warnings].join("; ")}async function Ns(e){let r=`${e.baseUrl}/api/agent-os/by-id/${encodeURIComponent(e.agentOsId)}/tasks/${encodeURIComponent(e.taskId)}/release`,t;try{t=await te(r,e.secret,{agentOsId:e.agentOsId,leaseOwner:e.leaseOwner,...e.leaseToken?.trim()?{leaseToken:e.leaseToken.trim()}:{},...e.failureDetail?{failureDetail:e.failureDetail}:{}},{agentOsId:e.agentOsId,baseUrl:e.baseUrl})}catch(s){return{released:!1,httpOk:!1,transportError:!0,releaseResponse:{ok:!1,error:s.message}}}let n=t.response;return{released:t.ok===!0||n?.ok===!0,httpOk:t.ok===!0,transportError:!1,releaseResponse:t.response??t}}import{spawnSync as Gy}from"node:child_process";var Wy=new Set(["SUCCESS","SKIPPED","NEUTRAL"]);function lt(e){return typeof e.name=="string"&&e.name||typeof e.context=="string"&&e.context||typeof e.workflowName=="string"&&e.workflowName||"unknown check"}function Fy(e){let r=typeof e.completedAt=="string"&&e.completedAt||typeof e.startedAt=="string"&&e.startedAt;if(!r)return 0;let t=Date.parse(r);return Number.isFinite(t)?t:0}function Hy(e){let r=Array.isArray(e)?e:[],t=new Map;for(let n of r){let o=n&&typeof n=="object"?n:{},s=lt(o),i=t.get(s);(!i||Fy(o)>=Fy(i))&&t.set(s,o)}return[...t.values()]}function SN(e){let r=typeof e.detailsUrl=="string"&&e.detailsUrl||typeof e.details_url=="string"&&e.details_url||typeof e.html_url=="string"&&e.html_url||"",t=typeof e.workflowName=="string"?e.workflowName.trim():"",n=e.app&&typeof e.app=="object"?e.app:null,o=typeof n?.slug=="string"?n.slug:"";return t.length>0||o==="github-actions"||/^https:\/\/github\.com\/[^/]+\/[^/]+\/actions\//i.test(r)}function Ky(e){let r=Hy(e),t=[],n=[],o=[];for(let s of r){if(SN(s)){o.push(lt(s));continue}let i=typeof s.conclusion=="string"?s.conclusion.toUpperCase():"",a=typeof s.status=="string"?s.status.toUpperCase():"",l=typeof s.state=="string"?s.state.toUpperCase():"";if(!(i&&Wy.has(i))){if(i){n.push(`${lt(s)}=${i}`);continue}if(!(l&&Wy.has(l))){if(l&&l!=="PENDING"&&l!=="EXPECTED"){n.push(`${lt(s)}=${l}`);continue}if(l==="PENDING"||l==="EXPECTED"){t.push(`${lt(s)}=${l}`);continue}if(a&&a!=="COMPLETED"){t.push(`${lt(s)}=${a}`);continue}t.push(`${lt(s)}=PENDING`)}}}return{pending:t,failed:n,ignoredActions:o}}function $y(e){return Hy(e).some(t=>{let n=lt(t),o=typeof t.conclusion=="string"?t.conclusion.toUpperCase():"",s=typeof t.state=="string"?t.state.toUpperCase():"";return/^vercel/i.test(n)&&(o==="SUCCESS"||s==="SUCCESS")})}var wN=new Set(["CLEAN","HAS_HOOKS"]);function jy(e,r){let t=e==="UNSTABLE"&&r.ignoredActions.length>0;return!wN.has(e)&&!t?`mergeStateStatus is ${e}`:null}import{spawnSync as CN}from"node:child_process";function Vy(){if(process.env.GITHUB_TOKEN?.trim()||process.env.GH_TOKEN?.trim())return{source:"env",configured:!0,reason:"GitHub token already configured in environment"};let e=CN("gh",["auth","token"],{encoding:"utf8",stdio:["ignore","pipe","pipe"]});if(e.status!==0)return{source:"missing",configured:!1,reason:typeof e.stderr=="string"&&e.stderr.trim()?e.stderr.trim():"gh auth token failed; run `gh auth login` on this machine"};let r=typeof e.stdout=="string"?e.stdout.trim():"";return r?(process.env.GH_TOKEN=r,{source:"gh-cli",configured:!0,reason:"Using local GitHub CLI auth for daemon land_pr merge"}):{source:"missing",configured:!1,reason:"gh auth token returned an empty token; run `gh auth login` on this machine"}}function qu(e){return e?.trim()?["--repo",e.trim()]:[]}function Yy(e){let r=/github\.com\/([^/]+)\/([^/]+)\/pull\/\d+/i.exec(e.trim());return r?`${r[1]}/${r[2]}`:null}function Jy(e,r,t){let n=e.gh(r,t);if(n.status!==0)throw new Error(n.stderr||n.stdout||`gh ${t.join(" ")} failed`);return JSON.parse(n.stdout||"{}")}var _N=/^##\s*(test\s*plan|verification|test\s*evidence|verify)\b/im,xN=/typecheck|npm run (test|build|typecheck)|vitest|tsc\b|verify-pr-local|local verify|local-verify|tests? (pass|green)|build green|node --test/i,EN=/^docs[(:]/i,PN=/docs[- ]only|documentation only|no[- ]code change|no code changes|low[- ]risk|plan tracker only|markdown only/i;function IN(e){let r=typeof e.title=="string"?e.title.trim():"",t=typeof e.body=="string"?e.body.trim():"",n=EN.test(r)||PN.test(t),o=_N.test(t),s=xN.test(t);return n||o||s||e.vercelCheckSuccess===!0}function AN(e){if(!IN({title:e.title,body:e.body,vercelCheckSuccess:$y(e.statusCheckRollup)}))throw new Error(`PR #${e.number} lacks landing verification evidence \u2014 add ## Test plan / ## Verification with local commands, Vercel preview, or docs/no-code rationale`)}function ON(e){if(e.state!=="OPEN")throw new Error(`PR #${e.number} is ${e.state}, not OPEN`);if(e.isDraft)throw new Error(`PR #${e.number} is still a draft`);let r=Ky(e.statusCheckRollup);if(r.failed.length>0)throw new Error(`PR #${e.number} has failing checks: ${r.failed.join(", ")}`);if(r.pending.length>0)throw new Error(`PR #${e.number} has pending checks: ${r.pending.join(", ")}`);let t=jy(e.mergeStateStatus,r);if(t)throw new Error(`PR #${e.number} ${t}`)}function TN(e){ON(e),AN(e)}function NN(e){try{return TN(e),null}catch(r){return r instanceof Error?r.message:String(r)}}function DN(e,r,t,n){if(!n?.trim())return;let o=encodeURI(`heads/${n}`);e.gh(r,["api","-X","DELETE",`repos/${t}/git/refs/${o}`])}function MN(e,r,t){if(t?.trim())return t.trim();let n=e.gh(r,["repo","view","--json","nameWithOwner"]);if(n.status!==0)throw new Error(n.stderr||"Could not resolve GitHub repo");let o=JSON.parse(n.stdout||"{}");if(!o.nameWithOwner)throw new Error("Could not resolve GitHub repo");return o.nameWithOwner}function LN(e,r){if(!r?.trim())return;let t=Gy("git",["worktree","list","--porcelain"],{cwd:e,encoding:"utf8"});if(t.status!==0)return;let n=String(t.stdout||"").split(/\r?\n/),o=null,s=null;for(let i of n){if(i.startsWith("worktree ")){o=i.slice(9).trim(),s=null;continue}i.startsWith("branch ")&&o&&(s=i.slice(7).trim(),s.endsWith(`/${r}`)&&Gy("git",["worktree","remove","--force",o],{cwd:e,encoding:"utf8"}))}}async function qy(e){let r=e.cwd??process.cwd(),t=e.exec??Aa,n=e.prUrl.trim();if(!n)throw new Error("prUrl is required");let o=Vy();if(!o.configured)return{prUrl:n,outcome:"blocked",reason:o.reason};let s=Jy(t,r,["pr","view",n,...qu(e.repo),"--json",["number","url","title","body","state","isDraft","mergeStateStatus","statusCheckRollup","headRefName","mergedAt","mergeCommit"].join(",")]);if(s.state==="MERGED"||s.mergedAt)return{prUrl:s.url||n,outcome:"skipped",mergeCommit:s.mergeCommit?.oid??null,reason:`PR #${s.number} is already merged \u2014 land_pr no-op (redelivery)`};let i=NN(s);if(i)return e.skipNotReady?{prUrl:s.url||n,outcome:"skipped",reason:i}:{prUrl:s.url||n,outcome:"blocked",reason:i};if(e.dryRun)return{prUrl:s.url||n,outcome:"skipped",reason:"dry-run: PR is ready to merge"};let a=String(s.number),l=t.gh(r,["pr","merge",a,...qu(e.repo),"--squash"]);if(l.status!==0){let u=Ju(t,r,a,e.repo);return u?{prUrl:u.url||s.url||n,outcome:"skipped",mergeCommit:u.mergeCommit?.oid??null,reason:`PR #${s.number} is already merged \u2014 merged by another lane during land_pr (race)`}:{prUrl:s.url||n,outcome:"blocked",reason:l.stderr||l.stdout||"gh pr merge failed"}}let c=Ju(t,r,a,e.repo);c||(c=Ju(t,r,a,e.repo));try{let u=MN(t,r,e.repo);DN(t,r,u,s.headRefName),LN(r,s.headRefName)}catch{}return{prUrl:c?.url||s.url||n,outcome:"merged",mergeCommit:c?.mergeCommit?.oid??null,reason:`Daemon land_pr merged PR #${s.number}${c?"":" (post-merge view unavailable \u2014 merge verified by gh exit 0)"}`}}function Ju(e,r,t,n){try{let o=Jy(e,r,["pr","view",t,...qu(n),"--json","number,url,mergedAt,mergeCommit,state"]);return o.state==="MERGED"||o.mergedAt?o:null}catch{return null}}A();async function zy(e){let r=await q(e.secret,e.agentOsId,{baseUrl:e.baseUrl}),t=String(e.task.id),n=`${e.baseUrl}/api/agent-os/by-id/${encodeURIComponent(e.agentOsId)}/harness/completion`,o=new Date().toISOString(),s={source:"kynver-harness",agentOsId:e.agentOsId,runId:e.runId,workerName:`land-pr-${t}`,taskId:t,leaseToken:e.task.leaseToken??null,startedAt:o,finishedAt:o,status:{finalResult:e.report,prUrl:e.report.prUrl,summary:e.report.reason,leaseToken:e.task.leaseToken??null},workerInjection:null},i=await te(n,r,s,{agentOsId:e.agentOsId,baseUrl:e.baseUrl});return{ok:i.ok,status:i.status}}function Xy(){return["## verify_live completion contract","Finish with a JSON finalResult object:","{",' "prUrl": "<landed pr>",',' "outcome": "passed" | "failed" | "skipped" | "no_mcp_surface",',' "reason": "<human summary>",',' "mergeCommit": "<sha optional>",',' "liveReadback": "<prod readback string from acceptance.liveReadbackQuery>",',' "mcpCalls": [{ "tool": "<name>", "ok": true, "summary": "..." }]',"}","","Drive the feature MCP tools against live production. Do not mark passed without exercising the MCP surface.","When the subject carries an acceptance snapshot, include liveReadback \u2014 the server oracle rejects passed if the original symptom still appears."].join(`
@@ -108,7 +108,7 @@ ${n}`,s=AO(e.personaSlug);return!!(r.startsWith(EO)||r===PO||r.startsWith("daemo
108
108
  `)),this.name="MemoryCostPackageVersionGuardError",this.result=r}};function Jv(e={}){let r=Yv(e);if(!r.ok)throw new Cd(r);return r}var oL=["@kynver-app/runtime","@kynver-app/openclaw-agent-os","@kynver-app/mcp-agent-os"];function to(e){let r=e?.trim();return r||null}function sL(e){return[...new Set(e.filter(r=>!!r))]}function iL(){let e=nL(),r=to(process.env.KYNVER_OPENCLAW_NPM_ROOT)??to(process.env.OPENCLAW_NPM_ROOT)??Gt.join(e,".openclaw","npm"),t=to(process.env.KYNVER_NPM_GLOBAL_ROOT)??to(process.env.KYNVER_NPM_GLOBAL_MODULES_ROOT)??(to(process.env.NPM_CONFIG_PREFIX)?Gt.join(to(process.env.NPM_CONFIG_PREFIX),"lib","node_modules"):Gt.join(e,".npm-global","lib","node_modules"));return sL([Gt.join(r,"lib","node_modules"),Gt.join(r,"node_modules"),t.endsWith("node_modules")?t:Gt.join(t,"lib","node_modules")])}async function aL(e){try{let r=JSON.parse(await tL(e,"utf8"));return typeof r.version=="string"&&r.version.trim()?r.version.trim():null}catch{return null}}function lL(e){let r=iL(),t=new Set,n=[];for(let o of r){let s=Gt.join(o,e,"package.json");t.has(s)||(t.add(s),n.push(s))}return n}async function kl(e=new Date().toISOString()){let r={};for(let t of oL){let n=null;for(let o of lL(t)){let s=await aL(o);s&&(!n||hl(s,n.version)>0)&&(n={version:s,path:o})}n&&(r[t]={version:n.version,observedAt:e,path:n.path})}return r}import{spawnSync as cL}from"node:child_process";var uL=1e4,dL=4*1024*1024,qv=(e,r,t)=>{try{let n=cL(e,r,{encoding:"utf8",stdio:["ignore","pipe","pipe"],timeout:t?.timeoutMs??uL,maxBuffer:dL});return{ok:n.status===0,stdout:typeof n.stdout=="string"?n.stdout:"",stderr:typeof n.stderr=="string"?n.stderr:""}}catch(n){return{ok:!1,stdout:"",stderr:n instanceof Error?n.message:String(n)}}};function yl(e,r,t){return`${e} ${r} ${t}`}function _d(e){let r=e.lastIndexOf("@");if(r<=0||r===e.length-1)return null;let t=e.slice(0,r),n=e.slice(r+1);return!/^[^/\s]+\/[^/\s]+$/.test(t)||!/^[0-9a-f]{7,40}$/i.test(n)?null:{repo:t,sha:n}}function zv(e){let r=e.trim().match(/[/:]([^/]+\/[^/]+)\/(?:pull|pulls|merge_requests|pull-requests)\/(\d+)/i);if(!r)return null;let t=Number(r[2]);return!Number.isFinite(t)||t<=0?null:{repo:r[1],number:t}}var pL=8e3,mL=30,fL=100,gL=400,hL=3600*1e3,xd=0;function Pd(){return Date.now()<xd}function kL(e){let r=`${e.stdout}
109
109
  ${e.stderr}`.toLowerCase();return r.includes("api rate limit exceeded")||r.includes("rate limit exceeded")||r.includes("secondary rate limit")}function Xv(e){kL(e)&&(xd=Math.max(xd,Date.now()+hL))}function Ed(e,r){if(Pd())return null;let t=e("gh",["api",...r]);if(!t.ok||!t.stdout.trim())return Xv(t),null;try{return JSON.parse(t.stdout)}catch{return null}}function yL(e,r,t,n){if(Pd())return null;let o=e("gh",["pr","view",String(t),"--repo",r,"--json",n.join(",")]);if(!o.ok||!o.stdout.trim())return Xv(o),null;try{return JSON.parse(o.stdout)}catch{return null}}function Id(e){return Pd()?!1:process.env.GITHUB_TOKEN?.trim()||process.env.GH_TOKEN?.trim()?!0:e("gh",["auth","token"]).ok}function no(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:null}function RL(e){return Array.isArray(e)?e.map(r=>no(r)).filter(r=>r!==null).slice(0,mL).map(r=>({context:r.context??null,state:r.state??null,target_url:r.target_url??null,description:r.description??null})):[]}function vL(e,r,t){let n=Ed(e,[`repos/${r}/commits/${t}/status`]);return n?{state:n.state??null,statuses:RL(n.statuses)}:null}var Qv={provider:"github",kind:"pr_snapshot",version:"2",isAvailable:Id,collect(e,r){let t=zv(e);if(!t)return null;let n=yL(r,t.repo,t.number,["url","title","body","author","state","isDraft","mergedAt","mergeCommit","mergeable","headRefName","headRefOid","headRepositoryOwner","statusCheckRollup","files"]);if(!n)return null;let o=no(n.author),s=no(n.mergeCommit),i=no(n.headRepositoryOwner),a=typeof n.body=="string"?n.body.slice(0,pL):null,l=Array.isArray(n.statusCheckRollup)?n.statusCheckRollup.map(u=>no(u)).filter(u=>u!==null).slice(0,fL).map(u=>({name:u.name??u.context??null,status:u.status??u.state??null,conclusion:u.conclusion??null,workflowName:u.workflowName??null,detailsUrl:u.detailsUrl??null})):[],c=Array.isArray(n.files)?n.files.map(u=>no(u)).map(u=>typeof u?.path=="string"?u.path.trim():"").filter(Boolean).slice(0,gL):[];return{pull:{html_url:n.url??null,title:n.title??null,body:a,user:{login:o?.login??null},state:typeof n.state=="string"?n.state.toLowerCase():null,draft:n.isDraft??null,merged:!!n.mergedAt,merged_at:n.mergedAt??null,merge_commit_sha:s?.oid??null,mergeable:null,mergeable_state:n.mergeable??null,head:{sha:n.headRefOid??null,ref:n.headRefName??null,repo:{owner:{login:i?.login??null}}}},checkRuns:l,combinedStatus:{state:null,statuses:[]},changedFiles:c}}},Zv={provider:"github",kind:"commit_status",version:"1",isAvailable:Id,collect(e,r){let t=_d(e);return t?vL(r,t.repo,t.sha):null}},eb={provider:"github",kind:"branch_reachability",version:"1",isAvailable:Id,collect(e,r){let t=_d(e);if(!t)return null;let n=Ed(r,[`repos/${t.repo}`]),o=typeof n?.default_branch=="string"&&n.default_branch.trim()?n.default_branch.trim():null;if(!o)return null;let s=Ed(r,[`repos/${t.repo}/compare/${encodeURIComponent(o)}...${t.sha}`]);if(!s)return null;let i=typeof s.status=="string"?s.status:null;return{defaultBranch:o,compareStatus:i,reachable:i==="identical"||i==="behind"}}};var Od=[];function Ad(e){Od.some(r=>r.provider===e.provider&&r.kind===e.kind)||Od.push(e)}function rb(e,r){return Od.find(t=>t.provider===e&&t.kind===r)??null}function tb(){Ad(Qv),Ad(Zv),Ad(eb)}var bL=1,SL=25e3;function nb(e,r={}){tb();let t=r.run??qv,n=r.now??(()=>new Date),o=r.maxSubjects??bL,s=Date.now()+(r.deadlineMs??SL),i=new Set,a=e.filter(f=>{let p=yl(f.provider,f.kind,f.subject);return i.has(p)?!1:(i.add(p),!0)}),l=a.length>0?Math.floor(n().getTime()/6e4)%a.length:0,u=a.map((f,p)=>a[(l+p)%a.length]).slice(0,o),d={attempted:0,collected:0,cached:0,items:[],skipped:[]},m=new Map;for(let f of u){let p=yl(f.provider,f.kind,f.subject),g=n(),y=r.cache?.get(p,g)??null;if(y){d.cached+=1,d.collected+=1,d.items.push(y);continue}if(Date.now()>s){d.skipped.push({...f,reason:"budget_exhausted"});continue}let k=rb(f.provider,f.kind);if(!k){d.skipped.push({...f,reason:"no_recipe"});continue}let h=`${k.provider} ${k.kind}`,R=m.get(h);if(R===void 0&&(R=k.isAvailable(t),m.set(h,R)),!R){d.skipped.push({...f,reason:"provider_unavailable"});continue}if(r.cache?.reserve?.(f,p,n())===!1){d.skipped.push({...f,reason:"budget_exhausted"});continue}d.attempted+=1;let C=k.collect(f.subject,t);if(C==null){d.skipped.push({...f,reason:"collect_failed"});continue}d.collected+=1;let I={provider:f.provider,kind:f.kind,subject:f.subject,payload:C,observedAt:n().toISOString(),collectorVersion:k.version};d.items.push(I),r.cache?.set(p,I,n())}return d}M();E();import EL from"node:path";M();E();import ob from"node:path";var wL="provider-evidence-wanted.json",CL="provider-evidence-cache.json",_L=600*1e3;function sb(e){return ob.join(T(e),wL)}function xL(e){return ob.join(T(e),CL)}function ib(e){if(!Array.isArray(e))return[];let r=[];for(let t of e){if(!t||typeof t!="object"||Array.isArray(t))continue;let n=t,o=typeof n.provider=="string"?n.provider.trim():"",s=typeof n.kind=="string"?n.kind.trim():"",i=typeof n.subject=="string"?n.subject.trim():"";!o||!s||!i||r.push({provider:o,kind:s,subject:i})}return r}function ab(e){let r=P(sb(e),null);return ib(r?.wanted)}function lb(e,r){ue(sb(e),{savedAt:new Date().toISOString(),wanted:r})}function cb(e,r={}){let t=r.ttlMs??_L,n=xL(e),s={...P(n,null)?.items??{}},i=!1;return{get(l,c){let u=s[l];if(!u)return null;let d=Date.parse(u.observedAt);return!Number.isFinite(d)||c.getTime()-d>t?(delete s[l],i=!0,null):u},set(l,c){s[l]=c,i=!0},flush(){i&&(ue(n,{savedAt:new Date().toISOString(),items:s}),i=!1)}}}function ub(e){if(!e||typeof e!="object"||Array.isArray(e))return null;let r=e.providerEvidenceWanted;return Array.isArray(r)?ib(r):null}var PL="provider-evidence-shared-cache.json",IL=6e4,AL=1,OL=1;function Td(e,r){let t=process.env[e];if(!t)return r;let n=Number.parseInt(t,10);return Number.isFinite(n)&&n>=0?n:r}function TL(){return EL.join(re().harnessRoot,PL)}function NL(e){let r=e.toUpperCase().replace(/[^A-Z0-9]+/g,"_"),t=e==="github"?AL:OL;return Td(`KYNVER_PROVIDER_EVIDENCE_${r}_PER_MINUTE`,Td("KYNVER_PROVIDER_EVIDENCE_LIVE_COLLECTS_PER_MINUTE",t))}function db(){return Td("KYNVER_PROVIDER_EVIDENCE_SHARED_CACHE_TTL_MS",IL)}function DL(e){return Math.floor(e.getTime()/6e4)*6e4}function ML(e){return`${e.provider}:${e.kind}`}function pb(e,r={}){let t=cb(e,{ttlMs:r.ttlMs??db()}),n=r.file??TL(),o=P(n,null),s={...o?.items??{}},i={...o?.budget??{}},a=r.ttlMs??db(),l=!1;return{get(u,d){let m=t.get(u,d);if(m)return m;let f=s[u];if(!f)return null;let p=Date.parse(f.observedAt);return!Number.isFinite(p)||d.getTime()-p>a?(delete s[u],l=!0,null):(t.set(u,f,d),f)},set(u,d,m){t.set(u,d,m),s[u]=d,l=!0},reserve(u,d,m){let f=NL(u.provider);if(f===0)return!0;let p=ML(u),g=DL(m),y=i[p];return!y||y.windowStartMs!==g?(i[p]={windowStartMs:g,used:1},l=!0,!0):y.used>=f?!1:(y.used+=1,l=!0,!0)},flush(){t.flush(),l&&(ue(n,{savedAt:new Date().toISOString(),items:s,budget:i}),l=!1)}}}function mb(e){let r=qi(),t=Ge(e?.env??process.env),n=(e?.now??(()=>new Date))().getTime(),o={};if(t.flags.dispatchReceipts!=="off"){Object.assign(o,Ik());let s=Pk({nowMs:n,hasLiveWorker:e?.hasLiveWorker});o["dispatchReceipts.strandedClaimCandidates"]=s.strandedClaimCandidates,t.flags.dispatchReceipts==="enforce"&&Object.assign(o,SR())}return t.flags.planOutbox!=="off"&&Object.assign(o,Cy()),t.flags.admission!=="off"&&(Object.assign(o,Nk()),t.flags.admission==="enforce"&&Object.assign(o,Uk())),(t.flags.keeper!=="off"||t.flags.meshLease!=="off"||t.flags.quota!=="off")&&Object.assign(o,$f()),{contractVersion:1,observedAt:new Date(n).toISOString(),state:r.state,schemaVersion:r.schemaVersion,recovered:r.recovered,unavailableClass:r.reason?r.reason.split(":")[0]??null:null,flags:t.flags,flagSources:t.sources,flagWarningCount:t.warnings.length,divergenceCounters:o}}function LL(){let e=process.env.KYNVER_PIPELINE_SWEEP_ENABLED;return e?e==="1"||e.toLowerCase()==="true":!1}async function UL(e,r){let t=H(e),n=[],o=Math.max(0,Number.parseInt(process.env.KYNVER_PIPELINE_COMPLETION_REPLAY_MAX_DEEP_CHECKS_PER_TICK??"0",10)||0),s=0;for(let i of Object.keys(t.workers||{})){let a=P(fb.join(T(t.id),"workers",_(i),"worker.json"),void 0);if(!a?.taskId||a.localOnly||qr(a))continue;if(Lt(a)){n.push({worker:i,ok:!0,taskId:a.taskId??null,skipped:!0});continue}if(s>=o)break;s++;let l=B(a);if(!ke(l))continue;let c=fn({alive:l.alive,finalResult:l.finalResult,changedFiles:l.changedFiles,gitAncestry:l.gitAncestry});if(!a.dispatched&&!l.finalResult&&!c?.salvageable)continue;let u=await _s({run:e,name:i,agentOsId:String(r.agentOsId||a.agentOsId||""),...r});n.push({worker:i,ok:u.ok,taskId:a.taskId??null})}return n}async function BL(e,r,t,n,o){let s=L(n.baseUrl?String(n.baseUrl):void 0),i=await q(n.secret?String(n.secret):void 0,e,{baseUrl:s}),a=`${s}/api/agent-os/by-id/${encodeURIComponent(e)}/operator/tick`,l=await kl(),c=ia(r),u=null;try{let h=ab(r);if(h.length>0){let R=pb(r);u=nb(h,{cache:R}),R.flush?.()}else u=null}catch{u=null}try{if(Ur()!=="off"){let h=Km();Tk({liveWorkers:h}),Lk({liveWorkers:h})}else Ak()}catch{}let d=({runId:h,workerName:R})=>{try{let{runsDir:C}=re(),I=fb.join(Yr(C,_(h)),"workers",_(R),"worker.json"),w=P(I,null);return w?qr(w):!1}catch{return!1}};await CR({agentOsId:e,baseUrl:s,secret:i,hasLiveWorker:d});let m=null;try{m=mb({hasLiveWorker:d})}catch{m=null}let f=sa(r),p=await te(a,i,{agentOsId:e,runId:r,ingestHarness:!0,harnessBoardSnapshot:Es(r),resourceGate:t,boxResourceSnapshot:Qa(t,{harnessRunId:r,boxKind:Be(v())}),packageVersions:l,...o?{harnessCleanup:o}:{},runnerPresence:qe({runId:r}),activeHarnessWorkers:c,...f?.leaseToken?{meshCronLeaseToken:f.leaseToken}:{},...m?{localRunStore:m}:{},...u&&u.items.length>0?{providerEvidence:u.items}:{}},{agentOsId:e,baseUrl:s}),g=ub(p.response);if(g)try{lb(r,g)}catch{}let y=Ag(p);if(y)try{Ig(r,y)}catch{}let k=Of(p);return k&&Tf(e,k),{ok:p.ok,httpStatus:p.status,response:p.response,...u?{providerEvidence:{attempted:u.attempted,collected:u.collected,skipped:u.skipped.length}}:{}}}async function Nd(e){let r=String(K(String(e.run||""),"--run")),t=String(K(String(e.agentOsId||""),"--agent-os-id")),n=e.execute!==!1&&e.execute!=="false";Es(r);let o=await la(t,e),s=aa(o),i=Er({runId:r,configuredMaxWorkersOverride:s}),a=Fv()?Wv(r):void 0,l=await BL(t,r,i,e,a),c=pk(r,l),u=await ba(r,e),d=await UL(r,e),m=Er({runId:r,configuredMaxWorkersOverride:s}),f=Us(),p=await xR(r,e),g=iR(m,l),y=g.maxStarts,k=LL()?await Bs({run:r,agentOsId:t,pipeline:!0,...e}):{ok:!0,skipped:!0,reason:"pipeline_sweep_disabled"},h=null,R=0,C=sR(l),I=y;if(n&&I>0&&C.length>0){let x=Math.min(I,C.length),J=await zu({...e,run:r,agentOsId:t,targetTaskIds:C.join(",")},x),V=Qn(J);R+=V,I=Math.max(0,I-V),h={exactTargetTaskIds:C,exact:J,startedCount:R}}if(n&&I>0){let x=await zu({...e,run:r,agentOsId:t},I),J=Qn(x);R+=J,h=h&&typeof h=="object"?{...h,broad:x,startedCount:R}:x}else!n||y<=0?h||(h={ok:!0,skipped:!0,reason:n?m.reason??"no slots or queued work":"execute disabled",maxStarts:0,dispatchAdvice:g,...C.length?{exactTargetTaskIds:C,exactOnly:!0}:{}}):h&&typeof h=="object"&&(h={...h,broadSkipped:!0,startedCount:R});let w=!g.underutilized&&y===0&&d.length===0&&R===0;return{runId:r,agentOsId:t,execute:n,resourceGate:i,dispatchResourceGate:m,leaseRenewal:u,completedWorkers:d,staleReconcile:f,harnessCleanup:a,planProgressSync:p,completionAckSync:c,operatorTick:l,sweep:k,dispatchAdvice:g,dispatch:h,idle:w}}A();we();_n();import NU from"node:os";import{readFileSync as WL}from"node:fs";import{homedir as FL,platform as HL}from"node:os";import KL from"node:path";import{execFileSync as $L}from"node:child_process";function gb(e,r=Date.now()){try{let t=JSON.parse(e),n=t.claudeAiOauth?.accessToken,o=t.claudeAiOauth?.expiresAt;return typeof n!="string"||!n||typeof o=="number"&&o-r<6e4?null:n}catch{return null}}function jL(){if(HL()==="darwin")try{let e=$L("security",["find-generic-password","-s","Claude Code-credentials","-w"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]});return gb(e.trim())}catch{return null}try{let e=WL(KL.join(FL(),".claude",".credentials.json"),"utf8");return gb(e)}catch{return null}}function hb(e=process.env,r={}){let t=e.ANTHROPIC_API_KEY?.trim();if(t)return{kind:"api_key",key:t};let n=e.KYNVER_CHAT_USE_CLAUDE_OAUTH;if(r.oauthOptIn===!0||n==="1"||n==="true"||n==="yes"){let s=jL();if(s)return{kind:"oauth",token:s}}return null}var VL="You are Claude Code, Anthropic's official CLI for Claude.";function GL(){return{blocks:[],stopReason:null,inputTokens:0,outputTokens:0}}function YL(e,r){let t=r;switch(t.type){case"message_start":return e.inputTokens=t.message?.usage?.input_tokens??0,"";case"content_block_start":{let n=t.index??e.blocks.length;return e.blocks[n]={type:t.content_block?.type==="tool_use"?"tool_use":"text",text:"",id:t.content_block?.id,name:t.content_block?.name,inputJson:""},""}case"content_block_delta":{let n=e.blocks[t.index??e.blocks.length-1];return n?t.delta?.type==="text_delta"&&t.delta.text?(n.text+=t.delta.text,t.delta.text):(t.delta?.type==="input_json_delta"&&t.delta.partial_json&&(n.inputJson+=t.delta.partial_json),""):""}case"message_delta":return t.delta?.stop_reason&&(e.stopReason=t.delta.stop_reason),typeof t.usage?.output_tokens=="number"&&(e.outputTokens=t.usage.output_tokens),"";default:return""}}function JL(e){let r=[];for(let t of e.blocks)if(t)if(t.type==="tool_use"){let n={};try{n=t.inputJson?JSON.parse(t.inputJson):{}}catch{n={}}r.push({type:"tool_use",id:t.id??"",name:t.name??"",input:n})}else t.text&&r.push({type:"text",text:t.text});return{content:r,stop_reason:e.stopReason??"end_turn",usage:{input_tokens:e.inputTokens,output_tokens:e.outputTokens}}}async function*qL(e){let r=e.getReader(),t=new TextDecoder,n="";try{for(;;){let{done:o,value:s}=await r.read();if(o)break;n+=t.decode(s,{stream:!0});let i;for(;(i=n.indexOf(`
110
110
  `))!==-1;){let a=n.slice(0,i).trim();if(n=n.slice(i+1),!a.startsWith("data:"))continue;let l=a.slice(5).trim();if(!(!l||l==="[DONE]"))try{yield JSON.parse(l)}catch{}}}}finally{r.releaseLock()}}function zL(e=process.env){return(e.ANTHROPIC_BASE_URL?.trim()||"https://api.anthropic.com").replace(/\/$/,"")}async function kb(e){let{creds:r,model:t,payload:n}=e,o={"Content-Type":"application/json","anthropic-version":"2023-06-01"},s=n.system;r.kind==="api_key"?o["x-api-key"]=r.key:(o.Authorization=`Bearer ${r.token}`,o["anthropic-beta"]="oauth-2025-04-20",s=[{type:"text",text:VL},{type:"text",text:n.system}]);let i=await fetch(`${zL()}/v1/messages`,{method:"POST",headers:o,signal:e.signal,body:JSON.stringify({model:t,max_tokens:n.maxTokens,system:s,messages:n.messages,...Array.isArray(n.tools)&&n.tools.length>0?{tools:n.tools}:{},...n.temperature!==void 0?{temperature:n.temperature}:{},stream:!0})});if(!i.ok||!i.body){let l=await i.text().catch(()=>"");throw new Error(`Anthropic stream failed: HTTP ${i.status}${l?` \u2014 ${l.slice(0,300)}`:""}`)}let a=GL();for await(let l of qL(i.body)){let c=YL(a,l);c&&e.onDelta(c)}return JL(a)}var oo=class{constructor(r,t=150){this.flushFn=r;this.floorMs=t}flushFn;floorMs;buffer="";timer=null;closed=!1;push(r){this.closed||!r||(this.buffer+=r,this.timer||(this.timer=setTimeout(()=>{this.timer=null,this.flushNow()},this.floorMs)))}flushNow(){if(!this.buffer)return;let r=this.buffer;this.buffer="",this.flushFn(r)}close(){this.closed||(this.closed=!0,this.timer&&(clearTimeout(this.timer),this.timer=null),this.flushNow())}};import{spawn as uU}from"node:child_process";var XL=new Set(["run list","run status","worker list","worker status","worker tail","status","cron status","monitor status","monitor list"]),QL=new Set(["run create","run dispatch","run sweep","worker start","worker stop","worker complete","cleanup"]),ZL=["--secret","--api-key","--keeper-child"];function yb(e){if(!Array.isArray(e)||e.length===0||e.some(n=>typeof n!="string"))return{ok:!1,mutating:!1,reason:"argv must be a non-empty string array"};for(let n of e){if(ZL.some(o=>n===o||n.startsWith(`${o}=`)))return{ok:!1,mutating:!1,reason:`forbidden flag: ${n}`};if(n.includes(`
111
- `)||n.includes("\0"))return{ok:!1,mutating:!1,reason:"control characters refused"}}let r=e[0],t=e.length>1&&!e[1].startsWith("--")?`${r} ${e[1]}`:r;return t==="doctor runtime-takeover"?e.includes("--remediate-default-repo")?{ok:!0,mutating:!0}:{ok:!0,mutating:!1}:r==="cleanup"?{ok:!0,mutating:e.includes("--execute")}:XL.has(t)?{ok:!0,mutating:!1}:QL.has(t)?{ok:!0,mutating:!0}:{ok:!1,mutating:!1,reason:`verb not allowlisted: ${t}`}}import{createHash as eU,createPrivateKey as R9,createPublicKey as rU,randomBytes as v9,sign as b9,verify as tU}from"node:crypto";var nU=Buffer.from("302a300506032b6570032100","hex"),w9=Buffer.from("302e020100300506032b657004220420","hex");var Rb="ca-6297fb8e1773",oU={[Rb]:"16ae5cb2a61f8c94cf1b86e8258f9c2f2ff6aba5e6136250a422209b6e866881","ca-456fd128f3b3":"f29cbd559410c2578d7f9732ccd86570073355ccdb36af0d1b7dff15908466e7"};function sU(e){return`ca-${eU("sha256").update(Buffer.from(e)).digest("hex").slice(0,12)}`}function iU(e,r=process.env){let t=An(r.KYNVER_COMMAND_AUTH_PUBLIC_KEY);if(t)return sU(t)!==e?null:t;let n=oU[e];return!n||e===Rb&&!ra(r)?null:An(n)}function aU(e){return rU({key:Buffer.concat([nU,Buffer.from(e)]),format:"der",type:"spki"})}function lU(e,r){return!Array.isArray(e)||e.length!==r.length?!1:e.every((t,n)=>typeof t=="string"&&t===r[n])}function cU(e){if(!e||typeof e!="object")return!1;let r=e;if(typeof r.signature!="string"||!r.signature||typeof r.publicKeyId!="string"||!r.publicKeyId)return!1;let t=r.payload;return!(!t||typeof t!="object"||t.v!==1||typeof t.agentOsId!="string"||!t.agentOsId||!Array.isArray(t.argv)||t.argv.some(n=>typeof n!="string")||typeof t.userId!="string"||!t.userId||typeof t.exp!="number"||!Number.isFinite(t.exp)||typeof t.nonce!="string"||!t.nonce)}function vb(e,r,t=process.env,n=Math.floor(Date.now()/1e3)){if(!cU(e))return{ok:!1,reason:"malformed command authorization proof"};if(e.payload.agentOsId!==r.agentOsId)return{ok:!1,reason:"agentOsId mismatch"};if(!lU(e.payload.argv,r.argv))return{ok:!1,reason:"argv mismatch"};if(e.payload.exp<=n)return{ok:!1,reason:"proof expired"};let o=iU(e.publicKeyId,t);if(!o)return{ok:!1,reason:`no verification key for publicKeyId "${e.publicKeyId}"`};let s;try{s=Buffer.from(e.signature,"base64url")}catch{return{ok:!1,reason:"signature is not base64url"}}if(s.length!==64)return{ok:!1,reason:"signature is not a 64-byte Ed25519 signature"};try{let i=Buffer.from(ea(e.payload),"utf8");return tU(null,i,aU(o),s)?{ok:!0,payload:e.payload}:{ok:!1,reason:"Ed25519 signature mismatch"}}catch(i){return{ok:!1,reason:`signature verification failed: ${i.message}`}}}var dU=10*6e4,pU=5e3,bb=2e5;function mU(e,r,t,n=process.env){let o=vb(t,{agentOsId:e,argv:r},n);return o.ok?null:`command authorization proof invalid: ${o.reason}`}async function Sb(e,r,t={}){if(t.agentOsId){let a=mU(t.agentOsId,e,t.authProof,t.env??process.env);if(a)return{exitCode:null,timedOut:!1,refused:a}}else return{exitCode:null,timedOut:!1,refused:"command authorization proof required (missing agentOsId)"};let n=yb(e);if(!n.ok)return{exitCode:null,timedOut:!1,refused:n.reason};let o=t.cliEntry??process.argv[1],s=t.timeoutMs??dU,i=new oo(r);return new Promise(a=>{let l=0,c=!1,u=uU(process.execPath,[o,...e],{stdio:["ignore","pipe","pipe"],env:process.env}),d=f=>{if(l>=bb)return;let p=f.toString("utf8").slice(0,bb-l);l+=p.length,i.push(p)};u.stdout?.on("data",d),u.stderr?.on("data",d);let m=setTimeout(()=>{c=!0,u.kill("SIGTERM"),setTimeout(()=>u.kill("SIGKILL"),pU).unref()},s);u.on("error",f=>{clearTimeout(m),i.push(`spawn failed: ${f.message}`),i.close(),a({exitCode:null,timedOut:!1,refused:void 0})}),u.on("close",f=>{clearTimeout(m),i.close(),a({exitCode:f,timedOut:c})})})}var $s="composer-2.5",fU=new Set(["claude","anthropic","opus"]);function Rl(e){let r=e.chatProvider?.trim();return wb(r||e.workerProvider?.trim()||"cursor")}function wb(e){let r=as(e);return r==="cursor"?"cursor":(fU.has(r),"anthropic")}var gU=/^(?:claude[-_]|opus\b|sonnet\b|haiku\b)/i;function Cb(e,r,t=process.env){let n=t.KYNVER_CHAT_MODEL?.trim();if(n){if(e==="cursor"){let s=Wn(n,$s);return s.ok?s.model:$s}return n}let o=r.defaultModel?.trim();if(e==="cursor"){if(o&&!gU.test(o)){let s=Wn(o,$s);return s.ok?s.model:$s}return $s}return o||"claude-sonnet-4-6"}import{existsSync as _b}from"node:fs";import{homedir as hU}from"node:os";import vl from"node:path";import{spawnSync as kU}from"node:child_process";var bl="cursor_cli_unavailable",Dd="cursor_not_logged_in";function yU(e){if(vl.isAbsolute(e)||e.includes("/")||e.includes("\\"))return _b(e);try{let r=kU(process.platform==="win32"?"where":"which",[e],{encoding:"utf8",timeout:3e3});return r.status===0&&!!r.stdout?.trim()}catch{return!1}}function Md(e=process.env){let r=hU(),t=[vl.join(r,".config","cursor","auth.json")];if(process.platform==="win32"){let n=e.LOCALAPPDATA?.trim(),o=e.APPDATA?.trim();n&&t.push(vl.join(n,"cursor-agent","auth.json")),o&&t.push(vl.join(o,"cursor","auth.json"))}return t}function xb(e){return`${e.error}: ${e.detail}`}function Eb(e=process.env){let r=fs(e);return yU(r)?e.CURSOR_API_KEY?.trim()?{ok:!0,creds:{agentBin:r,authSource:"api_key_env"}}:Md(e).find(n=>_b(n))?{ok:!0,creds:{agentBin:r,authSource:"oauth_local"}}:{ok:!1,error:Dd,detail:"Run `agent login` on this computer, or set CURSOR_API_KEY. Website chat will not fall back to hosted models."}:{ok:!1,error:bl,detail:"`agent` CLI not found. Install the Cursor Agent CLI (https://cursor.com/docs/cli/headless) and keep it on PATH."}}import{spawn as _U}from"node:child_process";E();function RU(e){if(typeof e=="string")return e;if(!Array.isArray(e))return"";let r=[];for(let t of e){if(!t||typeof t!="object")continue;let n=t;n.type==="text"&&typeof n.text=="string"&&n.text.trim()||n.type==="tool_result"&&typeof n.text=="string"&&n.text.trim()?r.push(n.text):n.type==="tool_use"&&typeof n.name=="string"&&r.push(`[tool call: ${n.name}]`)}return r.join(`
111
+ `)||n.includes("\0"))return{ok:!1,mutating:!1,reason:"control characters refused"}}let r=e[0],t=e.length>1&&!e[1].startsWith("--")?`${r} ${e[1]}`:r;return t==="doctor runtime-takeover"?e.includes("--remediate-default-repo")?{ok:!0,mutating:!0}:{ok:!0,mutating:!1}:r==="cleanup"?{ok:!0,mutating:e.includes("--execute")}:XL.has(t)?{ok:!0,mutating:!1}:QL.has(t)?{ok:!0,mutating:!0}:{ok:!1,mutating:!1,reason:`verb not allowlisted: ${t}`}}import{createHash as eU,createPrivateKey as b9,createPublicKey as rU,randomBytes as S9,sign as w9,verify as tU}from"node:crypto";var nU=Buffer.from("302a300506032b6570032100","hex"),_9=Buffer.from("302e020100300506032b657004220420","hex");var Rb="ca-6297fb8e1773",oU={[Rb]:"16ae5cb2a61f8c94cf1b86e8258f9c2f2ff6aba5e6136250a422209b6e866881","ca-456fd128f3b3":"f29cbd559410c2578d7f9732ccd86570073355ccdb36af0d1b7dff15908466e7"};function sU(e){return`ca-${eU("sha256").update(Buffer.from(e)).digest("hex").slice(0,12)}`}function iU(e,r=process.env){let t=An(r.KYNVER_COMMAND_AUTH_PUBLIC_KEY);if(t)return sU(t)!==e?null:t;let n=oU[e];return!n||e===Rb&&!ra(r)?null:An(n)}function aU(e){return rU({key:Buffer.concat([nU,Buffer.from(e)]),format:"der",type:"spki"})}function lU(e,r){return!Array.isArray(e)||e.length!==r.length?!1:e.every((t,n)=>typeof t=="string"&&t===r[n])}function cU(e){if(!e||typeof e!="object")return!1;let r=e;if(typeof r.signature!="string"||!r.signature||typeof r.publicKeyId!="string"||!r.publicKeyId)return!1;let t=r.payload;return!(!t||typeof t!="object"||t.v!==1||typeof t.agentOsId!="string"||!t.agentOsId||!Array.isArray(t.argv)||t.argv.some(n=>typeof n!="string")||typeof t.userId!="string"||!t.userId||typeof t.exp!="number"||!Number.isFinite(t.exp)||typeof t.nonce!="string"||!t.nonce)}function vb(e,r,t=process.env,n=Math.floor(Date.now()/1e3)){if(!cU(e))return{ok:!1,reason:"malformed command authorization proof"};if(e.payload.agentOsId!==r.agentOsId)return{ok:!1,reason:"agentOsId mismatch"};if(!lU(e.payload.argv,r.argv))return{ok:!1,reason:"argv mismatch"};if(e.payload.exp<=n)return{ok:!1,reason:"proof expired"};let o=iU(e.publicKeyId,t);if(!o)return{ok:!1,reason:`no verification key for publicKeyId "${e.publicKeyId}"`};let s;try{s=Buffer.from(e.signature,"base64url")}catch{return{ok:!1,reason:"signature is not base64url"}}if(s.length!==64)return{ok:!1,reason:"signature is not a 64-byte Ed25519 signature"};try{let i=Buffer.from(ea(e.payload),"utf8");return tU(null,i,aU(o),s)?{ok:!0,payload:e.payload}:{ok:!1,reason:"Ed25519 signature mismatch"}}catch(i){return{ok:!1,reason:`signature verification failed: ${i.message}`}}}var dU=10*6e4,pU=5e3,bb=2e5;function mU(e,r,t,n=process.env){let o=vb(t,{agentOsId:e,argv:r},n);return o.ok?null:`command authorization proof invalid: ${o.reason}`}async function Sb(e,r,t={}){if(t.agentOsId){let a=mU(t.agentOsId,e,t.authProof,t.env??process.env);if(a)return{exitCode:null,timedOut:!1,refused:a}}else return{exitCode:null,timedOut:!1,refused:"command authorization proof required (missing agentOsId)"};let n=yb(e);if(!n.ok)return{exitCode:null,timedOut:!1,refused:n.reason};let o=t.cliEntry??process.argv[1],s=t.timeoutMs??dU,i=new oo(r);return new Promise(a=>{let l=0,c=!1,u=uU(process.execPath,[o,...e],{stdio:["ignore","pipe","pipe"],env:process.env}),d=f=>{if(l>=bb)return;let p=f.toString("utf8").slice(0,bb-l);l+=p.length,i.push(p)};u.stdout?.on("data",d),u.stderr?.on("data",d);let m=setTimeout(()=>{c=!0,u.kill("SIGTERM"),setTimeout(()=>u.kill("SIGKILL"),pU).unref()},s);u.on("error",f=>{clearTimeout(m),i.push(`spawn failed: ${f.message}`),i.close(),a({exitCode:null,timedOut:!1,refused:void 0})}),u.on("close",f=>{clearTimeout(m),i.close(),a({exitCode:f,timedOut:c})})})}var $s="composer-2.5",fU=new Set(["claude","anthropic","opus"]);function Rl(e){let r=e.chatProvider?.trim();return wb(r||e.workerProvider?.trim()||"cursor")}function wb(e){let r=as(e);return r==="cursor"?"cursor":(fU.has(r),"anthropic")}var gU=/^(?:claude[-_]|opus\b|sonnet\b|haiku\b)/i;function Cb(e,r,t=process.env){let n=t.KYNVER_CHAT_MODEL?.trim();if(n){if(e==="cursor"){let s=Wn(n,$s);return s.ok?s.model:$s}return n}let o=r.defaultModel?.trim();if(e==="cursor"){if(o&&!gU.test(o)){let s=Wn(o,$s);return s.ok?s.model:$s}return $s}return o||"claude-sonnet-4-6"}import{existsSync as _b}from"node:fs";import{homedir as hU}from"node:os";import vl from"node:path";import{spawnSync as kU}from"node:child_process";var bl="cursor_cli_unavailable",Dd="cursor_not_logged_in";function yU(e){if(vl.isAbsolute(e)||e.includes("/")||e.includes("\\"))return _b(e);try{let r=kU(process.platform==="win32"?"where":"which",[e],{encoding:"utf8",timeout:3e3});return r.status===0&&!!r.stdout?.trim()}catch{return!1}}function Md(e=process.env){let r=hU(),t=[vl.join(r,".config","cursor","auth.json")];if(process.platform==="win32"){let n=e.LOCALAPPDATA?.trim(),o=e.APPDATA?.trim();n&&t.push(vl.join(n,"cursor-agent","auth.json")),o&&t.push(vl.join(o,"cursor","auth.json"))}return t}function xb(e){return`${e.error}: ${e.detail}`}function Eb(e=process.env){let r=fs(e);return yU(r)?e.CURSOR_API_KEY?.trim()?{ok:!0,creds:{agentBin:r,authSource:"api_key_env"}}:Md(e).find(n=>_b(n))?{ok:!0,creds:{agentBin:r,authSource:"oauth_local"}}:{ok:!1,error:Dd,detail:"Run `agent login` on this computer, or set CURSOR_API_KEY. Website chat will not fall back to hosted models."}:{ok:!1,error:bl,detail:"`agent` CLI not found. Install the Cursor Agent CLI (https://cursor.com/docs/cli/headless) and keep it on PATH."}}import{spawn as _U}from"node:child_process";E();function RU(e){if(typeof e=="string")return e;if(!Array.isArray(e))return"";let r=[];for(let t of e){if(!t||typeof t!="object")continue;let n=t;n.type==="text"&&typeof n.text=="string"&&n.text.trim()||n.type==="tool_result"&&typeof n.text=="string"&&n.text.trim()?r.push(n.text):n.type==="tool_use"&&typeof n.name=="string"&&r.push(`[tool call: ${n.name}]`)}return r.join(`
112
112
  `)}function vU(e){return e==="assistant"?"Assistant":e==="system"?"System":"User"}function Pb(e){let r=[],t=typeof e.system=="string"?e.system.trim():"";if(t&&r.push(`System:
113
113
  ${t}`),r.push("This is a website chat turn. Answer the user in plain language. Do not invent Kynver server tool calls."),Array.isArray(e.messages))for(let o of e.messages){if(!o||typeof o!="object")continue;let s=o,i=RU(s.content);i.trim()&&r.push(`${vU(s.role)}:
114
114
  ${i}`)}let n=r.join(`
@@ -121,7 +121,7 @@ ${i}`)}let n=r.join(`
121
121
  `)}),a={passed:i.passed,worktree:t,steps:i.steps};console.log(n?JSON.stringify(a,null,2):i.passed?"local plan verify passed":"local plan verify failed"),i.passed||process.exit(1)}async function gS(e){let r=K(e.plan?String(e.plan):void 0,"plan");if(e.local===!0||e.local==="true"){oB(e);return}let n=v().agentOsSlug;n||(console.error("requires agentOsSlug in ~/.kynver/config.json for verify (session route)"),process.exit(1));let o=L(e.baseUrl?String(e.baseUrl):void 0),s=process.env.KYNVER_API_KEY,i={"Content-Type":"application/json"};s&&(i.Authorization=`Bearer ${s}`);let a=`${o}/api/agent-os/${encodeURIComponent(n)}/plans/${encodeURIComponent(r)}/verify`,l=await fetch(a,{method:"POST",headers:i,body:JSON.stringify({worktreePath:e.worktree?String(e.worktree):void 0,taskId:e.task?String(e.task):void 0,humanOverride:e.humanOverride===!0||e.humanOverride==="true"})}),c=await l.text(),u=null;try{u=JSON.parse(c)}catch{u=c}l.ok||(console.error(JSON.stringify({httpStatus:l.status,response:u},null,2)),process.exit(1)),console.log(JSON.stringify(u,null,2))}import sB from"node:path";E();function hS(e){let r=sB.resolve(K(e.worktree?String(e.worktree):void 0,"worktree")),t=e.json===!0||e.json==="true"||e.emitJson===!0||e.emitJson==="true",n=[],o=e.command;if(Array.isArray(o))for(let a of o)n.push(String(a));else typeof o=="string"&&n.push(o);let s=Ll(r,n.length?n:np,{waitForAdmissionMs:e.waitForAdmissionMs?Number(e.waitForAdmissionMs):void 0,timeoutMs:e.timeoutMs?Number(e.timeoutMs):void 0}),i={passed:s.passed,worktree:r,steps:s.steps.map(a=>({command:a.command,ok:a.result.ok,exitCode:a.result.exitCode,admitted:a.result.admitted,wrappedWithSystemd:a.result.wrappedWithSystemd,nodeOptionsFlag:a.result.nodeOptionsFlag,admission:a.result.admission,verificationGate:a.result.verificationGate,stderr:a.result.stderr.slice(0,4e3)}))};if(t)console.log(JSON.stringify(i,null,2));else{console.log(s.passed?"harness verify passed":"harness verify failed");for(let a of i.steps)console.log(` ${a.ok?"\u2713":"\u2717"} ${a.command} (exit ${a.exitCode}, systemd=${a.wrappedWithSystemd})`),!a.ok&&a.stderr&&console.log(` ${a.stderr.split(`
122
122
  `)[0]}`)}process.exit(s.passed?0:1)}A();import{readFileSync as iB}from"node:fs";E();var aB=["create","add_version","update_metadata"],lB=["approval_guard","auth","network","server","tool_interruption"];function cB(e){let r=e.bodyFile?String(e.bodyFile):void 0;if(r)return{body:iB(r,"utf8"),bodyPathHint:r};let t=e.body?String(e.body):void 0;if(t)return{body:t};throw new Error("requires --body-file PATH or --body TEXT")}async function kS(e){let r=K(e.operation?String(e.operation):void 0,"operation");if(!aB.includes(r))throw new Error(`invalid --operation ${r}`);let t=r,n=v(),o=K(e.slug?String(e.slug):n.agentOsSlug,"slug (or agentOsSlug in ~/.kynver/config.json)"),s=K(e.title?String(e.title):void 0,"title"),{body:i,bodyPathHint:a}=cB(e);a&&Is(a)&&console.warn(JSON.stringify({warning:"/tmp-only body path is not durable; AgentOS persistence requires outbox or successful API write",bodyPathHint:a}));let l={operation:t,agentOsSlug:o,title:s,body:i,bodyPathHint:a,summary:e.summary?String(e.summary):void 0,planId:e.plan?String(e.plan):void 0,planSlug:e.planSlug?String(e.planSlug):void 0,changeSummary:e.changeSummary?String(e.changeSummary):void 0,author:e.author?String(e.author):void 0,model:e.model?String(e.model):void 0,maxRetries:e.maxRetries?Number(e.maxRetries):void 0,immediateFailure:uB(e)},c=await Ts(l);console.log(JSON.stringify(c,null,2)),c.userStatus==="failed and needs action"&&process.exit(1)}function uB(e){let r=e.failureKind?String(e.failureKind):void 0;if(!r)return;if(!lB.includes(r))throw new Error(`invalid --failure-kind ${r}`);let t=e.failureMessage?String(e.failureMessage):`immediate failure (${r})`;return{kind:r,message:t}}async function yS(){let e=Xn();console.log(JSON.stringify({count:e.length,items:e},null,2))}async function RS(e){let r=e.max?Number(e.max):void 0,t=e.id?String(e.id):void 0,n=await $u({max:r,outboxId:t});console.log(JSON.stringify(n,null,2)),n.failed>0&&process.exit(1)}function vS(e){let r=e.execute===!0||e.execute==="true",t=e.skipFinalize===!0||e.skipFinalize==="true",n=e.accountBytes===!0||e.accountBytes==="true",o=e.compact===!0||e.compact==="true",s=e.nodeModulesAgeMs,i=s!=null&&s!=="",a=i?Number(s):void 0,l=e.worktreesAgeMs?Number(e.worktreesAgeMs):0,c=e.includeOrphans===!0||e.includeOrphans==="true",u=e.harnessRoot?String(e.harnessRoot):void 0,d=wd({execute:r,finalizeStaleRuns:!t,accountBytes:n,scanDependencyCaches:i,nodeModulesAgeMs:a!==void 0&&Number.isFinite(a)?a:i?216e5:void 0,worktreesAgeMs:Number.isFinite(l)?l:0,includeOrphans:c,harnessRoot:u});o&&d.compactSummary?console.log(JSON.stringify(d.compactSummary,null,2)):console.log(JSON.stringify(d,null,2)),r&&d.totals.removedPaths===0&&d.actions.length===0&&(process.exitCode=0)}bo();function bS(e){let r=e.execute===!0||e.execute==="true",t=e.json===!0||e.json==="true",n=e["purge-all"]===!0||e["purge-all"]==="true",o=e["keep-newest"]?Number(e["keep-newest"]):void 0;if(r||n){let a=cl({execute:r,purgeAll:n,keepNewest:o}),l={...a,observation:a.observation?{...a.observation,dumps:a.observation.dumps.map(c=>({name:c.name,bytes:c.bytes,executableHint:c.executableHint,mtimeMs:c.mtimeMs}))}:null};console.log(JSON.stringify(l,null,t?2:0));return}let s=Vr(),i=s?{...s,dumps:s.dumps.map(a=>({name:a.name,bytes:a.bytes,executableHint:a.executableHint,mtimeMs:a.mtimeMs}))}:{skipped:!0,reason:"not_wsl"};console.log(JSON.stringify(i,null,t?2:0))}function Hr(e,r=2400){if(e==null)return;let n=(typeof e=="string"?e:JSON.stringify(e,null,2)).trim();if(n)return n.length<=r?n:`${n.slice(0,r-1).trimEnd()}\u2026`}function Ul(e){let r=[],t=typeof e.monitorId=="string"?e.monitorId:void 0;if(r.push(t?`Harness monitor tick \xB7 ${e.runId} (${t})`:`Harness monitor tick \xB7 ${e.runId}`),!e.workers.length)return r.push("No workers in scope for this poll."),{primary:r.join(`
123
123
  `),diagnostic:Hr(e)};for(let i of e.workers){let a=i.autoComplete.eligible?"eligible for auto-complete":"not auto-completing",l=i.autoComplete.blockers.length>0?` (${i.autoComplete.blockers.slice(0,2).join("; ")})`:"";r.push(`\u2022 ${i.worker}: ${i.workerStatus}, ${i.health}${i.healthReason?` \u2014 ${i.healthReason}`:""}; ${a}${l}`),i.taskStatus&&r.push(` Board task: ${i.taskStatus}${i.leaseOwner?` (lease: ${i.leaseOwner})`:""}`)}let n=e.autoCompleted?.filter(i=>i.outcome==="completed"&&i.ok)??[],o=e.autoCompleted?.filter(i=>!i.ok&&i.outcome!=="skipped")??[];n.length&&r.push(`Auto-completed: ${n.map(i=>i.worker).join(", ")} \u2014 AgentOS completion should be posted.`),o.length&&r.push(`Auto-complete blocked: ${o.map(i=>`${i.worker}${i.reason?` (${i.reason})`:""}`).join("; ")}`),e.leaseRenewal?.failed?.length&&r.push(`Lease renew failed for: ${e.leaseRenewal.failed.map(i=>i.worker).join(", ")}`);let s=e.workers.length>0&&e.workers.every(i=>i.autoComplete.terminalVerified)&&(e.autoCompleted?.every(i=>i.ok||i.outcome==="skipped")??!0);return r.push(s?"Next: monitor loop should stop \u2014 all workers terminal and handled.":"Next: monitor will poll again until workers are terminal-verified or max time elapses."),{primary:r.join(`
124
- `),diagnostic:Hr(e)}}import vB from"node:path";M();se();E();se();E();function SS(e){let{worker:r,status:t,taskLease:n}=e,o=n?.leaseOwner??null;if(r.dispatched&&n){if(n.status==="running"&&o&&!ou(o,r.runId))return{health:"orphaned",reason:`task lease held by ${o}, expected harness run ${r.runId}`};let i=r.leaseToken?.trim()??"",a=n.leaseToken?.trim()??"";if(n.status==="running"&&i&&a&&i!==a)return{health:"orphaned",reason:"task leaseToken superseded on board \u2014 completion replay would fail"};if(n.status==="running"&&!t.alive&&!t.finalResult)return{health:"orphaned",reason:"board task running but worker process is not alive"}}if(r.status==="running"&&!t.alive&&!t.finalResult)return{health:"orphaned",reason:"worker.json still running but process is dead"};if(t.attention.state==="stale")return{health:"stale",reason:t.attention.reason};let s=t.lastHeartbeatAt?Date.parse(t.lastHeartbeatAt):NaN;return t.alive&&Number.isFinite(s)&&Date.now()-s>yn?{health:"stale",reason:`heartbeat older than ${Math.floor(yn/1e3)}s`}:t.alive&&r.pid&&!$(r.pid)?{health:"orphaned",reason:"pid recorded but process is not alive"}:n?.status==="running"&&!t.alive&&t.finalResult?{health:"healthy",reason:"finished worker awaiting completion replay"}:{health:"healthy",reason:t.attention.reason||"worker within expected lifecycle bounds"}}xe();E();import{existsSync as wS,mkdirSync as kB,readdirSync as yB,unlinkSync as RB}from"node:fs";import op from"node:path";function CS(){let{harnessRoot:e}=un(),r=op.join(e,"monitors");return kB(r,{recursive:!0}),r}function po(e,r){return r?`${_(e)}--${_(r)}`:_(e)}function sp(e){return op.join(CS(),`${e}.json`)}function mo(e){return P(sp(e),void 0)}function fo(e){ue(sp(e.monitorId),e)}function _S(e){let r=sp(e);return wS(r)?(RB(r),!0):!1}function xS(){let e=CS();if(!wS(e))return[];let r=[];for(let t of yB(e)){if(!t.endsWith(".json"))continue;let n=P(op.join(e,t),void 0);n?.monitorId&&r.push({monitorId:n.monitorId,runId:n.runId,workerName:n.workerName,agentOsId:n.agentOsId,pid:n.pid,alive:n.pid?$(n.pid):!1,startedAt:n.startedAt,pollMs:n.pollMs,logPath:n.logPath})}return r.sort((t,n)=>t.startedAt.localeCompare(n.startedAt))}se();function ip(e){let{worker:r,status:t}=e,n=[];r.localOnly&&n.push("local-only worker (no board linkage)"),(!r.agentOsId||!r.taskId)&&n.push("missing agentOsId/taskId linkage"),_a(r)&&n.push("completion already acknowledged"),r.completionBlocker&&n.push(r.completionBlocker),t.heartbeatBlocker&&t.alive&&n.push(`worker heartbeat blocker: ${t.heartbeatBlocker}`),t.attention.state==="blocked"&&n.push(t.attention.reason||"worker attention blocked"),Rn(t)&&n.push(t.attention.reason||"landing gate blocked");let o=ke(t),s;return o?t.finalResult?s="final_result":t.alive?s="terminal_status":s="process_exited":n.push("worker has not reached a terminal condition"),{eligible:o&&n.length===0,terminalVerified:o,terminalReason:s,blockers:n}}function ES(e,r){return P(vB.join(T(e),"workers",_(r),"worker.json"),void 0)}function PS(e,r){let t=H(e),n=Object.keys(t.workers||{});if(!r)return n;let o=_(r);return n.filter(s=>_(s)===o)}function IS(e,r){let t=H(e.runId),n=B(e,{base:t.base,baseCommit:t.baseCommit}),o=e.taskId?r.get(e.taskId)??null:null,s=SS({worker:e,status:n,taskLease:o}),i=ip({worker:e,status:n});return{runId:e.runId,worker:e.name,health:s.health,healthReason:s.reason,workerStatus:n.status,attentionState:n.attention.state,attentionReason:n.attention.reason,alive:n.alive,taskId:e.taskId,leaseOwner:o?.leaseOwner??void 0,taskStatus:o?.status,autoComplete:i,status:n}}async function Xs(e){let r=String(e.run||"");K(r,"--run");let t=e.name?String(e.name):void 0,n=e.agentOsId?String(e.agentOsId):void 0,o=H(r),s=PS(r,t),i=[];for(let p of s){let g=ES(r,p);g&&i.push(g)}let a=n||i.map(p=>p.agentOsId).find(p=>typeof p=="string"&&p.trim())||void 0,l=i.map(p=>p.taskId).filter(p=>!!p),c=await Kn({agentOsId:a,taskIds:l,baseUrl:e.baseUrl?String(e.baseUrl):void 0,secret:e.secret?String(e.secret):void 0}),u=i.map(p=>IS(p,c)),d;a&&e.renewLeases!==!1&&e.renewLeases!=="false"&&(d=await ba(r,{...e,agentOsId:a}));let m=[];if(e.autoComplete===!0||e.autoComplete==="true")for(let p of u){if(!p.autoComplete.eligible){m.push({worker:p.worker,outcome:"skipped",ok:!1,reason:p.autoComplete.blockers.join("; ")||"not eligible"});continue}let g=await Gn({run:r,name:p.worker,...a?{agentOsId:a}:{},...e.baseUrl?{baseUrl:String(e.baseUrl)}:{},...e.secret?{secret:String(e.secret)}:{}});m.push({worker:p.worker,outcome:g.outcome,ok:g.outcome==="completed",reason:g.reason})}return{runId:r,agentOsId:a,workers:u,leaseRenewal:d,autoCompleted:m}}function AS(e){let r=String(e.run||"");K(r,"--run");let t=e.name?String(e.name):void 0,n=PS(r,t),o=[];for(let s of n){let i=ES(r,s);i&&o.push(IS(i,new Map))}return{runId:r,workers:o,autoCompleted:[]}}function ap(){return xS()}function OS(e){let r=String(e.run||"");K(r,"--run");let t=po(r,e.name?String(e.name):void 0),n=mo(t);if(!n)return{monitorId:t,stopped:!1};if(n.pid&&$(n.pid))try{process.kill(n.pid,"SIGTERM")}catch{}return n.stoppedAt=new Date().toISOString(),fo(n),_S(t),{monitorId:t,stopped:!0,pid:n.pid}}async function lp(e){let r=String(e.run||""),t=String(e.name||"");K(r,"--run"),K(t,"--name");let n=Ee(r,t),o=H(r),s=B(n,{base:o.base,baseCommit:o.baseCommit}),i=ip({worker:n,status:s});if(!i.eligible){console.log(JSON.stringify({runId:r,worker:t,outcome:"blocked",blockers:i.blockers,terminalVerified:i.terminalVerified},null,2)),process.exitCode=1;return}let a=await Gn({...e,run:r,name:t});console.log(JSON.stringify(a,null,2)),a.outcome!=="completed"&&a.outcome!=="blocked"&&(process.exitCode=1)}E();var bB=5e3,SB=360*60*1e3;async function TS(e){let r=String(e.monitorId||""),t=Number(e.pollMs)>0?Math.floor(Number(e.pollMs)):bB,n=Number(e.maxTotalMs)>0?Math.floor(Number(e.maxTotalMs)):SB,o=Date.now();for(;Date.now()-o<=n;){let s=r?mo(r):void 0;if(s?.stoppedAt)break;let i=await Xs({...e,autoComplete:e.autoComplete??!0,renewLeases:e.renewLeases??!0}),a=Ul({monitorId:r,phase:"tick",...i});if(console.log(a.primary),a.diagnostic&&console.error(`[monitor diagnostic] ${a.diagnostic}`),i.workers.length>0&&i.workers.every(c=>c.autoComplete.terminalVerified&&(c.autoComplete.eligible||c.autoComplete.blockers.some(u=>u.includes("already acknowledged"))))&&i.autoCompleted.every(c=>c.ok||c.outcome==="skipped")){r&&s&&(s.stoppedAt=new Date().toISOString(),fo(s));break}ht(t)}}E();xe();import{spawn as wB}from"node:child_process";import{closeSync as NS,existsSync as CB,openSync as _B}from"node:fs";import xB from"node:path";function DS(e){let r=e.nodeExecutable??process.execPath,t=Hn({importMetaUrl:import.meta.url,explicitCliPath:e.cliPath,nodeExecutable:r});if(!t)return;let n=t.cliPath;if(!CB(n))return;let o=po(e.runId,e.workerName),{harnessRoot:s}=un(),i=xB.join(s,"monitors",`${o}.log`),a;try{a=_B(i,"a")}catch{a=void 0}let l=e.pollMs??5e3,c=[...t.argsPrefix,"monitor","run-loop","--run",e.runId,"--monitor-id",o,"--poll-ms",String(l),"--auto-complete","true","--renew-leases","true"];e.workerName&&c.push("--name",e.workerName),e.agentOsId&&c.push("--agent-os-id",e.agentOsId),e.baseUrl&&c.push("--base-url",e.baseUrl),e.secret&&c.push("--secret",e.secret);let u=["ignore",a??"ignore",a??"ignore"];try{let d=wB(t.command,c,pe({detached:!0,stdio:u,env:process.env}));a!==void 0&&NS(a),d.unref();let m={monitorId:o,runId:e.runId,workerName:e.workerName,agentOsId:e.agentOsId,pid:d.pid,startedAt:new Date().toISOString(),pollMs:l,logPath:i};return fo(m),{monitorId:o,pid:d.pid,logPath:i,session:m}}catch{if(a!==void 0)try{NS(a)}catch{}return}}E();async function MS(e){let r=String(e.run||"");K(r,"--run");let t=e.name?String(e.name):void 0,n=po(r,t),o=mo(n);if(o?.pid&&!o.stoppedAt)return{monitorId:n,session:o,spawned:!1,pid:o.pid};let s=DS({runId:r,workerName:t,agentOsId:e.agentOsId?String(e.agentOsId):void 0,pollMs:Number(e.pollMs)>0?Math.floor(Number(e.pollMs)):void 0,baseUrl:e.baseUrl?String(e.baseUrl):void 0,secret:e.secret?String(e.secret):void 0});if(!s)throw new Error("failed to spawn monitor sidecar (cli.js missing or spawn error)");return{monitorId:n,session:s.session,spawned:!0,pid:s.pid}}async function LS(e){if(String(e.run||"")){let t=e.tick===!0||e.tick==="true"?await Xs({...e,autoComplete:!1}):AS(e);console.log(JSON.stringify(t,null,2));return}console.log(JSON.stringify({monitors:ap()},null,2))}function US(e){console.log(JSON.stringify(OS(e),null,2))}function BS(){console.log(JSON.stringify({monitors:ap()},null,2))}async function WS(e){await TS(e)}async function FS(e){let r=await Xs(e);console.log(JSON.stringify(r,null,2))}function EB(e){let r={};for(let[t,n]of Object.entries(e))n?.version&&(r[t]={version:n.version,source:"installed",path:n.path});return r}async function PB(e={}){let[r,t]=await Promise.all([kl(),Promise.resolve(Gv({cwd:e.cwd,repoRoot:e.repoRoot}))]),n={},o=e.selfPackageName==="@kynver-app/runtime"&&e.selfVersion?e.selfVersion:sr;return n["@kynver-app/runtime"]={version:o,source:"self"},e.selfPackageName&&e.selfVersion&&e.selfPackageName!=="@kynver-app/runtime"&&(n[e.selfPackageName]={version:e.selfVersion,source:"self"}),{installed:EB(r),repo:t,self:n,undetectedPolicy:"skip"}}async function HS(e={}){let r=await PB(e);return Jv(r)}function KS(e,r){return e?e==="daemon"||e==="start"||e==="worker"||e==="monitor"||e==="run"&&(r==="dispatch"||r==="sweep"||r==="reconcile"||r==="unblock")||e==="cron"&&r==="tick":!1}E();function IB(e){let r=e.trim();return r?js().find(n=>n.name===r&&n.status!=="completed")??null:null}function $S(e){let r=String(K(String(e.name||""),"--name")),t=IB(r);console.log(JSON.stringify({runId:t?.id??null,name:r,status:t?.status??null,effectiveStatus:t?.effectiveStatus??null},null,2))}M();se();E();A();import AB from"node:path";function Qs(e,r,t,n,o,s){return{runId:e,worker:r,taskId:t,agentOsId:n,leaseOwner:o,action:"skipped",reason:s}}async function OB(e){let r=L(e.baseUrl?String(e.baseUrl):void 0),t=e.agentOsId?String(e.agentOsId).trim():null,n=e.dryRun===!0||e.dryRun==="true",o=[],s=[],i=[];for(let a of ne())for(let l of Object.keys(a.workers??{})){let c=AB.join(T(a.id),"workers",_(l),"worker.json"),u=P(c,void 0);if(!u){s.push(Qs(a.id,l,"","","","worker.json missing"));continue}let d=u.taskId??"",m=u.agentOsId??"",f=u.leaseOwner??"";if(!u.dispatched||!d||!m||!f){s.push(Qs(a.id,l,d,m,f,"not a fully-leased dispatched worker"));continue}if(t&&m!==t)continue;if(u.completionReportedAt){s.push(Qs(a.id,l,d,m,f,"completion already reported"));continue}let p=B(u);if(p.finalResult){s.push(Qs(a.id,l,d,m,f,"has final result \u2014 let pipeline tick complete it"));continue}if(p.alive){s.push(Qs(a.id,l,d,m,f,"worker process is still alive"));continue}if(n){o.push({runId:a.id,worker:l,taskId:d,agentOsId:m,leaseOwner:f,action:"released",reason:"dry-run: would release dead dispatched worker lease"});continue}try{let g=await q(e.secret?String(e.secret):void 0,m,{baseUrl:r}),y=`${r}/api/agent-os/by-id/${encodeURIComponent(m)}/tasks/${encodeURIComponent(d)}/release`,k=await te(y,g,{agentOsId:m,leaseOwner:f,...u.leaseToken?.trim()?{leaseToken:u.leaseToken.trim()}:{}},{agentOsId:m,baseUrl:r});k.ok===!0||k.response?.ok===!0?o.push({runId:a.id,worker:l,taskId:d,agentOsId:m,leaseOwner:f,action:"released",reason:"dead dispatched worker lease released; task requeued"}):s.push({runId:a.id,worker:l,taskId:d,agentOsId:m,leaseOwner:f,action:"skipped",reason:`release returned ok:false (likely owner mismatch or already released): HTTP ${k.status}`})}catch(g){i.push({runId:a.id,worker:l,taskId:d,agentOsId:m,leaseOwner:f,action:"error",reason:g.message})}}return{dryRun:n,released:o,skipped:s,errors:i}}async function jS(e){let r=await OB(e),t={ok:r.errors.length===0,dryRun:r.dryRun,released:r.released.length,skipped:r.skipped.length,errors:r.errors.length,details:r};console.log(JSON.stringify(t,null,2)),r.errors.length>0&&process.exit(1)}Wi();import ew from"node:path";rr();A();import{accessSync as TB,constants as NB,existsSync as up,readFileSync as DB}from"node:fs";import{homedir as Bl}from"node:os";import Wl from"node:path";import{spawnSync as MB}from"node:child_process";xe();function cp(e,r){try{let t=MB(e,r,{encoding:"utf8"}),n=(t.stdout||"").trim(),o=(t.stderr||"").trim();return{ok:t.status===0,stdout:n,stderr:o,error:t.error?.message}}catch(t){return{ok:!1,stdout:"",stderr:"",error:t.message}}}function VS(e){let r=e?.trim();if(r)return r.length<=12?`${r}\u2026`:`${r.slice(0,12)}\u2026`}function LB(e){if(!up(e))return!1;try{return TB(e,NB.W_OK),!0}catch{return!1}}var GS={packageVersion:()=>sr,commandOnPath:e=>cp(process.platform==="win32"?"where":"which",[e]),kynverVersion:e=>cp(e,["--version"]),loadConfig:()=>v(),configFilePath:()=>Wl.join(Bl(),".kynver","config.json"),credentialsFilePath:()=>Wl.join(Bl(),".kynver","credentials"),readCredentials:()=>{let e=Wl.join(Bl(),".kynver","credentials");if(!up(e))return{hasApiKey:!1};try{let r=JSON.parse(DB(e,"utf8"));return{hasApiKey:!!r.apiKey?.trim(),runnerTokenPrefix:VS(r.runnerToken),runnerTokenAgentOsId:r.runnerTokenAgentOsId}}catch{return{hasApiKey:!1}}},envSnapshot:()=>({kynverApiUrl:process.env.KYNVER_API_URL?.trim()||void 0,openclawCronFireBaseUrl:process.env.OPENCLAW_CRON_FIRE_BASE_URL?.trim()||void 0,kynverRunnerTokenPrefix:VS(process.env.KYNVER_RUNNER_TOKEN),kynverRuntimeSecret:!!process.env.KYNVER_RUNTIME_SECRET?.trim(),openclawCronSecret:!!process.env.OPENCLAW_CRON_SECRET?.trim(),kynverHarnessRoot:process.env.KYNVER_HARNESS_ROOT?.trim()||void 0,opusHarnessRoot:process.env.OPUS_HARNESS_ROOT?.trim()||void 0,kynverSchedulerProvider:process.env.KYNVER_SCHEDULER_PROVIDER?.trim()||void 0,openclawCronStorePath:!!(process.env.KYNVER_CRON_STORE_PATH?.trim()||process.env.OPENCLAW_CRON_STORE_PATH?.trim()),kynverCronDaemonPrimary:ta(),qstashTokenPresent:!!process.env.QSTASH_TOKEN?.trim(),kynverHostedDeployment:(()=>{let e=process.env.KYNVER_HOSTED_DEPLOYMENT?.trim().toLowerCase();return e==="1"||e==="true"||e==="yes"})()}),harnessRoot:()=>he(),legacyOpenclawHarnessRoot:()=>Wl.join(Bl(),".openclaw","harness"),pathExists:e=>up(e),pathWritable:e=>LB(e),ghAuthToken:()=>cp("gh",["auth","token"]),deployEvidenceNeedsGithub:()=>{let e=process.env.KYNVER_HOSTED_DEPLOYMENT?.trim().toLowerCase();return!(e==="1"||e==="true"||e==="yes")}};function YS(e,r){return e.kynverSchedulerProvider==="openclaw-cron"||r.deploymentSchedulerProvider==="openclaw-cron"}function UB(e,r){return e.kynverSchedulerProvider==="kynver-cron"||r.deploymentSchedulerProvider==="kynver-cron"}function JS(e){return!!e.openclawCronStorePath}function BB(e,r){return e.kynverSchedulerProvider==="qstash"||r.deploymentSchedulerProvider==="qstash"}function qS(e,r){let t={schedulerProvider:e.kynverSchedulerProvider??null,deploymentSchedulerProvider:r.deploymentSchedulerProvider??null,openclawCronStorePath:!!e.openclawCronStorePath,kynverCronDaemonPrimary:!!e.kynverCronDaemonPrimary},n=!!r.agentOsId?.trim()&&!!r.apiBaseUrl?.trim()&&r.hasScopedRunnerToken;if(BB(e,r)&&!YS(e,r)){let u=e.kynverSchedulerProvider==="qstash"?"KYNVER_SCHEDULER_PROVIDER=qstash on this host":"deploymentSchedulerProvider=qstash in ~/.kynver/config.json";return{id:"hotspot_openclaw_scheduler",label:"Scheduler provider (runtime daemon vs OpenClaw cron)",status:"pass",summary:`AgentOS scheduler cut over to QStash (${u})`,details:t}}if(UB(e,r)&&!YS(e,r)){if(JS(e)&&e.kynverCronDaemonPrimary&&n)return{id:"hotspot_openclaw_scheduler",label:"Scheduler provider (runtime daemon vs OpenClaw cron)",status:"pass",summary:"Kynver Cron local store present; `kynver daemon` owns schedule fires (kynver-cron tick loop)",details:{...t,dispatchPath:"kynver-daemon-cron-tick",kynverCronDaemonPrimary:!0}};let u=e.kynverSchedulerProvider==="kynver-cron"?"KYNVER_SCHEDULER_PROVIDER=kynver-cron on this host":"deploymentSchedulerProvider=kynver-cron in ~/.kynver/config.json";return{id:"hotspot_openclaw_scheduler",label:"Scheduler provider (runtime daemon vs OpenClaw cron)",status:"pass",summary:`AgentOS scheduler owned by Kynver Cron (${u})`,details:t}}if(JS(e)){if(e.kynverCronDaemonPrimary&&n)return{id:"hotspot_openclaw_scheduler",label:"Scheduler provider (runtime daemon vs OpenClaw cron)",status:"pass",summary:"Kynver Cron local store present; `kynver daemon` owns schedule fires (kynver-cron tick loop)",details:{...t,dispatchPath:"kynver-daemon-cron-tick",kynverCronDaemonPrimary:!0}};let u=[];return e.openclawCronStorePath&&u.push("KYNVER_CRON_STORE_PATH or OPENCLAW_CRON_STORE_PATH set (local cron store)"),{id:"hotspot_openclaw_scheduler",label:"Scheduler provider (runtime daemon vs OpenClaw cron)",status:"warn",summary:`Local cron store without daemon tick (${u.join("; ")})`,remediation:"Run `kynver daemon` with KYNVER_CRON_SECRET + KYNVER_API_URL (or KYNVER_CRON_FIRE_BASE_URL) so the daemon-owned cron tick fires schedules. On hosted deploys use QStash (KYNVER_SCHEDULER_PROVIDER=qstash). Legacy OpenClaw cron env aliases still work during cutover.",details:t}}let o=e.kynverSchedulerProvider==="openclaw-cron",s=r.deploymentSchedulerProvider==="openclaw-cron",i=e.kynverSchedulerProvider==="qstash",a=!!e.qstashTokenPresent||!!e.kynverHostedDeployment,l=a&&!n,c=l&&e.kynverSchedulerProvider==="openclaw-cron";return s&&!o?{id:"hotspot_openclaw_scheduler",label:"Scheduler provider (runtime daemon vs OpenClaw cron)",status:"warn",summary:"deploymentSchedulerProvider=openclaw-cron in ~/.kynver/config.json \u2014 migrate to kynver-cron or qstash",remediation:'Run `kynver scheduler attest-cutover` or set deploymentSchedulerProvider to "kynver-cron" or "qstash" in ~/.kynver/config.json.',details:t}:n&&o?{id:"hotspot_openclaw_scheduler",label:"Scheduler provider (runtime daemon vs OpenClaw cron)",status:"warn",summary:"KYNVER_SCHEDULER_PROVIDER=openclaw-cron on this runner \u2014 dispatch is owned by kynver daemon; unset the OpenClaw override",remediation:"Unset KYNVER_SCHEDULER_PROVIDER on user runners (or set kynver-cron). Use `kynver daemon` (pipeline-tick \u2192 operator/tick). On the Kynver server set KYNVER_SCHEDULER_PROVIDER=qstash when QStash is configured.",details:{schedulerProvider:e.kynverSchedulerProvider??null,dispatchPath:"kynver-daemon-pipeline-tick",hostedDeployment:a}}:n?{id:"hotspot_openclaw_scheduler",label:"Scheduler provider (runtime daemon vs OpenClaw cron)",status:"pass",summary:i?"Runner override qstash present; hosted dispatch still owned by kynver daemon pipeline-tick":"Hosted dispatch owned by kynver daemon (pipeline-tick \u2192 operator/tick); no OpenClaw cron on runner",details:{schedulerProvider:e.kynverSchedulerProvider??null,dispatchPath:"kynver-daemon-pipeline-tick",hostedDeployment:a}}:o?{id:"hotspot_openclaw_scheduler",label:"Scheduler provider (runtime daemon vs OpenClaw cron)",status:"warn",summary:"KYNVER_SCHEDULER_PROVIDER=openclaw-cron on this runner \u2014 hosted dispatch still depends on the OpenClaw local-cron adapter",remediation:"Unset KYNVER_SCHEDULER_PROVIDER on user runners (or set kynver-cron). Use `kynver daemon` (pipeline-tick \u2192 operator/tick). On the Kynver server set KYNVER_SCHEDULER_PROVIDER=qstash when QStash is configured.",details:{schedulerProvider:e.kynverSchedulerProvider??null,hostedDeployment:a}}:c?{id:"hotspot_openclaw_scheduler",label:"Scheduler provider (runtime daemon vs OpenClaw cron)",status:"warn",summary:"Hosted deployment has KYNVER_SCHEDULER_PROVIDER=openclaw-cron \u2014 AgentOS scheduled ticks should use QStash or kynver-cron",remediation:"Set QSTASH_TOKEN and KYNVER_SCHEDULER_PROVIDER=qstash on the Kynver server (or kynver-cron for Kynver-owned local scheduling). User runners use `kynver daemon` for dispatch and should not set a scheduler provider.",details:{schedulerProvider:e.kynverSchedulerProvider??null,qstashTokenPresent:e.qstashTokenPresent??!1,hostedDeployment:a}}:l&&e.qstashTokenPresent&&!e.kynverSchedulerProvider?{id:"hotspot_openclaw_scheduler",label:"Scheduler provider (runtime daemon vs OpenClaw cron)",status:"pass",summary:"QSTASH_TOKEN present; hosted scheduler auto-selects qstash (explicit KYNVER_SCHEDULER_PROVIDER=qstash optional)",details:{schedulerProvider:null,qstashTokenPresent:!0,hostedDeployment:a}}:l&&!e.qstashTokenPresent&&!e.kynverSchedulerProvider?{id:"hotspot_openclaw_scheduler",label:"Scheduler provider (runtime daemon vs OpenClaw cron)",status:"warn",summary:"Hosted deployment with no QSTASH_TOKEN and no KYNVER_SCHEDULER_PROVIDER \u2014 kynver-cron is an in-process stub here and will NOT fire; no firing scheduler is configured",remediation:"Set QSTASH_TOKEN + KYNVER_SCHEDULER_PROVIDER=qstash on the Kynver server for hosted AgentOS schedules. Only use kynver-cron when a `kynver daemon` (or local cron store) actually owns firing on this box.",details:{schedulerProvider:null,resolvedFallback:"none",qstashTokenPresent:!1,hostedDeployment:a}}:l&&!e.qstashTokenPresent&&e.kynverSchedulerProvider&&e.kynverSchedulerProvider!=="qstash"&&e.kynverSchedulerProvider!=="kynver-cron"?{id:"hotspot_openclaw_scheduler",label:"Scheduler provider (runtime daemon vs OpenClaw cron)",status:"warn",summary:`Hosted deployment without QSTASH_TOKEN (KYNVER_SCHEDULER_PROVIDER=${e.kynverSchedulerProvider}) \u2014 use qstash or kynver-cron`,remediation:"Set QSTASH_TOKEN and KYNVER_SCHEDULER_PROVIDER=qstash on the Kynver server, or kynver-cron for Kynver-owned local scheduling. User runners use `kynver daemon` for dispatch.",details:{schedulerProvider:e.kynverSchedulerProvider??null,qstashTokenPresent:e.qstashTokenPresent??!1,hostedDeployment:a}}:e.kynverSchedulerProvider?{id:"hotspot_openclaw_scheduler",label:"Scheduler provider (runtime daemon vs OpenClaw cron)",status:"pass",summary:`KYNVER_SCHEDULER_PROVIDER=${e.kynverSchedulerProvider}`,details:{schedulerProvider:e.kynverSchedulerProvider??null}}:{id:"hotspot_openclaw_scheduler",label:"Scheduler provider (runtime daemon vs OpenClaw cron)",status:"pass",summary:"No KYNVER_SCHEDULER_PROVIDER on runner (expected) \u2014 finish runner setup so daemon pipeline-tick owns dispatch",details:{schedulerProvider:null,dispatchPath:"kynver-daemon-pipeline-tick-pending"}}}nr();Fo();_t();Li();bc();function zS(e,r={}){let t=bn(),n=Ui(e,t),o=[],s=r.envFilePath??be,i=Bi(e,{envFilePath:s,systemdUnitActive:r.systemdUnitActive});if(o.push({id:"daemon_supervision_owner",ok:!!e.daemonSupervisionOwner||i.effectivelyConfigured,summary:e.daemonSupervisionOwner?`daemonSupervisionOwner=${e.daemonSupervisionOwner} (${t})`:i.owner?`daemonSupervisionOwner inferred as ${i.owner} from healthy supervision signals \u2014 run \`kynver setup\` to persist`:"daemonSupervisionOwner unset \u2014 run `kynver setup` to persist Kynver-owned restart policy",remediation:e.daemonSupervisionOwner||i.effectivelyConfigured?e.daemonSupervisionOwner?void 0:"Run `kynver setup` or `kynver doctor runtime-takeover --remediate` to persist daemonSupervisionOwner.":"Run `kynver setup` (or `kynver bootstrap`) on this box."}),o.push({id:"daemon_present_signal",ok:i.daemonPresentSignal||i.systemdUnitActive,summary:i.systemdUnitActive?"systemd user unit active \u2014 local daemon supervision is healthy":i.daemonPresentSignal?`KYNVER_CRON_DAEMON_PRESENT=1 (persisted in ${s})`:`KYNVER_CRON_DAEMON_PRESENT not set in persisted env (${s})`,remediation:i.daemonPresentSignal||i.systemdUnitActive?void 0:"Run `kynver setup` or `kynver start` once to write ~/.kynver/.env supervision keys."}),n==="systemd"){let l=Sn();o.push({id:"systemd_user_unit",ok:l,summary:l?"systemd user unit present (~/.config/systemd/user/kynver-cron-daemon.service)":"daemonSupervisionOwner=systemd but user unit missing",remediation:l?void 0:"Run `kynver start --install-systemd` or `kynver cron install --install-systemd`."})}let a=Rc(t,n);return o.push({id:"supervision_guidance",ok:!0,summary:a[0]??"Kynver keeper supervises daemon restarts by default."}),o}Fo();_t();function XS(e){let r=e.loadConfig(),t=bn(),n=Ui(r,t),s=zS(r,{systemdUnitActive:e.systemdDaemonActive}).map(i=>({id:i.id,label:i.id.replace(/_/g," "),status:i.ok?"pass":i.id==="daemon_supervision_owner"||i.id==="daemon_present_signal"?"warn":"fail",summary:i.summary,remediation:i.remediation}));return s.push({id:"daemon_keeper_default",label:"Kynver keeper owns in-process restarts",status:n==="keeper"||n==="systemd"?"pass":"warn",summary:n==="systemd"?"systemd persists the keeper parent \u2014 Hermes/OpenClaw cron is not required to restart the daemon":"`kynver start` / `kynver daemon` run the keeper by default (opt out with --no-supervise only when an external supervisor owns restarts)",details:{owner:n,hostKind:t}}),{id:"daemon_supervision",label:"Daemon restart supervision",checks:s}}function QS(e){if(e.envGithubToken)return{viable:!0,source:"env",summary:"GITHUB_TOKEN present for GitHub commit-status evidence"};if(e.envGhToken)return{viable:!0,source:"env",summary:"GH_TOKEN present for GitHub commit-status evidence"};let r=e.ghAuthToken();return r.ok&&r.stdout.trim().length>0?{viable:!0,source:"gh-cli",summary:"GitHub CLI authenticated (`gh auth login`) for commit-status evidence"}:{viable:!1,source:"missing",summary:"No GITHUB_TOKEN/GH_TOKEN and `gh auth token` unavailable"}}function ZS(e,r){let t=e.commandOnPath("vercel"),n=t.ok,o=!!process.env.VERCEL_TOKEN?.trim(),s=QS(r),i=e.deployEvidenceNeedsGithub?.()??!0,a=[{id:"vercel_global_cli_absent",label:"Global Vercel CLI not installed",status:n?"warn":"pass",summary:n?`Global Vercel CLI on PATH (${t.stdout||"vercel"}) \u2014 Vercel is decommissioned; nothing should call it`:"No global Vercel CLI on PATH",remediation:n?"Uninstall the global Vercel CLI (`npm uninstall -g vercel`) \u2014 Vercel was decommissioned in the 2026-08 Railway cutover; deploy evidence comes from production /api/version + GitHub.":void 0,details:{path:n&&t.stdout||null}}];return i?a.push({id:"github_token_for_deploy_evidence",label:"GitHub token for deploy evidence",status:s.viable?"pass":"warn",summary:s.viable?s.summary:"No GitHub auth \u2014 deploy-evidence lookups (commit status, production /api/version ancestry compare) need GITHUB_TOKEN/GH_TOKEN or `gh auth login`",remediation:s.viable?void 0:"Export GITHUB_TOKEN (or GH_TOKEN) or run `gh auth login` for PR commit-status and ancestry lookups.",details:{source:s.source}}):a.push({id:"github_token_for_deploy_evidence",label:"GitHub token for deploy evidence",status:"pass",summary:"Skipped \u2014 no enabled workflow on this host requires GitHub deploy evidence",details:{skipped:!0,reason:"workflow_not_enabled"}}),a.push({id:"vercel_token_absent",label:"No stale VERCEL_TOKEN",status:o?"warn":"pass",summary:o?"VERCEL_TOKEN is set but obsolete \u2014 Vercel is decommissioned; nothing reads it":"VERCEL_TOKEN not set (Vercel decommissioned)",remediation:o?"Revoke the token in the Vercel dashboard and remove VERCEL_TOKEN from this host's environment.":void 0,details:{vercelTokenPresent:o}}),{id:"deploy_evidence",label:"Deploy evidence (Railway era)",checks:a}}function WB(e){let r={pass:0,warn:0,fail:0};for(let t of e)for(let n of t.checks)r[n.status]+=1;return r}function FB(e){let r=e.packageVersion(),t=e.commandOnPath("kynver"),n=t.ok&&t.stdout.length>0,o=n?t.stdout.split(/\r?\n/)[0]?.trim():void 0,s=o?F(o):void 0,i=[{id:"cli_running_version",label:"Running @kynver-app/runtime version",status:"pass",summary:`@kynver-app/runtime ${r}`,details:{version:r}},{id:"cli_on_path",label:"kynver executable on PATH",status:n?"pass":"warn",summary:n?`Found ${s}`:"kynver not found on PATH (invoked via node/npx?)",remediation:n?void 0:"Install globally (`npm i -g @kynver-app/runtime`) or invoke via `npx @kynver-app/runtime`.",details:{path:s}}];if(n&&o){let a=e.kynverVersion(o),l=a.stdout.replace(/^kynver\s+/i,"").trim()||void 0,c=a.ok&&(!l||l===r);i.push({id:"cli_installed_version",label:"Installed kynver CLI version matches running package",status:c?"pass":"warn",summary:a.ok&&l?c?`Installed ${l}`:`Installed ${l} differs from running ${r}`:a.error?`Could not read installed version (${a.error})`:a.stderr||"Could not read installed version",remediation:c?void 0:"Reinstall or rebuild @kynver-app/runtime so PATH kynver matches the harness worktree version.",details:{installedVersion:l,runningVersion:r,path:s}})}return{id:"cli_package",label:"CLI / package",checks:i}}function HB(e){let r=e.configFilePath(),t=F(r),n=e.pathExists(r),o=e.loadConfig(),s=[{id:"config_file",label:"~/.kynver/config.json present",status:n?"pass":"fail",summary:n?`Found ${t}`:`Missing ${t}`,remediation:n?void 0:"Run `kynver setup --api-base-url <url> --agent-os-id <id> --repo <path>`.",details:{configPath:t}}];if(n){let i=o.apiBaseUrl?.trim(),a=o.agentOsId?.trim(),l=Ye({config:o}),c=l?qo(l):null,u=Qf(l);s.push({id:"config_api_base_url",label:"Default API base URL",status:i?"pass":"warn",summary:i??"Not set in config (KYNVER_API_URL / --base-url required per command)",remediation:i?void 0:"Set `apiBaseUrl` via `kynver setup --api-base-url https://\u2026`.",details:{apiBaseUrl:i??null}},{id:"config_agent_os_id",label:"Default AgentOS id",status:a?"pass":"warn",summary:a??"Not set (pass --agent-os-id on daemon/dispatch/worker commands)",remediation:a?void 0:"Set `agentOsId` via `kynver setup --agent-os-id <uuid>`.",details:{agentOsId:a??null,agentOsSlug:o.agentOsSlug??null}},{id:"config_default_repo",label:"Default repo path",status:u.status,summary:l?l.persistedInConfig?`${c.defaultRepo} (config)`:`${c.defaultRepo} (${l.source}, not persisted in ~/.kynver/config.json)`:"Not set in ~/.kynver/config.json (`kynver run create` requires --repo)",remediation:u.remediation,details:{defaultRepo:c?.defaultRepo??null,source:c?.source??null,persistedInConfig:c?.persistedInConfig??!1,harnessRoot:o.harnessRoot?Me(o.harnessRoot):null}})}return{id:"user_config",label:"User config (~/.kynver)",checks:s}}function KB(e){let t=e.loadConfig().agentOsId?.trim(),n=e.readCredentials(),o=e.envSnapshot(),s=e.credentialsFilePath(),i=F(s),a=o.kynverRunnerTokenPrefix,l=n.runnerTokenPrefix,c=n.runnerTokenAgentOsId,u=!!l&&(!t||!c||c===t),d=!!a?.startsWith("krc1.")||u&&l?.startsWith("krc1.");return{id:"runner_token",label:"Runner token readiness",checks:[{id:"runner_token_scoped",label:"Scoped runner token (krc1.*) ready",status:d?"pass":"fail",summary:d?a?"KYNVER_RUNNER_TOKEN is set (scoped prefix shown)":`Saved scoped token for agentOsId ${c??t??"(unknown)"}`:"No scoped runner token for the configured AgentOS workspace",remediation:d?void 0:"Run `kynver login` then `kynver runner credential --agent-os-id <id>` (or `kynver setup` with API key).",details:{source:a?"env":l?"credentials":"none",tokenPrefix:a??(u?l:void 0),agentOsId:t??c??null,credentialsPath:i}},{id:"runner_token_agent_os_match",label:"Saved runner token matches configured agentOsId",status:!l||!t||!c||c===t?"pass":"warn",summary:!l||!c?"No saved token agentOsId to compare":t?c===t?"Saved token scoped to configured agentOsId":`Saved token is for ${c}, config expects ${t}`:"Config agentOsId unset \u2014 token scope not validated against config",remediation:l&&t&&c&&c!==t?"`kynver runner credential --agent-os-id <configured-id>` to mint a workspace-bound token.":void 0,details:{configuredAgentOsId:t??null,savedAgentOsId:c??null}},{id:"runner_api_key_for_refresh",label:"API key available for token refresh",status:n.hasApiKey||process.env.KYNVER_API_KEY?.trim()?"pass":"warn",summary:n.hasApiKey||process.env.KYNVER_API_KEY?"KYNVER API key present for runner credential mint/refresh":"No API key \u2014 401 callback recovery cannot auto-mint a replacement token",remediation:n.hasApiKey||process.env.KYNVER_API_KEY?void 0:"Run `kynver login --api-key \u2026`.",details:{credentialsPath:i,hasApiKey:n.hasApiKey||!!process.env.KYNVER_API_KEY}}]}}function $B(e){return ZS(e,{envGithubToken:!!process.env.GITHUB_TOKEN?.trim(),envGhToken:!!process.env.GH_TOKEN?.trim(),ghAuthToken:()=>e.ghAuthToken()})}function jB(e){let r=e.harnessRoot(),t=ew.join(r,"runs"),n=ew.join(r,"worktrees"),o=Me(r),s=Me(t),i=Me(n),a=e.pathExists(t),l=e.pathExists(n);return{id:"harness_dirs",label:"Harness / daemon directories",checks:[{id:"harness_root",label:"Harness root resolved",status:"pass",summary:o,details:{harnessRoot:o}},{id:"harness_runs_dir",label:"Runs directory ready",status:a&&e.pathWritable(t)?"pass":"warn",summary:a?e.pathWritable(t)?`Writable ${s}`:`Exists but not writable: ${s}`:`Will be created on first run: ${s}`,remediation:a&&!e.pathWritable(t)?`Fix permissions on ${s} or set KYNVER_HARNESS_ROOT to a writable path.`:void 0,details:{runsDir:s,exists:a,writable:e.pathWritable(t)}},{id:"harness_worktrees_dir",label:"Worktrees directory ready",status:l&&e.pathWritable(n)?"pass":"warn",summary:l?e.pathWritable(n)?`Writable ${i}`:`Exists but not writable: ${i}`:`Will be created on first worker: ${i}`,remediation:l&&!e.pathWritable(n)?`Fix permissions on ${i}.`:void 0,details:{worktreesDir:i,exists:l,writable:e.pathWritable(n)}}]}}function VB(e){let r=e.loadConfig(),t=e.envSnapshot(),n=t.kynverApiUrl??r.apiBaseUrl?.trim()??t.openclawCronFireBaseUrl,o=!t.kynverApiUrl&&!r.apiBaseUrl&&!!t.openclawCronFireBaseUrl,s=t.openclawCronSecret||t.kynverRuntimeSecret,i=t.kynverRunnerTokenPrefix?.startsWith("krc1."),l=e.readCredentials().runnerTokenPrefix?.startsWith("krc1.");return{id:"callback_auth",label:"Callback auth / config",checks:[{id:"callback_base_url",label:"Callback base URL configured",status:n?o?"warn":"pass":"fail",summary:n?o?`Using legacy OPENCLAW_CRON_FIRE_BASE_URL (${n})`:n:"No KYNVER_API_URL, config apiBaseUrl, or legacy OpenClaw base URL",remediation:n?o?"Migrate to KYNVER_API_URL or `kynver setup --api-base-url` and drop OPENCLAW_CRON_FIRE_BASE_URL.":void 0:"Set KYNVER_API_URL or run `kynver setup --api-base-url https://\u2026`.",details:{source:t.kynverApiUrl?"KYNVER_API_URL":r.apiBaseUrl?"config.apiBaseUrl":t.openclawCronFireBaseUrl?"OPENCLAW_CRON_FIRE_BASE_URL":"none",baseUrl:n??null}},{id:"callback_auth_mode",label:"Callback auth uses scoped runner token",status:i||l?"pass":s?"warn":"fail",summary:i?"KYNVER_RUNNER_TOKEN scoped token will be sent as X-Kynver-Runner-Token":l?"Saved krc1.* token in ~/.kynver/credentials":s?"Deployment-level KYNVER_RUNTIME_SECRET / OPENCLAW_CRON_SECRET in use (legacy headers)":"No callback secret configured",remediation:i||l?void 0:"Mint a scoped token: `kynver runner credential --agent-os-id <id>`. Avoid shared OPENCLAW_CRON_SECRET on user runners.",details:{mode:i||l?"scoped":s?"legacy_global_secret":"missing",legacyHeadersWhenNotScoped:["X-OpenClaw-Cron-Secret","X-Kynver-Runtime-Secret"]}}]}}function GB(e){let r=e.envSnapshot(),t=e.loadConfig(),n=e.readCredentials(),o=e.harnessRoot(),s=e.legacyOpenclawHarnessRoot(),i=Me(o),a=Me(s),l=r.opusHarnessRoot?Me(r.opusHarnessRoot):null,c=o===s&&e.pathExists(s),u=t.agentOsId?.trim(),d=r.kynverRunnerTokenPrefix,m=n.runnerTokenPrefix,f=n.runnerTokenAgentOsId,p=!!m&&(!u||!f||f===u),g=!!d?.startsWith("krc1.")||p&&!!m?.startsWith("krc1.");return{id:"openclaw_hotspots",label:"OpenClaw dependency hotspots",checks:[{id:"hotspot_legacy_harness_root",label:"Legacy ~/.openclaw/harness still active",status:c?"warn":"pass",summary:c?`Harness root is legacy ${a}`:r.opusHarnessRoot?`OPUS_HARNESS_ROOT override in use (${l})`:`Using ${i}`,remediation:c?"Set KYNVER_HARNESS_ROOT=~/.kynver/harness (or run setup), migrate artifacts, retire OPUS_HARNESS_ROOT.":r.opusHarnessRoot?"Prefer KYNVER_HARNESS_ROOT over OPUS_HARNESS_ROOT.":void 0,details:{harnessRoot:i,legacyRoot:a,opusHarnessRoot:l}},{id:"hotspot_openclaw_env_secrets",label:"OpenClaw deployment secrets in runner env",status:r.openclawCronSecret||r.openclawCronFireBaseUrl?"warn":"pass",summary:r.openclawCronSecret||r.openclawCronFireBaseUrl?[r.openclawCronSecret?"OPENCLAW_CRON_SECRET set":null,r.openclawCronFireBaseUrl?"OPENCLAW_CRON_FIRE_BASE_URL set":null].filter(Boolean).join("; "):"No OpenClaw cron env overrides on this runner",remediation:r.openclawCronSecret||r.openclawCronFireBaseUrl?"Move to KYNVER_API_URL + scoped runner tokens; unset OpenClaw cron env on user-hosted runners.":void 0},qS(r,{agentOsId:u??null,apiBaseUrl:t.apiBaseUrl?.trim()??r.kynverApiUrl??null,hasScopedRunnerToken:g,deploymentSchedulerProvider:t.deploymentSchedulerProvider==="qstash"||t.deploymentSchedulerProvider==="kynver-cron"||t.deploymentSchedulerProvider==="openclaw-cron"?t.deploymentSchedulerProvider:void 0}),{id:"hotspot_lease_source_names",label:"Harness lease/completion source names",status:"pass",summary:"Runtime uses kynver-harness:* lease owners and completion source kynver-harness (OpenClaw names retired in runtime)",details:{leaseOwnerPattern:"kynver-harness:<runId>",completionSource:"kynver-harness",note:"OpenClaw adapter remains optional in packages/kynver-openclaw-agent-os only"}}]}}function rw(e=GS){let r=[FB(e),HB(e),KB(e),$B(e),jB(e),VB(e),XS(e),GB(e)],t=WB(r),n=t.fail===0,o=n?t.warn>0?`Ready with ${t.warn} warning(s) \u2014 review remediation before retiring OpenClaw as primary runtime agent.`:"Ready \u2014 Kynver runtime can serve as primary runtime agent on this host.":`${t.fail} blocking check(s) \u2014 fix failures before OpenClaw takeover.`;return{command:"doctor runtime-takeover",ready:n,summary:o,counts:t,sections:r}}function tw(e={}){let r=[];if(e.remediate===!0||e.remediate==="true"){let n=xn();n.updated?r.push(`Remediated config fields: ${n.fields.join(", ")}`):r.push("Config backfill: no unambiguous legacy fields to persist"),n.skippedAmbiguous.length>0&&r.push(`Skipped ambiguous identity: ${n.skippedAmbiguous.join("; ")}`)}if(e.remediateDefaultRepo===!0){let n=zo();if(!n.ok){console.error(n.reason??"defaultRepo remediation failed"),n.remediation&&console.error(n.remediation),process.exitCode=1;return}n.remediated?r.push(`Remediated defaultRepo \u2192 ${n.resolved?.defaultRepo??"unknown"}`):r.push(`defaultRepo already persisted (${n.resolved?.defaultRepo??"unknown"})`)}let t=rw();r.length>0&&(t.notes=[...t.notes??[],...r]),console.log(JSON.stringify(t,null,2)),t.ready||(process.exitCode=1)}A();import{existsSync as ho,readFileSync as iw}from"node:fs";import{homedir as JB}from"node:os";import pp from"node:path";import{spawnSync as aw}from"node:child_process";Oe();var nw="24.11.0",Zs=">=24.11.0";function dp(e){let r=e.trim().replace(/^v/,""),t=/^(\d+)\.(\d+)\.(\d+)$/.exec(r);return t?{major:Number(t[1]),minor:Number(t[2]),patch:Number(t[3])}:null}function ow(e,r){return e.major!==r.major?e.major-r.major:e.minor!==r.minor?e.minor-r.minor:e.patch-r.patch}function YB(e){let r=e.trim().split(/\s+/),t=null,n=null;for(let o of r)if(o.startsWith(">="))t=dp(o.slice(2));else if(o.startsWith("<")){let s=o.slice(1);n=dp(s)??(/^\d+$/.test(s)?{major:Number(s),minor:0,patch:0}:null)}if(!t)throw new Error(`Unsupported node policy range: ${e}`);return{floor:t,below:n}}function go(e,r=Zs){let{floor:t,below:n}=YB(r),o=dp(e);if(!o)return{status:"invalid_version",currentVersion:e.trim(),requiredRange:r,remediation:`Node version could not be parsed as X.Y.Z (prereleases are unsupported). Install Node ${nw} or a later release within the supported range.`};let s=`${o.major}.${o.minor}.${o.patch}`;return ow(o,t)<0?{status:"upgrade_required",currentVersion:s,requiredRange:r,remediation:`Upgrade Node to >=${nw}. See docs/runbooks/node-24-fleet-migration.md for the per-host procedure.`}:n&&ow(o,n)>=0?{status:"unsupported_major",currentVersion:s,requiredRange:r,remediation:`Node ${o.major}.x is newer than this artifact's qualified range (${r}). Use a qualified Node major or wait for the next runtime qualification.`}:{status:"compatible",currentVersion:s,requiredRange:r,remediation:null}}rr();var lw=pp.join(JB(),".kynver"),boe=pp.join(lw,"config.json"),Jt=pp.join(lw,"credentials"),sw=(()=>{let e=process.env.KYNVER_DAEMON_STALL_MS?.trim(),r=e?parseInt(e,10):NaN;return Number.isFinite(r)&&r>0?r:900*1e3})();function qB(e){let r={pass:0,warn:0,fail:0};for(let t of e)for(let n of t.checks)r[n.status]+=1;return r}function Yt(e){return e.checks.some(r=>r.status==="fail")}function cw(e){try{let r=aw(process.platform==="win32"?"where":"which",[e],{encoding:"utf8",timeout:3e3});return r.status===0&&!!r.stdout?.trim()}catch{return!1}}function zB(){if(!ho(Jt))return{hasApiKey:!1};try{let e=JSON.parse(iw(Jt,"utf8"));return{hasApiKey:!!e.apiKey?.trim(),runnerToken:e.runnerToken?.trim()||void 0,runnerTokenAgentOsId:e.runnerTokenAgentOsId?.trim()||void 0}}catch{return{hasApiKey:!1}}}function XB(){let e=cw("kynver"),r=go(process.versions.node);return{id:"stage_1_install",label:"Stage 1 \u2014 Install",checks:[{id:"install_package_version",label:"@kynver-app/runtime version",status:"pass",summary:`@kynver-app/runtime ${sr} is running`,details:{version:sr}},{id:"install_node_runtime_policy",label:"Node runtime policy (report-only)",status:r.status==="compatible"?"pass":"warn",summary:r.status==="compatible"?`Node ${r.currentVersion} satisfies ${r.requiredRange}`:`Node ${r.currentVersion} \u2192 ${r.status} against ${r.requiredRange} (advisory during rollout)`,remediation:r.remediation??void 0,details:{status:r.status,requiredRange:r.requiredRange}},{id:"install_on_path",label:"kynver executable on PATH",status:e?"pass":"warn",summary:e?"kynver found on PATH \u2014 global install confirmed":"kynver not on PATH \u2014 running via node/npx (fine for first-timers)",remediation:e?void 0:"Install globally for a shorter command: `npm install -g @kynver-app/runtime`",details:{onPath:e}}]}}function QB(e,r){return{id:"stage_2_login",label:"Stage 2 \u2014 Device Login",checks:[{id:"login_credentials_file",label:"Credentials file present",status:ho(Jt)?"pass":"fail",summary:ho(Jt)?`${F(Jt)} exists`:`${F(Jt)} missing \u2014 not logged in`,remediation:ho(Jt)?void 0:r?`kynver login --api-base-url ${r}`:"kynver login --api-base-url https://your-kynver-site"},{id:"login_api_key",label:"API key present",status:e.hasApiKey?"pass":"fail",summary:e.hasApiKey?"API key found in credentials":"No API key \u2014 device login not completed",remediation:e.hasApiKey?void 0:r?`kynver login --api-base-url ${r}`:"kynver login --api-base-url https://your-kynver-site"}]}}function ZB(e,r,t=v(),n=process.env){let o=t.boxKind?.trim()||n.KYNVER_BOX_KIND?.trim()||"";return{id:"stage_3_workspace",label:"Stage 3 \u2014 Workspace Binding",checks:[{id:"workspace_api_base_url",label:"API base URL configured",status:r?"pass":"fail",summary:r?`apiBaseUrl = ${r}`:"apiBaseUrl not set \u2014 bootstrap required",remediation:r?void 0:"kynver bootstrap --api-base-url https://your-kynver-site",details:{apiBaseUrl:r??null}},{id:"workspace_agent_os_id",label:"AgentOS workspace bound",status:e?"pass":"fail",summary:e?`Workspace ${e} bound`:"agentOsId not set \u2014 workspace not bound",remediation:e?void 0:r?`kynver bootstrap --api-base-url ${r}`:"kynver bootstrap --api-base-url https://your-kynver-site",details:{agentOsId:e??null}},{id:"workspace_box_kind",label:"Box identity (boxKind) configured",status:o?"pass":"fail",summary:o?`boxKind = ${o}`:"boxKind not set \u2014 the daemon refuses to start without it",remediation:o?void 0:"kynver setup (persists boxKind=box for customer installs; operators: --box-kind forge|ghost)",details:{boxKind:o||null}}]}}function eW(e){let r=v(),t=Ye({config:r}),n=!!t?.repo,o=!!t?.persistedInConfig,s=[{id:"repo_configured",label:"Default repo configured",status:n?"pass":"fail",summary:n?o?`${F(t.repo)} (from config)`:`${F(t.repo)} (discovered \u2014 not persisted yet)`:"No default repo \u2014 kynver start requires --repo or a configured path",remediation:n?o?void 0:"kynver config ensure-default-repo":"kynver setup --repo /path/to/your/repo",details:{defaultRepo:t?.repo??null,source:t?.source??null,persistedInConfig:o}}];return n&&!o&&s.push({id:"repo_persisted",label:"Default repo persisted in ~/.kynver/config.json",status:"warn",summary:`Repo discovered via ${t?.source} but not saved to config \u2014 may not survive env changes`,remediation:"kynver config ensure-default-repo"}),n&&s.push(tW(t.repo,rW(t.repo))),{id:"stage_4_repo",label:"Stage 4 \u2014 Repo Selection",checks:s}}function rW(e){let r=o=>ee(e,["rev-parse","--verify","--quiet",`${o}^{commit}`]).status===0;if(r("origin/main"))return{originMainOk:!0,remoteHead:null,remoteHeadOk:!1};let t=ee(e,["symbolic-ref","--quiet","refs/remotes/origin/HEAD"]),n=t.status===0&&t.stdout.trim().replace(/^refs\/remotes\//,"")||null;return{originMainOk:!1,remoteHead:n,remoteHeadOk:n?r(n):!1}}function tW(e,r){return r.originMainOk?{id:"repo_base_ref",label:"Repo base ref (origin/main) resolvable",status:"pass",summary:`git rev-parse origin/main succeeds in ${F(e)}`,details:{baseRef:"origin/main"}}:r.remoteHeadOk&&r.remoteHead?{id:"repo_base_ref",label:"Repo base ref (origin/main) resolvable",status:"warn",summary:`origin/main not found \u2014 runs will fall back to the remote default branch ${r.remoteHead}`,remediation:"Fine as-is; to pin a different base, pass --base or set KYNVER_RUN_BASE_REF",details:{baseRef:r.remoteHead,fallback:!0}}:{id:"repo_base_ref",label:"Repo base ref (origin/main) resolvable",status:"fail",summary:`Neither origin/main nor a remote default branch resolves in ${F(e)} \u2014 new runs cannot be created`,remediation:`git -C ${e} fetch origin (then \`git -C ${e} remote set-head origin -a\` if the default branch is not main)`,details:{baseRef:null,remoteHead:r.remoteHead}}}function nW(e,r){let t=e.runnerToken,n=!!t?.startsWith("krc1."),o=e.runnerTokenAgentOsId,s=!r||!o||o===r,i=[{id:"credential_scoped_token",label:"Scoped runner token (krc1.*) present",status:n?"pass":"fail",summary:n?`Scoped token present (krc1.\u2026 for ${o??r??"workspace"})`:t?"Runner token present but not a krc1.* scoped token \u2014 re-mint required":"No runner token \u2014 mint one with `kynver runner credential`",remediation:n?void 0:r?`kynver runner credential --agent-os-id ${r}`:"kynver runner credential --agent-os-id <your-agent-os-id>",details:{hasToken:!!t,isScoped:n,tokenAgentOsId:o??null}}];return n&&!s&&i.push({id:"credential_workspace_match",label:"Runner token matches configured workspace",status:"warn",summary:`Token is for workspace ${o}, config expects ${r}`,remediation:r?`kynver runner credential --agent-os-id ${r}`:void 0,details:{tokenAgentOsId:o??null,configAgentOsId:r??null}}),{id:"stage_5_credential",label:"Stage 5 \u2014 Runner Credential",checks:i}}function oW(e){if(!e)return{id:"stage_6_daemon",label:"Stage 6 \u2014 Supervised Daemon",checks:[{id:"daemon_workspace_required",label:"Workspace required for daemon liveness check",status:"warn",summary:"agentOsId not set \u2014 cannot locate heartbeat file; complete stage 3 first"}]};let r=Gi(e),t=ho(r),n=!1,o=null,s=null;if(t)try{let a=JSON.parse(iw(r,"utf8"));a.observedAt&&(o=Date.now()-new Date(a.observedAt).getTime(),n=o<sw),s=a.pid??null}catch{}let i=[{id:"daemon_running",label:"Daemon running (heartbeat present)",status:t?"pass":"warn",summary:t?`Heartbeat file found: ${F(r)}`:`No heartbeat file at ${F(r)} \u2014 daemon not started`,remediation:t?void 0:"kynver start",details:{heartbeatPath:F(r),exists:t}}];return t&&i.push({id:"daemon_heartbeat_fresh",label:"Daemon heartbeat fresh",status:n?"pass":"warn",summary:n?`Last beat ${Math.round((o??0)/1e3)}s ago (pid ${s??"?"})`:o!==null?`Heartbeat is ${Math.round(o/6e4)}m old \u2014 daemon may be stalled`:"Cannot parse heartbeat timestamp",remediation:n?void 0:"kynver start # keeper will respawn the daemon",details:{ageMs:o,stallThresholdMs:sw,pid:s}}),{id:"stage_6_daemon",label:"Stage 6 \u2014 Supervised Daemon",checks:i}}var sW={cursor:["agent"],codex:["codex","hermes"],claude:["claude"]},iW={cursor:"Install the Cursor Agent CLI (https://cursor.com/docs/cli/headless), then `agent login` (or set CURSOR_API_KEY). Windows PowerShell: `irm 'https://cursor.com/install?win32=true' | iex`",codex:"Install the Codex CLI (https://developers.openai.com/codex/) and run `codex login`, or install `hermes` with the openai-codex provider",claude:"Install Claude Code (`npm install -g @anthropic-ai/claude-code`), then `claude login`"};function aW(e=v()){let r=(e.workerProvider?.trim()||"cursor").toLowerCase(),t=sW[r]??[],n=t.length>0,o=t.find(i=>cw(i))??null,s=null;if(o)try{let i=aw(o,["--version"],{encoding:"utf8",timeout:5e3});s=i.status===0?{ok:!0,detail:(i.stdout||i.stderr||"").trim().split(`
124
+ `),diagnostic:Hr(e)}}import vB from"node:path";M();se();E();se();E();function SS(e){let{worker:r,status:t,taskLease:n}=e,o=n?.leaseOwner??null;if(r.dispatched&&n){if(n.status==="running"&&o&&!ou(o,r.runId))return{health:"orphaned",reason:`task lease held by ${o}, expected harness run ${r.runId}`};let i=r.leaseToken?.trim()??"",a=n.leaseToken?.trim()??"";if(n.status==="running"&&i&&a&&i!==a)return{health:"orphaned",reason:"task leaseToken superseded on board \u2014 completion replay would fail"};if(n.status==="running"&&!t.alive&&!t.finalResult)return{health:"orphaned",reason:"board task running but worker process is not alive"}}if(r.status==="running"&&!t.alive&&!t.finalResult)return{health:"orphaned",reason:"worker.json still running but process is dead"};if(t.attention.state==="stale")return{health:"stale",reason:t.attention.reason};let s=t.lastHeartbeatAt?Date.parse(t.lastHeartbeatAt):NaN;return t.alive&&Number.isFinite(s)&&Date.now()-s>yn?{health:"stale",reason:`heartbeat older than ${Math.floor(yn/1e3)}s`}:t.alive&&r.pid&&!$(r.pid)?{health:"orphaned",reason:"pid recorded but process is not alive"}:n?.status==="running"&&!t.alive&&t.finalResult?{health:"healthy",reason:"finished worker awaiting completion replay"}:{health:"healthy",reason:t.attention.reason||"worker within expected lifecycle bounds"}}xe();E();import{existsSync as wS,mkdirSync as kB,readdirSync as yB,unlinkSync as RB}from"node:fs";import op from"node:path";function CS(){let{harnessRoot:e}=un(),r=op.join(e,"monitors");return kB(r,{recursive:!0}),r}function po(e,r){return r?`${_(e)}--${_(r)}`:_(e)}function sp(e){return op.join(CS(),`${e}.json`)}function mo(e){return P(sp(e),void 0)}function fo(e){ue(sp(e.monitorId),e)}function _S(e){let r=sp(e);return wS(r)?(RB(r),!0):!1}function xS(){let e=CS();if(!wS(e))return[];let r=[];for(let t of yB(e)){if(!t.endsWith(".json"))continue;let n=P(op.join(e,t),void 0);n?.monitorId&&r.push({monitorId:n.monitorId,runId:n.runId,workerName:n.workerName,agentOsId:n.agentOsId,pid:n.pid,alive:n.pid?$(n.pid):!1,startedAt:n.startedAt,pollMs:n.pollMs,logPath:n.logPath})}return r.sort((t,n)=>t.startedAt.localeCompare(n.startedAt))}se();function ip(e){let{worker:r,status:t}=e,n=[];r.localOnly&&n.push("local-only worker (no board linkage)"),(!r.agentOsId||!r.taskId)&&n.push("missing agentOsId/taskId linkage"),_a(r)&&n.push("completion already acknowledged"),r.completionBlocker&&n.push(r.completionBlocker),t.heartbeatBlocker&&t.alive&&n.push(`worker heartbeat blocker: ${t.heartbeatBlocker}`),t.attention.state==="blocked"&&n.push(t.attention.reason||"worker attention blocked"),Rn(t)&&n.push(t.attention.reason||"landing gate blocked");let o=ke(t),s;return o?t.finalResult?s="final_result":t.alive?s="terminal_status":s="process_exited":n.push("worker has not reached a terminal condition"),{eligible:o&&n.length===0,terminalVerified:o,terminalReason:s,blockers:n}}function ES(e,r){return P(vB.join(T(e),"workers",_(r),"worker.json"),void 0)}function PS(e,r){let t=H(e),n=Object.keys(t.workers||{});if(!r)return n;let o=_(r);return n.filter(s=>_(s)===o)}function IS(e,r){let t=H(e.runId),n=B(e,{base:t.base,baseCommit:t.baseCommit}),o=e.taskId?r.get(e.taskId)??null:null,s=SS({worker:e,status:n,taskLease:o}),i=ip({worker:e,status:n});return{runId:e.runId,worker:e.name,health:s.health,healthReason:s.reason,workerStatus:n.status,attentionState:n.attention.state,attentionReason:n.attention.reason,alive:n.alive,taskId:e.taskId,leaseOwner:o?.leaseOwner??void 0,taskStatus:o?.status,autoComplete:i,status:n}}async function Xs(e){let r=String(e.run||"");K(r,"--run");let t=e.name?String(e.name):void 0,n=e.agentOsId?String(e.agentOsId):void 0,o=H(r),s=PS(r,t),i=[];for(let p of s){let g=ES(r,p);g&&i.push(g)}let a=n||i.map(p=>p.agentOsId).find(p=>typeof p=="string"&&p.trim())||void 0,l=i.map(p=>p.taskId).filter(p=>!!p),c=await Kn({agentOsId:a,taskIds:l,baseUrl:e.baseUrl?String(e.baseUrl):void 0,secret:e.secret?String(e.secret):void 0}),u=i.map(p=>IS(p,c)),d;a&&e.renewLeases!==!1&&e.renewLeases!=="false"&&(d=await ba(r,{...e,agentOsId:a}));let m=[];if(e.autoComplete===!0||e.autoComplete==="true")for(let p of u){if(!p.autoComplete.eligible){m.push({worker:p.worker,outcome:"skipped",ok:!1,reason:p.autoComplete.blockers.join("; ")||"not eligible"});continue}let g=await Gn({run:r,name:p.worker,...a?{agentOsId:a}:{},...e.baseUrl?{baseUrl:String(e.baseUrl)}:{},...e.secret?{secret:String(e.secret)}:{}});m.push({worker:p.worker,outcome:g.outcome,ok:g.outcome==="completed",reason:g.reason})}return{runId:r,agentOsId:a,workers:u,leaseRenewal:d,autoCompleted:m}}function AS(e){let r=String(e.run||"");K(r,"--run");let t=e.name?String(e.name):void 0,n=PS(r,t),o=[];for(let s of n){let i=ES(r,s);i&&o.push(IS(i,new Map))}return{runId:r,workers:o,autoCompleted:[]}}function ap(){return xS()}function OS(e){let r=String(e.run||"");K(r,"--run");let t=po(r,e.name?String(e.name):void 0),n=mo(t);if(!n)return{monitorId:t,stopped:!1};if(n.pid&&$(n.pid))try{process.kill(n.pid,"SIGTERM")}catch{}return n.stoppedAt=new Date().toISOString(),fo(n),_S(t),{monitorId:t,stopped:!0,pid:n.pid}}async function lp(e){let r=String(e.run||""),t=String(e.name||"");K(r,"--run"),K(t,"--name");let n=Ee(r,t),o=H(r),s=B(n,{base:o.base,baseCommit:o.baseCommit}),i=ip({worker:n,status:s});if(!i.eligible){console.log(JSON.stringify({runId:r,worker:t,outcome:"blocked",blockers:i.blockers,terminalVerified:i.terminalVerified},null,2)),process.exitCode=1;return}let a=await Gn({...e,run:r,name:t});console.log(JSON.stringify(a,null,2)),a.outcome!=="completed"&&a.outcome!=="blocked"&&(process.exitCode=1)}E();var bB=5e3,SB=360*60*1e3;async function TS(e){let r=String(e.monitorId||""),t=Number(e.pollMs)>0?Math.floor(Number(e.pollMs)):bB,n=Number(e.maxTotalMs)>0?Math.floor(Number(e.maxTotalMs)):SB,o=Date.now();for(;Date.now()-o<=n;){let s=r?mo(r):void 0;if(s?.stoppedAt)break;let i=await Xs({...e,autoComplete:e.autoComplete??!0,renewLeases:e.renewLeases??!0}),a=Ul({monitorId:r,phase:"tick",...i});if(console.log(a.primary),a.diagnostic&&console.error(`[monitor diagnostic] ${a.diagnostic}`),i.workers.length>0&&i.workers.every(c=>c.autoComplete.terminalVerified&&(c.autoComplete.eligible||c.autoComplete.blockers.some(u=>u.includes("already acknowledged"))))&&i.autoCompleted.every(c=>c.ok||c.outcome==="skipped")){r&&s&&(s.stoppedAt=new Date().toISOString(),fo(s));break}ht(t)}}E();xe();import{spawn as wB}from"node:child_process";import{closeSync as NS,existsSync as CB,openSync as _B}from"node:fs";import xB from"node:path";function DS(e){let r=e.nodeExecutable??process.execPath,t=Hn({importMetaUrl:import.meta.url,explicitCliPath:e.cliPath,nodeExecutable:r});if(!t)return;let n=t.cliPath;if(!CB(n))return;let o=po(e.runId,e.workerName),{harnessRoot:s}=un(),i=xB.join(s,"monitors",`${o}.log`),a;try{a=_B(i,"a")}catch{a=void 0}let l=e.pollMs??5e3,c=[...t.argsPrefix,"monitor","run-loop","--run",e.runId,"--monitor-id",o,"--poll-ms",String(l),"--auto-complete","true","--renew-leases","true"];e.workerName&&c.push("--name",e.workerName),e.agentOsId&&c.push("--agent-os-id",e.agentOsId),e.baseUrl&&c.push("--base-url",e.baseUrl),e.secret&&c.push("--secret",e.secret);let u=["ignore",a??"ignore",a??"ignore"];try{let d=wB(t.command,c,pe({detached:!0,stdio:u,env:process.env}));a!==void 0&&NS(a),d.unref();let m={monitorId:o,runId:e.runId,workerName:e.workerName,agentOsId:e.agentOsId,pid:d.pid,startedAt:new Date().toISOString(),pollMs:l,logPath:i};return fo(m),{monitorId:o,pid:d.pid,logPath:i,session:m}}catch{if(a!==void 0)try{NS(a)}catch{}return}}E();async function MS(e){let r=String(e.run||"");K(r,"--run");let t=e.name?String(e.name):void 0,n=po(r,t),o=mo(n);if(o?.pid&&!o.stoppedAt)return{monitorId:n,session:o,spawned:!1,pid:o.pid};let s=DS({runId:r,workerName:t,agentOsId:e.agentOsId?String(e.agentOsId):void 0,pollMs:Number(e.pollMs)>0?Math.floor(Number(e.pollMs)):void 0,baseUrl:e.baseUrl?String(e.baseUrl):void 0,secret:e.secret?String(e.secret):void 0});if(!s)throw new Error("failed to spawn monitor sidecar (cli.js missing or spawn error)");return{monitorId:n,session:s.session,spawned:!0,pid:s.pid}}async function LS(e){if(String(e.run||"")){let t=e.tick===!0||e.tick==="true"?await Xs({...e,autoComplete:!1}):AS(e);console.log(JSON.stringify(t,null,2));return}console.log(JSON.stringify({monitors:ap()},null,2))}function US(e){console.log(JSON.stringify(OS(e),null,2))}function BS(){console.log(JSON.stringify({monitors:ap()},null,2))}async function WS(e){await TS(e)}async function FS(e){let r=await Xs(e);console.log(JSON.stringify(r,null,2))}function EB(e){let r={};for(let[t,n]of Object.entries(e))n?.version&&(r[t]={version:n.version,source:"installed",path:n.path});return r}async function PB(e={}){let[r,t]=await Promise.all([kl(),Promise.resolve(Gv({cwd:e.cwd,repoRoot:e.repoRoot}))]),n={},o=e.selfPackageName==="@kynver-app/runtime"&&e.selfVersion?e.selfVersion:sr;return n["@kynver-app/runtime"]={version:o,source:"self"},e.selfPackageName&&e.selfVersion&&e.selfPackageName!=="@kynver-app/runtime"&&(n[e.selfPackageName]={version:e.selfVersion,source:"self"}),{installed:EB(r),repo:t,self:n,undetectedPolicy:"skip"}}async function HS(e={}){let r=await PB(e);return Jv(r)}function KS(e,r){return e?e==="daemon"||e==="start"||e==="worker"||e==="monitor"||e==="run"&&(r==="dispatch"||r==="sweep"||r==="reconcile"||r==="unblock")||e==="cron"&&r==="tick":!1}E();function IB(e){let r=e.trim();return r?js().find(n=>n.name===r&&n.status!=="completed")??null:null}function $S(e){let r=String(K(String(e.name||""),"--name")),t=IB(r);console.log(JSON.stringify({runId:t?.id??null,name:r,status:t?.status??null,effectiveStatus:t?.effectiveStatus??null},null,2))}M();se();E();A();import AB from"node:path";function Qs(e,r,t,n,o,s){return{runId:e,worker:r,taskId:t,agentOsId:n,leaseOwner:o,action:"skipped",reason:s}}async function OB(e){let r=L(e.baseUrl?String(e.baseUrl):void 0),t=e.agentOsId?String(e.agentOsId).trim():null,n=e.dryRun===!0||e.dryRun==="true",o=[],s=[],i=[];for(let a of ne())for(let l of Object.keys(a.workers??{})){let c=AB.join(T(a.id),"workers",_(l),"worker.json"),u=P(c,void 0);if(!u){s.push(Qs(a.id,l,"","","","worker.json missing"));continue}let d=u.taskId??"",m=u.agentOsId??"",f=u.leaseOwner??"";if(!u.dispatched||!d||!m||!f){s.push(Qs(a.id,l,d,m,f,"not a fully-leased dispatched worker"));continue}if(t&&m!==t)continue;if(u.completionReportedAt){s.push(Qs(a.id,l,d,m,f,"completion already reported"));continue}let p=B(u);if(p.finalResult){s.push(Qs(a.id,l,d,m,f,"has final result \u2014 let pipeline tick complete it"));continue}if(p.alive){s.push(Qs(a.id,l,d,m,f,"worker process is still alive"));continue}if(n){o.push({runId:a.id,worker:l,taskId:d,agentOsId:m,leaseOwner:f,action:"released",reason:"dry-run: would release dead dispatched worker lease"});continue}try{let g=await q(e.secret?String(e.secret):void 0,m,{baseUrl:r}),y=`${r}/api/agent-os/by-id/${encodeURIComponent(m)}/tasks/${encodeURIComponent(d)}/release`,k=await te(y,g,{agentOsId:m,leaseOwner:f,...u.leaseToken?.trim()?{leaseToken:u.leaseToken.trim()}:{}},{agentOsId:m,baseUrl:r});k.ok===!0||k.response?.ok===!0?o.push({runId:a.id,worker:l,taskId:d,agentOsId:m,leaseOwner:f,action:"released",reason:"dead dispatched worker lease released; task requeued"}):s.push({runId:a.id,worker:l,taskId:d,agentOsId:m,leaseOwner:f,action:"skipped",reason:`release returned ok:false (likely owner mismatch or already released): HTTP ${k.status}`})}catch(g){i.push({runId:a.id,worker:l,taskId:d,agentOsId:m,leaseOwner:f,action:"error",reason:g.message})}}return{dryRun:n,released:o,skipped:s,errors:i}}async function jS(e){let r=await OB(e),t={ok:r.errors.length===0,dryRun:r.dryRun,released:r.released.length,skipped:r.skipped.length,errors:r.errors.length,details:r};console.log(JSON.stringify(t,null,2)),r.errors.length>0&&process.exit(1)}Wi();import ew from"node:path";rr();A();import{accessSync as TB,constants as NB,existsSync as up,readFileSync as DB}from"node:fs";import{homedir as Bl}from"node:os";import Wl from"node:path";import{spawnSync as MB}from"node:child_process";xe();function cp(e,r){try{let t=MB(e,r,{encoding:"utf8"}),n=(t.stdout||"").trim(),o=(t.stderr||"").trim();return{ok:t.status===0,stdout:n,stderr:o,error:t.error?.message}}catch(t){return{ok:!1,stdout:"",stderr:"",error:t.message}}}function VS(e){let r=e?.trim();if(r)return r.length<=12?`${r}\u2026`:`${r.slice(0,12)}\u2026`}function LB(e){if(!up(e))return!1;try{return TB(e,NB.W_OK),!0}catch{return!1}}var GS={packageVersion:()=>sr,commandOnPath:e=>cp(process.platform==="win32"?"where":"which",[e]),kynverVersion:e=>cp(e,["--version"]),loadConfig:()=>v(),configFilePath:()=>Wl.join(Bl(),".kynver","config.json"),credentialsFilePath:()=>Wl.join(Bl(),".kynver","credentials"),readCredentials:()=>{let e=Wl.join(Bl(),".kynver","credentials");if(!up(e))return{hasApiKey:!1};try{let r=JSON.parse(DB(e,"utf8"));return{hasApiKey:!!r.apiKey?.trim(),runnerTokenPrefix:VS(r.runnerToken),runnerTokenAgentOsId:r.runnerTokenAgentOsId}}catch{return{hasApiKey:!1}}},envSnapshot:()=>({kynverApiUrl:process.env.KYNVER_API_URL?.trim()||void 0,openclawCronFireBaseUrl:process.env.OPENCLAW_CRON_FIRE_BASE_URL?.trim()||void 0,kynverRunnerTokenPrefix:VS(process.env.KYNVER_RUNNER_TOKEN),kynverRuntimeSecret:!!process.env.KYNVER_RUNTIME_SECRET?.trim(),openclawCronSecret:!!process.env.OPENCLAW_CRON_SECRET?.trim(),kynverHarnessRoot:process.env.KYNVER_HARNESS_ROOT?.trim()||void 0,opusHarnessRoot:process.env.OPUS_HARNESS_ROOT?.trim()||void 0,kynverSchedulerProvider:process.env.KYNVER_SCHEDULER_PROVIDER?.trim()||void 0,openclawCronStorePath:!!(process.env.KYNVER_CRON_STORE_PATH?.trim()||process.env.OPENCLAW_CRON_STORE_PATH?.trim()),kynverCronDaemonPrimary:ta(),qstashTokenPresent:!!process.env.QSTASH_TOKEN?.trim(),kynverHostedDeployment:(()=>{let e=process.env.KYNVER_HOSTED_DEPLOYMENT?.trim().toLowerCase();return e==="1"||e==="true"||e==="yes"})()}),harnessRoot:()=>he(),legacyOpenclawHarnessRoot:()=>Wl.join(Bl(),".openclaw","harness"),pathExists:e=>up(e),pathWritable:e=>LB(e),ghAuthToken:()=>cp("gh",["auth","token"]),deployEvidenceNeedsGithub:()=>{let e=process.env.KYNVER_HOSTED_DEPLOYMENT?.trim().toLowerCase();return!(e==="1"||e==="true"||e==="yes")}};function YS(e,r){return e.kynverSchedulerProvider==="openclaw-cron"||r.deploymentSchedulerProvider==="openclaw-cron"}function UB(e,r){return e.kynverSchedulerProvider==="kynver-cron"||r.deploymentSchedulerProvider==="kynver-cron"}function JS(e){return!!e.openclawCronStorePath}function BB(e,r){return e.kynverSchedulerProvider==="qstash"||r.deploymentSchedulerProvider==="qstash"}function qS(e,r){let t={schedulerProvider:e.kynverSchedulerProvider??null,deploymentSchedulerProvider:r.deploymentSchedulerProvider??null,openclawCronStorePath:!!e.openclawCronStorePath,kynverCronDaemonPrimary:!!e.kynverCronDaemonPrimary},n=!!r.agentOsId?.trim()&&!!r.apiBaseUrl?.trim()&&r.hasScopedRunnerToken;if(BB(e,r)&&!YS(e,r)){let u=e.kynverSchedulerProvider==="qstash"?"KYNVER_SCHEDULER_PROVIDER=qstash on this host":"deploymentSchedulerProvider=qstash in ~/.kynver/config.json";return{id:"hotspot_openclaw_scheduler",label:"Scheduler provider (runtime daemon vs OpenClaw cron)",status:"pass",summary:`AgentOS scheduler cut over to QStash (${u})`,details:t}}if(UB(e,r)&&!YS(e,r)){if(JS(e)&&e.kynverCronDaemonPrimary&&n)return{id:"hotspot_openclaw_scheduler",label:"Scheduler provider (runtime daemon vs OpenClaw cron)",status:"pass",summary:"Kynver Cron local store present; `kynver daemon` owns schedule fires (kynver-cron tick loop)",details:{...t,dispatchPath:"kynver-daemon-cron-tick",kynverCronDaemonPrimary:!0}};let u=e.kynverSchedulerProvider==="kynver-cron"?"KYNVER_SCHEDULER_PROVIDER=kynver-cron on this host":"deploymentSchedulerProvider=kynver-cron in ~/.kynver/config.json";return{id:"hotspot_openclaw_scheduler",label:"Scheduler provider (runtime daemon vs OpenClaw cron)",status:"pass",summary:`AgentOS scheduler owned by Kynver Cron (${u})`,details:t}}if(JS(e)){if(e.kynverCronDaemonPrimary&&n)return{id:"hotspot_openclaw_scheduler",label:"Scheduler provider (runtime daemon vs OpenClaw cron)",status:"pass",summary:"Kynver Cron local store present; `kynver daemon` owns schedule fires (kynver-cron tick loop)",details:{...t,dispatchPath:"kynver-daemon-cron-tick",kynverCronDaemonPrimary:!0}};let u=[];return e.openclawCronStorePath&&u.push("KYNVER_CRON_STORE_PATH or OPENCLAW_CRON_STORE_PATH set (local cron store)"),{id:"hotspot_openclaw_scheduler",label:"Scheduler provider (runtime daemon vs OpenClaw cron)",status:"warn",summary:`Local cron store without daemon tick (${u.join("; ")})`,remediation:"Run `kynver daemon` with KYNVER_CRON_SECRET + KYNVER_API_URL (or KYNVER_CRON_FIRE_BASE_URL) so the daemon-owned cron tick fires schedules. On hosted deploys use QStash (KYNVER_SCHEDULER_PROVIDER=qstash). Legacy OpenClaw cron env aliases still work during cutover.",details:t}}let o=e.kynverSchedulerProvider==="openclaw-cron",s=r.deploymentSchedulerProvider==="openclaw-cron",i=e.kynverSchedulerProvider==="qstash",a=!!e.qstashTokenPresent||!!e.kynverHostedDeployment,l=a&&!n,c=l&&e.kynverSchedulerProvider==="openclaw-cron";return s&&!o?{id:"hotspot_openclaw_scheduler",label:"Scheduler provider (runtime daemon vs OpenClaw cron)",status:"warn",summary:"deploymentSchedulerProvider=openclaw-cron in ~/.kynver/config.json \u2014 migrate to kynver-cron or qstash",remediation:'Run `kynver scheduler attest-cutover` or set deploymentSchedulerProvider to "kynver-cron" or "qstash" in ~/.kynver/config.json.',details:t}:n&&o?{id:"hotspot_openclaw_scheduler",label:"Scheduler provider (runtime daemon vs OpenClaw cron)",status:"warn",summary:"KYNVER_SCHEDULER_PROVIDER=openclaw-cron on this runner \u2014 dispatch is owned by kynver daemon; unset the OpenClaw override",remediation:"Unset KYNVER_SCHEDULER_PROVIDER on user runners (or set kynver-cron). Use `kynver daemon` (pipeline-tick \u2192 operator/tick). On the Kynver server set KYNVER_SCHEDULER_PROVIDER=qstash when QStash is configured.",details:{schedulerProvider:e.kynverSchedulerProvider??null,dispatchPath:"kynver-daemon-pipeline-tick",hostedDeployment:a}}:n?{id:"hotspot_openclaw_scheduler",label:"Scheduler provider (runtime daemon vs OpenClaw cron)",status:"pass",summary:i?"Runner override qstash present; hosted dispatch still owned by kynver daemon pipeline-tick":"Hosted dispatch owned by kynver daemon (pipeline-tick \u2192 operator/tick); no OpenClaw cron on runner",details:{schedulerProvider:e.kynverSchedulerProvider??null,dispatchPath:"kynver-daemon-pipeline-tick",hostedDeployment:a}}:o?{id:"hotspot_openclaw_scheduler",label:"Scheduler provider (runtime daemon vs OpenClaw cron)",status:"warn",summary:"KYNVER_SCHEDULER_PROVIDER=openclaw-cron on this runner \u2014 hosted dispatch still depends on the OpenClaw local-cron adapter",remediation:"Unset KYNVER_SCHEDULER_PROVIDER on user runners (or set kynver-cron). Use `kynver daemon` (pipeline-tick \u2192 operator/tick). On the Kynver server set KYNVER_SCHEDULER_PROVIDER=qstash when QStash is configured.",details:{schedulerProvider:e.kynverSchedulerProvider??null,hostedDeployment:a}}:c?{id:"hotspot_openclaw_scheduler",label:"Scheduler provider (runtime daemon vs OpenClaw cron)",status:"warn",summary:"Hosted deployment has KYNVER_SCHEDULER_PROVIDER=openclaw-cron \u2014 AgentOS scheduled ticks should use QStash or kynver-cron",remediation:"Set QSTASH_TOKEN and KYNVER_SCHEDULER_PROVIDER=qstash on the Kynver server (or kynver-cron for Kynver-owned local scheduling). User runners use `kynver daemon` for dispatch and should not set a scheduler provider.",details:{schedulerProvider:e.kynverSchedulerProvider??null,qstashTokenPresent:e.qstashTokenPresent??!1,hostedDeployment:a}}:l&&e.qstashTokenPresent&&!e.kynverSchedulerProvider?{id:"hotspot_openclaw_scheduler",label:"Scheduler provider (runtime daemon vs OpenClaw cron)",status:"pass",summary:"QSTASH_TOKEN present; hosted scheduler auto-selects qstash (explicit KYNVER_SCHEDULER_PROVIDER=qstash optional)",details:{schedulerProvider:null,qstashTokenPresent:!0,hostedDeployment:a}}:l&&!e.qstashTokenPresent&&!e.kynverSchedulerProvider?{id:"hotspot_openclaw_scheduler",label:"Scheduler provider (runtime daemon vs OpenClaw cron)",status:"warn",summary:"Hosted deployment with no QSTASH_TOKEN and no KYNVER_SCHEDULER_PROVIDER \u2014 kynver-cron is an in-process stub here and will NOT fire; no firing scheduler is configured",remediation:"Set QSTASH_TOKEN + KYNVER_SCHEDULER_PROVIDER=qstash on the Kynver server for hosted AgentOS schedules. Only use kynver-cron when a `kynver daemon` (or local cron store) actually owns firing on this box.",details:{schedulerProvider:null,resolvedFallback:"none",qstashTokenPresent:!1,hostedDeployment:a}}:l&&!e.qstashTokenPresent&&e.kynverSchedulerProvider&&e.kynverSchedulerProvider!=="qstash"&&e.kynverSchedulerProvider!=="kynver-cron"?{id:"hotspot_openclaw_scheduler",label:"Scheduler provider (runtime daemon vs OpenClaw cron)",status:"warn",summary:`Hosted deployment without QSTASH_TOKEN (KYNVER_SCHEDULER_PROVIDER=${e.kynverSchedulerProvider}) \u2014 use qstash or kynver-cron`,remediation:"Set QSTASH_TOKEN and KYNVER_SCHEDULER_PROVIDER=qstash on the Kynver server, or kynver-cron for Kynver-owned local scheduling. User runners use `kynver daemon` for dispatch.",details:{schedulerProvider:e.kynverSchedulerProvider??null,qstashTokenPresent:e.qstashTokenPresent??!1,hostedDeployment:a}}:e.kynverSchedulerProvider?{id:"hotspot_openclaw_scheduler",label:"Scheduler provider (runtime daemon vs OpenClaw cron)",status:"pass",summary:`KYNVER_SCHEDULER_PROVIDER=${e.kynverSchedulerProvider}`,details:{schedulerProvider:e.kynverSchedulerProvider??null}}:{id:"hotspot_openclaw_scheduler",label:"Scheduler provider (runtime daemon vs OpenClaw cron)",status:"pass",summary:"No KYNVER_SCHEDULER_PROVIDER on runner (expected) \u2014 finish runner setup so daemon pipeline-tick owns dispatch",details:{schedulerProvider:null,dispatchPath:"kynver-daemon-pipeline-tick-pending"}}}nr();Fo();_t();Li();bc();function zS(e,r={}){let t=bn(),n=Ui(e,t),o=[],s=r.envFilePath??be,i=Bi(e,{envFilePath:s,systemdUnitActive:r.systemdUnitActive});if(o.push({id:"daemon_supervision_owner",ok:!!e.daemonSupervisionOwner||i.effectivelyConfigured,summary:e.daemonSupervisionOwner?`daemonSupervisionOwner=${e.daemonSupervisionOwner} (${t})`:i.owner?`daemonSupervisionOwner inferred as ${i.owner} from healthy supervision signals \u2014 run \`kynver setup\` to persist`:"daemonSupervisionOwner unset \u2014 run `kynver setup` to persist Kynver-owned restart policy",remediation:e.daemonSupervisionOwner||i.effectivelyConfigured?e.daemonSupervisionOwner?void 0:"Run `kynver setup` or `kynver doctor runtime-takeover --remediate` to persist daemonSupervisionOwner.":"Run `kynver setup` (or `kynver bootstrap`) on this box."}),o.push({id:"daemon_present_signal",ok:i.daemonPresentSignal||i.systemdUnitActive,summary:i.systemdUnitActive?"systemd user unit active \u2014 local daemon supervision is healthy":i.daemonPresentSignal?`KYNVER_CRON_DAEMON_PRESENT=1 (persisted in ${s})`:`KYNVER_CRON_DAEMON_PRESENT not set in persisted env (${s})`,remediation:i.daemonPresentSignal||i.systemdUnitActive?void 0:"Run `kynver setup` or `kynver start` once to write ~/.kynver/.env supervision keys."}),n==="systemd"){let l=Sn();o.push({id:"systemd_user_unit",ok:l,summary:l?"systemd user unit present (~/.config/systemd/user/kynver-cron-daemon.service)":"daemonSupervisionOwner=systemd but user unit missing",remediation:l?void 0:"Run `kynver start --install-systemd` or `kynver cron install --install-systemd`."})}let a=Rc(t,n);return o.push({id:"supervision_guidance",ok:!0,summary:a[0]??"Kynver keeper supervises daemon restarts by default."}),o}Fo();_t();function XS(e){let r=e.loadConfig(),t=bn(),n=Ui(r,t),s=zS(r,{systemdUnitActive:e.systemdDaemonActive}).map(i=>({id:i.id,label:i.id.replace(/_/g," "),status:i.ok?"pass":i.id==="daemon_supervision_owner"||i.id==="daemon_present_signal"?"warn":"fail",summary:i.summary,remediation:i.remediation}));return s.push({id:"daemon_keeper_default",label:"Kynver keeper owns in-process restarts",status:n==="keeper"||n==="systemd"?"pass":"warn",summary:n==="systemd"?"systemd persists the keeper parent \u2014 Hermes/OpenClaw cron is not required to restart the daemon":"`kynver start` / `kynver daemon` run the keeper by default (opt out with --no-supervise only when an external supervisor owns restarts)",details:{owner:n,hostKind:t}}),{id:"daemon_supervision",label:"Daemon restart supervision",checks:s}}function QS(e){if(e.envGithubToken)return{viable:!0,source:"env",summary:"GITHUB_TOKEN present for GitHub commit-status evidence"};if(e.envGhToken)return{viable:!0,source:"env",summary:"GH_TOKEN present for GitHub commit-status evidence"};let r=e.ghAuthToken();return r.ok&&r.stdout.trim().length>0?{viable:!0,source:"gh-cli",summary:"GitHub CLI authenticated (`gh auth login`) for commit-status evidence"}:{viable:!1,source:"missing",summary:"No GITHUB_TOKEN/GH_TOKEN and `gh auth token` unavailable"}}function ZS(e,r){let t=e.commandOnPath("vercel"),n=t.ok,o=!!process.env.VERCEL_TOKEN?.trim(),s=QS(r),i=e.deployEvidenceNeedsGithub?.()??!0,a=[{id:"vercel_global_cli_absent",label:"Global Vercel CLI not installed",status:n?"warn":"pass",summary:n?`Global Vercel CLI on PATH (${t.stdout||"vercel"}) \u2014 Vercel is decommissioned; nothing should call it`:"No global Vercel CLI on PATH",remediation:n?"Uninstall the global Vercel CLI (`npm uninstall -g vercel`) \u2014 Vercel was decommissioned in the 2026-08 Railway cutover; deploy evidence comes from production /api/version + GitHub.":void 0,details:{path:n&&t.stdout||null}}];return i?a.push({id:"github_token_for_deploy_evidence",label:"GitHub token for deploy evidence",status:s.viable?"pass":"warn",summary:s.viable?s.summary:"No GitHub auth \u2014 deploy-evidence lookups (commit status, production /api/version ancestry compare) need GITHUB_TOKEN/GH_TOKEN or `gh auth login`",remediation:s.viable?void 0:"Export GITHUB_TOKEN (or GH_TOKEN) or run `gh auth login` for PR commit-status and ancestry lookups.",details:{source:s.source}}):a.push({id:"github_token_for_deploy_evidence",label:"GitHub token for deploy evidence",status:"pass",summary:"Skipped \u2014 no enabled workflow on this host requires GitHub deploy evidence",details:{skipped:!0,reason:"workflow_not_enabled"}}),a.push({id:"vercel_token_absent",label:"No stale VERCEL_TOKEN",status:o?"warn":"pass",summary:o?"VERCEL_TOKEN is set but obsolete \u2014 Vercel is decommissioned; nothing reads it":"VERCEL_TOKEN not set (Vercel decommissioned)",remediation:o?"Revoke the token in the Vercel dashboard and remove VERCEL_TOKEN from this host's environment.":void 0,details:{vercelTokenPresent:o}}),{id:"deploy_evidence",label:"Deploy evidence (Railway era)",checks:a}}function WB(e){let r={pass:0,warn:0,fail:0};for(let t of e)for(let n of t.checks)r[n.status]+=1;return r}function FB(e){let r=e.packageVersion(),t=e.commandOnPath("kynver"),n=t.ok&&t.stdout.length>0,o=n?t.stdout.split(/\r?\n/)[0]?.trim():void 0,s=o?F(o):void 0,i=[{id:"cli_running_version",label:"Running @kynver-app/runtime version",status:"pass",summary:`@kynver-app/runtime ${r}`,details:{version:r}},{id:"cli_on_path",label:"kynver executable on PATH",status:n?"pass":"warn",summary:n?`Found ${s}`:"kynver not found on PATH (invoked via node/npx?)",remediation:n?void 0:"Install globally (`npm i -g @kynver-app/runtime`) or invoke via `npx @kynver-app/runtime`.",details:{path:s}}];if(n&&o){let a=e.kynverVersion(o),l=a.stdout.replace(/^kynver\s+/i,"").trim()||void 0,c=a.ok&&(!l||l===r);i.push({id:"cli_installed_version",label:"Installed kynver CLI version matches running package",status:c?"pass":"warn",summary:a.ok&&l?c?`Installed ${l}`:`Installed ${l} differs from running ${r}`:a.error?`Could not read installed version (${a.error})`:a.stderr||"Could not read installed version",remediation:c?void 0:"Reinstall or rebuild @kynver-app/runtime so PATH kynver matches the harness worktree version.",details:{installedVersion:l,runningVersion:r,path:s}})}return{id:"cli_package",label:"CLI / package",checks:i}}function HB(e){let r=e.configFilePath(),t=F(r),n=e.pathExists(r),o=e.loadConfig(),s=[{id:"config_file",label:"~/.kynver/config.json present",status:n?"pass":"fail",summary:n?`Found ${t}`:`Missing ${t}`,remediation:n?void 0:"Run `kynver setup --api-base-url <url> --agent-os-id <id> --repo <path>`.",details:{configPath:t}}];if(n){let i=o.apiBaseUrl?.trim(),a=o.agentOsId?.trim(),l=Ye({config:o}),c=l?qo(l):null,u=Qf(l);s.push({id:"config_api_base_url",label:"Default API base URL",status:i?"pass":"warn",summary:i??"Not set in config (KYNVER_API_URL / --base-url required per command)",remediation:i?void 0:"Set `apiBaseUrl` via `kynver setup --api-base-url https://\u2026`.",details:{apiBaseUrl:i??null}},{id:"config_agent_os_id",label:"Default AgentOS id",status:a?"pass":"warn",summary:a??"Not set (pass --agent-os-id on daemon/dispatch/worker commands)",remediation:a?void 0:"Set `agentOsId` via `kynver setup --agent-os-id <uuid>`.",details:{agentOsId:a??null,agentOsSlug:o.agentOsSlug??null}},{id:"config_default_repo",label:"Default repo path",status:u.status,summary:l?l.persistedInConfig?`${c.defaultRepo} (config)`:`${c.defaultRepo} (${l.source}, not persisted in ~/.kynver/config.json)`:"Not set in ~/.kynver/config.json (`kynver run create` requires --repo)",remediation:u.remediation,details:{defaultRepo:c?.defaultRepo??null,source:c?.source??null,persistedInConfig:c?.persistedInConfig??!1,harnessRoot:o.harnessRoot?Me(o.harnessRoot):null}})}return{id:"user_config",label:"User config (~/.kynver)",checks:s}}function KB(e){let t=e.loadConfig().agentOsId?.trim(),n=e.readCredentials(),o=e.envSnapshot(),s=e.credentialsFilePath(),i=F(s),a=o.kynverRunnerTokenPrefix,l=n.runnerTokenPrefix,c=n.runnerTokenAgentOsId,u=!!l&&(!t||!c||c===t),d=!!a?.startsWith("krc1.")||u&&l?.startsWith("krc1.");return{id:"runner_token",label:"Runner token readiness",checks:[{id:"runner_token_scoped",label:"Scoped runner token (krc1.*) ready",status:d?"pass":"fail",summary:d?a?"KYNVER_RUNNER_TOKEN is set (scoped prefix shown)":`Saved scoped token for agentOsId ${c??t??"(unknown)"}`:"No scoped runner token for the configured AgentOS workspace",remediation:d?void 0:"Run `kynver login` then `kynver runner credential --agent-os-id <id>` (or `kynver setup` with API key).",details:{source:a?"env":l?"credentials":"none",tokenPrefix:a??(u?l:void 0),agentOsId:t??c??null,credentialsPath:i}},{id:"runner_token_agent_os_match",label:"Saved runner token matches configured agentOsId",status:!l||!t||!c||c===t?"pass":"warn",summary:!l||!c?"No saved token agentOsId to compare":t?c===t?"Saved token scoped to configured agentOsId":`Saved token is for ${c}, config expects ${t}`:"Config agentOsId unset \u2014 token scope not validated against config",remediation:l&&t&&c&&c!==t?"`kynver runner credential --agent-os-id <configured-id>` to mint a workspace-bound token.":void 0,details:{configuredAgentOsId:t??null,savedAgentOsId:c??null}},{id:"runner_api_key_for_refresh",label:"API key available for token refresh",status:n.hasApiKey||process.env.KYNVER_API_KEY?.trim()?"pass":"warn",summary:n.hasApiKey||process.env.KYNVER_API_KEY?"KYNVER API key present for runner credential mint/refresh":"No API key \u2014 401 callback recovery cannot auto-mint a replacement token",remediation:n.hasApiKey||process.env.KYNVER_API_KEY?void 0:"Run `kynver login --api-key \u2026`.",details:{credentialsPath:i,hasApiKey:n.hasApiKey||!!process.env.KYNVER_API_KEY}}]}}function $B(e){return ZS(e,{envGithubToken:!!process.env.GITHUB_TOKEN?.trim(),envGhToken:!!process.env.GH_TOKEN?.trim(),ghAuthToken:()=>e.ghAuthToken()})}function jB(e){let r=e.harnessRoot(),t=ew.join(r,"runs"),n=ew.join(r,"worktrees"),o=Me(r),s=Me(t),i=Me(n),a=e.pathExists(t),l=e.pathExists(n);return{id:"harness_dirs",label:"Harness / daemon directories",checks:[{id:"harness_root",label:"Harness root resolved",status:"pass",summary:o,details:{harnessRoot:o}},{id:"harness_runs_dir",label:"Runs directory ready",status:a&&e.pathWritable(t)?"pass":"warn",summary:a?e.pathWritable(t)?`Writable ${s}`:`Exists but not writable: ${s}`:`Will be created on first run: ${s}`,remediation:a&&!e.pathWritable(t)?`Fix permissions on ${s} or set KYNVER_HARNESS_ROOT to a writable path.`:void 0,details:{runsDir:s,exists:a,writable:e.pathWritable(t)}},{id:"harness_worktrees_dir",label:"Worktrees directory ready",status:l&&e.pathWritable(n)?"pass":"warn",summary:l?e.pathWritable(n)?`Writable ${i}`:`Exists but not writable: ${i}`:`Will be created on first worker: ${i}`,remediation:l&&!e.pathWritable(n)?`Fix permissions on ${i}.`:void 0,details:{worktreesDir:i,exists:l,writable:e.pathWritable(n)}}]}}function VB(e){let r=e.loadConfig(),t=e.envSnapshot(),n=t.kynverApiUrl??r.apiBaseUrl?.trim()??t.openclawCronFireBaseUrl,o=!t.kynverApiUrl&&!r.apiBaseUrl&&!!t.openclawCronFireBaseUrl,s=t.openclawCronSecret||t.kynverRuntimeSecret,i=t.kynverRunnerTokenPrefix?.startsWith("krc1."),l=e.readCredentials().runnerTokenPrefix?.startsWith("krc1.");return{id:"callback_auth",label:"Callback auth / config",checks:[{id:"callback_base_url",label:"Callback base URL configured",status:n?o?"warn":"pass":"fail",summary:n?o?`Using legacy OPENCLAW_CRON_FIRE_BASE_URL (${n})`:n:"No KYNVER_API_URL, config apiBaseUrl, or legacy OpenClaw base URL",remediation:n?o?"Migrate to KYNVER_API_URL or `kynver setup --api-base-url` and drop OPENCLAW_CRON_FIRE_BASE_URL.":void 0:"Set KYNVER_API_URL or run `kynver setup --api-base-url https://\u2026`.",details:{source:t.kynverApiUrl?"KYNVER_API_URL":r.apiBaseUrl?"config.apiBaseUrl":t.openclawCronFireBaseUrl?"OPENCLAW_CRON_FIRE_BASE_URL":"none",baseUrl:n??null}},{id:"callback_auth_mode",label:"Callback auth uses scoped runner token",status:i||l?"pass":s?"warn":"fail",summary:i?"KYNVER_RUNNER_TOKEN scoped token will be sent as X-Kynver-Runner-Token":l?"Saved krc1.* token in ~/.kynver/credentials":s?"Deployment-level KYNVER_RUNTIME_SECRET / OPENCLAW_CRON_SECRET in use (legacy headers)":"No callback secret configured",remediation:i||l?void 0:"Mint a scoped token: `kynver runner credential --agent-os-id <id>`. Avoid shared OPENCLAW_CRON_SECRET on user runners.",details:{mode:i||l?"scoped":s?"legacy_global_secret":"missing",legacyHeadersWhenNotScoped:["X-OpenClaw-Cron-Secret","X-Kynver-Runtime-Secret"]}}]}}function GB(e){let r=e.envSnapshot(),t=e.loadConfig(),n=e.readCredentials(),o=e.harnessRoot(),s=e.legacyOpenclawHarnessRoot(),i=Me(o),a=Me(s),l=r.opusHarnessRoot?Me(r.opusHarnessRoot):null,c=o===s&&e.pathExists(s),u=t.agentOsId?.trim(),d=r.kynverRunnerTokenPrefix,m=n.runnerTokenPrefix,f=n.runnerTokenAgentOsId,p=!!m&&(!u||!f||f===u),g=!!d?.startsWith("krc1.")||p&&!!m?.startsWith("krc1.");return{id:"openclaw_hotspots",label:"OpenClaw dependency hotspots",checks:[{id:"hotspot_legacy_harness_root",label:"Legacy ~/.openclaw/harness still active",status:c?"warn":"pass",summary:c?`Harness root is legacy ${a}`:r.opusHarnessRoot?`OPUS_HARNESS_ROOT override in use (${l})`:`Using ${i}`,remediation:c?"Set KYNVER_HARNESS_ROOT=~/.kynver/harness (or run setup), migrate artifacts, retire OPUS_HARNESS_ROOT.":r.opusHarnessRoot?"Prefer KYNVER_HARNESS_ROOT over OPUS_HARNESS_ROOT.":void 0,details:{harnessRoot:i,legacyRoot:a,opusHarnessRoot:l}},{id:"hotspot_openclaw_env_secrets",label:"OpenClaw deployment secrets in runner env",status:r.openclawCronSecret||r.openclawCronFireBaseUrl?"warn":"pass",summary:r.openclawCronSecret||r.openclawCronFireBaseUrl?[r.openclawCronSecret?"OPENCLAW_CRON_SECRET set":null,r.openclawCronFireBaseUrl?"OPENCLAW_CRON_FIRE_BASE_URL set":null].filter(Boolean).join("; "):"No OpenClaw cron env overrides on this runner",remediation:r.openclawCronSecret||r.openclawCronFireBaseUrl?"Move to KYNVER_API_URL + scoped runner tokens; unset OpenClaw cron env on user-hosted runners.":void 0},qS(r,{agentOsId:u??null,apiBaseUrl:t.apiBaseUrl?.trim()??r.kynverApiUrl??null,hasScopedRunnerToken:g,deploymentSchedulerProvider:t.deploymentSchedulerProvider==="qstash"||t.deploymentSchedulerProvider==="kynver-cron"||t.deploymentSchedulerProvider==="openclaw-cron"?t.deploymentSchedulerProvider:void 0}),{id:"hotspot_lease_source_names",label:"Harness lease/completion source names",status:"pass",summary:"Runtime uses kynver-harness:* lease owners and completion source kynver-harness (OpenClaw names retired in runtime)",details:{leaseOwnerPattern:"kynver-harness:<runId>",completionSource:"kynver-harness",note:"OpenClaw adapter remains optional in packages/kynver-openclaw-agent-os only"}}]}}function rw(e=GS){let r=[FB(e),HB(e),KB(e),$B(e),jB(e),VB(e),XS(e),GB(e)],t=WB(r),n=t.fail===0,o=n?t.warn>0?`Ready with ${t.warn} warning(s) \u2014 review remediation before retiring OpenClaw as primary runtime agent.`:"Ready \u2014 Kynver runtime can serve as primary runtime agent on this host.":`${t.fail} blocking check(s) \u2014 fix failures before OpenClaw takeover.`;return{command:"doctor runtime-takeover",ready:n,summary:o,counts:t,sections:r}}function tw(e={}){let r=[];if(e.remediate===!0||e.remediate==="true"){let n=xn();n.updated?r.push(`Remediated config fields: ${n.fields.join(", ")}`):r.push("Config backfill: no unambiguous legacy fields to persist"),n.skippedAmbiguous.length>0&&r.push(`Skipped ambiguous identity: ${n.skippedAmbiguous.join("; ")}`)}if(e.remediateDefaultRepo===!0){let n=zo();if(!n.ok){console.error(n.reason??"defaultRepo remediation failed"),n.remediation&&console.error(n.remediation),process.exitCode=1;return}n.remediated?r.push(`Remediated defaultRepo \u2192 ${n.resolved?.defaultRepo??"unknown"}`):r.push(`defaultRepo already persisted (${n.resolved?.defaultRepo??"unknown"})`)}let t=rw();r.length>0&&(t.notes=[...t.notes??[],...r]),console.log(JSON.stringify(t,null,2)),t.ready||(process.exitCode=1)}A();import{existsSync as ho,readFileSync as iw}from"node:fs";import{homedir as JB}from"node:os";import pp from"node:path";import{spawnSync as aw}from"node:child_process";Oe();var nw="24.11.0",Zs=">=24.11.0";function dp(e){let r=e.trim().replace(/^v/,""),t=/^(\d+)\.(\d+)\.(\d+)$/.exec(r);return t?{major:Number(t[1]),minor:Number(t[2]),patch:Number(t[3])}:null}function ow(e,r){return e.major!==r.major?e.major-r.major:e.minor!==r.minor?e.minor-r.minor:e.patch-r.patch}function YB(e){let r=e.trim().split(/\s+/),t=null,n=null;for(let o of r)if(o.startsWith(">="))t=dp(o.slice(2));else if(o.startsWith("<")){let s=o.slice(1);n=dp(s)??(/^\d+$/.test(s)?{major:Number(s),minor:0,patch:0}:null)}if(!t)throw new Error(`Unsupported node policy range: ${e}`);return{floor:t,below:n}}function go(e,r=Zs){let{floor:t,below:n}=YB(r),o=dp(e);if(!o)return{status:"invalid_version",currentVersion:e.trim(),requiredRange:r,remediation:`Node version could not be parsed as X.Y.Z (prereleases are unsupported). Install Node ${nw} or a later release within the supported range.`};let s=`${o.major}.${o.minor}.${o.patch}`;return ow(o,t)<0?{status:"upgrade_required",currentVersion:s,requiredRange:r,remediation:`Upgrade Node to >=${nw}. See docs/runbooks/node-24-fleet-migration.md for the per-host procedure.`}:n&&ow(o,n)>=0?{status:"unsupported_major",currentVersion:s,requiredRange:r,remediation:`Node ${o.major}.x is newer than this artifact's qualified range (${r}). Use a qualified Node major or wait for the next runtime qualification.`}:{status:"compatible",currentVersion:s,requiredRange:r,remediation:null}}rr();var lw=pp.join(JB(),".kynver"),woe=pp.join(lw,"config.json"),Jt=pp.join(lw,"credentials"),sw=(()=>{let e=process.env.KYNVER_DAEMON_STALL_MS?.trim(),r=e?parseInt(e,10):NaN;return Number.isFinite(r)&&r>0?r:900*1e3})();function qB(e){let r={pass:0,warn:0,fail:0};for(let t of e)for(let n of t.checks)r[n.status]+=1;return r}function Yt(e){return e.checks.some(r=>r.status==="fail")}function cw(e){try{let r=aw(process.platform==="win32"?"where":"which",[e],{encoding:"utf8",timeout:3e3});return r.status===0&&!!r.stdout?.trim()}catch{return!1}}function zB(){if(!ho(Jt))return{hasApiKey:!1};try{let e=JSON.parse(iw(Jt,"utf8"));return{hasApiKey:!!e.apiKey?.trim(),runnerToken:e.runnerToken?.trim()||void 0,runnerTokenAgentOsId:e.runnerTokenAgentOsId?.trim()||void 0}}catch{return{hasApiKey:!1}}}function XB(){let e=cw("kynver"),r=go(process.versions.node);return{id:"stage_1_install",label:"Stage 1 \u2014 Install",checks:[{id:"install_package_version",label:"@kynver-app/runtime version",status:"pass",summary:`@kynver-app/runtime ${sr} is running`,details:{version:sr}},{id:"install_node_runtime_policy",label:"Node runtime policy (report-only)",status:r.status==="compatible"?"pass":"warn",summary:r.status==="compatible"?`Node ${r.currentVersion} satisfies ${r.requiredRange}`:`Node ${r.currentVersion} \u2192 ${r.status} against ${r.requiredRange} (advisory during rollout)`,remediation:r.remediation??void 0,details:{status:r.status,requiredRange:r.requiredRange}},{id:"install_on_path",label:"kynver executable on PATH",status:e?"pass":"warn",summary:e?"kynver found on PATH \u2014 global install confirmed":"kynver not on PATH \u2014 running via node/npx (fine for first-timers)",remediation:e?void 0:"Install globally for a shorter command: `npm install -g @kynver-app/runtime`",details:{onPath:e}}]}}function QB(e,r){return{id:"stage_2_login",label:"Stage 2 \u2014 Device Login",checks:[{id:"login_credentials_file",label:"Credentials file present",status:ho(Jt)?"pass":"fail",summary:ho(Jt)?`${F(Jt)} exists`:`${F(Jt)} missing \u2014 not logged in`,remediation:ho(Jt)?void 0:r?`kynver login --api-base-url ${r}`:"kynver login --api-base-url https://your-kynver-site"},{id:"login_api_key",label:"API key present",status:e.hasApiKey?"pass":"fail",summary:e.hasApiKey?"API key found in credentials":"No API key \u2014 device login not completed",remediation:e.hasApiKey?void 0:r?`kynver login --api-base-url ${r}`:"kynver login --api-base-url https://your-kynver-site"}]}}function ZB(e,r,t=v(),n=process.env){let o=t.boxKind?.trim()||n.KYNVER_BOX_KIND?.trim()||"";return{id:"stage_3_workspace",label:"Stage 3 \u2014 Workspace Binding",checks:[{id:"workspace_api_base_url",label:"API base URL configured",status:r?"pass":"fail",summary:r?`apiBaseUrl = ${r}`:"apiBaseUrl not set \u2014 bootstrap required",remediation:r?void 0:"kynver bootstrap --api-base-url https://your-kynver-site",details:{apiBaseUrl:r??null}},{id:"workspace_agent_os_id",label:"AgentOS workspace bound",status:e?"pass":"fail",summary:e?`Workspace ${e} bound`:"agentOsId not set \u2014 workspace not bound",remediation:e?void 0:r?`kynver bootstrap --api-base-url ${r}`:"kynver bootstrap --api-base-url https://your-kynver-site",details:{agentOsId:e??null}},{id:"workspace_box_kind",label:"Box identity (boxKind) configured",status:o?"pass":"fail",summary:o?`boxKind = ${o}`:"boxKind not set \u2014 the daemon refuses to start without it",remediation:o?void 0:"kynver setup (persists boxKind=box for customer installs; operators: --box-kind forge|ghost)",details:{boxKind:o||null}}]}}function eW(e){let r=v(),t=Ye({config:r}),n=!!t?.repo,o=!!t?.persistedInConfig,s=[{id:"repo_configured",label:"Default repo configured",status:n?"pass":"fail",summary:n?o?`${F(t.repo)} (from config)`:`${F(t.repo)} (discovered \u2014 not persisted yet)`:"No default repo \u2014 kynver start requires --repo or a configured path",remediation:n?o?void 0:"kynver config ensure-default-repo":"kynver setup --repo /path/to/your/repo",details:{defaultRepo:t?.repo??null,source:t?.source??null,persistedInConfig:o}}];return n&&!o&&s.push({id:"repo_persisted",label:"Default repo persisted in ~/.kynver/config.json",status:"warn",summary:`Repo discovered via ${t?.source} but not saved to config \u2014 may not survive env changes`,remediation:"kynver config ensure-default-repo"}),n&&s.push(tW(t.repo,rW(t.repo))),{id:"stage_4_repo",label:"Stage 4 \u2014 Repo Selection",checks:s}}function rW(e){let r=o=>ee(e,["rev-parse","--verify","--quiet",`${o}^{commit}`]).status===0;if(r("origin/main"))return{originMainOk:!0,remoteHead:null,remoteHeadOk:!1};let t=ee(e,["symbolic-ref","--quiet","refs/remotes/origin/HEAD"]),n=t.status===0&&t.stdout.trim().replace(/^refs\/remotes\//,"")||null;return{originMainOk:!1,remoteHead:n,remoteHeadOk:n?r(n):!1}}function tW(e,r){return r.originMainOk?{id:"repo_base_ref",label:"Repo base ref (origin/main) resolvable",status:"pass",summary:`git rev-parse origin/main succeeds in ${F(e)}`,details:{baseRef:"origin/main"}}:r.remoteHeadOk&&r.remoteHead?{id:"repo_base_ref",label:"Repo base ref (origin/main) resolvable",status:"warn",summary:`origin/main not found \u2014 runs will fall back to the remote default branch ${r.remoteHead}`,remediation:"Fine as-is; to pin a different base, pass --base or set KYNVER_RUN_BASE_REF",details:{baseRef:r.remoteHead,fallback:!0}}:{id:"repo_base_ref",label:"Repo base ref (origin/main) resolvable",status:"fail",summary:`Neither origin/main nor a remote default branch resolves in ${F(e)} \u2014 new runs cannot be created`,remediation:`git -C ${e} fetch origin (then \`git -C ${e} remote set-head origin -a\` if the default branch is not main)`,details:{baseRef:null,remoteHead:r.remoteHead}}}function nW(e,r){let t=e.runnerToken,n=!!t?.startsWith("krc1."),o=e.runnerTokenAgentOsId,s=!r||!o||o===r,i=[{id:"credential_scoped_token",label:"Scoped runner token (krc1.*) present",status:n?"pass":"fail",summary:n?`Scoped token present (krc1.\u2026 for ${o??r??"workspace"})`:t?"Runner token present but not a krc1.* scoped token \u2014 re-mint required":"No runner token \u2014 mint one with `kynver runner credential`",remediation:n?void 0:r?`kynver runner credential --agent-os-id ${r}`:"kynver runner credential --agent-os-id <your-agent-os-id>",details:{hasToken:!!t,isScoped:n,tokenAgentOsId:o??null}}];return n&&!s&&i.push({id:"credential_workspace_match",label:"Runner token matches configured workspace",status:"warn",summary:`Token is for workspace ${o}, config expects ${r}`,remediation:r?`kynver runner credential --agent-os-id ${r}`:void 0,details:{tokenAgentOsId:o??null,configAgentOsId:r??null}}),{id:"stage_5_credential",label:"Stage 5 \u2014 Runner Credential",checks:i}}function oW(e){if(!e)return{id:"stage_6_daemon",label:"Stage 6 \u2014 Supervised Daemon",checks:[{id:"daemon_workspace_required",label:"Workspace required for daemon liveness check",status:"warn",summary:"agentOsId not set \u2014 cannot locate heartbeat file; complete stage 3 first"}]};let r=Gi(e),t=ho(r),n=!1,o=null,s=null;if(t)try{let a=JSON.parse(iw(r,"utf8"));a.observedAt&&(o=Date.now()-new Date(a.observedAt).getTime(),n=o<sw),s=a.pid??null}catch{}let i=[{id:"daemon_running",label:"Daemon running (heartbeat present)",status:t?"pass":"warn",summary:t?`Heartbeat file found: ${F(r)}`:`No heartbeat file at ${F(r)} \u2014 daemon not started`,remediation:t?void 0:"kynver start",details:{heartbeatPath:F(r),exists:t}}];return t&&i.push({id:"daemon_heartbeat_fresh",label:"Daemon heartbeat fresh",status:n?"pass":"warn",summary:n?`Last beat ${Math.round((o??0)/1e3)}s ago (pid ${s??"?"})`:o!==null?`Heartbeat is ${Math.round(o/6e4)}m old \u2014 daemon may be stalled`:"Cannot parse heartbeat timestamp",remediation:n?void 0:"kynver start # keeper will respawn the daemon",details:{ageMs:o,stallThresholdMs:sw,pid:s}}),{id:"stage_6_daemon",label:"Stage 6 \u2014 Supervised Daemon",checks:i}}var sW={cursor:["agent"],codex:["codex","hermes"],claude:["claude"]},iW={cursor:"Install the Cursor Agent CLI (https://cursor.com/docs/cli/headless), then `agent login` (or set CURSOR_API_KEY). Windows PowerShell: `irm 'https://cursor.com/install?win32=true' | iex`",codex:"Install the Codex CLI (https://developers.openai.com/codex/) and run `codex login`, or install `hermes` with the openai-codex provider",claude:"Install Claude Code (`npm install -g @anthropic-ai/claude-code`), then `claude login`"};function aW(e=v()){let r=(e.workerProvider?.trim()||"cursor").toLowerCase(),t=sW[r]??[],n=t.length>0,o=t.find(i=>cw(i))??null,s=null;if(o)try{let i=aw(o,["--version"],{encoding:"utf8",timeout:5e3});s=i.status===0?{ok:!0,detail:(i.stdout||i.stderr||"").trim().split(`
125
125
  `)[0]??""}:{ok:!1,detail:(i.stderr||i.stdout||`exit ${i.status}`).trim().slice(0,200)}}catch(i){s={ok:!1,detail:i.message}}return{provider:r,binaries:t,foundBinary:o,versionProbe:s,knownProvider:n}}function lW(e,r){let t=[];if(!e.knownProvider)return t.push({id:"provider_known",label:"Worker provider recognized",status:"warn",summary:`workerProvider "${e.provider}" is not a known provider (cursor | codex | claude) \u2014 cannot probe its CLI`,remediation:"kynver setup --provider cursor (or codex / claude)",details:{provider:e.provider}}),{id:"section_provider_cli",label:"Worker Provider CLI",checks:t};if(t.push({id:"provider_cli_on_path",label:`Provider CLI on PATH (${e.provider} \u2192 ${e.binaries.join(" or ")})`,status:e.foundBinary?"pass":"fail",summary:e.foundBinary?`${e.foundBinary} found on PATH \u2014 harness workers and cursor-backed website chat can spawn`:`None of [${e.binaries.join(", ")}] found on PATH \u2014 workers cannot spawn`+(e.provider==="cursor"?" and website chat will fail closed":""),remediation:e.foundBinary?void 0:iW[e.provider],details:{provider:e.provider,binaries:e.binaries,foundBinary:e.foundBinary}}),e.foundBinary&&t.push({id:"provider_cli_health",label:`Provider CLI responds (${e.foundBinary} --version)`,status:e.versionProbe?.ok?"pass":"warn",summary:e.versionProbe?.ok?`${e.foundBinary} --version \u2192 ${e.versionProbe.detail||"ok"}`:`${e.foundBinary} --version did not respond cleanly (${e.versionProbe?.detail??"no probe"}) \u2014 check its install/login`,remediation:e.versionProbe?.ok?void 0:`Run \`${e.foundBinary} login\` (or the provider's auth command) and retry`,details:{versionProbe:e.versionProbe}}),e.provider==="cursor"){let o=r?.cursorChatAuth,s=!!(o?.hasApiKey||o?.hasAuthStore),i=!!e.foundBinary,a=i?o?s?"pass":"fail":"warn":"fail";t.push({id:"cursor_website_chat",label:"Cursor-backed website chat",status:a,summary:i?s?o?.hasApiKey?"`agent` on PATH and CURSOR_API_KEY is set \u2014 website chat can use this box":"`agent` on PATH and `agent login` session present \u2014 website chat can use this box":o?"`agent` is on PATH but not logged in \u2014 website chat will fail closed (run `agent login` or set CURSOR_API_KEY)":"`agent` on PATH \u2014 website chat also needs `agent login` or CURSOR_API_KEY":"Website chat on this box uses the Cursor `agent` CLI \u2014 install it and run `agent login` (or set CURSOR_API_KEY)",remediation:i&&s?void 0:"Install the Cursor Agent CLI (https://cursor.com/docs/cli/headless), then `agent login` (or set CURSOR_API_KEY). Website chat does not fall back to hosted models when this is missing.",details:{provider:"cursor",foundBinary:e.foundBinary,hasApiKey:o?.hasApiKey??null,hasAuthStore:o?.hasAuthStore??null}})}let n=et(e.provider);if(n){let o=n.workerMcpTools==="supported",s=Fn();t.push({id:"provider_worker_mcp_tools",label:"Worker Kynver tools (MCP)",status:"pass",summary:o?s?`supported on ${n.displayName}; ${cs} is on \u2014 workers get tools when the workspace flag is also on`:`supported on ${n.displayName}, but ${cs} is off on this box \u2014 workers spawn without Kynver tools`:`unsupported on ${n.displayName} \u2014 ${n.workerMcpToolsNote??"this CLI cannot scope a task-bound toolset per spawn"}`,remediation:o&&!s?`Set ${cs}=1 and restart the daemon (the per-workspace flag must be on too)`:void 0,details:{provider:e.provider,workerMcpTools:n.workerMcpTools,runtimeFlag:s}})}return{id:"section_provider_cli",label:"Worker Provider CLI",checks:t}}var cW=5e3;async function uW(e){let r=e.fetchImpl??fetch,t=e.timeoutMs??cW,n=e.baseUrl?.trim().replace(/\/+$/,"")||null;if(!n)return{baseUrl:null,version:{kind:"skipped",reason:"apiBaseUrl not configured"},credential:{kind:"skipped",reason:"apiBaseUrl not configured"}};let o;try{let i=await r(`${n}/api/version`,{signal:AbortSignal.timeout(t)});o=i.ok?{kind:"ok",status:i.status}:{kind:"http_error",status:i.status}}catch(i){o={kind:"network",detail:i.message}}let s;if(!e.apiKey)s={kind:"skipped",reason:"no API key \u2014 complete `kynver login` first"};else if(!e.agentOsId)s={kind:"skipped",reason:"no agentOsId \u2014 complete `kynver bootstrap` first"};else if(o.kind==="network")s={kind:"skipped",reason:"API unreachable \u2014 fix connectivity first"};else try{let i=await r(`${n}/api/agent-os/by-id/${encodeURIComponent(e.agentOsId)}/runner-credentials`,{headers:{Authorization:`Bearer ${e.apiKey}`},signal:AbortSignal.timeout(t)});s=i.status===401?{kind:"unauthorized"}:i.status===403?{kind:"forbidden"}:i.ok?{kind:"ok"}:{kind:"http_error",status:i.status}}catch(i){s={kind:"network",detail:i.message}}return{baseUrl:n,version:o,credential:s}}function dW(e){let r=e.baseUrl,t=[];return t.push({id:"api_version_reachable",label:"Kynver API reachable (GET /api/version)",status:e.version.kind==="ok"?"pass":e.version.kind==="skipped"?"warn":"fail",summary:e.version.kind==="ok"?`${r}/api/version \u2192 ${e.version.status}`:e.version.kind==="skipped"?`Skipped \u2014 ${e.version.reason}`:e.version.kind==="network"?`${r} is unreachable (${e.version.detail}) \u2014 wrong URL or no connectivity`:`${r}/api/version \u2192 HTTP ${e.version.status} \u2014 this URL may not be a Kynver deployment`,remediation:e.version.kind==="ok"?void 0:e.version.kind==="skipped"?"kynver bootstrap --api-base-url https://www.kynver.com":"Check the apiBaseUrl in ~/.kynver/config.json (production is https://www.kynver.com) and your network, then retry",details:{baseUrl:r,version:e.version}}),t.push({id:"api_credential_auth",label:"Runner credential accepted by the API",status:e.credential.kind==="ok"?"pass":e.credential.kind==="skipped"||e.credential.kind==="http_error"?"warn":"fail",summary:e.credential.kind==="ok"?"Credentialed probe of the runner-credential route succeeded":e.credential.kind==="skipped"?`Skipped \u2014 ${e.credential.reason}`:e.credential.kind==="unauthorized"?"API key rejected (401) \u2014 the key was revoked or expired":e.credential.kind==="forbidden"?"Access denied (403) \u2014 this account/workspace is gated. AgentOS access is admin-approved.":e.credential.kind==="network"?`Credential probe failed to connect (${e.credential.detail})`:`Unexpected HTTP ${e.credential.status} from the runner-credential route`,remediation:e.credential.kind==="unauthorized"?"Run `kynver login` again to mint a fresh API key, then `kynver bootstrap`":e.credential.kind==="forbidden"?`Request access at ${r??"https://www.kynver.com"}/agent-os/early-access \u2014 once approved, re-run \`kynver bootstrap\``:e.credential.kind==="network"?"Check connectivity and retry":void 0,details:{credential:e.credential}}),{id:"section_api_liveness",label:"API Liveness",checks:t}}function pW(e=[]){let r=v(),t=zB(),n=r.agentOsId?.trim()||void 0,o=r.apiBaseUrl?.trim()||process.env.KYNVER_API_URL?.trim()||void 0,s=XB(),i=QB(t,o),a=ZB(n,o,r),l=eW(n),c=nW(t,n),u=oW(n),d=lW(aW(r),{cursorChatAuth:{hasApiKey:!!process.env.CURSOR_API_KEY?.trim(),hasAuthStore:Md().some(R=>ho(R))}}),m=[s,i,a,l,c,u,d,...e],f=qB(m),p=0;Yt(s)||(p=1),p>=1&&!Yt(i)&&(p=2),p>=2&&!Yt(a)&&(p=3),p>=3&&!Yt(l)&&(p=4),p>=4&&!Yt(c)&&(p=5),p>=5&&!Yt(u)&&(p=6);let g=[d,...e].some(Yt),y=p>=5&&!g,k={0:"not started",1:"installed",2:"logged in",3:"workspace bound",4:"repo selected",5:"ready (credential minted)",6:"fully operational (daemon running)"},h=y?p===6?"Fully operational \u2014 daemon running with supervised respawn.":`Ready \u2014 runner at stage ${p} (${k[p]}). Run \`kynver start\` to bring the daemon online.`:`Lifecycle at stage ${p} (${k[p]}). ${f.fail} blocking check(s) \u2014 see remediation hints above.`;return{command:"doctor runner-install",ready:y,lifecycleStage:p,summary:h,counts:f,sections:m}}async function mW(){let e=v(),r=e.apiBaseUrl?.trim()||process.env.KYNVER_API_URL?.trim()||void 0,t=await uW({baseUrl:r,agentOsId:e.agentOsId?.trim()||void 0,apiKey:X()});return pW([dW(t)])}async function mp(){let e=await mW();console.log(JSON.stringify(e,null,2)),e.ready||(process.exitCode=1)}function uw(e){let r=e?.identity??Vi(),t=e?.nodeVersion??process.env.KYNVER_NODE_POLICY_TEST_VERSION?.trim()??r.nodeVersion,n=e?.requiredRange??Zs,o=go(t,n);return{command:"doctor node-runtime",contractVersion:1,nodeVersion:o.currentVersion,requiredRange:n,status:o.status,remediation:o.remediation,platform:r.platform,arch:r.arch,runtimePackageVersion:sr,buildIdentity:r.buildIdentity}}function dw(){let e=uw();console.log(JSON.stringify(e,null,2))}xe();import{readdirSync as fW,statSync as gW}from"node:fs";function hW(e){try{return fW(e).filter(r=>r.includes(".quarantine-")).sort().map(r=>{let t=null;try{t=gW(`${e}/${r}`).mtime.toISOString()}catch{t=null}return{file:r,mtime:t}})}catch{return[]}}function pw(e){let r=he(),t=e?.probe===!1?Ic():qi(),n=Ge(e?.env??process.env);return{command:"doctor local-store",contractVersion:1,harnessRoot:r,store:{state:t.state,databasePath:t.databasePath,schemaVersion:t.schemaVersion,recovered:t.recovered,quarantinedTo:t.quarantinedTo,reason:t.reason},surfaces:Oc.map(o=>({key:o.key,env:o.env,milestone:o.milestone,mode:n.flags[o.key],source:n.sources[o.key]})),flagWarnings:n.warnings,quarantineHistory:hW(r)}}function mw(e={}){let r=e.noProbe===!0,t=pw({probe:!r});console.log(JSON.stringify(t,null,2))}A();function fp(e,r){let t=e;return r&&(t=t.split(r).join("[REDACTED_SECRET]")),t=t.replace(/kynver_[a-z0-9_]+/gi,"[REDACTED_KYNVER_TOKEN]"),t=t.replace(/sk-[a-zA-Z0-9_-]+/g,"[REDACTED_API_KEY]"),t}A();function fw(e){let r={Accept:"application/json"};return e?.trim()&&(r.Authorization=`Bearer ${e.trim()}`),r}async function gp(e,r,t=3e4){let n=new AbortController,o=setTimeout(()=>n.abort(),t);try{let s=await fetch(e,{...r,signal:n.signal}),i=null;try{i=await s.json()}catch{i=null}return{ok:s.ok,status:s.status,response:i}}catch(s){return{ok:!1,status:0,response:{error:s instanceof Error?s.message:String(s)}}}finally{clearTimeout(o)}}function gw(){return{loadConfig(){let e=v(),r=e.agentOsSlug?.trim()??"",t=e.agentOsId?.trim()??"",n=L(e.apiBaseUrl),o=X();return{slug:r,agentOsId:t,baseUrl:n,apiKey:o}},async resolveRunnerSecret(e,r){try{return await q(void 0,e,{baseUrl:r})}catch{return null}},fetchContextEnvelope(e,r,t){let n=new URLSearchParams({anchorType:r,anchorId:t,mode:"routine"}),o=`${e.baseUrl}/api/agent-os/${encodeURIComponent(e.slug)}/context-envelope?${n.toString()}`;return gp(o,{method:"GET",headers:fw(e.apiKey)})},fetchTasks(e,r=25){let t=new URLSearchParams({limit:String(r)}),n=`${e.baseUrl}/api/agent-os/${encodeURIComponent(e.slug)}/tasks?${t.toString()}`;return gp(n,{method:"GET",headers:fw(e.apiKey)})},fetchRetrieveTelemetryDiagnostic(e){let r=e.runnerSecret;if(!r)return Promise.resolve({ok:!1,status:0,response:{error:"runner secret unavailable"}});let t=`${e.baseUrl}/api/agent-os/by-id/${encodeURIComponent(e.agentOsId)}/diagnostics?slug=context-envelope-retrieve-telemetry`;return gp(t,{method:"GET",headers:Fe(r)})}}}var hw="00000000-0000-4000-8000-000000000001";function hp(e){let r={pass:0,warn:0,fail:0};for(let t of e)for(let n of t.checks)r[n.status]+=1;return r}function kW(e){return e.checks.some(r=>r.status==="fail")}function Re(e){return e&&typeof e=="object"?e:null}function oe(e){return typeof e=="string"&&e.trim()?e.trim():null}function ei(e){return typeof e=="boolean"?e:null}function Fl(e){return typeof e=="number"&&Number.isFinite(e)?e:null}function ri(e){return Array.isArray(e)?e:[]}function yW(e){let r=Re(e),t=ri(r?.items);if(t.length===0)return null;let n=t.map(s=>{let i=Re(s);if(!i)return null;let a=oe(i.id);return a?{taskId:a,personaSlug:oe(i.personaSlug),title:oe(i.title)}:null}).filter(s=>s!==null);return n.find(s=>s.personaSlug)??n[0]??null}function RW(e){let r=Re(e.envelope.anchor)??{},t=Re(e.envelope.persona),n=Re(e.envelope.resultContract)??{},o=ri(e.envelope.memories),s=t?ri(t.operatingRules).length:0;return{slug:e.slug,agentOsId:e.agentOsId,taskId:e.taskId,anchor:{type:oe(r.type)??"task",id:oe(r.id)??e.taskId,exists:ei(r.exists)===!0,title:oe(r.title),status:oe(r.status)},personaSlug:oe(t?.slug),memoryCount:o.length,operatingRuleCount:s,withinBudget:ei(n.withinBudget)===!0,projection:oe(n.projection)??oe(e.envelope.projection),mode:oe(e.envelope.mode),contractVersion:oe(n.contractVersion),serializedBytes:Fl(n.serializedBytes)}}function vW(e){let r=Re(e),t=Re(r?.result);if(!t)return null;let n=Re(t.detail)??{};return{slug:"context-envelope-retrieve-telemetry",status:oe(t.status)??"unknown",summary:oe(t.summary)??"",eventCount:Fl(n.eventCount),retrieveCount:Fl(n.retrieveCount)}}function kp(e,r){return fp(e,r)}function bW(e){return{id:"config",label:"Configuration",checks:[{id:"config_slug",label:"AgentOS slug",status:e.slug?"pass":"fail",summary:e.slug?`Resolved slug "${e.slug}"`:"Missing agentOsSlug \u2014 run `kynver setup --agent-os-slug \u2026`",remediation:e.slug?void 0:"Run `kynver setup --agent-os-slug ghost` (or your workspace slug)."},{id:"config_agent_os_id",label:"AgentOS id",status:e.agentOsId?"pass":"fail",summary:e.agentOsId?`Resolved agentOsId ${e.agentOsId}`:"Missing agentOsId \u2014 run `kynver setup --agent-os-id \u2026`",remediation:e.agentOsId?void 0:"Run `kynver setup` or `kynver bootstrap` to bind the workspace."},{id:"config_api_key",label:"Dashboard API key",status:e.apiKey?"pass":"fail",summary:e.apiKey?"Bearer API key present for slug context-envelope route":"Missing API key \u2014 run `kynver login`",remediation:e.apiKey?void 0:"Run `kynver login --api-key \u2026` (or device login)."},{id:"config_runner_secret",label:"Harness runner credential",status:e.runnerSecret?"pass":"warn",summary:e.runnerSecret?"Runner credential available for diagnostics probe":"No runner credential \u2014 retrieve-telemetry diagnostic will be skipped",remediation:e.runnerSecret?void 0:"Run `kynver runner credential mint` to enable diagnostics probe."}]}}function SW(e,r,t,n){if(!t.ok)return{id:r,label:e,status:"fail",summary:kp(`GET context-envelope failed: HTTP ${t.status||"network"}`,n),details:{httpStatus:t.status}};let o=Re(t.response);return o?{id:r,label:e,status:"pass",summary:"Context-envelope GET succeeded",details:{anchorType:oe(Re(o.anchor)?.type),anchorId:oe(Re(o.anchor)?.id)}}:{id:r,label:e,status:"fail",summary:"Context-envelope response was not JSON object"}}function wW(e){let r=Re(e.anchor)??{},t=ei(r.exists)===!0;return{id:"anchor_exists",label:"Anchor exists",status:t?"pass":"fail",summary:t?`anchor.exists=true (${oe(r.title)??oe(r.id)??"task"})`:"anchor.exists=false for the probed task \u2014 envelope cannot anchor dispatch",details:{exists:t,title:oe(r.title),status:oe(r.status)}}}function CW(e,r){let t=Re(e.persona),n=oe(t?.slug);if(r){let o=n===r;return{id:"persona_slug",label:"Persona slug",status:o?"pass":"fail",summary:o?`persona.slug="${n}" matches task personaSlug`:`persona.slug="${n??"(null)"}" expected "${r}"`,details:{expectedPersona:r,actualPersona:n}}}return{id:"persona_slug",label:"Persona slug",status:n?"warn":"pass",summary:n?`Task has no personaSlug but envelope returned persona "${n}"`:"No persona block (task has no personaSlug)",details:{actualPersona:n}}}function _W(e){let t=ri(e.memories).length;return{id:"memory_count",label:"Memory retrieval count",status:"pass",summary:`${t} memory hit(s) in envelope`,details:{memoryCount:t}}}function xW(e){let r=Re(e.resultContract)??{},t=ei(r.withinBudget)===!0,n=Fl(r.serializedBytes);return{id:"within_budget",label:"Result contract within budget",status:t?"pass":"fail",summary:t?`resultContract.withinBudget=true${n!=null?` (${n} bytes)`:""}`:"resultContract.withinBudget=false \u2014 envelope exceeds MCP transport cap",details:{withinBudget:t,serializedBytes:n,omitted:ri(r.omitted).length}}}function EW(e,r){if(!e.ok)return{id:"missing_anchor_fail_closed",label:"Missing anchor fail-closed",status:"fail",summary:kp(`Missing-anchor probe failed: HTTP ${e.status||"network"}`,r)};let t=Re(e.response),n=Re(t?.anchor)??{},o=ei(n.exists),s=oe(n.id),i=o===!1&&s===hw;return{id:"missing_anchor_fail_closed",label:"Missing anchor fail-closed",status:i?"pass":"fail",summary:i?"Unknown anchor collapses to anchor.exists=false (no cross-workspace confirmation)":`Expected anchor.exists=false for probe id; got exists=${String(o)}`,details:{exists:o,anchorId:s}}}function PW(e,r){if(!e.ok)return{check:{id:"retrieve_telemetry",label:"Retrieve telemetry diagnostic",status:e.status===0?"warn":"fail",summary:kp(e.status===0?"Retrieve-telemetry diagnostic skipped (no runner credential)":`Diagnostics probe failed: HTTP ${e.status}`,r)},telemetry:null};let t=vW(e.response),n=t?.status??"unknown";return{check:{id:"retrieve_telemetry",label:"Retrieve telemetry diagnostic",status:n==="ok"?"pass":n==="degraded"?"warn":"fail",summary:t?.summary??"context-envelope-retrieve-telemetry returned no summary",details:t?{status:t.status,eventCount:t.eventCount,retrieveCount:t.retrieveCount}:void 0},telemetry:t}}async function kw(e={},r=gw()){let t=r.loadConfig(),n=(e.slug??t.slug).trim(),o=(e.agentOsId??t.agentOsId).trim(),s=L(e.baseUrl??t.baseUrl),i=e.apiKey??t.apiKey,a=await r.resolveRunnerSecret(o,s),l={slug:n,agentOsId:o,baseUrl:s,apiKey:i,runnerSecret:a??void 0},c=[];c.push(bW({slug:n,agentOsId:o,apiKey:i,runnerSecret:a}));let u=null,d=null;if(!!!(n&&o&&i))return{command:"doctor context-envelope",ready:!1,summary:"Context-envelope preflight blocked \u2014 fix configuration checks first.",counts:hp(c),sections:c,envelopeSummary:u,telemetryDiagnostic:d};let f=e.taskId?.trim()||process.env.KYNVER_HARNESS_TASK_ID?.trim()||"",p=null;if(!f){let V=await r.fetchTasks(l),N=V.ok?yW(V.response):null;N&&(f=N.taskId,p=N.personaSlug)}let g={id:"anchor_resolution",label:"Task anchor",checks:[{id:"task_anchor_resolved",label:"Probe task id",status:f?"pass":"fail",summary:f?`Using task anchor ${f}`:"No task id \u2014 pass --task-id or ensure board has tasks",remediation:f?void 0:"Pass --task-id <uuid> or create a board task to probe.",details:f?{taskId:f,expectedPersona:p}:void 0}]};if(c.push(g),!f)return{command:"doctor context-envelope",ready:!1,summary:"Context-envelope preflight blocked \u2014 no task anchor to probe.",counts:hp(c),sections:c,envelopeSummary:u,telemetryDiagnostic:d};let y=await r.fetchContextEnvelope(l,"task",f),k=[SW("Live task envelope","envelope_fetch",y,a??void 0)],h=Re(y.response);if(y.ok&&h){if(!p){let V=Re(h.task);p=oe(V?.personaSlug)}u=RW({slug:n,agentOsId:o,taskId:f,envelope:h}),k.push(wW(h),CW(h,p),_W(h),xW(h))}let R=await r.fetchContextEnvelope(l,"task",hw);k.push(EW(R,a??void 0)),c.push({id:"envelope",label:"Context envelope",checks:k});let C=await r.fetchRetrieveTelemetryDiagnostic(l),I=PW(C,a??void 0);d=I.telemetry,c.push({id:"telemetry",label:"Retrieval telemetry",checks:[I.check]});let w=hp(c),x=!c.some(kW),J=x?`Context-envelope preflight passed for task ${f} (${u?.memoryCount??0} memories, withinBudget=${String(u?.withinBudget??!1)}).`:"Context-envelope preflight failed \u2014 see failing checks.";return{command:"doctor context-envelope",ready:x,summary:J,counts:w,sections:c,envelopeSummary:u,telemetryDiagnostic:d}}function yw(e,r){let t=n=>fp(n,r);return{...e,summary:t(e.summary),sections:e.sections.map(n=>({...n,checks:n.checks.map(o=>({...o,summary:t(o.summary),remediation:o.remediation?t(o.remediation):void 0}))})),envelopeSummary:e.envelopeSummary,telemetryDiagnostic:e.telemetryDiagnostic?{...e.telemetryDiagnostic,summary:t(e.telemetryDiagnostic.summary)}:null}}async function Rw(e){let r=await kw({slug:e.slug?String(e.slug):void 0,agentOsId:e.agentOsId?String(e.agentOsId):void 0,baseUrl:e.baseUrl?String(e.baseUrl):void 0,taskId:e.taskId?String(e.taskId):void 0,apiKey:e.apiKey?String(e.apiKey):void 0}),t=yw(r);console.log(JSON.stringify(t,null,2)),t.ready||(process.exitCode=1)}A();async function vw(e){let r=v(),t=(e.agentOsId?String(e.agentOsId):r.agentOsId)||"";t||(console.error("requires --agent-os-id or agentOsId in ~/.kynver/config.json"),process.exit(1));let n=L(e.baseUrl?String(e.baseUrl):r.apiBaseUrl),o=await q(e.secret?String(e.secret):void 0,t,{baseUrl:n}),s=new URLSearchParams;if(typeof e.since=="string"&&e.since.trim()&&s.set("since",e.since.trim()),e.limit!=null&&String(e.limit).trim()){let c=Number(e.limit);Number.isFinite(c)&&c>0&&s.set("limit",String(Math.floor(c)))}let i=s.toString()?`?${s.toString()}`:"",a=`${n}/api/agent-os/by-id/${encodeURIComponent(t)}/command-center/dashboard-contract${i}`,l=await Mn(a,o);l.ok||(console.error(`dashboard-contract GET failed: HTTP ${l.status}`),l.response&&console.error(JSON.stringify(l.response,null,2)),process.exit(1)),console.log(JSON.stringify(l.response,null,2))}rr();var yp=["Railway/hosted: set KYNVER_SCHEDULER_PROVIDER=qstash","Railway/hosted: ensure QSTASH_TOKEN (and QStash signing keys) are configured","Railway/hosted: unset OPENCLAW_CRON_STORE_PATH if present"],Rp=["User runner: unset KYNVER_SCHEDULER_PROVIDER (scheduling is deployment-owned)","User runner: unset OPENCLAW_CRON_STORE_PATH, OPENCLAW_CRON_SECRET, OPENCLAW_CRON_FIRE_BASE_URL",'User runner: after deployment cutover, run `kynver scheduler attest-cutover` (or set deploymentSchedulerProvider to "qstash" in ~/.kynver/config.json)',"Verify: kynver doctor runtime-takeover \u2014 hotspot_openclaw_scheduler should pass"];function IW(e=process.env){return{kynverSchedulerProvider:e.KYNVER_SCHEDULER_PROVIDER?.trim()||null,kynverCronStorePath:e.KYNVER_CRON_STORE_PATH?.trim()||e.OPENCLAW_CRON_STORE_PATH?.trim()||null,kynverCronSecret:!!(e.KYNVER_CRON_SECRET?.trim()||e.OPENCLAW_CRON_SECRET?.trim()),kynverCronFireBaseUrl:e.KYNVER_CRON_FIRE_BASE_URL?.trim()||e.OPENCLAW_CRON_FIRE_BASE_URL?.trim()||null,openclawCronStorePath:e.OPENCLAW_CRON_STORE_PATH?.trim()||null,openclawCronSecret:!!e.OPENCLAW_CRON_SECRET?.trim(),openclawCronFireBaseUrl:e.OPENCLAW_CRON_FIRE_BASE_URL?.trim()||null}}function vp(e,r=IW()){let t=[];return r.kynverSchedulerProvider==="openclaw-cron"&&t.push("Runner still has KYNVER_SCHEDULER_PROVIDER=openclaw-cron"),r.kynverCronStorePath&&r.kynverSchedulerProvider!=="kynver-cron"&&t.push("Runner has KYNVER_CRON_STORE_PATH but KYNVER_SCHEDULER_PROVIDER is not kynver-cron \u2014 use `kynver daemon` cron tick or unset the store for QStash-only runners"),r.openclawCronStorePath&&!r.kynverCronStorePath&&t.push("Runner still has legacy OPENCLAW_CRON_STORE_PATH (prefer KYNVER_CRON_STORE_PATH)"),e.deploymentSchedulerProvider==="openclaw-cron"&&t.push("~/.kynver/config.json deploymentSchedulerProvider is still openclaw-cron"),{ok:t.length===0,blockers:t,runnerEnv:r,deploymentSchedulerProvider:e.deploymentSchedulerProvider??null,deploymentSteps:[...yp],runnerSteps:[...Rp]}}function bw(e){return{...e,deploymentSchedulerProvider:"qstash"}}A();import AW from"node:path";import{homedir as OW}from"node:os";var Sw=AW.join(OW(),".kynver","config.json");function ww(e=!1){let r=v(),t=vp(r),n={...t,configPath:F(Sw),configAttestationExample:{deploymentSchedulerProvider:"qstash"}};if(e){console.log(JSON.stringify(n,null,2)),t.ok||(process.exitCode=1);return}console.log(`AgentOS scheduler provider cutover checklist
126
126
  `),console.log("Deployment (Railway):");for(let o of yp)console.log(` - ${o}`);console.log(`
127
127
  User runner:`);for(let o of Rp)console.log(` - ${o}`);if(console.log(`
@@ -136,5 +136,5 @@ Blockers:`);for(let n of t.blockers)console.log(` ! ${n}`);process.exitCode=1;r
136
136
  `)}function GW(e){let r=e.resourceGate,t=[];if(t.push(`Worker slots ${r.activeWorkers}/${r.maxConcurrentWorkers} \xB7 available ${r.slotsAvailable}`),e.workers.length===0)return t.push("No active or attention workers."),t.join(`
137
137
  `);for(let n of e.workers)t.push(jW(n));return t.join(`
138
138
  `)}function YW(e){if(!e.taskId)return"missing --task <id>";if(!e.taskFound||e.workers.length===0)return`No harness worker found for task ${e.taskId}`;let r=e.workers[0];return[`task ${e.taskId}`,`${r.runId}/${r.worker}`,r.status,r.attention,r.leaseOwner?`lease=${r.leaseOwner}`:null,r.model?`model=${r.model}`:null,r.currentTask?`tool=${_p(r.currentTask)}`:null,r.completionBlocker??r.heartbeatBlocker??r.attentionReason??null].filter(n=>!!n).join(" \xB7 ")}function Ww(e){return e.mode==="workers"?GW(e):e.mode==="task"?YW(e):VW(e)}function JW(e){return e.full===!0||e.full==="true"?"full":e.json===!0||e.json==="true"?"json":e.workers===!0||e.workers==="true"?"workers":typeof e.task=="string"&&e.task.trim()?"task":"compact"}function Fw(e){let r=JW(e);if(r==="full"){let n=Cp({mode:"full"});console.log(JSON.stringify(n,null,2));return}let t=Cp({mode:r,taskId:typeof e.task=="string"?e.task:void 0});if(r==="json"){console.log(JSON.stringify(t,null,2));return}console.log(Ww(t))}A();function Hw(e){return{Authorization:`Bearer ${e}`,"Content-Type":"application/json"}}async function Kw(e){let r=await e.text();try{return JSON.parse(r)}catch{return{error:r||`HTTP ${e.status}`}}}function $w(e){let r=typeof e.agentOsId=="string"?e.agentOsId.trim():"",t=v().agentOsId?.trim()??"",n=r||t;return n||(console.error("No AgentOS workspace configured \u2014 pass --agent-os-id or run `kynver setup`."),process.exit(1)),n}async function jw(e){let r=$w(e),t=L(typeof e.baseUrl=="string"?e.baseUrl:void 0),n=X();n||(console.error("Not logged in \u2014 run `kynver login` first."),process.exit(1));let o=`${t}/api/agent-os/by-id/${encodeURIComponent(r)}/runtime-chat/primary`,s=await fetch(o,{headers:Hw(n)}),i=await Kw(s);s.ok||(console.error(typeof i.error=="string"?i.error:`HTTP ${s.status}`),process.exit(1));let a=typeof i.chatPrimaryBoxId=="string"&&i.chatPrimaryBoxId.trim()?i.chatPrimaryBoxId.trim():null,l=wl();if(e.json===!0){console.log(JSON.stringify({agentOsId:r,chatPrimaryBoxId:a,thisBoxId:l},null,2));return}console.log(`agentOsId: ${r}`),console.log(`chatPrimaryBoxId: ${a??"(unset \u2014 will auto-elect on first claim)"}`),console.log(`thisBoxId: ${l}${a&&a===l?" (primary)":""}`)}async function Vw(e){let r=$w(e),t=L(typeof e.baseUrl=="string"?e.baseUrl:void 0),n=X();n||(console.error("Not logged in \u2014 run `kynver login` first."),process.exit(1));let o;e.clear===!0?o=null:typeof e.boxId=="string"&&e.boxId.trim()?o=e.boxId.trim():o=wl();let s=`${t}/api/agent-os/by-id/${encodeURIComponent(r)}/runtime-chat/primary`,i=await fetch(s,{method:"PATCH",headers:Hw(n),body:JSON.stringify({boxId:o})}),a=await Kw(i);i.ok||(console.error(typeof a.error=="string"?a.error:`HTTP ${i.status}`),process.exit(1));let l=typeof a.chatPrimaryBoxId=="string"&&a.chatPrimaryBoxId.trim()?a.chatPrimaryBoxId.trim():null;if(e.json===!0){console.log(JSON.stringify({ok:!0,agentOsId:r,chatPrimaryBoxId:l},null,2));return}console.log(l?`Chat primary set to ${l} for ${r}`:`Chat primary cleared for ${r} (next claim will auto-elect)`)}function XW(e){if(e==="doctor")return;let r=process.env.KYNVER_NODE_POLICY_TEST_VERSION?.trim()||process.versions.node,t=go(r,Zs);t.status!=="compatible"&&(console.error([`kynver requires Node ${t.requiredRange}; this host is running Node ${t.currentVersion} (${t.status}).`,t.remediation??"","Run `kynver doctor node-runtime` for a full report. Diagnostic commands remain available."].filter(Boolean).join(`
139
- `)),process.exit(1))}function xp(e){return e==="help"||e==="--help"||e==="-h"}var QW=["help","login","bootstrap","start","setup","status","daemon","cleanup","wsl-crashes","chat-primary status","chat-primary set","runner credential","runner credential mint","runner credential status","runner credential list","runner credential revoke","runner credential rotate","run create","run list","run resolve","run status","run dispatch","run sweep","run reconcile","run unblock","worker start","worker list","worker status","worker tail","worker stop","worker complete","worker discard-disposable","worker auto-complete","plan progress","plan verify","plan persist","plan outbox list","plan outbox drain","harness verify","monitor start","monitor status","monitor stop","monitor list","monitor tick","monitor auto-complete","monitor run-loop","config ensure-default-repo","doctor runner-install","doctor node-runtime","doctor local-store","doctor context-envelope","doctor runtime-takeover","scheduler cutover-check","scheduler attest-cutover","cron install","cron verify","cron status","cron tick","lane tick","lane tick landing-maintainer","board contract"];function Bie(){return[...QW]}function Ep(e,r){let t=[e,r].filter(Boolean).join(" ");console.error(`unknown command: ${t||"(none)"}`),Pp(1)}function Pp(e=0){(e===0?console.log:console.error)(["Usage:"," kynver login [--api-key KEY] [--api-base-url URL] (omit --api-key to authorize in the browser)"," kynver bootstrap [--api-base-url URL] [--api-key KEY] [--repo PATH] (login + setup + runner credential in one shot)"," kynver start [--repo PATH] [--api-base-url URL] [--run RUN_ID] [--interval-ms MS] [--chat-oauth] [--install-systemd] (bring your agent online: bootstrap if needed + run + keeper-supervised daemon; --install-systemd enables Linux user unit)"," kynver chat-primary status [--agent-os-id ID] [--json] (show sticky chat primary box for this workspace)"," kynver chat-primary set [--box-id ID] [--agent-os-id ID] [--clear] [--json] (set sticky chat primary; omit --box-id to use this box)"," kynver runner credential [mint] [--agent-os-id ID] [--base-url URL] (default: mint new scoped token)"," kynver runner credential status [--agent-os-id ID] (show local token state; no server call)"," kynver runner credential list [--agent-os-id ID] [--base-url URL] (list active credentials on server)"," kynver runner credential revoke --token-id ID [--agent-os-id AOS_ID] [--base-url URL]"," kynver runner credential rotate --token-id ID [--agent-os-id AOS_ID] [--base-url URL] (revoke old + mint new; saves to ~/.kynver/credentials)"," kynver setup [--api-base-url URL] [--agent-os-id ID] [--agent-os-slug SLUG] [--box-kind box|forge|ghost] [--box-id box:my-laptop] [--repo PATH] [--discover-repo] [--max-workers N] [--provider claude|cursor] [--chat-oauth]"," kynver daemon --run RUN_ID --agent-os-id AOS_ID [--execute] [--interval-ms MS] [--stall-ms MS] [--no-supervise]"," kynver status [--compact] [--workers] [--task TASK_ID] [--json] [--full] # factory-wide harness summary"," kynver run list"," kynver run resolve --name RUN_NAME"," kynver run status --run RUN_ID [--full] # defaults to compact shallow map with drill-down commands"," kynver run dispatch --run RUN_ID --agent-os-id AOS_ID [--base-url URL] [--secret SECRET] [--execute] [--lane any|implementation|review|landing] [--target-task-id TASK_ID] [--executor harness] [--max-starts 1] [--lease-ms MS] [--owned path[,path]] [--provider claude|cursor|codex] [--model claude-opus-4-8] [--disk-path /] [--reconcile-stale-blockers]"," kynver run sweep --run RUN_ID --agent-os-id AOS_ID [--base-url URL] [--secret SECRET] [--grace-ms MS]",' kynver worker start --run RUN_ID --name worker --task "..." [--owned path[,path]] [--model MODEL] [--provider claude|cursor] [--agent-os-id AOS_ID] [--task-id TASK_ID] [--wait] [--emit-json]'," kynver worker list --run RUN_ID [--full] # defaults to compact shallow map with drill-down commands"," kynver worker status --run RUN_ID --name worker"," kynver worker tail --run RUN_ID --name worker [--lines 40] [--raw]"," kynver worker stop --run RUN_ID --name worker"," kynver worker complete --run RUN_ID --name worker [--agent-os-id AOS_ID] [--task-id TASK_ID] [--base-url URL] [--secret SECRET]"," kynver worker discard-disposable --run RUN_ID --name worker --path scripts/helper.mjs[,other]"," kynver worker auto-complete --run RUN_ID --name worker [--agent-os-id AOS_ID] [--poll-ms 5000] [--max-total-ms 21600000] [--complete-attempts 3] [--complete-backoff-ms 5000] [--base-url URL] [--secret SECRET]"," kynver run reconcile"," kynver run unblock [--agent-os-id AOS_ID] [--base-url URL] [--secret SECRET] [--dry-run]"," kynver plan progress --plan PLAN_ID --row ROW_KEY --role ROLE --status STATUS [--task TASK_ID] [--note NOTE] [--evidence type:value] [--agent-os-id AOS_ID]"," kynver plan verify --plan PLAN_ID [--worktree PATH] [--task TASK_ID] [--human-override] [--local]"," kynver harness verify --worktree PATH [--command CMD] [--json] [--wait-for-admission-ms MS] [--timeout-ms MS]"," kynver plan persist --operation create|add_version|update_metadata --title TITLE (--body-file PATH | --body TEXT) [--slug SLUG] [--plan PLAN_ID] [--summary TEXT] [--failure-kind approval_guard|auth|network|server|tool_interruption]"," kynver plan outbox list"," kynver plan outbox drain [--max N] [--id OUTBOX_ID]"," kynver cleanup [--execute] [--compact] [--node-modules-age-ms MS] [--worktrees-age-ms MS] [--harness-root PATH] [--include-orphans] [--skip-finalize] [--account-bytes]"," kynver wsl-crashes [--json] [--execute] [--purge-all] [--keep-newest N]"," --include-orphans also scans whole worktree directories (<harnessRoot>/worktrees/<runId>/<workerId>/) that no run/worker.json references; orphans pass salvage gates (recent heartbeat, dirty git, ahead of origin/main) before removal."," Dry-run defaults to fast scan (no byte accounting). Pass --account-bytes for reclaimable byte totals. Pass --compact for a bounded operator summary (no full action list)."," kynver monitor start --run RUN_ID [--name worker] [--agent-os-id AOS_ID] [--poll-ms MS]"," kynver monitor status [--run RUN_ID] [--name worker] [--tick]"," kynver monitor stop --run RUN_ID [--name worker]"," kynver monitor list"," kynver monitor tick --run RUN_ID [--name worker] [--agent-os-id AOS_ID] [--auto-complete] [--renew-leases]"," kynver monitor auto-complete --run RUN_ID --name worker [--agent-os-id AOS_ID] [--base-url URL] [--secret SECRET]"," kynver monitor run-loop --run RUN_ID --monitor-id ID [--name worker] [--agent-os-id AOS_ID] [--poll-ms MS] [--auto-complete] [--renew-leases]"," kynver config ensure-default-repo [--json]"," kynver doctor runner-install (BYOC M0.3 \u2014 six-stage lifecycle health check for new users)"," kynver doctor node-runtime (Node 24 migration \u2014 report-only host runtime classification, JSON)"," kynver doctor local-store [--no-probe] (durable-harness D0 \u2014 local-run-store openability, flags, quarantine history, JSON; default probe creates the store db if absent)"," kynver doctor context-envelope [--slug SLUG] [--agent-os-id ID] [--task-id TASK_ID] [--base-url URL]"," kynver doctor runtime-takeover [--remediate] [--remediate-default-repo]"," kynver scheduler cutover-check [--json]"," kynver scheduler attest-cutover [--json]"," kynver cron install [--dry-run] [--json] [--install-systemd] [--confirm-qstash-removal] [--skip-watchdog] [--skip-test-fire] [--agent-os-id ID] [--api-base-url URL] [--run RUN_ID]"," kynver cron verify [--json]"," kynver cron status [--json]"," kynver cron tick [--agent-os-id AOS_ID] [--json]"," kynver lane tick landing-maintainer [--fleet] [--repo OWNER/NAME] [--agent-os-id AOS_ID] [--execute] [--json]"," kynver board contract [--agent-os-id ID] [--base-url URL] [--since ISO] [--limit N]"].join(`
140
- `)),process.exit(e)}async function ZW(e=process.argv.slice(2)){if(bf(e,import.meta.url,"kynver"))return;if(e.length===0||xp(e[0]))return Pp(0);XW(e[0]);let r=e.shift(),t,n;if((r==="run"||r==="worker"||r==="plan"||r==="runner"||r==="harness"||r==="monitor"||r==="doctor"||r==="config"||r==="scheduler"||r==="cron"||r==="lane"||r==="board")&&(t=e.shift()),n=e,t&&xp(t)||n.some(xp))return Pp(0);let o=Yo(n),{runsDir:s,worktreesDir:i}=re();if(Gw(s,{recursive:!0}),Gw(i,{recursive:!0}),r==="daemon"&&Nn(),KS(r,t)){let a,l=o.run?String(o.run).trim():"";if(l)try{a=H(l).repo}catch{a=void 0}await HS({repoRoot:a,cwd:a})}if(r==="login")return void await gf(o);if(r==="bootstrap")return void await ji(o);if(r==="start")return void await rS(o);if(r==="runner"&&t==="credential"){let a=n[0]&&!n[0].startsWith("--")?n.shift():void 0,l=Yo(n);if(!a||a==="mint")return void await uf(l);if(a==="status")return void ff(l);if(a==="list")return void await df(l);if(a==="revoke")return void await pf(l);if(a==="rotate")return void await mf(l);Ep("runner credential",a)}if(r==="setup")return void await $i(o);if(r==="chat-primary"&&t==="status")return void await jw(o);if(r==="chat-primary"&&t==="set")return void await Vw(o);if(r==="status")return Fw(o);if(r==="daemon")return Qi(o)?void await Zi(o):void await Cl(o);if(r==="plan"&&t==="progress")return void await fS(o);if(r==="plan"&&t==="verify")return void await gS(o);if(r==="harness"&&t==="verify")return hS(o);if(r==="plan"&&t==="persist")return void await kS(o);if(r==="plan"&&t==="outbox"){let a=n.shift();if(a==="list")return void await yS();if(a==="drain")return void await RS(Yo(n));Ep("plan",`outbox ${a??""}`.trim())}if(r==="cleanup")return vS(o);if(r==="wsl-crashes")return bS(o);if(r==="config"&&t==="ensure-default-repo")return Xf(o.json===!0);if(r==="doctor"&&!t)return console.error("Running `kynver doctor runner-install` (default). Other reports: node-runtime, local-store, context-envelope, runtime-takeover."),void await mp();if(r==="doctor"&&t==="runner-install")return void await mp();if(r==="doctor"&&t==="node-runtime")return dw();if(r==="doctor"&&t==="local-store")return mw(o);if(r==="doctor"&&t==="context-envelope")return void await Rw(o);if(r==="doctor"&&t==="runtime-takeover")return tw(o);if(r==="scheduler"&&t==="cutover-check")return ww(o.json===!0);if(r==="scheduler"&&t==="attest-cutover")return Cw(o.json===!0);if(r==="cron"&&t==="install")return void await Ew(o);if(r==="cron"&&t==="verify")return void await Pw(o);if(r==="cron"&&t==="status")return void await _w(o.json===!0);if(r==="cron"&&t==="tick")return void await xw(o);if(r==="lane"&&t==="tick"){let a=n.shift();return void await Nw(Yo(n),a)}if(r==="board"&&t==="contract")return void await vw(o);if(r==="run"&&t==="create")return void _l(o);if(r==="run"&&t==="list")return Ub();if(r==="run"&&t==="resolve")return $S(o);if(r==="run"&&t==="status")return ty(o);if(r==="run"&&t==="dispatch")return void await Ft(o);if(r==="run"&&t==="sweep")return void await Bs(o);if(r==="run"&&t==="reconcile")return vR();if(r==="run"&&t==="unblock")return void await jS(o);if(r==="worker"&&t==="start")return void await dy(o);if(r==="worker"&&t==="list")return Xk(o);if(r==="worker"&&t==="status")return qk(o);if(r==="worker"&&t==="tail")return ny(o);if(r==="worker"&&t==="stop")return oy(o);if(r==="worker"&&t==="complete")return void await Du(o);if(r==="worker"&&t==="discard-disposable")return tS(o);if(r==="worker"&&t==="auto-complete")return void await ay(o);if(r==="monitor"&&t==="start"){let a=await MS(o);console.log(JSON.stringify(a,null,2));return}if(r==="monitor"&&t==="status")return void await LS(o);if(r==="monitor"&&t==="stop")return US(o);if(r==="monitor"&&t==="list")return BS();if(r==="monitor"&&t==="tick")return void await FS(o);if(r==="monitor"&&t==="auto-complete")return void await lp(o);if(r==="monitor"&&t==="run-loop")return void await WS(o);Ep(r,t)}function Yw(e){let r=e?.trim();if(!r||r==="-")return null;try{return qW.native(r)}catch{return null}}var eF=Yw(process.argv[1])===Yw(zW(import.meta.url));eF&&ZW().catch(e=>{console.error(e),process.exit(1)});export{QW as KNOWN_CLI_VERBS,Bie as listKnownCliVerbs,ZW as main,Pp as usage};
139
+ `)),process.exit(1))}function xp(e){return e==="help"||e==="--help"||e==="-h"}var QW=["help","login","bootstrap","start","setup","status","daemon","cleanup","wsl-crashes","chat-primary status","chat-primary set","runner credential","runner credential mint","runner credential status","runner credential list","runner credential revoke","runner credential rotate","run create","run list","run resolve","run status","run dispatch","run sweep","run reconcile","run unblock","worker start","worker list","worker status","worker tail","worker stop","worker complete","worker discard-disposable","worker auto-complete","plan progress","plan verify","plan persist","plan outbox list","plan outbox drain","harness verify","monitor start","monitor status","monitor stop","monitor list","monitor tick","monitor auto-complete","monitor run-loop","config ensure-default-repo","doctor runner-install","doctor node-runtime","doctor local-store","doctor context-envelope","doctor runtime-takeover","scheduler cutover-check","scheduler attest-cutover","cron install","cron verify","cron status","cron tick","lane tick","lane tick landing-maintainer","board contract"];function Fie(){return[...QW]}var ZW=["run","worker","plan","runner","harness","monitor","doctor","config","scheduler","cron","lane","board","chat-primary"];function eF(e){return e!==void 0&&ZW.includes(e)}function Ep(e,r){let t=[e,r].filter(Boolean).join(" ");console.error(`unknown command: ${t||"(none)"}`),Pp(1)}function Pp(e=0){(e===0?console.log:console.error)(["Usage:"," kynver login [--api-key KEY] [--api-base-url URL] (omit --api-key to authorize in the browser)"," kynver bootstrap [--api-base-url URL] [--api-key KEY] [--repo PATH] (login + setup + runner credential in one shot)"," kynver start [--repo PATH] [--api-base-url URL] [--run RUN_ID] [--interval-ms MS] [--chat-oauth] [--install-systemd] (bring your agent online: bootstrap if needed + run + keeper-supervised daemon; --install-systemd enables Linux user unit)"," kynver chat-primary status [--agent-os-id ID] [--json] (show sticky chat primary box for this workspace)"," kynver chat-primary set [--box-id ID] [--agent-os-id ID] [--clear] [--json] (set sticky chat primary; omit --box-id to use this box)"," kynver runner credential [mint] [--agent-os-id ID] [--base-url URL] (default: mint new scoped token)"," kynver runner credential status [--agent-os-id ID] (show local token state; no server call)"," kynver runner credential list [--agent-os-id ID] [--base-url URL] (list active credentials on server)"," kynver runner credential revoke --token-id ID [--agent-os-id AOS_ID] [--base-url URL]"," kynver runner credential rotate --token-id ID [--agent-os-id AOS_ID] [--base-url URL] (revoke old + mint new; saves to ~/.kynver/credentials)"," kynver setup [--api-base-url URL] [--agent-os-id ID] [--agent-os-slug SLUG] [--box-kind box|forge|ghost] [--box-id box:my-laptop] [--repo PATH] [--discover-repo] [--max-workers N] [--provider claude|cursor] [--chat-oauth]"," kynver daemon --run RUN_ID --agent-os-id AOS_ID [--execute] [--interval-ms MS] [--stall-ms MS] [--no-supervise]"," kynver status [--compact] [--workers] [--task TASK_ID] [--json] [--full] # factory-wide harness summary"," kynver run list"," kynver run resolve --name RUN_NAME"," kynver run status --run RUN_ID [--full] # defaults to compact shallow map with drill-down commands"," kynver run dispatch --run RUN_ID --agent-os-id AOS_ID [--base-url URL] [--secret SECRET] [--execute] [--lane any|implementation|review|landing] [--target-task-id TASK_ID] [--executor harness] [--max-starts 1] [--lease-ms MS] [--owned path[,path]] [--provider claude|cursor|codex] [--model claude-opus-4-8] [--disk-path /] [--reconcile-stale-blockers]"," kynver run sweep --run RUN_ID --agent-os-id AOS_ID [--base-url URL] [--secret SECRET] [--grace-ms MS]",' kynver worker start --run RUN_ID --name worker --task "..." [--owned path[,path]] [--model MODEL] [--provider claude|cursor] [--agent-os-id AOS_ID] [--task-id TASK_ID] [--wait] [--emit-json]'," kynver worker list --run RUN_ID [--full] # defaults to compact shallow map with drill-down commands"," kynver worker status --run RUN_ID --name worker"," kynver worker tail --run RUN_ID --name worker [--lines 40] [--raw]"," kynver worker stop --run RUN_ID --name worker"," kynver worker complete --run RUN_ID --name worker [--agent-os-id AOS_ID] [--task-id TASK_ID] [--base-url URL] [--secret SECRET]"," kynver worker discard-disposable --run RUN_ID --name worker --path scripts/helper.mjs[,other]"," kynver worker auto-complete --run RUN_ID --name worker [--agent-os-id AOS_ID] [--poll-ms 5000] [--max-total-ms 21600000] [--complete-attempts 3] [--complete-backoff-ms 5000] [--base-url URL] [--secret SECRET]"," kynver run reconcile"," kynver run unblock [--agent-os-id AOS_ID] [--base-url URL] [--secret SECRET] [--dry-run]"," kynver plan progress --plan PLAN_ID --row ROW_KEY --role ROLE --status STATUS [--task TASK_ID] [--note NOTE] [--evidence type:value] [--agent-os-id AOS_ID]"," kynver plan verify --plan PLAN_ID [--worktree PATH] [--task TASK_ID] [--human-override] [--local]"," kynver harness verify --worktree PATH [--command CMD] [--json] [--wait-for-admission-ms MS] [--timeout-ms MS]"," kynver plan persist --operation create|add_version|update_metadata --title TITLE (--body-file PATH | --body TEXT) [--slug SLUG] [--plan PLAN_ID] [--summary TEXT] [--failure-kind approval_guard|auth|network|server|tool_interruption]"," kynver plan outbox list"," kynver plan outbox drain [--max N] [--id OUTBOX_ID]"," kynver cleanup [--execute] [--compact] [--node-modules-age-ms MS] [--worktrees-age-ms MS] [--harness-root PATH] [--include-orphans] [--skip-finalize] [--account-bytes]"," kynver wsl-crashes [--json] [--execute] [--purge-all] [--keep-newest N]"," --include-orphans also scans whole worktree directories (<harnessRoot>/worktrees/<runId>/<workerId>/) that no run/worker.json references; orphans pass salvage gates (recent heartbeat, dirty git, ahead of origin/main) before removal."," Dry-run defaults to fast scan (no byte accounting). Pass --account-bytes for reclaimable byte totals. Pass --compact for a bounded operator summary (no full action list)."," kynver monitor start --run RUN_ID [--name worker] [--agent-os-id AOS_ID] [--poll-ms MS]"," kynver monitor status [--run RUN_ID] [--name worker] [--tick]"," kynver monitor stop --run RUN_ID [--name worker]"," kynver monitor list"," kynver monitor tick --run RUN_ID [--name worker] [--agent-os-id AOS_ID] [--auto-complete] [--renew-leases]"," kynver monitor auto-complete --run RUN_ID --name worker [--agent-os-id AOS_ID] [--base-url URL] [--secret SECRET]"," kynver monitor run-loop --run RUN_ID --monitor-id ID [--name worker] [--agent-os-id AOS_ID] [--poll-ms MS] [--auto-complete] [--renew-leases]"," kynver config ensure-default-repo [--json]"," kynver doctor runner-install (BYOC M0.3 \u2014 six-stage lifecycle health check for new users)"," kynver doctor node-runtime (Node 24 migration \u2014 report-only host runtime classification, JSON)"," kynver doctor local-store [--no-probe] (durable-harness D0 \u2014 local-run-store openability, flags, quarantine history, JSON; default probe creates the store db if absent)"," kynver doctor context-envelope [--slug SLUG] [--agent-os-id ID] [--task-id TASK_ID] [--base-url URL]"," kynver doctor runtime-takeover [--remediate] [--remediate-default-repo]"," kynver scheduler cutover-check [--json]"," kynver scheduler attest-cutover [--json]"," kynver cron install [--dry-run] [--json] [--install-systemd] [--confirm-qstash-removal] [--skip-watchdog] [--skip-test-fire] [--agent-os-id ID] [--api-base-url URL] [--run RUN_ID]"," kynver cron verify [--json]"," kynver cron status [--json]"," kynver cron tick [--agent-os-id AOS_ID] [--json]"," kynver lane tick landing-maintainer [--fleet] [--repo OWNER/NAME] [--agent-os-id AOS_ID] [--execute] [--json]"," kynver board contract [--agent-os-id ID] [--base-url URL] [--since ISO] [--limit N]"].join(`
140
+ `)),process.exit(e)}async function rF(e=process.argv.slice(2)){if(bf(e,import.meta.url,"kynver"))return;if(e.length===0||xp(e[0]))return Pp(0);XW(e[0]);let r=e.shift(),t,n;if(eF(r)&&(t=e.shift()),n=e,t&&xp(t)||n.some(xp))return Pp(0);let o=Yo(n),{runsDir:s,worktreesDir:i}=re();if(Gw(s,{recursive:!0}),Gw(i,{recursive:!0}),r==="daemon"&&Nn(),KS(r,t)){let a,l=o.run?String(o.run).trim():"";if(l)try{a=H(l).repo}catch{a=void 0}await HS({repoRoot:a,cwd:a})}if(r==="login")return void await gf(o);if(r==="bootstrap")return void await ji(o);if(r==="start")return void await rS(o);if(r==="runner"&&t==="credential"){let a=n[0]&&!n[0].startsWith("--")?n.shift():void 0,l=Yo(n);if(!a||a==="mint")return void await uf(l);if(a==="status")return void ff(l);if(a==="list")return void await df(l);if(a==="revoke")return void await pf(l);if(a==="rotate")return void await mf(l);Ep("runner credential",a)}if(r==="setup")return void await $i(o);if(r==="chat-primary"&&t==="status")return void await jw(o);if(r==="chat-primary"&&t==="set")return void await Vw(o);if(r==="status")return Fw(o);if(r==="daemon")return Qi(o)?void await Zi(o):void await Cl(o);if(r==="plan"&&t==="progress")return void await fS(o);if(r==="plan"&&t==="verify")return void await gS(o);if(r==="harness"&&t==="verify")return hS(o);if(r==="plan"&&t==="persist")return void await kS(o);if(r==="plan"&&t==="outbox"){let a=n.shift();if(a==="list")return void await yS();if(a==="drain")return void await RS(Yo(n));Ep("plan",`outbox ${a??""}`.trim())}if(r==="cleanup")return vS(o);if(r==="wsl-crashes")return bS(o);if(r==="config"&&t==="ensure-default-repo")return Xf(o.json===!0);if(r==="doctor"&&!t)return console.error("Running `kynver doctor runner-install` (default). Other reports: node-runtime, local-store, context-envelope, runtime-takeover."),void await mp();if(r==="doctor"&&t==="runner-install")return void await mp();if(r==="doctor"&&t==="node-runtime")return dw();if(r==="doctor"&&t==="local-store")return mw(o);if(r==="doctor"&&t==="context-envelope")return void await Rw(o);if(r==="doctor"&&t==="runtime-takeover")return tw(o);if(r==="scheduler"&&t==="cutover-check")return ww(o.json===!0);if(r==="scheduler"&&t==="attest-cutover")return Cw(o.json===!0);if(r==="cron"&&t==="install")return void await Ew(o);if(r==="cron"&&t==="verify")return void await Pw(o);if(r==="cron"&&t==="status")return void await _w(o.json===!0);if(r==="cron"&&t==="tick")return void await xw(o);if(r==="lane"&&t==="tick"){let a=n.shift();return void await Nw(Yo(n),a)}if(r==="board"&&t==="contract")return void await vw(o);if(r==="run"&&t==="create")return void _l(o);if(r==="run"&&t==="list")return Ub();if(r==="run"&&t==="resolve")return $S(o);if(r==="run"&&t==="status")return ty(o);if(r==="run"&&t==="dispatch")return void await Ft(o);if(r==="run"&&t==="sweep")return void await Bs(o);if(r==="run"&&t==="reconcile")return vR();if(r==="run"&&t==="unblock")return void await jS(o);if(r==="worker"&&t==="start")return void await dy(o);if(r==="worker"&&t==="list")return Xk(o);if(r==="worker"&&t==="status")return qk(o);if(r==="worker"&&t==="tail")return ny(o);if(r==="worker"&&t==="stop")return oy(o);if(r==="worker"&&t==="complete")return void await Du(o);if(r==="worker"&&t==="discard-disposable")return tS(o);if(r==="worker"&&t==="auto-complete")return void await ay(o);if(r==="monitor"&&t==="start"){let a=await MS(o);console.log(JSON.stringify(a,null,2));return}if(r==="monitor"&&t==="status")return void await LS(o);if(r==="monitor"&&t==="stop")return US(o);if(r==="monitor"&&t==="list")return BS();if(r==="monitor"&&t==="tick")return void await FS(o);if(r==="monitor"&&t==="auto-complete")return void await lp(o);if(r==="monitor"&&t==="run-loop")return void await WS(o);Ep(r,t)}function Yw(e){let r=e?.trim();if(!r||r==="-")return null;try{return qW.native(r)}catch{return null}}var tF=Yw(process.argv[1])===Yw(zW(import.meta.url));tF&&rF().catch(e=>{console.error(e),process.exit(1)});export{QW as KNOWN_CLI_VERBS,ZW as TWO_TOKEN_CLI_SCOPES,Fie as listKnownCliVerbs,rF as main,Pp as usage};