@kynver-app/runtime 0.2.122 → 0.2.129
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/dist/cli.js +255 -188
- package/dist/daemon-tick-thread.js +114 -50
- package/dist/desktop-entry.js +208 -144
- package/dist/index.js +279 -212
- package/dist/local-run-store/index.js +73 -9
- package/dist/server/cleanup.js +78 -14
- package/dist/server/default-repo.js +65 -1
- package/dist/server/dispatch-routing.js +67 -3
- package/dist/server/memory-cost-enforce.js +2 -2
- package/dist/server/memory-cost.js +1 -1
- package/dist/server/model-routing.js +67 -3
- package/dist/server/monitor.js +71 -7
- package/dist/server/orchestration.js +65 -1
- package/dist/server/worker-policy.js +66 -2
- package/dist/worker-broker/index.js +4 -4
- package/package.json +1 -1
package/dist/server/monitor.js
CHANGED
|
@@ -1,8 +1,72 @@
|
|
|
1
|
-
var l=(e,r,t)=>()=>{if(t)throw t[0];try{return e&&(r=e(e=0)),r}catch(n){throw t=[n],n}};function
|
|
1
|
+
var l=(e,r,t)=>()=>{if(t)throw t[0];try{return e&&(r=e(e=0)),r}catch(n){throw t=[n],n}};function oe(e){let r=e.trim();if(!r.startsWith("{"))return null;try{let t=JSON.parse(r);if(t&&typeof t=="object"&&!Array.isArray(t))return t}catch{return null}return null}function We(e){let r=e.trim();if(!r)return null;let t=oe(r);if(t)return t;let n=[],o=/```(?:json)?\s*([\s\S]*?)```/gi,s;for(;(s=o.exec(r))!==null;){let u=oe(s[1]??"");u&&n.push(u)}let i=r.indexOf("{"),a=r.lastIndexOf("}");if(i>=0&&a>i){let u=oe(r.slice(i,a+1));u&&n.push(u)}return n.length>0?n[n.length-1]:null}function Be(e){let r=e.finalResult??e.final_result;if(r!=null)return typeof r=="string"?We(r)??(r.trim()||null):r;let t=typeof e.summary=="string"?e.summary.trim():"";if(!t)return null;let n=We(t);return n||t}var De=l(()=>{"use strict"});var Ue=l(()=>{"use strict"});import{existsSync as Ct,mkdirSync as Io,readFileSync as At,readdirSync as To,renameSync as No,rmSync as Ko,statSync as Me,writeFileSync as Wo}from"node:fs";function se(e){console.error(e),process.exit(1)}function ie(e){return process.platform!=="win32"?e:{windowsHide:!0,...e}}function D(e){try{return JSON.parse(e)}catch{return null}}function U(e){try{return Me(e).size}catch{return 0}}function M(e){try{return Me(e).mtime.toISOString()}catch{return null}}function F(e,r){return Ct(e)?At(e,"utf8").split(`
|
|
2
2
|
`).slice(-r).join(`
|
|
3
|
-
`):""}function
|
|
4
|
-
`).filter(Boolean);for(let s of o){let i=
|
|
5
|
-
`).find(Boolean)??o,160):"npm audit failed"}function
|
|
6
|
-
${e.stderr}`.trim(),t=
|
|
7
|
-
`).filter(Boolean),n=null,o=
|
|
8
|
-
`).map(r=>r.trim()).filter(Boolean)}function I(e,r){try{let t=ir("git",r,te({cwd:e,encoding:"utf8"}));return{status:t.status,stdout:t.stdout||"",stderr:t.stderr||"",error:t.error?t.error.message:null}}catch(t){return{status:null,stdout:"",stderr:"",error:t.message}}}function sr(e,r,t){let n=I(e,["merge-base","--is-ancestor",r,t]);return n.status===0?{isAncestor:!0,error:null}:n.status===1?{isAncestor:!1,error:null}:{isAncestor:null,error:n.error||n.stderr||n.stdout||`git exited ${n.status}`}}function lr(e,r="origin/main"){let t=typeof r=="string"?{base:r}:r,n=t.baseCommit?.trim()||t.base?.trim()||"origin/main",o=t.baseCommit?.trim()||null;if(!e)return _(n,"missing worktree path");let s=I(e,["rev-parse","HEAD"]);if(s.status!==0)return _(n,s.error||s.stderr||s.stdout||"failed to resolve HEAD");let i;if(o)i=o;else{let d=I(e,["rev-parse",n]);if(d.status!==0)return _(n,d.error||d.stderr||d.stdout||`failed to resolve ${n}`,s.stdout.trim());i=d.stdout.trim()}let a=s.stdout.trim();if(a===i)return{checked:!0,base:n,head:a,baseHead:i,baseIsAncestorOfHead:!0,headIsAncestorOfBase:!0,relation:"synced"};let u=sr(e,i,a),f=sr(e,a,i),m=u.error||f.error||void 0;if(u.isAncestor==null||f.isAncestor==null)return{checked:!1,base:n,head:a,baseHead:i,baseIsAncestorOfHead:u.isAncestor,headIsAncestorOfBase:f.isAncestor,relation:"unknown",...m?{error:m}:{}};let c=u.isAncestor?"ahead":f.isAncestor?"merged":"diverged";return{checked:!0,base:n,head:a,baseHead:i,baseIsAncestorOfHead:u.isAncestor,headIsAncestorOfBase:f.isAncestor,relation:c,...m?{error:m}:{}}}function _(e,r,t=null){return{checked:!1,base:e,head:t,baseHead:null,baseIsAncestorOfHead:null,headIsAncestorOfBase:null,relation:"unknown",error:r}}var L=l(()=>{"use strict";b();g();or()});import{existsSync as an,readFileSync as ln,statSync as dr}from"node:fs";import H from"node:path";function mn(e,r=process.env){let t=e?cn:un,n=r.KYNVER_WORKER_GIT_PROBE_CACHE_TTL_MS?.trim();if(!n)return t;let o=Number(n);return Number.isFinite(o)&&o>=0?Math.floor(o):t}function fn(e){return e.baseCommit?.trim()||e.base?.trim()||"origin/main"}function ce(e){try{return dr(e).mtimeMs}catch{return-1}}function pn(e){let r=H.join(e,".git");try{if(dr(r).isDirectory())return r;let t=/^gitdir:\s*(.+)$/m.exec(ln(r,"utf8"));return t?H.resolve(e,t[1].trim()):null}catch{return null}}function ur(e){let r=pn(e);return[ce(e),r?ce(H.join(r,"HEAD")):-2,r?ce(H.join(r,"index")):-2].join(":")}function cr(e,r){return{changedFiles:ar(e),gitAncestry:lr(e,{base:r.base,baseCommit:r.baseCommit})}}function gn(e,r){for(y.delete(e),y.set(e,r);y.size>dn;){let t=y.keys().next().value;if(t===void 0)break;y.delete(t)}}function mr(e,r,t){let n=fn(r);if(!e||!e.trim())return P.missingWorktree++,{changedFiles:[],gitAncestry:_(n,"missing worktree path")};let o=`${e}\0${n}`;if(!an(e))return y.delete(o),P.missingWorktree++,{changedFiles:[],gitAncestry:_(n,`worktree no longer exists: ${e}`)};if(t.alive)return y.delete(o),P.liveProbes++,cr(e,r);let s=t.ttlMs??mn(!!r.baseCommit?.trim()),i=t.now??Date.now(),a=ur(e),u=y.get(o);if(s>0&&u&&u.fingerprint===a&&i<u.expiresAt)return P.hits++,u.probe;P.misses++;let f=cr(e,r);if(s>0){let m=.8+.4*(t.random??Math.random)();gn(o,{fingerprint:ur(e),expiresAt:i+Math.round(s*m),probe:f})}return f}var un,cn,dn,y,P,fr=l(()=>{"use strict";L();un=10*6e4,cn=60*6e4,dn=2048,y=new Map,P={hits:0,misses:0,liveProbes:0,missingWorktree:0}});function T(e){if(typeof e!="string")return null;let r=e.trim();return r.length?r:null}function hn(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 yn(e){if(T(e.headCommit)||T(e.prUrl)||T(e.artifactBundlePath)||T(e.patchPath))return!0;let r=e.gitAncestry;return!!(r?.checked&&r.headIsAncestorOfBase===!1&&T(r.head))}function pr(e){return hn(e.finalResult)?e.changedFiles.length===0?{blocked:!1}:yn(e)?{blocked:!0,detail:`Worktree has ${e.changedFiles.length} uncommitted change(s); commit or discard before landing`}:{blocked:!0,reason:"dirty_worktree_no_pr",detail:`Worktree has ${e.changedFiles.length} uncommitted change(s) with no commit or PR; commit, open a PR, or discard before landing`}:{blocked:!1}}function gr(e){if(e.blocked)return e.detail??e.reason??"dirty_worktree_no_pr"}var hr=l(()=>{"use strict"});function de(e){let r=e.trim();if(!r.startsWith("{"))return null;try{let t=JSON.parse(r);if(t&&typeof t=="object"&&!Array.isArray(t))return t}catch{return null}return null}function yr(e){let r=e.targetPrReconciliation??e.target_pr_reconciliation??e.targetPrs??e.target_prs;return Array.isArray(r)?r.length:0}function j(e){let r=e.trim();if(!r)return null;let t=de(r);if(t)return t;let n=[],o=/```(?:json)?\s*([\s\S]*?)```/gi,s;for(;(s=o.exec(r))!==null;){let m=de(s[1]??"");m&&n.push(m)}let i=r.indexOf("{"),a=r.lastIndexOf("}");if(i>=0&&a>i){let m=de(r.slice(i,a+1));m&&n.push(m)}if(n.length===0)return null;let u=n[n.length-1],f=yr(u);for(let m of n){let c=yr(m);c>f&&(u=m,f=c)}return u}var me=l(()=>{"use strict"});function kr(e){let r=e.trim().match(/github\.com\/([^/]+\/[^/]+)\/(?:pull|pulls)\/(\d+)/i);return r?`https://github.com/${r[1]}/pull/${r[2]}`:e.trim()||null}function br(e){let r=e.trim().match(/github\.com\/([^/]+\/[^/]+)\/(?:pull|pulls)\/(\d+)/i);return r?`${r[1].toLowerCase()}/pull/${r[2]}`:e.trim().toLowerCase()}function kn(e){return new Set(e.map(r=>br(kr(r)??r)).filter(Boolean))}function Rr(e,r,t){let n=kr(e)??e;if(!n)return"unrelated";let o=br(n);return kn(r).has(o)?"contract":t?(t.outcome==="skipped"||t.outcome==="blocked")&&t.reason?.trim()?"support":(t.outcome==="merged","unrelated"):"unrelated"}var xr=l(()=>{"use strict"});function E(e){if(typeof e!="string")return null;let r=e.trim();return r.length?r:null}function bn(e){return e==null?!1:typeof e=="string"?e.trim().length>0:typeof e=="object"?Object.keys(e).length>0:!0}function R(e){let r=e.trim().match(/github\.com\/([^/]+\/[^/]+)\/(?:pull|pulls)\/(\d+)/i);return r?`https://github.com/${r[1]}/pull/${r[2]}`:E(e)}function Y(e){let r=e.trim().match(/github\.com\/([^/]+\/[^/]+)\/(?:pull|pulls)\/(\d+)/i);return r?`${r[1].toLowerCase()}/pull/${r[2]}`:e.trim().toLowerCase()}function Sr(e){let r=null;if(typeof e=="string"){let o=j(e);o&&(r=o)}else e&&typeof e=="object"&&!Array.isArray(e)&&(r=e);if(!r)return[];let t=r.targetPrReconciliation??r.target_pr_reconciliation;if(!Array.isArray(t))return[];let n=[];for(let o of t){if(!o||typeof o!="object"||Array.isArray(o))continue;let s=o,i=R(String(s.prUrl??s.pr_url??"")),a=E(s.outcome);!i||a!=="merged"&&a!=="skipped"&&a!=="blocked"||n.push({prUrl:i,outcome:a,mergeCommit:E(s.mergeCommit??s.merge_commit),reason:E(s.reason)})}return n}function _r(e,r){let t=[],n=R(E(e.prUrl)??"");if(n&&t.push(n),r&&typeof r=="object"&&!Array.isArray(r)){let o=r,s=R(String(o.prUrl??o.pr_url??""));s&&t.push(s)}return[...new Set(t)]}function Er(e){let{contract:r,snapshot:t}=e,n=e.finalResult??t.finalResult;if(!r.landingOnly&&r.targetPrUrls.length===0&&!r.repairEnforceOriginalPr)return{blocked:!1};if(!bn(n))return(r.requiresTargetPrReconciliation??(r.landingOnly||!!r.repairEnforceOriginalPr||r.targetPrUrls.length>0))&&r.targetPrUrls.length>0?{blocked:!0,reason:"missing_target_pr_reconciliation",detail:`Final result required to reconcile target PR(s): ${r.targetPrUrls.join(", ")}`}:{blocked:!1};if(!(r.requiresTargetPrReconciliation??(r.landingOnly||!!r.repairEnforceOriginalPr||r.targetPrUrls.length>0))&&!r.repairEnforceOriginalPr)return{blocked:!1};let s=r.repairEnforceOriginalPr?R(E(r.targetPrUrl)??"")??(r.targetPrUrls.length===1?R(r.targetPrUrls[0]):null):null;if(s){let c=_r(t,n);if(!(n&&typeof n=="object"&&!Array.isArray(n)&&n.supersedesOriginalTargetPr===!0)){for(let k of c)if(k!==s)return{blocked:!0,reason:"duplicate_repair_pr",detail:`Repair worker opened or attached PR ${k} instead of canonical target ${s}`}}let h=Sr(n).find(k=>k.prUrl===s);if(!h||h.outcome!=="merged"&&!(h.reason?.trim()&&(h.outcome==="skipped"||h.outcome==="blocked")))return{blocked:!0,reason:"missing_repair_target_reconciliation",detail:`Repair worker must reconcile target PR ${s}`}}let i=Sr(n),a=new Map(i.map(c=>[Y(c.prUrl),c])),u=new Set(r.targetPrUrls.map(c=>Y(R(c)??c)).filter(Boolean)),f=_r(t,n);if(r.landingOnly)for(let c of f){let d=a.get(Y(c)),p=Rr(c,r.targetPrUrls,d);if(!(p==="contract"||p==="support"))return u.size>0?{blocked:!0,reason:"unrelated_implementation_pr",detail:`Landing-only worker attached unrelated PR ${c}`}:{blocked:!0,reason:"unrelated_implementation_pr",detail:"Landing-only worker must not open new implementation PRs"}}if(r.targetPrUrls.length===0)return{blocked:!1};let m=[];for(let c of r.targetPrUrls){let d=Y(R(c)??c),p=a.get(d);if(!p){m.push(d);continue}p.outcome!=="merged"&&!p.reason?.trim()&&m.push(d)}return m.length>0?{blocked:!0,reason:m.every(c=>a.has(c))?"incomplete_target_pr_landing":"missing_target_pr_reconciliation",detail:`Target PR reconciliation incomplete: ${m.join(", ")}`}:{blocked:!1}}function vr(e){if(e.blocked)return e.detail??e.reason}var Cr=l(()=>{"use strict";me();xr()});function xn(e){let r=Date.now();if(e.providerTerminalError||M(e.finalResult)||e.finalResult&&e.error?.trim()||O(e.error)||O(e.finalResult)){let o=e.error||(typeof e.finalResult=="string"?e.finalResult:"provider terminal error");return{state:"blocked",reason:ue(o)?.reason??`provider terminal error: ${o}`}}if(e.completionBlocker&&!Ar(e.completionBlocker))return{state:"blocked",reason:e.completionBlocker};if(e.finalResult){if(e.localOnly&&_n(e.finalResult))return{state:"done",reason:"local-only worker superseded by merged PR"};let o={finalResult:e.finalResult,changedFiles:e.changedFiles??[],gitAncestry:e.gitAncestry??null,prUrl:e.prUrl??null},s=pr(o);if(s.blocked){let i=gr(s);return{state:"needs_attention",reason:s.reason?`landing blocked (${s.reason}): ${i}`:`landing blocked: ${i}`}}if(e.landingContract){let i=Er({contract:e.landingContract,snapshot:o,finalResult:e.finalResult}),a=vr(i);if(a)return{state:"needs_attention",reason:i.reason?`landing contract (${i.reason}): ${a}`:`landing contract: ${a}`}}return{state:"done",reason:"final result recorded"}}if(!e.alive){if(Sn(e))return{state:"done",reason:"empty abandoned worker record"};let o=ue(e.error);if(o)return{state:"blocked",reason:o.reason};let s=tr({alive:!1,finalResult:null,changedFiles:e.changedFiles,gitAncestry:e.gitAncestry});if(s?.salvageable){let a=e.error?.trim();return{state:"needs_attention",reason:a?`${s.attentionReason} (${a})`:s.attentionReason}}let i=e.error?.trim();return{state:"needs_attention",reason:i?`process exited without a final result: ${i}`:s?.attentionReason??"process exited without a final result"}}if(e.heartbeatBlocker)return{state:"blocked",reason:`worker heartbeat reported blocker: ${e.heartbeatBlocker}`};let t=e.startedAt?Date.parse(e.startedAt):NaN;if(!e.firstEventAt&&e.stdoutBytes===0&&e.heartbeatBytes===0&&Number.isFinite(t)&&r-t>Rn)return{state:"needs_attention",reason:`no first stream event ${ne(t)}s after start`};let n=e.lastActivityAt?Date.parse(e.lastActivityAt):NaN;return Number.isFinite(n)&&r-n>G?{state:"stale",reason:`no log/event/heartbeat activity for ${ne(n)}s`}:{state:"ok",reason:"recent activity"}}function Ar(e){let r=e?.trim();return r?/completion acknowledged but board not advanced/i.test(r)&&/task already terminal/i.test(r):!1}function Sn(e){return e.finalResult||e.taskId||e.agentOsId||e.stdoutBytes>0||(e.stderrBytes??0)>0||e.heartbeatBytes>0||e.error?.trim()||(e.changedFiles??[]).some(r=>r.trim())?!1:/empty worker dir|marked abandoned/i.test(e.reconcileReason??"")}function _n(e){let r=null;if(typeof e=="string"?r=j(e):e&&typeof e=="object"&&!Array.isArray(e)&&(r=e),!r)return!1;let t=r.targetPrReconciliation??r.target_pr_reconciliation;return Array.isArray(t)?t.some(n=>!n||typeof n!="object"||Array.isArray(n)?!1:String(n.outcome??"").trim()==="merged"):!1}function En(e,r,t){let n=e.completionSnapshot?.finalResult;return e.completionAckSource==="local-pr-merged-reconcile"&&n!==void 0&&n!==null?n:r||(n??Te(t))}function vn(e,r={}){let t=Xe(e.stdoutPath),n=Ke(e.heartbeatPath),o=typeof e.completionReportedAt=="string"&&e.completionReportedAt.trim().length>0,s=En(e,t.finalResult,n),i=o?!1:C(e.pid),a=W(e.stdoutPath),u=W(e.stderrPath),f=W(e.heartbeatPath),{changedFiles:m,gitAncestry:c}=mr(e.worktreePath,{base:r.base,baseCommit:r.baseCommit},{alive:i}),d=Ie([t.lastEventAt,n.lastHeartbeatAt,B(e.stdoutPath),B(e.stderrPath),B(e.heartbeatPath)]),p=t.error||!i&&!s&&Oe(e.stderrPath,10).trim()||void 0,h=typeof e.completionBlocker=="string"&&e.completionBlocker.trim()?e.completionBlocker.trim():null,k=Ar(h)?null:h,at=e.repairTargetPrUrl?{landingOnly:!1,targetPrUrls:[e.repairTargetPrUrl],targetPrUrl:e.repairTargetPrUrl,repairEnforceOriginalPr:!0}:null,Q=xn({alive:i,finalResult:s,firstEventAt:t.firstEventAt,stdoutBytes:a,stderrBytes:u,heartbeatBytes:f,lastActivityAt:d,heartbeatBlocker:n.heartbeatBlocker,startedAt:e.startedAt,error:p,providerTerminalError:t.providerTerminalError,changedFiles:m,gitAncestry:c,completionBlocker:k,landingContract:at,prUrl:e.repairTargetPrUrl??e.taskPrUrl??null,localOnly:e.localOnly===!0,taskId:e.taskId??null,agentOsId:e.agentOsId??null,reconcileReason:e.reconcileReason??null}),lt=k||Q.state==="blocked"?"blocked":o||Q.state==="done"?"done":s?"exited":i?"running":"exited";return{runId:e.runId,worker:e.name,pid:e.pid,alive:i,status:lt,attention:Q,branch:e.branch,worktreePath:e.worktreePath,ownedPaths:e.ownedPaths,stdoutBytes:a,stderrBytes:u,heartbeatBytes:f,firstEventAt:t.firstEventAt,lastEventAt:t.lastEventAt,lastActivityAt:d,currentTool:o?null:t.currentTool,heartbeatCount:n.heartbeatCount,lastHeartbeatAt:n.lastHeartbeatAt,lastHeartbeatPhase:n.lastHeartbeatPhase,lastHeartbeatSummary:n.lastHeartbeatSummary,heartbeatBlocker:n.heartbeatBlocker,timestampAnomalies:n.timestampAnomalies,finalResult:s,error:p,providerTerminalError:t.providerTerminalError,changedFiles:m,gitAncestry:c,instructionPolicyFingerprint:e.instructionPolicyFingerprint??null,instructionPolicyEvidence:e.instructionPolicyEvidence??null,model:e.model??e.orchestrationAudit?.model??null,provider:e.provider??e.orchestrationAudit?.provider??null,usage:t.usage??null,boxKind:e.boxKind??null,boxId:e.boxId??null,runtimeId:e.runtimeId??null,personaSlug:e.personaSlug??null,dispatched:e.dispatched??null,localOnly:e.localOnly??null}}function wr(e){return!!(e.finalResult||e.alive===!1||e.status==="exited"||e.status==="done")}function Or(e){return e.finalResult?e.attention.state==="needs_attention"||e.attention.state==="blocked":!1}var Rn,G,K=l(()=>{"use strict";Ne();Ze();F();er();nr();fr();hr();Cr();me();g();Rn=18e4,G=6e5});var Kr=l(()=>{"use strict";L()});var fe=l(()=>{"use strict";L();b();Kr()});var pe=l(()=>{"use strict";g()});var x=l(()=>{"use strict"});var V=l(()=>{"use strict"});var Nr=l(()=>{"use strict"});var Ps,Ts,ge=l(()=>{"use strict";Ps=25*1024*1024*1024,Ts=12*1024*1024*1024});var Us,Ds,Wr=l(()=>{"use strict";ge();Us=5*1024*1024*1024,Ds=10*1024*1024*1024});var js,Ys,he=l(()=>{"use strict";Wr();ge();js=30*1024*1024*1024,Ys=15*1024*1024*1024});var Br=l(()=>{"use strict";z();g()});var Ur=l(()=>{"use strict";K();g()});var Pn,Tn,Fr=l(()=>{"use strict";Nr();v();x();V();J();he();z();Br();Ur();g();Pn=500*1024*1024,Tn=4*1024*1024*1024});var J=l(()=>{"use strict";Fr()});import{homedir as Nn}from"node:os";import Wn from"node:path";var $r,be=l(()=>{"use strict";$r=Wn.join(Nn(),".kynver",".env")});var Lr=l(()=>{"use strict"});var Hr=l(()=>{"use strict";Lr()});var jr=l(()=>{"use strict"});var Yr=l(()=>{"use strict";g()});var Re=l(()=>{"use strict";Hr();jr();Yr()});var Gr=l(()=>{"use strict"});var Vr=l(()=>{"use strict";Gr()});var q=l(()=>{"use strict";be();b();v();Re();Vr()});var zr=l(()=>{"use strict";x();x()});var Jr=l(()=>{"use strict";be();Re();q()});var xe=l(()=>{"use strict"});var qr=l(()=>{"use strict";g()});import $n from"node:path";var ka,Se=l(()=>{"use strict";b();qr();ka=$n.join(".openclaw","harness")});var Z=l(()=>{"use strict";v();x();V();J();Se()});var Zr=l(()=>{"use strict";fe();x();zr();v();q();Jr();pe();xe();Z()});var zn,Ma,Qr=l(()=>{"use strict";zn=["claude","cursor","codex","gemini","gemini-api","openai-compatible"],Ma=zn.join("|")});var et=l(()=>{"use strict";b()});var rt=l(()=>{"use strict";et()});var tt=l(()=>{"use strict"});var nt=l(()=>{"use strict";tt()});import{homedir as Jn,totalmem as fl}from"node:os";import _e from"node:path";var ot,Ol,Il,Pl,Tl,v=l(()=>{"use strict";fe();b();pe();x();V();J();he();q();Zr();Qr();Z();rt();xe();nt();ot=_e.join(Jn(),".kynver"),Ol=_e.join(ot,"config.json"),Il=_e.join(ot,"credentials"),Pl=500*1024*1024,Tl=4*1024*1024*1024});var st=l(()=>{"use strict";v();Se();Z();g()});var z=l(()=>{"use strict";st();g()});K();var Ir="kynver-harness:",Cn="@runner:";function Pr(e){return e?.trim()?e.trim():null}function An(e){let r=Pr(e);if(!r?.startsWith(Ir))return null;let t=r.slice(Ir.length),n=t.indexOf(Cn);return n>=0?t.slice(0,n).trim()||null:t.trim()||null}function Tr(e,r){let t=Pr(r);return t?An(e)===t:!1}K();g();function wn(e){let{worker:r,status:t,taskLease:n}=e,o=n?.leaseOwner??null;if(r.dispatched&&n){if(n.status==="running"&&o&&!Tr(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>G?{health:"stale",reason:`heartbeat older than ${Math.floor(G/1e3)}s`}:t.alive&&r.pid&&!C(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"}}z();function it(e){return!!e.completionReportedAt?.trim()}K();function qn(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"),it(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"),Or(t)&&n.push(t.attention.reason||"landing gate blocked");let o=wr(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}}export{qn as assessAutoCompleteEligibility,wn as classifyWorkerHealth,vn as computeWorkerStatus};
|
|
3
|
+
`):""}function A(e){if(!e)return!1;try{return process.kill(e,0),!0}catch{return!1}}function Fe(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 ae(e){return Math.max(0,Math.round((Date.now()-e)/1e3))}var g=l(()=>{"use strict";Ue()});import{existsSync as wt,readFileSync as Ot}from"node:fs";function $e(e){return e==="complete"}function Le(e){return $e(e.lastHeartbeatPhase)?e.terminalFinalResult!==void 0&&e.terminalFinalResult!==null?e.terminalFinalResult:e.lastHeartbeatSummary?.trim()||"completed":null}function He(e){let r={heartbeatCount:0,lastHeartbeatAt:null,lastHeartbeatPhase:null,lastHeartbeatSummary:null,terminalFinalResult:null,heartbeatBlocker:null,timestampAnomalies:[],lastBoxResourceSnapshot:null,lastPrEvidence:[]};if(!wt(e))return r;let t=Date.now()+Pt,n=new Date(t).toISOString(),o=Ot(e,"utf8").split(`
|
|
4
|
+
`).filter(Boolean);for(let s of o){let i=D(s);if(!i||typeof i!="object"||Array.isArray(i))continue;let a=i;if(r.heartbeatCount++,a.ts){let u=String(a.ts),p=Date.parse(u);Number.isFinite(p)&&p>t?r.timestampAnomalies.push({kind:"future_heartbeat_timestamp",observedAt:u,clampedTo:n}):r.lastHeartbeatAt=u}a.phase!==void 0&&a.phase!==null&&(r.lastHeartbeatPhase=String(a.phase)),a.summary!==void 0&&a.summary!==null&&(r.lastHeartbeatSummary=String(a.summary)),$e(r.lastHeartbeatPhase)&&(r.terminalFinalResult=Be(a)),r.heartbeatBlocker=a.blocker?String(a.blocker):null,a.boxResourceSnapshot&&typeof a.boxResourceSnapshot=="object"&&!Array.isArray(a.boxResourceSnapshot)&&(r.lastBoxResourceSnapshot=a.boxResourceSnapshot),Array.isArray(a.prEvidence)&&(r.lastPrEvidence=a.prEvidence.filter(u=>!!u&&typeof u=="object"&&typeof u.prUrl=="string"))}return r}var Pt,je=l(()=>{"use strict";De();g();Pt=6e4});function Ve(e){return e?(e.split("/").pop()??e).replace(/\.exe$/i,"").toLowerCase():null}function $(e){if(!e)return[];let r=[],t="",n,o=!1;for(let s of e){if(o){t+=s,o=!1;continue}if(s==="\\"){o=!0;continue}if(n){s===n?n=void 0:t+=s;continue}if(s==='"'||s==="'"){n=s;continue}if(/\s/.test(s)){t&&(r.push(t),t="");continue}t+=s}return t&&r.push(t),r}function Ge(e){let r=Ve(e[0]);return!!(r&&It.has(r))}function Nt(e){let r=e.trim();return r.includes("/")?r.split("/").pop()??r:r}function Kt(e){if(!e||e.includes("*"))return null;let r=Nt(e);return!r||r.includes("/")?null:/\.(?:json|md|mjs|cjs|js|ts|tsx|yaml|yml)$/iu.test(r)?r:null}function ze(e){return!e||e.includes("/")||e.includes("*")?!1:/\.(?:json|md|mjs|cjs|js|ts|tsx|yaml|yml)$/iu.test(e)}function le(e){if(!e)return!1;let r=e.trim();return r.startsWith("!")&&!r.includes("/")&&!r.endsWith("/**")}function Wt(e){if(!e.startsWith("--glob="))return e;let r=e.slice(7);return r.startsWith("!")&&!r.includes("/")&&!r.endsWith("/**")?`--glob=${r}/**`:e}function Bt(e){let r=[];for(let t=1;t<e.length;t+=1){let n=e[t];if(n){if(n==="--"){r.push(...e.slice(t+1));break}if(n.startsWith("-")){if(n.includes("="))continue;Ye.has(n)&&(t+=1);continue}r.push(n)}}return r}function Dt(e){let r=!1,t=e.map((o,s)=>{let i=Wt(o),a=e[s-1];return a&&Ye.has(a)&&o.startsWith("!")&&!o.includes("/")&&!o.endsWith("/**")&&(i=`${o}/**`),i!==o&&(r=!0),i}),n=Bt(t);if(n.length===2){let[o,s]=n;if(le(s))return{argv:[t[0]??"rg",o,"-g",`${s}/**`,"."],changed:!0};let i=Kt(s);if(i)return{argv:[t[0]??"rg","-g",i,o,"."],changed:!0}}return r&&n.length===1?{argv:[...t,"."],changed:!0}:{argv:t,changed:r}}function Je(e){for(let r=1;r<e.length;r+=1){let t=e[r];if(t&&(t==="-c"||t==="-lc"||t==="-cl"||/^-[a-zA-Z]*c[a-zA-Z]*$/u.test(t)))return r+1}return-1}function L(e){let r=e.trim();if(!r)return{command:r,wrapped:!1};let t=$(r);if(!t.length)return{command:r,wrapped:!1};let n=Ve(t[0]);if(!n||!Tt.has(n))return{command:r,wrapped:!1};let o=Je(t);if(o<0||o>=t.length)return{command:r,wrapped:!1};let s=t.slice(o).join(" ").trim();return s?{command:s,wrapped:!0}:{command:r,wrapped:!1}}function Ut(e,r){let t=e.trim(),n=$(t),o=Je(n);if(o<0)return r;let s=n.slice(0,o).join(" "),i=r.includes("'")?`"${r.replace(/"/g,'\\"')}"`:`'${r}'`;return`${s} ${i}`}function Mt(e){let r=e.trim(),t=L(r),n=$(t.command);if(!n.length||!Ge(n))return{segment:r,changed:!1};let o=Dt(n);if(!o.changed)return{segment:r,changed:!1};let s=o.argv.join(" ");return t.wrapped?{segment:Ut(r,s),changed:!0}:{segment:s,changed:!0}}function ue(e){let r=e.trim();if(!r)return{command:r,changed:!1};let t=r.includes("&&")?" && ":r.includes("||")?" || ":"; ",n=r.split(/\s*(?:&&|\|\||;)\s*/u),o=!1,s=n.map(i=>{let a=Mt(i);return a.changed&&(o=!0),a.segment});return o?{command:s.join(t),changed:!0}:{command:r,changed:!1}}function Xe(e){let r=L(e).command,t=$(r.trim());return t.length&&Ge(t)?!0:/\b(rg|ripgrep)\b/i.test(r)}function qe(e){if(!e)return{};let r=e.match(/search\s+"(.+)"\s+in\s+([^()]+?)(?:\s*\(|$)/iu);if(r)return{pattern:r[1],target:r[2]?.trim()};let t=e.match(/^search\s+"(.+)"\s+in\s+(.+)$/iu);return t?{pattern:t[1],target:t[2]?.trim()}:{}}function Ft(e){let{pattern:r,target:t}=qe(e);return r?le(t)?{kind:"rg_exclude_syntax",pattern:r,target:t}:ze(t)?{kind:"bad_scope",pattern:r,target:t}:{kind:"not_repo_search",pattern:r,target:t}:{kind:"not_repo_search"}}function $t(e){let{pattern:r,target:t}=qe(e);if(!r)return null;if(le(t)){let n=`${t.trim()}/**`;return{command:`rg "${r}" -g '${n}' .`,changed:!0}}return t&&ze(t)?{command:`rg -g ${t} "${r}" .`,changed:!0}:null}function Lt(e){if(e.kind==="bad_scope"&&e.pattern&&e.target)return`Use \`rg -g '${e.target}' ${e.pattern} .\` from the repo root instead of treating ${e.target} as a folder.`;if(e.kind==="rg_exclude_syntax"&&e.pattern){let r=e.target?`${e.target.trim()}/**`:"!node_modules/**";return`Repo search scope \`${e.target??"!node_modules"}\` is not a valid ripgrep path. Use \`rg "${e.pattern}" -g '${r}' .\` from the repo root (exclude globs need a \`/**\` suffix).`}return e.kind==="no_matches"&&e.pattern?`No matches for "${e.pattern}". Try a broader pattern, drop overly short tokens, or search from the repo root with \`rg "${e.pattern}" .\`.`:null}function Ht(e){let r=e.match(/search\s+"(.+)"\s+in\s+([^()]+?)(?:\s*\(agent\)|\s*failed|$)/iu);return r?`search "${r[1]}" in ${r[2]?.trim()}`:null}function ce(e){let r=e.meta?.trim()||(e.command?Ht(e.command):null)||null;if(r){let t=Ft(r),n=Lt(t);if(n)return n;let o=$t(r);if(o?.changed)return`Repo search used an invalid scope. Retry with: \`${o.command}\`.`}if(e.command&&/\b(rg|ripgrep)\b/i.test(e.command)){let t=ue(e.command);if(t.changed)return`Ripgrep scope may be invalid. Retry with: \`${t.command}\`.`;if(e.exitCode===1)return"Ripgrep returned no matches (exit 1). Try a broader pattern or search from the repo root."}return null}var It,Tt,Ye,Ze=l(()=>{"use strict";It=new Set(["rg","ripgrep","grep"]),Tt=new Set(["bash","sh","dash","zsh"]),Ye=new Set(["-e","--regexp","-f","--file","-m","--max-count","-A","--after-context","-B","--before-context","-C","--context","-g","--glob","--iglob"])});function w(e,r=200){let t=e.replace(/\s+/g," ").trim();return t.length>r?`${t.slice(0,r-1)}\u2026`:t}function Vt(e){let r=e.trim();if(!r)return null;if(r.startsWith("{"))try{return JSON.parse(r)}catch{}let t=r.indexOf("{"),n=r.lastIndexOf("}");if(t>=0&&n>t)try{return JSON.parse(r.slice(t,n+1))}catch{return null}return null}function O(e){return!!e&&typeof e=="object"&&!Array.isArray(e)}function Gt(e){let r=e.metadata;if(!O(r))return null;let t=r.vulnerabilities;if(!O(t))return null;let n=s=>typeof t[s]=="number"?t[s]:0,o={info:n("info"),low:n("low"),moderate:n("moderate"),high:n("high"),critical:n("critical"),total:n("total")};return typeof t.total!="number"&&!o.critical&&!o.high&&!o.moderate&&!o.low&&!o.info?null:o}function zt(e){let r=[];e.critical&&r.push(`${e.critical} critical`),e.high&&r.push(`${e.high} high`),e.moderate&&r.push(`${e.moderate} moderate`),e.low&&r.push(`${e.low} low`),e.info&&r.push(`${e.info} info`);let t=r.length?r.join(", "):"see report";return`npm audit: ${e.total} vulnerabilit${e.total===1?"y":"ies"} (${t}) \u2014 remediation required`}function Jt(e,r){let t=e.error;if(O(t)){let s=typeof t.summary=="string"?t.summary.trim():"",i=typeof t.code=="string"?t.code.trim():"";if(s)return i?`${i}: ${s}`:s;if(i)return i}let n=typeof e.message=="string"?e.message.trim():"";if(n)return n;let o=r.trim();return o?w(o.split(`
|
|
5
|
+
`).find(Boolean)??o,160):"npm audit failed"}function Xt(e){let r=`${e.stdout}
|
|
6
|
+
${e.stderr}`.trim(),t=Vt(r);if(!t||!O(t)){let o=w(r||`exit ${e.exitCode}`,180);return{kind:"command_failure",exitCode:e.exitCode,summary:`npm audit failed (invalid or missing JSON): ${o}`,parseError:"invalid_json"}}if(O(t.error))return{kind:"command_failure",exitCode:e.exitCode,summary:`npm audit command failed: ${Jt(t,e.stderr)}`};let n=Gt(t);return n?e.exitCode===0&&n.total===0?{kind:"success",exitCode:0,summary:"npm audit: no vulnerabilities reported",audit:n}:{kind:"audit_findings",exitCode:e.exitCode,summary:zt(n),audit:n}:{kind:"command_failure",exitCode:e.exitCode,summary:"npm audit failed: JSON response missing vulnerability metadata",parseError:"missing_metadata"}}function qt(e){return jt.test(e)}function Zt(e){let r=L(e).command;return Qe.test(e)||Qe.test(r)||Xe(e)}function Qt(e){let r=ce({command:e.command,exitCode:e.exitCode});if(e.exitCode===0)return{kind:"success",exitCode:0,summary:"ripgrep finished (exit 0)"};if(e.exitCode===1){let n=(e.stderr||e.interleaved).trim();if(n&&Yt.test(n)){let i=w(n,160);return{kind:"command_failure",exitCode:1,summary:r??`ripgrep failed (exit 1): ${i}`}}let o=ue(e.command),s=o.changed&&!r?` Retry with: \`${o.command}\`.`:"";return{kind:"search_no_matches",exitCode:1,summary:r??`ripgrep: no matches (exit 1).${s} Try a broader pattern or search from the repo root.`}}let t=w(e.interleaved||e.stdout||e.stderr||`exit ${e.exitCode}`,180);return{kind:"command_failure",exitCode:e.exitCode,summary:r??`ripgrep failed (exit ${e.exitCode}): ${t}`}}function er(e){let r=e.stdout??"",t=e.stderr??"",n=e.interleavedOutput??"";if(qt(e.command)){let i=r.trim()||n.trim()||t.trim();return Xt({exitCode:e.exitCode,stdout:i,stderr:t})}if(Zt(e.command))return Qt({command:e.command,exitCode:e.exitCode,stdout:r,stderr:t,interleaved:n});let o=ce({command:e.command,exitCode:e.exitCode});if(o&&e.exitCode!==0)return{kind:"command_failure",exitCode:e.exitCode,summary:o};if(e.exitCode===0)return{kind:"success",exitCode:0,summary:"command succeeded (exit 0)"};let s=w(n||r||t||`exit ${e.exitCode}`,180);return{kind:"command_failure",exitCode:e.exitCode,summary:`command failed (exit ${e.exitCode}): ${s}`}}var jt,Qe,Yt,rr=l(()=>{"use strict";Ze();jt=/\bnpm\s+audit\b/i,Qe=/\b(rg|ripgrep)\b/i,Yt=/\b(error|invalid|unknown|panic|not found)\b/i});function P(e){return typeof e=="string"&&en.test(e.trim())}function H(e){if(!e||typeof e!="object"||Array.isArray(e))return!1;let r=e;return r.is_error===!0||r.providerTerminalError===!0||typeof r.subtype=="string"&&/^error(?:_|$)/.test(r.subtype)}var en,j=l(()=>{"use strict";en=/^(?:provider authentication failed:\s*)?(?:(?:Failed to authenticate|authentication (?:failed|error))(?::\s*[^\n.!?]+)?|OAuth session expired and could not be refreshed)[.!]?$/i});function de(e){return!!e&&typeof e=="object"&&!Array.isArray(e)}function rn(e){if(!e)return;let r=typeof e.input_tokens=="number"?e.input_tokens:void 0,t=typeof e.output_tokens=="number"?e.output_tokens:void 0;if(!((r===void 0||r<0)&&(t===void 0||t<0)))return{...r!==void 0&&r>=0?{inputTokens:r}:{},...t!==void 0&&t>=0?{outputTokens:t}:{}}}function tr(e){if(e.event==="step_update"&&de(e.step_update)){let s=e.step_update,i=s.step_type==="tool"&&typeof s.tool_name=="string"&&s.tool_name.trim()?s.tool_name.trim():void 0,a=typeof s.text_delta=="string"?s.text_delta:void 0;return!i&&a===void 0?null:{...i?{currentTool:i}:{},...a!==void 0?{textDelta:a}:{}}}if(e.event!=="result"||!de(e.result))return null;let r=e.result,t=typeof r.status=="string"?r.status.toUpperCase():"";if(t!=="SUCCESS"&&t!=="ERROR")return null;let n=de(r.usage)?rn(r.usage):void 0;if(t==="ERROR"){let s=typeof r.error=="string"&&r.error.trim()?r.error.trim():"antigravity cli result error";return{...n?{usage:n}:{},terminal:{ok:!1,finalResult:null,error:s}}}let o=typeof r.response=="string"?r.response.trim():"";return{...n?{usage:n}:{},terminal:{ok:!0,finalResult:o||"completed",error:null}}}var nr=l(()=>{"use strict"});function me(e){return!!e&&typeof e=="object"&&!Array.isArray(e)}function or(){return{assistantText:""}}function tn(e,r){if(!(r.role!=="assistant"||typeof r.content!="string")){if(r.delta===!0){e.assistantText+=r.content;return}e.assistantText=r.content}}function nn(e){let r=typeof e.input_tokens=="number"?e.input_tokens:void 0,t=typeof e.output_tokens=="number"?e.output_tokens:void 0,o=(me(e.models)?Object.keys(e.models):[]).find(s=>s.trim())?.trim();if(!(r===void 0&&t===void 0&&!o))return{...r!==void 0&&r>=0?{inputTokens:r}:{},...t!==void 0&&t>=0?{outputTokens:t}:{},...o?{model:o}:{}}}function on(e){return e.type!=="result"||e.status!=="success"&&e.status!=="error"?!1:typeof e.result!="string"}function sr(e,r){if(e.type==="message"&&(e.role==="assistant"||e.role==="user"))return tn(r,e),{};if(e.type==="tool_use"&&typeof e.tool_name=="string"&&e.tool_name.trim())return{currentTool:e.tool_name.trim()};if(!on(e))return null;let t=me(e.stats)?nn(e.stats):void 0;if(e.status==="error"){let o=me(e.error)&&typeof e.error.message=="string"?e.error.message:"gemini cli result error";return{...t?{usage:t}:{},terminal:{ok:!1,finalResult:null,error:o}}}let n=r.assistantText.trim();return{...t?{usage:t}:{},terminal:{ok:!0,finalResult:n||"completed",error:null}}}var ir=l(()=>{"use strict"});import{existsSync as sn,readFileSync as an}from"node:fs";function ln(e){let r=e.timestamp_ms;return e.timestamp||e.ts||(r?new Date(r).toISOString():void 0)}function un(e){if(!e)return null;for(let r of Object.keys(e))if(r.endsWith("ToolCall")){let t=r.slice(0,-8);return t.length?t:r}return null}function cn(e,r){e.finalResult=r.result||r.subtype||r.terminal_reason||"completed",H(r)&&(e.providerTerminalError=!0,e.error=String(r.result||r.api_error_status||"stream result error"))}function S(e){return typeof e=="number"&&Number.isFinite(e)&&e>=0?e:void 0}function dn(e){let r=e.usage;return r&&typeof r=="object"&&!Array.isArray(r)?r:null}function mn(e){if(typeof e.model=="string"&&e.model.trim())return e.model.trim();let r=e.modelUsage;if(r&&typeof r=="object"&&!Array.isArray(r)){let t=Object.keys(r)[0];if(t?.trim())return t.trim()}}function pn(e,r){let t=dn(r);if(!t)return;let n=S(t.input_tokens)??S(t.inputTokens)??S(t.prompt_tokens),o=S(t.output_tokens)??S(t.outputTokens)??S(t.completion_tokens);if(n===void 0&&o===void 0)return;let s=mn(r)??e.usage?.model;e.usage={...n!==void 0?{inputTokens:n}:{},...o!==void 0?{outputTokens:o}:{},...s?{model:s}:{}}}function fn(e){if(e.type!=="tool_call"||e.subtype!=="completed")return null;let t=(e.tool_call&&typeof e.tool_call=="object"&&!Array.isArray(e.tool_call)?e.tool_call:null)?.shellToolCall;if(!t||typeof t!="object"||Array.isArray(t))return null;let n=t,o=n.args,s=o&&typeof o=="object"&&!Array.isArray(o)&&typeof o.command=="string"?String(o.command):"",i=n.result;if(!i||typeof i!="object"||Array.isArray(i))return null;let a=i.success??i.failure;if(!a||typeof a!="object"||Array.isArray(a))return null;let u=a,p=typeof u.exitCode=="number"?u.exitCode:0;return{command:s,exitCode:p,stdout:typeof u.stdout=="string"?u.stdout:"",stderr:typeof u.stderr=="string"?u.stderr:"",interleaved:typeof u.interleavedOutput=="string"?u.interleavedOutput:""}}function gn(e,r){r.kind==="success"||r.kind==="search_no_matches"||(e.lastShellOutcome=r)}function ar(e){let r={firstEventAt:null,lastEventAt:null,currentTool:null,finalResult:null,error:null,lastShellOutcome:null,usage:null};if(!sn(e))return r;let t=an(e,"utf8").split(`
|
|
7
|
+
`).filter(Boolean),n=null,o=or();for(let s of t){let i=D(s);if(!i||typeof i!="object"||Array.isArray(i))continue;if(i.type==="turn.started"&&(n=null,r.finalResult=null),i.type==="item.completed"){let d=i.item;if(d&&typeof d=="object"&&!Array.isArray(d)){let f=d;f.type==="agent_message"&&typeof f.text=="string"&&f.text.trim()&&(n=f.text)}}i.type==="turn.completed"&&n&&!r.providerTerminalError&&(r.finalResult=n,n=null);let a=ln(i);if(a&&(r.firstEventAt||=a,r.lastEventAt=a),i.type==="stream_event"&&i.event&&typeof i.event=="object"&&i.event.type==="content_block_start"){let d=i.event.content_block;d?.type==="tool_use"&&(r.currentTool=String(d.name||"tool"))}if(i.type==="assistant"&&i.message&&typeof i.message=="object"){let d=i.message.content;if(Array.isArray(d)){let f=d.find(h=>h?.type==="tool_use");f&&(r.currentTool=String(f.name||r.currentTool))}}if(i.type==="tool_call"&&i.subtype==="started"){let d=i.tool_call&&typeof i.tool_call=="object"&&!Array.isArray(i.tool_call)?i.tool_call:void 0,f=un(d);f&&(r.currentTool=f)}let u=fn(i);u&&gn(r,er({command:u.command,exitCode:u.exitCode,stdout:u.stdout,stderr:u.stderr,interleavedOutput:u.interleaved}));let p=tr(i),m=p?null:sr(i,o),c=p??m;if(c?.currentTool&&(r.currentTool=c.currentTool),c?.usage&&(r.usage={...r.usage??{},...c.usage}),c?.terminal?c.terminal.ok?r.finalResult=c.terminal.finalResult:(r.finalResult=null,r.providerTerminalError=!0,r.error=c.terminal.error):i.type==="result"&&cn(r,i),i.type==="turn.failed"){n=null,r.finalResult=null,r.providerTerminalError=!0;let d=i.error;r.error=typeof d?.message=="string"?d.message:"provider turn failed"}pn(r,i)}return r}var lr=l(()=>{"use strict";rr();g();j();nr();ir()});var b=l(()=>{"use strict"});var hn,ss,yn,is,ur=l(()=>{"use strict";hn=["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"],ss=new Set(hn),yn=["GITHUB_TOKEN","GH_TOKEN","CLAUDE_CODE_OAUTH_TOKEN","CODEX_API_KEY","GEMINI_API_KEY"],is=new Set(yn)});import{spawnSync as dr}from"node:child_process";function kn(e,r,t={}){let n=dr("git",r,ie({cwd:e,encoding:"utf8"}));if(n.status!==0&&!t.allowFailure){let o=bn(e,r,n);if(t.throwError)throw new Error(o);se(o)}return n.stdout||""}function bn(e,r,t){let n=typeof t.stderr=="string"&&t.stderr.trim()||typeof t.stdout=="string"&&t.stdout.trim()||t.error?.message||`exit ${t.status??"unknown"}`;return`git ${r.join(" ")} failed in ${e}: ${n}`}function mr(e){return kn(e,["status","--short"],{allowFailure:!0}).split(`
|
|
8
|
+
`).map(r=>r.trim()).filter(Boolean)}function I(e,r){try{let t=dr("git",r,ie({cwd:e,encoding:"utf8"}));return{status:t.status,stdout:t.stdout||"",stderr:t.stderr||"",error:t.error?t.error.message:null}}catch(t){return{status:null,stdout:"",stderr:"",error:t.message}}}function cr(e,r,t){let n=I(e,["merge-base","--is-ancestor",r,t]);return n.status===0?{isAncestor:!0,error:null}:n.status===1?{isAncestor:!1,error:null}:{isAncestor:null,error:n.error||n.stderr||n.stdout||`git exited ${n.status}`}}function pr(e,r="origin/main"){let t=typeof r=="string"?{base:r}:r,n=t.baseCommit?.trim()||t.base?.trim()||"origin/main",o=t.baseCommit?.trim()||null;if(!e)return _(n,"missing worktree path");let s=I(e,["rev-parse","HEAD"]);if(s.status!==0)return _(n,s.error||s.stderr||s.stdout||"failed to resolve HEAD");let i;if(o)i=o;else{let d=I(e,["rev-parse",n]);if(d.status!==0)return _(n,d.error||d.stderr||d.stdout||`failed to resolve ${n}`,s.stdout.trim());i=d.stdout.trim()}let a=s.stdout.trim();if(a===i)return{checked:!0,base:n,head:a,baseHead:i,baseIsAncestorOfHead:!0,headIsAncestorOfBase:!0,relation:"synced"};let u=cr(e,i,a),p=cr(e,a,i),m=u.error||p.error||void 0;if(u.isAncestor==null||p.isAncestor==null)return{checked:!1,base:n,head:a,baseHead:i,baseIsAncestorOfHead:u.isAncestor,headIsAncestorOfBase:p.isAncestor,relation:"unknown",...m?{error:m}:{}};let c=u.isAncestor?"ahead":p.isAncestor?"merged":"diverged";return{checked:!0,base:n,head:a,baseHead:i,baseIsAncestorOfHead:u.isAncestor,headIsAncestorOfBase:p.isAncestor,relation:c,...m?{error:m}:{}}}function _(e,r,t=null){return{checked:!1,base:e,head:t,baseHead:null,baseIsAncestorOfHead:null,headIsAncestorOfBase:null,relation:"unknown",error:r}}var V=l(()=>{"use strict";b();g();ur()});var fr=l(()=>{"use strict";V()});var pe=l(()=>{"use strict";V();b();fr()});var fe=l(()=>{"use strict";g()});var R=l(()=>{"use strict"});var G=l(()=>{"use strict"});var gr=l(()=>{"use strict"});var ws,Os,ge=l(()=>{"use strict";ws=25*1024*1024*1024,Os=12*1024*1024*1024});var Ks,Ws,hr=l(()=>{"use strict";ge();Ks=5*1024*1024*1024,Ws=10*1024*1024*1024});var $s,Ls,he=l(()=>{"use strict";hr();ge();$s=30*1024*1024*1024,Ls=15*1024*1024*1024});var yr=l(()=>{"use strict";T();g()});var br=l(()=>{"use strict";N();g()});var xn,Sn,xr=l(()=>{"use strict";gr();E();R();G();J();he();T();yr();br();g();xn=500*1024*1024,Sn=4*1024*1024*1024});var J=l(()=>{"use strict";xr()});import{homedir as vn}from"node:os";import Cn from"node:path";var Sr,be=l(()=>{"use strict";Sr=Cn.join(vn(),".kynver",".env")});var _r=l(()=>{"use strict"});var Er=l(()=>{"use strict";_r()});var vr=l(()=>{"use strict"});var Cr=l(()=>{"use strict";g()});var Re=l(()=>{"use strict";Er();vr();Cr()});var Ar=l(()=>{"use strict"});var wr=l(()=>{"use strict";Ar()});var X=l(()=>{"use strict";be();b();E();Re();wr()});var Or=l(()=>{"use strict";R();R()});var Pr=l(()=>{"use strict";be();Re();X()});var xe=l(()=>{"use strict"});var Ir=l(()=>{"use strict";g()});import Tn from"node:path";var fa,Se=l(()=>{"use strict";b();Ir();fa=Tn.join(".openclaw","harness")});var Z=l(()=>{"use strict";E();R();G();J();Se()});var Nr=l(()=>{"use strict";pe();R();Or();E();X();Pr();fe();xe();Z()});var Mn,Wa,Kr=l(()=>{"use strict";Mn=["claude","cursor","codex","gemini","gemini-api","openai-compatible"],Wa=Mn.join("|")});var Wr=l(()=>{"use strict";b()});var Br=l(()=>{"use strict";Wr()});var Dr=l(()=>{"use strict"});var Ur=l(()=>{"use strict";Dr()});import{homedir as Fn,totalmem as ul}from"node:os";import _e from"node:path";var Mr,vl,Cl,Al,wl,E=l(()=>{"use strict";pe();b();fe();R();G();J();he();X();Nr();Kr();Z();Br();xe();Ur();Mr=_e.join(Fn(),".kynver"),vl=_e.join(Mr,"config.json"),Cl=_e.join(Mr,"credentials"),Al=500*1024*1024,wl=4*1024*1024*1024});var Fr=l(()=>{"use strict";E();Se();Z();g()});var T=l(()=>{"use strict";Fr();g()});import{accessSync as Hl,constants as jl,existsSync as $n,readFileSync as Ln}from"node:fs";import Hn from"node:path";function Yn(e){return Hn.join(e,jn)}function Vn(e){return typeof e=="number"&&Number.isFinite(e)?e:null}function Ee(e){if(!e)return null;let r=Yn(e);if(!$n(r))return null;try{let t=JSON.parse(Ln(r,"utf8")),n=t.oomEvidence;return{exitCode:Vn(t.exitCode),signal:typeof t.signal=="string"&&t.signal?t.signal:null,...typeof t.startedAt=="string"?{startedAt:t.startedAt}:{},...typeof t.endedAt=="string"?{endedAt:t.endedAt}:{},...typeof t.childPid=="number"?{childPid:t.childPid}:{},...typeof t.spawnError=="string"?{spawnError:t.spawnError}:{},oomEvidence:n&&(n.source==="cgroup"||n.source==="kernel_log")?{source:n.source,detail:String(n.detail??"").slice(0,300)}:null}}catch{return null}}function $r(e){if(!e)return null;let r=e.oomEvidence?" (kernel out-of-memory kill)":"";return e.spawnError?`could not start: ${e.spawnError}`:e.signal?`killed by ${e.signal}${r}`:e.exitCode===null?null:`exited with code ${e.exitCode}${r}`}var jn,Vl,ve=l(()=>{"use strict";jn="exit.json";Vl=String.raw`"use strict";
|
|
9
|
+
const cp = require("child_process"), fs = require("fs");
|
|
10
|
+
const argv = process.argv.slice(1);
|
|
11
|
+
const exitFile = argv[0], cmd = argv[1], args = argv.slice(2);
|
|
12
|
+
const startedMs = Date.now();
|
|
13
|
+
function cgroupOomKills() {
|
|
14
|
+
try {
|
|
15
|
+
const line = fs.readFileSync("/proc/self/cgroup", "utf8").split("\n").find((l) => l.startsWith("0::"));
|
|
16
|
+
if (!line) return null;
|
|
17
|
+
const file = "/sys/fs/cgroup" + line.slice(3).trim().replace(/\/$/, "") + "/memory.events";
|
|
18
|
+
const m = /(?:^|\n)oom_kill (\d+)/.exec(fs.readFileSync(file, "utf8"));
|
|
19
|
+
return m ? Number(m[1]) : null;
|
|
20
|
+
} catch { return null; }
|
|
21
|
+
}
|
|
22
|
+
function kernelLog() {
|
|
23
|
+
const override = process.env.KYNVER_EXIT_CAPTURE_KERNEL_LOG_FILE;
|
|
24
|
+
if (override) { try { return fs.readFileSync(override, "utf8"); } catch { return ""; } }
|
|
25
|
+
const run = (bin, a) => {
|
|
26
|
+
try {
|
|
27
|
+
const r = cp.spawnSync(bin, a, { encoding: "utf8", timeout: 3000, maxBuffer: 8 * 1024 * 1024, stdio: ["ignore", "pipe", "ignore"] });
|
|
28
|
+
return r.status === 0 ? String(r.stdout || "") : "";
|
|
29
|
+
} catch { return ""; }
|
|
30
|
+
};
|
|
31
|
+
return run("journalctl", ["-k", "-q", "--no-pager", "--since", "@" + Math.floor(startedMs / 1000)]) || run("dmesg", []);
|
|
32
|
+
}
|
|
33
|
+
const oomBefore = cgroupOomKills();
|
|
34
|
+
let child, finished = false;
|
|
35
|
+
function write(rec) {
|
|
36
|
+
try { fs.writeFileSync(exitFile, JSON.stringify(rec, null, 2) + "\n"); } catch {}
|
|
37
|
+
}
|
|
38
|
+
function finish(code, signal, spawnError) {
|
|
39
|
+
if (finished) return;
|
|
40
|
+
finished = true;
|
|
41
|
+
const rec = { exitCode: code, signal: signal || null, startedAt: new Date(startedMs).toISOString(), endedAt: new Date().toISOString(), childPid: child && child.pid };
|
|
42
|
+
if (spawnError) rec.spawnError = spawnError;
|
|
43
|
+
if (signal === "SIGKILL" || code === 137 || (code !== 0 && code !== null)) {
|
|
44
|
+
const oomAfter = cgroupOomKills();
|
|
45
|
+
if (oomBefore !== null && oomAfter !== null && oomAfter > oomBefore) {
|
|
46
|
+
rec.oomEvidence = { source: "cgroup", detail: "memory.events oom_kill " + oomBefore + " -> " + oomAfter };
|
|
47
|
+
} else if (signal === "SIGKILL" || code === 137) {
|
|
48
|
+
const pid = child && child.pid;
|
|
49
|
+
const hit = kernelLog().split("\n").find((l) => pid && new RegExp("(?:Killed process|oom-kill:.*pid=|Memory cgroup out of memory: Killed process) ?" + pid + "\\b").test(l));
|
|
50
|
+
if (hit) rec.oomEvidence = { source: "kernel_log", detail: hit.trim().slice(0, 300) };
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
write(rec);
|
|
54
|
+
if (signal) {
|
|
55
|
+
const n = (require("os").constants.signals || {})[signal];
|
|
56
|
+
process.exit(128 + (n || 9));
|
|
57
|
+
}
|
|
58
|
+
process.exit(code === null ? 1 : code);
|
|
59
|
+
}
|
|
60
|
+
try {
|
|
61
|
+
child = cp.spawn(cmd, args, { stdio: "inherit" });
|
|
62
|
+
} catch (e) {
|
|
63
|
+
process.stderr.write("failed to spawn worker process: " + (e && e.message) + "\n");
|
|
64
|
+
finish(127, null, String(e && e.message));
|
|
65
|
+
}
|
|
66
|
+
for (const s of ["SIGTERM", "SIGINT", "SIGHUP"]) process.on(s, () => { try { child.kill(s); } catch {} });
|
|
67
|
+
child.on("error", (e) => {
|
|
68
|
+
process.stderr.write("failed to spawn worker process: " + (e && e.message) + "\n");
|
|
69
|
+
if (!child.pid) finish(127, null, String(e && e.message));
|
|
70
|
+
});
|
|
71
|
+
child.on("exit", (code, signal) => finish(code, signal));
|
|
72
|
+
`});function Ce(e){if(!e||typeof e!="object"||Array.isArray(e))return!1;let r=e.handoffState;return typeof r=="string"&&zn.has(r)}function Ae(e){return!!(e&&Gn.test(e))}function Hr(e){if(e.noRestartAt?.trim())return"stopped_by_hand";if(e.finalResult&&!Ce(e.finalResult))return"finished";if(e.alive)return e.stale?"stuck":"running";let r=e.error?.trim()??"",t=e.exit??null;if(t?.oomEvidence||Ae(r))return"oom";let n=e.reconcileReason??"";return/reconciled stale worker/i.test(n)?"stuck":Lr.test(r)||Lr.test(n)?"timed_out":t&&t.exitCode===0&&!t.signal&&!t.spawnError?"no_report":t&&(t.signal||t.spawnError||t.exitCode!==null&&t.exitCode!==0)||r?"crashed":"no_report"}function jr(e){let r=[Jn(e.stopClass)],t=$r(e.exit);t&&r.push(t),e.exit?.oomEvidence&&r.push(`evidence: ${e.exit.oomEvidence.detail}`),e.stopClass==="no_report"&&e.exit?.exitCode===0&&r.push("it exited normally but never sent a final report");let n=e.error?.replace(/\s+/g," ").trim();return n?r.push(`last output: ${n.length>300?`${n.slice(-300)}`:n}`):e.stopClass==="stuck"&&e.reconcileReason&&r.push(e.reconcileReason),r.join(" \u2014 ").slice(0,600)}function Jn(e){switch(e){case"finished":return"finished";case"oom":return"ran out of memory";case"crashed":return"crashed";case"no_report":return"stopped without reporting";case"timed_out":return"timed out";case"stuck":return"stuck (no progress)";case"stopped_by_hand":return"stopped on purpose";default:return"running"}}var Gn,Lr,zn,Yr=l(()=>{"use strict";T();g();ve();Gn=/javascript heap out of memory|reached heap limit|allocation failed - process out of memory|\bout of memory\b|\boom[- ]?kill(?:ed|er)?\b|std::bad_alloc|cannot allocate memory|\benomem\b|exit(?:ed)? (?:with )?(?:code|status) 137\b|killed process \d+/i,Lr=/\btimed? ?out\b|\btimeout\b|deadline exceeded/i,zn=new Set(["exited_without_final_result","exited_without_complete_heartbeat","exit_failure"])});function Vr(e,r=240){let t=e.replace(/\s+/g," ").trim();return t.length>r?`${t.slice(0,r-1)}\u2026`:t}function we(e){let r=(e??"").trim();if(!r)return null;if(P(r))return{blocked:!0,reason:`provider authentication failed: ${Vr(r)}`};for(let t of Xn)if(t.test.test(r))return{blocked:!0,reason:`${t.label}: ${Vr(r)}`};return null}var Xn,Gr=l(()=>{"use strict";j();Xn=[{test:/(?:claude provider refuses to spawn: worker prompt is empty after argv assembly|Input must be provided (?:either )?through stdin or as a prompt argument)/i,label:"provider prompt delivery failed"},{test:/\b(?:invalid|unknown|unsupported|unrecognized)\b[^.\n]*\bmodel\b/i,label:"provider rejected the requested model"},{test:/\bmodel\b[^.\n]*\b(?:not\s+(?:found|supported|available|recognized|valid)|is\s+not\s+valid|does\s+not\s+exist)/i,label:"provider rejected the requested model"},{test:/\b(?:did you mean|available models|choose (?:a|one of)|supported models)\b/i,label:"provider rejected the requested model"},{test:/model preflight failed/i,label:"model/provider preflight failed"},{test:/\b(?:command not found|ENOENT|is the .*CLI on PATH|executable not found|no such file or directory)\b/i,label:"provider CLI is missing or not on PATH"},{test:/\bfailed to spawn\b/i,label:"provider failed to spawn the worker process"},{test:/\b(?:not logged in|unauthorized|authentication (?:failed|required)|invalid api key|missing api key|401)\b/i,label:"provider authentication failed"},{test:/\b(?:out of usage|increase limits?|switch to auto|ask your admin to increase your limit|usage limits?|quota exceeded|insufficient_quota|credits? exhausted|billing|payment required)\b/i,label:"provider quota exhausted"}]});function zr(e){if(typeof e!="string")return null;let r=e.trim();return r.length?r:null}function qn(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 Zn(e){return!e?.checked||e.headIsAncestorOfBase!==!1?null:zr(e.head)}function Qn(e,r,t){let n=["exited_with_changes_salvage"];if((e==="uncommitted"||e==="both")&&n.push(`${r} uncommitted change${r===1?"":"s"} with no final result`),(e==="committed_ahead"||e==="both")&&t){let o=t.length>12?t.slice(0,12):t;n.push(`commit ${o} ahead of base with no final result`)}return n.push("review worktree \u2014 commit, open a PR, or run a salvage worker before discarding"),n.join(": ")}function Jr(e){if(e.alive||qn(e.finalResult))return null;let r=(e.changedFiles??[]).filter(i=>i.trim()).length,t=zr(e.headCommit)??Zn(e.gitAncestry),n=r>0,o=!!t;if(!n&&!o)return{kind:"none",salvageable:!1,uncommittedCount:0,headCommit:null,attentionReason:"process exited without a final result"};let s=n&&o?"both":n?"uncommitted":"committed_ahead";return{kind:s,salvageable:!0,uncommittedCount:r,headCommit:t,attentionReason:Qn(s,r,t)}}var Xr=l(()=>{"use strict"});import{existsSync as eo,readFileSync as ro,statSync as Qr}from"node:fs";import Q from"node:path";function so(e,r=process.env){let t=e?no:to,n=r.KYNVER_WORKER_GIT_PROBE_CACHE_TTL_MS?.trim();if(!n)return t;let o=Number(n);return Number.isFinite(o)&&o>=0?Math.floor(o):t}function io(e){return e.baseCommit?.trim()||e.base?.trim()||"origin/main"}function Oe(e){try{return Qr(e).mtimeMs}catch{return-1}}function ao(e){let r=Q.join(e,".git");try{if(Qr(r).isDirectory())return r;let t=/^gitdir:\s*(.+)$/m.exec(ro(r,"utf8"));return t?Q.resolve(e,t[1].trim()):null}catch{return null}}function qr(e){let r=ao(e);return[Oe(e),r?Oe(Q.join(r,"HEAD")):-2,r?Oe(Q.join(r,"index")):-2].join(":")}function Zr(e,r){return{changedFiles:mr(e),gitAncestry:pr(e,{base:r.base,baseCommit:r.baseCommit})}}function lo(e,r){for(k.delete(e),k.set(e,r);k.size>oo;){let t=k.keys().next().value;if(t===void 0)break;k.delete(t)}}function et(e,r,t){let n=io(r);if(!e||!e.trim())return K.missingWorktree++,{changedFiles:[],gitAncestry:_(n,"missing worktree path")};let o=`${e}\0${n}`;if(!eo(e))return k.delete(o),K.missingWorktree++,{changedFiles:[],gitAncestry:_(n,`worktree no longer exists: ${e}`)};if(t.alive)return k.delete(o),K.liveProbes++,Zr(e,r);let s=t.ttlMs??so(!!r.baseCommit?.trim()),i=t.now??Date.now(),a=qr(e),u=k.get(o);if(s>0&&u&&u.fingerprint===a&&i<u.expiresAt)return K.hits++,u.probe;K.misses++;let p=Zr(e,r);if(s>0){let m=.8+.4*(t.random??Math.random)();lo(o,{fingerprint:qr(e),expiresAt:i+Math.round(s*m),probe:p})}return p}var to,no,oo,k,K,rt=l(()=>{"use strict";V();to=10*6e4,no=60*6e4,oo=2048,k=new Map,K={hits:0,misses:0,liveProbes:0,missingWorktree:0}});function W(e){if(typeof e!="string")return null;let r=e.trim();return r.length?r:null}function uo(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 co(e){if(W(e.headCommit)||W(e.prUrl)||W(e.artifactBundlePath)||W(e.patchPath))return!0;let r=e.gitAncestry;return!!(r?.checked&&r.headIsAncestorOfBase===!1&&W(r.head))}function tt(e){return uo(e.finalResult)?e.changedFiles.length===0?{blocked:!1}:co(e)?{blocked:!0,detail:`Worktree has ${e.changedFiles.length} uncommitted change(s); commit or discard before landing`}:{blocked:!0,reason:"dirty_worktree_no_pr",detail:`Worktree has ${e.changedFiles.length} uncommitted change(s) with no commit or PR; commit, open a PR, or discard before landing`}:{blocked:!1}}function nt(e){if(e.blocked)return e.detail??e.reason??"dirty_worktree_no_pr"}var ot=l(()=>{"use strict"});function Pe(e){let r=e.trim();if(!r.startsWith("{"))return null;try{let t=JSON.parse(r);if(t&&typeof t=="object"&&!Array.isArray(t))return t}catch{return null}return null}function st(e){let r=e.targetPrReconciliation??e.target_pr_reconciliation??e.targetPrs??e.target_prs;return Array.isArray(r)?r.length:0}function ee(e){let r=e.trim();if(!r)return null;let t=Pe(r);if(t)return t;let n=[],o=/```(?:json)?\s*([\s\S]*?)```/gi,s;for(;(s=o.exec(r))!==null;){let m=Pe(s[1]??"");m&&n.push(m)}let i=r.indexOf("{"),a=r.lastIndexOf("}");if(i>=0&&a>i){let m=Pe(r.slice(i,a+1));m&&n.push(m)}if(n.length===0)return null;let u=n[n.length-1],p=st(u);for(let m of n){let c=st(m);c>p&&(u=m,p=c)}return u}var Ie=l(()=>{"use strict"});function it(e){let r=e.trim().match(/github\.com\/([^/]+\/[^/]+)\/(?:pull|pulls)\/(\d+)/i);return r?`https://github.com/${r[1]}/pull/${r[2]}`:e.trim()||null}function at(e){let r=e.trim().match(/github\.com\/([^/]+\/[^/]+)\/(?:pull|pulls)\/(\d+)/i);return r?`${r[1].toLowerCase()}/pull/${r[2]}`:e.trim().toLowerCase()}function mo(e){return new Set(e.map(r=>at(it(r)??r)).filter(Boolean))}function lt(e,r,t){let n=it(e)??e;if(!n)return"unrelated";let o=at(n);return mo(r).has(o)?"contract":t?(t.outcome==="skipped"||t.outcome==="blocked")&&t.reason?.trim()?"support":(t.outcome==="merged","unrelated"):"unrelated"}var ut=l(()=>{"use strict"});function v(e){if(typeof e!="string")return null;let r=e.trim();return r.length?r:null}function po(e){return e==null?!1:typeof e=="string"?e.trim().length>0:typeof e=="object"?Object.keys(e).length>0:!0}function x(e){let r=e.trim().match(/github\.com\/([^/]+\/[^/]+)\/(?:pull|pulls)\/(\d+)/i);return r?`https://github.com/${r[1]}/pull/${r[2]}`:v(e)}function re(e){let r=e.trim().match(/github\.com\/([^/]+\/[^/]+)\/(?:pull|pulls)\/(\d+)/i);return r?`${r[1].toLowerCase()}/pull/${r[2]}`:e.trim().toLowerCase()}function ct(e){let r=null;if(typeof e=="string"){let o=ee(e);o&&(r=o)}else e&&typeof e=="object"&&!Array.isArray(e)&&(r=e);if(!r)return[];let t=r.targetPrReconciliation??r.target_pr_reconciliation;if(!Array.isArray(t))return[];let n=[];for(let o of t){if(!o||typeof o!="object"||Array.isArray(o))continue;let s=o,i=x(String(s.prUrl??s.pr_url??"")),a=v(s.outcome);!i||a!=="merged"&&a!=="skipped"&&a!=="blocked"||n.push({prUrl:i,outcome:a,mergeCommit:v(s.mergeCommit??s.merge_commit),reason:v(s.reason)})}return n}function dt(e,r){let t=[],n=x(v(e.prUrl)??"");if(n&&t.push(n),r&&typeof r=="object"&&!Array.isArray(r)){let o=r,s=x(String(o.prUrl??o.pr_url??""));s&&t.push(s)}return[...new Set(t)]}function mt(e){let{contract:r,snapshot:t}=e,n=e.finalResult??t.finalResult;if(!r.landingOnly&&r.targetPrUrls.length===0&&!r.repairEnforceOriginalPr)return{blocked:!1};if(!po(n))return(r.requiresTargetPrReconciliation??(r.landingOnly||!!r.repairEnforceOriginalPr||r.targetPrUrls.length>0))&&r.targetPrUrls.length>0?{blocked:!0,reason:"missing_target_pr_reconciliation",detail:`Final result required to reconcile target PR(s): ${r.targetPrUrls.join(", ")}`}:{blocked:!1};if(!(r.requiresTargetPrReconciliation??(r.landingOnly||!!r.repairEnforceOriginalPr||r.targetPrUrls.length>0))&&!r.repairEnforceOriginalPr)return{blocked:!1};let s=r.repairEnforceOriginalPr?x(v(r.targetPrUrl)??"")??(r.targetPrUrls.length===1?x(r.targetPrUrls[0]):null):null;if(s){let c=dt(t,n);if(!(n&&typeof n=="object"&&!Array.isArray(n)&&n.supersedesOriginalTargetPr===!0)){for(let y of c)if(y!==s)return{blocked:!0,reason:"duplicate_repair_pr",detail:`Repair worker opened or attached PR ${y} instead of canonical target ${s}`}}let h=ct(n).find(y=>y.prUrl===s);if(!h||h.outcome!=="merged"&&!(h.reason?.trim()&&(h.outcome==="skipped"||h.outcome==="blocked")))return{blocked:!0,reason:"missing_repair_target_reconciliation",detail:`Repair worker must reconcile target PR ${s}`}}let i=ct(n),a=new Map(i.map(c=>[re(c.prUrl),c])),u=new Set(r.targetPrUrls.map(c=>re(x(c)??c)).filter(Boolean)),p=dt(t,n);if(r.landingOnly)for(let c of p){let d=a.get(re(c)),f=lt(c,r.targetPrUrls,d);if(!(f==="contract"||f==="support"))return u.size>0?{blocked:!0,reason:"unrelated_implementation_pr",detail:`Landing-only worker attached unrelated PR ${c}`}:{blocked:!0,reason:"unrelated_implementation_pr",detail:"Landing-only worker must not open new implementation PRs"}}if(r.targetPrUrls.length===0)return{blocked:!1};let m=[];for(let c of r.targetPrUrls){let d=re(x(c)??c),f=a.get(d);if(!f){m.push(d);continue}f.outcome!=="merged"&&!f.reason?.trim()&&m.push(d)}return m.length>0?{blocked:!0,reason:m.every(c=>a.has(c))?"incomplete_target_pr_landing":"missing_target_pr_reconciliation",detail:`Target PR reconciliation incomplete: ${m.join(", ")}`}:{blocked:!1}}function pt(e){if(e.blocked)return e.detail??e.reason}var ft=l(()=>{"use strict";Ie();ut()});function go(e){let r=Date.now();if(e.providerTerminalError||H(e.finalResult)||e.finalResult&&e.error?.trim()||P(e.error)||P(e.finalResult)){let o=e.error||(typeof e.finalResult=="string"?e.finalResult:"provider terminal error");return{state:"blocked",reason:we(o)?.reason??`provider terminal error: ${o}`}}if(e.completionBlocker&&!gt(e.completionBlocker))return{state:"blocked",reason:e.completionBlocker};if(e.finalResult){if(e.localOnly&&yo(e.finalResult))return{state:"done",reason:"local-only worker superseded by merged PR"};let o={finalResult:e.finalResult,changedFiles:e.changedFiles??[],gitAncestry:e.gitAncestry??null,prUrl:e.prUrl??null},s=tt(o);if(s.blocked){let i=nt(s);return{state:"needs_attention",reason:s.reason?`landing blocked (${s.reason}): ${i}`:`landing blocked: ${i}`}}if(e.landingContract){let i=mt({contract:e.landingContract,snapshot:o,finalResult:e.finalResult}),a=pt(i);if(a)return{state:"needs_attention",reason:i.reason?`landing contract (${i.reason}): ${a}`:`landing contract: ${a}`}}return{state:"done",reason:"final result recorded"}}if(!e.alive){if(ho(e))return{state:"done",reason:"empty abandoned worker record"};let o=we(e.error);if(o)return{state:"blocked",reason:o.reason};let s=Jr({alive:!1,finalResult:null,changedFiles:e.changedFiles,gitAncestry:e.gitAncestry});if(s?.salvageable){let u=e.error?.trim();return{state:"needs_attention",reason:u?`${s.attentionReason} (${u})`:s.attentionReason}}let i=e.error?.trim(),a=Ae(i);return{state:"needs_attention",reason:i?`process exited without a final result${a?" (ran out of memory)":""}: ${i}`:s?.attentionReason??"process exited without a final result"}}if(e.heartbeatBlocker)return{state:"blocked",reason:`worker heartbeat reported blocker: ${e.heartbeatBlocker}`};let t=e.startedAt?Date.parse(e.startedAt):NaN;if(!e.firstEventAt&&e.stdoutBytes===0&&e.heartbeatBytes===0&&Number.isFinite(t)&&r-t>fo)return{state:"needs_attention",reason:`no first stream event ${ae(t)}s after start`};let n=e.lastActivityAt?Date.parse(e.lastActivityAt):NaN;return Number.isFinite(n)&&r-n>te?{state:"stale",reason:`no log/event/heartbeat activity for ${ae(n)}s`}:{state:"ok",reason:"recent activity"}}function gt(e){let r=e?.trim();return r?/completion acknowledged but board not advanced/i.test(r)&&/task already terminal/i.test(r):!1}function ho(e){return e.finalResult||e.taskId||e.agentOsId||e.stdoutBytes>0||(e.stderrBytes??0)>0||e.heartbeatBytes>0||e.error?.trim()||(e.changedFiles??[]).some(r=>r.trim())?!1:/empty worker dir|marked abandoned/i.test(e.reconcileReason??"")}function yo(e){let r=null;if(typeof e=="string"?r=ee(e):e&&typeof e=="object"&&!Array.isArray(e)&&(r=e),!r)return!1;let t=r.targetPrReconciliation??r.target_pr_reconciliation;return Array.isArray(t)?t.some(n=>!n||typeof n!="object"||Array.isArray(n)?!1:String(n.outcome??"").trim()==="merged"):!1}function ko(e,r,t){let n=e.completionSnapshot?.finalResult;return e.completionAckSource==="local-pr-merged-reconcile"&&n!==void 0&&n!==null?n:r||(n??Le(t))}function bo(e,r={}){let t=ar(e.stdoutPath),n=He(e.heartbeatPath),o=typeof e.completionReportedAt=="string"&&e.completionReportedAt.trim().length>0,s=ko(e,t.finalResult,n),i=o?!1:A(e.pid),a=U(e.stdoutPath),u=U(e.stderrPath),p=U(e.heartbeatPath),{changedFiles:m,gitAncestry:c}=et(e.worktreePath,{base:r.base,baseCommit:r.baseCommit},{alive:i}),d=Fe([t.lastEventAt,n.lastHeartbeatAt,M(e.stdoutPath),M(e.stderrPath),M(e.heartbeatPath)]),f=i?null:Ee(e.workerDir),h=s&&!Ce(s)?s:null,y=t.error||!i&&!s&&F(e.stderrPath,10).trim()||void 0,Te=y||!i&&s&&!h&&F(e.stderrPath,10).trim()||void 0,Ne=typeof e.completionBlocker=="string"&&e.completionBlocker.trim()?e.completionBlocker.trim():null,Ke=gt(Ne)?null:Ne,St=e.repairTargetPrUrl?{landingOnly:!1,targetPrUrls:[e.repairTargetPrUrl],targetPrUrl:e.repairTargetPrUrl,repairEnforceOriginalPr:!0}:null,B=go({alive:i,finalResult:s,firstEventAt:t.firstEventAt,stdoutBytes:a,stderrBytes:u,heartbeatBytes:p,lastActivityAt:d,heartbeatBlocker:n.heartbeatBlocker,startedAt:e.startedAt,error:y,providerTerminalError:t.providerTerminalError,changedFiles:m,gitAncestry:c,completionBlocker:Ke,landingContract:St,prUrl:e.repairTargetPrUrl??e.taskPrUrl??null,localOnly:e.localOnly===!0,taskId:e.taskId??null,agentOsId:e.agentOsId??null,reconcileReason:e.reconcileReason??null}),_t=Ke||B.state==="blocked"?"blocked":o||B.state==="done"?"done":s?"exited":i?"running":"exited",ne=e.stopClass&&e.stopClass!=="running"&&e.stopClass!=="finished"?e.stopClass:null,Et=Hr({alive:i,finalResult:s,error:Te??null,stale:B.state==="stale",noRestartAt:e.noRestartAt??null,reconcileReason:e.reconcileReason??null,exit:f}),C=ne&&!i&&!h?ne:Et,vt=C==="running"||C==="finished"?null:(ne===C?e.stopReason:void 0)??jr({stopClass:C,exit:f,error:Te??null,reconcileReason:e.reconcileReason??null});return{runId:e.runId,worker:e.name,pid:e.pid,alive:i,status:_t,stopClass:C,stopReason:vt,exit:f,attention:B,branch:e.branch,worktreePath:e.worktreePath,ownedPaths:e.ownedPaths,stdoutBytes:a,stderrBytes:u,heartbeatBytes:p,firstEventAt:t.firstEventAt,lastEventAt:t.lastEventAt,lastActivityAt:d,currentTool:o?null:t.currentTool,heartbeatCount:n.heartbeatCount,lastHeartbeatAt:n.lastHeartbeatAt,lastHeartbeatPhase:n.lastHeartbeatPhase,lastHeartbeatSummary:n.lastHeartbeatSummary,heartbeatBlocker:n.heartbeatBlocker,timestampAnomalies:n.timestampAnomalies,finalResult:s,error:y,providerTerminalError:t.providerTerminalError,changedFiles:m,gitAncestry:c,instructionPolicyFingerprint:e.instructionPolicyFingerprint??null,instructionPolicyEvidence:e.instructionPolicyEvidence??null,model:e.model??e.orchestrationAudit?.model??null,provider:e.provider??e.orchestrationAudit?.provider??null,usage:t.usage??null,boxKind:e.boxKind??null,boxId:e.boxId??null,runtimeId:e.runtimeId??null,personaSlug:e.personaSlug??null,dispatched:e.dispatched??null,localOnly:e.localOnly??null}}function ht(e){return!!(e.finalResult||e.alive===!1||e.status==="exited"||e.status==="done")}function yt(e){return e.finalResult?e.attention.state==="needs_attention"||e.attention.state==="blocked":!1}var fo,te,N=l(()=>{"use strict";je();lr();Yr();ve();j();Gr();Xr();rt();ot();ft();Ie();g();fo=18e4,te=6e5});N();var kt="kynver-harness:",Ro="@runner:";function bt(e){return e?.trim()?e.trim():null}function xo(e){let r=bt(e);if(!r?.startsWith(kt))return null;let t=r.slice(kt.length),n=t.indexOf(Ro);return n>=0?t.slice(0,n).trim()||null:t.trim()||null}function Rt(e,r){let t=bt(r);return t?xo(e)===t:!1}N();g();function So(e){let{worker:r,status:t,taskLease:n}=e,o=n?.leaseOwner??null;if(r.dispatched&&n){if(n.status==="running"&&o&&!Rt(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>te?{health:"stale",reason:`heartbeat older than ${Math.floor(te/1e3)}s`}:t.alive&&r.pid&&!A(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"}}T();function xt(e){return!!e.completionReportedAt?.trim()}N();function _o(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"),xt(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"),yt(t)&&n.push(t.attention.reason||"landing gate blocked");let o=ht(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}}export{_o as assessAutoCompleteEligibility,So as classifyWorkerHealth,bo as computeWorkerStatus};
|
|
@@ -1 +1,65 @@
|
|
|
1
|
-
import{existsSync as ie}from"node:fs";import{homedir as se}from"node:os";import ae from"node:path";import{createHash as M}from"node:crypto";import{statSync as ne}from"node:fs";import{spawnSync as H}from"node:child_process";import{existsSync as Y,readFileSync as G}from"node:fs";import p from"node:path";var _=class extends Error{constructor(t){super(`${t} is a batch file that is not a Node CLI shim; it cannot be spawned without a shell. Point the matching KYNVER_*_BIN setting at the real .exe or the CLI's JS entry, or run the daemon inside WSL.`);this.shimPath=t;this.name="UnresolvableWindowsShimError"}shimPath},X=".COM;.EXE;.BAT;.CMD";function q(e){return e.includes("/")||e.includes("\\")}function Q(e){return(e.PATHEXT||X).split(";").map(r=>r.trim().toLowerCase()).filter(r=>r.startsWith("."))}function Z(e){let r=Object.keys(e).find(t=>t.toUpperCase()==="PATH");return r?e[r]??"":""}function ee(e,r={}){let t=r.env??process.env,o=r.exists??Y,n=Q(t),i=p.win32.extname(e)!=="",s=a=>i?[a]:n.map(c=>`${a}${c}`);if(q(e)||p.win32.isAbsolute(e))return s(e).find(a=>o(a))??null;for(let a of Z(t).split(";").map(c=>c.trim()).filter(Boolean)){let c=s(p.win32.join(a,e)).find(m=>o(m));if(c)return c}return null}var D=/%~?dp0%?\\?([^"%\r\n]+?\.(?:c|m)?js)\b/i,re=/^\s*SET\s+"?([A-Za-z_]\w*)=([^"\r\n]*)"?\s*$/i;function B(e){return e.replace(/^[\\/]+/,"")}function te(e){let r=e.split(/\r?\n/),t=new Map;for(let i of r){let s=re.exec(i);s&&t.set(s[1].toUpperCase(),s[2])}let o=r.filter(i=>i.includes("%*")).pop();if(!o)return null;let n=D.exec(o);if(n)return B(n[1]);for(let i of o.matchAll(/%([A-Za-z_]\w*)%/g)){let s=t.get(i[1].toUpperCase()),a=s?D.exec(s):null;if(a)return B(a[1])}return null}function oe(e,r={}){if((r.platform??process.platform)!=="win32")return{executable:e,prefixArgs:[],kind:"passthrough"};let o=ee(e,r);if(!o)return{executable:e,prefixArgs:[],kind:"passthrough"};let n=p.win32.extname(o).toLowerCase();if(n!==".cmd"&&n!==".bat")return{executable:o,prefixArgs:[],kind:"exe"};let i=r.readText??(z=>G(z,"utf8")),s=r.exists??Y,a;try{a=i(o)}catch{throw new _(o)}let c=te(a);if(!c)throw new _(o);let m=p.win32.dirname(o),K=p.win32.join(m,c);if(!s(K))throw new _(o);let L=p.win32.join(m,"node.exe");return{executable:s(L)?L:r.nodeExecutable??process.execPath,prefixArgs:[K],kind:"node-shim"}}function R(e,r,t={}){let o=oe(e,t);return[o.executable,[...o.prefixArgs,...r]]}function l(e){try{let r=ne(e),t=`${e}|${r.size}|${r.mtimeMs}`;return M("sha256").update(t).digest("hex").slice(0,16)}catch{return}}function h(e){return M("sha256").update(`env:${e}`).digest("hex").slice(0,16)}function d(e,r){for(let t of r){let o=process.env[t]?.trim();if(o)return o}return e}function u(e,r,t={}){let o=t.timeoutMs??8e3;try{let[n,i]=R(e,r),s=H(n,i,{windowsHide:!0,encoding:"utf8",timeout:o,env:{...process.env,...t.env,CI:"1",NO_COLOR:"1"}});if(s.status===0)return{ok:!0,note:t.okNote??`${e} ${r.join(" ")}: ok`};let a=(s.stderr||s.stdout||"").trim(),c=t.failPrefix??`${e} ${r.join(" ")} failed`;return{ok:!1,note:a?`${c}: ${a.slice(0,200)}`:c}}catch(n){return{ok:!1,note:n instanceof Error?n.message:`${e} probe failed`}}}function A(e,r,t={}){let o=t.timeoutMs??8e3;try{let[n,i]=R(e,r);return H(n,i,{windowsHide:!0,stdio:"ignore",timeout:o,env:{...process.env,CI:"1",NO_COLOR:"1"}}).status===0?{ok:!0,note:t.okNote??`${e} authenticated`}:{ok:!1,note:t.failNote??`${e} not authenticated`}}catch(n){return{ok:!1,note:n instanceof Error?n.message:`${e} auth probe failed`}}}var ce="claude";function ue(){let e=se();return[ae.join(e,".claude",".credentials.json")]}function U(e=new Date().toISOString()){let r=d(ce,["KYNVER_CLAUDE_BIN","CLAUDE_BIN"]);if(process.env.ANTHROPIC_API_KEY?.trim())return{providerId:"claude",ready:!1,authSource:"api_key_env",sessionFingerprint:h("ANTHROPIC_API_KEY"),checkedAt:e,note:"ANTHROPIC_API_KEY present but scrubbed from worker env (deployment secret) \u2014 use `claude` CLI login (OAuth) for harness workers"};let t=u(r,["--version"],{okNote:`${r} CLI available`,failPrefix:`${r} CLI not available`}),o=ue().find(s=>ie(s)),n=A(r,["auth","status"],{okNote:"claude auth status: authenticated",failNote:"claude auth status: not authenticated"}),i=t.ok&&(n.ok||!!o);return{providerId:"claude",ready:i,authSource:"oauth_local",sessionFingerprint:o?l(o):void 0,checkedAt:e,note:i?"Local Claude Code OAuth session bound on runner":[t.note,n.note,o?void 0:"no ~/.claude/.credentials.json"].filter(Boolean).join("; ")}}import{existsSync as le}from"node:fs";import{homedir as de}from"node:os";import S from"node:path";var pe="codex";function fe(){let e=de();return[process.env.CODEX_HOME?.trim()?S.join(S.resolve(process.env.CODEX_HOME.trim()),"auth.json"):null,S.join(e,".codex","auth.json"),S.join(e,".config","codex","auth.json")].filter(t=>!!t)}function me(e){return S.dirname(e)}function he(e){let r,t;for(let o of fe()){if(!le(o))continue;r??=o;let n=u(e,["login","status"],{okNote:"codex login status: authenticated",failPrefix:"codex login status",env:{CODEX_HOME:me(o)}});if(t??=n,n.ok)return{authPath:o,login:n}}return{authPath:r,login:t??u(e,["login","status"],{okNote:"codex login status: authenticated",failPrefix:"codex login status"})}}function j(e=new Date().toISOString()){let r=d(pe,["KYNVER_CODEX_BIN","CODEX_BIN"]);if(process.env.CODEX_API_KEY?.trim())return{providerId:"codex",ready:!0,authSource:"api_key_env",sessionFingerprint:h("CODEX_API_KEY"),checkedAt:e,note:"CODEX_API_KEY present (env binding \u2014 cloud credits path, no token stored in Kynver)"};let{authPath:t,login:o}=he(r),n=!!t&&o.ok;return{providerId:"codex",ready:n,authSource:"oauth_local",sessionFingerprint:t?l(t):void 0,checkedAt:e,note:n?"Local Codex OAuth session bound on runner":[o.note,t?void 0:"no Codex auth store found"].filter(Boolean).join("; ")}}import{existsSync as ge}from"node:fs";import{homedir as Ee}from"node:os";import y from"node:path";function _e(){let e=process.env.HERMES_HOME?.trim(),r=e?y.resolve(e):y.join(Ee(),".hermes");return y.join(r,"auth.json")}function x(e=new Date().toISOString()){let r=d("hermes",["KYNVER_HERMES_BIN","HERMES_BIN"]),t=u(r,["--version"],{okNote:`${r} CLI available`,failPrefix:`${r} CLI not available`}),o=_e(),n=ge(o),i=A(r,["auth","status","openai-codex"],{okNote:"hermes openai-codex: logged in",failNote:"hermes openai-codex: not logged in"}),s=t.ok&&i.ok;return{path:"hermes_openai_codex",ready:s,authSource:s?"subscription_hermes":"none",sessionFingerprint:n?l(o):void 0,checkedAt:e,note:s?"Hermes openai-codex subscription session bound (ChatGPT Codex OAuth)":[t.note,i.note,n?void 0:"no ~/.hermes/auth.json"].filter(Boolean).join("; ")}}function $(e=new Date().toISOString()){let r=j(e);if(r.ready)return{...r,path:"codex_cli"};let t=x(e);return t.ready?{providerId:"codex",ready:!0,authSource:t.authSource,sessionFingerprint:t.sessionFingerprint,checkedAt:t.checkedAt,note:t.note,path:"hermes_openai_codex",hermesOpenAiCodex:t}:{providerId:"codex",ready:!1,authSource:"none",checkedAt:e,path:"none",hermesOpenAiCodex:t,note:[r.note,t.note].filter(Boolean).join("; ")||"Codex CLI and Hermes openai-codex unavailable"}}import{existsSync as be}from"node:fs";import{homedir as ke}from"node:os";import E from"node:path";import{closeSync as Dr,existsSync as Pe,mkdirSync as Br,openSync as Yr,statSync as Mr,unlinkSync as Hr}from"node:fs";import g from"node:path";function v(e=process.platform){return e!=="win32"}var Se=["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"],Ar=new Set(Se);var Oe=["GITHUB_TOKEN","GH_TOKEN","CLAUDE_CODE_OAUTH_TOKEN","CODEX_API_KEY","GEMINI_API_KEY"],xr=new Set(Oe);import{existsSync as O,readdirSync as Ce}from"node:fs";import f from"node:path";var Ae=/^\d{4}\.\d{1,2}\.\d{1,2}-[a-f0-9]+$/i;function xe(e){let t=e.split("-")[0].split(".");if(t.length!==3)return null;let[o,n,i]=t;return!o||!n||!i?null:+`${o}${n.padStart(2,"0")}${i.padStart(2,"0")}`}function ve(e){let r=f.join(e,"versions");if(!O(r))return null;let t=null,o=-1;for(let n of Ce(r,{withFileTypes:!0})){if(!n.isDirectory()||!Ae.test(n.name))continue;let i=xe(n.name);i==null||i<=o||(o=i,t=f.join(r,n.name))}return t}function k(e){let r=e?.trim()||f.join(process.env.LOCALAPPDATA||"","cursor-agent"),t=f.join(r,"node.exe"),o=f.join(r,"index.js");if(O(t)&&O(o))return{nodeExe:t,indexJs:o,versionDir:r};let n=ve(r);if(!n)return null;let i=f.join(n,"node.exe"),s=f.join(n,"index.js");return!O(i)||!O(s)?null:{nodeExe:i,indexJs:s,versionDir:n}}function Re(e,r,t){return{executable:e,prefixArgs:[r],shell:!1,detached:v(),bundledVersionDir:t}}function F(e){if(process.platform==="win32"){let r=/\.(cmd|bat)$/i.test(e),t=/node\.exe$/i.test(e)&&Pe(g.join(g.dirname(e),"index.js"));if(r||t||e==="agent"){let n=r?k(g.dirname(e)):t?{nodeExe:e,indexJs:g.join(g.dirname(e),"index.js"),versionDir:g.dirname(e)}:k();if(n)return Re(n.nodeExe,n.indexJs,n.versionDir);throw new Error("Cursor Agent on Windows has no headless bundled node.exe under %LOCALAPPDATA%\\cursor-agent\\versions\\\u2026. Run `agent login` / update Cursor Agent CLI, use `--provider claude`, or set KYNVER_CURSOR_AGENT_ROOT to the cursor-agent folder.")}}return{executable:e,prefixArgs:[],shell:!1,detached:v()}}import{spawnSync as ye}from"node:child_process";function b(e,r=process.env){try{let t;try{t=F(e)}catch{t={executable:e,prefixArgs:[]}}let o=ye(t.executable,[...t.prefixArgs,"status","--format","json"],{encoding:"utf8",windowsHide:!0,timeout:8e3,env:{...r,CI:"1",NO_COLOR:"1"}});if(o.status!==0)return{ok:!1,note:"agent status: not authenticated"};let n=(o.stdout||"").trim();if(!n)return{ok:!1,note:"agent status: empty response"};let i;try{i=JSON.parse(n)}catch{return{ok:!1,note:"agent status: unparseable response"}}return typeof i=="object"&&i!==null&&i.isAuthenticated===!0?{ok:!0,note:"agent status: authenticated"}:{ok:!1,note:"agent status: not authenticated"}}catch(t){return{ok:!1,note:t instanceof Error?t.message:"agent status probe failed"}}}function I(e=process.env){let r=[],t=e.KYNVER_CURSOR_AUTH_HOME?.trim();t&&(r.push(E.join(t,".config","cursor","auth.json")),r.push(E.join(t,".cursor-agent","auth.json")));let o=ke();if(r.push(E.join(o,".config","cursor","auth.json")),r.push(E.join(o,".cursor-agent","auth.json")),process.platform==="win32"){let n=e.LOCALAPPDATA?.trim(),i=e.APPDATA?.trim();n&&r.push(E.join(n,"cursor-agent","auth.json")),i&&r.push(E.join(i,"cursor","auth.json"))}return r}var Ie="agent";function V(e=new Date().toISOString()){let r=d(Ie,["KYNVER_CURSOR_AGENT_BIN","CURSOR_AGENT_BIN"]);if(process.env.CURSOR_API_KEY?.trim())return{providerId:"cursor",ready:!1,authSource:"api_key_env",sessionFingerprint:h("CURSOR_API_KEY"),checkedAt:e,note:"CURSOR_API_KEY present but scrubbed from worker env (deployment secret) \u2014 use `agent login` (OAuth) for harness workers"};let t=u(r,["-v"],{okNote:`${r} CLI available`,failPrefix:`${r} CLI not available`}),o=I().find(a=>be(a)),n=b(r),i=!!o||n.ok,s=t.ok&&i;return{providerId:"cursor",ready:s,authSource:"oauth_local",sessionFingerprint:o?l(o):void 0,checkedAt:e,note:s?"Local Cursor/Composer OAuth session bound on runner":[t.note,i?void 0:n.note??"no ~/.config/cursor/auth.json or `agent login` session"].filter(Boolean).join("; ")}}import{existsSync as Ne,readFileSync as Te}from"node:fs";import{homedir as we}from"node:os";import N from"node:path";var Ke=["OPENAI_API_KEY","ANTHROPIC_API_KEY","KYNVER_API_KEY","KYNVER_BASE_URL"];function Le(){let e=process.env.HERMES_HOME?.trim(),r=e?N.resolve(e):N.join(we(),".hermes");return N.join(r,".env")}function De(e){try{let r=Te(e,"utf8"),t=[];for(let o of Ke)new RegExp(`^${o}=`,"m").test(r)&&t.push(o);return t}catch{return[]}}function W(e=new Date().toISOString()){let r=d("hermes",["KYNVER_HERMES_BIN","HERMES_BIN"]),t=u(r,["--version"],{okNote:`${r} CLI available`,failPrefix:`${r} CLI not available`}),o=Le(),n=Ne(o),i=n?De(o):[],a=i.some(m=>m.endsWith("_API_KEY"))?"api_key_env":n?"oauth_local":"none",c=t.ok&&n;return{adapterId:"hermes",cliAvailable:t.ok,profileBound:n,authSource:a,sessionFingerprint:n?l(o):void 0,checkedAt:e,note:c?`Hermes profile bound (${i.length?`keys: ${i.join(", ")}`:"no API keys detected"})`:[t.note,n?void 0:"no ~/.hermes/.env"].filter(Boolean).join("; ")}}function Be(e={}){let r=e.nowIso?.()??new Date().toISOString(),t=$(r),o={codex:t,cursor:V(r),claude:U(r)},n=Object.values(o).filter(i=>i.ready).length;return{generatedAt:r,bindings:o,cloudApiCredits:{anthropicApiKey:!!process.env.ANTHROPIC_API_KEY?.trim(),openaiApiKey:!!process.env.OPENAI_API_KEY?.trim(),codexApiKey:!!process.env.CODEX_API_KEY?.trim()},workerEndpoint:{baseUrlConfigured:!!process.env.KYNVER_WORKER_BASE_URL?.trim(),apiKeyConfigured:!!process.env.KYNVER_WORKER_API_KEY?.trim()},hermes:W(r),hermesOpenAiCodex:x(r),codexAdapterPath:t.path,readyCount:n}}var Ye={codex:{id:"codex",displayName:"Codex (BYO OAuth / Hermes openai-codex)",costTier:"low",authSources:["oauth_local","api_key_env","subscription_hermes"],supportsLowRiskOrchestration:!0,supportsPrivilegedPlatformActions:!1,workerMcpTools:"supported"},cursor:{id:"cursor",displayName:"Cursor / Composer",costTier:"medium",authSources:["oauth_local","api_key_env"],supportsLowRiskOrchestration:!0,supportsPrivilegedPlatformActions:!0,workerMcpTools:"supported"},claude:{id:"claude",displayName:"Claude Code",costTier:"high",authSources:["oauth_local"],supportsLowRiskOrchestration:!0,supportsPrivilegedPlatformActions:!0,workerMcpTools:"supported"}};function Me(){return Object.values(Ye)}var J=["off","observe","enforce"];function He(e){let r=(e??"off").trim().toLowerCase();return J.includes(r)?r:"off"}function P(e=process.env){return He(e.KYNVER_ORCHESTRATION_POLICY_MODE)}function T(e=process.env){let r=e.KYNVER_ORCHESTRATION_ENFORCE_TASKS?.trim().toLowerCase();return r?r==="1"||r==="true"||r==="yes"||r==="on":P(e)==="enforce"}import{createHash as Ue}from"node:crypto";function C(e){if(e==null)return null;let r=e.trim();return r.length?r:null}function w(e){let r=C(e.sessionId)??"anonymous",t=C(e.title)??C(e.action)??"foreground",o=Ue("sha256").update([C(e.planId)??"",C(e.parentTaskId)??"",t.toLowerCase()].join("|")).digest("hex").slice(0,16);return`hermes-foreground:${r}:${o}`}function je(e,r){return e==="enforce"&&r?"enforce_harness_task":e==="observe"?"observe_bypass":"allow_local"}function $e(e,r=process.env){let t=P(r),o=T(r),n=je(t,o),i=n==="enforce_harness_task"?w({sessionId:e.sessionId,planId:e.planId,parentTaskId:e.parentTaskId,title:e.title,action:e.action}):null,s;return t==="off"?s="Orchestration policy off \u2014 local foreground path allowed.":n==="observe_bypass"?s=`Observe mode: ${e.action} bypass logged; local fallback preserved.`:n==="enforce_harness_task"?s=`Enforce mode: ${e.action} must create linked harness AgentTask (${i}).`:s="Local foreground path allowed.",{mode:t,decision:n,idempotencyKey:i,bypassLogged:n==="observe_bypass",reason:s}}export{w as buildForegroundHarnessIdempotencyKey,Be as buildOrchestrationProviderInventory,$e as evaluateOrchestrationPolicy,T as isOrchestrationEnforceTasksEnabled,Me as listOrchestrationProviderCapabilities,P as resolveOrchestrationPolicyMode};
|
|
1
|
+
import{existsSync as ie}from"node:fs";import{homedir as se}from"node:os";import ae from"node:path";import{createHash as Y}from"node:crypto";import{statSync as ne}from"node:fs";import{spawnSync as U}from"node:child_process";import{existsSync as M,readFileSync as z}from"node:fs";import p from"node:path";var _=class extends Error{constructor(t){super(`${t} is a batch file that is not a Node CLI shim; it cannot be spawned without a shell. Point the matching KYNVER_*_BIN setting at the real .exe or the CLI's JS entry, or run the daemon inside WSL.`);this.shimPath=t;this.name="UnresolvableWindowsShimError"}shimPath},X=".COM;.EXE;.BAT;.CMD";function q(e){return e.includes("/")||e.includes("\\")}function Q(e){return(e.PATHEXT||X).split(";").map(r=>r.trim().toLowerCase()).filter(r=>r.startsWith("."))}function Z(e){let r=Object.keys(e).find(t=>t.toUpperCase()==="PATH");return r?e[r]??"":""}function ee(e,r={}){let t=r.env??process.env,o=r.exists??M,n=Q(t),i=p.win32.extname(e)!=="",s=a=>i?[a]:n.map(c=>`${a}${c}`);if(q(e)||p.win32.isAbsolute(e))return s(e).find(a=>o(a))??null;for(let a of Z(t).split(";").map(c=>c.trim()).filter(Boolean)){let c=s(p.win32.join(a,e)).find(m=>o(m));if(c)return c}return null}var D=/%~?dp0%?\\?([^"%\r\n]+?\.(?:c|m)?js)\b/i,re=/^\s*SET\s+"?([A-Za-z_]\w*)=([^"\r\n]*)"?\s*$/i;function B(e){return e.replace(/^[\\/]+/,"")}function te(e){let r=e.split(/\r?\n/),t=new Map;for(let i of r){let s=re.exec(i);s&&t.set(s[1].toUpperCase(),s[2])}let o=r.filter(i=>i.includes("%*")).pop();if(!o)return null;let n=D.exec(o);if(n)return B(n[1]);for(let i of o.matchAll(/%([A-Za-z_]\w*)%/g)){let s=t.get(i[1].toUpperCase()),a=s?D.exec(s):null;if(a)return B(a[1])}return null}function oe(e,r={}){if((r.platform??process.platform)!=="win32")return{executable:e,prefixArgs:[],kind:"passthrough"};let o=ee(e,r);if(!o)return{executable:e,prefixArgs:[],kind:"passthrough"};let n=p.win32.extname(o).toLowerCase();if(n!==".cmd"&&n!==".bat")return{executable:o,prefixArgs:[],kind:"exe"};let i=r.readText??(G=>z(G,"utf8")),s=r.exists??M,a;try{a=i(o)}catch{throw new _(o)}let c=te(a);if(!c)throw new _(o);let m=p.win32.dirname(o),K=p.win32.join(m,c);if(!s(K))throw new _(o);let L=p.win32.join(m,"node.exe");return{executable:s(L)?L:r.nodeExecutable??process.execPath,prefixArgs:[K],kind:"node-shim"}}function R(e,r,t={}){let o=oe(e,t);return[o.executable,[...o.prefixArgs,...r]]}function u(e){try{let r=ne(e),t=`${e}|${r.size}|${r.mtimeMs}`;return Y("sha256").update(t).digest("hex").slice(0,16)}catch{return}}function h(e){return Y("sha256").update(`env:${e}`).digest("hex").slice(0,16)}function d(e,r){for(let t of r){let o=process.env[t]?.trim();if(o)return o}return e}function l(e,r,t={}){let o=t.timeoutMs??8e3;try{let[n,i]=R(e,r),s=U(n,i,{windowsHide:!0,encoding:"utf8",timeout:o,env:{...process.env,...t.env,CI:"1",NO_COLOR:"1"}});if(s.status===0)return{ok:!0,note:t.okNote??`${e} ${r.join(" ")}: ok`};let a=(s.stderr||s.stdout||"").trim(),c=t.failPrefix??`${e} ${r.join(" ")} failed`;return{ok:!1,note:a?`${c}: ${a.slice(0,200)}`:c}}catch(n){return{ok:!1,note:n instanceof Error?n.message:`${e} probe failed`}}}function A(e,r,t={}){let o=t.timeoutMs??8e3;try{let[n,i]=R(e,r);return U(n,i,{windowsHide:!0,stdio:"ignore",timeout:o,env:{...process.env,CI:"1",NO_COLOR:"1"}}).status===0?{ok:!0,note:t.okNote??`${e} authenticated`}:{ok:!1,note:t.failNote??`${e} not authenticated`}}catch(n){return{ok:!1,note:n instanceof Error?n.message:`${e} auth probe failed`}}}var ce="claude";function le(){let e=se();return[ae.join(e,".claude",".credentials.json")]}function j(e=new Date().toISOString()){let r=d(ce,["KYNVER_CLAUDE_BIN","CLAUDE_BIN"]);if(process.env.ANTHROPIC_API_KEY?.trim())return{providerId:"claude",ready:!1,authSource:"api_key_env",sessionFingerprint:h("ANTHROPIC_API_KEY"),checkedAt:e,note:"ANTHROPIC_API_KEY present but scrubbed from worker env (deployment secret) \u2014 use `claude` CLI login (OAuth) for harness workers"};let t=l(r,["--version"],{okNote:`${r} CLI available`,failPrefix:`${r} CLI not available`}),o=le().find(s=>ie(s)),n=A(r,["auth","status"],{okNote:"claude auth status: authenticated",failNote:"claude auth status: not authenticated"}),i=t.ok&&(n.ok||!!o);return{providerId:"claude",ready:i,authSource:"oauth_local",sessionFingerprint:o?u(o):void 0,checkedAt:e,note:i?"Local Claude Code OAuth session bound on runner":[t.note,n.note,o?void 0:"no ~/.claude/.credentials.json"].filter(Boolean).join("; ")}}import{existsSync as ue}from"node:fs";import{homedir as de}from"node:os";import S from"node:path";var pe="codex";function fe(){let e=de();return[process.env.CODEX_HOME?.trim()?S.join(S.resolve(process.env.CODEX_HOME.trim()),"auth.json"):null,S.join(e,".codex","auth.json"),S.join(e,".config","codex","auth.json")].filter(t=>!!t)}function me(e){return S.dirname(e)}function he(e){let r,t;for(let o of fe()){if(!ue(o))continue;r??=o;let n=l(e,["login","status"],{okNote:"codex login status: authenticated",failPrefix:"codex login status",env:{CODEX_HOME:me(o)}});if(t??=n,n.ok)return{authPath:o,login:n}}return{authPath:r,login:t??l(e,["login","status"],{okNote:"codex login status: authenticated",failPrefix:"codex login status"})}}function H(e=new Date().toISOString()){let r=d(pe,["KYNVER_CODEX_BIN","CODEX_BIN"]);if(process.env.CODEX_API_KEY?.trim())return{providerId:"codex",ready:!0,authSource:"api_key_env",sessionFingerprint:h("CODEX_API_KEY"),checkedAt:e,note:"CODEX_API_KEY present (env binding \u2014 cloud credits path, no token stored in Kynver)"};let{authPath:t,login:o}=he(r),n=!!t&&o.ok;return{providerId:"codex",ready:n,authSource:"oauth_local",sessionFingerprint:t?u(t):void 0,checkedAt:e,note:n?"Local Codex OAuth session bound on runner":[o.note,t?void 0:"no Codex auth store found"].filter(Boolean).join("; ")}}import{existsSync as ge}from"node:fs";import{homedir as Ee}from"node:os";import y from"node:path";function _e(){let e=process.env.HERMES_HOME?.trim(),r=e?y.resolve(e):y.join(Ee(),".hermes");return y.join(r,"auth.json")}function x(e=new Date().toISOString()){let r=d("hermes",["KYNVER_HERMES_BIN","HERMES_BIN"]),t=l(r,["--version"],{okNote:`${r} CLI available`,failPrefix:`${r} CLI not available`}),o=_e(),n=ge(o),i=A(r,["auth","status","openai-codex"],{okNote:"hermes openai-codex: logged in",failNote:"hermes openai-codex: not logged in"}),s=t.ok&&i.ok;return{path:"hermes_openai_codex",ready:s,authSource:s?"subscription_hermes":"none",sessionFingerprint:n?u(o):void 0,checkedAt:e,note:s?"Hermes openai-codex subscription session bound (ChatGPT Codex OAuth)":[t.note,i.note,n?void 0:"no ~/.hermes/auth.json"].filter(Boolean).join("; ")}}function $(e=new Date().toISOString()){let r=H(e);if(r.ready)return{...r,path:"codex_cli"};let t=x(e);return t.ready?{providerId:"codex",ready:!0,authSource:t.authSource,sessionFingerprint:t.sessionFingerprint,checkedAt:t.checkedAt,note:t.note,path:"hermes_openai_codex",hermesOpenAiCodex:t}:{providerId:"codex",ready:!1,authSource:"none",checkedAt:e,path:"none",hermesOpenAiCodex:t,note:[r.note,t.note].filter(Boolean).join("; ")||"Codex CLI and Hermes openai-codex unavailable"}}import{existsSync as be}from"node:fs";import{homedir as ke}from"node:os";import E from"node:path";import{closeSync as Yr,existsSync as Pe,mkdirSync as Ur,openSync as jr,statSync as Hr,unlinkSync as $r}from"node:fs";var Er=String.raw`"use strict";
|
|
2
|
+
const cp = require("child_process"), fs = require("fs");
|
|
3
|
+
const argv = process.argv.slice(1);
|
|
4
|
+
const exitFile = argv[0], cmd = argv[1], args = argv.slice(2);
|
|
5
|
+
const startedMs = Date.now();
|
|
6
|
+
function cgroupOomKills() {
|
|
7
|
+
try {
|
|
8
|
+
const line = fs.readFileSync("/proc/self/cgroup", "utf8").split("\n").find((l) => l.startsWith("0::"));
|
|
9
|
+
if (!line) return null;
|
|
10
|
+
const file = "/sys/fs/cgroup" + line.slice(3).trim().replace(/\/$/, "") + "/memory.events";
|
|
11
|
+
const m = /(?:^|\n)oom_kill (\d+)/.exec(fs.readFileSync(file, "utf8"));
|
|
12
|
+
return m ? Number(m[1]) : null;
|
|
13
|
+
} catch { return null; }
|
|
14
|
+
}
|
|
15
|
+
function kernelLog() {
|
|
16
|
+
const override = process.env.KYNVER_EXIT_CAPTURE_KERNEL_LOG_FILE;
|
|
17
|
+
if (override) { try { return fs.readFileSync(override, "utf8"); } catch { return ""; } }
|
|
18
|
+
const run = (bin, a) => {
|
|
19
|
+
try {
|
|
20
|
+
const r = cp.spawnSync(bin, a, { encoding: "utf8", timeout: 3000, maxBuffer: 8 * 1024 * 1024, stdio: ["ignore", "pipe", "ignore"] });
|
|
21
|
+
return r.status === 0 ? String(r.stdout || "") : "";
|
|
22
|
+
} catch { return ""; }
|
|
23
|
+
};
|
|
24
|
+
return run("journalctl", ["-k", "-q", "--no-pager", "--since", "@" + Math.floor(startedMs / 1000)]) || run("dmesg", []);
|
|
25
|
+
}
|
|
26
|
+
const oomBefore = cgroupOomKills();
|
|
27
|
+
let child, finished = false;
|
|
28
|
+
function write(rec) {
|
|
29
|
+
try { fs.writeFileSync(exitFile, JSON.stringify(rec, null, 2) + "\n"); } catch {}
|
|
30
|
+
}
|
|
31
|
+
function finish(code, signal, spawnError) {
|
|
32
|
+
if (finished) return;
|
|
33
|
+
finished = true;
|
|
34
|
+
const rec = { exitCode: code, signal: signal || null, startedAt: new Date(startedMs).toISOString(), endedAt: new Date().toISOString(), childPid: child && child.pid };
|
|
35
|
+
if (spawnError) rec.spawnError = spawnError;
|
|
36
|
+
if (signal === "SIGKILL" || code === 137 || (code !== 0 && code !== null)) {
|
|
37
|
+
const oomAfter = cgroupOomKills();
|
|
38
|
+
if (oomBefore !== null && oomAfter !== null && oomAfter > oomBefore) {
|
|
39
|
+
rec.oomEvidence = { source: "cgroup", detail: "memory.events oom_kill " + oomBefore + " -> " + oomAfter };
|
|
40
|
+
} else if (signal === "SIGKILL" || code === 137) {
|
|
41
|
+
const pid = child && child.pid;
|
|
42
|
+
const hit = kernelLog().split("\n").find((l) => pid && new RegExp("(?:Killed process|oom-kill:.*pid=|Memory cgroup out of memory: Killed process) ?" + pid + "\\b").test(l));
|
|
43
|
+
if (hit) rec.oomEvidence = { source: "kernel_log", detail: hit.trim().slice(0, 300) };
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
write(rec);
|
|
47
|
+
if (signal) {
|
|
48
|
+
const n = (require("os").constants.signals || {})[signal];
|
|
49
|
+
process.exit(128 + (n || 9));
|
|
50
|
+
}
|
|
51
|
+
process.exit(code === null ? 1 : code);
|
|
52
|
+
}
|
|
53
|
+
try {
|
|
54
|
+
child = cp.spawn(cmd, args, { stdio: "inherit" });
|
|
55
|
+
} catch (e) {
|
|
56
|
+
process.stderr.write("failed to spawn worker process: " + (e && e.message) + "\n");
|
|
57
|
+
finish(127, null, String(e && e.message));
|
|
58
|
+
}
|
|
59
|
+
for (const s of ["SIGTERM", "SIGINT", "SIGHUP"]) process.on(s, () => { try { child.kill(s); } catch {} });
|
|
60
|
+
child.on("error", (e) => {
|
|
61
|
+
process.stderr.write("failed to spawn worker process: " + (e && e.message) + "\n");
|
|
62
|
+
if (!child.pid) finish(127, null, String(e && e.message));
|
|
63
|
+
});
|
|
64
|
+
child.on("exit", (code, signal) => finish(code, signal));
|
|
65
|
+
`;import g from"node:path";function v(e=process.platform){return e!=="win32"}var Se=["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"],vr=new Set(Se);var Ce=["GITHUB_TOKEN","GH_TOKEN","CLAUDE_CODE_OAUTH_TOKEN","CODEX_API_KEY","GEMINI_API_KEY"],Pr=new Set(Ce);import{existsSync as C,readdirSync as Oe}from"node:fs";import f from"node:path";var Ae=/^\d{4}\.\d{1,2}\.\d{1,2}-[a-f0-9]+$/i;function xe(e){let t=e.split("-")[0].split(".");if(t.length!==3)return null;let[o,n,i]=t;return!o||!n||!i?null:+`${o}${n.padStart(2,"0")}${i.padStart(2,"0")}`}function ve(e){let r=f.join(e,"versions");if(!C(r))return null;let t=null,o=-1;for(let n of Oe(r,{withFileTypes:!0})){if(!n.isDirectory()||!Ae.test(n.name))continue;let i=xe(n.name);i==null||i<=o||(o=i,t=f.join(r,n.name))}return t}function k(e){let r=e?.trim()||f.join(process.env.LOCALAPPDATA||"","cursor-agent"),t=f.join(r,"node.exe"),o=f.join(r,"index.js");if(C(t)&&C(o))return{nodeExe:t,indexJs:o,versionDir:r};let n=ve(r);if(!n)return null;let i=f.join(n,"node.exe"),s=f.join(n,"index.js");return!C(i)||!C(s)?null:{nodeExe:i,indexJs:s,versionDir:n}}function Re(e,r,t){return{executable:e,prefixArgs:[r],shell:!1,detached:v(),bundledVersionDir:t}}function F(e){if(process.platform==="win32"){let r=/\.(cmd|bat)$/i.test(e),t=/node\.exe$/i.test(e)&&Pe(g.join(g.dirname(e),"index.js"));if(r||t||e==="agent"){let n=r?k(g.dirname(e)):t?{nodeExe:e,indexJs:g.join(g.dirname(e),"index.js"),versionDir:g.dirname(e)}:k();if(n)return Re(n.nodeExe,n.indexJs,n.versionDir);throw new Error("Cursor Agent on Windows has no headless bundled node.exe under %LOCALAPPDATA%\\cursor-agent\\versions\\\u2026. Run `agent login` / update Cursor Agent CLI, use `--provider claude`, or set KYNVER_CURSOR_AGENT_ROOT to the cursor-agent folder.")}}return{executable:e,prefixArgs:[],shell:!1,detached:v()}}import{spawnSync as ye}from"node:child_process";function b(e,r=process.env){try{let t;try{t=F(e)}catch{t={executable:e,prefixArgs:[]}}let o=ye(t.executable,[...t.prefixArgs,"status","--format","json"],{encoding:"utf8",windowsHide:!0,timeout:8e3,env:{...r,CI:"1",NO_COLOR:"1"}});if(o.status!==0)return{ok:!1,note:"agent status: not authenticated"};let n=(o.stdout||"").trim();if(!n)return{ok:!1,note:"agent status: empty response"};let i;try{i=JSON.parse(n)}catch{return{ok:!1,note:"agent status: unparseable response"}}return typeof i=="object"&&i!==null&&i.isAuthenticated===!0?{ok:!0,note:"agent status: authenticated"}:{ok:!1,note:"agent status: not authenticated"}}catch(t){return{ok:!1,note:t instanceof Error?t.message:"agent status probe failed"}}}function I(e=process.env){let r=[],t=e.KYNVER_CURSOR_AUTH_HOME?.trim();t&&(r.push(E.join(t,".config","cursor","auth.json")),r.push(E.join(t,".cursor-agent","auth.json")));let o=ke();if(r.push(E.join(o,".config","cursor","auth.json")),r.push(E.join(o,".cursor-agent","auth.json")),process.platform==="win32"){let n=e.LOCALAPPDATA?.trim(),i=e.APPDATA?.trim();n&&r.push(E.join(n,"cursor-agent","auth.json")),i&&r.push(E.join(i,"cursor","auth.json"))}return r}var Ie="agent";function W(e=new Date().toISOString()){let r=d(Ie,["KYNVER_CURSOR_AGENT_BIN","CURSOR_AGENT_BIN"]);if(process.env.CURSOR_API_KEY?.trim())return{providerId:"cursor",ready:!1,authSource:"api_key_env",sessionFingerprint:h("CURSOR_API_KEY"),checkedAt:e,note:"CURSOR_API_KEY present but scrubbed from worker env (deployment secret) \u2014 use `agent login` (OAuth) for harness workers"};let t=l(r,["-v"],{okNote:`${r} CLI available`,failPrefix:`${r} CLI not available`}),o=I().find(a=>be(a)),n=b(r),i=!!o||n.ok,s=t.ok&&i;return{providerId:"cursor",ready:s,authSource:"oauth_local",sessionFingerprint:o?u(o):void 0,checkedAt:e,note:s?"Local Cursor/Composer OAuth session bound on runner":[t.note,i?void 0:n.note??"no ~/.config/cursor/auth.json or `agent login` session"].filter(Boolean).join("; ")}}import{existsSync as Ne,readFileSync as Te}from"node:fs";import{homedir as we}from"node:os";import N from"node:path";var Ke=["OPENAI_API_KEY","ANTHROPIC_API_KEY","KYNVER_API_KEY","KYNVER_BASE_URL"];function Le(){let e=process.env.HERMES_HOME?.trim(),r=e?N.resolve(e):N.join(we(),".hermes");return N.join(r,".env")}function De(e){try{let r=Te(e,"utf8"),t=[];for(let o of Ke)new RegExp(`^${o}=`,"m").test(r)&&t.push(o);return t}catch{return[]}}function V(e=new Date().toISOString()){let r=d("hermes",["KYNVER_HERMES_BIN","HERMES_BIN"]),t=l(r,["--version"],{okNote:`${r} CLI available`,failPrefix:`${r} CLI not available`}),o=Le(),n=Ne(o),i=n?De(o):[],a=i.some(m=>m.endsWith("_API_KEY"))?"api_key_env":n?"oauth_local":"none",c=t.ok&&n;return{adapterId:"hermes",cliAvailable:t.ok,profileBound:n,authSource:a,sessionFingerprint:n?u(o):void 0,checkedAt:e,note:c?`Hermes profile bound (${i.length?`keys: ${i.join(", ")}`:"no API keys detected"})`:[t.note,n?void 0:"no ~/.hermes/.env"].filter(Boolean).join("; ")}}function Be(e={}){let r=e.nowIso?.()??new Date().toISOString(),t=$(r),o={codex:t,cursor:W(r),claude:j(r)},n=Object.values(o).filter(i=>i.ready).length;return{generatedAt:r,bindings:o,cloudApiCredits:{anthropicApiKey:!!process.env.ANTHROPIC_API_KEY?.trim(),openaiApiKey:!!process.env.OPENAI_API_KEY?.trim(),codexApiKey:!!process.env.CODEX_API_KEY?.trim()},workerEndpoint:{baseUrlConfigured:!!process.env.KYNVER_WORKER_BASE_URL?.trim(),apiKeyConfigured:!!process.env.KYNVER_WORKER_API_KEY?.trim()},hermes:V(r),hermesOpenAiCodex:x(r),codexAdapterPath:t.path,readyCount:n}}var Me={codex:{id:"codex",displayName:"Codex (BYO OAuth / Hermes openai-codex)",costTier:"low",authSources:["oauth_local","api_key_env","subscription_hermes"],supportsLowRiskOrchestration:!0,supportsPrivilegedPlatformActions:!1,workerMcpTools:"supported"},cursor:{id:"cursor",displayName:"Cursor / Composer",costTier:"medium",authSources:["oauth_local","api_key_env"],supportsLowRiskOrchestration:!0,supportsPrivilegedPlatformActions:!0,workerMcpTools:"supported"},claude:{id:"claude",displayName:"Claude Code",costTier:"high",authSources:["oauth_local"],supportsLowRiskOrchestration:!0,supportsPrivilegedPlatformActions:!0,workerMcpTools:"supported"}};function Ye(){return Object.values(Me)}var J=["off","observe","enforce"];function Ue(e){let r=(e??"off").trim().toLowerCase();return J.includes(r)?r:"off"}function P(e=process.env){return Ue(e.KYNVER_ORCHESTRATION_POLICY_MODE)}function T(e=process.env){let r=e.KYNVER_ORCHESTRATION_ENFORCE_TASKS?.trim().toLowerCase();return r?r==="1"||r==="true"||r==="yes"||r==="on":P(e)==="enforce"}import{createHash as je}from"node:crypto";function O(e){if(e==null)return null;let r=e.trim();return r.length?r:null}function w(e){let r=O(e.sessionId)??"anonymous",t=O(e.title)??O(e.action)??"foreground",o=je("sha256").update([O(e.planId)??"",O(e.parentTaskId)??"",t.toLowerCase()].join("|")).digest("hex").slice(0,16);return`hermes-foreground:${r}:${o}`}function He(e,r){return e==="enforce"&&r?"enforce_harness_task":e==="observe"?"observe_bypass":"allow_local"}function $e(e,r=process.env){let t=P(r),o=T(r),n=He(t,o),i=n==="enforce_harness_task"?w({sessionId:e.sessionId,planId:e.planId,parentTaskId:e.parentTaskId,title:e.title,action:e.action}):null,s;return t==="off"?s="Orchestration policy off \u2014 local foreground path allowed.":n==="observe_bypass"?s=`Observe mode: ${e.action} bypass logged; local fallback preserved.`:n==="enforce_harness_task"?s=`Enforce mode: ${e.action} must create linked harness AgentTask (${i}).`:s="Local foreground path allowed.",{mode:t,decision:n,idempotencyKey:i,bypassLogged:n==="observe_bypass",reason:s}}export{w as buildForegroundHarnessIdempotencyKey,Be as buildOrchestrationProviderInventory,$e as evaluateOrchestrationPolicy,T as isOrchestrationEnforceTasksEnabled,Ye as listOrchestrationProviderCapabilities,P as resolveOrchestrationPolicyMode};
|