@kynver-app/runtime 0.2.78 → 0.2.90
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +104 -99
- package/dist/desktop-entry.js +140 -0
- package/dist/dispatch-claim-authorization.js +1 -0
- package/dist/index.js +125 -120
- package/dist/local-run-store/index.js +15 -15
- package/dist/server/cleanup.js +14 -14
- package/dist/server/db-credentials.js +1 -1
- package/dist/server/default-repo.js +1 -1
- package/dist/server/dispatch-routing.js +4 -4
- package/dist/server/heavy-verification.js +1 -1
- package/dist/server/memory-cost-enforce.js +2 -2
- package/dist/server/memory-cost.js +2 -2
- package/dist/server/model-routing.js +4 -4
- package/dist/server/monitor.js +7 -7
- package/dist/server/orchestration.js +1 -1
- package/dist/server/worker-policy.js +2 -2
- package/dist/worker-broker/index.js +4 -4
- package/package.json +15 -2
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
var a=(e,r,t)=>()=>{if(t)throw t[0];try{return e&&(r=e(e=0)),r}catch(n){throw t=[n],n}};import{homedir as Ae}from"node:os";import we from"node:path";function Fr(e){return e==="~"?Ae():e.startsWith("~/")||e.startsWith("~\\")?we.join(Ae(),e.slice(2)):e}function S(e){return we.resolve(Fr(e))}var O=a(()=>{"use strict"});var d=a(()=>{"use strict"});var $r,Cn,Hr,An,ne=a(()=>{"use strict";$r=["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"],Cn=new Set($r),Hr=["GITHUB_TOKEN","GH_TOKEN","CLAUDE_CODE_OAUTH_TOKEN","CODEX_API_KEY","GEMINI_API_KEY"],An=new Set(Hr)});var $=a(()=>{"use strict";O();d();ne()});var Pe=a(()=>{"use strict";$()});var oe=a(()=>{"use strict";$();O();Pe()});var ie=a(()=>{"use strict";d()});var _=a(()=>{"use strict"});var H=a(()=>{"use strict"});var Ie=a(()=>{"use strict"});var qn,zn,se=a(()=>{"use strict";qn=25*1024*1024*1024,zn=12*1024*1024*1024});var eo,ro,Ne=a(()=>{"use strict";se();eo=5*1024*1024*1024,ro=10*1024*1024*1024});var ao,lo,ae=a(()=>{"use strict";Ne();se();ao=30*1024*1024*1024,lo=15*1024*1024*1024});var Ke=a(()=>{"use strict";d()});import Gr from"node:path";var yo,le=a(()=>{"use strict";O();Ke();yo=Gr.join(".openclaw","harness")});var Y=a(()=>{"use strict";k();_();H();V();le()});var De=a(()=>{"use strict";k();le();Y();d()});var ce=a(()=>{"use strict";De();d()});var Be=a(()=>{"use strict";ce();d()});var Ue=a(()=>{"use strict"});var Le=a(()=>{"use strict";Ue();d()});var Fe=a(()=>{"use strict"});var $e=a(()=>{"use strict";Fe()});var G=a(()=>{"use strict"});var He=a(()=>{"use strict";$e();d();G()});var je=a(()=>{"use strict";G()});var Ye=a(()=>{"use strict"});var Ve=a(()=>{"use strict"});var de=a(()=>{"use strict"});var Ge=a(()=>{"use strict"});var qe=a(()=>{"use strict";de();Ge()});var ze=a(()=>{"use strict";Le();He();G();je();Ye();$();Ve();qe();de();d()});var Je=a(()=>{"use strict";ze()});var nt,ot,Xe=a(()=>{"use strict";Ie();k();_();H();V();ae();ce();Be();Je();d();nt=500*1024*1024,ot=4*1024*1024*1024});var V=a(()=>{"use strict";Xe()});import{homedir as it}from"node:os";import st from"node:path";var Qe,pe=a(()=>{"use strict";Qe=st.join(it(),".kynver",".env")});var Ze=a(()=>{"use strict"});var er=a(()=>{"use strict";Ze()});var rr=a(()=>{"use strict"});var me=a(()=>{"use strict";er();rr()});var tr=a(()=>{"use strict"});var nr=a(()=>{"use strict";tr()});var q=a(()=>{"use strict";pe();O();k();me();nr()});var or=a(()=>{"use strict";_();_()});var ir=a(()=>{"use strict";pe();me();q()});var sr=a(()=>{"use strict";oe();_();or();k();q();ir();ie();Y()});function v(e){let r=e.trim().toLowerCase();return gt[r]??r}var ar,ft,gt,z=a(()=>{"use strict";ar=["claude","cursor","codex","gemini","gemini-api","openai-compatible"],ft=ar.join("|"),gt={anthropic:"claude",opus:"claude",openai:"openai-compatible",openai_compatible:"openai-compatible","openai-compat":"openai-compatible",chatgpt:"codex",gpt:"codex","openai-api":"openai-compatible",openai_api:"openai-compatible",google:"gemini",gemini_cli:"gemini",gemini_api:"gemini-api","google-api":"gemini-api",google_api:"gemini-api"}});import{existsSync as Rt,mkdirSync as _a,readFileSync as yt,writeFileSync as ka}from"node:fs";import{homedir as _t,totalmem as ba}from"node:os";import fe from"node:path";function kt(e){return{...e,...e.harnessRoot?.trim()?{harnessRoot:S(e.harnessRoot.trim())}:{},...e.defaultRepo?.trim()?{defaultRepo:S(e.defaultRepo.trim())}:{}}}function A(){if(!Rt(lr))return{};try{return kt(JSON.parse(yt(lr,"utf8")))}catch{return{}}}var ur,lr,Wa,Ma,Da,k=a(()=>{"use strict";oe();O();ie();_();H();V();ae();q();sr();z();Y();ur=fe.join(_t(),".kynver"),lr=fe.join(ur,"config.json"),Wa=fe.join(ur,"credentials");Ma=500*1024*1024,Da=4*1024*1024*1024});var Mr=/^claude[-_]/i,Dr=/^(?:opus|sonnet|haiku)\b/i;function Se(e){let r=e.trim();return Mr.test(r)||Dr.test(r)}function Oe(e){let r=e.trim().toLowerCase();return r.startsWith("gpt-")||r.startsWith("gpt5")||r.includes("codex")}function re(e){let r=e.trim().toLowerCase();return r.includes("composer")||r.includes("cursor")}function Ce(e){return e.trim().toLowerCase().startsWith("gemini-")}function Br(e){return Oe(e)?"codex":Se(e)?"claude":Ce(e)?"gemini":(re(e),"cursor")}function Ur(e){if(!e.startsWith("provider:"))return null;let r=e.slice(9),t=r.indexOf(":"),n=(t>=0?r.slice(0,t):r).trim().toLowerCase(),o=t>=0&&r.slice(t+1).trim()||void 0;return n?n==="claude"||n==="opus"||n==="anthropic"?{provider:"claude",model:o,rule:o?"executor_ref:provider_claude_model":"executor_ref:provider_claude"}:n==="codex"?{provider:"codex",model:o,rule:"executor_ref:provider_codex"}:n==="openai-compatible"||n==="openai"||n==="openai_compatible"?{provider:"openai-compatible",model:o,rule:"executor_ref:provider_openai_compatible"}:n==="chatgpt"||n==="gpt"?{provider:"codex",model:o,rule:"executor_ref:provider_codex"}:n==="openai-api"||n==="openai_api"?{provider:"openai-compatible",model:o,rule:"executor_ref:provider_openai_compatible"}:n==="cursor"||n==="composer"?{provider:"cursor",model:o,rule:"executor_ref:provider_cursor"}:n==="gemini-api"||n==="gemini_api"||n==="google-api"?{provider:"gemini-api",model:o,rule:"executor_ref:provider_gemini_api"}:n==="gemini"||n==="google"||n==="gemini_cli"?{provider:"gemini",model:o,rule:o?"executor_ref:provider_gemini_model":"executor_ref:provider_gemini"}:null:null}function Lr(e){if(!e.startsWith("harness-lane:"))return null;let r=e.split(":").map(o=>o.trim()).filter(Boolean);if(r.length<2)return null;let t=r[1],n=r.slice(2).join(":");return n?Se(n)||Oe(n)||re(n)||Ce(n)?{lane:t,model:n,provider:Br(n),rule:"executor_ref:harness_lane_model"}:{lane:t,rule:"executor_ref:harness_lane"}:{lane:t,rule:"executor_ref:harness_lane"}}function m(e){let r=typeof e=="string"?e.trim():"";return r?Ur(r)??Lr(r):null}function te(e){let r=m(e);return r?!!(r.provider&&r.provider!=="cursor"||r.model&&!re(r.model)):!1}k();var cr={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 w(e){return cr[e]}function dr(){return Object.values(cr)}import{existsSync as bt}from"node:fs";import{homedir as xt}from"node:os";import W from"node:path";import{createHash as pr}from"node:crypto";import{statSync as vt}from"node:fs";import{spawnSync as mr}from"node:child_process";function R(e){try{let r=vt(e),t=`${e}|${r.size}|${r.mtimeMs}`;return pr("sha256").update(t).digest("hex").slice(0,16)}catch{return}}function P(e){return pr("sha256").update(`env:${e}`).digest("hex").slice(0,16)}function g(e,r){for(let t of r){let n=process.env[t]?.trim();if(n)return n}return e}function h(e,r,t={}){let n=t.timeoutMs??8e3;try{let o=mr(e,r,{encoding:"utf8",timeout:n,env:{...process.env,...t.env,CI:"1",NO_COLOR:"1"}});if(o.status===0)return{ok:!0,note:t.okNote??`${e} ${r.join(" ")}: ok`};let s=(o.stderr||o.stdout||"").trim(),i=t.failPrefix??`${e} ${r.join(" ")} failed`;return{ok:!1,note:s?`${i}: ${s.slice(0,200)}`:i}}catch(o){return{ok:!1,note:o instanceof Error?o.message:`${e} probe failed`}}}function J(e,r,t={}){let n=t.timeoutMs??8e3;try{return mr(e,r,{stdio:"ignore",timeout:n,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(o){return{ok:!1,note:o instanceof Error?o.message:`${e} auth probe failed`}}}var Et="codex";function St(){let e=xt();return[process.env.CODEX_HOME?.trim()?W.join(W.resolve(process.env.CODEX_HOME.trim()),"auth.json"):null,W.join(e,".codex","auth.json"),W.join(e,".config","codex","auth.json")].filter(t=>!!t)}function Ot(e){return W.dirname(e)}function Ct(e){let r,t;for(let n of St()){if(!bt(n))continue;r??=n;let o=h(e,["login","status"],{okNote:"codex login status: authenticated",failPrefix:"codex login status",env:{CODEX_HOME:Ot(n)}});if(t??=o,o.ok)return{authPath:n,login:o}}return{authPath:r,login:t??h(e,["login","status"],{okNote:"codex login status: authenticated",failPrefix:"codex login status"})}}function fr(e=new Date().toISOString()){let r=g(Et,["KYNVER_CODEX_BIN","CODEX_BIN"]);if(process.env.CODEX_API_KEY?.trim())return{providerId:"codex",ready:!0,authSource:"api_key_env",sessionFingerprint:P("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:n}=Ct(r),o=!!t&&n.ok;return{providerId:"codex",ready:o,authSource:"oauth_local",sessionFingerprint:t?R(t):void 0,checkedAt:e,note:o?"Local Codex OAuth session bound on runner":[n.note,t?void 0:"no Codex auth store found"].filter(Boolean).join("; ")}}import{existsSync as At}from"node:fs";import{homedir as wt}from"node:os";import ge from"node:path";function Pt(){let e=process.env.HERMES_HOME?.trim(),r=e?ge.resolve(e):ge.join(wt(),".hermes");return ge.join(r,"auth.json")}function X(e=new Date().toISOString()){let r=g("hermes",["KYNVER_HERMES_BIN","HERMES_BIN"]),t=h(r,["--version"],{okNote:`${r} CLI available`,failPrefix:`${r} CLI not available`}),n=Pt(),o=At(n),s=J(r,["auth","status","openai-codex"],{okNote:"hermes openai-codex: logged in",failNote:"hermes openai-codex: not logged in"}),i=t.ok&&s.ok;return{path:"hermes_openai_codex",ready:i,authSource:i?"subscription_hermes":"none",sessionFingerprint:o?R(n):void 0,checkedAt:e,note:i?"Hermes openai-codex subscription session bound (ChatGPT Codex OAuth)":[t.note,s.note,o?void 0:"no ~/.hermes/auth.json"].filter(Boolean).join("; ")}}function M(e=new Date().toISOString()){let r=fr(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"}}var gr=["low","medium","high"],hr={oauth_local:0,subscription_hermes:0,runner_token:1,api_key_env:2,none:3};function Rr(e,r){let t=w(e);return r==="privileged"?t.supportsPrivilegedPlatformActions:r==="low"?t.supportsLowRiskOrchestration:!0}function It(e,r){let t=w(e.providerId),n=w(r.providerId),o=gr.indexOf(t.costTier)-gr.indexOf(n.costTier);if(o!==0)return o;let s=hr[e.binding.authSource]-hr[r.binding.authSource];return s!==0?s:e.providerId.localeCompare(r.providerId)}function he(e){let r=dr().map(l=>({providerId:l.id,binding:e.inventory.bindings[l.id]})).filter(l=>l.binding.ready&&Rr(l.providerId,e.riskClass));if(r.length===0)return null;let n=[...r].sort(It)[0],o="codex";if(n.providerId===o)return{providerId:n.providerId,binding:n.binding};let s=e.inventory.bindings[o],i;return Rr(o,e.riskClass)?s.ready||(i=s.note??`${o} not bound`):i=`${e.riskClass} orchestration requires privileged-capable provider`,{providerId:n.providerId,binding:n.binding,escalatedFrom:o,escalatedReason:i}}import{existsSync as Nt}from"node:fs";import{homedir as Tt}from"node:os";import Kt from"node:path";var Wt="claude";function Mt(){let e=Tt();return[Kt.join(e,".claude",".credentials.json")]}function yr(e=new Date().toISOString()){let r=g(Wt,["KYNVER_CLAUDE_BIN","CLAUDE_BIN"]);if(process.env.ANTHROPIC_API_KEY?.trim())return{providerId:"claude",ready:!1,authSource:"api_key_env",sessionFingerprint:P("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=h(r,["--version"],{okNote:`${r} CLI available`,failPrefix:`${r} CLI not available`}),n=Mt().find(i=>Nt(i)),o=J(r,["auth","status"],{okNote:"claude auth status: authenticated",failNote:"claude auth status: not authenticated"}),s=t.ok&&(o.ok||!!n);return{providerId:"claude",ready:s,authSource:"oauth_local",sessionFingerprint:n?R(n):void 0,checkedAt:e,note:s?"Local Claude Code OAuth session bound on runner":[t.note,o.note,n?void 0:"no ~/.claude/.credentials.json"].filter(Boolean).join("; ")}}import{existsSync as Ut}from"node:fs";import{homedir as Bt}from"node:os";import I from"node:path";d();ne();import{spawnSync as Dt}from"node:child_process";function Re(e,r=process.env){try{let t=Dt(e,["status","--format","json"],{encoding:"utf8",timeout:8e3,env:{...r,CI:"1",NO_COLOR:"1"}});if(t.status!==0)return{ok:!1,note:"agent status: not authenticated"};let n=(t.stdout||"").trim();if(!n)return{ok:!1,note:"agent status: empty response"};let o;try{o=JSON.parse(n)}catch{return{ok:!1,note:"agent status: unparseable response"}}return typeof o=="object"&&o!==null&&o.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 ye(e=process.env){let r=[],t=e.KYNVER_CURSOR_AUTH_HOME?.trim();t&&(r.push(I.join(t,".config","cursor","auth.json")),r.push(I.join(t,".cursor-agent","auth.json")));let n=Bt();if(r.push(I.join(n,".config","cursor","auth.json")),r.push(I.join(n,".cursor-agent","auth.json")),process.platform==="win32"){let o=e.LOCALAPPDATA?.trim(),s=e.APPDATA?.trim();o&&r.push(I.join(o,"cursor-agent","auth.json")),s&&r.push(I.join(s,"cursor","auth.json"))}return r}var Lt="agent";function _r(e=new Date().toISOString()){let r=g(Lt,["KYNVER_CURSOR_AGENT_BIN","CURSOR_AGENT_BIN"]);if(process.env.CURSOR_API_KEY?.trim())return{providerId:"cursor",ready:!1,authSource:"api_key_env",sessionFingerprint:P("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=h(r,["-v"],{okNote:`${r} CLI available`,failPrefix:`${r} CLI not available`}),n=ye().find(l=>Ut(l)),o=Re(r),s=!!n||o.ok,i=t.ok&&s;return{providerId:"cursor",ready:i,authSource:"oauth_local",sessionFingerprint:n?R(n):void 0,checkedAt:e,note:i?"Local Cursor/Composer OAuth session bound on runner":[t.note,s?void 0:o.note??"no ~/.config/cursor/auth.json or `agent login` session"].filter(Boolean).join("; ")}}import{existsSync as Ft,readFileSync as $t}from"node:fs";import{homedir as Ht}from"node:os";import _e from"node:path";var jt=["OPENAI_API_KEY","ANTHROPIC_API_KEY","KYNVER_API_KEY","KYNVER_BASE_URL"];function Yt(){let e=process.env.HERMES_HOME?.trim(),r=e?_e.resolve(e):_e.join(Ht(),".hermes");return _e.join(r,".env")}function Vt(e){try{let r=$t(e,"utf8"),t=[];for(let n of jt)new RegExp(`^${n}=`,"m").test(r)&&t.push(n);return t}catch{return[]}}function kr(e=new Date().toISOString()){let r=g("hermes",["KYNVER_HERMES_BIN","HERMES_BIN"]),t=h(r,["--version"],{okNote:`${r} CLI available`,failPrefix:`${r} CLI not available`}),n=Yt(),o=Ft(n),s=o?Vt(n):[],l=s.some(u=>u.endsWith("_API_KEY"))?"api_key_env":o?"oauth_local":"none",c=t.ok&&o;return{adapterId:"hermes",cliAvailable:t.ok,profileBound:o,authSource:l,sessionFingerprint:o?R(n):void 0,checkedAt:e,note:c?`Hermes profile bound (${s.length?`keys: ${s.join(", ")}`:"no API keys detected"})`:[t.note,o?void 0:"no ~/.hermes/.env"].filter(Boolean).join("; ")}}function vr(e={}){let r=e.nowIso?.()??new Date().toISOString(),t=M(r),n={codex:t,cursor:_r(r),claude:yr(r)},o=Object.values(n).filter(s=>s.ready).length;return{generatedAt:r,bindings:n,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:kr(r),hermesOpenAiCodex:X(r),codexAdapterPath:t.path,readyCount:o}}var Gt=[/\bprivileged\b/i,/\bproduction\s+db\b/i,/\bdb:push\b/i,/\bmigration\b/i,/\bdeploy\b/i,/\bsecrets?\b/i,/\bstripe\b/i,/\[require-approval\]/i,/\[operator-only\]/i],qt=[/\borchestration\b/i,/\bplan[- ]?progress\b/i,/\bstatus\s+sync\b/i,/\bheartbeat\b/i,/\bboard[- ]?drain\b/i,/\bmaintenance\b/i,/\[orchestration:\s*low-risk\]/i];function ke(e,r){let t=e[r];return typeof t=="string"?t.trim():""}function zt(e){let r=ke(e,"executorRef").toLowerCase(),t=ke(e,"title").toLowerCase(),n=ke(e,"description").toLowerCase(),o=`${r}
|
|
1
|
+
var a=(e,r,t)=>()=>{if(t)throw t[0];try{return e&&(r=e(e=0)),r}catch(n){throw t=[n],n}};import{homedir as Be}from"node:os";import Le from"node:path";function tt(e){return e==="~"?Be():e.startsWith("~/")||e.startsWith("~\\")?Le.join(Be(),e.slice(2)):e}function w(e){return Le.resolve(tt(e))}var P=a(()=>{"use strict"});function y(e=process.platform){return e!=="win32"}var Fe=a(()=>{"use strict"});var d=a(()=>{"use strict";Fe()});var nt,lo,ot,uo,pe=a(()=>{"use strict";nt=["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"],lo=new Set(nt),ot=["GITHUB_TOKEN","GH_TOKEN","CLAUDE_CODE_OAUTH_TOKEN","CODEX_API_KEY","GEMINI_API_KEY"],uo=new Set(ot)});var z=a(()=>{"use strict";P();d();pe()});var $e=a(()=>{"use strict";z()});var me=a(()=>{"use strict";z();P();$e()});var fe=a(()=>{"use strict";d()});var _=a(()=>{"use strict"});var X=a(()=>{"use strict"});var He=a(()=>{"use strict"});var Po,Io,ge=a(()=>{"use strict";Po=25*1024*1024*1024,Io=12*1024*1024*1024});var Wo,Mo,je=a(()=>{"use strict";ge();Wo=5*1024*1024*1024,Mo=10*1024*1024*1024});var Ho,jo,he=a(()=>{"use strict";je();ge();Ho=30*1024*1024*1024,jo=15*1024*1024*1024});var Ve=a(()=>{"use strict";d()});import lt from"node:path";var Zo,Re=a(()=>{"use strict";P();Ve();Zo=lt.join(".openclaw","harness")});var Z=a(()=>{"use strict";v();_();X();ee();Re()});var Je=a(()=>{"use strict";v();Re();Z();d()});var ke=a(()=>{"use strict";Je();d()});var ze=a(()=>{"use strict";ke();d()});var Xe=a(()=>{"use strict"});var Qe=a(()=>{"use strict";Xe();d()});var Ze=a(()=>{"use strict"});var er=a(()=>{"use strict";Ze()});var re=a(()=>{"use strict"});var rr=a(()=>{"use strict";er();d();re()});var tr=a(()=>{"use strict";re()});var nr=a(()=>{"use strict"});var or=a(()=>{"use strict"});var _e=a(()=>{"use strict"});var ir=a(()=>{"use strict"});var sr=a(()=>{"use strict";_e();ir()});var ar=a(()=>{"use strict";Qe();rr();re();tr();nr();z();or();sr();_e();d()});var lr=a(()=>{"use strict";ar()});var kt,_t,ur=a(()=>{"use strict";He();v();_();X();ee();he();ke();ze();lr();d();kt=500*1024*1024,_t=4*1024*1024*1024});var ee=a(()=>{"use strict";ur()});import{homedir as vt}from"node:os";import xt from"node:path";var cr,ve=a(()=>{"use strict";cr=xt.join(vt(),".kynver",".env")});var dr=a(()=>{"use strict"});var pr=a(()=>{"use strict";dr()});var mr=a(()=>{"use strict"});var fr=a(()=>{"use strict";d()});var xe=a(()=>{"use strict";pr();mr();fr()});var gr=a(()=>{"use strict"});var hr=a(()=>{"use strict";gr()});var te=a(()=>{"use strict";ve();P();v();xe();hr()});var Rr=a(()=>{"use strict";_();_()});var yr=a(()=>{"use strict";ve();xe();te()});var be=a(()=>{"use strict"});var kr=a(()=>{"use strict";me();_();Rr();v();te();yr();fe();be();Z()});function x(e){let r=e.trim().toLowerCase();return It[r]??r}var _r,Pt,It,ne=a(()=>{"use strict";_r=["claude","cursor","codex","gemini","gemini-api","openai-compatible"],Pt=_r.join("|"),It={anthropic:"claude",opus:"claude",openai:"openai-compatible",openai_compatible:"openai-compatible","openai-compat":"openai-compatible",chatgpt:"codex",gpt:"codex","openai-api":"openai-compatible",openai_api:"openai-compatible",google:"gemini",gemini_cli:"gemini",gemini_api:"gemini-api","google-api":"gemini-api",google_api:"gemini-api"}});import{existsSync as Tt,mkdirSync as ul,readFileSync as Kt,writeFileSync as cl}from"node:fs";import{homedir as Dt,totalmem as pl}from"node:os";import Ee from"node:path";function Wt(e){return{...e,...e.harnessRoot?.trim()?{harnessRoot:w(e.harnessRoot.trim())}:{},...e.defaultRepo?.trim()?{defaultRepo:w(e.defaultRepo.trim())}:{}}}function N(){if(!Tt(vr))return{};try{return Wt(JSON.parse(Kt(vr,"utf8")))}catch{return{}}}var xr,vr,Cl,Ol,Al,v=a(()=>{"use strict";me();P();fe();_();X();ee();he();te();kr();ne();Z();be();xr=Ee.join(Dt(),".kynver"),vr=Ee.join(xr,"config.json"),Cl=Ee.join(xr,"credentials");Ol=500*1024*1024,Al=4*1024*1024*1024});var Xr=/^claude[-_]/i,Qr=/^(?:opus|sonnet|haiku)\b/i;function We(e){let r=e.trim();return Xr.test(r)||Qr.test(r)}function Me(e){let r=e.trim().toLowerCase();return r.startsWith("gpt-")||r.startsWith("gpt5")||r.includes("codex")}function ce(e){let r=e.trim().toLowerCase();return r.includes("composer")||r.includes("cursor")}function Ue(e){return e.trim().toLowerCase().startsWith("gemini-")}function Zr(e){return Me(e)?"codex":We(e)?"claude":Ue(e)?"gemini":(ce(e),"cursor")}function et(e){if(!e.startsWith("provider:"))return null;let r=e.slice(9),t=r.indexOf(":"),n=(t>=0?r.slice(0,t):r).trim().toLowerCase(),o=t>=0&&r.slice(t+1).trim()||void 0;return n?n==="claude"||n==="opus"||n==="anthropic"?{provider:"claude",model:o,rule:o?"executor_ref:provider_claude_model":"executor_ref:provider_claude"}:n==="codex"?{provider:"codex",model:o,rule:"executor_ref:provider_codex"}:n==="openai-compatible"||n==="openai"||n==="openai_compatible"?{provider:"openai-compatible",model:o,rule:"executor_ref:provider_openai_compatible"}:n==="chatgpt"||n==="gpt"?{provider:"codex",model:o,rule:"executor_ref:provider_codex"}:n==="openai-api"||n==="openai_api"?{provider:"openai-compatible",model:o,rule:"executor_ref:provider_openai_compatible"}:n==="cursor"||n==="composer"?{provider:"cursor",model:o,rule:"executor_ref:provider_cursor"}:n==="gemini-api"||n==="gemini_api"||n==="google-api"?{provider:"gemini-api",model:o,rule:"executor_ref:provider_gemini_api"}:n==="gemini"||n==="google"||n==="gemini_cli"?{provider:"gemini",model:o,rule:o?"executor_ref:provider_gemini_model":"executor_ref:provider_gemini"}:null:null}function rt(e){if(!e.startsWith("harness-lane:"))return null;let r=e.split(":").map(o=>o.trim()).filter(Boolean);if(r.length<2)return null;let t=r[1],n=r.slice(2).join(":");return n?We(n)||Me(n)||ce(n)||Ue(n)?{lane:t,model:n,provider:Zr(n),rule:"executor_ref:harness_lane_model"}:{lane:t,rule:"executor_ref:harness_lane"}:{lane:t,rule:"executor_ref:harness_lane"}}function f(e){let r=typeof e=="string"?e.trim():"";return r?et(r)??rt(r):null}function de(e){let r=f(e);return r?!!(r.provider&&r.provider!=="cursor"||r.model&&!ce(r.model)):!1}v();var br={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 T(e){return br[e]}function Er(){return Object.values(br)}import{existsSync as Gt}from"node:fs";import{homedir as qt}from"node:os";import $ from"node:path";import{createHash as Ar}from"node:crypto";import{statSync as Vt}from"node:fs";import{spawnSync as wr}from"node:child_process";import{existsSync as Or,readFileSync as Mt}from"node:fs";import b from"node:path";var F=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},Ut=".COM;.EXE;.BAT;.CMD";function Bt(e){return e.includes("/")||e.includes("\\")}function Lt(e){return(e.PATHEXT||Ut).split(";").map(r=>r.trim().toLowerCase()).filter(r=>r.startsWith("."))}function Ft(e){let r=Object.keys(e).find(t=>t.toUpperCase()==="PATH");return r?e[r]??"":""}function $t(e,r={}){let t=r.env??process.env,n=r.exists??Or,o=Lt(t),s=b.win32.extname(e)!=="",i=l=>s?[l]:o.map(u=>`${l}${u}`);if(Bt(e)||b.win32.isAbsolute(e))return i(e).find(l=>n(l))??null;for(let l of Ft(t).split(";").map(u=>u.trim()).filter(Boolean)){let u=i(b.win32.join(l,e)).find(c=>n(c));if(u)return u}return null}var Sr=/%~?dp0%?\\?([^"%\r\n]+?\.(?:c|m)?js)\b/i,Ht=/^\s*SET\s+"?([A-Za-z_]\w*)=([^"\r\n]*)"?\s*$/i;function Cr(e){return e.replace(/^[\\/]+/,"")}function jt(e){let r=e.split(/\r?\n/),t=new Map;for(let s of r){let i=Ht.exec(s);i&&t.set(i[1].toUpperCase(),i[2])}let n=r.filter(s=>s.includes("%*")).pop();if(!n)return null;let o=Sr.exec(n);if(o)return Cr(o[1]);for(let s of n.matchAll(/%([A-Za-z_]\w*)%/g)){let i=t.get(s[1].toUpperCase()),l=i?Sr.exec(i):null;if(l)return Cr(l[1])}return null}function Yt(e,r={}){if((r.platform??process.platform)!=="win32")return{executable:e,prefixArgs:[],kind:"passthrough"};let n=$t(e,r);if(!n)return{executable:e,prefixArgs:[],kind:"passthrough"};let o=b.win32.extname(n).toLowerCase();if(o!==".cmd"&&o!==".bat")return{executable:n,prefixArgs:[],kind:"exe"};let s=r.readText??(ue=>Mt(ue,"utf8")),i=r.exists??Or,l;try{l=s(n)}catch{throw new F(n)}let u=jt(l);if(!u)throw new F(n);let c=b.win32.dirname(n),p=b.win32.join(c,u);if(!i(p))throw new F(n);let L=b.win32.join(c,"node.exe");return{executable:i(L)?L:r.nodeExecutable??process.execPath,prefixArgs:[p],kind:"node-shim"}}function E(e,r,t={}){let n=Yt(e,t);return[n.executable,[...n.prefixArgs,...r]]}function R(e){try{let r=Vt(e),t=`${e}|${r.size}|${r.mtimeMs}`;return Ar("sha256").update(t).digest("hex").slice(0,16)}catch{return}}function K(e){return Ar("sha256").update(`env:${e}`).digest("hex").slice(0,16)}function g(e,r){for(let t of r){let n=process.env[t]?.trim();if(n)return n}return e}function h(e,r,t={}){let n=t.timeoutMs??8e3;try{let[o,s]=E(e,r),i=wr(o,s,{windowsHide:!0,encoding:"utf8",timeout:n,env:{...process.env,...t.env,CI:"1",NO_COLOR:"1"}});if(i.status===0)return{ok:!0,note:t.okNote??`${e} ${r.join(" ")}: ok`};let l=(i.stderr||i.stdout||"").trim(),u=t.failPrefix??`${e} ${r.join(" ")} failed`;return{ok:!1,note:l?`${u}: ${l.slice(0,200)}`:u}}catch(o){return{ok:!1,note:o instanceof Error?o.message:`${e} probe failed`}}}function oe(e,r,t={}){let n=t.timeoutMs??8e3;try{let[o,s]=E(e,r);return wr(o,s,{windowsHide:!0,stdio:"ignore",timeout:n,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(o){return{ok:!1,note:o instanceof Error?o.message:`${e} auth probe failed`}}}var Jt="codex";function zt(){let e=qt();return[process.env.CODEX_HOME?.trim()?$.join($.resolve(process.env.CODEX_HOME.trim()),"auth.json"):null,$.join(e,".codex","auth.json"),$.join(e,".config","codex","auth.json")].filter(t=>!!t)}function Xt(e){return $.dirname(e)}function Qt(e){let r,t;for(let n of zt()){if(!Gt(n))continue;r??=n;let o=h(e,["login","status"],{okNote:"codex login status: authenticated",failPrefix:"codex login status",env:{CODEX_HOME:Xt(n)}});if(t??=o,o.ok)return{authPath:n,login:o}}return{authPath:r,login:t??h(e,["login","status"],{okNote:"codex login status: authenticated",failPrefix:"codex login status"})}}function Pr(e=new Date().toISOString()){let r=g(Jt,["KYNVER_CODEX_BIN","CODEX_BIN"]);if(process.env.CODEX_API_KEY?.trim())return{providerId:"codex",ready:!0,authSource:"api_key_env",sessionFingerprint:K("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:n}=Qt(r),o=!!t&&n.ok;return{providerId:"codex",ready:o,authSource:"oauth_local",sessionFingerprint:t?R(t):void 0,checkedAt:e,note:o?"Local Codex OAuth session bound on runner":[n.note,t?void 0:"no Codex auth store found"].filter(Boolean).join("; ")}}import{existsSync as Zt}from"node:fs";import{homedir as en}from"node:os";import Se from"node:path";function rn(){let e=process.env.HERMES_HOME?.trim(),r=e?Se.resolve(e):Se.join(en(),".hermes");return Se.join(r,"auth.json")}function ie(e=new Date().toISOString()){let r=g("hermes",["KYNVER_HERMES_BIN","HERMES_BIN"]),t=h(r,["--version"],{okNote:`${r} CLI available`,failPrefix:`${r} CLI not available`}),n=rn(),o=Zt(n),s=oe(r,["auth","status","openai-codex"],{okNote:"hermes openai-codex: logged in",failNote:"hermes openai-codex: not logged in"}),i=t.ok&&s.ok;return{path:"hermes_openai_codex",ready:i,authSource:i?"subscription_hermes":"none",sessionFingerprint:o?R(n):void 0,checkedAt:e,note:i?"Hermes openai-codex subscription session bound (ChatGPT Codex OAuth)":[t.note,s.note,o?void 0:"no ~/.hermes/auth.json"].filter(Boolean).join("; ")}}function H(e=new Date().toISOString()){let r=Pr(e);if(r.ready)return{...r,path:"codex_cli"};let t=ie(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"}}var Ir=["low","medium","high"],Nr={oauth_local:0,subscription_hermes:0,runner_token:1,api_key_env:2,none:3};function Tr(e,r){let t=T(e);return r==="privileged"?t.supportsPrivilegedPlatformActions:r==="low"?t.supportsLowRiskOrchestration:!0}function tn(e,r){let t=T(e.providerId),n=T(r.providerId),o=Ir.indexOf(t.costTier)-Ir.indexOf(n.costTier);if(o!==0)return o;let s=Nr[e.binding.authSource]-Nr[r.binding.authSource];return s!==0?s:e.providerId.localeCompare(r.providerId)}function Ce(e){let r=Er().map(l=>({providerId:l.id,binding:e.inventory.bindings[l.id]})).filter(l=>l.binding.ready&&Tr(l.providerId,e.riskClass));if(r.length===0)return null;let n=[...r].sort(tn)[0],o="codex";if(n.providerId===o)return{providerId:n.providerId,binding:n.binding};let s=e.inventory.bindings[o],i;return Tr(o,e.riskClass)?s.ready||(i=s.note??`${o} not bound`):i=`${e.riskClass} orchestration requires privileged-capable provider`,{providerId:n.providerId,binding:n.binding,escalatedFrom:o,escalatedReason:i}}import{existsSync as nn}from"node:fs";import{homedir as on}from"node:os";import sn from"node:path";var an="claude";function ln(){let e=on();return[sn.join(e,".claude",".credentials.json")]}function Kr(e=new Date().toISOString()){let r=g(an,["KYNVER_CLAUDE_BIN","CLAUDE_BIN"]);if(process.env.ANTHROPIC_API_KEY?.trim())return{providerId:"claude",ready:!1,authSource:"api_key_env",sessionFingerprint:K("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=h(r,["--version"],{okNote:`${r} CLI available`,failPrefix:`${r} CLI not available`}),n=ln().find(i=>nn(i)),o=oe(r,["auth","status"],{okNote:"claude auth status: authenticated",failNote:"claude auth status: not authenticated"}),s=t.ok&&(o.ok||!!n);return{providerId:"claude",ready:s,authSource:"oauth_local",sessionFingerprint:n?R(n):void 0,checkedAt:e,note:s?"Local Claude Code OAuth session bound on runner":[t.note,o.note,n?void 0:"no ~/.claude/.credentials.json"].filter(Boolean).join("; ")}}import{existsSync as Rn}from"node:fs";import{homedir as hn}from"node:os";import W from"node:path";import{closeSync as mu,existsSync as mn,mkdirSync as fu,openSync as gu,statSync as hu,unlinkSync as Ru}from"node:fs";d();import D from"node:path";pe();import{existsSync as j,readdirSync as un}from"node:fs";import S from"node:path";var cn=/^\d{4}\.\d{1,2}\.\d{1,2}-[a-f0-9]+$/i;function dn(e){let t=e.split("-")[0].split(".");if(t.length!==3)return null;let[n,o,s]=t;return!n||!o||!s?null:+`${n}${o.padStart(2,"0")}${s.padStart(2,"0")}`}function pn(e){let r=S.join(e,"versions");if(!j(r))return null;let t=null,n=-1;for(let o of un(r,{withFileTypes:!0})){if(!o.isDirectory()||!cn.test(o.name))continue;let s=dn(o.name);s==null||s<=n||(n=s,t=S.join(r,o.name))}return t}function Oe(e){let r=e?.trim()||S.join(process.env.LOCALAPPDATA||"","cursor-agent"),t=S.join(r,"node.exe"),n=S.join(r,"index.js");if(j(t)&&j(n))return{nodeExe:t,indexJs:n,versionDir:r};let o=pn(r);if(!o)return null;let s=S.join(o,"node.exe"),i=S.join(o,"index.js");return!j(s)||!j(i)?null:{nodeExe:s,indexJs:i,versionDir:o}}function fn(e,r,t){return{executable:e,prefixArgs:[r],shell:!1,detached:y(),bundledVersionDir:t}}function Dr(e){if(process.platform==="win32"){let r=/\.(cmd|bat)$/i.test(e),t=/node\.exe$/i.test(e)&&mn(D.join(D.dirname(e),"index.js"));if(r||t||e==="agent"){let o=r?Oe(D.dirname(e)):t?{nodeExe:e,indexJs:D.join(D.dirname(e),"index.js"),versionDir:D.dirname(e)}:Oe();if(o)return fn(o.nodeExe,o.indexJs,o.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:y()}}import{spawnSync as gn}from"node:child_process";function Ae(e,r=process.env){try{let t;try{t=Dr(e)}catch{t={executable:e,prefixArgs:[]}}let n=gn(t.executable,[...t.prefixArgs,"status","--format","json"],{encoding:"utf8",windowsHide:!0,timeout:8e3,env:{...r,CI:"1",NO_COLOR:"1"}});if(n.status!==0)return{ok:!1,note:"agent status: not authenticated"};let o=(n.stdout||"").trim();if(!o)return{ok:!1,note:"agent status: empty response"};let s;try{s=JSON.parse(o)}catch{return{ok:!1,note:"agent status: unparseable response"}}return typeof s=="object"&&s!==null&&s.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 we(e=process.env){let r=[],t=e.KYNVER_CURSOR_AUTH_HOME?.trim();t&&(r.push(W.join(t,".config","cursor","auth.json")),r.push(W.join(t,".cursor-agent","auth.json")));let n=hn();if(r.push(W.join(n,".config","cursor","auth.json")),r.push(W.join(n,".cursor-agent","auth.json")),process.platform==="win32"){let o=e.LOCALAPPDATA?.trim(),s=e.APPDATA?.trim();o&&r.push(W.join(o,"cursor-agent","auth.json")),s&&r.push(W.join(s,"cursor","auth.json"))}return r}var yn="agent";function Wr(e=new Date().toISOString()){let r=g(yn,["KYNVER_CURSOR_AGENT_BIN","CURSOR_AGENT_BIN"]);if(process.env.CURSOR_API_KEY?.trim())return{providerId:"cursor",ready:!1,authSource:"api_key_env",sessionFingerprint:K("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=h(r,["-v"],{okNote:`${r} CLI available`,failPrefix:`${r} CLI not available`}),n=we().find(l=>Rn(l)),o=Ae(r),s=!!n||o.ok,i=t.ok&&s;return{providerId:"cursor",ready:i,authSource:"oauth_local",sessionFingerprint:n?R(n):void 0,checkedAt:e,note:i?"Local Cursor/Composer OAuth session bound on runner":[t.note,s?void 0:o.note??"no ~/.config/cursor/auth.json or `agent login` session"].filter(Boolean).join("; ")}}import{existsSync as kn,readFileSync as _n}from"node:fs";import{homedir as vn}from"node:os";import Pe from"node:path";var xn=["OPENAI_API_KEY","ANTHROPIC_API_KEY","KYNVER_API_KEY","KYNVER_BASE_URL"];function bn(){let e=process.env.HERMES_HOME?.trim(),r=e?Pe.resolve(e):Pe.join(vn(),".hermes");return Pe.join(r,".env")}function En(e){try{let r=_n(e,"utf8"),t=[];for(let n of xn)new RegExp(`^${n}=`,"m").test(r)&&t.push(n);return t}catch{return[]}}function Mr(e=new Date().toISOString()){let r=g("hermes",["KYNVER_HERMES_BIN","HERMES_BIN"]),t=h(r,["--version"],{okNote:`${r} CLI available`,failPrefix:`${r} CLI not available`}),n=bn(),o=kn(n),s=o?En(n):[],l=s.some(c=>c.endsWith("_API_KEY"))?"api_key_env":o?"oauth_local":"none",u=t.ok&&o;return{adapterId:"hermes",cliAvailable:t.ok,profileBound:o,authSource:l,sessionFingerprint:o?R(n):void 0,checkedAt:e,note:u?`Hermes profile bound (${s.length?`keys: ${s.join(", ")}`:"no API keys detected"})`:[t.note,o?void 0:"no ~/.hermes/.env"].filter(Boolean).join("; ")}}function Ur(e={}){let r=e.nowIso?.()??new Date().toISOString(),t=H(r),n={codex:t,cursor:Wr(r),claude:Kr(r)},o=Object.values(n).filter(s=>s.ready).length;return{generatedAt:r,bindings:n,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:Mr(r),hermesOpenAiCodex:ie(r),codexAdapterPath:t.path,readyCount:o}}var Sn=[/\bprivileged\b/i,/\bproduction\s+db\b/i,/\bdb:push\b/i,/\bmigration\b/i,/\bdeploy\b/i,/\bsecrets?\b/i,/\bstripe\b/i,/\[require-approval\]/i,/\[operator-only\]/i],Cn=[/\borchestration\b/i,/\bplan[- ]?progress\b/i,/\bstatus\s+sync\b/i,/\bheartbeat\b/i,/\bboard[- ]?drain\b/i,/\bmaintenance\b/i,/\[orchestration:\s*low-risk\]/i];function Ie(e,r){let t=e[r];return typeof t=="string"?t.trim():""}function On(e){let r=Ie(e,"executorRef").toLowerCase(),t=Ie(e,"title").toLowerCase(),n=Ie(e,"description").toLowerCase(),o=`${r}
|
|
2
2
|
${t}
|
|
3
|
-
${n}`;return
|
|
4
|
-
${
|
|
5
|
-
${
|
|
3
|
+
${n}`;return Sn.some(s=>s.test(o))?"privileged":r.includes("provider:claude")||r.includes("deep_review")||r.includes("security")||r.includes("landing")||r.includes("review")||t.startsWith("land:")||r.includes("implementer")||r.includes("repair")||t.includes("implement")?"elevated":Cn.some(s=>s.test(o))?"low":"elevated"}function An(e){let r=T(e.provider),t=e.escalatedFrom&&e.escalatedReason?`Escalated from ${e.escalatedFrom} (${e.escalatedReason}); using ${r.displayName} (${r.costTier} tier)`:`${r.displayName} selected for ${e.riskClass} orchestration (${r.costTier} tier, auth=${e.authSource})`;return{provider:e.provider,model:e.model,authSource:e.authSource,costTier:r.costTier,riskClass:e.riskClass,costRationale:t,routingRule:e.routingRule,escalatedFrom:e.escalatedFrom,escalatedReason:e.escalatedReason}}function wn(e){let r=e.inventory??Ur();return e.codexBinding?{...r,bindings:{...r.bindings,codex:e.codexBinding}}:r}function C(e){let r=An({provider:e.providerId,model:e.model,authSource:e.binding.authSource,riskClass:e.riskClass,routingRule:e.routingRule,escalatedFrom:e.escalatedFrom,escalatedReason:e.escalatedReason});return{provider:e.providerId,model:e.model,rule:r.routingRule,audit:r}}function Br(e){let r=e.task??{},t=On(r),n=wn({inventory:e.inventory,codexBinding:e.codexBinding??(e.inventory?null:H())}),o=e.preferLowCost===!1?null:e.explicitProvider?.trim().toLowerCase(),s=e.explicitModel?.trim()||void 0,i=M;if(o==="codex"||o==="provider:codex"){let c=n.bindings.codex;if(!c.ready){let p=Ce({inventory:n,riskClass:t});return C(p?{providerId:p.providerId,binding:p.binding,riskClass:t,routingRule:"orchestration:explicit_codex_unavailable_cost_aware",model:s,escalatedFrom:"codex",escalatedReason:c.note??"codex oauth not bound"}:{providerId:i,binding:n.bindings[i],riskClass:t,routingRule:"orchestration:codex_unavailable_escalate_cursor",model:s,escalatedFrom:"codex",escalatedReason:c.note??"codex oauth not bound"})}return C({providerId:"codex",binding:c,riskClass:t,routingRule:"orchestration:explicit_codex",model:s})}if(o==="cursor"||o==="provider:cursor"){let c=n.bindings.cursor;if(c.ready)return C({providerId:"cursor",binding:c,riskClass:t,routingRule:"orchestration:explicit_cursor",model:s})}if(o==="claude"||o==="provider:claude"){let c=n.bindings.claude;if(c.ready)return C({providerId:"claude",binding:c,riskClass:t,routingRule:"orchestration:explicit_claude",model:s})}let l=Ce({inventory:n,riskClass:t});if(l)return C({providerId:l.providerId,binding:l.binding,riskClass:t,routingRule:`orchestration:cost_aware_${l.providerId}`,model:s,escalatedFrom:l.escalatedFrom,escalatedReason:l.escalatedReason});let u=n.bindings.codex;return C({providerId:i,binding:n.bindings[i],riskClass:t,routingRule:u.ready?"orchestration:inventory_empty_default_cursor":"orchestration:codex_unavailable_default_cursor",model:s,...u.ready?{}:{escalatedFrom:"codex",escalatedReason:u.note??"codex oauth not bound"}})}d();var Lr="kynver",Fr=["agent_os_context_envelope","agent_os_search_memory","agent_os_search_skills","agent_os_get_skill","agent_os_progress_note"],Pn=Fr.map(e=>`mcp__${Lr}__${e}`);var V="claude-sonnet-4-6",G="claude-opus-4-8";d();d();var yc=process.env.KYNVER_CODEX_DEFAULT_MODEL?.trim()||"gpt-5.5";function Nn(){return process.env.KYNVER_CODEX_DEFAULT_MODEL?.trim()||"gpt-5.5"}var U=Nn();d();var Ne="openai-compatible",qc=600*1e3;d();var O="gemini";function A(e=process.env){return e.KYNVER_GEMINI_DEFAULT_MODEL?.trim()||"gemini-2.5-pro"}var B="gemini-api";var ld=600*1e3;var jr="claude-sonnet-4-6",q="composer-2.5";function m(e,r){let t=e[r];return typeof t=="string"?t.trim():""}function Dn(e){if(!e)return;let r=m(e,"workerModelOverride")||m(e,"modelOverride");return r||`${m(e,"title")}
|
|
4
|
+
${m(e,"description")}
|
|
5
|
+
${m(e,"executorRef")}`.match(/\[(?:worker-)?model:\s*([^\]\n]+)\]/i)?.[1]?.trim()||void 0}function $r(e){return e.toLowerCase()}function le(e=N()){let r=e.defaultModel?.trim();if(r)return r;let t=process.env.KYNVER_DEFAULT_MODEL?.trim();return t||jr}function se(e){let r=(e??"").toLowerCase();return!r||r.includes("composer")||r.includes("cursor")||r.includes("codex")||r.startsWith("gpt-")||r.startsWith("gpt5")?"cursor":/^claude[-_]/i.test(r)||/^(?:opus|sonnet|haiku)\b/i.test(r)?"claude":r.startsWith("gemini-")?O:"cursor"}function Wn(e,r){let t=e.trim().toLowerCase(),n=r?.trim();return t==="cursor"?{model:q,provider:"cursor",rule:n&&n!=="cursor"?"explicit:model_provider_alias_overrode_provider":"explicit:model_provider_alias",requestedModel:e}:t==="claude"||t==="anthropic"?{model:V,provider:"claude",rule:n&&n!=="claude"?"explicit:model_provider_alias_overrode_provider":"explicit:model_provider_alias",requestedModel:e}:t==="gemini"||t==="google"?{model:A(),provider:O,rule:n&&n!==O?"explicit:model_provider_alias_overrode_provider":"explicit:model_provider_alias",requestedModel:e}:t==="gemini-api"||t==="gemini_api"||t==="google-api"?{model:A(),provider:B,rule:n&&n!==B?"explicit:model_provider_alias_overrode_provider":"explicit:model_provider_alias",requestedModel:e}:null}function Hr(e,r){return!!(e.includes("deep")&&e.includes("review")||e.includes("security")||e.includes("plan_author")||e.includes("plan-author")||r.includes("deep review")||r.includes("security review")||e.includes("plan")&&!e.includes("review")&&(e.includes("author")||e.includes("strategy")))}var Mn=new Set(["report_reviewer","deep_reviewer","plan_reviewer"]);function Yr(e,r,t){return Mn.has(e)?G:r.includes("review")||/^review[\s:]/.test(t)||t.includes("critique")?G:V}function Vr(e){let r=$r(m(e,"executorRef")),t=m(e,"title").toLowerCase(),n=m(e,"priority")||"normal",o=$r(m(e,"roleLane"));if(r.includes("provider:claude")||r.startsWith("claude:")){let i=Yr(o,r,t);return{provider:"claude",model:i,rule:i===G?"factory:claude_review":"factory:claude_implementation"}}if(r.includes("provider:codex")||r.startsWith("codex:"))return{provider:"codex",model:U,rule:"lane:codex_orchestration"};if(r.includes("provider:chatgpt")||r.startsWith("chatgpt:")||r.includes("provider:gpt")||r.startsWith("gpt:")){let i=f(m(e,"executorRef"));return{provider:"codex",...i?.model?{model:i.model}:{model:U},rule:"lane:codex_orchestration"}}if(r.includes("provider:openai")||r.startsWith("openai-compatible:")){let i=f(m(e,"executorRef"));return{provider:Ne,...i?.model?{model:i.model}:{},rule:"lane:openai_compatible"}}if(r.includes("provider:gemini-api")||r.startsWith("gemini-api:")){let i=f(m(e,"executorRef"));return{provider:B,...i?.model?{model:i.model}:{model:A()},rule:"lane:gemini_api"}}if(r.includes("provider:gemini")||r.startsWith("gemini:")){let i=f(m(e,"executorRef"));return{provider:O,...i?.model?{model:i.model}:{model:A()},rule:"lane:gemini"}}if(r.includes("cursor")||r.includes("composer")||r.includes("copilot")||o==="implementer"||o==="repair_implementer")return{provider:"cursor",rule:"lane:implementation"};if(r.includes("codex"))return{provider:"codex",model:U,rule:"lane:codex_orchestration"};if(r.includes("landing")||t.startsWith("land:")||t.includes(" merge"))return{provider:"cursor",rule:"lane:landing"};if(r.includes("review")||/^review[\s:]/.test(t)||o.includes("review"))return Hr(r,t)||o==="deep_reviewer"?{provider:"cursor",rule:"lane:deep_review"}:{provider:"cursor",rule:"lane:review"};if(Hr(r,t)||o==="plan_author")return{provider:"cursor",rule:"lane:planning"};if(n==="critical")return{provider:"cursor",rule:"priority:critical"};if(n==="high")return{provider:"cursor",rule:"priority:high"};if(n==="low")return{provider:"cursor",rule:"priority:low"};let s=le();return{model:s,provider:se(s),rule:"default:global"}}function Un(e){return e?f(m(e,"executorRef")):null}function Bn(e){switch(x(e)){case O:case B:return A();case"claude":return V;case"codex":return U;case"cursor":return q;default:return}}var Te="explicit:cli_provider",Gr="config:worker_provider";function qr(e,r,t){let n=x(r);return n===e.provider&&e.rule===t?e:{...e,provider:n,model:Bn(n)??e.model,rule:t}}function Ln(e,r){let t=r?.trim();return!t||e.rule.startsWith("explicit:")&&e.rule!==Te?e:qr(e,t,Te)}function Fn(e,r){if(r.explicitProvider?.trim()||Ke(r.task))return e;let t=r.configuredProvider?.trim();if(!t)return e;let n=x(t);return n===M||n===e.provider?e:qr(e,n,Gr)}function $n(e){let r,t=Un(e.task),n=e.explicitModel?.trim()?void 0:t?.model?.trim(),o=!e.explicitProvider?.trim()&&t?.provider?.trim()?t.provider.trim():void 0;if(e.explicitModel?.trim()){let u=e.explicitModel.trim(),c=Wn(u,e.explicitProvider);c?r=c:r={model:u,provider:e.explicitProvider?.trim()||se(u),rule:"explicit:cli",requestedModel:u}}else if(n)r={model:n,provider:o||se(n),rule:t?.rule??"executor_ref:model",requestedModel:n};else if(e.task&&ae(e.task)){let u=Dn(e.task),c,p;if(u)c=u,p="task:provider_override";else{let L=typeof e.task.roleLane=="string"?e.task.roleLane.toLowerCase():"",De=typeof e.task.executorRef=="string"?e.task.executorRef.toLowerCase():"",ue=typeof e.task.title=="string"?e.task.title.toLowerCase():"";c=Yr(L,De,ue),p=c===G?"factory:claude_review":"factory:claude_implementation"}r={model:c,provider:"claude",rule:p,requestedModel:c}}else if(e.task&&Object.keys(e.task).length>0){let u=Vr(e.task);r={...u,requestedModel:u.model}}else{let u=le();r={model:u,provider:e.explicitProvider?.trim()||se(u),rule:"default:global",requestedModel:u}}r=Ln(r,e.explicitProvider),r=Fn(r,{explicitProvider:e.explicitProvider,task:e.task,configuredProvider:e.configuredProvider});let s=!!e.configuredProvider?.trim()&&x(e.configuredProvider)!==M&&r.rule==="config:worker_provider",i=Jr({routing:r,task:e.task,explicitProvider:e.explicitProvider??(s?r.provider:void 0),explicitProviderIsOperatorOverride:!!e.explicitProviderIsOperatorOverride||s});if(!e.task||Object.keys(e.task).length===0||i.rule==="explicit:model_provider_alias"||i.rule==="explicit:model_provider_alias_overrode_provider"||i.rule==="explicit:cli"||i.rule===Te||i.rule===Gr||k(i.provider)&&(e.explicitProviderIsOperatorOverride||ae(e.task))||i.provider===Ne||i.provider===O||i.provider===B||i.provider==="codex")return i;let l=Br({task:e.task,explicitProvider:e.explicitProvider??i.provider,explicitModel:i.model,inventory:e.orchestrationInventory??void 0});return{provider:l.provider,model:l.provider==="codex"?l.model??i.model??U:i.model,rule:l.rule,requestedModel:i.requestedModel,orchestrationAudit:l.audit}}function Hn(e,r,t){return e||r||t||le()||V}ne();ne();var M="cursor",jn=new Set(["claude","opus","anthropic"]),Yn=[/\[worker-provider:\s*claude\]/i,/\[use-claude-worker\]/i,/\[operator-worker-provider:\s*claude\]/i];function J(e,r){let t=e[r];return typeof t=="string"?t.trim():""}function k(e){if(!e?.trim())return!1;let r=e.trim().toLowerCase();return jn.has(r)?!0:r.includes("claude")||r.includes("opus")}function ae(e){if(!e)return!1;let r=e.workerProviderOverride;if(typeof r=="string"&&k(r))return!0;let t=J(e,"executorRef").toLowerCase();if(t==="provider:claude"||t.startsWith("provider:claude:")||t.includes("claude-worker-override")||t.includes("operator-claude"))return!0;let n=f(J(e,"executorRef"));if(n?.provider&&k(n.provider)||n?.model&&k(Vn(n.model)))return!0;let o=J(e,"description");if(Yn.some(i=>i.test(o)))return!0;let s=J(e,"title");return!!/\[use-claude-worker\]/i.test(s)}function Vn(e){let r=e.trim().toLowerCase();return/^claude[-_]/.test(r)||/^(?:opus|sonnet|haiku)\b/.test(r)?"claude":r}function Gn(e,r){return{provider:M,model:q,rule:`policy:cursor_default${r}`,requestedModel:e}}var qn=["explicit:","executor_ref:","factory:","task:"];function Jn(e){return qn.some(r=>e.startsWith(r))}function Ke(e){if(!e)return!1;let r=e.workerProviderOverride;return typeof r=="string"&&r.trim()||f(J(e,"executorRef"))?.provider?!0:ae(e)}function Jr(e){let{routing:r,task:t}=e,n=e.explicitProvider?.trim().toLowerCase();if(e.explicitProviderIsOperatorOverride&&k(n))return{...r,provider:"claude",rule:r.rule.startsWith("explicit:")?r.rule:"explicit:operator_provider"};if(n||Jn(r.rule)||Ke(t)||!k(r.provider))return r;let o=r.rule&&r.rule!=="default:global"?`:${r.rule.replace(/:/g,"_")}`:"";return Gn(r.model,o)}function zn(e){let r=e?.executorRef;return typeof r=="string"?r.trim():""}function zr(e){return e?.trim()||void 0}function Xn(e){let r=zn(e.task),t=f(r),n=e.explicitProvider?.trim().toLowerCase(),o=zr(e.explicitModel??void 0),s=n||t?.provider,i=o||t?.model,l=n||o?"cli":t?.rule??"none";if(!s&&!i)return{ok:!0};!s&&i&&(/^claude[-_]/i.test(i)||/^(?:opus|sonnet|haiku)\b/i.test(i))&&(s="claude");let u=e.routing.provider,c=zr(e.routing.model),p={provider:u,model:c,rule:e.routing.rule};return s&&s!=="cursor"||r&&de(r)||n&&n!=="cursor"?u==="cursor"?{ok:!1,error:`model_routing_mismatch: requested ${s??"non-cursor"}${i?` model=${i}`:""} (${l}) but routing resolved to cursor (${e.routing.rule})`,requested:{provider:s,model:i,source:l},resolved:p}:i&&c&&i!==c&&!k(u)?{ok:!1,error:`model_routing_mismatch: requested model=${i} (${l}) but routing resolved model=${c} (${e.routing.rule})`,requested:{provider:s,model:i,source:l},resolved:p}:{ok:!0,requested:{provider:s,model:i,source:l},resolved:p}:{ok:!0,resolved:p}}export{q as CURSOR_DEFAULT_MODEL,jr as GLOBAL_DEFAULT_MODEL,Xn as assessDispatchModelGuard,de as executorRefRequestsNonCursorWorker,Vr as inferModelRoutingFromTask,f as parseExecutorRefRoutingIntent,le as resolveGlobalDefaultModel,Hn as resolveModelFallback,$n as resolveWorkerLaunch};
|
package/dist/server/monitor.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
var u=(e,r,t)=>()=>{if(t)throw t[0];try{return e&&(r=e(e=0)),r}catch(n){throw t=[n],n}};function J(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
|
|
1
|
+
var u=(e,r,t)=>()=>{if(t)throw t[0];try{return e&&(r=e(e=0)),r}catch(n){throw t=[n],n}};function J(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 ke(e){let r=e.trim();if(!r)return null;let t=J(r);if(t)return t;let n=[],s=/```(?:json)?\s*([\s\S]*?)```/gi,o;for(;(o=s.exec(r))!==null;){let l=J(o[1]??"");l&&n.push(l)}let i=r.indexOf("{"),a=r.lastIndexOf("}");if(i>=0&&a>i){let l=J(r.slice(i,a+1));l&&n.push(l)}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"?ke(r)??(r.trim()||null):r;let t=typeof e.summary=="string"?e.summary.trim():"";if(!t)return null;let n=ke(t);return n||t}var Re=u(()=>{"use strict"});var xe=u(()=>{"use strict"});import{existsSync as jr,mkdirSync as vn,readFileSync as Yr,readdirSync as En,renameSync as Cn,rmSync as An,statSync as Se,writeFileSync as wn}from"node:fs";function q(e){console.error(e),process.exit(1)}function X(e){return process.platform!=="win32"?e:{windowsHide:!0,...e}}function I(e){try{return JSON.parse(e)}catch{return null}}function P(e){try{return Se(e).size}catch{return 0}}function T(e){try{return Se(e).mtime.toISOString()}catch{return null}}function _e(e,r){return jr(e)?Yr(e,"utf8").split(`
|
|
2
2
|
`).slice(-r).join(`
|
|
3
|
-
`):""}function
|
|
4
|
-
`).filter(Boolean);for(let o of s){let i=I(o);if(!i||typeof i!="object"||Array.isArray(i))continue;let a=i;if(r.heartbeatCount++,a.ts){let l=String(a.ts),c=Date.parse(l);Number.isFinite(c)&&c>t?r.timestampAnomalies.push({kind:"future_heartbeat_timestamp",observedAt:l,clampedTo:n}):r.lastHeartbeatAt=l}a.phase!==void 0&&a.phase!==null&&(r.lastHeartbeatPhase=String(a.phase)),a.summary!==void 0&&a.summary!==null&&(r.lastHeartbeatSummary=String(a.summary)),
|
|
5
|
-
`).find(Boolean)??s,160):"npm audit failed"}function
|
|
6
|
-
${e.stderr}`.trim(),t=
|
|
7
|
-
`).filter(Boolean),n=null;for(let s of t){let o=I(s);if(!o||typeof o!="object"||Array.isArray(o))continue;if(o.type==="turn.started"&&(n=null,r.finalResult=null),o.type==="item.completed"){let l=o.item;if(l&&typeof l=="object"&&!Array.isArray(l)){let c=l;c.type==="agent_message"&&typeof c.text=="string"&&c.text.trim()&&(n=c.text)}}o.type==="turn.completed"&&n&&!r.providerTerminalError&&(r.finalResult=n,n=null);let i=
|
|
8
|
-
`).map(r=>r.trim()).filter(Boolean)}function A(e,r){try{let t=Ge("git",r,X({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 Ve(e,r,t){let n=A(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 Je(e,r="origin/main"){let t=typeof r=="string"?{base:r}:r,n=t.baseCommit?.trim()||t.base?.trim()||"origin/main",s=t.baseCommit?.trim()||null;if(!e)return ne(n,"missing worktree path");let o=A(e,["rev-parse","HEAD"]);if(o.status!==0)return ne(n,o.error||o.stderr||o.stdout||"failed to resolve HEAD");let i;if(s)i=s;else{let f=A(e,["rev-parse",n]);if(f.status!==0)return ne(n,f.error||f.stderr||f.stdout||`failed to resolve ${n}`,o.stdout.trim());i=f.stdout.trim()}let a=o.stdout.trim();if(a===i)return{checked:!0,base:n,head:a,baseHead:i,baseIsAncestorOfHead:!0,headIsAncestorOfBase:!0,relation:"synced"};let l=Ve(e,i,a),c=Ve(e,a,i),m=l.error||c.error||void 0;if(l.isAncestor==null||c.isAncestor==null)return{checked:!1,base:n,head:a,baseHead:i,baseIsAncestorOfHead:l.isAncestor,headIsAncestorOfBase:c.isAncestor,relation:"unknown",...m?{error:m}:{}};let d=l.isAncestor?"ahead":c.isAncestor?"merged":"diverged";return{checked:!0,base:n,head:a,baseHead:i,baseIsAncestorOfHead:l.isAncestor,headIsAncestorOfBase:c.isAncestor,relation:d,...m?{error:m}:{}}}function ne(e,r,t=null){return{checked:!1,base:e,head:t,baseHead:null,baseIsAncestorOfHead:null,headIsAncestorOfBase:null,relation:"unknown",error:r}}var D=u(()=>{"use strict";x();p();Ye()});function w(e){if(typeof e!="string")return null;let r=e.trim();return r.length?r:null}function Tt(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 Kt(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 qe(e){return Tt(e.finalResult)?e.changedFiles.length===0?{blocked:!1}:Kt(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 Xe(e){if(e.blocked)return e.detail??e.reason??"dirty_worktree_no_pr"}var Ze=u(()=>{"use strict"});function se(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 Qe(e){let r=e.targetPrReconciliation??e.target_pr_reconciliation??e.targetPrs??e.target_prs;return Array.isArray(r)?r.length:0}function M(e){let r=e.trim();if(!r)return null;let t=se(r);if(t)return t;let n=[],s=/```(?:json)?\s*([\s\S]*?)```/gi,o;for(;(o=s.exec(r))!==null;){let m=se(o[1]??"");m&&n.push(m)}let i=r.indexOf("{"),a=r.lastIndexOf("}");if(i>=0&&a>i){let m=se(r.slice(i,a+1));m&&n.push(m)}if(n.length===0)return null;let l=n[n.length-1],c=Qe(l);for(let m of n){let d=Qe(m);d>c&&(l=m,c=d)}return l}var ie=u(()=>{"use strict"});function er(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 rr(e){let r=e.trim().match(/github\.com\/([^/]+\/[^/]+)\/(?:pull|pulls)\/(\d+)/i);return r?`${r[1].toLowerCase()}/pull/${r[2]}`:e.trim().toLowerCase()}function Ut(e){return new Set(e.map(r=>rr(er(r)??r)).filter(Boolean))}function tr(e,r,t){let n=er(e)??e;if(!n)return"unrelated";let s=rr(n);return Ut(r).has(s)?"contract":t?(t.outcome==="skipped"||t.outcome==="blocked")&&t.reason?.trim()?"support":(t.outcome==="merged","unrelated"):"unrelated"}var nr=u(()=>{"use strict"});function S(e){if(typeof e!="string")return null;let r=e.trim();return r.length?r:null}function Bt(e){return e==null?!1:typeof e=="string"?e.trim().length>0:typeof e=="object"?Object.keys(e).length>0:!0}function b(e){let r=e.trim().match(/github\.com\/([^/]+\/[^/]+)\/(?:pull|pulls)\/(\d+)/i);return r?`https://github.com/${r[1]}/pull/${r[2]}`:S(e)}function F(e){let r=e.trim().match(/github\.com\/([^/]+\/[^/]+)\/(?:pull|pulls)\/(\d+)/i);return r?`${r[1].toLowerCase()}/pull/${r[2]}`:e.trim().toLowerCase()}function or(e){let r=null;if(typeof e=="string"){let s=M(e);s&&(r=s)}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 s of t){if(!s||typeof s!="object"||Array.isArray(s))continue;let o=s,i=b(String(o.prUrl??o.pr_url??"")),a=S(o.outcome);!i||a!=="merged"&&a!=="skipped"&&a!=="blocked"||n.push({prUrl:i,outcome:a,mergeCommit:S(o.mergeCommit??o.merge_commit),reason:S(o.reason)})}return n}function sr(e,r){let t=[],n=b(S(e.prUrl)??"");if(n&&t.push(n),r&&typeof r=="object"&&!Array.isArray(r)){let s=r,o=b(String(s.prUrl??s.pr_url??""));o&&t.push(o)}return[...new Set(t)]}function ir(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(!Bt(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 o=r.repairEnforceOriginalPr?b(S(r.targetPrUrl)??"")??(r.targetPrUrls.length===1?b(r.targetPrUrls[0]):null):null;if(o){let d=sr(t,n);if(!(n&&typeof n=="object"&&!Array.isArray(n)&&n.supersedesOriginalTargetPr===!0)){for(let y of d)if(y!==o)return{blocked:!0,reason:"duplicate_repair_pr",detail:`Repair worker opened or attached PR ${y} instead of canonical target ${o}`}}let h=or(n).find(y=>y.prUrl===o);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 ${o}`}}let i=or(n),a=new Map(i.map(d=>[F(d.prUrl),d])),l=new Set(r.targetPrUrls.map(d=>F(b(d)??d)).filter(Boolean)),c=sr(t,n);if(r.landingOnly)for(let d of c){let f=a.get(F(d)),g=tr(d,r.targetPrUrls,f);if(!(g==="contract"||g==="support"))return l.size>0?{blocked:!0,reason:"unrelated_implementation_pr",detail:`Landing-only worker attached unrelated PR ${d}`}:{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 d of r.targetPrUrls){let f=F(b(d)??d),g=a.get(f);if(!g){m.push(f);continue}g.outcome!=="merged"&&!g.reason?.trim()&&m.push(f)}return m.length>0?{blocked:!0,reason:m.every(d=>a.has(d))?"incomplete_target_pr_landing":"missing_target_pr_reconciliation",detail:`Target PR reconciliation incomplete: ${m.join(", ")}`}:{blocked:!1}}function ar(e){if(e.blocked)return e.detail??e.reason}var lr=u(()=>{"use strict";ie();nr()});function Mt(e){let r=Date.now();if(e.providerTerminalError||U(e.finalResult)||e.finalResult&&e.error?.trim()||C(e.error)||C(e.finalResult)){let s=e.error||(typeof e.finalResult=="string"?e.finalResult:"provider terminal error");return{state:"blocked",reason:te(s)?.reason??`provider terminal error: ${s}`}}if(e.completionBlocker&&!ur(e.completionBlocker))return{state:"blocked",reason:e.completionBlocker};if(e.finalResult){if(e.localOnly&&Lt(e.finalResult))return{state:"done",reason:"local-only worker superseded by merged PR"};let s={finalResult:e.finalResult,changedFiles:e.changedFiles??[],gitAncestry:e.gitAncestry??null,prUrl:e.prUrl??null},o=qe(s);if(o.blocked){let i=Xe(o);return{state:"needs_attention",reason:o.reason?`landing blocked (${o.reason}): ${i}`:`landing blocked: ${i}`}}if(e.landingContract){let i=ir({contract:e.landingContract,snapshot:s,finalResult:e.finalResult}),a=ar(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(Ft(e))return{state:"done",reason:"empty abandoned worker record"};let s=te(e.error);if(s)return{state:"blocked",reason:s.reason};let o=$e({alive:!1,finalResult:null,changedFiles:e.changedFiles,gitAncestry:e.gitAncestry});if(o?.salvageable){let a=e.error?.trim();return{state:"needs_attention",reason:a?`${o.attentionReason} (${a})`:o.attentionReason}}let i=e.error?.trim();return{state:"needs_attention",reason:i?`process exited without a final result: ${i}`:o?.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>Dt)return{state:"needs_attention",reason:`no first stream event ${Z(t)}s after start`};let n=e.lastActivityAt?Date.parse(e.lastActivityAt):NaN;return Number.isFinite(n)&&r-n>L?{state:"stale",reason:`no log/event/heartbeat activity for ${Z(n)}s`}:{state:"ok",reason:"recent activity"}}function ur(e){let r=e?.trim();return r?/completion acknowledged but board not advanced/i.test(r)&&/task already terminal/i.test(r):!1}function Ft(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 Lt(e){let r=null;if(typeof e=="string"?r=M(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 Ht(e,r,t){let n=e.completionSnapshot?.finalResult;return e.completionAckSource==="local-pr-merged-reconcile"&&n!==void 0&&n!==null?n:r||(n??ve(t))}function cr(e,r={}){let t=De(e.stdoutPath),n=Ee(e.heartbeatPath),s=typeof e.completionReportedAt=="string"&&e.completionReportedAt.trim().length>0,o=Ht(e,t.finalResult,n),i=s?!1:W(e.pid),a=P(e.stdoutPath),l=P(e.stderrPath),c=P(e.heartbeatPath),m=ze(e.worktreePath),d=Je(e.worktreePath,{base:r.base,baseCommit:r.baseCommit}),f=Se([t.lastEventAt,n.lastHeartbeatAt,N(e.stdoutPath),N(e.stderrPath),N(e.heartbeatPath)]),g=t.error||!i&&!o&&xe(e.stderrPath,10).trim()||void 0,h=typeof e.completionBlocker=="string"&&e.completionBlocker.trim()?e.completionBlocker.trim():null,y=ur(h)?null:h,Mr=e.repairTargetPrUrl?{landingOnly:!1,targetPrUrls:[e.repairTargetPrUrl],targetPrUrl:e.repairTargetPrUrl,repairEnforceOriginalPr:!0}:null,z=Mt({alive:i,finalResult:o,firstEventAt:t.firstEventAt,stdoutBytes:a,stderrBytes:l,heartbeatBytes:c,lastActivityAt:f,heartbeatBlocker:n.heartbeatBlocker,startedAt:e.startedAt,error:g,providerTerminalError:t.providerTerminalError,changedFiles:m,gitAncestry:d,completionBlocker:y,landingContract:Mr,prUrl:e.repairTargetPrUrl??e.taskPrUrl??null,localOnly:e.localOnly===!0,taskId:e.taskId??null,agentOsId:e.agentOsId??null,reconcileReason:e.reconcileReason??null}),Fr=y||z.state==="blocked"?"blocked":s||z.state==="done"?"done":o?"exited":i?"running":"exited";return{runId:e.runId,worker:e.name,pid:e.pid,alive:i,status:Fr,attention:z,branch:e.branch,worktreePath:e.worktreePath,ownedPaths:e.ownedPaths,stdoutBytes:a,stderrBytes:l,heartbeatBytes:c,firstEventAt:t.firstEventAt,lastEventAt:t.lastEventAt,lastActivityAt:f,currentTool:s?null:t.currentTool,heartbeatCount:n.heartbeatCount,lastHeartbeatAt:n.lastHeartbeatAt,lastHeartbeatPhase:n.lastHeartbeatPhase,lastHeartbeatSummary:n.lastHeartbeatSummary,heartbeatBlocker:n.heartbeatBlocker,timestampAnomalies:n.timestampAnomalies,finalResult:o,error:g,providerTerminalError:t.providerTerminalError,changedFiles:m,gitAncestry:d,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 dr(e){return!!(e.finalResult||e.alive===!1||e.status==="exited"||e.status==="done")}function mr(e){return e.finalResult?e.attention.state==="needs_attention"||e.attention.state==="blocked":!1}var Dt,L,O=u(()=>{"use strict";Ce();Me();B();Le();je();D();Ze();lr();ie();p();Dt=18e4,L=6e5});var hr=u(()=>{"use strict";D()});var ae=u(()=>{"use strict";D();x();hr()});var le=u(()=>{"use strict";p()});var k=u(()=>{"use strict"});var H=u(()=>{"use strict"});var yr=u(()=>{"use strict"});var No,Wo,ue=u(()=>{"use strict";No=25*1024*1024*1024,Wo=12*1024*1024*1024});var Do,Mo,br=u(()=>{"use strict";ue();Do=5*1024*1024*1024,Mo=10*1024*1024*1024});var Yo,Vo,ce=u(()=>{"use strict";br();ue();Yo=30*1024*1024*1024,Vo=15*1024*1024*1024});var kr=u(()=>{"use strict";$();p()});var Rr=u(()=>{"use strict";O()});var zt,Jt,_r=u(()=>{"use strict";yr();_();k();H();j();ce();$();kr();Rr();p();zt=500*1024*1024,Jt=4*1024*1024*1024});var j=u(()=>{"use strict";_r()});import{homedir as Xt}from"node:os";import Zt from"node:path";var vr,fe=u(()=>{"use strict";vr=Zt.join(Xt(),".kynver",".env")});var Er=u(()=>{"use strict"});var Cr=u(()=>{"use strict";Er()});var Ar=u(()=>{"use strict"});var pe=u(()=>{"use strict";Cr();Ar()});var wr=u(()=>{"use strict"});var Or=u(()=>{"use strict";wr()});var Y=u(()=>{"use strict";fe();x();_();pe();Or()});var Ir=u(()=>{"use strict";k();k()});var Pr=u(()=>{"use strict";fe();pe();Y()});var Nr=u(()=>{"use strict";p()});import nn from"node:path";var mi,ge=u(()=>{"use strict";x();Nr();mi=nn.join(".openclaw","harness")});var G=u(()=>{"use strict";_();k();H();j();ge()});var Tr=u(()=>{"use strict";ae();k();Ir();_();Y();Pr();le();G()});var cn,Ni,Kr=u(()=>{"use strict";cn=["claude","cursor","codex","gemini","gemini-api","openai-compatible"],Ni=cn.join("|")});import{homedir as dn,totalmem as Li}from"node:os";import he from"node:path";var Ur,ea,ra,ta,na,_=u(()=>{"use strict";ae();x();le();k();H();j();ce();Y();Tr();Kr();G();Ur=he.join(dn(),".kynver"),ea=he.join(Ur,"config.json"),ra=he.join(Ur,"credentials"),ta=500*1024*1024,na=4*1024*1024*1024});var Br=u(()=>{"use strict";_();ge();G();p()});var $=u(()=>{"use strict";Br();p()});O();var fr="kynver-harness:",$t="@runner:";function pr(e){return e?.trim()?e.trim():null}function jt(e){let r=pr(e);if(!r?.startsWith(fr))return null;let t=r.slice(fr.length),n=t.indexOf($t);return n>=0?t.slice(0,n).trim()||null:t.trim()||null}function gr(e,r){let t=pr(r);return t?jt(e)===t:!1}O();p();function Yt(e){let{worker:r,status:t,taskLease:n}=e,s=n?.leaseOwner??null;if(r.dispatched&&n){if(n.status==="running"&&s&&!gr(s,r.runId))return{health:"orphaned",reason:`task lease held by ${s}, 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 o=t.lastHeartbeatAt?Date.parse(t.lastHeartbeatAt):NaN;return t.alive&&Number.isFinite(o)&&Date.now()-o>L?{health:"stale",reason:`heartbeat older than ${Math.floor(L/1e3)}s`}:t.alive&&r.pid&&!W(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"}}$();function Dr(e){return!!e.completionReportedAt?.trim()}O();function mn(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"),Dr(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"),mr(t)&&n.push(t.attention.reason||"landing gate blocked");let s=dr(t),o;return s?t.finalResult?o="final_result":t.alive?o="terminal_status":o="process_exited":n.push("worker has not reached a terminal condition"),{eligible:s&&n.length===0,terminalVerified:s,terminalReason:o,blockers:n}}export{mn as assessAutoCompleteEligibility,Yt as classifyWorkerHealth,cr as computeWorkerStatus};
|
|
3
|
+
`):""}function N(e){if(!e)return!1;try{return process.kill(e,0),!0}catch{return!1}}function ve(e){let r=null,t=-1/0;for(let n of e){if(!n)continue;let s=Date.parse(n);Number.isFinite(s)&&s>t&&(t=s,r=n)}return r}function Z(e){return Math.max(0,Math.round((Date.now()-e)/1e3))}var f=u(()=>{"use strict";xe()});import{existsSync as Vr,readFileSync as Gr}from"node:fs";function Ee(e){return e==="complete"}function Ce(e){return Ee(e.lastHeartbeatPhase)?e.terminalFinalResult!==void 0&&e.terminalFinalResult!==null?e.terminalFinalResult:e.lastHeartbeatSummary?.trim()||"completed":null}function Ae(e){let r={heartbeatCount:0,lastHeartbeatAt:null,lastHeartbeatPhase:null,lastHeartbeatSummary:null,terminalFinalResult:null,heartbeatBlocker:null,timestampAnomalies:[],lastBoxResourceSnapshot:null,lastPrEvidence:[]};if(!Vr(e))return r;let t=Date.now()+zr,n=new Date(t).toISOString(),s=Gr(e,"utf8").split(`
|
|
4
|
+
`).filter(Boolean);for(let o of s){let i=I(o);if(!i||typeof i!="object"||Array.isArray(i))continue;let a=i;if(r.heartbeatCount++,a.ts){let l=String(a.ts),c=Date.parse(l);Number.isFinite(c)&&c>t?r.timestampAnomalies.push({kind:"future_heartbeat_timestamp",observedAt:l,clampedTo:n}):r.lastHeartbeatAt=l}a.phase!==void 0&&a.phase!==null&&(r.lastHeartbeatPhase=String(a.phase)),a.summary!==void 0&&a.summary!==null&&(r.lastHeartbeatSummary=String(a.summary)),Ee(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(l=>!!l&&typeof l=="object"&&typeof l.prUrl=="string"))}return r}var zr,we=u(()=>{"use strict";Re();f();zr=6e4});function Ie(e){return e?(e.split("/").pop()??e).replace(/\.exe$/i,"").toLowerCase():null}function K(e){if(!e)return[];let r=[],t="",n,s=!1;for(let o of e){if(s){t+=o,s=!1;continue}if(o==="\\"){s=!0;continue}if(n){o===n?n=void 0:t+=o;continue}if(o==='"'||o==="'"){n=o;continue}if(/\s/.test(o)){t&&(r.push(t),t="");continue}t+=o}return t&&r.push(t),r}function Pe(e){let r=Ie(e[0]);return!!(r&&Jr.has(r))}function Xr(e){let r=e.trim();return r.includes("/")?r.split("/").pop()??r:r}function Zr(e){if(!e||e.includes("*"))return null;let r=Xr(e);return!r||r.includes("/")?null:/\.(?:json|md|mjs|cjs|js|ts|tsx|yaml|yml)$/iu.test(r)?r:null}function Te(e){return!e||e.includes("/")||e.includes("*")?!1:/\.(?:json|md|mjs|cjs|js|ts|tsx|yaml|yml)$/iu.test(e)}function Q(e){if(!e)return!1;let r=e.trim();return r.startsWith("!")&&!r.includes("/")&&!r.endsWith("/**")}function Qr(e){if(!e.startsWith("--glob="))return e;let r=e.slice(7);return r.startsWith("!")&&!r.includes("/")&&!r.endsWith("/**")?`--glob=${r}/**`:e}function et(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;Oe.has(n)&&(t+=1);continue}r.push(n)}}return r}function rt(e){let r=!1,t=e.map((s,o)=>{let i=Qr(s),a=e[o-1];return a&&Oe.has(a)&&s.startsWith("!")&&!s.includes("/")&&!s.endsWith("/**")&&(i=`${s}/**`),i!==s&&(r=!0),i}),n=et(t);if(n.length===2){let[s,o]=n;if(Q(o))return{argv:[t[0]??"rg",s,"-g",`${o}/**`,"."],changed:!0};let i=Zr(o);if(i)return{argv:[t[0]??"rg","-g",i,s,"."],changed:!0}}return r&&n.length===1?{argv:[...t,"."],changed:!0}:{argv:t,changed:r}}function Ne(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 W(e){let r=e.trim();if(!r)return{command:r,wrapped:!1};let t=K(r);if(!t.length)return{command:r,wrapped:!1};let n=Ie(t[0]);if(!n||!qr.has(n))return{command:r,wrapped:!1};let s=Ne(t);if(s<0||s>=t.length)return{command:r,wrapped:!1};let o=t.slice(s).join(" ").trim();return o?{command:o,wrapped:!0}:{command:r,wrapped:!1}}function tt(e,r){let t=e.trim(),n=K(t),s=Ne(n);if(s<0)return r;let o=n.slice(0,s).join(" "),i=r.includes("'")?`"${r.replace(/"/g,'\\"')}"`:`'${r}'`;return`${o} ${i}`}function nt(e){let r=e.trim(),t=W(r),n=K(t.command);if(!n.length||!Pe(n))return{segment:r,changed:!1};let s=rt(n);if(!s.changed)return{segment:r,changed:!1};let o=s.argv.join(" ");return t.wrapped?{segment:tt(r,o),changed:!0}:{segment:o,changed:!0}}function ee(e){let r=e.trim();if(!r)return{command:r,changed:!1};let t=r.includes("&&")?" && ":r.includes("||")?" || ":"; ",n=r.split(/\s*(?:&&|\|\||;)\s*/u),s=!1,o=n.map(i=>{let a=nt(i);return a.changed&&(s=!0),a.segment});return s?{command:o.join(t),changed:!0}:{command:r,changed:!1}}function Ke(e){let r=W(e).command,t=K(r.trim());return t.length&&Pe(t)?!0:/\b(rg|ripgrep)\b/i.test(r)}function We(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 ot(e){let{pattern:r,target:t}=We(e);return r?Q(t)?{kind:"rg_exclude_syntax",pattern:r,target:t}:Te(t)?{kind:"bad_scope",pattern:r,target:t}:{kind:"not_repo_search",pattern:r,target:t}:{kind:"not_repo_search"}}function st(e){let{pattern:r,target:t}=We(e);if(!r)return null;if(Q(t)){let n=`${t.trim()}/**`;return{command:`rg "${r}" -g '${n}' .`,changed:!0}}return t&&Te(t)?{command:`rg -g ${t} "${r}" .`,changed:!0}:null}function it(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 at(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 re(e){let r=e.meta?.trim()||(e.command?at(e.command):null)||null;if(r){let t=ot(r),n=it(t);if(n)return n;let s=st(r);if(s?.changed)return`Repo search used an invalid scope. Retry with: \`${s.command}\`.`}if(e.command&&/\b(rg|ripgrep)\b/i.test(e.command)){let t=ee(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 Jr,qr,Oe,Ue=u(()=>{"use strict";Jr=new Set(["rg","ripgrep","grep"]),qr=new Set(["bash","sh","dash","zsh"]),Oe=new Set(["-e","--regexp","-f","--file","-m","--max-count","-A","--after-context","-B","--before-context","-C","--context","-g","--glob","--iglob"])});function v(e,r=200){let t=e.replace(/\s+/g," ").trim();return t.length>r?`${t.slice(0,r-1)}\u2026`:t}function ct(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 E(e){return!!e&&typeof e=="object"&&!Array.isArray(e)}function dt(e){let r=e.metadata;if(!E(r))return null;let t=r.vulnerabilities;if(!E(t))return null;let n=o=>typeof t[o]=="number"?t[o]:0,s={info:n("info"),low:n("low"),moderate:n("moderate"),high:n("high"),critical:n("critical"),total:n("total")};return typeof t.total!="number"&&!s.critical&&!s.high&&!s.moderate&&!s.low&&!s.info?null:s}function mt(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 pt(e,r){let t=e.error;if(E(t)){let o=typeof t.summary=="string"?t.summary.trim():"",i=typeof t.code=="string"?t.code.trim():"";if(o)return i?`${i}: ${o}`:o;if(i)return i}let n=typeof e.message=="string"?e.message.trim():"";if(n)return n;let s=r.trim();return s?v(s.split(`
|
|
5
|
+
`).find(Boolean)??s,160):"npm audit failed"}function ft(e){let r=`${e.stdout}
|
|
6
|
+
${e.stderr}`.trim(),t=ct(r);if(!t||!E(t)){let s=v(r||`exit ${e.exitCode}`,180);return{kind:"command_failure",exitCode:e.exitCode,summary:`npm audit failed (invalid or missing JSON): ${s}`,parseError:"invalid_json"}}if(E(t.error))return{kind:"command_failure",exitCode:e.exitCode,summary:`npm audit command failed: ${pt(t,e.stderr)}`};let n=dt(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:mt(n),audit:n}:{kind:"command_failure",exitCode:e.exitCode,summary:"npm audit failed: JSON response missing vulnerability metadata",parseError:"missing_metadata"}}function gt(e){return lt.test(e)}function ht(e){let r=W(e).command;return Be.test(e)||Be.test(r)||Ke(e)}function yt(e){let r=re({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&&ut.test(n)){let i=v(n,160);return{kind:"command_failure",exitCode:1,summary:r??`ripgrep failed (exit 1): ${i}`}}let s=ee(e.command),o=s.changed&&!r?` Retry with: \`${s.command}\`.`:"";return{kind:"search_no_matches",exitCode:1,summary:r??`ripgrep: no matches (exit 1).${o} Try a broader pattern or search from the repo root.`}}let t=v(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 De(e){let r=e.stdout??"",t=e.stderr??"",n=e.interleavedOutput??"";if(gt(e.command)){let i=r.trim()||n.trim()||t.trim();return ft({exitCode:e.exitCode,stdout:i,stderr:t})}if(ht(e.command))return yt({command:e.command,exitCode:e.exitCode,stdout:r,stderr:t,interleaved:n});let s=re({command:e.command,exitCode:e.exitCode});if(s&&e.exitCode!==0)return{kind:"command_failure",exitCode:e.exitCode,summary:s};if(e.exitCode===0)return{kind:"success",exitCode:0,summary:"command succeeded (exit 0)"};let o=v(n||r||t||`exit ${e.exitCode}`,180);return{kind:"command_failure",exitCode:e.exitCode,summary:`command failed (exit ${e.exitCode}): ${o}`}}var lt,Be,ut,Me=u(()=>{"use strict";Ue();lt=/\bnpm\s+audit\b/i,Be=/\b(rg|ripgrep)\b/i,ut=/\b(error|invalid|unknown|panic|not found)\b/i});function C(e){return typeof e=="string"&&kt.test(e.trim())}function U(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 kt,B=u(()=>{"use strict";kt=/^(?:provider authentication failed:\s*)?(?:(?:Failed to authenticate|authentication (?:failed|error))(?::\s*[^\n.!?]+)?|OAuth session expired and could not be refreshed)[.!]?$/i});import{existsSync as bt,readFileSync as Rt}from"node:fs";function xt(e){let r=e.timestamp_ms;return e.timestamp||e.ts||(r?new Date(r).toISOString():void 0)}function St(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 _t(e,r){e.finalResult=r.result||r.subtype||r.terminal_reason||"completed",U(r)&&(e.providerTerminalError=!0,e.error=String(r.result||r.api_error_status||"stream result error"))}function R(e){return typeof e=="number"&&Number.isFinite(e)&&e>=0?e:void 0}function vt(e){let r=e.usage;return r&&typeof r=="object"&&!Array.isArray(r)?r:null}function Et(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 Ct(e,r){let t=vt(r);if(!t)return;let n=R(t.input_tokens)??R(t.inputTokens)??R(t.prompt_tokens),s=R(t.output_tokens)??R(t.outputTokens)??R(t.completion_tokens);if(n===void 0&&s===void 0)return;let o=Et(r)??e.usage?.model;e.usage={...n!==void 0?{inputTokens:n}:{},...s!==void 0?{outputTokens:s}:{},...o?{model:o}:{}}}function At(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,s=n.args,o=s&&typeof s=="object"&&!Array.isArray(s)&&typeof s.command=="string"?String(s.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 l=a,c=typeof l.exitCode=="number"?l.exitCode:0;return{command:o,exitCode:c,stdout:typeof l.stdout=="string"?l.stdout:"",stderr:typeof l.stderr=="string"?l.stderr:"",interleaved:typeof l.interleavedOutput=="string"?l.interleavedOutput:""}}function wt(e,r){r.kind==="success"||r.kind==="search_no_matches"||(e.lastShellOutcome=r)}function Fe(e){let r={firstEventAt:null,lastEventAt:null,currentTool:null,finalResult:null,error:null,lastShellOutcome:null,usage:null};if(!bt(e))return r;let t=Rt(e,"utf8").split(`
|
|
7
|
+
`).filter(Boolean),n=null;for(let s of t){let o=I(s);if(!o||typeof o!="object"||Array.isArray(o))continue;if(o.type==="turn.started"&&(n=null,r.finalResult=null),o.type==="item.completed"){let l=o.item;if(l&&typeof l=="object"&&!Array.isArray(l)){let c=l;c.type==="agent_message"&&typeof c.text=="string"&&c.text.trim()&&(n=c.text)}}o.type==="turn.completed"&&n&&!r.providerTerminalError&&(r.finalResult=n,n=null);let i=xt(o);if(i&&(r.firstEventAt||=i,r.lastEventAt=i),o.type==="stream_event"&&o.event&&typeof o.event=="object"&&o.event.type==="content_block_start"){let l=o.event.content_block;l?.type==="tool_use"&&(r.currentTool=String(l.name||"tool"))}if(o.type==="assistant"&&o.message&&typeof o.message=="object"){let l=o.message.content;if(Array.isArray(l)){let c=l.find(m=>m?.type==="tool_use");c&&(r.currentTool=String(c.name||r.currentTool))}}if(o.type==="tool_call"&&o.subtype==="started"){let l=o.tool_call&&typeof o.tool_call=="object"&&!Array.isArray(o.tool_call)?o.tool_call:void 0,c=St(l);c&&(r.currentTool=c)}let a=At(o);if(a&&wt(r,De({command:a.command,exitCode:a.exitCode,stdout:a.stdout,stderr:a.stderr,interleavedOutput:a.interleaved})),o.type==="result"&&_t(r,o),o.type==="turn.failed"){n=null,r.finalResult=null,r.providerTerminalError=!0;let l=o.error;r.error=typeof l?.message=="string"?l.message:"provider turn failed"}Ct(r,o)}return r}var Le=u(()=>{"use strict";Me();f();B()});function $e(e,r=240){let t=e.replace(/\s+/g," ").trim();return t.length>r?`${t.slice(0,r-1)}\u2026`:t}function te(e){let r=(e??"").trim();if(!r)return null;if(C(r))return{blocked:!0,reason:`provider authentication failed: ${$e(r)}`};for(let t of Ot)if(t.test.test(r))return{blocked:!0,reason:`${t.label}: ${$e(r)}`};return null}var Ot,He=u(()=>{"use strict";B();Ot=[{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 je(e){if(typeof e!="string")return null;let r=e.trim();return r.length?r:null}function It(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 Pt(e){return!e?.checked||e.headIsAncestorOfBase!==!1?null:je(e.head)}function Tt(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 s=t.length>12?t.slice(0,12):t;n.push(`commit ${s} 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 Ye(e){if(e.alive||It(e.finalResult))return null;let r=(e.changedFiles??[]).filter(i=>i.trim()).length,t=je(e.headCommit)??Pt(e.gitAncestry),n=r>0,s=!!t;if(!n&&!s)return{kind:"none",salvageable:!1,uncommittedCount:0,headCommit:null,attentionReason:"process exited without a final result"};let o=n&&s?"both":n?"uncommitted":"committed_ahead";return{kind:o,salvageable:!0,uncommittedCount:r,headCommit:t,attentionReason:Tt(o,r,t)}}var Ve=u(()=>{"use strict"});var x=u(()=>{"use strict"});var Nt,Jn,Kt,qn,Ge=u(()=>{"use strict";Nt=["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"],Jn=new Set(Nt),Kt=["GITHUB_TOKEN","GH_TOKEN","CLAUDE_CODE_OAUTH_TOKEN","CODEX_API_KEY","GEMINI_API_KEY"],qn=new Set(Kt)});import{spawnSync as Je}from"node:child_process";function Wt(e,r,t={}){let n=Je("git",r,X({cwd:e,encoding:"utf8"}));if(n.status!==0&&!t.allowFailure){let s=Ut(e,r,n);if(t.throwError)throw new Error(s);q(s)}return n.stdout||""}function Ut(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 qe(e){return Wt(e,["status","--short"],{allowFailure:!0}).split(`
|
|
8
|
+
`).map(r=>r.trim()).filter(Boolean)}function A(e,r){try{let t=Je("git",r,X({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 ze(e,r,t){let n=A(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 Xe(e,r="origin/main"){let t=typeof r=="string"?{base:r}:r,n=t.baseCommit?.trim()||t.base?.trim()||"origin/main",s=t.baseCommit?.trim()||null;if(!e)return ne(n,"missing worktree path");let o=A(e,["rev-parse","HEAD"]);if(o.status!==0)return ne(n,o.error||o.stderr||o.stdout||"failed to resolve HEAD");let i;if(s)i=s;else{let p=A(e,["rev-parse",n]);if(p.status!==0)return ne(n,p.error||p.stderr||p.stdout||`failed to resolve ${n}`,o.stdout.trim());i=p.stdout.trim()}let a=o.stdout.trim();if(a===i)return{checked:!0,base:n,head:a,baseHead:i,baseIsAncestorOfHead:!0,headIsAncestorOfBase:!0,relation:"synced"};let l=ze(e,i,a),c=ze(e,a,i),m=l.error||c.error||void 0;if(l.isAncestor==null||c.isAncestor==null)return{checked:!1,base:n,head:a,baseHead:i,baseIsAncestorOfHead:l.isAncestor,headIsAncestorOfBase:c.isAncestor,relation:"unknown",...m?{error:m}:{}};let d=l.isAncestor?"ahead":c.isAncestor?"merged":"diverged";return{checked:!0,base:n,head:a,baseHead:i,baseIsAncestorOfHead:l.isAncestor,headIsAncestorOfBase:c.isAncestor,relation:d,...m?{error:m}:{}}}function ne(e,r,t=null){return{checked:!1,base:e,head:t,baseHead:null,baseIsAncestorOfHead:null,headIsAncestorOfBase:null,relation:"unknown",error:r}}var D=u(()=>{"use strict";x();f();Ge()});function w(e){if(typeof e!="string")return null;let r=e.trim();return r.length?r:null}function Bt(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 Dt(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 Ze(e){return Bt(e.finalResult)?e.changedFiles.length===0?{blocked:!1}:Dt(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 Qe(e){if(e.blocked)return e.detail??e.reason??"dirty_worktree_no_pr"}var er=u(()=>{"use strict"});function se(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 rr(e){let r=e.targetPrReconciliation??e.target_pr_reconciliation??e.targetPrs??e.target_prs;return Array.isArray(r)?r.length:0}function M(e){let r=e.trim();if(!r)return null;let t=se(r);if(t)return t;let n=[],s=/```(?:json)?\s*([\s\S]*?)```/gi,o;for(;(o=s.exec(r))!==null;){let m=se(o[1]??"");m&&n.push(m)}let i=r.indexOf("{"),a=r.lastIndexOf("}");if(i>=0&&a>i){let m=se(r.slice(i,a+1));m&&n.push(m)}if(n.length===0)return null;let l=n[n.length-1],c=rr(l);for(let m of n){let d=rr(m);d>c&&(l=m,c=d)}return l}var ie=u(()=>{"use strict"});function tr(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 nr(e){let r=e.trim().match(/github\.com\/([^/]+\/[^/]+)\/(?:pull|pulls)\/(\d+)/i);return r?`${r[1].toLowerCase()}/pull/${r[2]}`:e.trim().toLowerCase()}function Mt(e){return new Set(e.map(r=>nr(tr(r)??r)).filter(Boolean))}function or(e,r,t){let n=tr(e)??e;if(!n)return"unrelated";let s=nr(n);return Mt(r).has(s)?"contract":t?(t.outcome==="skipped"||t.outcome==="blocked")&&t.reason?.trim()?"support":(t.outcome==="merged","unrelated"):"unrelated"}var sr=u(()=>{"use strict"});function S(e){if(typeof e!="string")return null;let r=e.trim();return r.length?r:null}function Ft(e){return e==null?!1:typeof e=="string"?e.trim().length>0:typeof e=="object"?Object.keys(e).length>0:!0}function k(e){let r=e.trim().match(/github\.com\/([^/]+\/[^/]+)\/(?:pull|pulls)\/(\d+)/i);return r?`https://github.com/${r[1]}/pull/${r[2]}`:S(e)}function F(e){let r=e.trim().match(/github\.com\/([^/]+\/[^/]+)\/(?:pull|pulls)\/(\d+)/i);return r?`${r[1].toLowerCase()}/pull/${r[2]}`:e.trim().toLowerCase()}function ir(e){let r=null;if(typeof e=="string"){let s=M(e);s&&(r=s)}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 s of t){if(!s||typeof s!="object"||Array.isArray(s))continue;let o=s,i=k(String(o.prUrl??o.pr_url??"")),a=S(o.outcome);!i||a!=="merged"&&a!=="skipped"&&a!=="blocked"||n.push({prUrl:i,outcome:a,mergeCommit:S(o.mergeCommit??o.merge_commit),reason:S(o.reason)})}return n}function ar(e,r){let t=[],n=k(S(e.prUrl)??"");if(n&&t.push(n),r&&typeof r=="object"&&!Array.isArray(r)){let s=r,o=k(String(s.prUrl??s.pr_url??""));o&&t.push(o)}return[...new Set(t)]}function lr(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(!Ft(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 o=r.repairEnforceOriginalPr?k(S(r.targetPrUrl)??"")??(r.targetPrUrls.length===1?k(r.targetPrUrls[0]):null):null;if(o){let d=ar(t,n);if(!(n&&typeof n=="object"&&!Array.isArray(n)&&n.supersedesOriginalTargetPr===!0)){for(let y of d)if(y!==o)return{blocked:!0,reason:"duplicate_repair_pr",detail:`Repair worker opened or attached PR ${y} instead of canonical target ${o}`}}let h=ir(n).find(y=>y.prUrl===o);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 ${o}`}}let i=ir(n),a=new Map(i.map(d=>[F(d.prUrl),d])),l=new Set(r.targetPrUrls.map(d=>F(k(d)??d)).filter(Boolean)),c=ar(t,n);if(r.landingOnly)for(let d of c){let p=a.get(F(d)),g=or(d,r.targetPrUrls,p);if(!(g==="contract"||g==="support"))return l.size>0?{blocked:!0,reason:"unrelated_implementation_pr",detail:`Landing-only worker attached unrelated PR ${d}`}:{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 d of r.targetPrUrls){let p=F(k(d)??d),g=a.get(p);if(!g){m.push(p);continue}g.outcome!=="merged"&&!g.reason?.trim()&&m.push(p)}return m.length>0?{blocked:!0,reason:m.every(d=>a.has(d))?"incomplete_target_pr_landing":"missing_target_pr_reconciliation",detail:`Target PR reconciliation incomplete: ${m.join(", ")}`}:{blocked:!1}}function ur(e){if(e.blocked)return e.detail??e.reason}var cr=u(()=>{"use strict";ie();sr()});function $t(e){let r=Date.now();if(e.providerTerminalError||U(e.finalResult)||e.finalResult&&e.error?.trim()||C(e.error)||C(e.finalResult)){let s=e.error||(typeof e.finalResult=="string"?e.finalResult:"provider terminal error");return{state:"blocked",reason:te(s)?.reason??`provider terminal error: ${s}`}}if(e.completionBlocker&&!dr(e.completionBlocker))return{state:"blocked",reason:e.completionBlocker};if(e.finalResult){if(e.localOnly&&jt(e.finalResult))return{state:"done",reason:"local-only worker superseded by merged PR"};let s={finalResult:e.finalResult,changedFiles:e.changedFiles??[],gitAncestry:e.gitAncestry??null,prUrl:e.prUrl??null},o=Ze(s);if(o.blocked){let i=Qe(o);return{state:"needs_attention",reason:o.reason?`landing blocked (${o.reason}): ${i}`:`landing blocked: ${i}`}}if(e.landingContract){let i=lr({contract:e.landingContract,snapshot:s,finalResult:e.finalResult}),a=ur(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(Ht(e))return{state:"done",reason:"empty abandoned worker record"};let s=te(e.error);if(s)return{state:"blocked",reason:s.reason};let o=Ye({alive:!1,finalResult:null,changedFiles:e.changedFiles,gitAncestry:e.gitAncestry});if(o?.salvageable){let a=e.error?.trim();return{state:"needs_attention",reason:a?`${o.attentionReason} (${a})`:o.attentionReason}}let i=e.error?.trim();return{state:"needs_attention",reason:i?`process exited without a final result: ${i}`:o?.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>Lt)return{state:"needs_attention",reason:`no first stream event ${Z(t)}s after start`};let n=e.lastActivityAt?Date.parse(e.lastActivityAt):NaN;return Number.isFinite(n)&&r-n>L?{state:"stale",reason:`no log/event/heartbeat activity for ${Z(n)}s`}:{state:"ok",reason:"recent activity"}}function dr(e){let r=e?.trim();return r?/completion acknowledged but board not advanced/i.test(r)&&/task already terminal/i.test(r):!1}function Ht(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 jt(e){let r=null;if(typeof e=="string"?r=M(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 Yt(e,r,t){let n=e.completionSnapshot?.finalResult;return e.completionAckSource==="local-pr-merged-reconcile"&&n!==void 0&&n!==null?n:r||(n??Ce(t))}function mr(e,r={}){let t=Fe(e.stdoutPath),n=Ae(e.heartbeatPath),s=typeof e.completionReportedAt=="string"&&e.completionReportedAt.trim().length>0,o=Yt(e,t.finalResult,n),i=s?!1:N(e.pid),a=P(e.stdoutPath),l=P(e.stderrPath),c=P(e.heartbeatPath),m=qe(e.worktreePath),d=Xe(e.worktreePath,{base:r.base,baseCommit:r.baseCommit}),p=ve([t.lastEventAt,n.lastHeartbeatAt,T(e.stdoutPath),T(e.stderrPath),T(e.heartbeatPath)]),g=t.error||!i&&!o&&_e(e.stderrPath,10).trim()||void 0,h=typeof e.completionBlocker=="string"&&e.completionBlocker.trim()?e.completionBlocker.trim():null,y=dr(h)?null:h,$r=e.repairTargetPrUrl?{landingOnly:!1,targetPrUrls:[e.repairTargetPrUrl],targetPrUrl:e.repairTargetPrUrl,repairEnforceOriginalPr:!0}:null,z=$t({alive:i,finalResult:o,firstEventAt:t.firstEventAt,stdoutBytes:a,stderrBytes:l,heartbeatBytes:c,lastActivityAt:p,heartbeatBlocker:n.heartbeatBlocker,startedAt:e.startedAt,error:g,providerTerminalError:t.providerTerminalError,changedFiles:m,gitAncestry:d,completionBlocker:y,landingContract:$r,prUrl:e.repairTargetPrUrl??e.taskPrUrl??null,localOnly:e.localOnly===!0,taskId:e.taskId??null,agentOsId:e.agentOsId??null,reconcileReason:e.reconcileReason??null}),Hr=y||z.state==="blocked"?"blocked":s||z.state==="done"?"done":o?"exited":i?"running":"exited";return{runId:e.runId,worker:e.name,pid:e.pid,alive:i,status:Hr,attention:z,branch:e.branch,worktreePath:e.worktreePath,ownedPaths:e.ownedPaths,stdoutBytes:a,stderrBytes:l,heartbeatBytes:c,firstEventAt:t.firstEventAt,lastEventAt:t.lastEventAt,lastActivityAt:p,currentTool:s?null:t.currentTool,heartbeatCount:n.heartbeatCount,lastHeartbeatAt:n.lastHeartbeatAt,lastHeartbeatPhase:n.lastHeartbeatPhase,lastHeartbeatSummary:n.lastHeartbeatSummary,heartbeatBlocker:n.heartbeatBlocker,timestampAnomalies:n.timestampAnomalies,finalResult:o,error:g,providerTerminalError:t.providerTerminalError,changedFiles:m,gitAncestry:d,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 pr(e){return!!(e.finalResult||e.alive===!1||e.status==="exited"||e.status==="done")}function fr(e){return e.finalResult?e.attention.state==="needs_attention"||e.attention.state==="blocked":!1}var Lt,L,O=u(()=>{"use strict";we();Le();B();He();Ve();D();er();cr();ie();f();Lt=18e4,L=6e5});var kr=u(()=>{"use strict";D()});var ae=u(()=>{"use strict";D();x();kr()});var le=u(()=>{"use strict";f()});var b=u(()=>{"use strict"});var $=u(()=>{"use strict"});var br=u(()=>{"use strict"});var Lo,$o,ue=u(()=>{"use strict";Lo=25*1024*1024*1024,$o=12*1024*1024*1024});var Go,zo,Rr=u(()=>{"use strict";ue();Go=5*1024*1024*1024,zo=10*1024*1024*1024});var es,rs,ce=u(()=>{"use strict";Rr();ue();es=30*1024*1024*1024,rs=15*1024*1024*1024});var xr=u(()=>{"use strict";H();f()});var Sr=u(()=>{"use strict";O()});var Xt,Zt,Er=u(()=>{"use strict";br();_();b();$();j();ce();H();xr();Sr();f();Xt=500*1024*1024,Zt=4*1024*1024*1024});var j=u(()=>{"use strict";Er()});import{homedir as en}from"node:os";import rn from"node:path";var Cr,pe=u(()=>{"use strict";Cr=rn.join(en(),".kynver",".env")});var Ar=u(()=>{"use strict"});var wr=u(()=>{"use strict";Ar()});var Or=u(()=>{"use strict"});var Ir=u(()=>{"use strict";f()});var fe=u(()=>{"use strict";wr();Or();Ir()});var Pr=u(()=>{"use strict"});var Tr=u(()=>{"use strict";Pr()});var Y=u(()=>{"use strict";pe();x();_();fe();Tr()});var Nr=u(()=>{"use strict";b();b()});var Kr=u(()=>{"use strict";pe();fe();Y()});var ge=u(()=>{"use strict"});var Wr=u(()=>{"use strict";f()});import ln from"node:path";var Ci,he=u(()=>{"use strict";x();Wr();Ci=ln.join(".openclaw","harness")});var G=u(()=>{"use strict";_();b();$();j();he()});var Br=u(()=>{"use strict";ae();b();Nr();_();Y();Kr();le();ge();G()});var fn,zi,Dr=u(()=>{"use strict";fn=["claude","cursor","codex","gemini","gemini-api","openai-compatible"],zi=fn.join("|")});import{homedir as gn,totalmem as ia}from"node:os";import ye from"node:path";var Mr,Ra,xa,Sa,_a,_=u(()=>{"use strict";ae();x();le();b();$();j();ce();Y();Br();Dr();G();ge();Mr=ye.join(gn(),".kynver"),Ra=ye.join(Mr,"config.json"),xa=ye.join(Mr,"credentials"),Sa=500*1024*1024,_a=4*1024*1024*1024});var Fr=u(()=>{"use strict";_();he();G();f()});var H=u(()=>{"use strict";Fr();f()});O();var gr="kynver-harness:",Vt="@runner:";function hr(e){return e?.trim()?e.trim():null}function Gt(e){let r=hr(e);if(!r?.startsWith(gr))return null;let t=r.slice(gr.length),n=t.indexOf(Vt);return n>=0?t.slice(0,n).trim()||null:t.trim()||null}function yr(e,r){let t=hr(r);return t?Gt(e)===t:!1}O();f();function zt(e){let{worker:r,status:t,taskLease:n}=e,s=n?.leaseOwner??null;if(r.dispatched&&n){if(n.status==="running"&&s&&!yr(s,r.runId))return{health:"orphaned",reason:`task lease held by ${s}, 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 o=t.lastHeartbeatAt?Date.parse(t.lastHeartbeatAt):NaN;return t.alive&&Number.isFinite(o)&&Date.now()-o>L?{health:"stale",reason:`heartbeat older than ${Math.floor(L/1e3)}s`}:t.alive&&r.pid&&!N(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"}}H();function Lr(e){return!!e.completionReportedAt?.trim()}O();function hn(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"),Lr(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"),fr(t)&&n.push(t.attention.reason||"landing gate blocked");let s=pr(t),o;return s?t.finalResult?o="final_result":t.alive?o="terminal_status":o="process_exited":n.push("worker has not reached a terminal condition"),{eligible:s&&n.length===0,terminalVerified:s,terminalReason:o,blockers:n}}export{hn as assessAutoCompleteEligibility,zt as classifyWorkerHealth,mr as computeWorkerStatus};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{existsSync as L}from"node:fs";import{homedir as D}from"node:os";import B from"node:path";import{createHash as v}from"node:crypto";import{statSync as w}from"node:fs";import{spawnSync as P}from"node:child_process";function c(e){try{let r=w(e),t=`${e}|${r.size}|${r.mtimeMs}`;return v("sha256").update(t).digest("hex").slice(0,16)}catch{return}}function d(e){return v("sha256").update(`env:${e}`).digest("hex").slice(0,16)}function u(e,r){for(let t of r){let n=process.env[t]?.trim();if(n)return n}return e}function a(e,r,t={}){let n=t.timeoutMs??8e3;try{let o=P(e,r,{encoding:"utf8",timeout:n,env:{...process.env,...t.env,CI:"1",NO_COLOR:"1"}});if(o.status===0)return{ok:!0,note:t.okNote??`${e} ${r.join(" ")}: ok`};let i=(o.stderr||o.stdout||"").trim(),s=t.failPrefix??`${e} ${r.join(" ")} failed`;return{ok:!1,note:i?`${s}: ${i.slice(0,200)}`:s}}catch(o){return{ok:!1,note:o instanceof Error?o.message:`${e} probe failed`}}}function h(e,r,t={}){let n=t.timeoutMs??8e3;try{return P(e,r,{stdio:"ignore",timeout:n,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(o){return{ok:!1,note:o instanceof Error?o.message:`${e} auth probe failed`}}}var Y="claude";function M(){let e=D();return[B.join(e,".claude",".credentials.json")]}function x(e=new Date().toISOString()){let r=u(Y,["KYNVER_CLAUDE_BIN","CLAUDE_BIN"]);if(process.env.ANTHROPIC_API_KEY?.trim())return{providerId:"claude",ready:!1,authSource:"api_key_env",sessionFingerprint:d("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=a(r,["--version"],{okNote:`${r} CLI available`,failPrefix:`${r} CLI not available`}),n=M().find(s=>L(s)),o=h(r,["auth","status"],{okNote:"claude auth status: authenticated",failNote:"claude auth status: not authenticated"}),i=t.ok&&(o.ok||!!n);return{providerId:"claude",ready:i,authSource:"oauth_local",sessionFingerprint:n?c(n):void 0,checkedAt:e,note:i?"Local Claude Code OAuth session bound on runner":[t.note,o.note,n?void 0:"no ~/.claude/.credentials.json"].filter(Boolean).join("; ")}}import{existsSync as j}from"node:fs";import{homedir as U}from"node:os";import p from"node:path";var H="codex";function $(){let e=U();return[process.env.CODEX_HOME?.trim()?p.join(p.resolve(process.env.CODEX_HOME.trim()),"auth.json"):null,p.join(e,".codex","auth.json"),p.join(e,".config","codex","auth.json")].filter(t=>!!t)}function F(e){return p.dirname(e)}function W(e){let r,t;for(let n of $()){if(!j(n))continue;r??=n;let o=a(e,["login","status"],{okNote:"codex login status: authenticated",failPrefix:"codex login status",env:{CODEX_HOME:F(n)}});if(t??=o,o.ok)return{authPath:n,login:o}}return{authPath:r,login:t??a(e,["login","status"],{okNote:"codex login status: authenticated",failPrefix:"codex login status"})}}function y(e=new Date().toISOString()){let r=u(H,["KYNVER_CODEX_BIN","CODEX_BIN"]);if(process.env.CODEX_API_KEY?.trim())return{providerId:"codex",ready:!0,authSource:"api_key_env",sessionFingerprint:d("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:n}=W(r),o=!!t&&n.ok;return{providerId:"codex",ready:o,authSource:"oauth_local",sessionFingerprint:t?c(t):void 0,checkedAt:e,note:o?"Local Codex OAuth session bound on runner":[n.note,t?void 0:"no Codex auth store found"].filter(Boolean).join("; ")}}import{existsSync as V}from"node:fs";import{homedir as J}from"node:os";import E from"node:path";function z(){let e=process.env.HERMES_HOME?.trim(),r=e?E.resolve(e):E.join(J(),".hermes");return E.join(r,"auth.json")}function g(e=new Date().toISOString()){let r=u("hermes",["KYNVER_HERMES_BIN","HERMES_BIN"]),t=a(r,["--version"],{okNote:`${r} CLI available`,failPrefix:`${r} CLI not available`}),n=z(),o=V(n),i=h(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:o?c(n):void 0,checkedAt:e,note:s?"Hermes openai-codex subscription session bound (ChatGPT Codex OAuth)":[t.note,i.note,o?void 0:"no ~/.hermes/auth.json"].filter(Boolean).join("; ")}}function I(e=new Date().toISOString()){let r=y(e);if(r.ready)return{...r,path:"codex_cli"};let t=g(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 Z}from"node:fs";import{homedir as Q}from"node:os";import l from"node:path";var G=["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"],Be=new Set(G);var X=["GITHUB_TOKEN","GH_TOKEN","CLAUDE_CODE_OAUTH_TOKEN","CODEX_API_KEY","GEMINI_API_KEY"],Ye=new Set(X);import{spawnSync as q}from"node:child_process";function O(e,r=process.env){try{let t=q(e,["status","--format","json"],{encoding:"utf8",timeout:8e3,env:{...r,CI:"1",NO_COLOR:"1"}});if(t.status!==0)return{ok:!1,note:"agent status: not authenticated"};let n=(t.stdout||"").trim();if(!n)return{ok:!1,note:"agent status: empty response"};let o;try{o=JSON.parse(n)}catch{return{ok:!1,note:"agent status: unparseable response"}}return typeof o=="object"&&o!==null&&o.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 C(e=process.env){let r=[],t=e.KYNVER_CURSOR_AUTH_HOME?.trim();t&&(r.push(l.join(t,".config","cursor","auth.json")),r.push(l.join(t,".cursor-agent","auth.json")));let n=Q();if(r.push(l.join(n,".config","cursor","auth.json")),r.push(l.join(n,".cursor-agent","auth.json")),process.platform==="win32"){let o=e.LOCALAPPDATA?.trim(),i=e.APPDATA?.trim();o&&r.push(l.join(o,"cursor-agent","auth.json")),i&&r.push(l.join(i,"cursor","auth.json"))}return r}var ee="agent";function b(e=new Date().toISOString()){let r=u(ee,["KYNVER_CURSOR_AGENT_BIN","CURSOR_AGENT_BIN"]);if(process.env.CURSOR_API_KEY?.trim())return{providerId:"cursor",ready:!1,authSource:"api_key_env",sessionFingerprint:d("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=a(r,["-v"],{okNote:`${r} CLI available`,failPrefix:`${r} CLI not available`}),n=C().find(m=>Z(m)),o=O(r),i=!!n||o.ok,s=t.ok&&i;return{providerId:"cursor",ready:s,authSource:"oauth_local",sessionFingerprint:n?c(n):void 0,checkedAt:e,note:s?"Local Cursor/Composer OAuth session bound on runner":[t.note,i?void 0:o.note??"no ~/.config/cursor/auth.json or `agent login` session"].filter(Boolean).join("; ")}}import{existsSync as re,readFileSync as te}from"node:fs";import{homedir as oe}from"node:os";import S from"node:path";var ne=["OPENAI_API_KEY","ANTHROPIC_API_KEY","KYNVER_API_KEY","KYNVER_BASE_URL"];function ie(){let e=process.env.HERMES_HOME?.trim(),r=e?S.resolve(e):S.join(oe(),".hermes");return S.join(r,".env")}function se(e){try{let r=te(e,"utf8"),t=[];for(let n of ne)new RegExp(`^${n}=`,"m").test(r)&&t.push(n);return t}catch{return[]}}function N(e=new Date().toISOString()){let r=u("hermes",["KYNVER_HERMES_BIN","HERMES_BIN"]),t=a(r,["--version"],{okNote:`${r} CLI available`,failPrefix:`${r} CLI not available`}),n=ie(),o=re(n),i=o?se(n):[],m=i.some(K=>K.endsWith("_API_KEY"))?"api_key_env":o?"oauth_local":"none",T=t.ok&&o;return{adapterId:"hermes",cliAvailable:t.ok,profileBound:o,authSource:m,sessionFingerprint:o?c(n):void 0,checkedAt:e,note:T?`Hermes profile bound (${i.length?`keys: ${i.join(", ")}`:"no API keys detected"})`:[t.note,o?void 0:"no ~/.hermes/.env"].filter(Boolean).join("; ")}}function ae(e={}){let r=e.nowIso?.()??new Date().toISOString(),t=I(r),n={codex:t,cursor:b(r),claude:x(r)},o=Object.values(n).filter(i=>i.ready).length;return{generatedAt:r,bindings:n,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:N(r),hermesOpenAiCodex:g(r),codexAdapterPath:t.path,readyCount:o}}var ce={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 ue(){return Object.values(ce)}var k=["off","observe","enforce"];function de(e){let r=(e??"off").trim().toLowerCase();return k.includes(r)?r:"off"}function _(e=process.env){return de(e.KYNVER_ORCHESTRATION_POLICY_MODE)}function A(e=process.env){let r=e.KYNVER_ORCHESTRATION_ENFORCE_TASKS?.trim().toLowerCase();return r?r==="1"||r==="true"||r==="yes"||r==="on":_(e)==="enforce"}import{createHash as le}from"node:crypto";function f(e){if(e==null)return null;let r=e.trim();return r.length?r:null}function R(e){let r=f(e.sessionId)??"anonymous",t=f(e.title)??f(e.action)??"foreground",n=le("sha256").update([f(e.planId)??"",f(e.parentTaskId)??"",t.toLowerCase()].join("|")).digest("hex").slice(0,16);return`hermes-foreground:${r}:${n}`}function pe(e,r){return e==="enforce"&&r?"enforce_harness_task":e==="observe"?"observe_bypass":"allow_local"}function fe(e,r=process.env){let t=_(r),n=A(r),o=pe(t,n),i=o==="enforce_harness_task"?R({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.":o==="observe_bypass"?s=`Observe mode: ${e.action} bypass logged; local fallback preserved.`:o==="enforce_harness_task"?s=`Enforce mode: ${e.action} must create linked harness AgentTask (${i}).`:s="Local foreground path allowed.",{mode:t,decision:o,idempotencyKey:i,bypassLogged:o==="observe_bypass",reason:s}}export{R as buildForegroundHarnessIdempotencyKey,ae as buildOrchestrationProviderInventory,fe as evaluateOrchestrationPolicy,A as isOrchestrationEnforceTasksEnabled,ue as listOrchestrationProviderCapabilities,_ 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 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};
|