@herjarsa/omo-meta-governor 0.23.0 → 0.24.0

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/config.d.ts CHANGED
@@ -69,6 +69,8 @@ export interface MetaGovernorPluginConfig {
69
69
  phaseAwareDoneSignal?: boolean;
70
70
  /** v0.19.0: persist intervention messages to the session (TUI-visible). */
71
71
  persistToSession?: boolean;
72
+ /** v0.24.0: TUI toast notifications on intervention. Default true. */
73
+ toasts?: boolean;
72
74
  };
73
75
  /** Sisyphus protocol enforcement config. */
74
76
  protocolEnforcement?: {
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import{createRequire as gO}from"node:module";var{defineProperty:A4,getOwnPropertyNames:UO,getOwnPropertyDescriptor:zO}=Object,NO=Object.prototype.hasOwnProperty;function IO(r){return this[r]}var _O=(r)=>{var v=(s1??=new WeakMap).get(r),b;if(v)return v;if(v=A4({},"__esModule",{value:!0}),r&&typeof r==="object"||typeof r==="function"){for(var U of UO(r))if(!NO.call(v,U))A4(v,U,{get:IO.bind(r,U),enumerable:!(b=zO(r,U))||b.enumerable})}return s1.set(r,v),v},s1,OO=(r,v)=>()=>(v||r((v={exports:{}}).exports,v),v.exports);var kO=(r)=>r;function wO(r,v){this[r]=kO.bind(null,v)}var Kr=(r,v)=>{for(var b in v)A4(r,b,{get:v[b],enumerable:!0,configurable:!0,set:wO.bind(v,b)})};var rN=(r,v)=>()=>(r&&(v=r(r=0)),v);var kr=gO(import.meta.url);var L4={};Kr(L4,{logToFile:()=>m,logStructured:()=>GO,getRotatedLogCount:()=>LO,getLogFileSize:()=>HO,LOG_PATH:()=>rr});import{appendFileSync as JO,mkdirSync as KO,statSync as zN,renameSync as XO,existsSync as $v,unlinkSync as PO}from"node:fs";import{resolve as WO,dirname as QO}from"node:path";import{homedir as YO}from"node:os";function NN(r){let v=r;for(let b of VO)v=v.replace(b,"[REDACTED]");return v}function G4(r,v=new WeakSet){if(typeof r==="string")return NN(r);if(Array.isArray(r)){if(v.has(r))return"[Circular]";return v.add(r),r.map((b)=>G4(b,v))}if(r&&typeof r==="object"){if(v.has(r))return"[Circular]";v.add(r);let b={};for(let[U,$]of Object.entries(r))if(cO.test(U))b[U]="[REDACTED]";else try{b[U]=G4($,v)}catch{b[U]="[unserializable]"}return b}return r}function AO(){try{KO(QO(rr),{recursive:!0})}catch{}}function BO(){if(!$v(rr))return;try{if(zN(rr).size<qO)return}catch{return}for(let r=H4;r>=1;r--){let v=r===1?rr:`${rr}.${r-1}`,b=`${rr}.${r}`;if($v(v))try{if(r===H4)PO(v);else XO(v,b)}catch{}}}function IN(r,v,b,U,$){AO(),BO();let z=NN(v),N=b!==void 0?G4(b):void 0,I={timestamp:new Date().toISOString(),level:r,message:z,...U?{event:U}:{},...$?{sessionID:$}:{},...N!==void 0?{data:N}:{}},_;try{_=JSON.stringify(I)+`
2
2
  `}catch{_=JSON.stringify({timestamp:I.timestamp,level:r,message:v,data:"[unserializable]"})+`
3
- `}try{JO(rr,_)}catch{}if(r==="error")console.error(`[meta-governor] ${v}`);else if(r==="warn")console.warn(`[meta-governor] ${v}`);else console.log(`[meta-governor] ${v}`)}function m(r,v,b){IN(r,v,b)}function GO(r){IN(r.level,r.message,r.data,r.event,r.sessionID)}function HO(){try{if($v(rr))return zN(rr).size}catch{}return 0}function LO(){let r=0;for(let v=1;v<=H4;v++)if($v(`${rr}.${v}`))r=v;else break;return r}var VO,cO,rr,qO=10485760,H4=5;var vv=rN(()=>{VO=[/eyJ[a-zA-Z0-9_-]+\.[a-zA-Z0-9_-]+\.[a-zA-Z0-9_-]+/g,/sk-(?:proj-|svc-|)[a-zA-Z0-9]{20,}/g,/pk-[a-zA-Z0-9]{20,}/g,/ghp_[a-zA-Z0-9]{36,}/g,/ghs_[a-zA-Z0-9]{36,}/g,/github_pat_[a-zA-Z0-9]{22,}/g,/Bearer\s+[a-zA-Z0-9_\-]{20,}/gi,/(?:key|secret|token|password|credential|private_key)\s*[:=]\s*['"]?[a-zA-Z0-9_\-]{16,}/gi],cO=/^(?:key|secret|token|password|credential|private_key|api[_-]?key|access[_-]?token|auth[_-]?token)$/i;rr=WO(YO(),".config","opencode","meta-governor.log")});var x1=OO((qX,Kj)=>{Kj.exports={name:"@herjarsa/omo-meta-governor",version:"0.23.0",type:"module",description:"Self-judging agent orchestration layer for OpenCode. Reads memory, scores sessions, dispatches decisions.",exports:{".":{types:"./dist/index.d.ts",import:"./dist/index.js"},"./lib":{types:"./dist/lib.d.ts",import:"./dist/lib.js"}},types:"./dist/index.d.ts",main:"./dist/index.js",files:["dist","README.md"],scripts:{build:"bun build.ts",typecheck:"tsc --noEmit",test:"bun test"},peerDependencies:{"@opencode-ai/plugin":">=1.0.0"},publishConfig:{access:"public",registry:"https://registry.npmjs.org/"},license:"MIT",repository:{type:"git",url:"https://github.com/herjarsa/omo-meta-governor.git"},devDependencies:{"@colbymchenry/codegraph":"^1.5.0","@opencode-ai/plugin":"^1.17.4","@types/node":"^25.9.3",typescript:"^7.0.2"}}});var i_={};Kr(i_,{stripJsoncComments:()=>h_,parseJsonc:()=>C_,loadMetaGovernorConfig:()=>R1,loadJsoncFile:()=>Z1,getUserConfigPath:()=>f_,getProjectConfigPath:()=>y_,deepMerge:()=>d$});import{readFile as Qj,access as Yj}from"node:fs/promises";import{resolve as Vj,join as cj}from"node:path";import{homedir as qj}from"node:os";function h_(r){let v=[],b=0;while(b<r.length){let $=r[b];if($==='"'||$==="'"){let z=$;v.push(z),b++;while(b<r.length){let N=r[b];if(v.push(N),N==="\\"){if(b++,b<r.length)v.push(r[b])}else if(N===z){b++;break}b++}continue}if($==="/"&&b+1<r.length&&r[b+1]==="/"){b+=2;while(b<r.length&&r[b]!==`
3
+ `}try{JO(rr,_)}catch{}if(r==="error")console.error(`[meta-governor] ${v}`);else if(r==="warn")console.warn(`[meta-governor] ${v}`);else console.log(`[meta-governor] ${v}`)}function m(r,v,b){IN(r,v,b)}function GO(r){IN(r.level,r.message,r.data,r.event,r.sessionID)}function HO(){try{if($v(rr))return zN(rr).size}catch{}return 0}function LO(){let r=0;for(let v=1;v<=H4;v++)if($v(`${rr}.${v}`))r=v;else break;return r}var VO,cO,rr,qO=10485760,H4=5;var vv=rN(()=>{VO=[/eyJ[a-zA-Z0-9_-]+\.[a-zA-Z0-9_-]+\.[a-zA-Z0-9_-]+/g,/sk-(?:proj-|svc-|)[a-zA-Z0-9]{20,}/g,/pk-[a-zA-Z0-9]{20,}/g,/ghp_[a-zA-Z0-9]{36,}/g,/ghs_[a-zA-Z0-9]{36,}/g,/github_pat_[a-zA-Z0-9]{22,}/g,/Bearer\s+[a-zA-Z0-9_\-]{20,}/gi,/(?:key|secret|token|password|credential|private_key)\s*[:=]\s*['"]?[a-zA-Z0-9_\-]{16,}/gi],cO=/^(?:key|secret|token|password|credential|private_key|api[_-]?key|access[_-]?token|auth[_-]?token)$/i;rr=WO(YO(),".config","opencode","meta-governor.log")});var x1=OO((qX,Kj)=>{Kj.exports={name:"@herjarsa/omo-meta-governor",version:"0.24.0",type:"module",description:"Self-judging agent orchestration layer for OpenCode. Reads memory, scores sessions, dispatches decisions.",exports:{".":{types:"./dist/index.d.ts",import:"./dist/index.js"},"./lib":{types:"./dist/lib.d.ts",import:"./dist/lib.js"}},types:"./dist/index.d.ts",main:"./dist/index.js",files:["dist","README.md"],scripts:{build:"bun build.ts",typecheck:"tsc --noEmit",test:"bun test"},peerDependencies:{"@opencode-ai/plugin":">=1.0.0"},publishConfig:{access:"public",registry:"https://registry.npmjs.org/"},license:"MIT",repository:{type:"git",url:"https://github.com/herjarsa/omo-meta-governor.git"},devDependencies:{"@colbymchenry/codegraph":"^1.5.0","@opencode-ai/plugin":"^1.17.4","@types/node":"^25.9.3",typescript:"^7.0.2"}}});var i_={};Kr(i_,{stripJsoncComments:()=>h_,parseJsonc:()=>C_,loadMetaGovernorConfig:()=>R1,loadJsoncFile:()=>Z1,getUserConfigPath:()=>f_,getProjectConfigPath:()=>y_,deepMerge:()=>d$});import{readFile as Qj,access as Yj}from"node:fs/promises";import{resolve as Vj,join as cj}from"node:path";import{homedir as qj}from"node:os";function h_(r){let v=[],b=0;while(b<r.length){let $=r[b];if($==='"'||$==="'"){let z=$;v.push(z),b++;while(b<r.length){let N=r[b];if(v.push(N),N==="\\"){if(b++,b<r.length)v.push(r[b])}else if(N===z){b++;break}b++}continue}if($==="/"&&b+1<r.length&&r[b+1]==="/"){b+=2;while(b<r.length&&r[b]!==`
4
4
  `)b++;continue}if($==="/"&&b+1<r.length&&r[b+1]==="*"){b+=2;while(b<r.length){if(r[b]==="*"&&b+1<r.length&&r[b+1]==="/"){b+=2;break}b++}continue}v.push($),b++}let U=v.join("");for(let $=0;$<10;$++){let z=U;if(U=U.replace(/,(\s*[\]}])/g,"$1"),U===z)break}return U}function C_(r){try{let v=h_(r);return JSON.parse(v)}catch{return}}function f_(){return Vj(qj(),".config","opencode",T_)}function y_(r){let v=r??process.cwd();return cj(v,".opencode",T_)}async function Aj(r){try{return await Yj(r),!0}catch{return!1}}async function Z1(r){if(!await Aj(r))return;try{let v=await Qj(r,"utf-8");return C_(v)}catch{return}}function d$(r,v){let b={...r};for(let U of Object.keys(v)){let $=v[U],z=b[U];if($===void 0)continue;if(R_($)&&R_(z))b[U]=d$(z,$);else b[U]=$}return b}function R_(r){return typeof r==="object"&&r!==null&&!Array.isArray(r)}async function R1(r={}){let v=[],b="defaults",U={},$=f_(),z=await Z1($);if(z)U=d$(U,z),v.push(`user:${$}`),b="user";let N=y_(r.projectDir),I=await Z1(N);if(I)U=d$(U,I),v.push(`project:${N}`),b="project";if(r.cliOptions&&Object.keys(r.cliOptions).length>0)U=d$(U,r.cliOptions),v.push("cli:inline"),b="cli";return{config:U,sources:v,effectiveSource:b}}var T_="omo-meta-governor.jsonc";var T1=()=>{};import{execSync as D4,spawn as _N}from"node:child_process";import{access as NJ,stat as QN}from"node:fs/promises";import{resolve as zv}from"node:path";import{homedir as SO}from"node:os";import{spawn as jO,spawnSync as Dr}from"node:child_process";function $N(r){try{let v=Dr("pgrep",["-P",String(r)],{encoding:"utf8"});for(let b of v.stdout.trim().split(/\s+/)){let U=Number(b);if(!U)continue;$N(U);try{process.kill(U,"SIGKILL")}catch{}}}catch{}}function Cr(r){if(!r||r<=0)return;try{if(process.platform==="win32")Dr("taskkill",["/pid",String(r),"/T","/F"],{stdio:"ignore"});else{try{process.kill(-r,"SIGKILL")}catch{}$N(r);try{process.kill(r,"SIGKILL")}catch{}}}catch{}}var vN=new Set;function B4(r){if(r&&r>0)vN.add(r)}function rv(r){vN.delete(r)}function bN(r,v,b){return new Promise((U)=>{let $;try{$=jO(r,v,{cwd:b.cwd,stdio:["ignore","pipe","pipe"],shell:process.platform==="win32",env:{...process.env,OMO_MG_SPAWN:"1",...b.env}})}catch{U({stdout:"",stderr:"",code:null,timedOut:!1});return}B4($.pid);let z="",N="",I=!1,_=!1,O,g=(J)=>{if(_)return;if(_=!0,clearTimeout(Y),O)clearTimeout(O);rv($.pid),U(J)},Y=setTimeout(()=>{I=!0,Cr($.pid),O=setTimeout(()=>{g({stdout:z,stderr:N,code:null,timedOut:!0})},2000)},b.timeoutMs);$.stdout?.on("data",(J)=>{z+=J.toString("utf8")}),$.stderr?.on("data",(J)=>{N+=J.toString("utf8")}),$.on("error",()=>{g({stdout:z,stderr:N,code:null,timedOut:I})}),$.on("close",(J)=>{if($.exitCode===null)Cr($.pid);g({stdout:z,stderr:N,code:J,timedOut:I})})})}function Ar(r,v,b){let U=Date.now(),$;try{$=Dr(r,v,{cwd:b.cwd,stdio:["ignore","pipe","pipe"],shell:process.platform==="win32",env:{...process.env,OMO_MG_SPAWN:"1",...b.env},timeout:b.timeoutMs})}catch{return{stdout:"",stderr:"",code:null,timedOut:!1}}let z=Date.now()-U,N=$.error!=null&&$.error.code==="ETIMEDOUT"||$.signal==="SIGTERM"||z>=b.timeoutMs-50;if(N&&$.pid)Cr($.pid);return{stdout:($.stdout??"").toString("utf8"),stderr:($.stderr??"").toString("utf8"),code:$.status,timedOut:N}}function UN(){let r=0;try{if(process.platform==="win32"){for(let v of["graphify.exe","codegraph.exe"])try{Dr("taskkill",["/IM",v,"/F"],{stdio:"ignore"})}catch{}try{if(Dr("powershell",["-NoProfile","-Command","Get-CimInstance Win32_Process | Where-Object { $_.CommandLine -match 'OMO_MG_WATCH|OMO_MG_SPAWN' } | ForEach-Object { Stop-Process -Id $_.ProcessId -Force -ErrorAction SilentlyContinue }"],{stdio:"ignore"}).status===0)r=1}catch{}}else{for(let v of["graphify","codegraph"])try{Dr("pkill",["-x",v],{stdio:"ignore"})}catch{}try{Dr("pkill",["-f","OMO_MG_WATCH|OMO_MG_SPAWN"],{stdio:"ignore"})}catch{}}}catch{}return r}async function ON(r,v=60000){return Ar("npm",["i","-D","@colbymchenry/codegraph"],{cwd:r,timeoutMs:v}).code===0?"codegraph-installed":"codegraph-install-failed"}async function kN(r=60000){if(Ar("pip",["install","graphifyy","--break-system-packages","--quiet"],{timeoutMs:r}).code===0)return"graphify-installed";return Ar("uv",["tool","install","graphifyy","--quiet"],{timeoutMs:r}).code===0?"graphify-installed":"graphify-install-failed"}var S4=new Set;function kJ(){S4.clear()}var wN=new Map,gN=!1;function YN(r){let b=(wN.get(r)??0)+1;return wN.set(r,b),b}async function jN(r,v=D4){let b=!1,U=!1,$=await KN(zv(r,".codegraph","codegraph.db")),z=await KN(zv(r,"graphify-out","graph.json"));try{v("npx --yes codegraph --version",{stdio:"ignore",timeout:1e4}),b=!0}catch{try{v("node node_modules/.bin/codegraph --version",{cwd:r,stdio:"ignore",timeout:5000}),b=!0}catch{}}try{v("graphify --version",{stdio:"ignore",timeout:5000}),U=!0}catch{try{v("graphifyy --version",{stdio:"ignore",timeout:5000}),U=!0}catch{try{v('python -c "import graphifyy"',{stdio:"ignore",timeout:5000}),U=!0}catch{try{v('python3 -c "import graphifyy"',{stdio:"ignore",timeout:5000}),U=!0}catch{}}}}return{codegraph:b,graphify:U,codegraphIndexExists:$,graphifyIndexExists:z}}async function EO(r,v=60000,b=D4){try{return b("npx --yes codegraph init",{cwd:r,stdio:"ignore",timeout:v}),!0}catch{return!1}}async function uO(r,v=120000,b=D4){let U=["graphify . --no-viz","python -m graphify . --no-viz","python3 -m graphify . --no-viz"];for(let $ of U)try{return b($,{cwd:r,stdio:"ignore",timeout:v}),!0}catch{}return!1}var z$=new Map;function JN(r,v){let b=`${r}:${v}`;if(z$.has(b))return;try{let U;if(v==="codegraph")U=_N("node",["-e",`
5
5
  const OMO_MG_WATCH = 1;
6
6
  const {execSync} = require("child_process");
@@ -11,7 +11,7 @@ import{createRequire as gO}from"node:module";var{defineProperty:A4,getOwnPropert
11
11
  run();
12
12
  setInterval(run, 30_000);
13
13
  `],{stdio:"ignore",detached:!0,env:{...process.env,OMO_MG_SPAWN:"1"}});else U=_N("python3",["-m","graphify",".","--no-viz","--watch"],{cwd:r,stdio:"ignore",detached:!0,env:{...process.env,OMO_MG_SPAWN:"1"}});U.unref(),z$.set(b,{process:U,tool:v}),B4(U.pid),U.on("exit",()=>{z$.delete(b),rv(U.pid)})}catch{}}function wJ(r){for(let[v,b]of z$)if(!r||v.startsWith(r)){let U=b.process.pid;if(U)rv(U);if(process.platform==="win32")Cr(U);else{try{b.process.kill("SIGTERM")}catch{}setTimeout(()=>{Cr(U)},2000).unref()}z$.delete(v)}}async function Nv(r={enabled:!0,watch:!1,autoInstall:!0,installTimeoutMs:60000}){let v=[],b=r.projectDir??process.cwd();if(!r.enabled)return{attempted:!1,codes:["disabled"],availability:{codegraph:!1,graphify:!1,codegraphIndexExists:!1,graphifyIndexExists:!1},alreadyInitialized:!1};if(r.killOrphanedOnInit!==!1&&!gN){gN=!0;let $=UN();E4("info","orphan sweep: killed "+$+" leftover tool processes")}if(S4.has(b)){let $=await jN(b,r.runner);return{attempted:!1,codes:$.codegraphIndexExists?["codegraph-already-exists"]:[],availability:$,alreadyInitialized:!0}}S4.add(b);let U;try{U=await jN(b,r.runner)}catch{return{attempted:!1,codes:["error"],availability:{codegraph:!1,graphify:!1,codegraphIndexExists:!1,graphifyIndexExists:!1},alreadyInitialized:!1}}if(r.autoUpgrade!==!1)try{let $=mO(),z=await MO($),N=r.upgradeCheckTtlMs??86400000;if(U.codegraph){let _=await RO();if(XN(_,null,z,N)){let O=await PN();if(O&&u4(_,O)){if(await ON(b,r.installTimeoutMs??60000)==="codegraph-installed")v.push("codegraph-upgraded")}}}if(U.graphify){let _=await TO();if(XN(_,null,z,N)){let O=await WN();if(O&&u4(_,O)){if(await kN(r.installTimeoutMs??60000)==="graphify-installed")v.push("graphify-upgraded")}}}let I=Date.now();try{let _=await PN(),O=await WN();await nO($,{checkedAtMs:I,codegraphLatest:_??void 0,graphifyLatest:O??void 0})}catch{}}catch{v.push("upgrade-check-skipped")}if(r.autoInstall!==!1){if(!U.codegraph){let $=await ON(b,r.installTimeoutMs??60000);if(v.push($),$==="codegraph-installed")U.codegraph=!0}if(!U.graphify){let $=await kN(r.installTimeoutMs??60000);if(v.push($),$==="graphify-installed")U.graphify=!0}}else{if(!U.codegraph)v.push("codegraph-install-skipped");if(!U.graphify)v.push("graphify-install-skipped")}if(U.codegraph)if(!U.codegraphIndexExists){let $=await EO(b,r.installTimeoutMs??60000);v.push($?"codegraph-initialized":"codegraph-init-failed")}else v.push("codegraph-already-exists");else v.push("codegraph-unavailable");if(U.graphify){if(!U.graphifyIndexExists){let $=await uO(b,r.installTimeoutMs??120000);v.push($?"graphify-initialized":"graphify-init-failed")}else v.push("graphify-already-exists");try{if(!await DO(b)){if(Ar("graphify",["hook","install"],{cwd:b,timeoutMs:1e4}).code===0)v.push("graphify-hook-installed")}}catch{}}else v.push("graphify-unavailable");if(r.watch){if(U.codegraph)JN(b,"codegraph"),v.push("watch-started-codegraph");if(U.graphify)JN(b,"graphify"),v.push("watch-started-graphify")}return{attempted:!0,codes:v,availability:U,alreadyInitialized:!1}}async function Uv(r){try{return(await QN(r)).isDirectory()}catch{return!1}}async function KN(r){try{return(await QN(r)).isFile()}catch{return!1}}function x4(r){if(typeof r!=="string"||r.length===0)return!1;let v=r.replace(/\\\n/g," ").replace(/\s*\n\s*/g," ");return/(?:^|[\s;&|])git\s+commit(?:\s+-|\s|$)/.test(v)}async function VN(r,v){if(await Uv(zv(r,".codegraph")))return await xO(r,v);return await Nv({enabled:!0,watch:!1,autoInstall:!1,installTimeoutMs:5000,projectDir:r,runner:v})}async function DO(r){let{access:v,readFile:b}=await import("node:fs/promises"),{resolve:U}=await import("node:path"),$=U(r,".git","hooks","post-commit");try{await v($)}catch{return!1}try{return(await b($,"utf-8")).includes("graphify-hook-start")}catch{return!1}}async function xO(r,v){let{resolve:b}=await import("node:path"),U=[],$=await Uv(b(r,".codegraph"));if($){try{if(v)v("npx --yes codegraph sync -q",{cwd:r,stdio:"ignore",timeout:30000});else Ar("npx",["--yes","codegraph","sync","-q"],{cwd:r,timeoutMs:30000});U.push("codegraph-already-exists"),E4("info",`codegraph sync -q completed for ${r}`)}catch(N){E4("warn",`codegraph sync failed for ${r}: ${N}`),U.push("codegraph-install-failed")}return{attempted:!0,codes:U,availability:{codegraph:!0,graphify:!1,codegraphIndexExists:$,graphifyIndexExists:await Uv(b(r,"graphify-out"))},alreadyInitialized:!1}}let z=!1;try{if(v)v("npx --yes codegraph --version",{stdio:"ignore",timeout:5000});else if(Ar("npx",["--yes","codegraph","--version"],{timeoutMs:5000}).code!==0)throw Error("codegraph probe failed");z=!0}catch{try{if(v)v("node node_modules/.bin/codegraph --version",{cwd:r,stdio:"ignore",timeout:5000});else if(Ar("node",["node_modules/.bin/codegraph","--version"],{cwd:r,timeoutMs:5000}).code!==0)throw Error("local codegraph probe failed");z=!0}catch{}}if(!z)return{attempted:!0,codes:["codegraph-unavailable"],availability:{codegraph:!1,graphify:!1,codegraphIndexExists:$,graphifyIndexExists:await Uv(b(r,"graphify-out"))},alreadyInitialized:!1};return await Nv({enabled:!0,watch:!1,autoInstall:!1,installTimeoutMs:5000,projectDir:r,runner:v})}var bv=null;async function FO(){if(bv)return bv;let r=await Promise.resolve().then(() => (vv(),L4));return bv=(v,b)=>r.logToFile(v,b),bv}async function E4(r,v){(await FO())(r,v)}function u4(r,v){if(r==null&&v)return!0;if(!v)return!1;let b=r,U=v;if(!b||b===U)return!1;let $=/^[0-9]+\.[0-9]+\.[0-9]+(-[0-9A-Za-z.-]+)?$/;if(!$.test(b)||!$.test(U))return!1;let z=(K)=>{let[c="",q=""]=K.split("-",2),H=c.split(".").map((_r)=>{let B=Number.parseInt(_r,10);return Number.isFinite(B)?B:0}),[u=0,D=0,T=0]=H;return[u,D,T,q]},[N,I,_,O]=z(b),[g,Y,J,w]=z(U);if(g!==N)return g>N;if(Y!==I)return Y>I;if(J!==_)return J>_;if(O&&!w)return!0;if(!O&&w)return!1;return w>O}function mO(){return zv(SO(),".config","opencode","omo-meta-governor-upgrade-check.json")}async function MO(r){try{let{readFile:v}=await import("node:fs/promises"),b=await v(r,"utf-8"),U=JSON.parse(b);if(typeof U?.checkedAtMs==="number")return U;return null}catch{return null}}async function nO(r,v){let{dirname:b}=await import("node:path"),{mkdir:U,writeFile:$}=await import("node:fs/promises"),z=b(r);try{await U(z,{recursive:!0}),await $(r,JSON.stringify(v,null,2))}catch{}}function ZO(r,v){if(!r)return!1;let b=Date.now()-r.checkedAtMs;return b>=0&&b<v}function XN(r,v,b,U){let $=v;if(ZO(b,U))$=b?.codegraphLatest??$;if(!r&&!$)return!1;if(!$)return!1;if(!r)return!0;return u4(r,$)}async function PN(){let{execSync:r}=await import("node:child_process");try{let b=r("npm view @colbymchenry/codegraph version",{stdio:["ignore","pipe","ignore"],timeout:1e4}).toString().trim();return b.length>0?b:null}catch{return null}}async function WN(){let{execSync:r}=await import("node:child_process");try{let U=(r("python3 -m pip index versions graphifyy",{stdio:["ignore","pipe","ignore"],timeout:1e4}).toString().split(`
14
- `)[0]??"").match(/graphifyy\s*\(?([0-9]+\.[0-9]+\.[0-9]+[^\s)]*)/);if(U)return U[1]}catch{}try{let b=r(`python3 -c "import urllib.request, json; d=json.load(urllib.request.urlopen('https://pypi.org/pypi/graphifyy/json')); print(d['info']['version'])"`,{stdio:["ignore","pipe","ignore"],timeout:1e4}).toString().trim();return b.length>0?b:null}catch{return null}}async function RO(){let{execSync:r}=await import("node:child_process");try{let b=r("npx --yes codegraph --version",{stdio:["ignore","pipe","ignore"],timeout:1e4}).toString().trim();return b.length>0?b:null}catch{return null}}async function TO(){let{execSync:r}=await import("node:child_process");try{let b=r("python3 -m pip show graphifyy",{stdio:["ignore","pipe","ignore"],timeout:1e4}).toString().match(/Version:\s*([0-9]+\.[0-9]+\.[0-9]+[^\s]*)/);if(b)return b[1]}catch{}try{let b=r("python3 -m pip show graphify",{stdio:["ignore","pipe","ignore"],timeout:1e4}).toString().match(/Version:\s*([0-9]+\.[0-9]+\.[0-9]+[^\s]*)/);if(b)return b[1]}catch{return null}return null}var cN={limits:{maxLessons:10,maxSlots:20,maxTasks:10},timeouts:{agentmemoryMs:2000,boulderStateMs:1000}};async function GN(r,v){let b=performance.now(),U={...cN.limits,...r.limits},$={...cN.timeouts,...r.timeouts},[z,N]=await Promise.allSettled([hO(r,v.agentmemory,U,$.agentmemoryMs),CO(r,v.boulderState,U,$.boulderStateMs)]),I=[],_={},O=z.status==="fulfilled"?z.value:(AN(I,_,"agentmemory",qN(z.reason)),BN.agentmemory),g=N.status==="fulfilled"?N.value:(AN(I,_,"boulderState",qN(N.reason)),BN.boulderState);return{query:r.query,timestampISO:new Date().toISOString(),agentmemory:O,boulderState:g,degradedSources:I,durationMs:performance.now()-b,errorMessages:_}}async function hO(r,v,b,U){let $=await HN(v.smartSearch({query:r.query,limit:b.maxLessons}),U,"agentmemory");return{available:!0,lessons:fO($.lessons).slice(0,b.maxLessons).map((N)=>({id:N.id,title:N.title,advice:N.advice??"info",confidence:N.confidence,concepts:N.concepts}))}}async function CO(r,v,b,U){let $=await HN(v.boulderRead({directory:r.directory,sessionID:r.sessionID,query:r.query}),U,"boulderState");return{available:!0,tasks:$.sort((N,I)=>N.priority-I.priority||I.updatedAtMs-N.updatedAtMs).slice(0,b.maxTasks).map((N)=>({id:N.id,status:N.status,title:N.title})),planProgress:yO($)}}function fO(r){return[...r].sort((v,b)=>b.confidence-v.confidence)}function yO(r){if(r.length===0)return 0;return r.filter((b)=>b.status==="done").length/r.length}function qN(r){if(r instanceof Error)return r.message;if(typeof r==="string")return r;return"unknown error"}function AN(r,v,b,U){r.push(b),v[b]=U}var BN={agentmemory:{available:!1,lessons:[]},boulderState:{available:!1,tasks:[],planProgress:0}};async function HN(r,v,b){return new Promise((U,$)=>{let z=setTimeout(()=>$(Error(`${b} timeout after ${v}ms`)),v);r.then((N)=>{clearTimeout(z),U(N)},(N)=>{clearTimeout(z),$(N)})})}function JJ(){return{compactBurnRateThreshold:500,compactUsageThreshold:0.85,switchModelUsageThreshold:0.95,delegateConsecutiveHighBurn:5,windowSize:10}}function iO(r){if(r.length===0)return 0;return r.reduce((b,U)=>b+U,0)/r.length}function oO(r,v){let b=0;for(let U=r.length-1;U>=0;U--)if(r[U]>=v)b++;else break;return b}function lO(r,v,b,U){let $=v-r;if($<=0)return U;if(b<=0)return null;let z=Math.floor($/b);if(z<=0)return U;let N=z*2;return new Date(new Date(U).getTime()+N*1000).toISOString()}function LN(r){let{currentUsage:v,modelLimit:b,recentTurnTokens:U,timestampISO:$,config:z}=r,N=U.slice(-z.windowSize),I=iO(N),_=b-v,O=b>0?v/b:1,g=Math.min(0.95,0.3+N.length/z.windowSize*0.65),Y="no-action",J=[],w="within normal parameters";if(O>=z.switchModelUsageThreshold)w=`context usage ${(O*100).toFixed(1)}% exceeds switch threshold ${(z.switchModelUsageThreshold*100).toFixed(1)}%`,J.push("switch-model");if(O>=z.compactUsageThreshold||I>=z.compactBurnRateThreshold){if(Y==="no-action")Y="compact-now",w=O>=z.compactUsageThreshold?`context usage ${(O*100).toFixed(1)}% exceeds compact threshold ${(z.compactUsageThreshold*100).toFixed(1)}%`:`burn rate ${I.toFixed(0)} tokens/turn exceeds threshold ${z.compactBurnRateThreshold}`}let K=oO(N,z.compactBurnRateThreshold);if(K>=z.delegateConsecutiveHighBurn&&Y==="no-action")w=`${K} consecutive high-burn turns (threshold: ${z.delegateConsecutiveHighBurn})`,J.push("delegate-to-subagent");let c=lO(v,b,I,$);return{currentUsage:v,burnRate:I,budgetLeft:_,willOverflowAt:c,recommendation:Y,recommendations:J,confidence:g,modelLimit:b,windowRemaining:Math.max(0,Math.floor(_/Math.max(I,1))),input:{...r},computedAtISO:$,turnsAnalyzed:N.length}}var wr={"oracle-verified":0.25,"no-progress-detector":0.2,"deviation-detector":0.2,"iteration-budget":0.15,"lesson-recall":0.1,"token-predictor":0.1},F4=()=>({continueThreshold:0.3,warnThreshold:0.3,escalateThreshold:0.45,stopThreshold:0.55,paralysisThreshold:3,defaultEscalationTarget:"oracle"});function tO(r){let v=[];v.push({source:"oracle-verified",rawScore:r.oracleVerified?0.6:0,weight:wr["oracle-verified"],weightedScore:r.oracleVerified?0.6*wr["oracle-verified"]:0,description:r.oracleVerified?"Oracle verification passed":"No Oracle verification"}),v.push({source:"no-progress-detector",rawScore:r.noProgress?-0.8:0,weight:wr["no-progress-detector"],weightedScore:r.noProgress?-0.8*wr["no-progress-detector"]:0,description:r.noProgress?"No progress detected in last turn":"Progress detected"});let b=dO(r.deviations);v.push({source:"deviation-detector",rawScore:b,weight:wr["deviation-detector"],weightedScore:b*wr["deviation-detector"],description:r.deviations.length>0?`${r.deviations.length} deviation(s) detected (worst: ${r.deviations[0].severity})`:"No deviations detected"});let U=pO(r.iterationRatio);v.push({source:"iteration-budget",rawScore:U,weight:wr["iteration-budget"],weightedScore:U*wr["iteration-budget"],description:`Iteration ratio: ${r.iterationRatio.toFixed(2)} (${r.ambient.iteration}/${r.ambient.maxIterations})`});let $=eO(r.lessonsRelevant);return v.push({source:"lesson-recall",rawScore:$,weight:wr["lesson-recall"],weightedScore:$*wr["lesson-recall"],description:r.lessonsRelevant.length>0?`${r.lessonsRelevant.length} relevant lesson(s) (avg confidence: ${aO(r.lessonsRelevant).toFixed(2)})`:"No relevant lessons"}),v}function dO(r){if(r.length===0)return 0;let v={grave:-0.9,media:-0.5,leve:-0.2},b=0;for(let $ of r){let z=v[$.severity]??-0.3;if(z<b)b=z}let U=Math.min(r.length*0.05,0.2);return Math.max(b-U,-1)}function pO(r){if(r<=0.5)return-r*0.6;return-0.3-(r-0.5)*1}function eO(r){if(r.length===0)return 0;let v=0;for(let b of r)v+=({continue:0.3,info:0,warn:-0.3,stop:-0.7}[b.advice]??0)*b.confidence;return Math.max(Math.min(v/r.length,1),-1)}function aO(r){if(r.length===0)return 0;return r.reduce((v,b)=>v+b.confidence,0)/r.length}function sO(r,v){if(r>=v.continueThreshold)return"continue";if(r<=-v.stopThreshold)return"stop";if(r<=-v.escalateThreshold)return"escalate";if(r<=-v.warnThreshold)return"warn";return"continue"}function rk(r,v){if(!r.oracleVerified)return"oracle";if(r.deviations.some((b)=>b.severity==="grave"))return"user";return v.defaultEscalationTarget}function SN(r,v,b,U){if(U)return`Paralysis detected: forced continue despite score ${r.toFixed(3)} (too many consecutive stops)`;let $=[...b].sort((O,g)=>O.weightedScore-g.weightedScore),z=$[0],N=$[$.length-1],I=[];if(z.weightedScore<0)I.push(`primary concern: ${z.description}`);if(N.weightedScore>0)I.push(`positive signal: ${N.description}`);return`${{continue:"Continue",warn:"Warn",escalate:"Escalate",stop:"Stop"}[v]} (score: ${r.toFixed(3)}): ${I.join("; ")||"balanced signals"}`}function EN(r,v){let b={...F4(),...v};if(!Number.isFinite(r.iterationRatio)||!Number.isFinite(r.ambient.iteration)||!Number.isFinite(r.ambient.maxIterations))return{decision:{action:"continue",score:0,reasoning:"Score neutral: NaN detected in input(s); defaulting to continue.",evidence:[],shouldEscalateTo:null},contributions:[],rawScore:0,paralysisOverride:!1,computedAtISO:new Date().toISOString()};let U=tO(r),$=U.reduce((Y,J)=>Y+J.weightedScore,0),z=Math.max(Math.min($,1),-1),N=r.slotMemory.consecutiveStops>=b.paralysisThreshold&&z<=-b.warnThreshold,I=N?"continue":sO(z,b),_=[];if(I!=="continue"||Math.abs(z)<b.continueThreshold){for(let Y of U)if(Math.abs(Y.weightedScore)>0.01)_.push({source:Y.source,value:Y.description,confidence:Math.abs(Y.rawScore),weight:Y.weight});if(_.length===0&&I!=="continue")_.push({source:"ambient",value:SN(z,I,U,N),confidence:0.5,weight:0.1})}let O=I==="escalate"?rk(r,b):null;return{decision:{action:I,score:z,reasoning:SN(z,I,U,N),evidence:_,shouldEscalateTo:O},contributions:U,rawScore:z,paralysisOverride:N,computedAtISO:new Date().toISOString()}}var m4=()=>({enabled:!0,maxHistoryPerSession:50,forceContinueAfterStops:3,warnMessageTemplate:"[MetaGovernor] Score {score}: {reasoning}. Evidence: {evidenceCount} signal(s).",escalateMessageTemplate:"[MetaGovernor] Escalating to {target}: {reasoning}",stopMessageTemplate:"[MetaGovernor] STOP — {reasoning}. Evidence: {evidenceCount} signal(s)."});function Iv(r,v){let b=r;for(let[U,$]of Object.entries(v))b=b.replaceAll(`{${U}}`,$);return b}function $k(r){return r.length}function uN(r,v){let b={...m4(),...v};if(!b.enabled)return{action:"continue",message:null,historyEntry:{decision:r.scoringResult.decision,action:"continue",timestampISO:new Date().toISOString(),sessionID:r.sessionID,reasoning:"Decision handler disabled — pass-through continue"}};let U=r.scoringResult.decision,$=U.score,z=U.reasoning,N=$k(U.evidence),I=U.shouldEscalateTo??b.defaultEscalationTarget??"oracle";if(r.scoringResult.paralysisOverride)return{action:"continue",message:Iv(b.warnMessageTemplate,{score:$.toFixed(3),reasoning:`Paralysis detected — forced continue. ${z}`,evidenceCount:String(N)}),historyEntry:{decision:U,action:"continue",timestampISO:new Date().toISOString(),sessionID:r.sessionID,reasoning:`Paralysis override: ${z}`}};switch(U.action){case"continue":return{action:"continue",message:null,historyEntry:{decision:U,action:"continue",timestampISO:new Date().toISOString(),sessionID:r.sessionID,reasoning:z}};case"warn":return{action:"warn",message:Iv(b.warnMessageTemplate,{score:$.toFixed(3),reasoning:z,evidenceCount:String(N)}),historyEntry:{decision:U,action:"warn",timestampISO:new Date().toISOString(),sessionID:r.sessionID,reasoning:z}};case"escalate":return{action:"escalate",message:Iv(b.escalateMessageTemplate,{target:I,reasoning:z}),historyEntry:{decision:U,action:"escalate",timestampISO:new Date().toISOString(),sessionID:r.sessionID,reasoning:`Escalate to ${I}: ${z}`}};case"stop":return{action:"stop",message:Iv(b.stopMessageTemplate,{reasoning:z,evidenceCount:String(N)}),historyEntry:{decision:U,action:"stop",timestampISO:new Date().toISOString(),sessionID:r.sessionID,reasoning:z}}}}function PJ(r,v){if(r.length<=v)return{trimmed:[...r],dropped:0};let b=r.length-v;return{trimmed:r.slice(-v),dropped:b}}function WJ(r){let v=0;for(let b=r.length-1;b>=0;b--)if(r[b].action==="stop")v++;else break;return v}var DN={leve:0,media:1,grave:2};function vk(r,v,b){let U=`${r}-${v}-${b}`.split("").reduce(($,z)=>($<<5)-$+z.charCodeAt(0)|0,0);return`D-${Math.abs(U).toString(36)}`}function xN(r,v){let b=DN[v]??0;return r.some((U)=>(DN[U.severity]??0)>=b)}function bk(r,v=[]){let b=new Set;for(let U of r)if(b.add(U.category),b.add(U.severity),U.filePath){let $=U.filePath.split("/").pop()??U.filePath;b.add($)}for(let U of v){let $=U.split("/").pop()??U;if($)b.add($)}return[...b]}function Uk(r,v){let b=v.map((U)=>`[${U.severity}] ${U.category}: ${U.detail}`).join("; ");return`Action "${r.action}" (score ${r.score.toFixed(2)}) after deviations: ${b}. Reasoning: ${r.reasoning}`}async function FN(r,v){let{decision:b,config:U,sessionID:$,directory:z,filesChanged:N}=r,I=new Date().toISOString();if(!U.enabled)return{lessonSaved:null,decisionSaved:null,reason:"closed-loop learning disabled"};if(b.evidence.length===0&&b.action==="continue")return{lessonSaved:null,decisionSaved:null,reason:"no deviations to learn from"};let _=null,O=null;if(U.saveDecisions){let K={id:vk($,b.action,I),timestampISO:I,action:b.action,score:b.score,reasoning:b.reasoning,sessionID:$,directory:z,deviations:b.evidence.filter((c)=>c.source==="deviation-detector").map((c)=>({severity:"media",category:c.source,detail:c.value}))};try{await v.saveMemory({content:`Decision: ${b.action} (score ${b.score.toFixed(2)}). ${b.reasoning}`,concepts:["meta-governor","decision",b.action],type:"fact",files:[...N]}),O=K}catch{}}let g=b.evidence.filter((K)=>K.source==="deviation-detector").map((K)=>({severity:"media",category:K.source,detail:K.value})),Y=r.currentLessonCount??0;if(Y>=U.maxLessonsPerSession)return{lessonSaved:null,decisionSaved:O,reason:`maxLessonsPerSession cap reached (${Y} >= ${U.maxLessonsPerSession})`};let J=U.saveLessons!==!1;if(J&&xN(g,U.minSeverityToLearn)){let K=bk(g,N),c=Uk(b,g);try{_={id:(await v.saveLesson({content:c,context:`session:${$} dir:${z}`,confidence:Math.max(0.3,Math.min(0.8,Math.abs(b.score))),tags:K})).id,title:`${b.action} after ${g[0]?.category??"deviation"}`,content:c,type:"pattern",concepts:K,confidence:Math.max(0.3,Math.min(0.8,Math.abs(b.score))),files:[...N],sessionID:$}}catch{}}let w=[];if(O)w.push("decision saved");if(_)w.push("lesson saved");if(!O&&!_)if(!J)w.push("saveLessons disabled");else if(!xN(g,U.minSeverityToLearn))w.push("severity below threshold");else w.push("no saveable content");return{lessonSaved:_,decisionSaved:O,reason:w.join("; ")||"no action taken"}}function _v(){return{enabled:!0,minSeverityToLearn:"media",maxLessonsPerSession:20,saveDecisions:!0,saveLessons:!0}}var zk=()=>({enabled:!0,memory:{enabled:!0,query:"",timeoutMs:3000},tokenPredictor:{},scoring:{},decision:{},closedLoop:{},intervention:{mode:"silent",includeDecisionHistory:!0,maxHistoryMessages:5,minActionForMessage:"stop",maxInterventionsPerSession:3,respectDoneSignal:!0,phaseAwareDoneSignal:!1,persistToSession:!0},protocolEnforcement:{enabled:!1,path:void 0,injectIntoSystem:!1,auditToolCalls:!1},skillPriming:{enabled:!1,trigger:"firstImplement",router:"both"}}),M4={query:"",timestampISO:new Date().toISOString(),agentmemory:{available:!1,lessons:[]},boulderState:{available:!1,tasks:[],planProgress:0},degradedSources:["agentmemory","boulderState"]},Nk={consecutiveStops:0,consecutiveContinues:0,lastUpdatedISO:new Date().toISOString()},Ik={action:"continue",message:null,historyEntry:{decision:{action:"continue",score:0,reasoning:"no decision made",evidence:[],shouldEscalateTo:null},action:"continue",timestampISO:new Date().toISOString(),sessionID:"",reasoning:"no decision made"}};function _k(r,v=M4){let b=r.maxIterations>0?r.iteration/r.maxIterations:0,U={...Nk,consecutiveStops:r.consecutiveStops??0};return{oracleVerified:r.oracleVerified,noProgress:r.noProgress,deviations:r.deviations,iterationRatio:b,lessonsRelevant:v.agentmemory.lessons,slotMemory:U,ambient:{sessionID:r.sessionID,directory:".",mode:"simple",agentName:r.agentName??"unknown",iteration:r.iteration,maxIterations:r.maxIterations}}}async function MN(r,v={}){let b={...zk(),...v};if(!b.enabled)return{memoryRead:M4,tokenPrediction:mN(r),scoringResult:{decision:{action:"continue",score:0,reasoning:"MetaGovernor disabled",evidence:[],shouldEscalateTo:null},contributions:[],rawScore:0,paralysisOverride:!1,computedAtISO:new Date().toISOString()},decision:Ik,lessonSaved:null,decisionHistory:[],skipped:!0,skipReason:"disabled"};let U=M4;if(b.memory.enabled)try{let O={agentmemory:r.backends.agentmemory,boulderState:r.backends.boulderState};U=await GN({directory:".",sessionID:r.sessionID,query:b.memory.query||r.toolName},O)}catch{}let $;try{$=LN({currentUsage:r.recentTurnTokens.reduce((O,g)=>O+g,0),modelLimit:r.modelLimit??v.modelOverride?.modelLimit??200000,recentTurnTokens:r.recentTurnTokens,timestampISO:new Date().toISOString(),providerID:r.providerID??"",modelID:r.modelID??"",config:b.tokenPredictor})}catch{$=mN(r)}let z=EN(_k(r,U),b.scoring),N={sessionID:r.sessionID,scoringResult:z},I=uN(N,b.decision),_=null;try{if(b.closedLoop.enabled!==!1)_=await FN({decision:I.historyEntry.decision,memoryRead:U,config:{..._v(),...b.closedLoop},sessionID:r.sessionID,directory:".",filesChanged:r.filePaths??[],currentLessonCount:r.currentLessonCount},r.writeBackend)}catch{}return{memoryRead:U,tokenPrediction:$,scoringResult:z,decision:I,lessonSaved:_,decisionHistory:[I.historyEntry],skipped:!1}}function mN(r){let v=r.recentTurnTokens.reduce((b,U)=>b+U,0);return{burnRate:0,budgetLeft:200000,currentUsage:v,modelLimit:200000,willOverflowAt:null,recommendation:"no-action",confidence:1,windowRemaining:200000,input:{currentUsage:v,modelLimit:200000,recentTurnTokens:r.recentTurnTokens,timestampISO:new Date().toISOString(),providerID:r.providerID??"",modelID:r.modelID??"",config:{compactBurnRateThreshold:500,compactUsageThreshold:0.85,switchModelUsageThreshold:0.95,delegateConsecutiveHighBurn:5,windowSize:10}},computedAtISO:new Date().toISOString(),turnsAnalyzed:r.recentTurnTokens.length,recommendations:[]}}import{Database as Ok}from"bun:sqlite";import{existsSync as kk,mkdirSync as wk}from"node:fs";import{join as nN}from"node:path";import{homedir as gk}from"node:os";function jk(){let r=nN(gk(),".omo-meta-governor");if(!kk(r))wk(r,{recursive:!0});return nN(r,"meta-governor.db")}var ZN="1",Jk=`
14
+ `)[0]??"").match(/graphifyy\s*\(?([0-9]+\.[0-9]+\.[0-9]+[^\s)]*)/);if(U)return U[1]}catch{}try{let b=r(`python3 -c "import urllib.request, json; d=json.load(urllib.request.urlopen('https://pypi.org/pypi/graphifyy/json')); print(d['info']['version'])"`,{stdio:["ignore","pipe","ignore"],timeout:1e4}).toString().trim();return b.length>0?b:null}catch{return null}}async function RO(){let{execSync:r}=await import("node:child_process");try{let b=r("npx --yes codegraph --version",{stdio:["ignore","pipe","ignore"],timeout:1e4}).toString().trim();return b.length>0?b:null}catch{return null}}async function TO(){let{execSync:r}=await import("node:child_process");try{let b=r("python3 -m pip show graphifyy",{stdio:["ignore","pipe","ignore"],timeout:1e4}).toString().match(/Version:\s*([0-9]+\.[0-9]+\.[0-9]+[^\s]*)/);if(b)return b[1]}catch{}try{let b=r("python3 -m pip show graphify",{stdio:["ignore","pipe","ignore"],timeout:1e4}).toString().match(/Version:\s*([0-9]+\.[0-9]+\.[0-9]+[^\s]*)/);if(b)return b[1]}catch{return null}return null}var cN={limits:{maxLessons:10,maxSlots:20,maxTasks:10},timeouts:{agentmemoryMs:2000,boulderStateMs:1000}};async function GN(r,v){let b=performance.now(),U={...cN.limits,...r.limits},$={...cN.timeouts,...r.timeouts},[z,N]=await Promise.allSettled([hO(r,v.agentmemory,U,$.agentmemoryMs),CO(r,v.boulderState,U,$.boulderStateMs)]),I=[],_={},O=z.status==="fulfilled"?z.value:(AN(I,_,"agentmemory",qN(z.reason)),BN.agentmemory),g=N.status==="fulfilled"?N.value:(AN(I,_,"boulderState",qN(N.reason)),BN.boulderState);return{query:r.query,timestampISO:new Date().toISOString(),agentmemory:O,boulderState:g,degradedSources:I,durationMs:performance.now()-b,errorMessages:_}}async function hO(r,v,b,U){let $=await HN(v.smartSearch({query:r.query,limit:b.maxLessons}),U,"agentmemory");return{available:!0,lessons:fO($.lessons).slice(0,b.maxLessons).map((N)=>({id:N.id,title:N.title,advice:N.advice??"info",confidence:N.confidence,concepts:N.concepts}))}}async function CO(r,v,b,U){let $=await HN(v.boulderRead({directory:r.directory,sessionID:r.sessionID,query:r.query}),U,"boulderState");return{available:!0,tasks:$.sort((N,I)=>N.priority-I.priority||I.updatedAtMs-N.updatedAtMs).slice(0,b.maxTasks).map((N)=>({id:N.id,status:N.status,title:N.title})),planProgress:yO($)}}function fO(r){return[...r].sort((v,b)=>b.confidence-v.confidence)}function yO(r){if(r.length===0)return 0;return r.filter((b)=>b.status==="done").length/r.length}function qN(r){if(r instanceof Error)return r.message;if(typeof r==="string")return r;return"unknown error"}function AN(r,v,b,U){r.push(b),v[b]=U}var BN={agentmemory:{available:!1,lessons:[]},boulderState:{available:!1,tasks:[],planProgress:0}};async function HN(r,v,b){return new Promise((U,$)=>{let z=setTimeout(()=>$(Error(`${b} timeout after ${v}ms`)),v);r.then((N)=>{clearTimeout(z),U(N)},(N)=>{clearTimeout(z),$(N)})})}function JJ(){return{compactBurnRateThreshold:500,compactUsageThreshold:0.85,switchModelUsageThreshold:0.95,delegateConsecutiveHighBurn:5,windowSize:10}}function iO(r){if(r.length===0)return 0;return r.reduce((b,U)=>b+U,0)/r.length}function oO(r,v){let b=0;for(let U=r.length-1;U>=0;U--)if(r[U]>=v)b++;else break;return b}function lO(r,v,b,U){let $=v-r;if($<=0)return U;if(b<=0)return null;let z=Math.floor($/b);if(z<=0)return U;let N=z*2;return new Date(new Date(U).getTime()+N*1000).toISOString()}function LN(r){let{currentUsage:v,modelLimit:b,recentTurnTokens:U,timestampISO:$,config:z}=r,N=U.slice(-z.windowSize),I=iO(N),_=b-v,O=b>0?v/b:1,g=Math.min(0.95,0.3+N.length/z.windowSize*0.65),Y="no-action",J=[],w="within normal parameters";if(O>=z.switchModelUsageThreshold)w=`context usage ${(O*100).toFixed(1)}% exceeds switch threshold ${(z.switchModelUsageThreshold*100).toFixed(1)}%`,J.push("switch-model");if(O>=z.compactUsageThreshold||I>=z.compactBurnRateThreshold){if(Y==="no-action")Y="compact-now",w=O>=z.compactUsageThreshold?`context usage ${(O*100).toFixed(1)}% exceeds compact threshold ${(z.compactUsageThreshold*100).toFixed(1)}%`:`burn rate ${I.toFixed(0)} tokens/turn exceeds threshold ${z.compactBurnRateThreshold}`}let K=oO(N,z.compactBurnRateThreshold);if(K>=z.delegateConsecutiveHighBurn&&Y==="no-action")w=`${K} consecutive high-burn turns (threshold: ${z.delegateConsecutiveHighBurn})`,J.push("delegate-to-subagent");let c=lO(v,b,I,$);return{currentUsage:v,burnRate:I,budgetLeft:_,willOverflowAt:c,recommendation:Y,recommendations:J,confidence:g,modelLimit:b,windowRemaining:Math.max(0,Math.floor(_/Math.max(I,1))),input:{...r},computedAtISO:$,turnsAnalyzed:N.length}}var wr={"oracle-verified":0.25,"no-progress-detector":0.2,"deviation-detector":0.2,"iteration-budget":0.15,"lesson-recall":0.1,"token-predictor":0.1},F4=()=>({continueThreshold:0.3,warnThreshold:0.3,escalateThreshold:0.45,stopThreshold:0.55,paralysisThreshold:3,defaultEscalationTarget:"oracle"});function tO(r){let v=[];v.push({source:"oracle-verified",rawScore:r.oracleVerified?0.6:0,weight:wr["oracle-verified"],weightedScore:r.oracleVerified?0.6*wr["oracle-verified"]:0,description:r.oracleVerified?"Oracle verification passed":"No Oracle verification"}),v.push({source:"no-progress-detector",rawScore:r.noProgress?-0.8:0,weight:wr["no-progress-detector"],weightedScore:r.noProgress?-0.8*wr["no-progress-detector"]:0,description:r.noProgress?"No progress detected in last turn":"Progress detected"});let b=dO(r.deviations);v.push({source:"deviation-detector",rawScore:b,weight:wr["deviation-detector"],weightedScore:b*wr["deviation-detector"],description:r.deviations.length>0?`${r.deviations.length} deviation(s) detected (worst: ${r.deviations[0].severity})`:"No deviations detected"});let U=pO(r.iterationRatio);v.push({source:"iteration-budget",rawScore:U,weight:wr["iteration-budget"],weightedScore:U*wr["iteration-budget"],description:`Iteration ratio: ${r.iterationRatio.toFixed(2)} (${r.ambient.iteration}/${r.ambient.maxIterations})`});let $=eO(r.lessonsRelevant);return v.push({source:"lesson-recall",rawScore:$,weight:wr["lesson-recall"],weightedScore:$*wr["lesson-recall"],description:r.lessonsRelevant.length>0?`${r.lessonsRelevant.length} relevant lesson(s) (avg confidence: ${aO(r.lessonsRelevant).toFixed(2)})`:"No relevant lessons"}),v}function dO(r){if(r.length===0)return 0;let v={grave:-0.9,media:-0.5,leve:-0.2},b=0;for(let $ of r){let z=v[$.severity]??-0.3;if(z<b)b=z}let U=Math.min(r.length*0.05,0.2);return Math.max(b-U,-1)}function pO(r){if(r<=0.5)return-r*0.6;return-0.3-(r-0.5)*1}function eO(r){if(r.length===0)return 0;let v=0;for(let b of r)v+=({continue:0.3,info:0,warn:-0.3,stop:-0.7}[b.advice]??0)*b.confidence;return Math.max(Math.min(v/r.length,1),-1)}function aO(r){if(r.length===0)return 0;return r.reduce((v,b)=>v+b.confidence,0)/r.length}function sO(r,v){if(r>=v.continueThreshold)return"continue";if(r<=-v.stopThreshold)return"stop";if(r<=-v.escalateThreshold)return"escalate";if(r<=-v.warnThreshold)return"warn";return"continue"}function rk(r,v){if(!r.oracleVerified)return"oracle";if(r.deviations.some((b)=>b.severity==="grave"))return"user";return v.defaultEscalationTarget}function SN(r,v,b,U){if(U)return`Paralysis detected: forced continue despite score ${r.toFixed(3)} (too many consecutive stops)`;let $=[...b].sort((O,g)=>O.weightedScore-g.weightedScore),z=$[0],N=$[$.length-1],I=[];if(z.weightedScore<0)I.push(`primary concern: ${z.description}`);if(N.weightedScore>0)I.push(`positive signal: ${N.description}`);return`${{continue:"Continue",warn:"Warn",escalate:"Escalate",stop:"Stop"}[v]} (score: ${r.toFixed(3)}): ${I.join("; ")||"balanced signals"}`}function EN(r,v){let b={...F4(),...v};if(!Number.isFinite(r.iterationRatio)||!Number.isFinite(r.ambient.iteration)||!Number.isFinite(r.ambient.maxIterations))return{decision:{action:"continue",score:0,reasoning:"Score neutral: NaN detected in input(s); defaulting to continue.",evidence:[],shouldEscalateTo:null},contributions:[],rawScore:0,paralysisOverride:!1,computedAtISO:new Date().toISOString()};let U=tO(r),$=U.reduce((Y,J)=>Y+J.weightedScore,0),z=Math.max(Math.min($,1),-1),N=r.slotMemory.consecutiveStops>=b.paralysisThreshold&&z<=-b.warnThreshold,I=N?"continue":sO(z,b),_=[];if(I!=="continue"||Math.abs(z)<b.continueThreshold){for(let Y of U)if(Math.abs(Y.weightedScore)>0.01)_.push({source:Y.source,value:Y.description,confidence:Math.abs(Y.rawScore),weight:Y.weight});if(_.length===0&&I!=="continue")_.push({source:"ambient",value:SN(z,I,U,N),confidence:0.5,weight:0.1})}let O=I==="escalate"?rk(r,b):null;return{decision:{action:I,score:z,reasoning:SN(z,I,U,N),evidence:_,shouldEscalateTo:O},contributions:U,rawScore:z,paralysisOverride:N,computedAtISO:new Date().toISOString()}}var m4=()=>({enabled:!0,maxHistoryPerSession:50,forceContinueAfterStops:3,warnMessageTemplate:"[MetaGovernor] Score {score}: {reasoning}. Evidence: {evidenceCount} signal(s).",escalateMessageTemplate:"[MetaGovernor] Escalating to {target}: {reasoning}",stopMessageTemplate:"[MetaGovernor] STOP — {reasoning}. Evidence: {evidenceCount} signal(s)."});function Iv(r,v){let b=r;for(let[U,$]of Object.entries(v))b=b.replaceAll(`{${U}}`,$);return b}function $k(r){return r.length}function uN(r,v){let b={...m4(),...v};if(!b.enabled)return{action:"continue",message:null,historyEntry:{decision:r.scoringResult.decision,action:"continue",timestampISO:new Date().toISOString(),sessionID:r.sessionID,reasoning:"Decision handler disabled — pass-through continue"}};let U=r.scoringResult.decision,$=U.score,z=U.reasoning,N=$k(U.evidence),I=U.shouldEscalateTo??b.defaultEscalationTarget??"oracle";if(r.scoringResult.paralysisOverride)return{action:"continue",message:Iv(b.warnMessageTemplate,{score:$.toFixed(3),reasoning:`Paralysis detected — forced continue. ${z}`,evidenceCount:String(N)}),historyEntry:{decision:U,action:"continue",timestampISO:new Date().toISOString(),sessionID:r.sessionID,reasoning:`Paralysis override: ${z}`}};switch(U.action){case"continue":return{action:"continue",message:null,historyEntry:{decision:U,action:"continue",timestampISO:new Date().toISOString(),sessionID:r.sessionID,reasoning:z}};case"warn":return{action:"warn",message:Iv(b.warnMessageTemplate,{score:$.toFixed(3),reasoning:z,evidenceCount:String(N)}),historyEntry:{decision:U,action:"warn",timestampISO:new Date().toISOString(),sessionID:r.sessionID,reasoning:z}};case"escalate":return{action:"escalate",message:Iv(b.escalateMessageTemplate,{target:I,reasoning:z}),historyEntry:{decision:U,action:"escalate",timestampISO:new Date().toISOString(),sessionID:r.sessionID,reasoning:`Escalate to ${I}: ${z}`}};case"stop":return{action:"stop",message:Iv(b.stopMessageTemplate,{reasoning:z,evidenceCount:String(N)}),historyEntry:{decision:U,action:"stop",timestampISO:new Date().toISOString(),sessionID:r.sessionID,reasoning:z}}}}function PJ(r,v){if(r.length<=v)return{trimmed:[...r],dropped:0};let b=r.length-v;return{trimmed:r.slice(-v),dropped:b}}function WJ(r){let v=0;for(let b=r.length-1;b>=0;b--)if(r[b].action==="stop")v++;else break;return v}var DN={leve:0,media:1,grave:2};function vk(r,v,b){let U=`${r}-${v}-${b}`.split("").reduce(($,z)=>($<<5)-$+z.charCodeAt(0)|0,0);return`D-${Math.abs(U).toString(36)}`}function xN(r,v){let b=DN[v]??0;return r.some((U)=>(DN[U.severity]??0)>=b)}function bk(r,v=[]){let b=new Set;for(let U of r)if(b.add(U.category),b.add(U.severity),U.filePath){let $=U.filePath.split("/").pop()??U.filePath;b.add($)}for(let U of v){let $=U.split("/").pop()??U;if($)b.add($)}return[...b]}function Uk(r,v){let b=v.map((U)=>`[${U.severity}] ${U.category}: ${U.detail}`).join("; ");return`Action "${r.action}" (score ${r.score.toFixed(2)}) after deviations: ${b}. Reasoning: ${r.reasoning}`}async function FN(r,v){let{decision:b,config:U,sessionID:$,directory:z,filesChanged:N}=r,I=new Date().toISOString();if(!U.enabled)return{lessonSaved:null,decisionSaved:null,reason:"closed-loop learning disabled"};if(b.evidence.length===0&&b.action==="continue")return{lessonSaved:null,decisionSaved:null,reason:"no deviations to learn from"};let _=null,O=null;if(U.saveDecisions){let K={id:vk($,b.action,I),timestampISO:I,action:b.action,score:b.score,reasoning:b.reasoning,sessionID:$,directory:z,deviations:b.evidence.filter((c)=>c.source==="deviation-detector").map((c)=>({severity:"media",category:c.source,detail:c.value}))};try{await v.saveMemory({content:`Decision: ${b.action} (score ${b.score.toFixed(2)}). ${b.reasoning}`,concepts:["meta-governor","decision",b.action],type:"fact",files:[...N]}),O=K}catch{}}let g=b.evidence.filter((K)=>K.source==="deviation-detector").map((K)=>({severity:"media",category:K.source,detail:K.value})),Y=r.currentLessonCount??0;if(Y>=U.maxLessonsPerSession)return{lessonSaved:null,decisionSaved:O,reason:`maxLessonsPerSession cap reached (${Y} >= ${U.maxLessonsPerSession})`};let J=U.saveLessons!==!1;if(J&&xN(g,U.minSeverityToLearn)){let K=bk(g,N),c=Uk(b,g);try{_={id:(await v.saveLesson({content:c,context:`session:${$} dir:${z}`,confidence:Math.max(0.3,Math.min(0.8,Math.abs(b.score))),tags:K})).id,title:`${b.action} after ${g[0]?.category??"deviation"}`,content:c,type:"pattern",concepts:K,confidence:Math.max(0.3,Math.min(0.8,Math.abs(b.score))),files:[...N],sessionID:$}}catch{}}let w=[];if(O)w.push("decision saved");if(_)w.push("lesson saved");if(!O&&!_)if(!J)w.push("saveLessons disabled");else if(!xN(g,U.minSeverityToLearn))w.push("severity below threshold");else w.push("no saveable content");return{lessonSaved:_,decisionSaved:O,reason:w.join("; ")||"no action taken"}}function _v(){return{enabled:!0,minSeverityToLearn:"media",maxLessonsPerSession:20,saveDecisions:!0,saveLessons:!0}}var zk=()=>({enabled:!0,memory:{enabled:!0,query:"",timeoutMs:3000},tokenPredictor:{},scoring:{},decision:{},closedLoop:{},intervention:{mode:"silent",includeDecisionHistory:!0,maxHistoryMessages:5,minActionForMessage:"stop",maxInterventionsPerSession:3,respectDoneSignal:!0,phaseAwareDoneSignal:!1,persistToSession:!0,toasts:!0},protocolEnforcement:{enabled:!1,path:void 0,injectIntoSystem:!1,auditToolCalls:!1},skillPriming:{enabled:!1,trigger:"firstImplement",router:"both"}}),M4={query:"",timestampISO:new Date().toISOString(),agentmemory:{available:!1,lessons:[]},boulderState:{available:!1,tasks:[],planProgress:0},degradedSources:["agentmemory","boulderState"]},Nk={consecutiveStops:0,consecutiveContinues:0,lastUpdatedISO:new Date().toISOString()},Ik={action:"continue",message:null,historyEntry:{decision:{action:"continue",score:0,reasoning:"no decision made",evidence:[],shouldEscalateTo:null},action:"continue",timestampISO:new Date().toISOString(),sessionID:"",reasoning:"no decision made"}};function _k(r,v=M4){let b=r.maxIterations>0?r.iteration/r.maxIterations:0,U={...Nk,consecutiveStops:r.consecutiveStops??0};return{oracleVerified:r.oracleVerified,noProgress:r.noProgress,deviations:r.deviations,iterationRatio:b,lessonsRelevant:v.agentmemory.lessons,slotMemory:U,ambient:{sessionID:r.sessionID,directory:".",mode:"simple",agentName:r.agentName??"unknown",iteration:r.iteration,maxIterations:r.maxIterations}}}async function MN(r,v={}){let b={...zk(),...v};if(!b.enabled)return{memoryRead:M4,tokenPrediction:mN(r),scoringResult:{decision:{action:"continue",score:0,reasoning:"MetaGovernor disabled",evidence:[],shouldEscalateTo:null},contributions:[],rawScore:0,paralysisOverride:!1,computedAtISO:new Date().toISOString()},decision:Ik,lessonSaved:null,decisionHistory:[],skipped:!0,skipReason:"disabled"};let U=M4;if(b.memory.enabled)try{let O={agentmemory:r.backends.agentmemory,boulderState:r.backends.boulderState};U=await GN({directory:".",sessionID:r.sessionID,query:b.memory.query||r.toolName},O)}catch{}let $;try{$=LN({currentUsage:r.recentTurnTokens.reduce((O,g)=>O+g,0),modelLimit:r.modelLimit??v.modelOverride?.modelLimit??200000,recentTurnTokens:r.recentTurnTokens,timestampISO:new Date().toISOString(),providerID:r.providerID??"",modelID:r.modelID??"",config:b.tokenPredictor})}catch{$=mN(r)}let z=EN(_k(r,U),b.scoring),N={sessionID:r.sessionID,scoringResult:z},I=uN(N,b.decision),_=null;try{if(b.closedLoop.enabled!==!1)_=await FN({decision:I.historyEntry.decision,memoryRead:U,config:{..._v(),...b.closedLoop},sessionID:r.sessionID,directory:".",filesChanged:r.filePaths??[],currentLessonCount:r.currentLessonCount},r.writeBackend)}catch{}return{memoryRead:U,tokenPrediction:$,scoringResult:z,decision:I,lessonSaved:_,decisionHistory:[I.historyEntry],skipped:!1}}function mN(r){let v=r.recentTurnTokens.reduce((b,U)=>b+U,0);return{burnRate:0,budgetLeft:200000,currentUsage:v,modelLimit:200000,willOverflowAt:null,recommendation:"no-action",confidence:1,windowRemaining:200000,input:{currentUsage:v,modelLimit:200000,recentTurnTokens:r.recentTurnTokens,timestampISO:new Date().toISOString(),providerID:r.providerID??"",modelID:r.modelID??"",config:{compactBurnRateThreshold:500,compactUsageThreshold:0.85,switchModelUsageThreshold:0.95,delegateConsecutiveHighBurn:5,windowSize:10}},computedAtISO:new Date().toISOString(),turnsAnalyzed:r.recentTurnTokens.length,recommendations:[]}}import{Database as Ok}from"bun:sqlite";import{existsSync as kk,mkdirSync as wk}from"node:fs";import{join as nN}from"node:path";import{homedir as gk}from"node:os";function jk(){let r=nN(gk(),".omo-meta-governor");if(!kk(r))wk(r,{recursive:!0});return nN(r,"meta-governor.db")}var ZN="1",Jk=`
15
15
  CREATE TABLE IF NOT EXISTS _meta (
16
16
  key TEXT PRIMARY KEY,
17
17
  value TEXT NOT NULL
@@ -123,7 +123,7 @@ Please call the \`${v.mcpTool}\` MCP tool with EXACTLY these args:
123
123
  \`\`\`
124
124
 
125
125
  Do not paraphrase, modify, or add fields. Pass the args through verbatim.
126
- After the tool call, briefly confirm what you stored and for which tool.`};try{return{ok:!0,messageID:(await Q_($.session.prompt({sessionID:r,body:{parts:[_]}}),U,`session.prompt for ${v.mcpTool}`))?.data?.info?.id??null,error:null,durationMs:Date.now()-b}}catch(O){return{ok:!1,messageID:null,error:O instanceof Error?O.message:String(O),durationMs:Date.now()-b}}}async function D1(r,v,b=1e4){let U=Date.now(),$=u1.getStore()??Q4;if(!$)return{ok:!1,messageID:null,error:"SessionBridge: no OpenCode client captured (plugin not initialized?)",durationMs:0};if(!r||!v)return{ok:!1,messageID:null,error:"SessionBridge: sessionID and text are required",durationMs:0};let z={type:"text",text:v};try{return{ok:!0,messageID:(await Q_($.session.prompt({sessionID:r,body:{parts:[z]}}),b,`session.prompt persist for ${r}`))?.data?.info?.id??null,error:null,durationMs:Date.now()-U}}catch(N){return{ok:!1,messageID:null,error:N instanceof Error?N.message:String(N),durationMs:Date.now()-U}}}async function W_(r,v){return D1(r,v)}function Q_(r,v,b){return new Promise((U,$)=>{let z=setTimeout(()=>{$(Error(`${b} timed out after ${v}ms`))},v);r.then((N)=>{clearTimeout(z),U(N)},(N)=>{clearTimeout(z),$(N)})})}function Y_(r){if(r.target==="oracle")return`[MetaGovernor] Escalation triggered. Reason: ${r.reasoning}
126
+ After the tool call, briefly confirm what you stored and for which tool.`};try{return{ok:!0,messageID:(await Q_($.session.prompt({path:{id:r},body:{parts:[_]}}),U,`session.prompt for ${v.mcpTool}`))?.data?.info?.id??null,error:null,durationMs:Date.now()-b}}catch(O){return{ok:!1,messageID:null,error:O instanceof Error?O.message:String(O),durationMs:Date.now()-b}}}async function D1(r,v,b=1e4){let U=Date.now(),$=u1.getStore()??Q4;if(!$)return{ok:!1,messageID:null,error:"SessionBridge: no OpenCode client captured (plugin not initialized?)",durationMs:0};if(!r||!v)return{ok:!1,messageID:null,error:"SessionBridge: sessionID and text are required",durationMs:0};let z={type:"text",text:v};try{return{ok:!0,messageID:(await Q_($.session.prompt({path:{id:r},body:{parts:[z]}}),b,`session.prompt persist for ${r}`))?.data?.info?.id??null,error:null,durationMs:Date.now()-U}}catch(N){return{ok:!1,messageID:null,error:N instanceof Error?N.message:String(N),durationMs:Date.now()-U}}}async function W_(r,v){return D1(r,v)}function Q_(r,v,b){return new Promise((U,$)=>{let z=setTimeout(()=>{$(Error(`${b} timed out after ${v}ms`))},v);r.then((N)=>{clearTimeout(z),U(N)},(N)=>{clearTimeout(z),$(N)})})}function Y_(r){if(r.target==="oracle")return`[MetaGovernor] Escalation triggered. Reason: ${r.reasoning}
127
127
 
128
128
  Please invoke the \`task\` tool with \`subagent_type=oracle\` to perform a verification pass on the current session state. Decision context: ${r.evidenceCount} evidence unit(s). After Oracle returns, you should continue with the recommended action.`;return`[MetaGovernor] Escalation to user required. Reason: ${r.reasoning}
129
129
 
@@ -173,7 +173,7 @@ None found in the indexed graph.`;return{title:`omo_find: ${v.symbol}${z.callers
173
173
  `+I+_,metadata:N}}})}function H_(r){return Ir({description:"Analyze the impact of changing a symbol. Lists direct callers, transitive callers, "+"and affected test/doc files. ALWAYS run this BEFORE modifying a function or class — "+"knows what will break. Example: omo_impact with symbol='validateToken' lists every file that calls validateToken and every test that exercises it.",args:{symbol:p.string().min(1).describe("The symbol to analyze (function, class, method)")},async execute(v,b){let U=Date.now(),z=await(r.codeGraph??E1()).impact(v.symbol,r.cwd,5000),N={tool:"omo_impact",symbol:v.symbol,kind:z.kind,directCallers:z.directCallers.length,transitiveCallers:z.transitiveCallers.length,testFiles:z.testFiles.length,docFiles:z.docFiles.length,totalAffectedFiles:z.totalAffectedFiles,timedOut:z.timedOut,durationMs:z.durationMs,sessionID:b.sessionID};if(z.totalAffectedFiles===0&&z.directCallers.length===0)return{title:`omo_impact: no callers found for ${v.symbol}`,output:`No call sites found for "${v.symbol}". Either the symbol is unused, or the codegraph index is stale. Run \`npx codegraph sync\` to refresh the index and try again.`,metadata:N};let I=[];if(I.push(`Impact analysis for "${v.symbol}" (via ${z.kind??"fallback"}).
174
174
  `),I.push("## Summary"),I.push(`- Direct callers: **${z.directCallers.length}**`),I.push(`- Transitive callers: **${z.transitiveCallers.length}**`),I.push(`- Test files affected: **${z.testFiles.length}**`),I.push(`- Doc files affected: **${z.docFiles.length}**`),I.push(`- Total affected files: **${z.totalAffectedFiles}**
175
175
  `),z.directCallers.length>0){I.push("## Direct Callers");for(let _ of z.directCallers.slice(0,30))I.push(`- ${_.file}:${_.line}${_.context?` — ${_.context}`:""}`);if(z.directCallers.length>30)I.push(`- ... and ${z.directCallers.length-30} more`);I.push("")}if(z.testFiles.length>0){I.push("## Test Files Affected");for(let _ of z.testFiles.slice(0,20))I.push(`- ${_}`);I.push("")}if(z.docFiles.length>0){I.push("## Doc Files Affected");for(let _ of z.docFiles.slice(0,20))I.push(`- ${_}`);I.push("")}if(z.timedOut)I.push("⚠️ Analysis timed out — results may be incomplete. Try with a more specific symbol.");return{title:`omo_impact: ${v.symbol} (${z.totalAffectedFiles} files)`,output:I.join(`
176
- `),metadata:N}}})}function L_(r){return Ir({description:"Save a fact, observation, or insight to AgentMemory so it persists across sessions. USE THIS when you learn something worth remembering: a bug pattern, a config quirk, a user preference, a project rule. The system will route the save to AgentMemory's MCP server. Example: omo_remember with content='Always use bun:sqlite, not better-sqlite3' "+"concepts=['storage', 'bun'] — the system will save this to AgentMemory.",args:{content:p.string().min(1).describe("The fact/observation/lesson to remember"),concepts:p.array(p.string()).optional().describe("Tags to categorize this memory (e.g. ['security', 'auth'])"),type:p.enum(["fact","pattern","observation"]).optional().describe("Type of memory: fact, pattern, or observation")},async execute(v,b){let U=b.sessionID;if(!l$())return{title:"omo_remember: session not initialized",output:"Could not save to AgentMemory: the plugin has not captured the OpenCode session client. Try restarting the plugin or check that the OpenCode session is running.",metadata:{tool:"omo_remember",ok:!1}};let $={content:v.content,concepts:v.concepts??[],type:v.type??"observation"},z=await t$(U,{toolName:"omo_remember",mcpTool:"agentmemory_memory_save",mcpArgs:$,preamble:"Save this to AgentMemory (cross-session persistent memory)."});if(!z.ok)return{title:"omo_remember: failed",output:`Failed to dispatch save to AgentMemory: ${z.error??"unknown error"}`,metadata:{tool:"omo_remember",ok:!1,durationMs:z.durationMs}};r.onDispatch?.({sessionID:U,mcpTool:"agentmemory_memory_save",mcpArgs:$});let N=await c_(U,"agentmemory_memory_save");return{title:`omo_remember: ${N}`,output:`Save to AgentMemory ${N==="delivered"?"verified":N==="expired"?"not delivered within TTL":"dispatched"} (messageID: ${z.messageID??"pending"}). LLM call to agentmemory_memory_save ${N==="delivered"?"was observed":"not yet observed (will happen on next turn)"} with args: ${JSON.stringify($)}. It will be available in future sessions via agentmemory_memory_recall.`,metadata:{tool:"omo_remember",ok:!0,messageID:z.messageID,durationMs:z.durationMs,contentLength:v.content.length,deliveryStatus:N}}}})}function S_(r){return Ir({description:"Search AgentMemory's cross-session memory (via agentmemory_memory_smart_search). USE THIS for questions that need context from PREVIOUS sessions: 'how did we set up X', 'what was the last approach to Y', 'recall the config for Z'. For current-session recall, prefer omo_recall (local SQLite) instead.",args:{query:p.string().min(2).describe("The search query"),limit:p.number().int().min(1).max(20).optional().describe("Max results (default 5)")},async execute(v,b){let U=b.sessionID;if(!l$())return{title:"omo_recall_mcp: session not initialized",output:"Could not search AgentMemory: session client not captured. Use omo_recall for local session memory instead.",metadata:{tool:"omo_recall_mcp",ok:!1}};let $={query:v.query,limit:v.limit??5},z=await t$(U,{toolName:"omo_recall_mcp",mcpTool:"agentmemory_memory_smart_search",mcpArgs:$,preamble:"Search AgentMemory for this query and report the results."});if(!z.ok)return{title:"omo_recall_mcp: failed",output:`Failed to dispatch search to AgentMemory: ${z.error??"unknown error"}`,metadata:{tool:"omo_recall_mcp",ok:!1,durationMs:z.durationMs}};r.onDispatch?.({sessionID:U,mcpTool:"agentmemory_memory_smart_search",mcpArgs:$});let N=await c_(U,"agentmemory_memory_smart_search");return{title:`omo_recall_mcp: ${N}`,output:`Search to AgentMemory ${N==="delivered"?"verified":"dispatched"} (messageID: ${z.messageID??"pending"}). LLM call to agentmemory_memory_smart_search ${N==="delivered"?"was observed":"not yet observed (will happen on next turn)"} with args: ${JSON.stringify($)}. Results will appear in the next assistant message.`,metadata:{tool:"omo_recall_mcp",ok:!0,messageID:z.messageID,durationMs:z.durationMs,query:v.query,deliveryStatus:N}}}})}function E_(r){return Ir({description:"Find the shortest conceptual path between two concepts in the codebase using the graphify knowledge graph. USE THIS to understand how two apparently unrelated parts of the codebase connect. Example: omo_path with from='auth' to='database' traces the chain from authentication handlers to DB queries.",args:{from:p.string().min(1).describe("Start concept"),to:p.string().min(1).describe("End concept")},async execute(v,b){let U=Date.now(),z=await Rr().invokePath(v.from,v.to,r.cwd,{timeoutMs:8000});return{title:z.kind==="graphify"?"omo_path: path found":"omo_path: unavailable",output:z.result??`No path found between "${v.from}" and "${v.to}". Check if graphify-out/ exists and is up to date.`,metadata:{tool:"omo_path",from:v.from,to:v.to,kind:z.kind,durationMs:Date.now()-U,sessionID:b?b.sessionID:"unknown"}}}})}function u_(r){return Ir({description:"Get a plain-language explanation of a concept from the graphify knowledge graph. USE THIS when you encounter an unfamiliar term or module and need a quick overview of what it is and how it fits into the codebase. Example: 'omo_explain SwinTransformer'.",args:{concept:p.string().min(1).describe("The concept to explain")},async execute(v,b){let U=Date.now(),z=await Rr().invokeExplain(v.concept,r.cwd,{timeoutMs:8000});return{title:z.kind==="graphify"?"omo_explain: done":"omo_explain: unavailable",output:z.result??`Concept "${v.concept}" not found in the knowledge graph. Run \`graphify . --no-viz\` first.`,metadata:{tool:"omo_explain",concept:v.concept,kind:z.kind,durationMs:Date.now()-U,sessionID:b?b.sessionID:"unknown"}}}})}class D_{client=null;defaultTimeoutMs;toolCache=null;constructor(r={}){this.defaultTimeoutMs=r.defaultTimeoutMs??5000}setClient(r){this.client=r,this.toolCache=null}isReady(){return this.client!==null}async callTool(r,v={},b){let U=Date.now(),$=b??this.defaultTimeoutMs;if(!this.client)return{data:null,timedOut:!1,durationMs:Date.now()-U,error:"MCP client not initialized"};try{let N=(await this.raceWithTimeout(this.client.tool.invoke({toolID:r,input:v}),$,r)).data;return{data:N&&typeof N==="object"&&!Array.isArray(N)?N:null,timedOut:!1,durationMs:Date.now()-U,error:null}}catch(z){return{data:null,timedOut:z instanceof Error&&/timed out/i.test(z.message),durationMs:Date.now()-U,error:z instanceof Error?z.message:String(z)}}}async isAvailable(r){if(!this.client)return!1;if(this.toolCache===null)try{let v=await this.client.tool.list();this.toolCache=new Set((v.data??[]).map((b)=>b.id))}catch{this.toolCache=new Set}return this.toolCache.has(r)}async availableTools(){if(!this.client)return[];if(this.toolCache===null)await this.isAvailable("__bootstrap__");return Array.from(this.toolCache??new Set)}invalidateCache(){this.toolCache=null}raceWithTimeout(r,v,b){return new Promise((U,$)=>{let z=setTimeout(()=>{$(Error(`${b} timed out after ${v}ms`))},v);r.then((N)=>{clearTimeout(z),U(N)},(N)=>{clearTimeout(z),$(N)})})}}var M1=null;function x_(){if(!M1)M1=new D_;return M1}class n1{entries=new Map;deliveredCount=0;expiredCount=0;register(r){this.cleanup();let v=`deliv-${Date.now()}-${Math.random().toString(36).slice(2,10)}`,b=F_(r.mcpArgs);return this.entries.set(v,{id:v,sessionID:r.sessionID,mcpTool:r.mcpTool,mcpArgsHash:b,registeredAt:Date.now(),ttlMs:r.ttlMs??1e4}),v}markDelivered(r){this.cleanup();let v=r.mcpArgs?F_(r.mcpArgs):null;for(let[b,U]of this.entries){if(U.sessionID!==r.sessionID)continue;if(U.mcpTool!==r.mcpTool)continue;if(v!==null&&U.mcpArgsHash!==v)continue;return this.entries.delete(b),this.deliveredCount++,b}return null}async awaitDelivery(r){let v=r.timeoutMs??2000,b=Date.now();while(Date.now()-b<v){if(this.cleanup(),![...this.entries.values()].find(($)=>$.sessionID===r.sessionID&&$.mcpTool===r.mcpTool))return"delivered";await Pj(50)}return"expired"}getStats(){return{pending:this.entries.size,delivered:this.deliveredCount,expired:this.expiredCount}}clearSession(r){for(let[v,b]of this.entries)if(b.sessionID===r)this.entries.delete(v)}cleanup(){let r=Date.now();for(let[v,b]of this.entries)if(r-b.registeredAt>b.ttlMs)this.entries.delete(v),this.expiredCount++}}function F_(r){return JSON.stringify(r,Object.keys(r).sort())}function Pj(r){return new Promise((v)=>setTimeout(v,r))}vv();import{resolve as rO}from"node:path";import{homedir as Sj}from"node:os";var m_="0.0.0";try{m_=x1().version}catch{}var Vr=m_,M_=["decisions_taken","decisions_skipped_continue","decisions_skipped_no_decision","decisions_skipped_no_message","decisions_skipped_below_threshold","interventions_delivered","interventions_disabled_done","interventions_disabled_cap","decisions_stored","plan_reminders_injected","bot_feedback_injected","violations_injected","protocol_audits_passed","protocol_violations_detected","git_commit_reindex","orchestrator_runs","orchestrator_errors"];function n_(){let r={};for(let v of M_)r[v]={count:0,lastOccurrenceISO:null};return r}var Wj=n_(),DX=new Date().toISOString();function Z_(r){let v=r??{},b=n_(),U=new Date().toISOString(),$=v.version??Vr,z=v.global===!0;return{inc(N){let I=b[N];if(!I)return;if(I.count++,I.lastOccurrenceISO=new Date().toISOString(),z){let _=Wj[N];if(_)_.count++,_.lastOccurrenceISO=I.lastOccurrenceISO}},getMetrics(){return{version:$,sessionID:v.sessionID??"",startedAtISO:U,uptimeMs:Date.now()-new Date(U).getTime(),counters:{...b}}},reset(){for(let N of M_)b[N]={count:0,lastOccurrenceISO:null}}}}function h1(r){let v={enabled:!1,...r},b=F4(),U=m4(),$=_v();return{enabled:v.enabled===!0,memory:{enabled:!0,query:v.memory?.query??"meta_governor_context",timeoutMs:v.memory?.timeoutMs??v.memory?.agentmemoryTimeoutMs??2000},tokenPredictor:{compactBurnRateThreshold:v.tokenPredictor?.compactBurnRateThreshold??500,compactUsageThreshold:v.tokenPredictor?.compactUsageThreshold??0.85,switchModelUsageThreshold:v.tokenPredictor?.switchModelUsageThreshold??0.95,delegateConsecutiveHighBurn:v.tokenPredictor?.delegateConsecutiveHighBurn??5},scoring:{...b,...v.scoring?.continueThreshold!==void 0?{continueThreshold:v.scoring.continueThreshold}:{},...v.scoring?.warnThreshold!==void 0?{warnThreshold:v.scoring.warnThreshold}:{},...v.scoring?.escalateThreshold!==void 0?{escalateThreshold:v.scoring.escalateThreshold}:{},...v.scoring?.stopThreshold!==void 0?{stopThreshold:v.scoring.stopThreshold}:{},...v.scoring?.paralysisThreshold!==void 0?{paralysisThreshold:v.scoring.paralysisThreshold}:{},...v.scoring?.defaultEscalationTarget!==void 0?{defaultEscalationTarget:v.scoring.defaultEscalationTarget}:{}},closedLoop:{...$,...v.closedLoop?.enabled!==void 0?{enabled:v.closedLoop.enabled}:{},...v.closedLoop?.minSeverityToLearn!==void 0?{minSeverityToLearn:v.closedLoop.minSeverityToLearn}:{},...v.closedLoop?.maxLessonsPerSession!==void 0?{maxLessonsPerSession:v.closedLoop.maxLessonsPerSession}:{},...v.closedLoop?.saveDecisions!==void 0?{saveDecisions:v.closedLoop.saveDecisions}:{},...v.closedLoop?.saveLessons!==void 0?{saveLessons:v.closedLoop.saveLessons}:{}},decision:{...U,...v.decision?.maxHistoryPerSession!==void 0?{maxHistoryPerSession:v.decision.maxHistoryPerSession}:{},...v.decision?.forceContinueAfterStops!==void 0?{forceContinueAfterStops:v.decision.forceContinueAfterStops}:{},...v.decision?.warnMessageTemplate!==void 0?{warnMessageTemplate:v.decision.warnMessageTemplate}:{},...v.decision?.escalateMessageTemplate!==void 0?{escalateMessageTemplate:v.decision.escalateMessageTemplate}:{},...v.decision?.stopMessageTemplate!==void 0?{stopMessageTemplate:v.decision.stopMessageTemplate}:{}},modelOverride:v.modelOverride?{providerID:v.modelOverride.providerID,modelID:v.modelOverride.modelID,modelLimit:v.modelOverride.modelLimit,temperature:v.modelOverride.temperature??0.2,topP:v.modelOverride.topP??1,maxTokens:v.modelOverride.maxTokens??2048,reasoning:v.modelOverride.reasoning??!1,verbosity:v.modelOverride.verbosity??"minimal"}:void 0,intervention:{mode:v.intervention?.mode??"silent",includeDecisionHistory:v.intervention?.includeDecisionHistory??!0,maxHistoryMessages:v.intervention?.maxHistoryMessages??5,minActionForMessage:v.intervention?.minActionForMessage??"stop",maxInterventionsPerSession:v.intervention?.maxInterventionsPerSession??3,respectDoneSignal:v.intervention?.respectDoneSignal??!0,phaseAwareDoneSignal:v.intervention?.phaseAwareDoneSignal??!1,persistToSession:v.intervention?.persistToSession??!0},postWave:{enabled:v.postWave?.enabled??v.intervention?.phaseAwareDoneSignal===!0,repoMode:v.postWave?.repoMode??"auto",aasToolPrefix:v.postWave?.aasToolPrefix??"aas",ciTimeoutMs:v.postWave?.ciTimeoutMs??600000,maxRetriesPerWave:v.postWave?.maxRetriesPerWave??1,reinjectCooldownMs:v.postWave?.reinjectCooldownMs??60000,respectSilentMode:v.postWave?.respectSilentMode??!1,...v.postWave?.ownRepoDirective!==void 0?{ownRepoDirective:v.postWave.ownRepoDirective}:{},...v.postWave?.thirdPartyDirective!==void 0?{thirdPartyDirective:v.postWave.thirdPartyDirective}:{}},protocolEnforcement:{enabled:v.protocolEnforcement?.enabled??!1,path:v.protocolEnforcement?.path,injectIntoSystem:v.protocolEnforcement?.injectIntoSystem??!1,auditToolCalls:v.protocolEnforcement?.auditToolCalls??!1},skillPriming:{enabled:v.skillPriming?.enabled??!1,trigger:v.skillPriming?.trigger??"firstImplement",router:v.skillPriming?.router??"both"},graphSync:{killOrphanedOnInit:v.graphSync?.killOrphanedOnInit??!0}}}function TX(r){if(!r)return!1;if(r.enabled===!0)return!0;return r.meta_governor?.enabled===!0}async function hX(r={}){let{loadMetaGovernorConfig:v}=await Promise.resolve().then(() => (T1(),i_)),b=await v(r);return h1(b.config)}T1();var Tr=new Map;function o_(r,v){Tr.set(r,v)}function hr(r){let v=Tr.get(r);if(v!==void 0)Tr.delete(r);return v}function fX(r){return Tr.has(r)}function yX(){for(let[r,v]of Tr)return Tr.delete(r),v;return}function iX(){Tr.clear()}class C1{store=new Map;maxEntries;ttlMs;now;constructor(r={}){this.maxEntries=r.maxEntries??100,this.ttlMs=r.ttlMs??3600000,this.now=r.now??Date.now}get(r){let v=this.store.get(r);if(!v)return;let b=this.now();if(v.expiresAtMs<=b){this.store.delete(r);return}return v.lastAccessAtMs=b,v.value}has(r){return this.get(r)!==void 0}set(r,v){let b=this.now();if(!this.store.has(r)&&this.store.size>=this.maxEntries)this.evictOldest();this.store.set(r,{value:v,expiresAtMs:b+this.ttlMs,lastAccessAtMs:b})}delete(r){return this.store.delete(r)}size(){return this.store.size}clear(){this.store.clear()}evictOldest(){let r,v=1/0;for(let[b,U]of this.store)if(U.lastAccessAtMs<v)v=U.lastAccessAtMs,r=b;if(r!==void 0)this.store.delete(r)}}import{statSync as Ej,readFileSync as uj}from"node:fs";import{execSync as Dj}from"node:child_process";import{join as a_}from"node:path";import{readFile as Bj}from"node:fs/promises";import{resolve as Gj}from"node:path";import{homedir as Hj}from"node:os";var f1=Gj(Hj(),".config","opencode","sisyphus-mandatory","sisyphus-mandatory.md");async function l_(r){return await Bj(r??f1,"utf-8")}function t_(r){let v=["","## Sisyphus Protocol Enforcement","","You MUST follow these Sisyphus protocol rules:","","1. **Pre-response Memory Check**: Before any action, read `<project-memory>` and `<session-history-since>` blocks in context. Cite `<memory id>` for any fact used from memory. Do not ask questions whose answers are in those blocks.","","2. **Codebase Graph First**: Before using grep/glob/read for architecture or symbol queries, check whether `.codegraph/` or `graphify-out/` exists. If so, use codegraph/graphify tools first, then grep/read only as last resort.","","3. **Tool Routing Table**: Match common intents to the correct tool:",' - "we did this before" / "you should know" → `agentmemory_memory_recall`'," - Starting a task that resembles a previous one → `agentmemory_memory_smart_search`"," - Before asking the user a clarifying question → `agentmemory_memory_recall` first"," - Save durable insight/decision/rule → `agentmemory_memory_save`",""];if(/\boracle\b/i.test(r))v.push("4. **Post-task Oracle Verification**: If files touched >= 3 OR any INVOKE trigger matches, invoke Oracle with the exact format:",' `task(subagent_type="oracle", run_in_background=false, prompt="Verify: ...")`'," - INVOKE triggers: created 1+ new file, modified abstraction, touched security/auth paths, modified DB/persistence, modified CI/CD, added/removed dependency, modified perf-critical path, todo had 2+ completed items."," - SKIP only when: files touched <= 2, no new file, no dependency change, single-step task, change is typo/comment/rename only."," - Verdict: PASS → done. FAIL/CONDITIONAL → fix and re-invoke. Max 3 invocations."," - Cost: Max 3 oracle invocations per task. Skip rate: Must NOT skip Oracle on 2+ file change.","");return v.push("5. **Parallel Query Rule**: Fire independent tool queries in the same turn. Do NOT serialize independent memory/context queries.","","6. **Empty-Result Escalation**: On empty `agentmemory_memory_recall`, fire `agentmemory_memory_smart_search` + `agentmemory_memory_export` before asking the user.","","7. **Hard Rules (No Exceptions)**:"," - Do NOT ask 'where is X?' if memory or session record already contains it."," - Do NOT claim 'I don't know' before firing at least 2 different recall tools."," - Do NOT re-issue clarifying questions whose answer is in `<project-memory>` or `<session-history-since>`."," - Do NOT suppress type errors with `as any`, `@ts-ignore`, or `@ts-expect-error`."," - Do NOT leave empty catch blocks `catch(e) {}`.",' - Do NOT start a fresh agent via `task()` when `task(task_id="ses_...")` (continuation) exists — use continuation IDs.'," - Do NOT batch-complete todos — mark each one `completed` immediately after finishing."," - Do NOT skip creating todos for multi-step tasks.","","8. **Self-Check Before Responding**:"," - Verify you read `<project-memory>` and `<session-history-since>` blocks."," - Verify you cited `<memory id>` for any fact used from memory."," - Verify you did not ask a question whose answer is in those blocks."," - For multi-file changes, verify Oracle was invoked."," - For codebase exploration, verify codegraph/graphify was tried before grep/read."," - After discovering something non-obvious, save it with `agentmemory_memory_save` so future sessions benefit.",""),v.join(`
176
+ `),metadata:N}}})}function L_(r){return Ir({description:"Save a fact, observation, or insight to AgentMemory so it persists across sessions. USE THIS when you learn something worth remembering: a bug pattern, a config quirk, a user preference, a project rule. The system will route the save to AgentMemory's MCP server. Example: omo_remember with content='Always use bun:sqlite, not better-sqlite3' "+"concepts=['storage', 'bun'] — the system will save this to AgentMemory.",args:{content:p.string().min(1).describe("The fact/observation/lesson to remember"),concepts:p.array(p.string()).optional().describe("Tags to categorize this memory (e.g. ['security', 'auth'])"),type:p.enum(["fact","pattern","observation"]).optional().describe("Type of memory: fact, pattern, or observation")},async execute(v,b){let U=b.sessionID;if(!l$())return{title:"omo_remember: session not initialized",output:"Could not save to AgentMemory: the plugin has not captured the OpenCode session client. Try restarting the plugin or check that the OpenCode session is running.",metadata:{tool:"omo_remember",ok:!1}};let $={content:v.content,concepts:v.concepts??[],type:v.type??"observation"},z=await t$(U,{toolName:"omo_remember",mcpTool:"agentmemory_memory_save",mcpArgs:$,preamble:"Save this to AgentMemory (cross-session persistent memory)."});if(!z.ok)return{title:"omo_remember: failed",output:`Failed to dispatch save to AgentMemory: ${z.error??"unknown error"}`,metadata:{tool:"omo_remember",ok:!1,durationMs:z.durationMs}};r.onDispatch?.({sessionID:U,mcpTool:"agentmemory_memory_save",mcpArgs:$});let N=await c_(U,"agentmemory_memory_save");return{title:`omo_remember: ${N}`,output:`Save to AgentMemory ${N==="delivered"?"verified":N==="expired"?"not delivered within TTL":"dispatched"} (messageID: ${z.messageID??"pending"}). LLM call to agentmemory_memory_save ${N==="delivered"?"was observed":"not yet observed (will happen on next turn)"} with args: ${JSON.stringify($)}. It will be available in future sessions via agentmemory_memory_recall.`,metadata:{tool:"omo_remember",ok:!0,messageID:z.messageID,durationMs:z.durationMs,contentLength:v.content.length,deliveryStatus:N}}}})}function S_(r){return Ir({description:"Search AgentMemory's cross-session memory (via agentmemory_memory_smart_search). USE THIS for questions that need context from PREVIOUS sessions: 'how did we set up X', 'what was the last approach to Y', 'recall the config for Z'. For current-session recall, prefer omo_recall (local SQLite) instead.",args:{query:p.string().min(2).describe("The search query"),limit:p.number().int().min(1).max(20).optional().describe("Max results (default 5)")},async execute(v,b){let U=b.sessionID;if(!l$())return{title:"omo_recall_mcp: session not initialized",output:"Could not search AgentMemory: session client not captured. Use omo_recall for local session memory instead.",metadata:{tool:"omo_recall_mcp",ok:!1}};let $={query:v.query,limit:v.limit??5},z=await t$(U,{toolName:"omo_recall_mcp",mcpTool:"agentmemory_memory_smart_search",mcpArgs:$,preamble:"Search AgentMemory for this query and report the results."});if(!z.ok)return{title:"omo_recall_mcp: failed",output:`Failed to dispatch search to AgentMemory: ${z.error??"unknown error"}`,metadata:{tool:"omo_recall_mcp",ok:!1,durationMs:z.durationMs}};r.onDispatch?.({sessionID:U,mcpTool:"agentmemory_memory_smart_search",mcpArgs:$});let N=await c_(U,"agentmemory_memory_smart_search");return{title:`omo_recall_mcp: ${N}`,output:`Search to AgentMemory ${N==="delivered"?"verified":"dispatched"} (messageID: ${z.messageID??"pending"}). LLM call to agentmemory_memory_smart_search ${N==="delivered"?"was observed":"not yet observed (will happen on next turn)"} with args: ${JSON.stringify($)}. Results will appear in the next assistant message.`,metadata:{tool:"omo_recall_mcp",ok:!0,messageID:z.messageID,durationMs:z.durationMs,query:v.query,deliveryStatus:N}}}})}function E_(r){return Ir({description:"Find the shortest conceptual path between two concepts in the codebase using the graphify knowledge graph. USE THIS to understand how two apparently unrelated parts of the codebase connect. Example: omo_path with from='auth' to='database' traces the chain from authentication handlers to DB queries.",args:{from:p.string().min(1).describe("Start concept"),to:p.string().min(1).describe("End concept")},async execute(v,b){let U=Date.now(),z=await Rr().invokePath(v.from,v.to,r.cwd,{timeoutMs:8000});return{title:z.kind==="graphify"?"omo_path: path found":"omo_path: unavailable",output:z.result??`No path found between "${v.from}" and "${v.to}". Check if graphify-out/ exists and is up to date.`,metadata:{tool:"omo_path",from:v.from,to:v.to,kind:z.kind,durationMs:Date.now()-U,sessionID:b?b.sessionID:"unknown"}}}})}function u_(r){return Ir({description:"Get a plain-language explanation of a concept from the graphify knowledge graph. USE THIS when you encounter an unfamiliar term or module and need a quick overview of what it is and how it fits into the codebase. Example: 'omo_explain SwinTransformer'.",args:{concept:p.string().min(1).describe("The concept to explain")},async execute(v,b){let U=Date.now(),z=await Rr().invokeExplain(v.concept,r.cwd,{timeoutMs:8000});return{title:z.kind==="graphify"?"omo_explain: done":"omo_explain: unavailable",output:z.result??`Concept "${v.concept}" not found in the knowledge graph. Run \`graphify . --no-viz\` first.`,metadata:{tool:"omo_explain",concept:v.concept,kind:z.kind,durationMs:Date.now()-U,sessionID:b?b.sessionID:"unknown"}}}})}class D_{client=null;defaultTimeoutMs;toolCache=null;constructor(r={}){this.defaultTimeoutMs=r.defaultTimeoutMs??5000}setClient(r){this.client=r,this.toolCache=null}isReady(){return this.client!==null}async callTool(r,v={},b){let U=Date.now(),$=b??this.defaultTimeoutMs;if(!this.client)return{data:null,timedOut:!1,durationMs:Date.now()-U,error:"MCP client not initialized"};try{let N=(await this.raceWithTimeout(this.client.tool.invoke({toolID:r,input:v}),$,r)).data;return{data:N&&typeof N==="object"&&!Array.isArray(N)?N:null,timedOut:!1,durationMs:Date.now()-U,error:null}}catch(z){return{data:null,timedOut:z instanceof Error&&/timed out/i.test(z.message),durationMs:Date.now()-U,error:z instanceof Error?z.message:String(z)}}}async isAvailable(r){if(!this.client)return!1;if(this.toolCache===null)try{let v=await this.client.tool.list();this.toolCache=new Set((v.data??[]).map((b)=>b.id))}catch{this.toolCache=new Set}return this.toolCache.has(r)}async availableTools(){if(!this.client)return[];if(this.toolCache===null)await this.isAvailable("__bootstrap__");return Array.from(this.toolCache??new Set)}invalidateCache(){this.toolCache=null}raceWithTimeout(r,v,b){return new Promise((U,$)=>{let z=setTimeout(()=>{$(Error(`${b} timed out after ${v}ms`))},v);r.then((N)=>{clearTimeout(z),U(N)},(N)=>{clearTimeout(z),$(N)})})}}var M1=null;function x_(){if(!M1)M1=new D_;return M1}class n1{entries=new Map;deliveredCount=0;expiredCount=0;register(r){this.cleanup();let v=`deliv-${Date.now()}-${Math.random().toString(36).slice(2,10)}`,b=F_(r.mcpArgs);return this.entries.set(v,{id:v,sessionID:r.sessionID,mcpTool:r.mcpTool,mcpArgsHash:b,registeredAt:Date.now(),ttlMs:r.ttlMs??1e4}),v}markDelivered(r){this.cleanup();let v=r.mcpArgs?F_(r.mcpArgs):null;for(let[b,U]of this.entries){if(U.sessionID!==r.sessionID)continue;if(U.mcpTool!==r.mcpTool)continue;if(v!==null&&U.mcpArgsHash!==v)continue;return this.entries.delete(b),this.deliveredCount++,b}return null}async awaitDelivery(r){let v=r.timeoutMs??2000,b=Date.now();while(Date.now()-b<v){if(this.cleanup(),![...this.entries.values()].find(($)=>$.sessionID===r.sessionID&&$.mcpTool===r.mcpTool))return"delivered";await Pj(50)}return"expired"}getStats(){return{pending:this.entries.size,delivered:this.deliveredCount,expired:this.expiredCount}}clearSession(r){for(let[v,b]of this.entries)if(b.sessionID===r)this.entries.delete(v)}cleanup(){let r=Date.now();for(let[v,b]of this.entries)if(r-b.registeredAt>b.ttlMs)this.entries.delete(v),this.expiredCount++}}function F_(r){return JSON.stringify(r,Object.keys(r).sort())}function Pj(r){return new Promise((v)=>setTimeout(v,r))}vv();import{resolve as rO}from"node:path";import{homedir as Sj}from"node:os";var m_="0.0.0";try{m_=x1().version}catch{}var Vr=m_,M_=["decisions_taken","decisions_skipped_continue","decisions_skipped_no_decision","decisions_skipped_no_message","decisions_skipped_below_threshold","interventions_delivered","interventions_disabled_done","interventions_disabled_cap","decisions_stored","plan_reminders_injected","bot_feedback_injected","violations_injected","protocol_audits_passed","protocol_violations_detected","git_commit_reindex","orchestrator_runs","orchestrator_errors"];function n_(){let r={};for(let v of M_)r[v]={count:0,lastOccurrenceISO:null};return r}var Wj=n_(),DX=new Date().toISOString();function Z_(r){let v=r??{},b=n_(),U=new Date().toISOString(),$=v.version??Vr,z=v.global===!0;return{inc(N){let I=b[N];if(!I)return;if(I.count++,I.lastOccurrenceISO=new Date().toISOString(),z){let _=Wj[N];if(_)_.count++,_.lastOccurrenceISO=I.lastOccurrenceISO}},getMetrics(){return{version:$,sessionID:v.sessionID??"",startedAtISO:U,uptimeMs:Date.now()-new Date(U).getTime(),counters:{...b}}},reset(){for(let N of M_)b[N]={count:0,lastOccurrenceISO:null}}}}function h1(r){let v={enabled:!1,...r},b=F4(),U=m4(),$=_v();return{enabled:v.enabled===!0,memory:{enabled:!0,query:v.memory?.query??"meta_governor_context",timeoutMs:v.memory?.timeoutMs??v.memory?.agentmemoryTimeoutMs??2000},tokenPredictor:{compactBurnRateThreshold:v.tokenPredictor?.compactBurnRateThreshold??500,compactUsageThreshold:v.tokenPredictor?.compactUsageThreshold??0.85,switchModelUsageThreshold:v.tokenPredictor?.switchModelUsageThreshold??0.95,delegateConsecutiveHighBurn:v.tokenPredictor?.delegateConsecutiveHighBurn??5},scoring:{...b,...v.scoring?.continueThreshold!==void 0?{continueThreshold:v.scoring.continueThreshold}:{},...v.scoring?.warnThreshold!==void 0?{warnThreshold:v.scoring.warnThreshold}:{},...v.scoring?.escalateThreshold!==void 0?{escalateThreshold:v.scoring.escalateThreshold}:{},...v.scoring?.stopThreshold!==void 0?{stopThreshold:v.scoring.stopThreshold}:{},...v.scoring?.paralysisThreshold!==void 0?{paralysisThreshold:v.scoring.paralysisThreshold}:{},...v.scoring?.defaultEscalationTarget!==void 0?{defaultEscalationTarget:v.scoring.defaultEscalationTarget}:{}},closedLoop:{...$,...v.closedLoop?.enabled!==void 0?{enabled:v.closedLoop.enabled}:{},...v.closedLoop?.minSeverityToLearn!==void 0?{minSeverityToLearn:v.closedLoop.minSeverityToLearn}:{},...v.closedLoop?.maxLessonsPerSession!==void 0?{maxLessonsPerSession:v.closedLoop.maxLessonsPerSession}:{},...v.closedLoop?.saveDecisions!==void 0?{saveDecisions:v.closedLoop.saveDecisions}:{},...v.closedLoop?.saveLessons!==void 0?{saveLessons:v.closedLoop.saveLessons}:{}},decision:{...U,...v.decision?.maxHistoryPerSession!==void 0?{maxHistoryPerSession:v.decision.maxHistoryPerSession}:{},...v.decision?.forceContinueAfterStops!==void 0?{forceContinueAfterStops:v.decision.forceContinueAfterStops}:{},...v.decision?.warnMessageTemplate!==void 0?{warnMessageTemplate:v.decision.warnMessageTemplate}:{},...v.decision?.escalateMessageTemplate!==void 0?{escalateMessageTemplate:v.decision.escalateMessageTemplate}:{},...v.decision?.stopMessageTemplate!==void 0?{stopMessageTemplate:v.decision.stopMessageTemplate}:{}},modelOverride:v.modelOverride?{providerID:v.modelOverride.providerID,modelID:v.modelOverride.modelID,modelLimit:v.modelOverride.modelLimit,temperature:v.modelOverride.temperature??0.2,topP:v.modelOverride.topP??1,maxTokens:v.modelOverride.maxTokens??2048,reasoning:v.modelOverride.reasoning??!1,verbosity:v.modelOverride.verbosity??"minimal"}:void 0,intervention:{mode:v.intervention?.mode??"silent",includeDecisionHistory:v.intervention?.includeDecisionHistory??!0,maxHistoryMessages:v.intervention?.maxHistoryMessages??5,minActionForMessage:v.intervention?.minActionForMessage??"stop",maxInterventionsPerSession:v.intervention?.maxInterventionsPerSession??3,respectDoneSignal:v.intervention?.respectDoneSignal??!0,phaseAwareDoneSignal:v.intervention?.phaseAwareDoneSignal??!1,persistToSession:v.intervention?.persistToSession??!0,toasts:v.intervention?.toasts??!0},postWave:{enabled:v.postWave?.enabled??v.intervention?.phaseAwareDoneSignal===!0,repoMode:v.postWave?.repoMode??"auto",aasToolPrefix:v.postWave?.aasToolPrefix??"aas",ciTimeoutMs:v.postWave?.ciTimeoutMs??600000,maxRetriesPerWave:v.postWave?.maxRetriesPerWave??1,reinjectCooldownMs:v.postWave?.reinjectCooldownMs??60000,respectSilentMode:v.postWave?.respectSilentMode??!1,...v.postWave?.ownRepoDirective!==void 0?{ownRepoDirective:v.postWave.ownRepoDirective}:{},...v.postWave?.thirdPartyDirective!==void 0?{thirdPartyDirective:v.postWave.thirdPartyDirective}:{}},protocolEnforcement:{enabled:v.protocolEnforcement?.enabled??!1,path:v.protocolEnforcement?.path,injectIntoSystem:v.protocolEnforcement?.injectIntoSystem??!1,auditToolCalls:v.protocolEnforcement?.auditToolCalls??!1},skillPriming:{enabled:v.skillPriming?.enabled??!1,trigger:v.skillPriming?.trigger??"firstImplement",router:v.skillPriming?.router??"both"},graphSync:{killOrphanedOnInit:v.graphSync?.killOrphanedOnInit??!0}}}function TX(r){if(!r)return!1;if(r.enabled===!0)return!0;return r.meta_governor?.enabled===!0}async function hX(r={}){let{loadMetaGovernorConfig:v}=await Promise.resolve().then(() => (T1(),i_)),b=await v(r);return h1(b.config)}T1();var Tr=new Map;function o_(r,v){Tr.set(r,v)}function hr(r){let v=Tr.get(r);if(v!==void 0)Tr.delete(r);return v}function fX(r){return Tr.has(r)}function yX(){for(let[r,v]of Tr)return Tr.delete(r),v;return}function iX(){Tr.clear()}class C1{store=new Map;maxEntries;ttlMs;now;constructor(r={}){this.maxEntries=r.maxEntries??100,this.ttlMs=r.ttlMs??3600000,this.now=r.now??Date.now}get(r){let v=this.store.get(r);if(!v)return;let b=this.now();if(v.expiresAtMs<=b){this.store.delete(r);return}return v.lastAccessAtMs=b,v.value}has(r){return this.get(r)!==void 0}set(r,v){let b=this.now();if(!this.store.has(r)&&this.store.size>=this.maxEntries)this.evictOldest();this.store.set(r,{value:v,expiresAtMs:b+this.ttlMs,lastAccessAtMs:b})}delete(r){return this.store.delete(r)}size(){return this.store.size}clear(){this.store.clear()}evictOldest(){let r,v=1/0;for(let[b,U]of this.store)if(U.lastAccessAtMs<v)v=U.lastAccessAtMs,r=b;if(r!==void 0)this.store.delete(r)}}import{statSync as Ej,readFileSync as uj}from"node:fs";import{execSync as Dj}from"node:child_process";import{join as a_}from"node:path";import{readFile as Bj}from"node:fs/promises";import{resolve as Gj}from"node:path";import{homedir as Hj}from"node:os";var f1=Gj(Hj(),".config","opencode","sisyphus-mandatory","sisyphus-mandatory.md");async function l_(r){return await Bj(r??f1,"utf-8")}function t_(r){let v=["","## Sisyphus Protocol Enforcement","","You MUST follow these Sisyphus protocol rules:","","1. **Pre-response Memory Check**: Before any action, read `<project-memory>` and `<session-history-since>` blocks in context. Cite `<memory id>` for any fact used from memory. Do not ask questions whose answers are in those blocks.","","2. **Codebase Graph First**: Before using grep/glob/read for architecture or symbol queries, check whether `.codegraph/` or `graphify-out/` exists. If so, use codegraph/graphify tools first, then grep/read only as last resort.","","3. **Tool Routing Table**: Match common intents to the correct tool:",' - "we did this before" / "you should know" → `agentmemory_memory_recall`'," - Starting a task that resembles a previous one → `agentmemory_memory_smart_search`"," - Before asking the user a clarifying question → `agentmemory_memory_recall` first"," - Save durable insight/decision/rule → `agentmemory_memory_save`",""];if(/\boracle\b/i.test(r))v.push("4. **Post-task Oracle Verification**: If files touched >= 3 OR any INVOKE trigger matches, invoke Oracle with the exact format:",' `task(subagent_type="oracle", run_in_background=false, prompt="Verify: ...")`'," - INVOKE triggers: created 1+ new file, modified abstraction, touched security/auth paths, modified DB/persistence, modified CI/CD, added/removed dependency, modified perf-critical path, todo had 2+ completed items."," - SKIP only when: files touched <= 2, no new file, no dependency change, single-step task, change is typo/comment/rename only."," - Verdict: PASS → done. FAIL/CONDITIONAL → fix and re-invoke. Max 3 invocations."," - Cost: Max 3 oracle invocations per task. Skip rate: Must NOT skip Oracle on 2+ file change.","");return v.push("5. **Parallel Query Rule**: Fire independent tool queries in the same turn. Do NOT serialize independent memory/context queries.","","6. **Empty-Result Escalation**: On empty `agentmemory_memory_recall`, fire `agentmemory_memory_smart_search` + `agentmemory_memory_export` before asking the user.","","7. **Hard Rules (No Exceptions)**:"," - Do NOT ask 'where is X?' if memory or session record already contains it."," - Do NOT claim 'I don't know' before firing at least 2 different recall tools."," - Do NOT re-issue clarifying questions whose answer is in `<project-memory>` or `<session-history-since>`."," - Do NOT suppress type errors with `as any`, `@ts-ignore`, or `@ts-expect-error`."," - Do NOT leave empty catch blocks `catch(e) {}`.",' - Do NOT start a fresh agent via `task()` when `task(task_id="ses_...")` (continuation) exists — use continuation IDs.'," - Do NOT batch-complete todos — mark each one `completed` immediately after finishing."," - Do NOT skip creating todos for multi-step tasks.","","8. **Self-Check Before Responding**:"," - Verify you read `<project-memory>` and `<session-history-since>` blocks."," - Verify you cited `<memory id>` for any fact used from memory."," - Verify you did not ask a question whose answer is in those blocks."," - For multi-file changes, verify Oracle was invoked."," - For codebase exploration, verify codegraph/graphify was tried before grep/read."," - After discovering something non-obvious, save it with `agentmemory_memory_save` so future sessions benefit.",""),v.join(`
177
177
  `)}function d_(r,v,b){let U=[],$=b.recentToolCalls??[],z=b.recentWriteContents??[],N=b.memorySaved??!1,I=b.batchCompletions??0;if((r==="grep"||r==="glob")&&(b.hasCodegraphDir||b.hasGraphifyDir)){let J=b.hasCodegraphDir?".codegraph":"graphify-out";U.push({rule:"codebase-graph-first",tool:r,severity:"media",detail:`Used ${r} when ${J} exists — should use codegraph/graphify first for architecture and symbol queries.`})}if(r==="task"&&v&&typeof v==="object"){let J=v;if(!J.task_id&&typeof J.prompt==="string"&&$.length>3)U.push({rule:"continuation-discipline",tool:r,severity:"leve",detail:`Started a new task() without task(task_id="ses_...") continuation ID. Use task_id to preserve the subagent's full context and save tokens.`})}let _=["write","edit","edit_block","desktop-commander_edit_block","desktop-commander_write_file"];if(_.includes(r)){let J=typeof v==="object"&&v!==null?JSON.stringify(v):String(v??""),w=/@ts-ignore|@ts-expect-error/.test(J),K=/\bas any\b/.test(J);if(w&&K)U.push({rule:"no-type-suppression",tool:r,severity:"grave",detail:"File write contains both @ts-ignore/@ts-expect-error AND 'as any' — double type suppression. "+"Both are forbidden by the Sisyphus protocol."});else if(w)U.push({rule:"no-type-suppression",tool:r,severity:"media",detail:"File write contains @ts-ignore or @ts-expect-error — both are forbidden. "+"Fix the underlying type error instead."});else if(K)U.push({rule:"no-type-suppression",tool:r,severity:"media",detail:"File write contains 'as any' — type suppression forbidden. "+"Use proper type narrowing instead."})}if(_.includes(r)){let J=typeof v==="object"&&v!==null?JSON.stringify(v):String(v??"");if(/catch\s*\(\s*\w+\s*\)\s*\{\s*\}/.test(J))U.push({rule:"no-empty-catch",tool:r,severity:"media",detail:"Empty catch block detected — `catch(e) {}` is forbidden. "+"Log the error or handle it gracefully."})}if(["grep","glob","read","codegraph_explore","graphify query"].includes(r)&&$.length>=2){if(!N)U.push({rule:"save-discovery-to-memory",tool:r,severity:"leve",detail:`Used ${r} to discover code but no memory save was made afterwards. Save non-obvious findings with agentmemory_memory_save so future sessions benefit.`})}if(I>0&&r!=="todowrite")U.push({rule:"no-batch-todo-completion",tool:r,severity:"leve",detail:"Batch todo completion detected. Each todo must be marked `completed` immediately "+"after finishing — do not batch-complete multiple items."});if(b.emptyRecall&&!b.escalationAttempted){if(r.startsWith("question")||r==="ask")U.push({rule:"empty-result-escalation",tool:r,severity:"grave",detail:"Memory recall returned empty but agent did not fire smart_search + export before asking the user. Steps 1-3 of empty-result escalation protocol are mandatory."})}let g=["agentmemory_memory_recall","agentmemory_memory_smart_search","agentmemory_memory_save"];if(!b.memoryToolsUsed.some((J)=>g.some((w)=>J.startsWith(w)))&&(r.startsWith("question")||r==="ask"))U.push({rule:"memory-first",tool:r,severity:"grave",detail:"Asked a question without first querying memory. Must fire agentmemory_memory_recall or agentmemory_memory_smart_search before asking the user."});if(b.filesChanged>=3&&!b.oracleInvoked){if(r!=="task"||!v||typeof v!=="object"||!("subagent_type"in v))U.push({rule:"oracle-verification",tool:r,severity:"media",detail:`Files changed (${b.filesChanged}) >= 3 but Oracle was not invoked. The POST-TASK ORACLE VERIFICATION protocol requires Oracle invocation on multi-file changes.`})}return U}var y1=["write","edit","edit_block","multi_edit","apply_patch","ast_grep_replace","refactor","desktop-commander_write_file","desktop-commander_edit_block"],Lj=["brainstorming","writing-plans","test-driven-development","systematic-debugging","subagent-driven-development"];function p_(r){let v=["[SKILL PRIMING] This session involves implementation work. Select precise skills for this task before writing code:"],b=1;if(r==="aas"||r==="both")v.push(`${b}. Query the AAS skill catalog (aas search_skills) for the 2-3 capabilities most relevant to this task (e.g. testing, architecture, language-specific), and compare candidates with aas get_skill.`),b++,v.push(`${b}. If 2+ viable candidates exist, compose a minimal stack (<= 3 skills) with aas compose_stack.`),b++;if(r==="superpowers"||r==="both")v.push(`${b}. If a matching superpowers skill is available and not yet active (${Lj.join(" / ")}), load it via the skill tool.`),b++;if(r==="both")v.push("If a superpowers skill is already active, skip the catalog step.");return v.push("Do NOT enumerate the full catalog — keep the stack minimal and task-specific."),v.join(`
178
178
  `)}function e_(r){if(r.trigger==="sessionStart")return!0;if(r.implementationToolSeen)return!0;return r.recentToolCalls.some((v)=>y1.includes(v))}var s_={continue:0,warn:1,escalate:2,stop:3};function i1(r,v){return s_[r]>=s_[v]}function xj(r){let v=r.args;if(!v||typeof v!=="object")return null;let b=["pattern","query","path","glob","regex","include_pattern"];for(let U of b){let $=v[U];if(typeof $==="string"&&$.trim().length>0)return $.trim()}return null}var Fj=Z_({sessionID:"__global__",global:!0,version:Vr}),mj=rO(Sj(),".config","opencode","meta-governor-health.json");function $O(r={},v={}){let b=Rr(),U=new n1;V_(U);let $=process.cwd(),z=Ov(),N=q_({graphRetrieval:b,cwd:$}),I=A_({sqlite:z}),_=B_({metrics:Fj,logFilePath:rr,healthFilePath:mj}),O=G_({cwd:$}),g=H_({cwd:$}),Y=L_({onDispatch:({sessionID:q,mcpTool:H,mcpArgs:u})=>{U.register({sessionID:q,mcpTool:H,mcpArgs:u})}}),J=S_({onDispatch:({sessionID:q,mcpTool:H,mcpArgs:u})=>{U.register({sessionID:q,mcpTool:H,mcpArgs:u})}}),w=E_({cwd:$}),K=u_({cwd:$});return m("info",`v${Vr} MetaGovernor plugin loaded`,{version:Vr,build:"0.19.5-instr",cwd:$,projectHasCodegraph:b.hasCodegraphDir($),projectHasGraphify:b.hasGraphifyDir($)}),async(q,H)=>{m("info",`v${Vr} factory_invoked`,{version:Vr,hasInput:q!=null,inputDir:q?.directory??null,inputKeys:q?Object.keys(q):[]});let u=q.client,D=u!=null&&typeof u==="object"&&"tool"in u?u:null;x_().setClient(D),P_(D);let T;try{T=await R1({projectDir:q.directory??$})}catch(X){throw m("error","factory_config_load_failed",{message:X instanceof Error?X.message:String(X),stack:X instanceof Error?X.stack?.slice(0,800):void 0}),X}let _r={...r,...T.config,...H?.meta_governor??{}},B;try{B=h1(_r)}catch(X){throw m("error","factory_orchestrator_config_failed",{message:X instanceof Error?X.message:String(X)}),X}if(T.sources.length>0)m("info",`v${Vr} config_loaded`,{version:Vr,sources:T.sources,effectiveSource:T.effectiveSource,enabled:B.enabled});if(B.postWave?.enabled===!0&&B.intervention.respectDoneSignal===!1)m("info","post_wave_warning",{message:"postWave.enabled=true but intervention.respectDoneSignal=false: post-wave directives still fire on Oracle-verified PHASE-N-COMPLETE, but the done-signal latch is off (intervention is not auto-disabled at plan end)."});let o1=new Set,l1=new Set,cr=q.directory?rO(q.directory):$,b$=r.graphSync??T.config?.graphSync??H?.meta_governor?.graphSync;if(b$?.enabled!==!1)v.__test_onGraphSyncInit?.({projectDir:cr}),(v.__test_runGraphSync??Nv)({enabled:!0,watch:b$?.watch??!1,autoInstall:b$?.autoInstall??!0,installTimeoutMs:b$?.installTimeoutMs??60000,killOrphanedOnInit:b$?.killOrphanedOnInit??!0,projectDir:cr}).then((G)=>{if(G?.attempted&&G.availability.codegraph&&G.availability.graphify)o1.add(cr)}).catch(()=>{}),YN(cr);if(!B.enabled)return{tool:{omo_search:N,omo_recall:I,omo_health:_,omo_find:O,omo_impact:g,omo_remember:Y,omo_recall_mcp:J,omo_path:w,omo_explain:K}};let V4=()=>B.modelOverride?.providerID??v.providerID?.(),c4=()=>B.modelOverride?.modelID??v.modelID?.(),vO=()=>B.modelOverride?.modelLimit??200000,dj=V4()??"unknown",pj=c4()??"unknown",p$;if(B.protocolEnforcement.enabled||B.protocolEnforcement.injectIntoSystem){let X=B.protocolEnforcement.path??f1;try{let G=await l_(X);p$=t_(G)}catch(G){if(typeof console<"u"&&B.modelOverride?.verbosity!=="silent")console.warn("[meta-governor] could not load protocol:",G instanceof Error?G.message:G)}}let qr=new C1({maxEntries:100,ttlMs:3600000}),e$=new Map,t1=300000,a$=new Map,d1=new Set,p1=new Set,e1=new Set,bO=()=>({currentWaveN:null,lastInjectedWaveN:null,lastInjectedAtMs:null,postWaveInjectionsThisWave:0,rulesReadForWave:{},oracleAfterPhaseAtMs:{},repoModeResolved:null}),a1=new Map,s$=(X,G)=>{if(!X||!G)return;if(!B.intervention.persistToSession)return;D1(X,G).then((V)=>{if(!V.ok)m("warn",`persist intervention failed for ${X}`,{error:V.error});else m("info",`persisted intervention for ${X}`)})};return{"tool.execute.before":async(X,G)=>{if(!B.enabled)return;if(!B.protocolEnforcement.auditToolCalls)return;if(!X.sessionID)return;let V=qr.get(X.sessionID);if(!V)V={memoryToolsUsed:[],hasCodegraphDir:b.hasCodegraphDir($),hasGraphifyDir:b.hasGraphifyDir($),oracleInvoked:!1,filesChanged:0,emptyRecall:!1,escalationAttempted:!1,recentToolCalls:[],recentWriteContents:[],recentWriteFilePaths:[],memorySaved:!1,accumulatedDeviations:[],recentInterventionTexts:[],batchCompletions:0,taskDoneSignal:!1,phaseCompleteSignal:!1,planCompleteSignal:!1,interventionCount:0,interventionDisabled:!1,lessonCount:0,iteration:0,postWave:{currentWaveN:null,lastInjectedWaveN:null,lastInjectedAtMs:null,postWaveInjectionsThisWave:0,rulesReadForWave:{},oracleAfterPhaseAtMs:{},repoModeResolved:null}},qr.set(X.sessionID,V);if(p$)console.log("[meta-governor] protocol loaded, system injection ready");let S=d_(X.tool,G.args,{memoryToolsUsed:V.memoryToolsUsed,hasCodegraphDir:V.hasCodegraphDir,hasGraphifyDir:V.hasGraphifyDir,oracleInvoked:V.oracleInvoked,filesChanged:V.filesChanged,emptyRecall:V.emptyRecall,escalationAttempted:V.escalationAttempted,recentToolCalls:V.recentToolCalls,recentWriteContents:V.recentWriteContents,memorySaved:V.memorySaved,batchCompletions:V.batchCompletions});if(S.length>0){m("warn",`protocol violations on tool ${X.tool}`,S);let C=e$.get(X.sessionID)?.items??[];for(let o of S)C.push(`[${o.severity.toUpperCase()}] ${o.rule}: ${o.detail}`);e$.set(X.sessionID,{items:C,expiresAtMs:Date.now()+t1});let br=S.map((o)=>({severity:o.severity,category:o.rule,detail:o.detail}));V.accumulatedDeviations=[...V.accumulatedDeviations,...br].slice(-5)}else m("info",`audit OK on tool ${X.tool}`);if((X.tool==="grep"||X.tool==="glob")&&(b.hasCodegraphDir($)||b.hasGraphifyDir($))){let C=xj(X);if(C)b.invoke($,C,{timeoutMs:5000}).then((br)=>{if(br.result)b.cacheContext(X.sessionID,C,br.result)}).catch(()=>{})}},"tool.execute.after":async(X,G)=>{if(!B.enabled)return;try{U.markDelivered({sessionID:X.sessionID,mcpTool:X.tool,mcpArgs:X.args})}catch{}if(y1.includes(X.tool))e1.add(X.sessionID);let V=qr.get(X.sessionID);if(V){if(V.iteration++,V.recentToolCalls=[X.tool].concat(V.recentToolCalls).slice(0,20),["write","edit","edit_block","desktop-commander_write_file","desktop-commander_edit_block"].includes(X.tool)){V.filesChanged++;let t=(G.output??"").slice(0,500);V.recentWriteContents=[t].concat(V.recentWriteContents).slice(0,3);let ur=X.args,l=ur?.filePath??ur?.path;if(typeof l==="string"&&l.length>0)V.recentWriteFilePaths=[l].concat(V.recentWriteFilePaths).slice(0,10)}if(["agentmemory_memory_recall","agentmemory_memory_smart_search","agentmemory_memory_save"].some((t)=>X.tool.startsWith(t))&&!V.memoryToolsUsed.includes(X.tool))V.memoryToolsUsed.push(X.tool);if(X.tool.startsWith("agentmemory_memory_save")){let t=G.output??"";if(t.includes("saved")||t.includes("written"))V.memorySaved=!0}if(X.tool==="task"&&(G.output??"").includes("subagent_type=oracle"))V.oracleInvoked=!0;let y=(G.output??"").toLowerCase();if(X.tool.includes("recall")&&(y.includes("returned empty")||y.includes("no results")))V.emptyRecall=!0;if(X.tool==="todowrite"&&(G.output??"").includes("completed")){if(((G.output??"").match(/"status":"completed"/g)??[]).length>=3)V.batchCompletions++}let F=[typeof G.output==="string"?G.output:"",typeof X.args==="string"?X.args:""].join(`
179
179
  `);if(!V.taskDoneSignal&&Rj(F))V.taskDoneSignal=!0,m("info",`task_done_signal detected (legacy) for session ${X.sessionID}`);if(!V.phaseCompleteSignal&&Tj(F))V.phaseCompleteSignal=!0,m("info",`phase_complete_signal detected for session ${X.sessionID}`);if(!V.planCompleteSignal&&hj(F))V.planCompleteSignal=!0,m("info",`plan_complete_signal detected for session ${X.sessionID}`)}if(B.postWave?.enabled){let x=B.postWave,Z=[typeof G.output==="string"?G.output:"",typeof X.args==="string"?X.args:""].join(`
@@ -206,5 +206,5 @@ Current decision: ${Ur.message}`;x.recentInterventionTexts=[...F,`[${Ur.action}]
206
206
  `)}function oj(r,v,b=Dj){if(r==="own"||r==="third-party")return r;try{let U=b("gh repo view --json isFork,parent",{cwd:v,stdio:"pipe",timeout:1e4}),$=JSON.parse(String(U));if($.isFork===!0&&$.parent!==null&&$.parent!==void 0)return"third-party";return"own"}catch{try{let U=b("git remote -v",{cwd:v,stdio:"pipe",timeout:1e4});if(String(U).split(`
207
207
  `).some((z)=>/^\s*upstream\s+/.test(z)))return"third-party"}catch{}return"own"}}var lj=$O();function Y4(r,v){return lj(r,v)}Y4.id="omo-meta-governor";Y4.server=Y4;var L9=Y4;export{L9 as default};
208
208
 
209
- //# debugId=78B67B2A5216405E64756E2164756E21
209
+ //# debugId=F6220D68F6A0C73B64756E2164756E21
210
210
  //# sourceMappingURL=index.js.map