@herjarsa/omo-meta-governor 0.11.2 → 0.12.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/README.md CHANGED
@@ -79,6 +79,17 @@ comments. The next LLM turn receives them as actionable feedback so the
79
79
  agent can apply fixes to keep the PR mergeable. Recognizes: codecov,
80
80
  claude-code-review, CodeRabbit, etc.
81
81
 
82
+ ## Auto-upgrade (v0.12.0)
83
+
84
+ On plugin load, queries npm/pip registries to check whether newer versions
85
+ of **codegraph** or **graphify** exist. If a newer version is found AND the
86
+ installed version is older, the plugin upgrades automatically.
87
+
88
+ - **Upgrade check TTL**: 24h by default. Cached to
89
+ `~/.config/opencode/omo-meta-governor-upgrade-check.json`.
90
+ - **Config**: `graphSync.autoUpgrade` (default `true`),
91
+ `graphSync.upgradeCheckTtlMs` (default `86400000`).
92
+
82
93
  ## Intervention
83
94
 
84
95
  MetaGovernor can inject its decisions into the active agent's context
@@ -22,13 +22,19 @@ export interface GraphSyncConfig {
22
22
  /** Project directory to initialize in. Default: cwd */
23
23
  projectDir?: string;
24
24
  /**
25
- * Auto-install missing backends. Default: true.
26
- * - codegraph: installed via `npm i -D @colbymchenry/codegraph` in the project
27
- * - graphify: installed via `pip install graphifyy --break-system-packages` (or `uv tool install graphifyy`)
28
- */
25
+ * Auto-install missing backends. Default: true.
26
+ * - codegraph: installed via `npm i -D @colbymchenry/codegraph` in the project
27
+ * - graphify: installed via `pip install graphifyy --break-system-packages` (or `uv tool install graphifyy`)
28
+ */
29
29
  autoInstall: boolean;
30
30
  /** Max ms to wait for each install. Default: 60_000 */
31
31
  installTimeoutMs: number;
32
+ /** v0.12.0: Auto-upgrade codegraph/graphify when new versions are published.
33
+ * On plugin load, queries npm/pip registries and upgrades if newer version
34
+ * exists. Respects upgradeCheckTtlMs to avoid hammering registries. */
35
+ autoUpgrade?: boolean;
36
+ /** v0.12.0: Min ms between registry queries for version check. Default 24h. */
37
+ upgradeCheckTtlMs?: number;
32
38
  }
33
39
  export type InstallCode = "codegraph-installed" | "codegraph-install-failed" | "codegraph-install-skipped" | "graphify-installed" | "graphify-install-failed" | "graphify-install-skipped";
34
40
  /**
@@ -83,10 +89,10 @@ export interface GraphSyncResult {
83
89
  /** Whether this project was already initialized this session */
84
90
  alreadyInitialized: boolean;
85
91
  }
86
- export type GraphSyncCode = "codegraph-initialized" | "codegraph-already-exists" | "codegraph-unavailable" | "codegraph-install-failed" | "codegraph-install-skipped" | "graphify-initialized" | "graphify-already-exists" | "graphify-unavailable" | "graphify-install-failed" | "graphify-install-skipped" | "watch-started-codegraph" | "watch-started-graphify" | "disabled" | "error" | "graphify-hook-installed";
92
+ export type GraphSyncCode = "codegraph-initialized" | "codegraph-already-exists" | "codegraph-unavailable" | "codegraph-install-failed" | "codegraph-install-skipped" | "graphify-initialized" | "graphify-already-exists" | "graphify-unavailable" | "graphify-install-failed" | "graphify-install-skipped" | "watch-started-codegraph" | "watch-started-graphify" | "disabled" | "error" | "graphify-hook-installed" | "codegraph-upgraded" | "graphify-upgraded" | "upgrade-check-skipped";
87
93
  /**
88
- * Run the graphSync pipeline. Best-effort, never throws.
89
- */
94
+ * Run the graphSync pipeline. Best-effort, never throws.
95
+ */
90
96
  export declare function runGraphSync(config?: GraphSyncConfig): Promise<GraphSyncResult>;
91
97
  /**
92
98
  * Detect whether a shell command string contains `git commit`.
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
- import{createRequire as KQ}from"node:module";var sK=Object.defineProperty;var iK=(K)=>K;function tK(K,Q){this[K]=iK.bind(null,Q)}var oK=(K,Q)=>{for(var X in Q)sK(K,X,{get:Q[X],enumerable:!0,configurable:!0,set:tK.bind(Q,X)})};var eK=(K,Q)=>()=>(K&&(Q=K(K=0)),Q);var C=KQ(import.meta.url);var uK={};oK(uK,{stripJsoncComments:()=>VK,parseJsonc:()=>BK,loadMetaGovernorConfig:()=>pK,loadJsoncFile:()=>a,getUserConfigPath:()=>UK,getProjectConfigPath:()=>HK,deepMerge:()=>S});import{readFile as SQ,access as hQ}from"node:fs/promises";import{resolve as vQ,join as fQ}from"node:path";import{homedir as mQ}from"node:os";function VK(K){let Q=[],X=0;while(X<K.length){let $=K[X];if($==='"'||$==="'"){let J=$;Q.push(J),X++;while(X<K.length){let q=K[X];if(Q.push(q),q==="\\"){if(X++,X<K.length)Q.push(K[X])}else if(q===J){X++;break}X++}continue}if($==="/"&&X+1<K.length&&K[X+1]==="/"){X+=2;while(X<K.length&&K[X]!==`
2
- `)X++;continue}if($==="/"&&X+1<K.length&&K[X+1]==="*"){X+=2;while(X<K.length){if(K[X]==="*"&&X+1<K.length&&K[X+1]==="/"){X+=2;break}X++}continue}Q.push($),X++}let Z=Q.join("");for(let $=0;$<10;$++){let J=Z;if(Z=Z.replace(/,(\s*[\]}])/g,"$1"),Z===J)break}return Z}function BK(K){try{let Q=VK(K);return JSON.parse(Q)}catch{return}}function UK(){return vQ(mQ(),".config","opencode",gK)}function HK(K){let Q=K??process.cwd();return fQ(Q,".opencode",gK)}async function gQ(K){try{return await hQ(K),!0}catch{return!1}}async function a(K){if(!await gQ(K))return;try{let Q=await SQ(K,"utf-8");return BK(Q)}catch{return}}function S(K,Q){let X={...K};for(let Z of Object.keys(Q)){let $=Q[Z],J=X[Z];if($===void 0)continue;if(mK($)&&mK(J))X[Z]=S(J,$);else X[Z]=$}return X}function mK(K){return typeof K==="object"&&K!==null&&!Array.isArray(K)}async function pK(K={}){let Q=[],X="defaults",Z={},$=UK(),J=await a($);if(J)Z=S(Z,J),Q.push(`user:${$}`),X="user";let q=HK(K.projectDir),W=await a(q);if(W)Z=S(Z,W),Q.push(`project:${q}`),X="project";if(K.cliOptions&&Object.keys(K.cliOptions).length>0)Z=S(Z,K.cliOptions),Q.push("cli:inline"),X="cli";return{config:Z,sources:Q,effectiveSource:X}}var gK="omo-meta-governor.jsonc";var GK=()=>{};import{execSync as R,spawn as RK}from"node:child_process";import{access as QQ,stat as XQ}from"node:fs/promises";import{resolve as g}from"node:path";import{constants as ZQ}from"node:fs";async function $Q(K,Q=60000){try{return R("npm i -D @colbymchenry/codegraph",{cwd:K,stdio:"ignore",timeout:Q}),"codegraph-installed"}catch{return"codegraph-install-failed"}}async function JQ(K=60000){try{return R("pip install graphifyy --break-system-packages --quiet",{stdio:"ignore",timeout:K}),"graphify-installed"}catch{try{return R("uv tool install graphifyy --quiet",{stdio:"ignore",timeout:K}),"graphify-installed"}catch{return"graphify-install-failed"}}}var t=new Set;function qQ(){t.clear()}var NK=new Map;function bK(K){let X=(NK.get(K)??0)+1;return NK.set(K,X),X}async function EK(K){let Q=!1,X=!1,Z=await m(g(K,".codegraph")),$=await m(g(K,"graphify-out"));try{R("npx --yes codegraph --version",{stdio:"ignore",timeout:1e4}),Q=!0}catch{try{R("node node_modules/.bin/codegraph --version",{cwd:K,stdio:"ignore",timeout:5000}),Q=!0}catch{}}try{R("python3 -c 'import graphify; print(graphify.__version__)'",{stdio:"ignore",timeout:5000}),X=!0}catch{try{R("python3 -c 'import graphifyy; print(graphifyy.__version__)'",{stdio:"ignore",timeout:5000}),X=!0}catch{}}return{codegraph:Q,graphify:X,codegraphIndexExists:Z,graphifyIndexExists:$}}async function zQ(K){let Q=g(K,".codegraph");await CK(Q);try{R("npx --yes codegraph init",{cwd:K,stdio:"ignore",timeout:60000})}catch{}}async function YQ(K){let Q=g(K,"graphify-out");await CK(Q);try{R("python3 -m graphify . --no-viz",{cwd:K,stdio:"ignore",timeout:120000})}catch{try{R("graphifyy . --no-viz",{cwd:K,stdio:"ignore",timeout:120000})}catch{}}}var f=new Map;function kK(K,Q){let X=`${K}:${Q}`;if(f.has(X))return;try{let Z;if(Q==="codegraph")Z=RK("node",["-e",`
1
+ import{createRequire as qQ}from"node:module";var QQ=Object.defineProperty;var XQ=(K)=>K;function ZQ(K,Q){this[K]=XQ.bind(null,Q)}var $Q=(K,Q)=>{for(var X in Q)QQ(K,X,{get:Q[X],enumerable:!0,configurable:!0,set:ZQ.bind(Q,X)})};var JQ=(K,Q)=>()=>(K&&(Q=K(K=0)),Q);var F=qQ(import.meta.url);var nK={};$Q(nK,{stripJsoncComments:()=>UK,parseJsonc:()=>VK,loadMetaGovernorConfig:()=>rK,loadJsoncFile:()=>a,getUserConfigPath:()=>GK,getProjectConfigPath:()=>_K,deepMerge:()=>h});import{readFile as cQ,access as aQ}from"node:fs/promises";import{resolve as rQ,join as nQ}from"node:path";import{homedir as sQ}from"node:os";function UK(K){let Q=[],X=0;while(X<K.length){let $=K[X];if($==='"'||$==="'"){let J=$;Q.push(J),X++;while(X<K.length){let q=K[X];if(Q.push(q),q==="\\"){if(X++,X<K.length)Q.push(K[X])}else if(q===J){X++;break}X++}continue}if($==="/"&&X+1<K.length&&K[X+1]==="/"){X+=2;while(X<K.length&&K[X]!==`
2
+ `)X++;continue}if($==="/"&&X+1<K.length&&K[X+1]==="*"){X+=2;while(X<K.length){if(K[X]==="*"&&X+1<K.length&&K[X+1]==="/"){X+=2;break}X++}continue}Q.push($),X++}let Z=Q.join("");for(let $=0;$<10;$++){let J=Z;if(Z=Z.replace(/,(\s*[\]}])/g,"$1"),Z===J)break}return Z}function VK(K){try{let Q=UK(K);return JSON.parse(Q)}catch{return}}function GK(){return rQ(sQ(),".config","opencode",aK)}function _K(K){let Q=K??process.cwd();return nQ(Q,".opencode",aK)}async function iQ(K){try{return await aQ(K),!0}catch{return!1}}async function a(K){if(!await iQ(K))return;try{let Q=await cQ(K,"utf-8");return VK(Q)}catch{return}}function h(K,Q){let X={...K};for(let Z of Object.keys(Q)){let $=Q[Z],J=X[Z];if($===void 0)continue;if(cK($)&&cK(J))X[Z]=h(J,$);else X[Z]=$}return X}function cK(K){return typeof K==="object"&&K!==null&&!Array.isArray(K)}async function rK(K={}){let Q=[],X="defaults",Z={},$=GK(),J=await a($);if(J)Z=h(Z,J),Q.push(`user:${$}`),X="user";let q=_K(K.projectDir),Y=await a(q);if(Y)Z=h(Z,Y),Q.push(`project:${q}`),X="project";if(K.cliOptions&&Object.keys(K.cliOptions).length>0)Z=h(Z,K.cliOptions),Q.push("cli:inline"),X="cli";return{config:Z,sources:Q,effectiveSource:X}}var aK="omo-meta-governor.jsonc";var AK=()=>{};import{execSync as k,spawn as NK}from"node:child_process";import{access as zQ,stat as YQ}from"node:fs/promises";import{resolve as p}from"node:path";import{constants as WQ}from"node:fs";async function EK(K,Q=60000){try{return k("npm i -D @colbymchenry/codegraph",{cwd:K,stdio:"ignore",timeout:Q}),"codegraph-installed"}catch{return"codegraph-install-failed"}}async function kK(K=60000){try{return k("pip install graphifyy --break-system-packages --quiet",{stdio:"ignore",timeout:K}),"graphify-installed"}catch{try{return k("uv tool install graphifyy --quiet",{stdio:"ignore",timeout:K}),"graphify-installed"}catch{return"graphify-install-failed"}}}var o=new Set;function BQ(){o.clear()}var TK=new Map;function IK(K){let X=(TK.get(K)??0)+1;return TK.set(K,X),X}async function bK(K){let Q=!1,X=!1,Z=await g(p(K,".codegraph")),$=await g(p(K,"graphify-out"));try{k("npx --yes codegraph --version",{stdio:"ignore",timeout:1e4}),Q=!0}catch{try{k("node node_modules/.bin/codegraph --version",{cwd:K,stdio:"ignore",timeout:5000}),Q=!0}catch{}}try{k("python3 -c 'import graphify; print(graphify.__version__)'",{stdio:"ignore",timeout:5000}),X=!0}catch{try{k("python3 -c 'import graphifyy; print(graphifyy.__version__)'",{stdio:"ignore",timeout:5000}),X=!0}catch{}}return{codegraph:Q,graphify:X,codegraphIndexExists:Z,graphifyIndexExists:$}}async function HQ(K){let Q=p(K,".codegraph");await SK(Q);try{k("npx --yes codegraph init",{cwd:K,stdio:"ignore",timeout:60000})}catch{}}async function UQ(K){let Q=p(K,"graphify-out");await SK(Q);try{k("python3 -m graphify . --no-viz",{cwd:K,stdio:"ignore",timeout:120000})}catch{try{k("graphifyy . --no-viz",{cwd:K,stdio:"ignore",timeout:120000})}catch{}}}var m=new Map;function CK(K,Q){let X=`${K}:${Q}`;if(m.has(X))return;try{let Z;if(Q==="codegraph")Z=NK("node",["-e",`
3
3
  const {execSync} = require("child_process");
4
4
  const run = () => {
5
5
  try { execSync("npx codegraph update 2>/dev/null", {cwd: ${JSON.stringify(K)}, stdio: "ignore"}); }
@@ -7,23 +7,24 @@ import{createRequire as KQ}from"node:module";var sK=Object.defineProperty;var iK
7
7
  };
8
8
  run();
9
9
  setInterval(run, 30_000);
10
- `],{stdio:"ignore",detached:!0});else Z=RK("python3",["-m","graphify",".","--no-viz","--watch"],{cwd:K,stdio:"ignore",detached:!0});Z.unref(),f.set(X,{process:Z,tool:Q}),Z.on("exit",()=>{f.delete(X)})}catch{}}function WQ(K){for(let[Q,X]of f)if(!K||Q.startsWith(K)){try{X.process.kill("SIGTERM")}catch{}setTimeout(()=>{try{X.process.kill("SIGKILL")}catch{}},2000).unref(),f.delete(Q)}}async function p(K={enabled:!0,watch:!1,autoInstall:!0,installTimeoutMs:60000}){let Q=[],X=K.projectDir??process.cwd();if(!K.enabled)return{attempted:!1,codes:["disabled"],availability:{codegraph:!1,graphify:!1,codegraphIndexExists:!1,graphifyIndexExists:!1},alreadyInitialized:!1};if(t.has(X)){let $=await EK(X);return{attempted:!1,codes:$.codegraphIndexExists?["codegraph-already-exists"]:[],availability:$,alreadyInitialized:!0}}t.add(X);let Z;try{Z=await EK(X)}catch{return{attempted:!1,codes:["error"],availability:{codegraph:!1,graphify:!1,codegraphIndexExists:!1,graphifyIndexExists:!1},alreadyInitialized:!1}}if(K.autoInstall!==!1){if(!Z.codegraph){let $=await $Q(X,K.installTimeoutMs??60000);if(Q.push($),$==="codegraph-installed")Z.codegraph=!0}if(!Z.graphify){let $=await JQ(K.installTimeoutMs??60000);if(Q.push($),$==="graphify-installed")Z.graphify=!0}}else{if(!Z.codegraph)Q.push("codegraph-install-skipped");if(!Z.graphify)Q.push("graphify-install-skipped")}if(Z.codegraph)if(!Z.codegraphIndexExists)try{await zQ(X),Q.push("codegraph-initialized")}catch{Q.push("error")}else Q.push("codegraph-already-exists");else Q.push("codegraph-unavailable");if(Z.graphify){if(!Z.graphifyIndexExists)try{await YQ(X),Q.push("graphify-initialized")}catch{Q.push("error")}else Q.push("graphify-already-exists");try{if(!await VQ(X))R("graphify hook install",{cwd:X,stdio:"ignore",timeout:1e4}),Q.push("graphify-hook-installed")}catch{}}else Q.push("graphify-unavailable");if(K.watch){if(Z.codegraph)kK(X,"codegraph"),Q.push("watch-started-codegraph");if(Z.graphify)kK(X,"graphify"),Q.push("watch-started-graphify")}return{attempted:!0,codes:Q,availability:Z,alreadyInitialized:!1}}async function m(K){try{return(await XQ(K)).isDirectory()}catch{return!1}}async function CK(K){try{await QQ(K,ZQ.F_OK)}catch{let{mkdir:Q}=await import("node:fs/promises");await Q(K,{recursive:!0})}}function o(K){if(typeof K!=="string"||K.length===0)return!1;let Q=K.replace(/\\\n/g," ").replace(/\s*\n\s*/g," ");return/(?:^|[\s;&|])git\s+commit(?:\s+-|\s|$)/.test(Q)}async function VQ(K){let{access:Q,readFile:X}=await import("node:fs/promises"),{resolve:Z}=await import("node:path"),$=Z(K,".git","hooks","post-commit");try{await Q($)}catch{return!1}try{return(await X($,"utf-8")).includes("graphify-hook-start")}catch{return!1}}async function yK(K){let{execSync:Q}=await import("node:child_process"),{access:X}=await import("node:fs/promises"),{resolve:Z}=await import("node:path"),$=[],J=await m(Z(K,".codegraph")),q=!1;try{Q("npx --yes codegraph --version",{stdio:"ignore",timeout:5000}),q=!0}catch{try{Q("node node_modules/.bin/codegraph --version",{cwd:K,stdio:"ignore",timeout:5000}),q=!0}catch{}}if(!q)return{attempted:!0,codes:["codegraph-unavailable"],availability:{codegraph:!1,graphify:!1,codegraphIndexExists:J,graphifyIndexExists:await m(Z(K,"graphify-out"))},alreadyInitialized:!1};if(!J)return await p({enabled:!0,watch:!1,autoInstall:!1,installTimeoutMs:5000,projectDir:K});try{let W=Q("npx --yes codegraph sync -q",{cwd:K,stdio:"ignore",timeout:30000});$.push("codegraph-already-exists"),TK?.("info",`codegraph sync -q completed for ${K}`)}catch(W){TK?.("warn",`codegraph sync failed for ${K}: ${W}`),$.push("codegraph-install-failed")}return{attempted:!0,codes:$,availability:{codegraph:!0,graphify:!1,codegraphIndexExists:J,graphifyIndexExists:await m(Z(K,"graphify-out"))},alreadyInitialized:!1}}function TK(K,Q){}var xK={limits:{maxLessons:10,maxSlots:20,maxTasks:10},timeouts:{agentmemoryMs:2000,magicContextMs:1000,boulderStateMs:1000}};async function XK(K,Q){let X=performance.now(),Z={...xK.limits,...K.limits},$={...xK.timeouts,...K.timeouts},[J,q,W]=await Promise.allSettled([BQ(K,Q.agentmemory,Z,$.agentmemoryMs),UQ(K,Q.magicContext,Z,$.magicContextMs),HQ(K,Q.boulderState,Z,$.boulderStateMs)]),B=[],H={},z=J.status==="fulfilled"?J.value:(KK(B,H,"agentmemory",e(J.reason)),QK.agentmemory),G=q.status==="fulfilled"?q.value:(KK(B,H,"magicContext",e(q.reason)),QK.magicContext),_=W.status==="fulfilled"?W.value:(KK(B,H,"boulderState",e(W.reason)),QK.boulderState);return{query:K.query,timestampISO:new Date().toISOString(),agentmemory:z,magicContext:G,boulderState:_,degradedSources:B,durationMs:performance.now()-X,errorMessages:H}}async function BQ(K,Q,X,Z){let $=await ZK(Q.smartSearch({query:K.query,limit:X.maxLessons}),Z,"agentmemory");return{available:!0,lessons:GQ($.lessons).slice(0,X.maxLessons).map((q)=>({id:q.id,title:q.title,advice:"info",confidence:q.confidence,concepts:q.concepts}))}}async function UQ(K,Q,X,Z){return{available:!0,slots:(await ZK(Q.slotList({directory:K.directory}),Z,"magicContext")).filter((J)=>J.label.startsWith("meta_governor:")||_Q(J,K.query)).sort((J,q)=>J.label.localeCompare(q.label)).slice(0,X.maxSlots).map((J)=>({label:J.label,content:J.content}))}}async function HQ(K,Q,X,Z){let $=await ZK(Q.boulderRead({directory:K.directory,sessionID:K.sessionID,query:K.query}),Z,"boulderState");return{available:!0,tasks:$.sort((q,W)=>q.priority-W.priority||W.updatedAtMs-q.updatedAtMs).slice(0,X.maxTasks).map((q)=>({id:q.id,status:q.status,title:q.title})),planProgress:wQ($)}}function GQ(K){return[...K].sort((Q,X)=>X.confidence-Q.confidence)}function _Q(K,Q){let X=Q.toLowerCase();return K.label.toLowerCase().includes(X)||K.content.toLowerCase().includes(X)}function wQ(K){if(K.length===0)return 0;return K.filter((X)=>X.status==="done").length/K.length}function e(K){if(K instanceof Error)return K.message;if(typeof K==="string")return K;return"unknown error"}function KK(K,Q,X,Z){K.push(X),Q[X]=Z}var QK={agentmemory:{available:!1,lessons:[]},magicContext:{available:!1,slots:[]},boulderState:{available:!1,tasks:[],planProgress:0}};async function ZK(K,Q,X){return new Promise((Z,$)=>{let J=setTimeout(()=>$(Error(`${X} timeout after ${Q}ms`)),Q);K.then((q)=>{clearTimeout(J),Z(q)},(q)=>{clearTimeout(J),$(q)})})}function AQ(){return{compactBurnRateThreshold:500,compactUsageThreshold:0.85,switchModelUsageThreshold:0.95,delegateConsecutiveHighBurn:5,windowSize:10}}function jK(K){if(K.length===0)return 0;return K.reduce((X,Z)=>X+Z,0)/K.length}function FQ(K,Q){let X=0;for(let Z=K.length-1;Z>=0;Z--)if(K[Z]>=Q)X++;else break;return X}function LQ(K,Q,X,Z){let $=Q-K;if($<=0)return Z;if(X<=0)return null;let J=Math.floor($/X);if(J<=0)return Z;let q=J*2;return new Date(new Date(Z).getTime()+q*1000).toISOString()}function $K(K){let{currentUsage:Q,modelLimit:X,recentTurnTokens:Z,timestampISO:$,config:J}=K,q=Z.slice(-J.windowSize),W=jK(q),B=X-Q,H=X>0?Q/X:1,z=Math.min(0.95,0.3+q.length/J.windowSize*0.65),G="no-action",_="within normal parameters";if(H>=J.switchModelUsageThreshold)G="switch-model",_=`context usage ${(H*100).toFixed(1)}% exceeds switch threshold ${(J.switchModelUsageThreshold*100).toFixed(1)}%`;if(H>=J.compactUsageThreshold||W>=J.compactBurnRateThreshold){if(G==="no-action")G="compact-now",_=H>=J.compactUsageThreshold?`context usage ${(H*100).toFixed(1)}% exceeds compact threshold ${(J.compactUsageThreshold*100).toFixed(1)}%`:`burn rate ${W.toFixed(0)} tokens/turn exceeds threshold ${J.compactBurnRateThreshold}`}let M=FQ(q,J.compactBurnRateThreshold);if(M>=J.delegateConsecutiveHighBurn&&G==="no-action")G="delegate-to-subagent",_=`${M} consecutive high-burn turns (threshold: ${J.delegateConsecutiveHighBurn})`;let A=LQ(Q,X,W,$);return{currentUsage:Q,burnRate:W,budgetLeft:B,willOverflowAt:A,recommendation:G,confidence:z,modelLimit:X,windowRemaining:Math.max(0,Math.floor(B/Math.max(W,1))),input:{...K},computedAtISO:$,turnsAnalyzed:q.length}}var k={"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},u=()=>({continueThreshold:0.3,warnThreshold:0.3,escalateThreshold:0.6,stopThreshold:0.8,paralysisThreshold:3,defaultEscalationTarget:"oracle"});function OQ(K){let Q=[];Q.push({source:"oracle-verified",rawScore:K.oracleVerified?0.6:0,weight:k["oracle-verified"],weightedScore:K.oracleVerified?0.6*k["oracle-verified"]:0,description:K.oracleVerified?"Oracle verification passed":"No Oracle verification"}),Q.push({source:"no-progress-detector",rawScore:K.noProgress?-0.8:0,weight:k["no-progress-detector"],weightedScore:K.noProgress?-0.8*k["no-progress-detector"]:0,description:K.noProgress?"No progress detected in last turn":"Progress detected"});let X=PQ(K.deviations);Q.push({source:"deviation-detector",rawScore:X,weight:k["deviation-detector"],weightedScore:X*k["deviation-detector"],description:K.deviations.length>0?`${K.deviations.length} deviation(s) detected (worst: ${K.deviations[0].severity})`:"No deviations detected"});let Z=MQ(K.iterationRatio);Q.push({source:"iteration-budget",rawScore:Z,weight:k["iteration-budget"],weightedScore:Z*k["iteration-budget"],description:`Iteration ratio: ${K.iterationRatio.toFixed(2)} (${K.ambient.iteration}/${K.ambient.maxIterations})`});let $=RQ(K.lessonsRelevant);return Q.push({source:"lesson-recall",rawScore:$,weight:k["lesson-recall"],weightedScore:$*k["lesson-recall"],description:K.lessonsRelevant.length>0?`${K.lessonsRelevant.length} relevant lesson(s) (avg confidence: ${NQ(K.lessonsRelevant).toFixed(2)})`:"No relevant lessons"}),Q}function PQ(K){if(K.length===0)return 0;let Q={grave:-0.9,media:-0.5,leve:-0.2},X=0;for(let $ of K){let J=Q[$.severity]??-0.3;if(J<X)X=J}let Z=Math.min(K.length*0.05,0.2);return Math.max(X-Z,-1)}function MQ(K){if(K<=0.5)return-K*0.6;return-0.3-(K-0.5)*1}function RQ(K){if(K.length===0)return 0;let Q=0;for(let X of K)Q+=({continue:0.3,info:0,warn:-0.3,stop:-0.7}[X.advice]??0)*X.confidence;return Math.max(Math.min(Q/K.length,1),-1)}function NQ(K){if(K.length===0)return 0;return K.reduce((Q,X)=>Q+X.confidence,0)/K.length}function EQ(K,Q){if(K>=Q.continueThreshold)return"continue";if(K<=-Q.stopThreshold)return"stop";if(K<=-Q.escalateThreshold)return"escalate";if(K<=-Q.warnThreshold)return"warn";return"continue"}function kQ(K,Q){if(!K.oracleVerified)return"oracle";if(K.deviations.some((X)=>X.severity==="grave"))return"user";return Q.defaultEscalationTarget}function DK(K,Q,X,Z){if(Z)return`Paralysis detected: forced continue despite score ${K.toFixed(3)} (too many consecutive stops)`;let $=[...X].sort((H,z)=>H.weightedScore-z.weightedScore),J=$[0],q=$[$.length-1],W=[];if(J.weightedScore<0)W.push(`primary concern: ${J.description}`);if(q.weightedScore>0)W.push(`positive signal: ${q.description}`);return`${{continue:"Continue",warn:"Warn",escalate:"Escalate",stop:"Stop"}[Q]} (score: ${K.toFixed(3)}): ${W.join("; ")||"balanced signals"}`}function JK(K,Q){let X={...u(),...Q},Z=OQ(K),$=Z.reduce((G,_)=>G+_.weightedScore,0),J=Math.max(Math.min($,1),-1),q=K.slotMemory.consecutiveStops>=X.paralysisThreshold&&J<=-X.warnThreshold,W=q?"continue":EQ(J,X),B=[];if(W!=="continue"||Math.abs(J)<X.continueThreshold){for(let G of Z)if(Math.abs(G.weightedScore)>0.01)B.push({source:G.source,value:G.description,confidence:Math.abs(G.rawScore),weight:G.weight});if(B.length===0&&W!=="continue")B.push({source:"ambient",value:DK(J,W,Z,q),confidence:0.5,weight:0.1})}let H=W==="escalate"?kQ(K,X):null;return{decision:{action:W,score:J,reasoning:DK(J,W,Z,q),evidence:B,shouldEscalateTo:H},contributions:Z,rawScore:J,paralysisOverride:q,computedAtISO:new Date().toISOString()}}var l=()=>({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 d(K,Q){let X=K;for(let[Z,$]of Object.entries(Q))X=X.replaceAll(`{${Z}}`,$);return X}function TQ(K){return K.length}function qK(K,Q){let X={...l(),...Q};if(!X.enabled)return{action:"continue",message:null,historyEntry:{decision:K.scoringResult.decision,action:"continue",timestampISO:new Date().toISOString(),sessionID:K.sessionID,reasoning:"Decision handler disabled — pass-through continue"}};let Z=K.scoringResult.decision,$=Z.score,J=Z.reasoning,q=TQ(Z.evidence),W=Z.shouldEscalateTo??X.defaultEscalationTarget??"oracle";if(K.scoringResult.paralysisOverride)return{action:"continue",message:d(X.warnMessageTemplate,{score:$.toFixed(3),reasoning:`Paralysis detected — forced continue. ${J}`,evidenceCount:String(q)}),historyEntry:{decision:Z,action:"continue",timestampISO:new Date().toISOString(),sessionID:K.sessionID,reasoning:`Paralysis override: ${J}`}};switch(Z.action){case"continue":return{action:"continue",message:null,historyEntry:{decision:Z,action:"continue",timestampISO:new Date().toISOString(),sessionID:K.sessionID,reasoning:J}};case"warn":return{action:"warn",message:d(X.warnMessageTemplate,{score:$.toFixed(3),reasoning:J,evidenceCount:String(q)}),historyEntry:{decision:Z,action:"warn",timestampISO:new Date().toISOString(),sessionID:K.sessionID,reasoning:J}};case"escalate":return{action:"escalate",message:d(X.escalateMessageTemplate,{target:W,reasoning:J}),historyEntry:{decision:Z,action:"escalate",timestampISO:new Date().toISOString(),sessionID:K.sessionID,reasoning:`Escalate to ${W}: ${J}`}};case"stop":return{action:"stop",message:d(X.stopMessageTemplate,{reasoning:J,evidenceCount:String(q)}),historyEntry:{decision:Z,action:"stop",timestampISO:new Date().toISOString(),sessionID:K.sessionID,reasoning:J}}}}function bQ(K,Q){if(K.length<=Q)return{trimmed:[...K],dropped:0};let X=K.length-Q;return{trimmed:K.slice(-Q),dropped:X}}function CQ(K){let Q=0;for(let X=K.length-1;X>=0;X--)if(K[X].action==="stop")Q++;else break;return Q}var IK={leve:0,media:1,grave:2};function yQ(K,Q,X){let Z=`${K}-${Q}-${X}`.split("").reduce(($,J)=>($<<5)-$+J.charCodeAt(0)|0,0);return`D-${Math.abs(Z).toString(36)}`}function SK(K,Q){let X=IK[Q]??0;return K.some((Z)=>(IK[Z.severity]??0)>=X)}function xQ(K){let Q=new Set;for(let X of K)Q.add(X.category),Q.add(X.severity);return[...Q]}function jQ(K,Q){let X=Q.map((Z)=>`[${Z.severity}] ${Z.category}: ${Z.detail}`).join("; ");return`Action "${K.action}" (score ${K.score.toFixed(2)}) after deviations: ${X}. Reasoning: ${K.reasoning}`}async function zK(K,Q){let{decision:X,config:Z,sessionID:$,directory:J,filesChanged:q}=K,W=new Date().toISOString();if(!Z.enabled)return{lessonSaved:null,decisionSaved:null,reason:"closed-loop learning disabled"};if(X.evidence.length===0&&X.action==="continue")return{lessonSaved:null,decisionSaved:null,reason:"no deviations to learn from"};let B=null,H=null;if(Z.saveDecisions){let _={id:yQ($,X.action,W),timestampISO:W,action:X.action,score:X.score,reasoning:X.reasoning,sessionID:$,directory:J,deviations:X.evidence.filter((M)=>M.source==="deviation-detector").map((M)=>({severity:"media",category:M.source,detail:M.value}))};try{await Q.saveMemory({content:`Decision: ${X.action} (score ${X.score.toFixed(2)}). ${X.reasoning}`,concepts:["meta-governor","decision",X.action],type:"fact",files:[...q]}),H=_}catch{}}let z=X.evidence.filter((_)=>_.source==="deviation-detector").map((_)=>({severity:"media",category:_.source,detail:_.value}));if(SK(z,Z.minSeverityToLearn)){let _=xQ(z),M=jQ(X,z);try{B={id:(await Q.saveLesson({content:M,context:`session:${$} dir:${J}`,confidence:Math.max(0.3,Math.min(0.8,Math.abs(X.score))),tags:_})).id,title:`${X.action} after ${z[0]?.category??"deviation"}`,content:M,type:"pattern",concepts:_,confidence:Math.max(0.3,Math.min(0.8,Math.abs(X.score))),files:[...q],sessionID:$}}catch{}}let G=[];if(H)G.push("decision saved");if(B)G.push("lesson saved");if(!H&&!B)if(!SK(z,Z.minSeverityToLearn))G.push("severity below threshold");else G.push("no saveable content");return{lessonSaved:B,decisionSaved:H,reason:G.join("; ")||"no action taken"}}function D(){return{enabled:!0,minSeverityToLearn:"media",maxLessonsPerSession:20,saveDecisions:!0}}var vK=()=>({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},protocolEnforcement:{enabled:!1,path:void 0,injectIntoSystem:!1,auditToolCalls:!1}}),YK={query:"",timestampISO:new Date().toISOString(),agentmemory:{available:!1,lessons:[]},magicContext:{available:!1,slots:[]},boulderState:{available:!1,tasks:[],planProgress:0},degradedSources:["agentmemory","magicContext","boulderState"]},DQ={consecutiveStops:0,consecutiveContinues:0,lastUpdatedISO:new Date().toISOString()},IQ={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 fK(K,Q=YK){let X=K.maxIterations>0?K.iteration/K.maxIterations:0,Z={...DQ,consecutiveStops:K.consecutiveStops??0};return{oracleVerified:K.oracleVerified,noProgress:K.noProgress,deviations:K.deviations,iterationRatio:X,lessonsRelevant:Q.agentmemory.lessons,slotMemory:Z,ambient:{sessionID:K.sessionID,directory:".",mode:"simple",agentName:K.agentName??"unknown",iteration:K.iteration,maxIterations:K.maxIterations}}}async function WK(K,Q={}){let X={...vK(),...Q};if(!X.enabled)return{memoryRead:YK,tokenPrediction:hK(K),scoringResult:{decision:{action:"continue",score:0,reasoning:"MetaGovernor disabled",evidence:[],shouldEscalateTo:null},contributions:[],rawScore:0,paralysisOverride:!1,computedAtISO:new Date().toISOString()},decision:IQ,lessonSaved:null,decisionHistory:[],skipped:!0,skipReason:"disabled"};let Z=YK;if(X.memory.enabled)try{let H={agentmemory:K.backends.agentmemory,magicContext:K.backends.magicContext,boulderState:K.backends.boulderState};Z=await XK({directory:".",sessionID:K.sessionID,query:X.memory.query||K.toolName},H)}catch{}let $;try{$=$K({currentUsage:K.recentTurnTokens.reduce((H,z)=>H+z,0),modelLimit:K.modelLimit??Q.modelOverride?.modelLimit??200000,recentTurnTokens:K.recentTurnTokens,timestampISO:new Date().toISOString(),providerID:K.providerID??"",modelID:K.modelID??"",config:X.tokenPredictor})}catch{$=hK(K)}let J=JK(fK(K,Z),X.scoring),q={sessionID:K.sessionID,scoringResult:J},W=qK(q,X.decision),B=null;try{if(X.closedLoop.enabled!==!1)B=await zK({decision:W.historyEntry.decision,memoryRead:Z,config:{...D(),...X.closedLoop},sessionID:K.sessionID,directory:".",filesChanged:[]},K.writeBackend)}catch{}return{memoryRead:Z,tokenPrediction:$,scoringResult:J,decision:W,lessonSaved:B,decisionHistory:[W.historyEntry],skipped:!1}}function hK(K){let Q=K.recentTurnTokens.reduce((X,Z)=>X+Z,0);return{burnRate:0,budgetLeft:200000,currentUsage:Q,modelLimit:200000,willOverflowAt:null,recommendation:"no-action",confidence:1,windowRemaining:200000,input:{currentUsage:Q,modelLimit:200000,recentTurnTokens:K.recentTurnTokens,timestampISO:new Date().toISOString(),providerID:K.providerID??"",modelID:K.modelID??"",config:{compactBurnRateThreshold:500,compactUsageThreshold:0.85,switchModelUsageThreshold:0.95,delegateConsecutiveHighBurn:5,windowSize:10}},computedAtISO:new Date().toISOString(),turnsAnalyzed:K.recentTurnTokens.length}}function c(K){let Q={enabled:!1,...K},X=u(),Z=l(),$=D();return{enabled:Q.enabled===!0,memory:{enabled:!0,query:Q.memory?.query??"meta_governor_context",timeoutMs:Q.memory?.agentmemoryTimeoutMs??2000},tokenPredictor:{compactBurnRateThreshold:Q.tokenPredictor?.compactBurnRateThreshold??500,compactUsageThreshold:Q.tokenPredictor?.compactUsageThreshold??0.85,switchModelUsageThreshold:Q.tokenPredictor?.switchModelUsageThreshold??0.95,delegateConsecutiveHighBurn:Q.tokenPredictor?.delegateConsecutiveHighBurn??5},scoring:{...X,...Q.scoring?.continueThreshold!==void 0?{continueThreshold:Q.scoring.continueThreshold}:{},...Q.scoring?.warnThreshold!==void 0?{warnThreshold:Q.scoring.warnThreshold}:{},...Q.scoring?.escalateThreshold!==void 0?{escalateThreshold:Q.scoring.escalateThreshold}:{},...Q.scoring?.stopThreshold!==void 0?{stopThreshold:Q.scoring.stopThreshold}:{}},closedLoop:{...$,...Q.closedLoop?.saveDecisions!==void 0?{saveDecisions:Q.closedLoop.saveDecisions}:{}},decision:{...Z,...Q.decision?.maxHistoryPerSession!==void 0?{maxHistoryPerSession:Q.decision.maxHistoryPerSession}:{},...Q.decision?.forceContinueAfterStops!==void 0?{forceContinueAfterStops:Q.decision.forceContinueAfterStops}:{}},modelOverride:Q.modelOverride?{providerID:Q.modelOverride.providerID,modelID:Q.modelOverride.modelID,modelLimit:Q.modelOverride.modelLimit,temperature:Q.modelOverride.temperature??0.2,topP:Q.modelOverride.topP??1,maxTokens:Q.modelOverride.maxTokens??2048,reasoning:Q.modelOverride.reasoning??!1,verbosity:Q.modelOverride.verbosity??"minimal"}:void 0,intervention:{mode:Q.intervention?.mode??"silent",includeDecisionHistory:Q.intervention?.includeDecisionHistory??!0,maxHistoryMessages:Q.intervention?.maxHistoryMessages??5,minActionForMessage:Q.intervention?.minActionForMessage??"stop",maxInterventionsPerSession:Q.intervention?.maxInterventionsPerSession??3,respectDoneSignal:Q.intervention?.respectDoneSignal??!0},protocolEnforcement:{enabled:Q.protocolEnforcement?.enabled??!1,path:Q.protocolEnforcement?.path,injectIntoSystem:Q.protocolEnforcement?.injectIntoSystem??!1,auditToolCalls:Q.protocolEnforcement?.auditToolCalls??!1}}}function pQ(K){return K?.enabled===!0}async function uQ(K={}){let{loadMetaGovernorConfig:Q}=await Promise.resolve().then(() => (GK(),uK)),X=await Q(K);return c(X.config)}var I=new Map;function _K(K,Q){I.set(K,Q)}function y(K){let Q=I.get(K);if(Q!==void 0)I.delete(K);return Q}function dQ(K){return I.has(K)}function lQ(){for(let[K,Q]of I)return I.delete(K),Q;return}function aQ(){I.clear()}import{appendFileSync as cQ,mkdirSync as rQ}from"node:fs";import{resolve as nQ,dirname as sQ}from"node:path";import{homedir as iQ}from"node:os";var dK=nQ(iQ(),".config","opencode","meta-governor.log");function tQ(){try{rQ(sQ(dK),{recursive:!0})}catch{}}function P(K,Q,X){tQ();let Z=new Date().toISOString(),$=X!==void 0?` | ${JSON.stringify(X)}`:"",J=`[${Z}] [${K.toUpperCase()}] ${Q}${$}
11
- `;try{cQ(dK,J)}catch{}if(K==="error")console.error(`[meta-governor] ${Q}`);else if(K==="warn")console.warn(`[meta-governor] ${Q}`);else console.log(`[meta-governor] ${Q}`)}import{statSync as lK}from"node:fs";import{readFile as oQ}from"node:fs/promises";import{resolve as eQ}from"node:path";import{homedir as KX}from"node:os";var r=eQ(KX(),".config","opencode","sisyphus-mandatory","sisyphus-mandatory.md");async function wK(K){return await oQ(K??r,"utf-8")}function AK(K){let Q=["","## 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. Fall back to AFT (aft_zoom, aft_outline), 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`',' - "the usual" / "as configured" → `ctx_memory(action="list")`'," - Starting a task that resembles a previous one → `agentmemory_memory_smart_search`",' - "what changed" / "history" → `ctx_search`'," - Before asking the user a clarifying question → `agentmemory_memory_recall` first"," - Working note for THIS session only → `ctx_note`"," - Save durable insight/decision/rule → `ctx_memory`",""];if(/\boracle\b/i.test(K))Q.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 Q.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` + `ctx_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 use grep/find when aft_outline would answer the structure question."," - Do NOT duplicate a memory in both `agentmemory_memory_save` and `ctx_memory` — pick ONE."," - 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 `ctx_memory` so future sessions benefit.",""),Q.join(`
12
- `)}function FK(K,Q,X){let Z=[],$=X.recentToolCalls??[],J=X.aftAvailable??!1,q=X.aftUsed??!1,W=X.recentWriteContents??[],B=X.memorySaved??!1,H=X.batchCompletions??0;if((K==="grep"||K==="glob")&&(X.hasCodegraphDir||X.hasGraphifyDir)){let A=X.hasCodegraphDir?".codegraph":"graphify-out";Z.push({rule:"codebase-graph-first",tool:K,severity:"media",detail:`Used ${K} when ${A} exists — should use codegraph/graphify first for architecture and symbol queries.`})}if((K==="read"||K==="grep")&&J&&!q)Z.push({rule:"aft-first",tool:K,severity:"media",detail:`AFT tools (aft_outline, aft_zoom) are available but were not tried before using ${K}. Use aft_outline for structure discovery, aft_zoom for symbol source, before falling back to grep/read.`});if(K==="grep"&&J&&!q&&!X.hasCodegraphDir&&!X.hasGraphifyDir)Z.push({rule:"grep-without-aft",tool:K,severity:"leve",detail:"Used grep before checking if aft_outline would answer the structure question. grep is a last resort after graph tools and AFT."});if(K==="task"&&Q&&typeof Q==="object"){let A=Q;if(!A.task_id&&typeof A.prompt==="string"&&$.length>3)Z.push({rule:"continuation-discipline",tool:K,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 z=["write","edit","edit_block","desktop-commander_edit_block","desktop-commander_write_file"];if(z.includes(K)){let A=typeof Q==="object"&&Q!==null?JSON.stringify(Q):String(Q??""),N=/@ts-ignore|@ts-expect-error/.test(A),E=/\bas any\b/.test(A);if(N&&E)Z.push({rule:"no-type-suppression",tool:K,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(N)Z.push({rule:"no-type-suppression",tool:K,severity:"media",detail:"File write contains @ts-ignore or @ts-expect-error — both are forbidden. "+"Fix the underlying type error instead."});else if(E)Z.push({rule:"no-type-suppression",tool:K,severity:"media",detail:"File write contains 'as any' — type suppression forbidden. "+"Use proper type narrowing instead."})}if(z.includes(K)){let A=typeof Q==="object"&&Q!==null?JSON.stringify(Q):String(Q??"");if(/catch\s*\(\s*\w+\s*\)\s*\{\s*\}/.test(A))Z.push({rule:"no-empty-catch",tool:K,severity:"media",detail:"Empty catch block detected — `catch(e) {}` is forbidden. "+"Log the error or handle it gracefully."})}if(["grep","glob","read","aft_zoom","aft_outline","codegraph_explore","graphify query"].includes(K)&&$.length>=2){if(!$.slice(0,5).some((N)=>N.startsWith("ctx_memory"))&&!B)Z.push({rule:"save-discovery-to-memory",tool:K,severity:"leve",detail:`Used ${K} to discover code but ctx_memory was not used afterwards. Save non-obvious findings with ctx_memory so future sessions benefit.`})}if(H>0&&K!=="todowrite")Z.push({rule:"no-batch-todo-completion",tool:K,severity:"leve",detail:"Batch todo completion detected. Each todo must be marked `completed` immediately "+"after finishing — do not batch-complete multiple items."});if(K==="ctx_reduce"&&Q&&typeof Q==="object"){let A=Q.drop;if(typeof A==="string"&&/^\d+-\d+$/i.test(A.trim())){let[N,E]=A.trim().split("-").map(Number);if(!isNaN(N)&&!isNaN(E)&&E-N>10)Z.push({rule:"ctx-reduce-discipline",tool:K,severity:"leve",detail:`Dropped a large range (${A}) with ctx_reduce. The protocol requires reviewing each tag before dropping. Use smaller targeted drops instead of blanket ranges.`})}}if(X.emptyRecall&&!X.escalationAttempted){if(K.startsWith("question")||K==="ask")Z.push({rule:"empty-result-escalation",tool:K,severity:"grave",detail:"Memory recall returned empty but agent did not fire smart_search + ctx_search + export before asking the user. Steps 1-3 of empty-result escalation protocol are mandatory."})}let _=["agentmemory_memory_recall","agentmemory_memory_smart_search","agentmemory_memory_save","ctx_memory","ctx_search","ctx_note"];if(!X.memoryToolsUsed.some((A)=>_.some((N)=>A.startsWith(N)))&&(K.startsWith("question")||K==="ask"))Z.push({rule:"memory-first",tool:K,severity:"grave",detail:"Asked a question without first querying memory (agentmemory or ctx_memory). Must fire agentmemory_memory_recall or ctx_memory before asking the user."});if(X.filesChanged>=3&&!X.oracleInvoked){if(K!=="task"||!Q||typeof Q!=="object"||!("subagent_type"in Q))Z.push({rule:"oracle-verification",tool:K,severity:"media",detail:`Files changed (${X.filesChanged}) >= 3 but Oracle was not invoked. The POST-TASK ORACLE VERIFICATION protocol requires Oracle invocation on multi-file changes.`})}return Z}var aK={continue:0,warn:1,escalate:2,stop:3};function LK(K,Q){return aK[K]>=aK[Q]}function OK(K={},Q={}){let X=process.cwd(),Z=(()=>{try{return lK(`${X}/.codegraph`).isDirectory()}catch{return!1}})(),$=(()=>{try{return lK(`${X}/graphify-out`).isDirectory()}catch{return!1}})();if(K.graphSync?.enabled!==!1)p({enabled:!0,watch:K.graphSync?.watch??!1,autoInstall:K.graphSync?.autoInstall??!0,installTimeoutMs:K.graphSync?.installTimeoutMs??60000,projectDir:X}).catch(()=>{}),bK(X);return P("info","MetaGovernor plugin loaded",{version:"0.10.0",cwd:X,projectHasCodegraph:Z,projectHasGraphify:$}),async(W,B)=>{let H={...K,...B?.meta_governor??{}},z=c(H);if(!z.enabled)return{};let G=()=>z.modelOverride?.providerID??Q.providerID?.(),_=()=>z.modelOverride?.modelID??Q.modelID?.(),M=()=>z.modelOverride?.modelLimit??200000,A=G()??"unknown",N=_()??"unknown",E;if(z.protocolEnforcement.enabled||z.protocolEnforcement.injectIntoSystem){let Y=z.protocolEnforcement.path??r;wK(Y).then((V)=>{E=AK(V)}).catch((V)=>{if(typeof console<"u"&&z.modelOverride?.verbosity!=="silent")console.warn("[meta-governor] could not load protocol:",V instanceof Error?V.message:V)})}let x=new Map,h=new Map,v=new Map,PK=new Set;function MK(Y){if(typeof Y!=="string"||Y.length===0)return!1;return/<promise>\s*DONE!?\s*<\/promise>/i.test(Y)}return{"tool.execute.before":async(Y)=>{if(!z.enabled)return;if(!z.protocolEnforcement.auditToolCalls)return;if(!Y.sessionID)return;let V=x.get(Y.sessionID);if(!V)V={memoryToolsUsed:[],hasCodegraphDir:Z,hasGraphifyDir:$,oracleInvoked:!1,filesChanged:0,emptyRecall:!1,escalationAttempted:!1,aftAvailable:!1,aftUsed:!1,recentToolCalls:[],recentWriteContents:[],memorySaved:!1,batchCompletions:0,taskDoneSignal:!1,interventionCount:0,interventionDisabled:!1},x.set(Y.sessionID,V);if(E)console.log("[meta-governor] protocol loaded, system injection ready");let U=FK(Y.tool,{},{memoryToolsUsed:V.memoryToolsUsed,hasCodegraphDir:V.hasCodegraphDir,hasGraphifyDir:V.hasGraphifyDir,oracleInvoked:V.oracleInvoked,filesChanged:V.filesChanged,emptyRecall:V.emptyRecall,escalationAttempted:V.escalationAttempted,aftAvailable:V.aftAvailable,aftUsed:V.aftUsed,recentToolCalls:V.recentToolCalls,recentWriteContents:V.recentWriteContents,memorySaved:V.memorySaved,batchCompletions:V.batchCompletions});if(U.length>0){P("warn",`protocol violations on tool ${Y.tool}`,U);let w=h.get(Y.sessionID)??[];for(let L of U)w.push(`[${L.severity.toUpperCase()}] ${L.rule}: ${L.detail}`);h.set(Y.sessionID,w)}else P("info",`audit OK on tool ${Y.tool}`)},"tool.execute.after":async(Y,V)=>{if(!z.enabled)return;let U=x.get(Y.sessionID);if(U){if(U.recentToolCalls=[Y.tool].concat(U.recentToolCalls).slice(0,20),["write","edit","edit_block","desktop-commander_write_file","desktop-commander_edit_block"].includes(Y.tool)){U.filesChanged++;let T=(V.output??"").slice(0,500);U.recentWriteContents=[T].concat(U.recentWriteContents).slice(0,3)}if(["agentmemory_memory_recall","agentmemory_memory_smart_search","agentmemory_memory_save","ctx_memory","ctx_search","ctx_note"].some((T)=>Y.tool.startsWith(T))&&!U.memoryToolsUsed.includes(Y.tool))U.memoryToolsUsed.push(Y.tool);if(Y.tool.startsWith("ctx_memory")){let T=V.output??"";if(T.includes("saved")||T.includes("written"))U.memorySaved=!0}if(Y.tool.startsWith("aft_zoom")||Y.tool.startsWith("aft_outline"))U.aftUsed=!0;if(Y.tool==="task"&&(V.output??"").includes("subagent_type=oracle"))U.oracleInvoked=!0;let j=(V.output??"").toLowerCase();if(Y.tool.includes("recall")&&(j.includes("returned empty")||j.includes("no results")))U.emptyRecall=!0;if(Y.tool==="todowrite"&&(V.output??"").includes("completed")){if(((V.output??"").match(/"status":"completed"/g)??[]).length>=3)U.batchCompletions++}if(!U.taskDoneSignal){if(MK(V.output)||MK(Y.args))U.taskDoneSignal=!0,P("info",`task_done_signal detected for session ${Y.sessionID}`)}}if(U?.interventionDisabled)return;let w={sessionID:Y.sessionID,toolName:Y.tool,toolOutput:V.output,iteration:0,maxIterations:10,oracleVerified:U?.oracleInvoked??!1,noProgress:!1,filesChanged:U?.filesChanged??0,recentTurnTokens:[],deviations:[],backends:Q.backends??{agentmemory:{smartSearch:async()=>({lessons:[],crystals:[]})},magicContext:{slotList:async()=>[]},boulderState:{boulderRead:async()=>[]}},writeBackend:Q.writeBackend??{saveMemory:async()=>({id:""}),saveLesson:async()=>({id:""})},config:z,...G()?{providerID:G()}:{},..._()?{modelID:_()}:{},modelLimit:M()};try{let L=await WK(w);if(z.intervention.mode!=="silent"&&U){let O=L.decision;if(z.intervention.respectDoneSignal&&U.taskDoneSignal&&U.oracleInvoked){U.interventionDisabled=!0,P("info",`task verified (DONE + Oracle): disabling intervention for session ${Y.sessionID}`),y(Y.sessionID);return}if(O.action!=="continue"&&LK(O.action,z.intervention.minActionForMessage)){let F=Math.max(0,z.intervention.maxInterventionsPerSession??0);if(F>0&&U.interventionCount>=F){U.interventionDisabled=!0,P("warn",`intervention cap (${F}) reached for session ${Y.sessionID}; disabling further intervention`),y(Y.sessionID);return}U.interventionCount++,_K(Y.sessionID,O)}}}catch{}try{if(Y.tool==="bash"){let O=Y.args?.command;if(o(O))P("info","git_commit_reindex_triggered",{sessionID:Y.sessionID,command:O}),Q.__test_onCommitTrigger?.({projectDir:X,command:O??"",sessionID:Y.sessionID}),yK(X).catch((F)=>{P("warn",`codegraph sync failed: ${String(F)}`)})}}catch{}try{if(Y.tool==="bash"){let O=Y.args?.command;if(XX(O)){let F=QX(V.output,Y.sessionID);if(F.length>0){let j=v.get(Y.sessionID)??[];v.set(Y.sessionID,j.concat(F)),P("info",`captured ${F.length} bot feedback line(s) for session ${Y.sessionID}`)}}}}catch{}},"experimental.chat.messages.transform":async(Y,V)=>{if(!z.enabled)return;if(z.intervention.mode!=="message")return;let w=V.messages[V.messages.length-1]?.info?.sessionID;if(!w)return;let L=x.get(w);if(L?.interventionDisabled){y(w);return}if(L&&!PK.has(w)&&ZX(X,L.interventionCount)){PK.add(w);let b="[MetaGovernor] Before any code change, create PLAN.md or a `## Plan` section in AGENTS.md that enumerates the phases. After each phase, commit (local + fork + upstream). Each commit triggers automatic reindex via the graphify post-commit hook + `codegraph sync`.";V.messages.push({info:{role:"user",agent:"meta-governor",synthetic:!0},parts:[{type:"text",text:b,synthetic:!0}]}),P("info",`plan_reminder_injected for session ${w}`)}if(v.has(w)){let b=v.get(w);if(b.length>0){let n=`[MetaGovernor PR Reviewer Feedback]
10
+ `],{stdio:"ignore",detached:!0});else Z=NK("python3",["-m","graphify",".","--no-viz","--watch"],{cwd:K,stdio:"ignore",detached:!0});Z.unref(),m.set(X,{process:Z,tool:Q}),Z.on("exit",()=>{m.delete(X)})}catch{}}function VQ(K){for(let[Q,X]of m)if(!K||Q.startsWith(K)){try{X.process.kill("SIGTERM")}catch{}setTimeout(()=>{try{X.process.kill("SIGKILL")}catch{}},2000).unref(),m.delete(Q)}}async function u(K={enabled:!0,watch:!1,autoInstall:!0,installTimeoutMs:60000}){let Q=[],X=K.projectDir??process.cwd();if(!K.enabled)return{attempted:!1,codes:["disabled"],availability:{codegraph:!1,graphify:!1,codegraphIndexExists:!1,graphifyIndexExists:!1},alreadyInitialized:!1};if(o.has(X)){let $=await bK(X);return{attempted:!1,codes:$.codegraphIndexExists?["codegraph-already-exists"]:[],availability:$,alreadyInitialized:!0}}o.add(X);let Z;try{Z=await bK(X)}catch{return{attempted:!1,codes:["error"],availability:{codegraph:!1,graphify:!1,codegraphIndexExists:!1,graphifyIndexExists:!1},alreadyInitialized:!1}}if(K.autoUpgrade!==!1)try{let $=_Q(),J=await AQ($),q=K.upgradeCheckTtlMs??86400000;if(Z.codegraph){let B=await LQ();if(xK(B,null,J,q)){let H=await jK();if(H&&e(B,H)){if(await EK(X,K.installTimeoutMs??60000)==="codegraph-installed")Q.push("codegraph-upgraded")}}}if(Z.graphify){let B=await OQ();if(xK(B,null,J,q)){let H=await DK();if(H&&e(B,H)){if(await kK(K.installTimeoutMs??60000)==="graphify-installed")Q.push("graphify-upgraded")}}}let Y=Date.now();try{let B=await jK(),H=await DK();await wQ($,{checkedAtMs:Y,codegraphLatest:B??void 0,graphifyLatest:H??void 0})}catch{}}catch{Q.push("upgrade-check-skipped")}if(K.autoInstall!==!1){if(!Z.codegraph){let $=await EK(X,K.installTimeoutMs??60000);if(Q.push($),$==="codegraph-installed")Z.codegraph=!0}if(!Z.graphify){let $=await kK(K.installTimeoutMs??60000);if(Q.push($),$==="graphify-installed")Z.graphify=!0}}else{if(!Z.codegraph)Q.push("codegraph-install-skipped");if(!Z.graphify)Q.push("graphify-install-skipped")}if(Z.codegraph)if(!Z.codegraphIndexExists)try{await HQ(X),Q.push("codegraph-initialized")}catch{Q.push("error")}else Q.push("codegraph-already-exists");else Q.push("codegraph-unavailable");if(Z.graphify){if(!Z.graphifyIndexExists)try{await UQ(X),Q.push("graphify-initialized")}catch{Q.push("error")}else Q.push("graphify-already-exists");try{if(!await GQ(X))k("graphify hook install",{cwd:X,stdio:"ignore",timeout:1e4}),Q.push("graphify-hook-installed")}catch{}}else Q.push("graphify-unavailable");if(K.watch){if(Z.codegraph)CK(X,"codegraph"),Q.push("watch-started-codegraph");if(Z.graphify)CK(X,"graphify"),Q.push("watch-started-graphify")}return{attempted:!0,codes:Q,availability:Z,alreadyInitialized:!1}}async function g(K){try{return(await YQ(K)).isDirectory()}catch{return!1}}async function SK(K){try{await zQ(K,WQ.F_OK)}catch{let{mkdir:Q}=await import("node:fs/promises");await Q(K,{recursive:!0})}}function KK(K){if(typeof K!=="string"||K.length===0)return!1;let Q=K.replace(/\\\n/g," ").replace(/\s*\n\s*/g," ");return/(?:^|[\s;&|])git\s+commit(?:\s+-|\s|$)/.test(Q)}async function GQ(K){let{access:Q,readFile:X}=await import("node:fs/promises"),{resolve:Z}=await import("node:path"),$=Z(K,".git","hooks","post-commit");try{await Q($)}catch{return!1}try{return(await X($,"utf-8")).includes("graphify-hook-start")}catch{return!1}}async function vK(K){let{execSync:Q}=await import("node:child_process"),{access:X}=await import("node:fs/promises"),{resolve:Z}=await import("node:path"),$=[],J=await g(Z(K,".codegraph")),q=!1;try{Q("npx --yes codegraph --version",{stdio:"ignore",timeout:5000}),q=!0}catch{try{Q("node node_modules/.bin/codegraph --version",{cwd:K,stdio:"ignore",timeout:5000}),q=!0}catch{}}if(!q)return{attempted:!0,codes:["codegraph-unavailable"],availability:{codegraph:!1,graphify:!1,codegraphIndexExists:J,graphifyIndexExists:await g(Z(K,"graphify-out"))},alreadyInitialized:!1};if(!J)return await u({enabled:!0,watch:!1,autoInstall:!1,installTimeoutMs:5000,projectDir:K});try{let Y=Q("npx --yes codegraph sync -q",{cwd:K,stdio:"ignore",timeout:30000});$.push("codegraph-already-exists"),yK?.("info",`codegraph sync -q completed for ${K}`)}catch(Y){yK?.("warn",`codegraph sync failed for ${K}: ${Y}`),$.push("codegraph-install-failed")}return{attempted:!0,codes:$,availability:{codegraph:!0,graphify:!1,codegraphIndexExists:J,graphifyIndexExists:await g(Z(K,"graphify-out"))},alreadyInitialized:!1}}function yK(K,Q){}function e(K,Q){if(!K||!Q)return!1;if(K===Q)return!1;let X=/^[0-9]+\.[0-9]+\.[0-9]+(-[0-9A-Za-z.-]+)?$/;if(!X.test(K)||!X.test(Q))return!1;let Z=(_)=>{let[R="",w=""]=_.split("-",2),N=R.split(".").map((D)=>{let f=Number.parseInt(D,10);return Number.isFinite(f)?f:0}),[E=0,b=0,j=0]=N;return[E,b,j,w]},[$,J,q,Y]=Z(K),[B,H,z,V]=Z(Q);if(B!==$)return B>$;if(H!==J)return H>J;if(z!==q)return z>q;if(Y&&!V)return!0;if(!Y&&V)return!1;return V>Y}function _Q(){let{resolve:K}=F("node:path"),{homedir:Q}=F("node:os");return K(Q(),".config","opencode","omo-meta-governor-upgrade-check.json")}async function AQ(K){try{let{readFile:Q}=await import("node:fs/promises"),X=await Q(K,"utf-8"),Z=JSON.parse(X);if(typeof Z?.checkedAtMs==="number")return Z;return null}catch{return null}}async function wQ(K,Q){let{dirname:X}=await import("node:path"),{mkdir:Z,writeFile:$}=await import("node:fs/promises"),J=X(K);try{await Z(J,{recursive:!0}),await $(K,JSON.stringify(Q,null,2))}catch{}}function FQ(K,Q){if(!K)return!1;let X=Date.now()-K.checkedAtMs;return X>=0&&X<Q}function xK(K,Q,X,Z){let $=Q;if(FQ(X,Z))$=X?.codegraphLatest??$;if(!K&&!$)return!1;if(!$)return!1;if(!K)return!0;return e(K,$)}async function jK(){let{execSync:K}=await import("node:child_process");try{let X=K("npm view @colbymchenry/codegraph version",{stdio:["ignore","pipe","ignore"],timeout:1e4}).toString().trim();return X.length>0?X:null}catch{return null}}async function DK(){let{execSync:K}=await import("node:child_process");try{let Z=(K("python3 -m pip index versions graphifyy",{stdio:["ignore","pipe","ignore"],timeout:1e4}).toString().split(`
11
+ `)[0]??"").match(/graphifyy\s*\(?([0-9]+\.[0-9]+\.[0-9]+[^\s)]*)/);if(Z)return Z[1]}catch{}try{let X=K(`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 X.length>0?X:null}catch{return null}}async function LQ(){let{execSync:K}=await import("node:child_process");try{let X=K("npx --yes codegraph --version",{stdio:["ignore","pipe","ignore"],timeout:1e4}).toString().trim();return X.length>0?X:null}catch{return null}}async function OQ(){let{execSync:K}=await import("node:child_process");try{let X=K("python3 -m pip show graphifyy",{stdio:["ignore","pipe","ignore"],timeout:1e4}).toString().match(/Version:\s*([0-9]+\.[0-9]+\.[0-9]+[^\s]*)/);if(X)return X[1]}catch{}try{let X=K("python3 -m pip show graphify",{stdio:["ignore","pipe","ignore"],timeout:1e4}).toString().match(/Version:\s*([0-9]+\.[0-9]+\.[0-9]+[^\s]*)/);if(X)return X[1]}catch{return null}return null}var hK={limits:{maxLessons:10,maxSlots:20,maxTasks:10},timeouts:{agentmemoryMs:2000,magicContextMs:1000,boulderStateMs:1000}};async function $K(K,Q){let X=performance.now(),Z={...hK.limits,...K.limits},$={...hK.timeouts,...K.timeouts},[J,q,Y]=await Promise.allSettled([PQ(K,Q.agentmemory,Z,$.agentmemoryMs),RQ(K,Q.magicContext,Z,$.magicContextMs),MQ(K,Q.boulderState,Z,$.boulderStateMs)]),B=[],H={},z=J.status==="fulfilled"?J.value:(XK(B,H,"agentmemory",QK(J.reason)),ZK.agentmemory),V=q.status==="fulfilled"?q.value:(XK(B,H,"magicContext",QK(q.reason)),ZK.magicContext),_=Y.status==="fulfilled"?Y.value:(XK(B,H,"boulderState",QK(Y.reason)),ZK.boulderState);return{query:K.query,timestampISO:new Date().toISOString(),agentmemory:z,magicContext:V,boulderState:_,degradedSources:B,durationMs:performance.now()-X,errorMessages:H}}async function PQ(K,Q,X,Z){let $=await JK(Q.smartSearch({query:K.query,limit:X.maxLessons}),Z,"agentmemory");return{available:!0,lessons:NQ($.lessons).slice(0,X.maxLessons).map((q)=>({id:q.id,title:q.title,advice:"info",confidence:q.confidence,concepts:q.concepts}))}}async function RQ(K,Q,X,Z){return{available:!0,slots:(await JK(Q.slotList({directory:K.directory}),Z,"magicContext")).filter((J)=>J.label.startsWith("meta_governor:")||EQ(J,K.query)).sort((J,q)=>J.label.localeCompare(q.label)).slice(0,X.maxSlots).map((J)=>({label:J.label,content:J.content}))}}async function MQ(K,Q,X,Z){let $=await JK(Q.boulderRead({directory:K.directory,sessionID:K.sessionID,query:K.query}),Z,"boulderState");return{available:!0,tasks:$.sort((q,Y)=>q.priority-Y.priority||Y.updatedAtMs-q.updatedAtMs).slice(0,X.maxTasks).map((q)=>({id:q.id,status:q.status,title:q.title})),planProgress:kQ($)}}function NQ(K){return[...K].sort((Q,X)=>X.confidence-Q.confidence)}function EQ(K,Q){let X=Q.toLowerCase();return K.label.toLowerCase().includes(X)||K.content.toLowerCase().includes(X)}function kQ(K){if(K.length===0)return 0;return K.filter((X)=>X.status==="done").length/K.length}function QK(K){if(K instanceof Error)return K.message;if(typeof K==="string")return K;return"unknown error"}function XK(K,Q,X,Z){K.push(X),Q[X]=Z}var ZK={agentmemory:{available:!1,lessons:[]},magicContext:{available:!1,slots:[]},boulderState:{available:!1,tasks:[],planProgress:0}};async function JK(K,Q,X){return new Promise((Z,$)=>{let J=setTimeout(()=>$(Error(`${X} timeout after ${Q}ms`)),Q);K.then((q)=>{clearTimeout(J),Z(q)},(q)=>{clearTimeout(J),$(q)})})}function TQ(){return{compactBurnRateThreshold:500,compactUsageThreshold:0.85,switchModelUsageThreshold:0.95,delegateConsecutiveHighBurn:5,windowSize:10}}function fK(K){if(K.length===0)return 0;return K.reduce((X,Z)=>X+Z,0)/K.length}function bQ(K,Q){let X=0;for(let Z=K.length-1;Z>=0;Z--)if(K[Z]>=Q)X++;else break;return X}function CQ(K,Q,X,Z){let $=Q-K;if($<=0)return Z;if(X<=0)return null;let J=Math.floor($/X);if(J<=0)return Z;let q=J*2;return new Date(new Date(Z).getTime()+q*1000).toISOString()}function qK(K){let{currentUsage:Q,modelLimit:X,recentTurnTokens:Z,timestampISO:$,config:J}=K,q=Z.slice(-J.windowSize),Y=fK(q),B=X-Q,H=X>0?Q/X:1,z=Math.min(0.95,0.3+q.length/J.windowSize*0.65),V="no-action",_="within normal parameters";if(H>=J.switchModelUsageThreshold)V="switch-model",_=`context usage ${(H*100).toFixed(1)}% exceeds switch threshold ${(J.switchModelUsageThreshold*100).toFixed(1)}%`;if(H>=J.compactUsageThreshold||Y>=J.compactBurnRateThreshold){if(V==="no-action")V="compact-now",_=H>=J.compactUsageThreshold?`context usage ${(H*100).toFixed(1)}% exceeds compact threshold ${(J.compactUsageThreshold*100).toFixed(1)}%`:`burn rate ${Y.toFixed(0)} tokens/turn exceeds threshold ${J.compactBurnRateThreshold}`}let R=bQ(q,J.compactBurnRateThreshold);if(R>=J.delegateConsecutiveHighBurn&&V==="no-action")V="delegate-to-subagent",_=`${R} consecutive high-burn turns (threshold: ${J.delegateConsecutiveHighBurn})`;let w=CQ(Q,X,Y,$);return{currentUsage:Q,burnRate:Y,budgetLeft:B,willOverflowAt:w,recommendation:V,confidence:z,modelLimit:X,windowRemaining:Math.max(0,Math.floor(B/Math.max(Y,1))),input:{...K},computedAtISO:$,turnsAnalyzed:q.length}}var T={"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},d=()=>({continueThreshold:0.3,warnThreshold:0.3,escalateThreshold:0.6,stopThreshold:0.8,paralysisThreshold:3,defaultEscalationTarget:"oracle"});function yQ(K){let Q=[];Q.push({source:"oracle-verified",rawScore:K.oracleVerified?0.6:0,weight:T["oracle-verified"],weightedScore:K.oracleVerified?0.6*T["oracle-verified"]:0,description:K.oracleVerified?"Oracle verification passed":"No Oracle verification"}),Q.push({source:"no-progress-detector",rawScore:K.noProgress?-0.8:0,weight:T["no-progress-detector"],weightedScore:K.noProgress?-0.8*T["no-progress-detector"]:0,description:K.noProgress?"No progress detected in last turn":"Progress detected"});let X=xQ(K.deviations);Q.push({source:"deviation-detector",rawScore:X,weight:T["deviation-detector"],weightedScore:X*T["deviation-detector"],description:K.deviations.length>0?`${K.deviations.length} deviation(s) detected (worst: ${K.deviations[0].severity})`:"No deviations detected"});let Z=jQ(K.iterationRatio);Q.push({source:"iteration-budget",rawScore:Z,weight:T["iteration-budget"],weightedScore:Z*T["iteration-budget"],description:`Iteration ratio: ${K.iterationRatio.toFixed(2)} (${K.ambient.iteration}/${K.ambient.maxIterations})`});let $=DQ(K.lessonsRelevant);return Q.push({source:"lesson-recall",rawScore:$,weight:T["lesson-recall"],weightedScore:$*T["lesson-recall"],description:K.lessonsRelevant.length>0?`${K.lessonsRelevant.length} relevant lesson(s) (avg confidence: ${IQ(K.lessonsRelevant).toFixed(2)})`:"No relevant lessons"}),Q}function xQ(K){if(K.length===0)return 0;let Q={grave:-0.9,media:-0.5,leve:-0.2},X=0;for(let $ of K){let J=Q[$.severity]??-0.3;if(J<X)X=J}let Z=Math.min(K.length*0.05,0.2);return Math.max(X-Z,-1)}function jQ(K){if(K<=0.5)return-K*0.6;return-0.3-(K-0.5)*1}function DQ(K){if(K.length===0)return 0;let Q=0;for(let X of K)Q+=({continue:0.3,info:0,warn:-0.3,stop:-0.7}[X.advice]??0)*X.confidence;return Math.max(Math.min(Q/K.length,1),-1)}function IQ(K){if(K.length===0)return 0;return K.reduce((Q,X)=>Q+X.confidence,0)/K.length}function SQ(K,Q){if(K>=Q.continueThreshold)return"continue";if(K<=-Q.stopThreshold)return"stop";if(K<=-Q.escalateThreshold)return"escalate";if(K<=-Q.warnThreshold)return"warn";return"continue"}function vQ(K,Q){if(!K.oracleVerified)return"oracle";if(K.deviations.some((X)=>X.severity==="grave"))return"user";return Q.defaultEscalationTarget}function mK(K,Q,X,Z){if(Z)return`Paralysis detected: forced continue despite score ${K.toFixed(3)} (too many consecutive stops)`;let $=[...X].sort((H,z)=>H.weightedScore-z.weightedScore),J=$[0],q=$[$.length-1],Y=[];if(J.weightedScore<0)Y.push(`primary concern: ${J.description}`);if(q.weightedScore>0)Y.push(`positive signal: ${q.description}`);return`${{continue:"Continue",warn:"Warn",escalate:"Escalate",stop:"Stop"}[Q]} (score: ${K.toFixed(3)}): ${Y.join("; ")||"balanced signals"}`}function zK(K,Q){let X={...d(),...Q},Z=yQ(K),$=Z.reduce((V,_)=>V+_.weightedScore,0),J=Math.max(Math.min($,1),-1),q=K.slotMemory.consecutiveStops>=X.paralysisThreshold&&J<=-X.warnThreshold,Y=q?"continue":SQ(J,X),B=[];if(Y!=="continue"||Math.abs(J)<X.continueThreshold){for(let V of Z)if(Math.abs(V.weightedScore)>0.01)B.push({source:V.source,value:V.description,confidence:Math.abs(V.rawScore),weight:V.weight});if(B.length===0&&Y!=="continue")B.push({source:"ambient",value:mK(J,Y,Z,q),confidence:0.5,weight:0.1})}let H=Y==="escalate"?vQ(K,X):null;return{decision:{action:Y,score:J,reasoning:mK(J,Y,Z,q),evidence:B,shouldEscalateTo:H},contributions:Z,rawScore:J,paralysisOverride:q,computedAtISO:new Date().toISOString()}}var c=()=>({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 l(K,Q){let X=K;for(let[Z,$]of Object.entries(Q))X=X.replaceAll(`{${Z}}`,$);return X}function hQ(K){return K.length}function YK(K,Q){let X={...c(),...Q};if(!X.enabled)return{action:"continue",message:null,historyEntry:{decision:K.scoringResult.decision,action:"continue",timestampISO:new Date().toISOString(),sessionID:K.sessionID,reasoning:"Decision handler disabled — pass-through continue"}};let Z=K.scoringResult.decision,$=Z.score,J=Z.reasoning,q=hQ(Z.evidence),Y=Z.shouldEscalateTo??X.defaultEscalationTarget??"oracle";if(K.scoringResult.paralysisOverride)return{action:"continue",message:l(X.warnMessageTemplate,{score:$.toFixed(3),reasoning:`Paralysis detected — forced continue. ${J}`,evidenceCount:String(q)}),historyEntry:{decision:Z,action:"continue",timestampISO:new Date().toISOString(),sessionID:K.sessionID,reasoning:`Paralysis override: ${J}`}};switch(Z.action){case"continue":return{action:"continue",message:null,historyEntry:{decision:Z,action:"continue",timestampISO:new Date().toISOString(),sessionID:K.sessionID,reasoning:J}};case"warn":return{action:"warn",message:l(X.warnMessageTemplate,{score:$.toFixed(3),reasoning:J,evidenceCount:String(q)}),historyEntry:{decision:Z,action:"warn",timestampISO:new Date().toISOString(),sessionID:K.sessionID,reasoning:J}};case"escalate":return{action:"escalate",message:l(X.escalateMessageTemplate,{target:Y,reasoning:J}),historyEntry:{decision:Z,action:"escalate",timestampISO:new Date().toISOString(),sessionID:K.sessionID,reasoning:`Escalate to ${Y}: ${J}`}};case"stop":return{action:"stop",message:l(X.stopMessageTemplate,{reasoning:J,evidenceCount:String(q)}),historyEntry:{decision:Z,action:"stop",timestampISO:new Date().toISOString(),sessionID:K.sessionID,reasoning:J}}}}function fQ(K,Q){if(K.length<=Q)return{trimmed:[...K],dropped:0};let X=K.length-Q;return{trimmed:K.slice(-Q),dropped:X}}function mQ(K){let Q=0;for(let X=K.length-1;X>=0;X--)if(K[X].action==="stop")Q++;else break;return Q}var gK={leve:0,media:1,grave:2};function gQ(K,Q,X){let Z=`${K}-${Q}-${X}`.split("").reduce(($,J)=>($<<5)-$+J.charCodeAt(0)|0,0);return`D-${Math.abs(Z).toString(36)}`}function pK(K,Q){let X=gK[Q]??0;return K.some((Z)=>(gK[Z.severity]??0)>=X)}function pQ(K){let Q=new Set;for(let X of K)Q.add(X.category),Q.add(X.severity);return[...Q]}function uQ(K,Q){let X=Q.map((Z)=>`[${Z.severity}] ${Z.category}: ${Z.detail}`).join("; ");return`Action "${K.action}" (score ${K.score.toFixed(2)}) after deviations: ${X}. Reasoning: ${K.reasoning}`}async function WK(K,Q){let{decision:X,config:Z,sessionID:$,directory:J,filesChanged:q}=K,Y=new Date().toISOString();if(!Z.enabled)return{lessonSaved:null,decisionSaved:null,reason:"closed-loop learning disabled"};if(X.evidence.length===0&&X.action==="continue")return{lessonSaved:null,decisionSaved:null,reason:"no deviations to learn from"};let B=null,H=null;if(Z.saveDecisions){let _={id:gQ($,X.action,Y),timestampISO:Y,action:X.action,score:X.score,reasoning:X.reasoning,sessionID:$,directory:J,deviations:X.evidence.filter((R)=>R.source==="deviation-detector").map((R)=>({severity:"media",category:R.source,detail:R.value}))};try{await Q.saveMemory({content:`Decision: ${X.action} (score ${X.score.toFixed(2)}). ${X.reasoning}`,concepts:["meta-governor","decision",X.action],type:"fact",files:[...q]}),H=_}catch{}}let z=X.evidence.filter((_)=>_.source==="deviation-detector").map((_)=>({severity:"media",category:_.source,detail:_.value}));if(pK(z,Z.minSeverityToLearn)){let _=pQ(z),R=uQ(X,z);try{B={id:(await Q.saveLesson({content:R,context:`session:${$} dir:${J}`,confidence:Math.max(0.3,Math.min(0.8,Math.abs(X.score))),tags:_})).id,title:`${X.action} after ${z[0]?.category??"deviation"}`,content:R,type:"pattern",concepts:_,confidence:Math.max(0.3,Math.min(0.8,Math.abs(X.score))),files:[...q],sessionID:$}}catch{}}let V=[];if(H)V.push("decision saved");if(B)V.push("lesson saved");if(!H&&!B)if(!pK(z,Z.minSeverityToLearn))V.push("severity below threshold");else V.push("no saveable content");return{lessonSaved:B,decisionSaved:H,reason:V.join("; ")||"no action taken"}}function S(){return{enabled:!0,minSeverityToLearn:"media",maxLessonsPerSession:20,saveDecisions:!0}}var dK=()=>({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},protocolEnforcement:{enabled:!1,path:void 0,injectIntoSystem:!1,auditToolCalls:!1}}),BK={query:"",timestampISO:new Date().toISOString(),agentmemory:{available:!1,lessons:[]},magicContext:{available:!1,slots:[]},boulderState:{available:!1,tasks:[],planProgress:0},degradedSources:["agentmemory","magicContext","boulderState"]},dQ={consecutiveStops:0,consecutiveContinues:0,lastUpdatedISO:new Date().toISOString()},lQ={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 lK(K,Q=BK){let X=K.maxIterations>0?K.iteration/K.maxIterations:0,Z={...dQ,consecutiveStops:K.consecutiveStops??0};return{oracleVerified:K.oracleVerified,noProgress:K.noProgress,deviations:K.deviations,iterationRatio:X,lessonsRelevant:Q.agentmemory.lessons,slotMemory:Z,ambient:{sessionID:K.sessionID,directory:".",mode:"simple",agentName:K.agentName??"unknown",iteration:K.iteration,maxIterations:K.maxIterations}}}async function HK(K,Q={}){let X={...dK(),...Q};if(!X.enabled)return{memoryRead:BK,tokenPrediction:uK(K),scoringResult:{decision:{action:"continue",score:0,reasoning:"MetaGovernor disabled",evidence:[],shouldEscalateTo:null},contributions:[],rawScore:0,paralysisOverride:!1,computedAtISO:new Date().toISOString()},decision:lQ,lessonSaved:null,decisionHistory:[],skipped:!0,skipReason:"disabled"};let Z=BK;if(X.memory.enabled)try{let H={agentmemory:K.backends.agentmemory,magicContext:K.backends.magicContext,boulderState:K.backends.boulderState};Z=await $K({directory:".",sessionID:K.sessionID,query:X.memory.query||K.toolName},H)}catch{}let $;try{$=qK({currentUsage:K.recentTurnTokens.reduce((H,z)=>H+z,0),modelLimit:K.modelLimit??Q.modelOverride?.modelLimit??200000,recentTurnTokens:K.recentTurnTokens,timestampISO:new Date().toISOString(),providerID:K.providerID??"",modelID:K.modelID??"",config:X.tokenPredictor})}catch{$=uK(K)}let J=zK(lK(K,Z),X.scoring),q={sessionID:K.sessionID,scoringResult:J},Y=YK(q,X.decision),B=null;try{if(X.closedLoop.enabled!==!1)B=await WK({decision:Y.historyEntry.decision,memoryRead:Z,config:{...S(),...X.closedLoop},sessionID:K.sessionID,directory:".",filesChanged:[]},K.writeBackend)}catch{}return{memoryRead:Z,tokenPrediction:$,scoringResult:J,decision:Y,lessonSaved:B,decisionHistory:[Y.historyEntry],skipped:!1}}function uK(K){let Q=K.recentTurnTokens.reduce((X,Z)=>X+Z,0);return{burnRate:0,budgetLeft:200000,currentUsage:Q,modelLimit:200000,willOverflowAt:null,recommendation:"no-action",confidence:1,windowRemaining:200000,input:{currentUsage:Q,modelLimit:200000,recentTurnTokens:K.recentTurnTokens,timestampISO:new Date().toISOString(),providerID:K.providerID??"",modelID:K.modelID??"",config:{compactBurnRateThreshold:500,compactUsageThreshold:0.85,switchModelUsageThreshold:0.95,delegateConsecutiveHighBurn:5,windowSize:10}},computedAtISO:new Date().toISOString(),turnsAnalyzed:K.recentTurnTokens.length}}function r(K){let Q={enabled:!1,...K},X=d(),Z=c(),$=S();return{enabled:Q.enabled===!0,memory:{enabled:!0,query:Q.memory?.query??"meta_governor_context",timeoutMs:Q.memory?.agentmemoryTimeoutMs??2000},tokenPredictor:{compactBurnRateThreshold:Q.tokenPredictor?.compactBurnRateThreshold??500,compactUsageThreshold:Q.tokenPredictor?.compactUsageThreshold??0.85,switchModelUsageThreshold:Q.tokenPredictor?.switchModelUsageThreshold??0.95,delegateConsecutiveHighBurn:Q.tokenPredictor?.delegateConsecutiveHighBurn??5},scoring:{...X,...Q.scoring?.continueThreshold!==void 0?{continueThreshold:Q.scoring.continueThreshold}:{},...Q.scoring?.warnThreshold!==void 0?{warnThreshold:Q.scoring.warnThreshold}:{},...Q.scoring?.escalateThreshold!==void 0?{escalateThreshold:Q.scoring.escalateThreshold}:{},...Q.scoring?.stopThreshold!==void 0?{stopThreshold:Q.scoring.stopThreshold}:{}},closedLoop:{...$,...Q.closedLoop?.saveDecisions!==void 0?{saveDecisions:Q.closedLoop.saveDecisions}:{}},decision:{...Z,...Q.decision?.maxHistoryPerSession!==void 0?{maxHistoryPerSession:Q.decision.maxHistoryPerSession}:{},...Q.decision?.forceContinueAfterStops!==void 0?{forceContinueAfterStops:Q.decision.forceContinueAfterStops}:{}},modelOverride:Q.modelOverride?{providerID:Q.modelOverride.providerID,modelID:Q.modelOverride.modelID,modelLimit:Q.modelOverride.modelLimit,temperature:Q.modelOverride.temperature??0.2,topP:Q.modelOverride.topP??1,maxTokens:Q.modelOverride.maxTokens??2048,reasoning:Q.modelOverride.reasoning??!1,verbosity:Q.modelOverride.verbosity??"minimal"}:void 0,intervention:{mode:Q.intervention?.mode??"silent",includeDecisionHistory:Q.intervention?.includeDecisionHistory??!0,maxHistoryMessages:Q.intervention?.maxHistoryMessages??5,minActionForMessage:Q.intervention?.minActionForMessage??"stop",maxInterventionsPerSession:Q.intervention?.maxInterventionsPerSession??3,respectDoneSignal:Q.intervention?.respectDoneSignal??!0},protocolEnforcement:{enabled:Q.protocolEnforcement?.enabled??!1,path:Q.protocolEnforcement?.path,injectIntoSystem:Q.protocolEnforcement?.injectIntoSystem??!1,auditToolCalls:Q.protocolEnforcement?.auditToolCalls??!1}}}function tQ(K){return K?.enabled===!0}async function oQ(K={}){let{loadMetaGovernorConfig:Q}=await Promise.resolve().then(() => (AK(),nK)),X=await Q(K);return r(X.config)}var v=new Map;function wK(K,Q){v.set(K,Q)}function x(K){let Q=v.get(K);if(Q!==void 0)v.delete(K);return Q}function eQ(K){return v.has(K)}function KX(){for(let[K,Q]of v)return v.delete(K),Q;return}function QX(){v.clear()}import{appendFileSync as XX,mkdirSync as ZX}from"node:fs";import{resolve as $X,dirname as JX}from"node:path";import{homedir as qX}from"node:os";var sK=$X(qX(),".config","opencode","meta-governor.log");function zX(){try{ZX(JX(sK),{recursive:!0})}catch{}}function M(K,Q,X){zX();let Z=new Date().toISOString(),$=X!==void 0?` | ${JSON.stringify(X)}`:"",J=`[${Z}] [${K.toUpperCase()}] ${Q}${$}
12
+ `;try{XX(sK,J)}catch{}if(K==="error")console.error(`[meta-governor] ${Q}`);else if(K==="warn")console.warn(`[meta-governor] ${Q}`);else console.log(`[meta-governor] ${Q}`)}import{statSync as iK}from"node:fs";import{readFile as YX}from"node:fs/promises";import{resolve as WX}from"node:path";import{homedir as BX}from"node:os";var n=WX(BX(),".config","opencode","sisyphus-mandatory","sisyphus-mandatory.md");async function FK(K){return await YX(K??n,"utf-8")}function LK(K){let Q=["","## 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. Fall back to AFT (aft_zoom, aft_outline), 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`',' - "the usual" / "as configured" → `ctx_memory(action="list")`'," - Starting a task that resembles a previous one → `agentmemory_memory_smart_search`",' - "what changed" / "history" → `ctx_search`'," - Before asking the user a clarifying question → `agentmemory_memory_recall` first"," - Working note for THIS session only → `ctx_note`"," - Save durable insight/decision/rule → `ctx_memory`",""];if(/\boracle\b/i.test(K))Q.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 Q.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` + `ctx_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 use grep/find when aft_outline would answer the structure question."," - Do NOT duplicate a memory in both `agentmemory_memory_save` and `ctx_memory` — pick ONE."," - 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 `ctx_memory` so future sessions benefit.",""),Q.join(`
13
+ `)}function OK(K,Q,X){let Z=[],$=X.recentToolCalls??[],J=X.aftAvailable??!1,q=X.aftUsed??!1,Y=X.recentWriteContents??[],B=X.memorySaved??!1,H=X.batchCompletions??0;if((K==="grep"||K==="glob")&&(X.hasCodegraphDir||X.hasGraphifyDir)){let w=X.hasCodegraphDir?".codegraph":"graphify-out";Z.push({rule:"codebase-graph-first",tool:K,severity:"media",detail:`Used ${K} when ${w} exists — should use codegraph/graphify first for architecture and symbol queries.`})}if((K==="read"||K==="grep")&&J&&!q)Z.push({rule:"aft-first",tool:K,severity:"media",detail:`AFT tools (aft_outline, aft_zoom) are available but were not tried before using ${K}. Use aft_outline for structure discovery, aft_zoom for symbol source, before falling back to grep/read.`});if(K==="grep"&&J&&!q&&!X.hasCodegraphDir&&!X.hasGraphifyDir)Z.push({rule:"grep-without-aft",tool:K,severity:"leve",detail:"Used grep before checking if aft_outline would answer the structure question. grep is a last resort after graph tools and AFT."});if(K==="task"&&Q&&typeof Q==="object"){let w=Q;if(!w.task_id&&typeof w.prompt==="string"&&$.length>3)Z.push({rule:"continuation-discipline",tool:K,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 z=["write","edit","edit_block","desktop-commander_edit_block","desktop-commander_write_file"];if(z.includes(K)){let w=typeof Q==="object"&&Q!==null?JSON.stringify(Q):String(Q??""),N=/@ts-ignore|@ts-expect-error/.test(w),E=/\bas any\b/.test(w);if(N&&E)Z.push({rule:"no-type-suppression",tool:K,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(N)Z.push({rule:"no-type-suppression",tool:K,severity:"media",detail:"File write contains @ts-ignore or @ts-expect-error — both are forbidden. "+"Fix the underlying type error instead."});else if(E)Z.push({rule:"no-type-suppression",tool:K,severity:"media",detail:"File write contains 'as any' — type suppression forbidden. "+"Use proper type narrowing instead."})}if(z.includes(K)){let w=typeof Q==="object"&&Q!==null?JSON.stringify(Q):String(Q??"");if(/catch\s*\(\s*\w+\s*\)\s*\{\s*\}/.test(w))Z.push({rule:"no-empty-catch",tool:K,severity:"media",detail:"Empty catch block detected — `catch(e) {}` is forbidden. "+"Log the error or handle it gracefully."})}if(["grep","glob","read","aft_zoom","aft_outline","codegraph_explore","graphify query"].includes(K)&&$.length>=2){if(!$.slice(0,5).some((N)=>N.startsWith("ctx_memory"))&&!B)Z.push({rule:"save-discovery-to-memory",tool:K,severity:"leve",detail:`Used ${K} to discover code but ctx_memory was not used afterwards. Save non-obvious findings with ctx_memory so future sessions benefit.`})}if(H>0&&K!=="todowrite")Z.push({rule:"no-batch-todo-completion",tool:K,severity:"leve",detail:"Batch todo completion detected. Each todo must be marked `completed` immediately "+"after finishing — do not batch-complete multiple items."});if(K==="ctx_reduce"&&Q&&typeof Q==="object"){let w=Q.drop;if(typeof w==="string"&&/^\d+-\d+$/i.test(w.trim())){let[N,E]=w.trim().split("-").map(Number);if(!isNaN(N)&&!isNaN(E)&&E-N>10)Z.push({rule:"ctx-reduce-discipline",tool:K,severity:"leve",detail:`Dropped a large range (${w}) with ctx_reduce. The protocol requires reviewing each tag before dropping. Use smaller targeted drops instead of blanket ranges.`})}}if(X.emptyRecall&&!X.escalationAttempted){if(K.startsWith("question")||K==="ask")Z.push({rule:"empty-result-escalation",tool:K,severity:"grave",detail:"Memory recall returned empty but agent did not fire smart_search + ctx_search + export before asking the user. Steps 1-3 of empty-result escalation protocol are mandatory."})}let _=["agentmemory_memory_recall","agentmemory_memory_smart_search","agentmemory_memory_save","ctx_memory","ctx_search","ctx_note"];if(!X.memoryToolsUsed.some((w)=>_.some((N)=>w.startsWith(N)))&&(K.startsWith("question")||K==="ask"))Z.push({rule:"memory-first",tool:K,severity:"grave",detail:"Asked a question without first querying memory (agentmemory or ctx_memory). Must fire agentmemory_memory_recall or ctx_memory before asking the user."});if(X.filesChanged>=3&&!X.oracleInvoked){if(K!=="task"||!Q||typeof Q!=="object"||!("subagent_type"in Q))Z.push({rule:"oracle-verification",tool:K,severity:"media",detail:`Files changed (${X.filesChanged}) >= 3 but Oracle was not invoked. The POST-TASK ORACLE VERIFICATION protocol requires Oracle invocation on multi-file changes.`})}return Z}var tK={continue:0,warn:1,escalate:2,stop:3};function PK(K,Q){return tK[K]>=tK[Q]}function RK(K={},Q={}){let X=process.cwd(),Z=(()=>{try{return iK(`${X}/.codegraph`).isDirectory()}catch{return!1}})(),$=(()=>{try{return iK(`${X}/graphify-out`).isDirectory()}catch{return!1}})();if(K.graphSync?.enabled!==!1)u({enabled:!0,watch:K.graphSync?.watch??!1,autoInstall:K.graphSync?.autoInstall??!0,installTimeoutMs:K.graphSync?.installTimeoutMs??60000,projectDir:X}).catch(()=>{}),IK(X);return M("info","MetaGovernor plugin loaded",{version:"0.10.0",cwd:X,projectHasCodegraph:Z,projectHasGraphify:$}),async(Y,B)=>{let H={...K,...B?.meta_governor??{}},z=r(H);if(!z.enabled)return{};let V=()=>z.modelOverride?.providerID??Q.providerID?.(),_=()=>z.modelOverride?.modelID??Q.modelID?.(),R=()=>z.modelOverride?.modelLimit??200000,w=V()??"unknown",N=_()??"unknown",E;if(z.protocolEnforcement.enabled||z.protocolEnforcement.injectIntoSystem){let W=z.protocolEnforcement.path??n;FK(W).then((U)=>{E=LK(U)}).catch((U)=>{if(typeof console<"u"&&z.modelOverride?.verbosity!=="silent")console.warn("[meta-governor] could not load protocol:",U instanceof Error?U.message:U)})}let b=new Map,j=new Map,D=new Map,f=new Set;function MK(W){if(typeof W!=="string"||W.length===0)return!1;return/<promise>\s*DONE!?\s*<\/promise>/i.test(W)}return{"tool.execute.before":async(W)=>{if(!z.enabled)return;if(!z.protocolEnforcement.auditToolCalls)return;if(!W.sessionID)return;let U=b.get(W.sessionID);if(!U)U={memoryToolsUsed:[],hasCodegraphDir:Z,hasGraphifyDir:$,oracleInvoked:!1,filesChanged:0,emptyRecall:!1,escalationAttempted:!1,aftAvailable:!1,aftUsed:!1,recentToolCalls:[],recentWriteContents:[],memorySaved:!1,batchCompletions:0,taskDoneSignal:!1,interventionCount:0,interventionDisabled:!1},b.set(W.sessionID,U);if(E)console.log("[meta-governor] protocol loaded, system injection ready");let G=OK(W.tool,{},{memoryToolsUsed:U.memoryToolsUsed,hasCodegraphDir:U.hasCodegraphDir,hasGraphifyDir:U.hasGraphifyDir,oracleInvoked:U.oracleInvoked,filesChanged:U.filesChanged,emptyRecall:U.emptyRecall,escalationAttempted:U.escalationAttempted,aftAvailable:U.aftAvailable,aftUsed:U.aftUsed,recentToolCalls:U.recentToolCalls,recentWriteContents:U.recentWriteContents,memorySaved:U.memorySaved,batchCompletions:U.batchCompletions});if(G.length>0){M("warn",`protocol violations on tool ${W.tool}`,G);let A=j.get(W.sessionID)??[];for(let O of G)A.push(`[${O.severity.toUpperCase()}] ${O.rule}: ${O.detail}`);j.set(W.sessionID,A)}else M("info",`audit OK on tool ${W.tool}`)},"tool.execute.after":async(W,U)=>{if(!z.enabled)return;let G=b.get(W.sessionID);if(G){if(G.recentToolCalls=[W.tool].concat(G.recentToolCalls).slice(0,20),["write","edit","edit_block","desktop-commander_write_file","desktop-commander_edit_block"].includes(W.tool)){G.filesChanged++;let C=(U.output??"").slice(0,500);G.recentWriteContents=[C].concat(G.recentWriteContents).slice(0,3)}if(["agentmemory_memory_recall","agentmemory_memory_smart_search","agentmemory_memory_save","ctx_memory","ctx_search","ctx_note"].some((C)=>W.tool.startsWith(C))&&!G.memoryToolsUsed.includes(W.tool))G.memoryToolsUsed.push(W.tool);if(W.tool.startsWith("ctx_memory")){let C=U.output??"";if(C.includes("saved")||C.includes("written"))G.memorySaved=!0}if(W.tool.startsWith("aft_zoom")||W.tool.startsWith("aft_outline"))G.aftUsed=!0;if(W.tool==="task"&&(U.output??"").includes("subagent_type=oracle"))G.oracleInvoked=!0;let I=(U.output??"").toLowerCase();if(W.tool.includes("recall")&&(I.includes("returned empty")||I.includes("no results")))G.emptyRecall=!0;if(W.tool==="todowrite"&&(U.output??"").includes("completed")){if(((U.output??"").match(/"status":"completed"/g)??[]).length>=3)G.batchCompletions++}if(!G.taskDoneSignal){if(MK(U.output)||MK(W.args))G.taskDoneSignal=!0,M("info",`task_done_signal detected for session ${W.sessionID}`)}}if(G?.interventionDisabled)return;let A={sessionID:W.sessionID,toolName:W.tool,toolOutput:U.output,iteration:0,maxIterations:10,oracleVerified:G?.oracleInvoked??!1,noProgress:!1,filesChanged:G?.filesChanged??0,recentTurnTokens:[],deviations:[],backends:Q.backends??{agentmemory:{smartSearch:async()=>({lessons:[],crystals:[]})},magicContext:{slotList:async()=>[]},boulderState:{boulderRead:async()=>[]}},writeBackend:Q.writeBackend??{saveMemory:async()=>({id:""}),saveLesson:async()=>({id:""})},config:z,...V()?{providerID:V()}:{},..._()?{modelID:_()}:{},modelLimit:R()};try{let O=await HK(A);if(z.intervention.mode!=="silent"&&G){let P=O.decision;if(z.intervention.respectDoneSignal&&G.taskDoneSignal&&G.oracleInvoked){G.interventionDisabled=!0,M("info",`task verified (DONE + Oracle): disabling intervention for session ${W.sessionID}`),x(W.sessionID);return}if(P.action!=="continue"&&PK(P.action,z.intervention.minActionForMessage)){let L=Math.max(0,z.intervention.maxInterventionsPerSession??0);if(L>0&&G.interventionCount>=L){G.interventionDisabled=!0,M("warn",`intervention cap (${L}) reached for session ${W.sessionID}; disabling further intervention`),x(W.sessionID);return}G.interventionCount++,wK(W.sessionID,P)}}}catch{}try{if(W.tool==="bash"){let P=W.args?.command;if(KK(P))M("info","git_commit_reindex_triggered",{sessionID:W.sessionID,command:P}),Q.__test_onCommitTrigger?.({projectDir:X,command:P??"",sessionID:W.sessionID}),vK(X).catch((L)=>{M("warn",`codegraph sync failed: ${String(L)}`)})}}catch{}try{if(W.tool==="bash"){let P=W.args?.command;if(UX(P)){let L=HX(U.output,W.sessionID);if(L.length>0){let I=D.get(W.sessionID)??[];D.set(W.sessionID,I.concat(L)),M("info",`captured ${L.length} bot feedback line(s) for session ${W.sessionID}`)}}}}catch{}},"experimental.chat.messages.transform":async(W,U)=>{if(!z.enabled)return;if(z.intervention.mode!=="message")return;let A=U.messages[U.messages.length-1]?.info?.sessionID;if(!A)return;let O=b.get(A);if(O?.interventionDisabled){x(A);return}if(O&&!f.has(A)&&VX(X,O.interventionCount)){f.add(A);let y="[MetaGovernor] Before any code change, create PLAN.md or a `## Plan` section in AGENTS.md that enumerates the phases. After each phase, commit (local + fork + upstream). Each commit triggers automatic reindex via the graphify post-commit hook + `codegraph sync`.";U.messages.push({info:{role:"user",agent:"meta-governor",synthetic:!0},parts:[{type:"text",text:y,synthetic:!0}]}),M("info",`plan_reminder_injected for session ${A}`)}if(D.has(A)){let y=D.get(A);if(y.length>0){let s=`[MetaGovernor PR Reviewer Feedback]
13
14
 
14
- ${b.map((s,i)=>`${i+1}. ${s}`).join(`
15
+ ${y.map((i,t)=>`${t+1}. ${i}`).join(`
15
16
  `)}
16
17
 
17
- Apply these fixes to keep the PR mergeable.`;V.messages.push({info:{role:"user",agent:"meta-governor",synthetic:!0},parts:[{type:"text",text:n,synthetic:!0}]}),v.delete(w),P("info",`injected ${b.length} bot feedback line(s) to model for session ${w}`)}}if(h.has(w)){let b=h.get(w);if(b.length>0){let n=`[META-GOVERNOR PROTOCOL VIOLATIONS - YOU MUST COMPLY]
18
+ Apply these fixes to keep the PR mergeable.`;U.messages.push({info:{role:"user",agent:"meta-governor",synthetic:!0},parts:[{type:"text",text:s,synthetic:!0}]}),D.delete(A),M("info",`injected ${y.length} bot feedback line(s) to model for session ${A}`)}}if(j.has(A)){let y=j.get(A);if(y.length>0){let s=`[META-GOVERNOR PROTOCOL VIOLATIONS - YOU MUST COMPLY]
18
19
 
19
- ${b.map((s,i)=>`${i+1}. ${s}`).join(`
20
+ ${y.map((i,t)=>`${t+1}. ${i}`).join(`
20
21
  `)}
21
22
 
22
- Remember: use codegraph/graphify for architecture queries, do not grep without trying AFT/codegraph first, no @ts-ignore/as-any, no empty catch, check memory before asking.`;V.messages.push({info:{role:"user",agent:"meta-governor",synthetic:!0},parts:[{type:"text",text:n,synthetic:!0}]}),h.delete(w),P("info",`injected ${b.length} violation(s) to model`)}}let O=y(w);if(!O)return;if(O.action==="continue")return;if(!O.message)return;if(!LK(O.action,z.intervention.minActionForMessage))return;let F=L??x.get(w);if(!F)F={memoryToolsUsed:[],hasCodegraphDir:Z,hasGraphifyDir:$,oracleInvoked:!1,filesChanged:0,emptyRecall:!1,escalationAttempted:!1,aftAvailable:!1,aftUsed:!1,recentToolCalls:[],recentWriteContents:[],memorySaved:!1,batchCompletions:0,taskDoneSignal:!1,interventionCount:0,interventionDisabled:!1},x.set(w,F);let j=Math.max(0,z.intervention.maxInterventionsPerSession??0);if(j>0&&F.interventionCount>=j){F.interventionDisabled=!0;return}F.interventionCount++;let T={type:"text",text:`[MetaGovernor] ${O.message}`,synthetic:!0};V.messages.push({info:{role:"user",agent:"meta-governor"},parts:[T]})},"experimental.chat.system.transform":async(Y,V)=>{if(!z.enabled)return;if(z.protocolEnforcement.injectIntoSystem&&E)V.system.push(`
23
- ### Sisyphus Protocol Enforcement`,E,"---");if(z.intervention.mode==="system"&&Y.sessionID){let U=x.get(Y.sessionID);if(U?.interventionDisabled){y(Y.sessionID);return}let w=y(Y.sessionID);if(w&&w.action!=="continue"&&w.message){if(LK(w.action,z.intervention.minActionForMessage)){if(U){let L=Math.max(0,z.intervention.maxInterventionsPerSession??0);if(L>0&&U.interventionCount>=L){U.interventionDisabled=!0;return}U.interventionCount++}V.system.push(`
24
- [MetaGovernor Intervention]`,w.message,"---")}}}}}}}function QX(K,Q){if(typeof K!=="string"||K.length===0)return[];let X=K.split(`
25
- `),Z=[];for(let $ of X){let J=$.match(/^\s*(\S+)\s+(fail)\s+(.*)$/);if(J){let q=J[1].trim(),W=J[3].trim();Z.push(`${Q} · ${q}: ${W}`)}}return Z}function XX(K){if(typeof K!=="string"||K.length===0)return!1;let Q=K.replace(/\\\n/g," ").replace(/\s*\n\s*/g," ");return/(?:^|[\s;&|])gh\s+pr(?:\s|$)/.test(Q)}function ZX(K,Q){if(Q>=1)return!1;try{let{statSync:X,readFileSync:Z}=C("node:fs"),{join:$}=C("node:path");try{return X($(K,"PLAN.md")),!1}catch{}try{let J=Z($(K,"AGENTS.md"),"utf-8");if(/^##\s+Plan\b/im.test(J))return!1}catch{}return!0}catch{return!0}}function $X(K){let Q={severity:K.success?"leve":"grave",category:`recovery:${K.fixStrategy}`,detail:`${K.errorCode}: ${K.context??"no context"}`};return{action:K.success?"continue":"warn",score:K.success?0.5:-0.5,reasoning:`Recovery ${K.success?"succeeded":"failed"}: ${K.fixStrategy} for ${K.errorCode}`,evidence:[{source:"deviation-detector",value:Q.detail,confidence:1,weight:K.success?0.3:0.8}],shouldEscalateTo:K.success?null:"oracle"}}var cK={leve:0,media:1,grave:2};function rK(K,Q){let X=cK[Q]??0;return K.some((Z)=>(cK[Z.severity]??0)>=X)}async function JX(K,Q,X){if(!Q)return null;let Z=X?.config??D(),$=$X(K);if(!Z.enabled)return{lessonSaved:null,decisionSaved:null,reason:"closed-loop learning disabled"};let J=[{severity:K.success?"leve":"grave",category:`recovery:${K.fixStrategy}`,detail:`${K.errorCode}: ${K.context??"no context"}`}],q=null,W=null;if(Z.saveDecisions){let H={id:`D-${Math.abs(`${K.sessionID}-${$.action}-${Date.now()}`.split("").reduce((z,G)=>(z<<5)-z+G.charCodeAt(0)|0,0)).toString(36)}`,timestampISO:new Date().toISOString(),action:$.action,score:$.score,reasoning:$.reasoning,sessionID:K.sessionID,directory:K.directory,deviations:J.map((z)=>({severity:z.severity,category:z.category,detail:z.detail}))};try{await Q.saveMemory({content:`Decision: ${$.action} (score ${$.score.toFixed(2)}). ${$.reasoning}`,concepts:["meta-governor","decision",$.action,...J.map((z)=>z.category)],type:"fact",files:[...K.filesChanged??[]]}),W=H}catch{}}if(rK(J,Z.minSeverityToLearn)){let H=[...new Set(J.flatMap((_)=>[_.category,_.severity]))],z=J.map((_)=>`[${_.severity}] ${_.category}: ${_.detail}`).join("; "),G=`Action "${$.action}" (score ${$.score.toFixed(2)}) after deviations: ${z}. Reasoning: ${$.reasoning}`;try{q={id:(await Q.saveLesson({content:G,context:`session:${K.sessionID} dir:${K.directory}`,confidence:Math.max(0.3,Math.min(0.8,Math.abs($.score))),tags:H})).id,title:`${$.action} after ${J[0]?.category??"recovery"}`,content:G,type:"pattern",concepts:H,confidence:Math.max(0.3,Math.min(0.8,Math.abs($.score))),files:[...K.filesChanged??[]],sessionID:K.sessionID}}catch{}}let B=[];if(W)B.push("decision saved");if(q)B.push("lesson saved");else if(!rK(J,Z.minSeverityToLearn))B.push("severity below threshold");if(!W&&!q&&!B.length)B.push("no saveable content");return{lessonSaved:q,decisionSaved:W,reason:B.join("; ")||"no action taken"}}GK();function nK(){return{$schema:"http://json-schema.org/draft-07/schema#",$id:"https://raw.githubusercontent.com/herjarsa/omo-meta-governor/main/assets/omo-meta-governor.schema.json",title:"omo-meta-governor",description:"Configuration schema for @herjarsa/omo-meta-governor — Self-judging agent orchestration layer for OpenCode.",type:"object",additionalProperties:!1,properties:{$schema:{type:"string",description:"JSON Schema reference for IDE autocompletion."},enabled:{type:"boolean",description:"Master feature flag — must be true to run the orchestrator.",default:!1},decision:{type:"object",description:"Decision handler configuration.",additionalProperties:!1,properties:{maxHistoryPerSession:{type:"integer",description:"Maximum history entries per session before oldest are trimmed.",default:50,minimum:1},forceContinueAfterStops:{type:"integer",description:"How many consecutive stops before forcing continue.",default:3,minimum:1}}},memory:{type:"object",description:"Memory aggregator configuration.",additionalProperties:!1,properties:{agentmemoryTimeoutMs:{type:"integer",description:"Timeout for agentmemory queries in milliseconds.",default:2000,minimum:100},magicContextTimeoutMs:{type:"integer",description:"Timeout for magic-context queries in milliseconds.",default:1000,minimum:100},boulderStateTimeoutMs:{type:"integer",description:"Timeout for boulder-state queries in milliseconds.",default:1000,minimum:100},query:{type:"string",description:"Natural-language query for memory recall.",default:"meta_governor_context"}}},tokenPredictor:{type:"object",description:"Token predictor configuration.",additionalProperties:!1,properties:{compactBurnRateThreshold:{type:"integer",description:"Burn rate threshold (tokens/turn) above which to recommend compact-now.",default:500,minimum:0},compactUsageThreshold:{type:"number",description:"Context usage ratio (0..1) above which to recommend compact-now.",default:0.85,minimum:0,maximum:1},switchModelUsageThreshold:{type:"number",description:"Context usage ratio above which to recommend switch-model.",default:0.95,minimum:0,maximum:1},delegateConsecutiveHighBurn:{type:"integer",description:"Max consecutive high-burn turns before recommending delegate.",default:5,minimum:1}}},scoring:{type:"object",description:"Scoring engine configuration.",additionalProperties:!1,properties:{continueThreshold:{type:"number",description:"Score >= this -> continue silently.",default:0.3,minimum:0,maximum:1},warnThreshold:{type:"number",description:"Score <= -warnThreshold -> warn.",default:0.3,minimum:0,maximum:1},escalateThreshold:{type:"number",description:"Score <= -escalateThreshold -> escalate.",default:0.6,minimum:0,maximum:1},stopThreshold:{type:"number",description:"Score <= -stopThreshold -> stop.",default:0.8,minimum:0,maximum:1}}},closedLoop:{type:"object",description:"Closed-loop learning configuration.",additionalProperties:!1,properties:{saveDecisions:{type:"boolean",description:"Whether to save decision records.",default:!0},saveLessons:{type:"boolean",description:"Whether to save lessons.",default:!0}}},modelOverride:{type:"object",description:"Model override for MetaGovernor internal LLM usage.",additionalProperties:!1,properties:{providerID:{type:"string",description:"Provider ID (e.g. 'openai', 'anthropic')."},modelID:{type:"string",description:"Model ID (e.g. 'gpt-4o-mini', 'claude-sonnet-4-20250514')."},modelLimit:{type:"integer",description:"Context window size for token predictor.",minimum:1000},temperature:{type:"number",description:"Sampling temperature. Default: 0.2.",default:0.2,minimum:0,maximum:2},topP:{type:"number",description:"Top-p nucleus sampling. Default: 1.",default:1,minimum:0,maximum:1},maxTokens:{type:"integer",description:"Max output tokens for internal reasoning.",default:2048,minimum:1},reasoning:{type:"boolean",description:"Enable extended reasoning / thinking mode.",default:!1},verbosity:{type:"string",description:"Verbosity level for internal logging.",enum:["silent","minimal","verbose"],default:"minimal"}}},intervention:{type:"object",description:"Intervention config for visible decision injection.",additionalProperties:!1,properties:{mode:{type:"string",description:"How to inject: 'silent', 'message', or 'system'.",enum:["silent","message","system"],default:"silent"},includeDecisionHistory:{type:"boolean",description:"Whether to include recent decision history.",default:!0},maxHistoryMessages:{type:"integer",description:"Max history entries when includeDecisionHistory is true.",default:5,minimum:1},minActionForMessage:{type:"string",description:"Minimum action: 'warn' (all non-continue), 'escalate', or 'stop'.",enum:["warn","escalate","stop"],default:"warn"}}},protocolEnforcement:{type:"object",description:"Sisyphus protocol enforcement config.",additionalProperties:!1,properties:{enabled:{type:"boolean",description:"Master switch for protocol enforcement.",default:!1},path:{type:"string",description:"Path to protocol markdown file."},injectIntoSystem:{type:"boolean",description:"Whether to inject protocol rules into the system prompt.",default:!1},auditToolCalls:{type:"boolean",description:"Whether to audit tool calls for protocol violations.",default:!1}}},graphSync:{type:"object",description:"Graph synchronization (auto-init codegraph/graphify).",additionalProperties:!1,properties:{enabled:{type:"boolean",description:"Enable auto-initialization of codegraph and graphify.",default:!0},watch:{type:"boolean",description:"Enable watch mode (re-index on file changes).",default:!1}}}},definitions:{verbosity:{type:"string",enum:["silent","minimal","verbose"],description:"Verbosity level."},interventionMode:{type:"string",enum:["silent","message","system"],description:"Intervention injection mode."},minAction:{type:"string",enum:["warn","escalate","stop"],description:"Minimum action threshold."}}}}async function qX(K){let Q=nK(),{writeFile:X}=await import("node:fs/promises");await X(K,JSON.stringify(Q,null,2)+`
26
- `,"utf-8")}var zX={id:"omo-meta-governor",server:OK()},ZZ=zX;export{qX as writeSchemaFile,bQ as trimHistory,y as takeDecision,lQ as takeAnyDecision,VK as stripJsoncComments,_K as storeDecision,WQ as stopWatches,JK as score,WK as runMetaGovernor,p as runGraphSync,qQ as resetInitializedProjects,JX as recordRecovery,$K as predict,BK as parseJsonc,zK as observeAndLearn,P as logToFile,wK as loadProtocol,uQ as loadOrchestratorConfigFromSources,c as loadOrchestratorConfig,pK as loadMetaGovernorConfig,a as loadJsoncFile,pQ as isMetaGovernorEnabled,dQ as hasDecision,qK as handleDecision,UK as getUserConfigPath,HK as getProjectConfigPath,nK as generateSchema,AQ as defaultTokenPredictorConfig,u as defaultScoringConfig,vK as defaultOrchestratorConfig,l as defaultDecisionHandlerConfig,D as defaultClosedLoopConfig,ZZ as default,S as deepMerge,OK as createMetaGovernorPlugin,CQ as countConsecutiveStops,aQ as clearAll,jK as calculateBurnRate,AK as buildSystemInjection,fK as buildDecisionContext,FK as auditToolCall,XK as aggregateRead,r as DEFAULT_PROTOCOL_PATH};
23
+ Remember: use codegraph/graphify for architecture queries, do not grep without trying AFT/codegraph first, no @ts-ignore/as-any, no empty catch, check memory before asking.`;U.messages.push({info:{role:"user",agent:"meta-governor",synthetic:!0},parts:[{type:"text",text:s,synthetic:!0}]}),j.delete(A),M("info",`injected ${y.length} violation(s) to model`)}}let P=x(A);if(!P)return;if(P.action==="continue")return;if(!P.message)return;if(!PK(P.action,z.intervention.minActionForMessage))return;let L=O??b.get(A);if(!L)L={memoryToolsUsed:[],hasCodegraphDir:Z,hasGraphifyDir:$,oracleInvoked:!1,filesChanged:0,emptyRecall:!1,escalationAttempted:!1,aftAvailable:!1,aftUsed:!1,recentToolCalls:[],recentWriteContents:[],memorySaved:!1,batchCompletions:0,taskDoneSignal:!1,interventionCount:0,interventionDisabled:!1},b.set(A,L);let I=Math.max(0,z.intervention.maxInterventionsPerSession??0);if(I>0&&L.interventionCount>=I){L.interventionDisabled=!0;return}L.interventionCount++;let C={type:"text",text:`[MetaGovernor] ${P.message}`,synthetic:!0};U.messages.push({info:{role:"user",agent:"meta-governor"},parts:[C]})},"experimental.chat.system.transform":async(W,U)=>{if(!z.enabled)return;if(z.protocolEnforcement.injectIntoSystem&&E)U.system.push(`
24
+ ### Sisyphus Protocol Enforcement`,E,"---");if(z.intervention.mode==="system"&&W.sessionID){let G=b.get(W.sessionID);if(G?.interventionDisabled){x(W.sessionID);return}let A=x(W.sessionID);if(A&&A.action!=="continue"&&A.message){if(PK(A.action,z.intervention.minActionForMessage)){if(G){let O=Math.max(0,z.intervention.maxInterventionsPerSession??0);if(O>0&&G.interventionCount>=O){G.interventionDisabled=!0;return}G.interventionCount++}U.system.push(`
25
+ [MetaGovernor Intervention]`,A.message,"---")}}}}}}}function HX(K,Q){if(typeof K!=="string"||K.length===0)return[];let X=K.split(`
26
+ `),Z=[];for(let $ of X){let J=$.match(/^\s*(\S+)\s+(fail)\s+(.*)$/);if(J){let q=J[1].trim(),Y=J[3].trim();Z.push(`${Q} · ${q}: ${Y}`)}}return Z}function UX(K){if(typeof K!=="string"||K.length===0)return!1;let Q=K.replace(/\\\n/g," ").replace(/\s*\n\s*/g," ");return/(?:^|[\s;&|])gh\s+pr(?:\s|$)/.test(Q)}function VX(K,Q){if(Q>=1)return!1;try{let{statSync:X,readFileSync:Z}=F("node:fs"),{join:$}=F("node:path");try{return X($(K,"PLAN.md")),!1}catch{}try{let J=Z($(K,"AGENTS.md"),"utf-8");if(/^##\s+Plan\b/im.test(J))return!1}catch{}return!0}catch{return!0}}function GX(K){let Q={severity:K.success?"leve":"grave",category:`recovery:${K.fixStrategy}`,detail:`${K.errorCode}: ${K.context??"no context"}`};return{action:K.success?"continue":"warn",score:K.success?0.5:-0.5,reasoning:`Recovery ${K.success?"succeeded":"failed"}: ${K.fixStrategy} for ${K.errorCode}`,evidence:[{source:"deviation-detector",value:Q.detail,confidence:1,weight:K.success?0.3:0.8}],shouldEscalateTo:K.success?null:"oracle"}}var oK={leve:0,media:1,grave:2};function eK(K,Q){let X=oK[Q]??0;return K.some((Z)=>(oK[Z.severity]??0)>=X)}async function _X(K,Q,X){if(!Q)return null;let Z=X?.config??S(),$=GX(K);if(!Z.enabled)return{lessonSaved:null,decisionSaved:null,reason:"closed-loop learning disabled"};let J=[{severity:K.success?"leve":"grave",category:`recovery:${K.fixStrategy}`,detail:`${K.errorCode}: ${K.context??"no context"}`}],q=null,Y=null;if(Z.saveDecisions){let H={id:`D-${Math.abs(`${K.sessionID}-${$.action}-${Date.now()}`.split("").reduce((z,V)=>(z<<5)-z+V.charCodeAt(0)|0,0)).toString(36)}`,timestampISO:new Date().toISOString(),action:$.action,score:$.score,reasoning:$.reasoning,sessionID:K.sessionID,directory:K.directory,deviations:J.map((z)=>({severity:z.severity,category:z.category,detail:z.detail}))};try{await Q.saveMemory({content:`Decision: ${$.action} (score ${$.score.toFixed(2)}). ${$.reasoning}`,concepts:["meta-governor","decision",$.action,...J.map((z)=>z.category)],type:"fact",files:[...K.filesChanged??[]]}),Y=H}catch{}}if(eK(J,Z.minSeverityToLearn)){let H=[...new Set(J.flatMap((_)=>[_.category,_.severity]))],z=J.map((_)=>`[${_.severity}] ${_.category}: ${_.detail}`).join("; "),V=`Action "${$.action}" (score ${$.score.toFixed(2)}) after deviations: ${z}. Reasoning: ${$.reasoning}`;try{q={id:(await Q.saveLesson({content:V,context:`session:${K.sessionID} dir:${K.directory}`,confidence:Math.max(0.3,Math.min(0.8,Math.abs($.score))),tags:H})).id,title:`${$.action} after ${J[0]?.category??"recovery"}`,content:V,type:"pattern",concepts:H,confidence:Math.max(0.3,Math.min(0.8,Math.abs($.score))),files:[...K.filesChanged??[]],sessionID:K.sessionID}}catch{}}let B=[];if(Y)B.push("decision saved");if(q)B.push("lesson saved");else if(!eK(J,Z.minSeverityToLearn))B.push("severity below threshold");if(!Y&&!q&&!B.length)B.push("no saveable content");return{lessonSaved:q,decisionSaved:Y,reason:B.join("; ")||"no action taken"}}AK();function KQ(){return{$schema:"http://json-schema.org/draft-07/schema#",$id:"https://raw.githubusercontent.com/herjarsa/omo-meta-governor/main/assets/omo-meta-governor.schema.json",title:"omo-meta-governor",description:"Configuration schema for @herjarsa/omo-meta-governor — Self-judging agent orchestration layer for OpenCode.",type:"object",additionalProperties:!1,properties:{$schema:{type:"string",description:"JSON Schema reference for IDE autocompletion."},enabled:{type:"boolean",description:"Master feature flag — must be true to run the orchestrator.",default:!1},decision:{type:"object",description:"Decision handler configuration.",additionalProperties:!1,properties:{maxHistoryPerSession:{type:"integer",description:"Maximum history entries per session before oldest are trimmed.",default:50,minimum:1},forceContinueAfterStops:{type:"integer",description:"How many consecutive stops before forcing continue.",default:3,minimum:1}}},memory:{type:"object",description:"Memory aggregator configuration.",additionalProperties:!1,properties:{agentmemoryTimeoutMs:{type:"integer",description:"Timeout for agentmemory queries in milliseconds.",default:2000,minimum:100},magicContextTimeoutMs:{type:"integer",description:"Timeout for magic-context queries in milliseconds.",default:1000,minimum:100},boulderStateTimeoutMs:{type:"integer",description:"Timeout for boulder-state queries in milliseconds.",default:1000,minimum:100},query:{type:"string",description:"Natural-language query for memory recall.",default:"meta_governor_context"}}},tokenPredictor:{type:"object",description:"Token predictor configuration.",additionalProperties:!1,properties:{compactBurnRateThreshold:{type:"integer",description:"Burn rate threshold (tokens/turn) above which to recommend compact-now.",default:500,minimum:0},compactUsageThreshold:{type:"number",description:"Context usage ratio (0..1) above which to recommend compact-now.",default:0.85,minimum:0,maximum:1},switchModelUsageThreshold:{type:"number",description:"Context usage ratio above which to recommend switch-model.",default:0.95,minimum:0,maximum:1},delegateConsecutiveHighBurn:{type:"integer",description:"Max consecutive high-burn turns before recommending delegate.",default:5,minimum:1}}},scoring:{type:"object",description:"Scoring engine configuration.",additionalProperties:!1,properties:{continueThreshold:{type:"number",description:"Score >= this -> continue silently.",default:0.3,minimum:0,maximum:1},warnThreshold:{type:"number",description:"Score <= -warnThreshold -> warn.",default:0.3,minimum:0,maximum:1},escalateThreshold:{type:"number",description:"Score <= -escalateThreshold -> escalate.",default:0.6,minimum:0,maximum:1},stopThreshold:{type:"number",description:"Score <= -stopThreshold -> stop.",default:0.8,minimum:0,maximum:1}}},closedLoop:{type:"object",description:"Closed-loop learning configuration.",additionalProperties:!1,properties:{saveDecisions:{type:"boolean",description:"Whether to save decision records.",default:!0},saveLessons:{type:"boolean",description:"Whether to save lessons.",default:!0}}},modelOverride:{type:"object",description:"Model override for MetaGovernor internal LLM usage.",additionalProperties:!1,properties:{providerID:{type:"string",description:"Provider ID (e.g. 'openai', 'anthropic')."},modelID:{type:"string",description:"Model ID (e.g. 'gpt-4o-mini', 'claude-sonnet-4-20250514')."},modelLimit:{type:"integer",description:"Context window size for token predictor.",minimum:1000},temperature:{type:"number",description:"Sampling temperature. Default: 0.2.",default:0.2,minimum:0,maximum:2},topP:{type:"number",description:"Top-p nucleus sampling. Default: 1.",default:1,minimum:0,maximum:1},maxTokens:{type:"integer",description:"Max output tokens for internal reasoning.",default:2048,minimum:1},reasoning:{type:"boolean",description:"Enable extended reasoning / thinking mode.",default:!1},verbosity:{type:"string",description:"Verbosity level for internal logging.",enum:["silent","minimal","verbose"],default:"minimal"}}},intervention:{type:"object",description:"Intervention config for visible decision injection.",additionalProperties:!1,properties:{mode:{type:"string",description:"How to inject: 'silent', 'message', or 'system'.",enum:["silent","message","system"],default:"silent"},includeDecisionHistory:{type:"boolean",description:"Whether to include recent decision history.",default:!0},maxHistoryMessages:{type:"integer",description:"Max history entries when includeDecisionHistory is true.",default:5,minimum:1},minActionForMessage:{type:"string",description:"Minimum action: 'warn' (all non-continue), 'escalate', or 'stop'.",enum:["warn","escalate","stop"],default:"warn"}}},protocolEnforcement:{type:"object",description:"Sisyphus protocol enforcement config.",additionalProperties:!1,properties:{enabled:{type:"boolean",description:"Master switch for protocol enforcement.",default:!1},path:{type:"string",description:"Path to protocol markdown file."},injectIntoSystem:{type:"boolean",description:"Whether to inject protocol rules into the system prompt.",default:!1},auditToolCalls:{type:"boolean",description:"Whether to audit tool calls for protocol violations.",default:!1}}},graphSync:{type:"object",description:"Graph synchronization (auto-init codegraph/graphify).",additionalProperties:!1,properties:{enabled:{type:"boolean",description:"Enable auto-initialization of codegraph and graphify.",default:!0},watch:{type:"boolean",description:"Enable watch mode (re-index on file changes).",default:!1}}}},definitions:{verbosity:{type:"string",enum:["silent","minimal","verbose"],description:"Verbosity level."},interventionMode:{type:"string",enum:["silent","message","system"],description:"Intervention injection mode."},minAction:{type:"string",enum:["warn","escalate","stop"],description:"Minimum action threshold."}}}}async function AX(K){let Q=KQ(),{writeFile:X}=await import("node:fs/promises");await X(K,JSON.stringify(Q,null,2)+`
27
+ `,"utf-8")}var wX={id:"omo-meta-governor",server:RK()},VZ=wX;export{AX as writeSchemaFile,fQ as trimHistory,x as takeDecision,KX as takeAnyDecision,UK as stripJsoncComments,wK as storeDecision,VQ as stopWatches,zK as score,HK as runMetaGovernor,u as runGraphSync,BQ as resetInitializedProjects,_X as recordRecovery,qK as predict,VK as parseJsonc,WK as observeAndLearn,M as logToFile,FK as loadProtocol,oQ as loadOrchestratorConfigFromSources,r as loadOrchestratorConfig,rK as loadMetaGovernorConfig,a as loadJsoncFile,tQ as isMetaGovernorEnabled,eQ as hasDecision,YK as handleDecision,GK as getUserConfigPath,_K as getProjectConfigPath,KQ as generateSchema,TQ as defaultTokenPredictorConfig,d as defaultScoringConfig,dK as defaultOrchestratorConfig,c as defaultDecisionHandlerConfig,S as defaultClosedLoopConfig,VZ as default,h as deepMerge,RK as createMetaGovernorPlugin,mQ as countConsecutiveStops,QX as clearAll,fK as calculateBurnRate,LK as buildSystemInjection,lK as buildDecisionContext,OK as auditToolCall,$K as aggregateRead,n as DEFAULT_PROTOCOL_PATH};
27
28
 
28
- //# debugId=C6D81EA8D3395FF264756E2164756E21
29
+ //# debugId=CC2367A5012E56A664756E2164756E21
29
30
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -3,7 +3,7 @@
3
3
  "sources": ["../src/config-file.ts", "../src/graph-sync.ts", "../src/memory-aggregator.ts", "../src/token-predictor.ts", "../src/scoring-engine.ts", "../src/decision-handler.ts", "../src/closed-loop-learning.ts", "../src/orchestrator.ts", "../src/config.ts", "../src/decision-store.ts", "../src/file-logger.ts", "../src/plugin.ts", "../src/protocol-enforcer.ts", "../src/post-repair-recorder.ts", "../src/index.ts", "../src/generate-schema.ts"],
4
4
  "sourcesContent": [
5
5
  "/**\n * JSONC config file loader for omo-meta-governor.\n *\n * Loads `omo-meta-governor.jsonc` from three layers (closer wins):\n * 1. CLI inline options (opts object) — highest priority\n * 2. Project config: `.opencode/omo-meta-governor.jsonc`\n * 3. User config: `~/.config/opencode/omo-meta-governor.jsonc`\n * 4. Defaults — lowest priority\n *\n * JSONC support: comments (//, /* * /) and trailing commas are stripped\n * before parsing. The raw JSON object is then projected into\n * `MetaGovernorPluginConfig` via `loadOrchestratorConfig()`.\n */\n\nimport { readFile, access } from \"node:fs/promises\"\nimport { resolve, join } from \"node:path\"\nimport { homedir } from \"node:os\"\nimport type { MetaGovernorPluginConfig } from \"./config\"\n\n// ─── File name ─────────────────────────────────────────────────────\n\nconst CONFIG_FILE_NAME = \"omo-meta-governor.jsonc\"\n\n// ─── JSONC parsing ─────────────────────────────────────────────────\n\n/**\n * Strip JSONC comments (single-line // style and multi-line bracket style)\n * and trailing commas from a JSONC string so it can be parsed by JSON.parse.\n *\n * Handles:\n * - // single-line comments\n * - /asterisk ... asterisk/ multi-line comments\n * - Trailing commas before ] or }\n * - Strings containing comments (preserved)\n */\nexport function stripJsoncComments(jsonc: string): string {\n const result: string[] = []\n let i = 0\n\n while (i < jsonc.length) {\n const ch = jsonc[i]!\n\n // Detect string literal\n if (ch === '\"' || ch === \"'\") {\n const quote = ch\n result.push(quote)\n i++\n while (i < jsonc.length) {\n const c = jsonc[i]!\n result.push(c)\n if (c === '\\\\') {\n i++\n if (i < jsonc.length) {\n result.push(jsonc[i]!)\n }\n } else if (c === quote) {\n i++\n break\n }\n i++\n }\n continue\n }\n\n // Single-line comment\n if (ch === '/' && i + 1 < jsonc.length && jsonc[i + 1] === '/') {\n i += 2\n while (i < jsonc.length && jsonc[i] !== '\\n') {\n i++\n }\n continue\n }\n\n // Multi-line comment\n if (ch === '/' && i + 1 < jsonc.length && jsonc[i + 1] === '*') {\n i += 2\n while (i < jsonc.length) {\n if (jsonc[i] === '*' && i + 1 < jsonc.length && jsonc[i + 1] === '/') {\n i += 2\n break\n }\n i++\n }\n continue\n }\n\n result.push(ch)\n i++\n }\n\n // Strip trailing commas before ] or }\n let cleaned = result.join(\"\")\n // Handle multiple passes for nested structures\n for (let pass = 0; pass < 10; pass++) {\n const before = cleaned\n cleaned = cleaned.replace(/,(\\s*[\\]}])/g, \"$1\")\n if (cleaned === before) break\n }\n\n return cleaned\n}\n\n/**\n * Parse a JSONC string into a JavaScript object.\n * Returns undefined on parse failure.\n */\nexport function parseJsonc<T = Record<string, unknown>>(jsonc: string): T | undefined {\n try {\n const cleaned = stripJsoncComments(jsonc)\n return JSON.parse(cleaned) as T\n } catch {\n return undefined\n }\n}\n\n// ─── Config paths ──────────────────────────────────────────────────\n\n/**\n * Get the user-level config file path.\n */\nexport function getUserConfigPath(): string {\n return resolve(homedir(), \".config\", \"opencode\", CONFIG_FILE_NAME)\n}\n\n/**\n * Get the project-level config file path for a given project directory.\n */\nexport function getProjectConfigPath(projectDir?: string): string {\n const base = projectDir ?? process.cwd()\n return join(base, \".opencode\", CONFIG_FILE_NAME)\n}\n\n// ─── File existence check ──────────────────────────────────────────\n\nasync function fileExists(filePath: string): Promise<boolean> {\n try {\n await access(filePath)\n return true\n } catch {\n return false\n }\n}\n\n// ─── Load single config file ───────────────────────────────────────\n\n/**\n * Read and parse a single JSONC config file.\n * Returns undefined if the file does not exist or is unparseable.\n */\nexport async function loadJsoncFile<T = Record<string, unknown>>(\n filePath: string,\n): Promise<T | undefined> {\n if (!(await fileExists(filePath))) return undefined\n try {\n const content = await readFile(filePath, \"utf-8\")\n return parseJsonc<T>(content)\n } catch {\n return undefined\n }\n}\n\n// ─── Merge two configs (deep merge, second wins) ───────────────────\n\n/**\n * Deep-merge two config objects. Arrays are replaced (not concatenated).\n * The `source` values win when both exist.\n * Mutually recursive with mergeArrays=false for sub-objects.\n */\nexport function deepMerge<T extends Record<string, unknown>>(\n target: T,\n source: Partial<T>,\n): T {\n const result = { ...target } as Record<string, unknown>\n\n for (const key of Object.keys(source)) {\n const srcVal = source[key as keyof typeof source]\n const tgtVal = result[key]\n\n if (srcVal === undefined) continue\n\n if (\n isPlainObject(srcVal) &&\n isPlainObject(tgtVal)\n ) {\n result[key] = deepMerge(tgtVal as Record<string, unknown>, srcVal as Record<string, unknown>)\n } else {\n result[key] = srcVal\n }\n }\n\n return result as T\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value)\n}\n\n// ─── Full config loading pipeline ──────────────────────────────────\n\nexport interface ConfigFileSources {\n /** CLI inline options (highest priority) */\n cliOptions?: Partial<MetaGovernorPluginConfig>\n /** Project directory for project-level config lookup */\n projectDir?: string\n}\n\nexport interface ConfigFileResult {\n /** The merged MetaGovernorPluginConfig */\n config: Partial<MetaGovernorPluginConfig>\n /** Which source files were loaded */\n sources: string[]\n /** Which source was the effective highest-priority non-empty source */\n effectiveSource: \"cli\" | \"project\" | \"user\" | \"defaults\"\n}\n\n/**\n * Load the MetaGovernor config from all available sources with priority:\n * CLI inline > project `.opencode/omo-meta-governor.jsonc` >\n * user `~/.config/opencode/omo-meta-governor.jsonc` > defaults\n *\n * Higher-priority sources override lower-priority ones.\n */\nexport async function loadMetaGovernorConfig(\n sources: ConfigFileSources = {},\n): Promise<ConfigFileResult> {\n const loadedSources: string[] = []\n let effectiveSource: ConfigFileResult[\"effectiveSource\"] = \"defaults\"\n\n // Start with empty config (defaults applied later by loadOrchestratorConfig)\n let merged: Partial<MetaGovernorPluginConfig> = {}\n\n // 1. User config (lowest file priority)\n const userPath = getUserConfigPath()\n const userConfig = await loadJsoncFile<Partial<MetaGovernorPluginConfig>>(userPath)\n if (userConfig) {\n merged = deepMerge(merged, userConfig)\n loadedSources.push(`user:${userPath}`)\n effectiveSource = \"user\"\n }\n\n // 2. Project config (medium file priority)\n const projectPath = getProjectConfigPath(sources.projectDir)\n const projectConfig = await loadJsoncFile<Partial<MetaGovernorPluginConfig>>(projectPath)\n if (projectConfig) {\n merged = deepMerge(merged, projectConfig)\n loadedSources.push(`project:${projectPath}`)\n effectiveSource = \"project\"\n }\n\n // 3. CLI inline options (highest priority)\n if (sources.cliOptions && Object.keys(sources.cliOptions).length > 0) {\n merged = deepMerge(merged, sources.cliOptions)\n loadedSources.push(\"cli:inline\")\n effectiveSource = \"cli\"\n }\n\n return {\n config: merged,\n sources: loadedSources,\n effectiveSource,\n }\n}\n",
6
- "/**\n * graphSync — Auto-initialize codegraph and graphify for a project.\n *\n * On first session in a project, checks whether:\n * - `npx codegraph` is available on PATH (or node_modules)\n * - `graphify` / `graphifyy` is available as a Python package\n *\n * If a tool is available but the project has no index yet, runs the\n * initialization automatically. With `--watch` mode, spawns a background\n * process that re-indexes on file changes.\n *\n * Architecture invariants:\n * - Never blocks the session — init runs async, best-effort\n * - Never throws — all errors are silently caught and logged\n * - Tracks session init once per project via an in-memory Set\n */\n\nimport { execSync, spawn } from \"node:child_process\"\nimport { access, stat } from \"node:fs/promises\"\nimport { resolve } from \"node:path\"\nimport { constants } from \"node:fs\"\n\n// ─── GraphSync config ──────────────────────────────────────────────\n\nexport interface GraphSyncConfig {\n /** Enable auto-initialization. Default: true */\n enabled: boolean\n /** Enable watch mode (re-index on file changes). Default: false */\n watch: boolean\n /** Project directory to initialize in. Default: cwd */\n projectDir?: string\n /**\n * Auto-install missing backends. Default: true.\n * - codegraph: installed via `npm i -D @colbymchenry/codegraph` in the project\n * - graphify: installed via `pip install graphifyy --break-system-packages` (or `uv tool install graphifyy`)\n */\n autoInstall: boolean\n /** Max ms to wait for each install. Default: 60_000 */\n installTimeoutMs: number\n}\n\n// ─── Install codes ────────────────────────────────────────────────\n\nexport type InstallCode =\n | \"codegraph-installed\"\n | \"codegraph-install-failed\"\n | \"codegraph-install-skipped\"\n | \"graphify-installed\"\n | \"graphify-install-failed\"\n | \"graphify-install-skipped\"\n\n/**\n * Install codegraph via `npm i -D @colbymchenry/codegraph`.\n * Best-effort, never throws.\n */\nexport async function installCodegraph(\n projectDir: string,\n timeoutMs: number = 60_000,\n): Promise<InstallCode> {\n try {\n execSync(\"npm i -D @colbymchenry/codegraph\", {\n cwd: projectDir,\n stdio: \"ignore\",\n timeout: timeoutMs,\n })\n return \"codegraph-installed\"\n } catch {\n return \"codegraph-install-failed\"\n }\n}\n\n/**\n * Install graphify via `pip install graphifyy --break-system-packages`.\n * Falls back to `uv tool install graphifyy`.\n * Best-effort, never throws.\n */\nexport async function installGraphify(\n timeoutMs: number = 60_000,\n): Promise<InstallCode> {\n try {\n execSync(\"pip install graphifyy --break-system-packages --quiet\", {\n stdio: \"ignore\",\n timeout: timeoutMs,\n })\n return \"graphify-installed\"\n } catch {\n try {\n execSync(\"uv tool install graphifyy --quiet\", {\n stdio: \"ignore\",\n timeout: timeoutMs,\n })\n return \"graphify-installed\"\n } catch {\n return \"graphify-install-failed\"\n }\n }\n}\n\n// ─── Graph sync state ──────────────────────────────────────────────\n\nconst initializedProjects = new Set<string>()\n\nexport function resetInitializedProjects(): void {\n initializedProjects.clear()\n}\n\n// ─── Session tracking (for watch lifecycle) ────────────────────────\n\nconst sessionCounts = new Map<string, number>()\n\n/**\n * Track a new session for a project. Increments reference count.\n * Returns the new count.\n */\nexport function trackSession(projectDir: string): number {\n const current = sessionCounts.get(projectDir) ?? 0\n const next = current + 1\n sessionCounts.set(projectDir, next)\n return next\n}\n\n/**\n * Untrack a session for a project. Decrements reference count.\n * When count drops to 0, all watch processes for that project\n * are automatically stopped.\n * Returns the remaining count.\n */\nexport function untrackSession(projectDir: string): number {\n const current = sessionCounts.get(projectDir) ?? 0\n const next = Math.max(0, current - 1)\n if (next === 0) {\n sessionCounts.delete(projectDir)\n // Auto-cleanup watches when last session exits\n stopWatches(projectDir)\n } else {\n sessionCounts.set(projectDir, next)\n }\n return next\n}\n\n/** Get active session count for a project. */\nexport function getSessionCount(projectDir: string): number {\n return sessionCounts.get(projectDir) ?? 0\n}\n\n// ─── Tool detection ────────────────────────────────────────────────\n\nexport interface ToolAvailability {\n /** Whether codegraph is available (via npx or node_modules) */\n codegraph: boolean\n /** Whether graphify/graphifyy is available (via pip) */\n graphify: boolean\n /** Whether .codegraph/ directory already exists in the project */\n codegraphIndexExists: boolean\n /** Whether graphify-out/ directory already exists in the project */\n graphifyIndexExists: boolean\n}\n\n/**\n * Check which graph tools are available and whether indexes already exist.\n */\nasync function checkToolAvailability(projectDir: string): Promise<ToolAvailability> {\n let codegraph = false\n let graphify = false\n const codegraphIndexExists = await dirExists(resolve(projectDir, \".codegraph\"))\n const graphifyIndexExists = await dirExists(resolve(projectDir, \"graphify-out\"))\n\n try {\n execSync(\"npx --yes codegraph --version\", {\n stdio: \"ignore\",\n timeout: 10_000,\n })\n codegraph = true\n } catch {\n try {\n execSync(\"node node_modules/.bin/codegraph --version\", {\n cwd: projectDir,\n stdio: \"ignore\",\n timeout: 5_000,\n })\n codegraph = true\n } catch {\n // Not available\n }\n }\n\n try {\n execSync(\"python3 -c 'import graphify; print(graphify.__version__)'\", {\n stdio: \"ignore\",\n timeout: 5_000,\n })\n graphify = true\n } catch {\n try {\n execSync(\"python3 -c 'import graphifyy; print(graphifyy.__version__)'\", {\n stdio: \"ignore\",\n timeout: 5_000,\n })\n graphify = true\n } catch {\n // Not available\n }\n }\n\n return { codegraph, graphify, codegraphIndexExists, graphifyIndexExists }\n}\n\n// ─── Initialization ────────────────────────────────────────────────\n\nasync function initCodegraph(projectDir: string): Promise<void> {\n const codegraphDir = resolve(projectDir, \".codegraph\")\n await ensureDir(codegraphDir)\n\n try {\n execSync(\"npx --yes codegraph init\", {\n cwd: projectDir,\n stdio: \"ignore\",\n timeout: 60_000,\n })\n } catch {\n // Best-effort\n }\n}\n\nasync function initGraphify(projectDir: string): Promise<void> {\n const graphifyOut = resolve(projectDir, \"graphify-out\")\n await ensureDir(graphifyOut)\n\n try {\n execSync(\"python3 -m graphify . --no-viz\", {\n cwd: projectDir,\n stdio: \"ignore\",\n timeout: 120_000,\n })\n } catch {\n try {\n execSync(\"graphifyy . --no-viz\", {\n cwd: projectDir,\n stdio: \"ignore\",\n timeout: 120_000,\n })\n } catch {\n // Best-effort\n }\n }\n}\n\n// ─── Watch mode ────────────────────────────────────────────────────\n\ninterface WatchProcess {\n process: ReturnType<typeof spawn>\n tool: \"codegraph\" | \"graphify\"\n}\n\nconst activeWatchProcesses = new Map<string, WatchProcess>()\n\nfunction startWatch(projectDir: string, tool: \"codegraph\" | \"graphify\"): void {\n const key = `${projectDir}:${tool}`\n if (activeWatchProcesses.has(key)) return\n\n try {\n let child: ReturnType<typeof spawn>\n\n if (tool === \"codegraph\") {\n // codegraph has no built-in watch; use periodic update loop\n child = spawn(\n \"node\",\n [\n \"-e\",\n `\n const {execSync} = require(\"child_process\");\n const run = () => {\n try { execSync(\"npx codegraph update 2>/dev/null\", {cwd: ${JSON.stringify(projectDir)}, stdio: \"ignore\"}); }\n catch(e) { /* best effort */ }\n };\n run();\n setInterval(run, 30_000);\n `,\n ],\n {\n stdio: \"ignore\",\n detached: true,\n },\n )\n } else {\n child = spawn(\"python3\", [\"-m\", \"graphify\", \".\", \"--no-viz\", \"--watch\"], {\n cwd: projectDir,\n stdio: \"ignore\",\n detached: true,\n })\n }\n\n child.unref()\n activeWatchProcesses.set(key, { process: child, tool })\n\n child.on(\"exit\", () => {\n activeWatchProcesses.delete(key)\n })\n } catch {\n // Best-effort\n }\n}\n\n/**\n * Stop all active watch processes for a project.\n */\nexport function stopWatches(projectDir?: string): void {\n for (const [key, wp] of activeWatchProcesses) {\n if (!projectDir || key.startsWith(projectDir)) {\n try {\n wp.process.kill(\"SIGTERM\")\n } catch {\n // Already dead\n }\n setTimeout(() => {\n try { wp.process.kill(\"SIGKILL\") } catch { /* OK */ }\n }, 2_000).unref()\n activeWatchProcesses.delete(key)\n }\n }\n}\n\n/** Check if watches are active for a project. */\nexport function hasActiveWatcher(projectDir: string, tool?: \"codegraph\" | \"graphify\"): boolean {\n for (const key of activeWatchProcesses.keys()) {\n if (key.startsWith(projectDir)) {\n if (!tool || key.endsWith(tool)) return true\n }\n }\n return false\n}\n\n// ─── Main API ──────────────────────────────────────────────────────\n\nexport interface GraphSyncResult {\n /** Whether synchronization was attempted */\n attempted: boolean\n /** Codes that describe the outcome */\n codes: GraphSyncCode[]\n /** Tool availability before init */\n availability: ToolAvailability\n /** Whether this project was already initialized this session */\n alreadyInitialized: boolean\n}\n\nexport type GraphSyncCode =\n | \"codegraph-initialized\"\n | \"codegraph-already-exists\"\n | \"codegraph-unavailable\"\n | \"codegraph-install-failed\"\n | \"codegraph-install-skipped\"\n | \"graphify-initialized\"\n | \"graphify-already-exists\"\n | \"graphify-unavailable\"\n | \"graphify-install-failed\"\n | \"graphify-install-skipped\"\n | \"watch-started-codegraph\"\n | \"watch-started-graphify\"\n | \"disabled\"\n | \"error\"\n | \"graphify-hook-installed\"\n/**\n * Run the graphSync pipeline. Best-effort, never throws.\n */\nexport async function runGraphSync(\n config: GraphSyncConfig = { enabled: true, watch: false, autoInstall: true, installTimeoutMs: 60_000 },\n): Promise<GraphSyncResult> {\n const codes: GraphSyncCode[] = []\n const projectDir = config.projectDir ?? process.cwd()\n\n if (!config.enabled) {\n return {\n attempted: false,\n codes: [\"disabled\"],\n availability: { codegraph: false, graphify: false, codegraphIndexExists: false, graphifyIndexExists: false },\n alreadyInitialized: false,\n }\n }\n\n // Skip if already initialized this session\n if (initializedProjects.has(projectDir)) {\n const avail = await checkToolAvailability(projectDir)\n return {\n attempted: false,\n codes: avail.codegraphIndexExists ? [\"codegraph-already-exists\"] : [],\n availability: avail,\n alreadyInitialized: true,\n }\n }\n\n initializedProjects.add(projectDir)\n\n let availability: ToolAvailability\n try {\n availability = await checkToolAvailability(projectDir)\n } catch {\n return {\n attempted: false,\n codes: [\"error\"],\n availability: { codegraph: false, graphify: false, codegraphIndexExists: false, graphifyIndexExists: false },\n alreadyInitialized: false,\n }\n }\n\n // Auto-install missing backends\n if (config.autoInstall !== false) {\n if (!availability.codegraph) {\n const result = await installCodegraph(projectDir, config.installTimeoutMs ?? 60_000)\n codes.push(result as GraphSyncCode)\n if (result === \"codegraph-installed\") {\n availability.codegraph = true\n }\n }\n if (!availability.graphify) {\n const result = await installGraphify(config.installTimeoutMs ?? 60_000)\n codes.push(result as GraphSyncCode)\n if (result === \"graphify-installed\") {\n availability.graphify = true\n }\n }\n } else {\n if (!availability.codegraph) codes.push(\"codegraph-install-skipped\")\n if (!availability.graphify) codes.push(\"graphify-install-skipped\")\n }\n\n // Codegraph init\n if (availability.codegraph) {\n if (!availability.codegraphIndexExists) {\n try {\n await initCodegraph(projectDir)\n codes.push(\"codegraph-initialized\")\n } catch {\n codes.push(\"error\")\n }\n } else {\n codes.push(\"codegraph-already-exists\")\n }\n } else {\n codes.push(\"codegraph-unavailable\")\n }\n\n // Graphify init\n if (availability.graphify) {\n if (!availability.graphifyIndexExists) {\n try {\n await initGraphify(projectDir)\n codes.push(\"graphify-initialized\")\n } catch {\n codes.push(\"error\")\n }\n } else {\n codes.push(\"graphify-already-exists\")\n }\n\n // v0.11.0: auto-install the graphify git hook so commits auto-rebuild\n // the graph. Native hook is more reliable than our own polling.\n try {\n const alreadyInstalled = await isGraphifyHookInstalled(projectDir)\n if (!alreadyInstalled) {\n execSync(\"graphify hook install\", {\n cwd: projectDir,\n stdio: \"ignore\",\n timeout: 10_000,\n })\n codes.push(\"graphify-hook-installed\")\n }\n } catch {\n // best-effort\n }\n } else {\n codes.push(\"graphify-unavailable\")\n }\n\n // Watch mode\n if (config.watch) {\n if (availability.codegraph) {\n startWatch(projectDir, \"codegraph\")\n codes.push(\"watch-started-codegraph\")\n }\n if (availability.graphify) {\n startWatch(projectDir, \"graphify\")\n codes.push(\"watch-started-graphify\")\n }\n }\n\n return {\n attempted: true,\n codes,\n availability,\n alreadyInitialized: false,\n }\n}\n\n// ─── Helpers ───────────────────────────────────────────────────────\n\nasync function dirExists(dirPath: string): Promise<boolean> {\n try {\n const st = await stat(dirPath)\n return st.isDirectory()\n } catch {\n return false\n }\n}\n\nasync function ensureDir(dirPath: string): Promise<void> {\n try {\n await access(dirPath, constants.F_OK)\n } catch {\n const { mkdir } = await import(\"node:fs/promises\")\n await mkdir(dirPath, { recursive: true })\n }\n}\n\n// ─── v0.11.0: commit-triggered reindex ──────────────────────────\n\n/**\n * Detect whether a shell command string contains `git commit`.\n * Robust to leading whitespace, multi-line scripts, and command chains.\n *\n * The check is intentionally narrow: we only trigger reindex on a real\n * commit (not `git status`, `git log`, etc.) because those don't change\n * the source tree.\n */\nexport function isGitCommitCommand(command: string | undefined | null): boolean {\n if (typeof command !== \"string\" || command.length === 0) return false\n // Normalize: strip leading whitespace, collapse newlines\n const normalized = command.replace(/\\\\\\n/g, \" \").replace(/\\s*\\n\\s*/g, \" \")\n // Look for `git commit` as a token, but exclude `git commit-tree` and similar\n // We match the verb \"commit\" immediately after \"git \".\n return /(?:^|[\\s;&|])git\\s+commit(?:\\s+-|\\s|$)/.test(normalized)\n}\n\n/**\n * Trigger a one-shot reindex of both codegraph and graphify for the given\n * project directory. Used by the plugin when a `git commit` completes —\n * the source tree just changed and the graph indexes are now stale.\n *\n * Best-effort: never throws, returns a structured result instead.\n */\nexport async function triggerReindex(projectDir: string): Promise<GraphSyncResult> {\n return await runGraphSync({\n enabled: true,\n watch: false,\n autoInstall: false,\n installTimeoutMs: 5_000,\n projectDir,\n })\n}\n\n// ─── v0.11.0: native hook integration ──────────────────────────\n\n/**\n * v0.11.0: Check whether the project's `.git/hooks/post-commit` is the\n * graphify-managed one. Reads the file and looks for the `graphify-hook-start`\n * marker that `graphify hook install` writes.\n *\n * Returns false when the directory has no `.git/` (not a git repo) or when\n * the post-commit hook is missing or wasn't installed by graphify.\n */\nexport async function isGraphifyHookInstalled(projectDir: string): Promise<boolean> {\n const { access, readFile } = await import(\"node:fs/promises\")\n const { resolve } = await import(\"node:path\")\n const hookPath = resolve(projectDir, \".git\", \"hooks\", \"post-commit\")\n try {\n await access(hookPath)\n } catch {\n return false\n }\n try {\n const content = await readFile(hookPath, \"utf-8\")\n return content.includes(\"graphify-hook-start\")\n } catch {\n return false\n }\n}\n\n/**\n * v0.11.0: Trigger a one-shot codegraph reindex using the native\n * `codegraph sync -q [path]` command. This is the git-hook-friendly form\n * (quiet, reindexes only changes since last index). Falls back to\n * `codegraph update` if sync is unavailable, then to the full pipeline.\n *\n * Best-effort: never throws, returns a structured result.\n */\nexport async function triggerCodegraphSync(projectDir: string): Promise<GraphSyncResult> {\n const { execSync } = await import(\"node:child_process\")\n const { access } = await import(\"node:fs/promises\")\n const { resolve } = await import(\"node:path\")\n const codes: GraphSyncCode[] = []\n const codegraphIndexExists = await dirExists(resolve(projectDir, \".codegraph\"))\n\n let codegraphAvailable = false\n try {\n execSync(\"npx --yes codegraph --version\", { stdio: \"ignore\", timeout: 5_000 })\n codegraphAvailable = true\n } catch {\n try {\n execSync(\"node node_modules/.bin/codegraph --version\", {\n cwd: projectDir,\n stdio: \"ignore\",\n timeout: 5_000,\n })\n codegraphAvailable = true\n } catch { /* not available */ }\n }\n\n if (!codegraphAvailable) {\n return {\n attempted: true,\n codes: [\"codegraph-unavailable\"],\n availability: { codegraph: false, graphify: false, codegraphIndexExists, graphifyIndexExists: await dirExists(resolve(projectDir, \"graphify-out\")) },\n alreadyInitialized: false,\n }\n }\n\n if (!codegraphIndexExists) {\n // No prior index — call runGraphSync to do the full init\n return await runGraphSync({\n enabled: true,\n watch: false,\n autoInstall: false,\n installTimeoutMs: 5_000,\n projectDir,\n })\n }\n\n // We have an index — run `codegraph sync -q <projectDir>` in the background\n // so we don't block the tool.execute.after hook\n try {\n const child = execSync(\"npx --yes codegraph sync -q\", {\n cwd: projectDir,\n stdio: \"ignore\",\n timeout: 30_000,\n })\n void child\n codes.push(\"codegraph-already-exists\") // re-uses existing code\n logToFile?.(\"info\", `codegraph sync -q completed for ${projectDir}`)\n } catch (err) {\n logToFile?.(\"warn\", `codegraph sync failed for ${projectDir}: ${err}`)\n codes.push(\"codegraph-install-failed\") // re-uses existing code\n }\n\n return {\n attempted: true,\n codes,\n availability: {\n codegraph: true,\n graphify: false,\n codegraphIndexExists,\n graphifyIndexExists: await dirExists(resolve(projectDir, \"graphify-out\")),\n },\n alreadyInitialized: false,\n }\n}\n\n// Helper: lazy import to avoid bundling fs-logger into graph-sync.ts\nfunction logToFile(_level: \"info\" | \"warn\" | \"error\", _msg: string): void {\n // Imported lazily at call sites to keep graph-sync self-contained\n}\n\n// ─── v0.12.0: auto-upgrade helpers ─────────────────────────────\n\n/**\n * Compare two semver strings. Returns true if `latest` is strictly greater\n * than `installed`. Handles X.Y.Z with optional pre-release suffix (-rc.1,\n * -beta.2). Pre-release is considered LOWER than the same X.Y.Z without it.\n *\n * Defensive: returns false on malformed input (unknown version, empty\n * string, etc.) so callers can default to \"don't upgrade\" instead of\n * triggering a network call.\n */\nexport function isNewerVersion(installed: string | null | undefined, latest: string | null | undefined): boolean {\nif (!installed || !latest) return false\n if (installed === latest) return false\n // Defensive: reject non-semver strings instead of treating them as 0.0.0\n const SEMVER_RE = /^[0-9]+\\.[0-9]+\\.[0-9]+(-[0-9A-Za-z.-]+)?$/\n if (!SEMVER_RE.test(installed) || !SEMVER_RE.test(latest)) return false\n // Strip pre-release suffix for base comparison\n const parseBase = (v: string): [number, number, number, string] => {\n const [base = \"\", pre = \"\"] = v.split(\"-\", 2)\n const parts = base.split(\".\").map((n) => {\n const num = Number.parseInt(n, 10)\n return Number.isFinite(num) ? num : 0\n })\n const [maj = 0, min = 0, pat = 0] = parts\n return [maj, min, pat, pre]\n }\n const [iMaj, iMin, iPat, iPre] = parseBase(installed)\n const [lMaj, lMin, lPat, lPre] = parseBase(latest)\n if (lMaj !== iMaj) return lMaj > iMaj\n if (lMin !== iMin) return lMin > iMin\n if (lPat !== iPat) return lPat > iPat\n // Same base — pre-release ordering: no pre > with pre\n if (iPre && !lPre) return true\n if (!iPre && lPre) return false\n return lPre > iPre\n}\n\n/**\n * v0.12.0: persisted cache of latest-version lookups so we don't\n * hammer npm/pip registries on every plugin load.\n *\n * File path defaults to ~/.config/opencode/omo-meta-governor-upgrade-check.json\n */\nexport interface UpgradeCache {\n checkedAtMs: number\n codegraphLatest?: string\n graphifyLatest?: string\n}\n\nexport function getDefaultUpgradeCachePath(): string {\n const { resolve } = require(\"node:path\")\n const { homedir } = require(\"node:os\")\n return resolve(homedir(), \".config\", \"opencode\", \"omo-meta-governor-upgrade-check.json\")\n}\n\nexport async function readUpgradeCache(path: string): Promise<UpgradeCache | null> {\n try {\n const { readFile } = await import(\"node:fs/promises\")\nconst content = await readFile(path, \"utf-8\")\nconst parsed = JSON.parse(content)\nif (typeof parsed?.checkedAtMs === \"number\") {\nreturn parsed as UpgradeCache\n}\nreturn null\n} catch {\nreturn null\n}\n}\n\nexport async function writeUpgradeCache(path: string, payload: UpgradeCache): Promise<void> {\n const { dirname } = await import(\"node:path\")\n const { mkdir, writeFile } = await import(\"node:fs/promises\")\n const dir = dirname(path)\n try {\n await mkdir(dir, { recursive: true })\n await writeFile(path, JSON.stringify(payload, null, 2))\n } catch {\n // best-effort — cache write failures must NEVER break the plugin\n }\n}\n\n/** Returns true if cache exists AND its `checkedAtMs` is within ttlMs of now. */\nexport function isCacheFresh(cache: UpgradeCache | null, ttlMs: number): boolean {\n if (!cache) return false\n const ageMs = Date.now() - cache.checkedAtMs\n return ageMs >= 0 && ageMs < ttlMs\n}\n\n/**\n * v0.12.0: decide whether to upgrade. Pure function over (installed,\n * latest, cache, ttl). Used by runGraphSync before calling out to the\n * registry. Centralizes the upgrade-decision policy.\n *\n * - If cache is fresh AND cache has a known latest version, use cached\n * latest instead of trusting `latest` (which may be stale). This is\n * how we avoid hammering npm/pip registries.\n * - If both installed and effective-latest are unknown → false.\n * - If installed >= effective-latest → false.\n * - Otherwise → true.\n */\nexport function shouldUpgrade(\n installed: string | null | undefined,\n registryLatest: string | null | undefined,\n cache: UpgradeCache | null,\n ttlMs: number,\n): boolean {\n // Determine the \"effective\" latest version to compare against.\n // If cache is fresh and has a value, prefer it (avoids extra registry calls).\n let effectiveLatest = registryLatest\n if (isCacheFresh(cache, ttlMs)) {\n effectiveLatest = cache?.codegraphLatest ?? effectiveLatest\n }\n if (!installed && !effectiveLatest) return false\n if (!effectiveLatest) return false\n if (!installed) return true\n return isNewerVersion(installed, effectiveLatest)\n}\n\n/**\n * v0.12.0: fetch the latest version of codegraph from npm registry.\n * Returns null on failure (best-effort, never throws).\n */\nexport async function fetchCodegraphLatestVersion(): Promise<string | null> {\n const { execSync } = await import(\"node:child_process\")\n try {\n const out = execSync(\"npm view @colbymchenry/codegraph version\", {\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n timeout: 10_000,\n })\n const v = out.toString().trim()\n return v.length > 0 ? v : null\n } catch {\n return null\n }\n}\n\n/**\n * v0.12.0: fetch the latest version of graphify from pip.\n * Returns null on failure (best-effort, never throws).\n */\nexport async function fetchGraphifyLatestVersion(): Promise<string | null> {\n const { execSync } = await import(\"node:child_process\")\n // Try `pip index versions graphifyy` first, then `pip install graphifyy== 2>&1 | head`\n try {\n const out = execSync(\"python3 -m pip index versions graphifyy\", {\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n timeout: 10_000,\n })\n // Output looks like \"graphifyy (1.2.3)\\nAvailable versions: ...\"\n // Parse the first version.\n const first = out.toString().split(\"\\n\")[0] ?? \"\"\n const m = first.match(/graphifyy\\s*\\(?([0-9]+\\.[0-9]+\\.[0-9]+[^\\s)]*)/)\n if (m) return m[1]!\n } catch { /* fall through */ }\n try {\n // Fallback: query PyPI directly via pip search-equivalent\n const out = execSync(\n \"python3 -c \\\"import urllib.request, json; d=json.load(urllib.request.urlopen('https://pypi.org/pypi/graphifyy/json')); print(d['info']['version'])\\\"\",\n { stdio: [\"ignore\", \"pipe\", \"ignore\"], timeout: 10_000 },\n )\n const v = out.toString().trim()\n return v.length > 0 ? v : null\n } catch {\n return null\n }\n}\n\n/**\n * v0.12.0: get the installed version of codegraph by running its CLI.\n * Returns null on failure.\n */\nexport async function getInstalledCodegraphVersion(): Promise<string | null> {\n const { execSync } = await import(\"node:child_process\")\n try {\n const out = execSync(\"npx --yes codegraph --version\", {\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n timeout: 10_000,\n })\n const v = out.toString().trim()\n return v.length > 0 ? v : null\n } catch {\n return null\n }\n}\n\n/**\n * v0.12.0: get the installed version of graphify via pip show.\n * Returns null on failure.\n */\nexport async function getInstalledGraphifyVersion(): Promise<string | null> {\n const { execSync } = await import(\"node:child_process\")\n try {\n const out = execSync(\"python3 -m pip show graphifyy\", {\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n timeout: 10_000,\n })\n const m = out.toString().match(/Version:\\s*([0-9]+\\.[0-9]+\\.[0-9]+[^\\s]*)/)\n if (m) return m[1]!\n } catch { /* fall through */ }\n try {\n const out = execSync(\"python3 -m pip show graphify\", {\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n timeout: 10_000,\n })\n const m = out.toString().match(/Version:\\s*([0-9]+\\.[0-9]+\\.[0-9]+[^\\s]*)/)\n if (m) return m[1]!\n } catch {\n return null\n }\n return null\n}\n",
6
+ "/**\n * graphSync — Auto-initialize codegraph and graphify for a project.\n *\n * On first session in a project, checks whether:\n * - `npx codegraph` is available on PATH (or node_modules)\n * - `graphify` / `graphifyy` is available as a Python package\n *\n * If a tool is available but the project has no index yet, runs the\n * initialization automatically. With `--watch` mode, spawns a background\n * process that re-indexes on file changes.\n *\n * Architecture invariants:\n * - Never blocks the session — init runs async, best-effort\n * - Never throws — all errors are silently caught and logged\n * - Tracks session init once per project via an in-memory Set\n */\n\nimport { execSync, spawn } from \"node:child_process\"\nimport { access, stat } from \"node:fs/promises\"\nimport { resolve } from \"node:path\"\nimport { constants } from \"node:fs\"\n\n// ─── GraphSync config ──────────────────────────────────────────────\n\nexport interface GraphSyncConfig {\n/** Enable auto-initialization. Default: true */\nenabled: boolean\n/** Enable watch mode (re-index on file changes). Default: false */\nwatch: boolean\n/** Project directory to initialize in. Default: cwd */\nprojectDir?: string\n/**\n* Auto-install missing backends. Default: true.\n* - codegraph: installed via `npm i -D @colbymchenry/codegraph` in the project\n* - graphify: installed via `pip install graphifyy --break-system-packages` (or `uv tool install graphifyy`)\n*/\nautoInstall: boolean\n/** Max ms to wait for each install. Default: 60_000 */\n installTimeoutMs: number\n /** v0.12.0: Auto-upgrade codegraph/graphify when new versions are published.\n * On plugin load, queries npm/pip registries and upgrades if newer version\n * exists. Respects upgradeCheckTtlMs to avoid hammering registries. */\n autoUpgrade?: boolean\n /** v0.12.0: Min ms between registry queries for version check. Default 24h. */\n upgradeCheckTtlMs?: number\n}\n\n\n// ─── Install codes ────────────────────────────────────────────────\n\nexport type InstallCode =\n | \"codegraph-installed\"\n | \"codegraph-install-failed\"\n | \"codegraph-install-skipped\"\n | \"graphify-installed\"\n | \"graphify-install-failed\"\n | \"graphify-install-skipped\"\n\n/**\n * Install codegraph via `npm i -D @colbymchenry/codegraph`.\n * Best-effort, never throws.\n */\nexport async function installCodegraph(\n projectDir: string,\n timeoutMs: number = 60_000,\n): Promise<InstallCode> {\n try {\n execSync(\"npm i -D @colbymchenry/codegraph\", {\n cwd: projectDir,\n stdio: \"ignore\",\n timeout: timeoutMs,\n })\n return \"codegraph-installed\"\n } catch {\n return \"codegraph-install-failed\"\n }\n}\n\n/**\n * Install graphify via `pip install graphifyy --break-system-packages`.\n * Falls back to `uv tool install graphifyy`.\n * Best-effort, never throws.\n */\nexport async function installGraphify(\n timeoutMs: number = 60_000,\n): Promise<InstallCode> {\n try {\n execSync(\"pip install graphifyy --break-system-packages --quiet\", {\n stdio: \"ignore\",\n timeout: timeoutMs,\n })\n return \"graphify-installed\"\n } catch {\n try {\n execSync(\"uv tool install graphifyy --quiet\", {\n stdio: \"ignore\",\n timeout: timeoutMs,\n })\n return \"graphify-installed\"\n } catch {\n return \"graphify-install-failed\"\n }\n }\n}\n\n// ─── Graph sync state ──────────────────────────────────────────────\n\nconst initializedProjects = new Set<string>()\n\nexport function resetInitializedProjects(): void {\n initializedProjects.clear()\n}\n\n// ─── Session tracking (for watch lifecycle) ────────────────────────\n\nconst sessionCounts = new Map<string, number>()\n\n/**\n * Track a new session for a project. Increments reference count.\n * Returns the new count.\n */\nexport function trackSession(projectDir: string): number {\n const current = sessionCounts.get(projectDir) ?? 0\n const next = current + 1\n sessionCounts.set(projectDir, next)\n return next\n}\n\n/**\n * Untrack a session for a project. Decrements reference count.\n * When count drops to 0, all watch processes for that project\n * are automatically stopped.\n * Returns the remaining count.\n */\nexport function untrackSession(projectDir: string): number {\n const current = sessionCounts.get(projectDir) ?? 0\n const next = Math.max(0, current - 1)\n if (next === 0) {\n sessionCounts.delete(projectDir)\n // Auto-cleanup watches when last session exits\n stopWatches(projectDir)\n } else {\n sessionCounts.set(projectDir, next)\n }\n return next\n}\n\n/** Get active session count for a project. */\nexport function getSessionCount(projectDir: string): number {\n return sessionCounts.get(projectDir) ?? 0\n}\n\n// ─── Tool detection ────────────────────────────────────────────────\n\nexport interface ToolAvailability {\n /** Whether codegraph is available (via npx or node_modules) */\n codegraph: boolean\n /** Whether graphify/graphifyy is available (via pip) */\n graphify: boolean\n /** Whether .codegraph/ directory already exists in the project */\n codegraphIndexExists: boolean\n /** Whether graphify-out/ directory already exists in the project */\n graphifyIndexExists: boolean\n}\n\n/**\n * Check which graph tools are available and whether indexes already exist.\n */\nasync function checkToolAvailability(projectDir: string): Promise<ToolAvailability> {\n let codegraph = false\n let graphify = false\n const codegraphIndexExists = await dirExists(resolve(projectDir, \".codegraph\"))\n const graphifyIndexExists = await dirExists(resolve(projectDir, \"graphify-out\"))\n\n try {\n execSync(\"npx --yes codegraph --version\", {\n stdio: \"ignore\",\n timeout: 10_000,\n })\n codegraph = true\n } catch {\n try {\n execSync(\"node node_modules/.bin/codegraph --version\", {\n cwd: projectDir,\n stdio: \"ignore\",\n timeout: 5_000,\n })\n codegraph = true\n } catch {\n // Not available\n }\n }\n\n try {\n execSync(\"python3 -c 'import graphify; print(graphify.__version__)'\", {\n stdio: \"ignore\",\n timeout: 5_000,\n })\n graphify = true\n } catch {\n try {\n execSync(\"python3 -c 'import graphifyy; print(graphifyy.__version__)'\", {\n stdio: \"ignore\",\n timeout: 5_000,\n })\n graphify = true\n } catch {\n // Not available\n }\n }\n\n return { codegraph, graphify, codegraphIndexExists, graphifyIndexExists }\n}\n\n// ─── Initialization ────────────────────────────────────────────────\n\nasync function initCodegraph(projectDir: string): Promise<void> {\n const codegraphDir = resolve(projectDir, \".codegraph\")\n await ensureDir(codegraphDir)\n\n try {\n execSync(\"npx --yes codegraph init\", {\n cwd: projectDir,\n stdio: \"ignore\",\n timeout: 60_000,\n })\n } catch {\n // Best-effort\n }\n}\n\nasync function initGraphify(projectDir: string): Promise<void> {\n const graphifyOut = resolve(projectDir, \"graphify-out\")\n await ensureDir(graphifyOut)\n\n try {\n execSync(\"python3 -m graphify . --no-viz\", {\n cwd: projectDir,\n stdio: \"ignore\",\n timeout: 120_000,\n })\n } catch {\n try {\n execSync(\"graphifyy . --no-viz\", {\n cwd: projectDir,\n stdio: \"ignore\",\n timeout: 120_000,\n })\n } catch {\n // Best-effort\n }\n }\n}\n\n// ─── Watch mode ────────────────────────────────────────────────────\n\ninterface WatchProcess {\n process: ReturnType<typeof spawn>\n tool: \"codegraph\" | \"graphify\"\n}\n\nconst activeWatchProcesses = new Map<string, WatchProcess>()\n\nfunction startWatch(projectDir: string, tool: \"codegraph\" | \"graphify\"): void {\n const key = `${projectDir}:${tool}`\n if (activeWatchProcesses.has(key)) return\n\n try {\n let child: ReturnType<typeof spawn>\n\n if (tool === \"codegraph\") {\n // codegraph has no built-in watch; use periodic update loop\n child = spawn(\n \"node\",\n [\n \"-e\",\n `\n const {execSync} = require(\"child_process\");\n const run = () => {\n try { execSync(\"npx codegraph update 2>/dev/null\", {cwd: ${JSON.stringify(projectDir)}, stdio: \"ignore\"}); }\n catch(e) { /* best effort */ }\n };\n run();\n setInterval(run, 30_000);\n `,\n ],\n {\n stdio: \"ignore\",\n detached: true,\n },\n )\n } else {\n child = spawn(\"python3\", [\"-m\", \"graphify\", \".\", \"--no-viz\", \"--watch\"], {\n cwd: projectDir,\n stdio: \"ignore\",\n detached: true,\n })\n }\n\n child.unref()\n activeWatchProcesses.set(key, { process: child, tool })\n\n child.on(\"exit\", () => {\n activeWatchProcesses.delete(key)\n })\n } catch {\n // Best-effort\n }\n}\n\n/**\n * Stop all active watch processes for a project.\n */\nexport function stopWatches(projectDir?: string): void {\n for (const [key, wp] of activeWatchProcesses) {\n if (!projectDir || key.startsWith(projectDir)) {\n try {\n wp.process.kill(\"SIGTERM\")\n } catch {\n // Already dead\n }\n setTimeout(() => {\n try { wp.process.kill(\"SIGKILL\") } catch { /* OK */ }\n }, 2_000).unref()\n activeWatchProcesses.delete(key)\n }\n }\n}\n\n/** Check if watches are active for a project. */\nexport function hasActiveWatcher(projectDir: string, tool?: \"codegraph\" | \"graphify\"): boolean {\n for (const key of activeWatchProcesses.keys()) {\n if (key.startsWith(projectDir)) {\n if (!tool || key.endsWith(tool)) return true\n }\n }\n return false\n}\n\n// ─── Main API ──────────────────────────────────────────────────────\n\nexport interface GraphSyncResult {\n /** Whether synchronization was attempted */\n attempted: boolean\n /** Codes that describe the outcome */\n codes: GraphSyncCode[]\n /** Tool availability before init */\n availability: ToolAvailability\n /** Whether this project was already initialized this session */\n alreadyInitialized: boolean\n}\n\nexport type GraphSyncCode =\n | \"codegraph-initialized\"\n | \"codegraph-already-exists\"\n | \"codegraph-unavailable\"\n | \"codegraph-install-failed\"\n | \"codegraph-install-skipped\"\n | \"graphify-initialized\"\n | \"graphify-already-exists\"\n | \"graphify-unavailable\"\n | \"graphify-install-failed\"\n | \"graphify-install-skipped\"\n | \"watch-started-codegraph\"\n | \"watch-started-graphify\"\n | \"disabled\"\n | \"error\"\n | \"graphify-hook-installed\"\n | \"codegraph-upgraded\"\n | \"graphify-upgraded\"\n | \"upgrade-check-skipped\"\n\n/**\n* Run the graphSync pipeline. Best-effort, never throws.\n*/\nexport async function runGraphSync(\n config: GraphSyncConfig = { enabled: true, watch: false, autoInstall: true, installTimeoutMs: 60_000 },\n): Promise<GraphSyncResult> {\n const codes: GraphSyncCode[] = []\n const projectDir = config.projectDir ?? process.cwd()\n\n if (!config.enabled) {\n return {\n attempted: false,\n codes: [\"disabled\"],\n availability: { codegraph: false, graphify: false, codegraphIndexExists: false, graphifyIndexExists: false },\n alreadyInitialized: false,\n }\n }\n\n // Skip if already initialized this session\n if (initializedProjects.has(projectDir)) {\n const avail = await checkToolAvailability(projectDir)\n return {\n attempted: false,\n codes: avail.codegraphIndexExists ? [\"codegraph-already-exists\"] : [],\n availability: avail,\n alreadyInitialized: true,\n }\n }\n\n initializedProjects.add(projectDir)\n\n let availability: ToolAvailability\n try {\n availability = await checkToolAvailability(projectDir)\n } catch {\n return {\n attempted: false,\n codes: [\"error\"],\n availability: { codegraph: false, graphify: false, codegraphIndexExists: false, graphifyIndexExists: false },\n alreadyInitialized: false,\n }\n }\n\n // v0.12.0: auto-upgrade check — query registries if cache is stale\n if (config.autoUpgrade !== false) {\n try {\n const cachePath = getDefaultUpgradeCachePath()\n const cache = await readUpgradeCache(cachePath)\n const ttlMs = config.upgradeCheckTtlMs ?? 24 * 60 * 60 * 1000\n\n if (availability.codegraph) {\n const installed = await getInstalledCodegraphVersion()\n if (shouldUpgrade(installed, null, cache, ttlMs)) {\n const latest = await fetchCodegraphLatestVersion()\n if (latest && isNewerVersion(installed, latest)) {\n const up = await installCodegraph(projectDir, config.installTimeoutMs ?? 60_000)\n if (up === \"codegraph-installed\") codes.push(\"codegraph-upgraded\")\n }\n }\n }\n\n if (availability.graphify) {\n const installed = await getInstalledGraphifyVersion()\n if (shouldUpgrade(installed, null, cache, ttlMs)) {\n const latest = await fetchGraphifyLatestVersion()\n if (latest && isNewerVersion(installed, latest)) {\n const up = await installGraphify(config.installTimeoutMs ?? 60_000)\n if (up === \"graphify-installed\") codes.push(\"graphify-upgraded\")\n }\n }\n }\n\n // Persist cache after all registry lookups and upgrades\n const nowMs = Date.now()\n try {\n const cgLatest = await fetchCodegraphLatestVersion()\n const gfLatest = await fetchGraphifyLatestVersion()\n await writeUpgradeCache(cachePath, {\n checkedAtMs: nowMs,\n codegraphLatest: cgLatest ?? undefined,\n graphifyLatest: gfLatest ?? undefined,\n })\n } catch {\n // cache write is best-effort\n }\n } catch {\n codes.push(\"upgrade-check-skipped\")\n }\n }\n\n // Auto-install missing backends\n if (config.autoInstall !== false) {\n if (!availability.codegraph) {\n const result = await installCodegraph(projectDir, config.installTimeoutMs ?? 60_000)\n codes.push(result as GraphSyncCode)\n if (result === \"codegraph-installed\") {\n availability.codegraph = true\n }\n }\n if (!availability.graphify) {\n const result = await installGraphify(config.installTimeoutMs ?? 60_000)\n codes.push(result as GraphSyncCode)\n if (result === \"graphify-installed\") {\n availability.graphify = true\n }\n }\n } else {\n if (!availability.codegraph) codes.push(\"codegraph-install-skipped\")\n if (!availability.graphify) codes.push(\"graphify-install-skipped\")\n }\n\n // Codegraph init\n if (availability.codegraph) {\n if (!availability.codegraphIndexExists) {\n try {\n await initCodegraph(projectDir)\n codes.push(\"codegraph-initialized\")\n } catch {\n codes.push(\"error\")\n }\n } else {\n codes.push(\"codegraph-already-exists\")\n }\n } else {\n codes.push(\"codegraph-unavailable\")\n }\n\n // Graphify init\n if (availability.graphify) {\n if (!availability.graphifyIndexExists) {\n try {\n await initGraphify(projectDir)\n codes.push(\"graphify-initialized\")\n } catch {\n codes.push(\"error\")\n }\n } else {\n codes.push(\"graphify-already-exists\")\n }\n\n // v0.11.0: auto-install the graphify git hook so commits auto-rebuild\n // the graph. Native hook is more reliable than our own polling.\n try {\n const alreadyInstalled = await isGraphifyHookInstalled(projectDir)\n if (!alreadyInstalled) {\n execSync(\"graphify hook install\", {\n cwd: projectDir,\n stdio: \"ignore\",\n timeout: 10_000,\n })\n codes.push(\"graphify-hook-installed\")\n }\n } catch {\n // best-effort\n }\n } else {\n codes.push(\"graphify-unavailable\")\n }\n\n // Watch mode\n if (config.watch) {\n if (availability.codegraph) {\n startWatch(projectDir, \"codegraph\")\n codes.push(\"watch-started-codegraph\")\n }\n if (availability.graphify) {\n startWatch(projectDir, \"graphify\")\n codes.push(\"watch-started-graphify\")\n }\n }\n\n return {\n attempted: true,\n codes,\n availability,\n alreadyInitialized: false,\n }\n}\n\n// ─── Helpers ───────────────────────────────────────────────────────\n\nasync function dirExists(dirPath: string): Promise<boolean> {\n try {\n const st = await stat(dirPath)\n return st.isDirectory()\n } catch {\n return false\n }\n}\n\nasync function ensureDir(dirPath: string): Promise<void> {\n try {\n await access(dirPath, constants.F_OK)\n } catch {\n const { mkdir } = await import(\"node:fs/promises\")\n await mkdir(dirPath, { recursive: true })\n }\n}\n\n// ─── v0.11.0: commit-triggered reindex ──────────────────────────\n\n/**\n * Detect whether a shell command string contains `git commit`.\n * Robust to leading whitespace, multi-line scripts, and command chains.\n *\n * The check is intentionally narrow: we only trigger reindex on a real\n * commit (not `git status`, `git log`, etc.) because those don't change\n * the source tree.\n */\nexport function isGitCommitCommand(command: string | undefined | null): boolean {\n if (typeof command !== \"string\" || command.length === 0) return false\n // Normalize: strip leading whitespace, collapse newlines\n const normalized = command.replace(/\\\\\\n/g, \" \").replace(/\\s*\\n\\s*/g, \" \")\n // Look for `git commit` as a token, but exclude `git commit-tree` and similar\n // We match the verb \"commit\" immediately after \"git \".\n return /(?:^|[\\s;&|])git\\s+commit(?:\\s+-|\\s|$)/.test(normalized)\n}\n\n/**\n * Trigger a one-shot reindex of both codegraph and graphify for the given\n * project directory. Used by the plugin when a `git commit` completes —\n * the source tree just changed and the graph indexes are now stale.\n *\n * Best-effort: never throws, returns a structured result instead.\n */\nexport async function triggerReindex(projectDir: string): Promise<GraphSyncResult> {\n return await runGraphSync({\n enabled: true,\n watch: false,\n autoInstall: false,\n installTimeoutMs: 5_000,\n projectDir,\n })\n}\n\n// ─── v0.11.0: native hook integration ──────────────────────────\n\n/**\n * v0.11.0: Check whether the project's `.git/hooks/post-commit` is the\n * graphify-managed one. Reads the file and looks for the `graphify-hook-start`\n * marker that `graphify hook install` writes.\n *\n * Returns false when the directory has no `.git/` (not a git repo) or when\n * the post-commit hook is missing or wasn't installed by graphify.\n */\nexport async function isGraphifyHookInstalled(projectDir: string): Promise<boolean> {\n const { access, readFile } = await import(\"node:fs/promises\")\n const { resolve } = await import(\"node:path\")\n const hookPath = resolve(projectDir, \".git\", \"hooks\", \"post-commit\")\n try {\n await access(hookPath)\n } catch {\n return false\n }\n try {\n const content = await readFile(hookPath, \"utf-8\")\n return content.includes(\"graphify-hook-start\")\n } catch {\n return false\n }\n}\n\n/**\n * v0.11.0: Trigger a one-shot codegraph reindex using the native\n * `codegraph sync -q [path]` command. This is the git-hook-friendly form\n * (quiet, reindexes only changes since last index). Falls back to\n * `codegraph update` if sync is unavailable, then to the full pipeline.\n *\n * Best-effort: never throws, returns a structured result.\n */\nexport async function triggerCodegraphSync(projectDir: string): Promise<GraphSyncResult> {\n const { execSync } = await import(\"node:child_process\")\n const { access } = await import(\"node:fs/promises\")\n const { resolve } = await import(\"node:path\")\n const codes: GraphSyncCode[] = []\n const codegraphIndexExists = await dirExists(resolve(projectDir, \".codegraph\"))\n\n let codegraphAvailable = false\n try {\n execSync(\"npx --yes codegraph --version\", { stdio: \"ignore\", timeout: 5_000 })\n codegraphAvailable = true\n } catch {\n try {\n execSync(\"node node_modules/.bin/codegraph --version\", {\n cwd: projectDir,\n stdio: \"ignore\",\n timeout: 5_000,\n })\n codegraphAvailable = true\n } catch { /* not available */ }\n }\n\n if (!codegraphAvailable) {\n return {\n attempted: true,\n codes: [\"codegraph-unavailable\"],\n availability: { codegraph: false, graphify: false, codegraphIndexExists, graphifyIndexExists: await dirExists(resolve(projectDir, \"graphify-out\")) },\n alreadyInitialized: false,\n }\n }\n\n if (!codegraphIndexExists) {\n // No prior index — call runGraphSync to do the full init\n return await runGraphSync({\n enabled: true,\n watch: false,\n autoInstall: false,\n installTimeoutMs: 5_000,\n projectDir,\n })\n }\n\n // We have an index — run `codegraph sync -q <projectDir>` in the background\n // so we don't block the tool.execute.after hook\n try {\n const child = execSync(\"npx --yes codegraph sync -q\", {\n cwd: projectDir,\n stdio: \"ignore\",\n timeout: 30_000,\n })\n void child\n codes.push(\"codegraph-already-exists\") // re-uses existing code\n logToFile?.(\"info\", `codegraph sync -q completed for ${projectDir}`)\n } catch (err) {\n logToFile?.(\"warn\", `codegraph sync failed for ${projectDir}: ${err}`)\n codes.push(\"codegraph-install-failed\") // re-uses existing code\n }\n\n return {\n attempted: true,\n codes,\n availability: {\n codegraph: true,\n graphify: false,\n codegraphIndexExists,\n graphifyIndexExists: await dirExists(resolve(projectDir, \"graphify-out\")),\n },\n alreadyInitialized: false,\n }\n}\n\n// Helper: lazy import to avoid bundling fs-logger into graph-sync.ts\nfunction logToFile(_level: \"info\" | \"warn\" | \"error\", _msg: string): void {\n // Imported lazily at call sites to keep graph-sync self-contained\n}\n\n// ─── v0.12.0: auto-upgrade helpers ─────────────────────────────\n\n/**\n * Compare two semver strings. Returns true if `latest` is strictly greater\n * than `installed`. Handles X.Y.Z with optional pre-release suffix (-rc.1,\n * -beta.2). Pre-release is considered LOWER than the same X.Y.Z without it.\n *\n * Defensive: returns false on malformed input (unknown version, empty\n * string, etc.) so callers can default to \"don't upgrade\" instead of\n * triggering a network call.\n */\nexport function isNewerVersion(installed: string | null | undefined, latest: string | null | undefined): boolean {\nif (!installed || !latest) return false\n if (installed === latest) return false\n // Defensive: reject non-semver strings instead of treating them as 0.0.0\n const SEMVER_RE = /^[0-9]+\\.[0-9]+\\.[0-9]+(-[0-9A-Za-z.-]+)?$/\n if (!SEMVER_RE.test(installed) || !SEMVER_RE.test(latest)) return false\n // Strip pre-release suffix for base comparison\n const parseBase = (v: string): [number, number, number, string] => {\n const [base = \"\", pre = \"\"] = v.split(\"-\", 2)\n const parts = base.split(\".\").map((n) => {\n const num = Number.parseInt(n, 10)\n return Number.isFinite(num) ? num : 0\n })\n const [maj = 0, min = 0, pat = 0] = parts\n return [maj, min, pat, pre]\n }\n const [iMaj, iMin, iPat, iPre] = parseBase(installed)\n const [lMaj, lMin, lPat, lPre] = parseBase(latest)\n if (lMaj !== iMaj) return lMaj > iMaj\n if (lMin !== iMin) return lMin > iMin\n if (lPat !== iPat) return lPat > iPat\n // Same base — pre-release ordering: no pre > with pre\n if (iPre && !lPre) return true\n if (!iPre && lPre) return false\n return lPre > iPre\n}\n\n/**\n * v0.12.0: persisted cache of latest-version lookups so we don't\n * hammer npm/pip registries on every plugin load.\n *\n * File path defaults to ~/.config/opencode/omo-meta-governor-upgrade-check.json\n */\nexport interface UpgradeCache {\n checkedAtMs: number\n codegraphLatest?: string\n graphifyLatest?: string\n}\n\nexport function getDefaultUpgradeCachePath(): string {\n const { resolve } = require(\"node:path\")\n const { homedir } = require(\"node:os\")\n return resolve(homedir(), \".config\", \"opencode\", \"omo-meta-governor-upgrade-check.json\")\n}\n\nexport async function readUpgradeCache(path: string): Promise<UpgradeCache | null> {\n try {\n const { readFile } = await import(\"node:fs/promises\")\nconst content = await readFile(path, \"utf-8\")\nconst parsed = JSON.parse(content)\nif (typeof parsed?.checkedAtMs === \"number\") {\nreturn parsed as UpgradeCache\n}\nreturn null\n} catch {\nreturn null\n}\n}\n\nexport async function writeUpgradeCache(path: string, payload: UpgradeCache): Promise<void> {\n const { dirname } = await import(\"node:path\")\n const { mkdir, writeFile } = await import(\"node:fs/promises\")\n const dir = dirname(path)\n try {\n await mkdir(dir, { recursive: true })\n await writeFile(path, JSON.stringify(payload, null, 2))\n } catch {\n // best-effort — cache write failures must NEVER break the plugin\n }\n}\n\n/** Returns true if cache exists AND its `checkedAtMs` is within ttlMs of now. */\nexport function isCacheFresh(cache: UpgradeCache | null, ttlMs: number): boolean {\n if (!cache) return false\n const ageMs = Date.now() - cache.checkedAtMs\n return ageMs >= 0 && ageMs < ttlMs\n}\n\n/**\n * v0.12.0: decide whether to upgrade. Pure function over (installed,\n * latest, cache, ttl). Used by runGraphSync before calling out to the\n * registry. Centralizes the upgrade-decision policy.\n *\n * - If cache is fresh AND cache has a known latest version, use cached\n * latest instead of trusting `latest` (which may be stale). This is\n * how we avoid hammering npm/pip registries.\n * - If both installed and effective-latest are unknown → false.\n * - If installed >= effective-latest → false.\n * - Otherwise → true.\n */\nexport function shouldUpgrade(\n installed: string | null | undefined,\n registryLatest: string | null | undefined,\n cache: UpgradeCache | null,\n ttlMs: number,\n): boolean {\n // Determine the \"effective\" latest version to compare against.\n // If cache is fresh and has a value, prefer it (avoids extra registry calls).\n let effectiveLatest = registryLatest\n if (isCacheFresh(cache, ttlMs)) {\n effectiveLatest = cache?.codegraphLatest ?? effectiveLatest\n }\n if (!installed && !effectiveLatest) return false\n if (!effectiveLatest) return false\n if (!installed) return true\n return isNewerVersion(installed, effectiveLatest)\n}\n\n/**\n * v0.12.0: fetch the latest version of codegraph from npm registry.\n * Returns null on failure (best-effort, never throws).\n */\nexport async function fetchCodegraphLatestVersion(): Promise<string | null> {\n const { execSync } = await import(\"node:child_process\")\n try {\n const out = execSync(\"npm view @colbymchenry/codegraph version\", {\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n timeout: 10_000,\n })\n const v = out.toString().trim()\n return v.length > 0 ? v : null\n } catch {\n return null\n }\n}\n\n/**\n * v0.12.0: fetch the latest version of graphify from pip.\n * Returns null on failure (best-effort, never throws).\n */\nexport async function fetchGraphifyLatestVersion(): Promise<string | null> {\n const { execSync } = await import(\"node:child_process\")\n // Try `pip index versions graphifyy` first, then `pip install graphifyy== 2>&1 | head`\n try {\n const out = execSync(\"python3 -m pip index versions graphifyy\", {\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n timeout: 10_000,\n })\n // Output looks like \"graphifyy (1.2.3)\\nAvailable versions: ...\"\n // Parse the first version.\n const first = out.toString().split(\"\\n\")[0] ?? \"\"\n const m = first.match(/graphifyy\\s*\\(?([0-9]+\\.[0-9]+\\.[0-9]+[^\\s)]*)/)\n if (m) return m[1]!\n } catch { /* fall through */ }\n try {\n // Fallback: query PyPI directly via pip search-equivalent\n const out = execSync(\n \"python3 -c \\\"import urllib.request, json; d=json.load(urllib.request.urlopen('https://pypi.org/pypi/graphifyy/json')); print(d['info']['version'])\\\"\",\n { stdio: [\"ignore\", \"pipe\", \"ignore\"], timeout: 10_000 },\n )\n const v = out.toString().trim()\n return v.length > 0 ? v : null\n } catch {\n return null\n }\n}\n\n/**\n * v0.12.0: get the installed version of codegraph by running its CLI.\n * Returns null on failure.\n */\nexport async function getInstalledCodegraphVersion(): Promise<string | null> {\n const { execSync } = await import(\"node:child_process\")\n try {\n const out = execSync(\"npx --yes codegraph --version\", {\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n timeout: 10_000,\n })\n const v = out.toString().trim()\n return v.length > 0 ? v : null\n } catch {\n return null\n }\n}\n\n/**\n * v0.12.0: get the installed version of graphify via pip show.\n * Returns null on failure.\n */\nexport async function getInstalledGraphifyVersion(): Promise<string | null> {\n const { execSync } = await import(\"node:child_process\")\n try {\n const out = execSync(\"python3 -m pip show graphifyy\", {\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n timeout: 10_000,\n })\n const m = out.toString().match(/Version:\\s*([0-9]+\\.[0-9]+\\.[0-9]+[^\\s]*)/)\n if (m) return m[1]!\n } catch { /* fall through */ }\n try {\n const out = execSync(\"python3 -m pip show graphify\", {\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n timeout: 10_000,\n })\n const m = out.toString().match(/Version:\\s*([0-9]+\\.[0-9]+\\.[0-9]+[^\\s]*)/)\n if (m) return m[1]!\n } catch {\n return null\n }\n return null\n}\n",
7
7
  "/**\n * Cross-system memory aggregator for MetaGovernor.\n *\n * PR 2 of 8. Reads from all three memory systems (agentmemory, magic-context,\n * boulder-state) in parallel and returns a `MemoryRead` that conforms to the\n * PR 1 contract (types.ts).\n *\n * Design choices:\n * - Parallel reads with per-source timeouts. No sequential I/O.\n * - Graceful degrade: a failing source does NOT fail the whole read.\n * It populates `degradedSources[]` (string tags per the contract) and\n * the caller (`score()`) can decide the policy.\n * - Lessons are sorted by confidence DESC. Slots by label. Tasks by priority\n * ASC then recency DESC.\n * - Result is bounded: respects `limits`.\n * - Per-source error messages are stored separately (`errorMessages`) for\n * debugging but NOT in the contract type (the contract only has the string tags).\n *\n * Future PRs that wire this:\n * - PR 3 (closed-loop): calls `aggregateRead()` from `observeErrorAndLearn`\n * and `preflightCheck`.\n * - PR 5 (score): calls `aggregateRead()` to build `lessonsRelevant` slice\n * of `DecisionContext`.\n * - PR 6 (post-repair): calls `aggregateRead()` after a fix to verify.\n *\n * Internal raw types (Lesson, Crystal, Slot, BoulderTask) are defined here\n * as private interfaces representing what each backend actually returns.\n * The aggregator maps them to the contract types from types.ts.\n */\n\nimport type {\n MemoryRead,\n MemorySource,\n RelevantLesson,\n} from \"./types\";\n\n// ---------------------------------------------------------------------------\n// Raw backend types (private to this module — NOT exported to the contract)\n\ninterface RawLesson {\n readonly id: string;\n readonly title: string;\n readonly content: string;\n readonly type: string;\n readonly concepts: readonly string[];\n readonly confidence: number;\n readonly files: readonly string[];\n}\n\ninterface RawCrystal {\n readonly id: string;\n readonly title: string;\n readonly content: string;\n readonly type: string;\n readonly concepts: readonly string[];\n readonly confidence: number;\n readonly files: readonly string[];\n}\n\ninterface RawSlot {\n readonly label: string;\n readonly content: string;\n readonly pinned?: boolean;\n readonly scope?: string;\n readonly sizeLimit?: number;\n readonly updatedAt?: number;\n}\n\ninterface RawBoulderTask {\n readonly id: string;\n readonly title: string;\n readonly priority: number;\n readonly status: string;\n readonly description: string;\n readonly createdAtMs: number;\n readonly updatedAtMs: number;\n}\n\n// ---------------------------------------------------------------------------\n// Backend ports (interfaces). Implementations are injected; tests use fakes.\n\nexport interface AgentmemoryBackend {\n smartSearch(input: { query: string; limit?: number }): Promise<{ lessons: RawLesson[]; crystals: RawCrystal[] }>;\n}\n\nexport interface MagicContextBackend {\n slotList(input: { directory?: string; labelPrefix?: string }): Promise<RawSlot[]>;\n}\n\nexport interface BoulderStateBackend {\n boulderRead(input: { directory: string; sessionID: string; query?: string }): Promise<RawBoulderTask[]>;\n}\n\n// ---------------------------------------------------------------------------\n// Aggregate read input\n\nexport interface AggregateReadInput {\n /** Working directory. Scopes the read. */\n readonly directory: string;\n /** Session ID. Used for boulder-state keying. */\n readonly sessionID: string;\n /** Natural-language query. Passed to agentmemory (semantic) and boulder. */\n readonly query: string;\n /** Result-size bounds. */\n readonly limits?: {\n readonly maxLessons?: number;\n readonly maxSlots?: number;\n readonly maxTasks?: number;\n };\n /** Per-source timeout in ms. Default 2000 for agentmemory (network), 1000 for local. */\n readonly timeouts?: {\n readonly agentmemoryMs?: number;\n readonly magicContextMs?: number;\n readonly boulderStateMs?: number;\n };\n}\n\n// ---------------------------------------------------------------------------\n// Extended result (conforms to MemoryRead + adds metadata for debugging)\n\nexport interface AggregateReadResult extends MemoryRead {\n /** Wall-clock duration of the whole read, in ms. */\n readonly durationMs: number;\n /** Per-source error messages (for debugging; not in the contract type). */\n readonly errorMessages: Partial<Record<MemorySource, string>>;\n}\n\n// ---------------------------------------------------------------------------\n// Backends\n\nexport interface Backends {\n agentmemory: AgentmemoryBackend;\n magicContext: MagicContextBackend;\n boulderState: BoulderStateBackend;\n}\n\nconst DEFAULTS = {\n limits: { maxLessons: 10, maxSlots: 20, maxTasks: 10 },\n timeouts: { agentmemoryMs: 2000, magicContextMs: 1000, boulderStateMs: 1000 },\n} as const;\n\n/**\n * Read from all three memory systems in parallel. Never throws — a failing\n * source populates `degradedSources` and the read still returns a valid result.\n */\nexport async function aggregateRead(\n input: AggregateReadInput,\n backends: Backends,\n): Promise<AggregateReadResult> {\n const start = performance.now();\n const limits = { ...DEFAULTS.limits, ...input.limits };\n const timeouts = { ...DEFAULTS.timeouts, ...input.timeouts };\n\n const [agentResult, magicResult, boulderResult] = await Promise.allSettled([\n readAgentmemory(input, backends.agentmemory, limits, timeouts.agentmemoryMs),\n readMagicContext(input, backends.magicContext, limits, timeouts.magicContextMs),\n readBoulderState(input, backends.boulderState, limits, timeouts.boulderStateMs),\n ]);\n\n const degradedSources: MemorySource[] = [];\n const errorMessages: Partial<Record<MemorySource, string>> = {};\n\n const agentmemory = agentResult.status === \"fulfilled\"\n ? agentResult.value\n : (pushDegraded(degradedSources, errorMessages, \"agentmemory\", errorMessage(agentResult.reason)), DEGRADED.agentmemory);\n\n const magicContext = magicResult.status === \"fulfilled\"\n ? magicResult.value\n : (pushDegraded(degradedSources, errorMessages, \"magicContext\", errorMessage(magicResult.reason)), DEGRADED.magicContext);\n\n const boulderState = boulderResult.status === \"fulfilled\"\n ? boulderResult.value\n : (pushDegraded(degradedSources, errorMessages, \"boulderState\", errorMessage(boulderResult.reason)), DEGRADED.boulderState);\n\n return {\n query: input.query,\n timestampISO: new Date().toISOString(),\n agentmemory,\n magicContext,\n boulderState,\n degradedSources,\n durationMs: performance.now() - start,\n errorMessages,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Source readers\n\nasync function readAgentmemory(\n input: AggregateReadInput,\n backend: AgentmemoryBackend,\n limits: Required<NonNullable<AggregateReadInput[\"limits\"]>>,\n timeoutMs: number,\n): Promise<MemoryRead[\"agentmemory\"]> {\n const search = await withTimeout(\n backend.smartSearch({ query: input.query, limit: limits.maxLessons }),\n timeoutMs,\n \"agentmemory\",\n );\n\n const lessons: RelevantLesson[] = sortByConfidence(search.lessons)\n .slice(0, limits.maxLessons)\n .map((l) => ({\n id: l.id,\n title: l.title,\n advice: \"info\" as const,\n confidence: l.confidence,\n concepts: l.concepts,\n }));\n\n return {\n available: true,\n lessons,\n };\n}\n\nasync function readMagicContext(\n input: AggregateReadInput,\n backend: MagicContextBackend,\n limits: Required<NonNullable<AggregateReadInput[\"limits\"]>>,\n timeoutMs: number,\n): Promise<MemoryRead[\"magicContext\"]> {\n const slots = await withTimeout(\n backend.slotList({ directory: input.directory }),\n timeoutMs,\n \"magicContext\",\n );\n\n return {\n available: true,\n slots: slots\n .filter((s) => s.label.startsWith(\"meta_governor:\") || isRelevant(s, input.query))\n .sort((a, b) => a.label.localeCompare(b.label))\n .slice(0, limits.maxSlots)\n .map((s) => ({ label: s.label, content: s.content })),\n };\n}\n\nasync function readBoulderState(\n input: AggregateReadInput,\n backend: BoulderStateBackend,\n limits: Required<NonNullable<AggregateReadInput[\"limits\"]>>,\n timeoutMs: number,\n): Promise<MemoryRead[\"boulderState\"]> {\n const tasks = await withTimeout(\n backend.boulderRead({ directory: input.directory, sessionID: input.sessionID, query: input.query }),\n timeoutMs,\n \"boulderState\",\n );\n\n const sorted = tasks\n .sort((a, b) => a.priority - b.priority || b.updatedAtMs - a.updatedAtMs)\n .slice(0, limits.maxTasks);\n\n return {\n available: true,\n tasks: sorted.map((t) => ({ id: t.id, status: t.status, title: t.title })),\n planProgress: computePlanProgress(tasks),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n\nfunction sortByConfidence(lessons: RawLesson[]): RawLesson[] {\n return [...lessons].sort((a, b) => b.confidence - a.confidence);\n}\n\nfunction isRelevant(slot: RawSlot, query: string): boolean {\n const q = query.toLowerCase();\n return slot.label.toLowerCase().includes(q) || slot.content.toLowerCase().includes(q);\n}\n\nfunction computePlanProgress(tasks: RawBoulderTask[]): number {\n if (tasks.length === 0) return 0;\n const done = tasks.filter((t) => t.status === \"done\").length;\n return done / tasks.length;\n}\n\nfunction errorMessage(err: unknown): string {\n if (err instanceof Error) return err.message;\n if (typeof err === \"string\") return err;\n return \"unknown error\";\n}\n\nfunction pushDegraded(\n list: MemorySource[],\n errorMessages: Partial<Record<MemorySource, string>>,\n source: MemorySource,\n reason: string,\n): void {\n list.push(source);\n errorMessages[source] = reason;\n}\n\n// Typed fallback values for degraded sources.\n// These match the contract types exactly — pushDegraded is side-effect only.\nconst DEGRADED = {\n agentmemory: { available: false, lessons: [] } as const satisfies MemoryRead[\"agentmemory\"],\n magicContext: { available: false, slots: [] } as const satisfies MemoryRead[\"magicContext\"],\n boulderState: { available: false, tasks: [], planProgress: 0 } as const satisfies MemoryRead[\"boulderState\"],\n} as const;\n\nasync function withTimeout<T>(p: Promise<T>, ms: number, label: string): Promise<T> {\n return new Promise((resolve, reject) => {\n const t = setTimeout(() => reject(new Error(`${label} timeout after ${ms}ms`)), ms);\n p.then(\n (v) => { clearTimeout(t); resolve(v); },\n (e) => { clearTimeout(t); reject(e); },\n );\n });\n}\n",
8
8
  "/**\n * Token Predictor for MetaGovernor.\n *\n * PR 4 of 8. Computes token burn rate from recent turn metrics and recommends\n * preemptive actions (compact, switch model, delegate) before context window\n * exhaustion.\n *\n * Design:\n * - Pure function with no I/O — takes input, returns prediction.\n * - Configurable thresholds via TokenPredictorConfig.\n * - Burn rate = avg tokens/turn over sliding window.\n * - Overflow prediction: budgetLeft / burnRate = turns left.\n * - Recommendations layered: compact-now > switch-model > delegate > no-action.\n */\n\nimport type {\n TokenPredictorConfig,\n TokenPredictorInput,\n TokenPredictorOutput,\n} from \"./types\"\n\n/**\n * Default configuration for the token predictor.\n */\nexport function defaultTokenPredictorConfig(): TokenPredictorConfig {\n return {\n compactBurnRateThreshold: 500,\n compactUsageThreshold: 0.85,\n switchModelUsageThreshold: 0.95,\n delegateConsecutiveHighBurn: 5,\n windowSize: 10,\n }\n}\n\n/**\n * Calculate burn rate (avg tokens/turn) from recent turn tokens.\n * Returns 0 if no turns provided.\n */\nexport function calculateBurnRate(recentTurnTokens: readonly number[]): number {\n if (recentTurnTokens.length === 0) return 0\n const sum = recentTurnTokens.reduce((a, b) => a + b, 0)\n return sum / recentTurnTokens.length\n}\n\n/**\n * Count consecutive high-burn turns from the end of the window.\n */\nfunction countConsecutiveHighBurn(\n recentTurnTokens: readonly number[],\n threshold: number\n): number {\n let count = 0\n for (let i = recentTurnTokens.length - 1; i >= 0; i--) {\n if (recentTurnTokens[i] >= threshold) {\n count++\n } else {\n break\n }\n }\n return count\n}\n\n/**\n * Determine when overflow will occur based on burn rate and budget.\n * Returns ISO timestamp or null if no overflow expected.\n */\nfunction predictOverflowTime(\n currentUsage: number,\n modelLimit: number,\n burnRate: number,\n timestampISO: string\n): string | null {\n const budgetLeft = modelLimit - currentUsage\n if (budgetLeft <= 0) return timestampISO\n if (burnRate <= 0) return null\n\n const turnsLeft = Math.floor(budgetLeft / burnRate)\n if (turnsLeft <= 0) return timestampISO\n\n // Estimate ~2 seconds per turn as baseline\n const secondsLeft = turnsLeft * 2\n const overflowDate = new Date(\n new Date(timestampISO).getTime() + secondsLeft * 1000\n )\n return overflowDate.toISOString()\n}\n\n/**\n * Core prediction function. Analyzes recent turn tokens and recommends\n * an action to prevent context window exhaustion.\n */\nexport function predict(input: TokenPredictorInput): TokenPredictorOutput {\n const { currentUsage, modelLimit, recentTurnTokens, timestampISO, config } =\n input\n\n // Use at most windowSize recent turns\n const windowTokens = recentTurnTokens.slice(-config.windowSize)\n const burnRate = calculateBurnRate(windowTokens)\n const budgetLeft = modelLimit - currentUsage\n const usageRatio = modelLimit > 0 ? currentUsage / modelLimit : 1\n\n // Calculate confidence: more turns = higher confidence\n const confidence = Math.min(0.95, 0.3 + (windowTokens.length / config.windowSize) * 0.65)\n\n // Determine recommendation\n let recommendation: TokenPredictorOutput[\"recommendation\"] = \"no-action\"\n let reason = \"within normal parameters\"\n\n // Layer 1: Critical — context nearly full\n if (usageRatio >= config.switchModelUsageThreshold) {\n recommendation = \"switch-model\"\n reason = `context usage ${(usageRatio * 100).toFixed(1)}% exceeds switch threshold ${(config.switchModelUsageThreshold * 100).toFixed(1)}%`\n }\n\n // Layer 2: High burn rate or usage above compact threshold\n if (\n usageRatio >= config.compactUsageThreshold ||\n burnRate >= config.compactBurnRateThreshold\n ) {\n if (recommendation === \"no-action\") {\n recommendation = \"compact-now\"\n reason =\n usageRatio >= config.compactUsageThreshold\n ? `context usage ${(usageRatio * 100).toFixed(1)}% exceeds compact threshold ${(config.compactUsageThreshold * 100).toFixed(1)}%`\n : `burn rate ${burnRate.toFixed(0)} tokens/turn exceeds threshold ${config.compactBurnRateThreshold}`\n }\n }\n\n // Layer 3: Sustained high burn → delegate\n const consecutiveHighBurn = countConsecutiveHighBurn(\n windowTokens,\n config.compactBurnRateThreshold\n )\n if (\n consecutiveHighBurn >= config.delegateConsecutiveHighBurn &&\n recommendation === \"no-action\"\n ) {\n recommendation = \"delegate-to-subagent\"\n reason = `${consecutiveHighBurn} consecutive high-burn turns (threshold: ${config.delegateConsecutiveHighBurn})`\n }\n\n const willOverflowAt = predictOverflowTime(\n currentUsage,\n modelLimit,\n burnRate,\n timestampISO\n )\n\n return {\n currentUsage,\n burnRate,\n budgetLeft,\n willOverflowAt,\n recommendation,\n confidence,\n modelLimit,\n windowRemaining: Math.max(0, Math.floor(budgetLeft / Math.max(burnRate, 1))),\n input: { ...input },\n computedAtISO: timestampISO,\n turnsAnalyzed: windowTokens.length,\n }\n}\n",
9
9
  "/**\n * MetaGovernor Scoring Engine — PR 5 of 8.\n *\n * The core decision engine. Takes a DecisionContext (built from signals\n * gathered by the memory-aggregator, token-predictor, and hooks) and\n * produces a Decision via weighted evidence scoring.\n *\n * Architecture invariants:\n * - Pure function: no side effects, no I/O, no MCP calls\n * - Deterministic: same input → same output (no randomness)\n * - All thresholds configurable via ScoringConfig\n * - Paralysis prevention: N consecutive stops → force continue with warning\n * - Cite-or-abstain: evidence required when action !== \"continue\" silently\n *\n * Score ranges (default thresholds):\n * >= +0.3 → continue silently\n * [-0.3, +0.3] → continue with log\n * [-0.6, -0.3] → warn\n * [-0.8, -0.6] → escalate\n * < -0.8 → stop\n */\n\nimport type {\n DecisionContext,\n Decision,\n Evidence,\n EvidenceContribution,\n ScoringConfig,\n ScoringResult,\n RelevantLesson,\n} from \"./types\"\n\n// ─── Default weights ───────────────────────────────────────────────\n\n/** Default weights for each evidence source (must sum to ~1.0). */\nconst DEFAULT_WEIGHTS: Record<string, number> = {\n \"oracle-verified\": 0.25,\n \"no-progress-detector\": 0.20,\n \"deviation-detector\": 0.20,\n \"iteration-budget\": 0.15,\n \"lesson-recall\": 0.10,\n \"token-predictor\": 0.10,\n}\n\n// ─── Default config ────────────────────────────────────────────────\n\nexport const defaultScoringConfig = (): ScoringConfig => ({\n continueThreshold: 0.3,\n warnThreshold: 0.3,\n escalateThreshold: 0.6,\n stopThreshold: 0.8,\n paralysisThreshold: 3,\n defaultEscalationTarget: \"oracle\",\n})\n\n// ─── Signal scoring ────────────────────────────────────────────────\n\n/**\n * Score each signal source independently. Returns raw scores in [-1, +1].\n * Each score represents how POSITIVE (or negative) that signal is.\n */\nfunction scoreSignals(ctx: DecisionContext): EvidenceContribution[] {\n const contributions: EvidenceContribution[] = []\n\n // 1. Oracle verified: +0.6 (strongly positive)\n contributions.push({\n source: \"oracle-verified\",\n rawScore: ctx.oracleVerified ? 0.6 : 0,\n weight: DEFAULT_WEIGHTS[\"oracle-verified\"],\n weightedScore: ctx.oracleVerified ? 0.6 * DEFAULT_WEIGHTS[\"oracle-verified\"] : 0,\n description: ctx.oracleVerified\n ? \"Oracle verification passed\"\n : \"No Oracle verification\",\n })\n\n // 2. No progress: -0.8 (strongly negative)\n contributions.push({\n source: \"no-progress-detector\",\n rawScore: ctx.noProgress ? -0.8 : 0,\n weight: DEFAULT_WEIGHTS[\"no-progress-detector\"],\n weightedScore: ctx.noProgress ? -0.8 * DEFAULT_WEIGHTS[\"no-progress-detector\"] : 0,\n description: ctx.noProgress\n ? \"No progress detected in last turn\"\n : \"Progress detected\",\n })\n\n // 3. Deviations: severity-weighted\n const deviationScore = scoreDeviations(ctx.deviations)\n contributions.push({\n source: \"deviation-detector\",\n rawScore: deviationScore,\n weight: DEFAULT_WEIGHTS[\"deviation-detector\"],\n weightedScore: deviationScore * DEFAULT_WEIGHTS[\"deviation-detector\"],\n description: ctx.deviations.length > 0\n ? `${ctx.deviations.length} deviation(s) detected (worst: ${ctx.deviations[0]!.severity})`\n : \"No deviations detected\",\n })\n\n // 4. Iteration budget: approaching limit → negative\n const iterationScore = scoreIterationBudget(ctx.iterationRatio)\n contributions.push({\n source: \"iteration-budget\",\n rawScore: iterationScore,\n weight: DEFAULT_WEIGHTS[\"iteration-budget\"],\n weightedScore: iterationScore * DEFAULT_WEIGHTS[\"iteration-budget\"],\n description: `Iteration ratio: ${ctx.iterationRatio.toFixed(2)} (${ctx.ambient.iteration}/${ctx.ambient.maxIterations})`,\n })\n\n // 5. Lessons: advice-weighted\n const lessonScore = scoreLessons(ctx.lessonsRelevant)\n contributions.push({\n source: \"lesson-recall\",\n rawScore: lessonScore,\n weight: DEFAULT_WEIGHTS[\"lesson-recall\"],\n weightedScore: lessonScore * DEFAULT_WEIGHTS[\"lesson-recall\"],\n description: ctx.lessonsRelevant.length > 0\n ? `${ctx.lessonsRelevant.length} relevant lesson(s) (avg confidence: ${avgConfidence(ctx.lessonsRelevant).toFixed(2)})`\n : \"No relevant lessons\",\n })\n\n return contributions\n}\n\nfunction scoreDeviations(deviations: readonly { severity: string }[]): number {\n if (deviations.length === 0) return 0\n\n // Score based on worst deviation severity\n const severityMap: Record<string, number> = {\n grave: -0.9,\n media: -0.5,\n leve: -0.2,\n }\n\n let worst = 0\n for (const d of deviations) {\n const s = severityMap[d.severity] ?? -0.3\n if (s < worst) worst = s\n }\n\n // Multiple deviations amplify slightly (capped at -1)\n const amplification = Math.min(deviations.length * 0.05, 0.2)\n return Math.max(worst - amplification, -1)\n}\n\nfunction scoreIterationBudget(ratio: number): number {\n // Linear ramp: 0.0 → 0.0, 0.5 → -0.3, 1.0 → -0.8\n if (ratio <= 0.5) return -ratio * 0.6\n return -0.3 - (ratio - 0.5) * 1.0\n}\n\nfunction scoreLessons(lessons: readonly RelevantLesson[]): number {\n if (lessons.length === 0) return 0\n\n let totalScore = 0\n for (const lesson of lessons) {\n const adviceScore: Record<string, number> = {\n continue: 0.3,\n info: 0.0,\n warn: -0.3,\n stop: -0.7,\n }\n totalScore += (adviceScore[lesson.advice] ?? 0) * lesson.confidence\n }\n\n // Average and clamp\n return Math.max(Math.min(totalScore / lessons.length, 1), -1)\n}\n\nfunction avgConfidence(lessons: readonly RelevantLesson[]): number {\n if (lessons.length === 0) return 0\n return lessons.reduce((sum, l) => sum + l.confidence, 0) / lessons.length\n}\n\n// ─── Action mapping ────────────────────────────────────────────────\n\nfunction mapScoreToAction(\n score: number,\n config: ScoringConfig,\n): Decision[\"action\"] {\n if (score >= config.continueThreshold) return \"continue\"\n if (score <= -config.stopThreshold) return \"stop\"\n if (score <= -config.escalateThreshold) return \"escalate\"\n if (score <= -config.warnThreshold) return \"warn\"\n return \"continue\"\n}\n\nfunction selectEscalationTarget(\n ctx: DecisionContext,\n config: ScoringConfig,\n): \"oracle\" | \"user\" | null {\n // Oracle first if it hasn't been consulted yet in this cycle\n if (!ctx.oracleVerified) return \"oracle\"\n // If oracle already verified and we still have issues, escalate to user\n if (ctx.deviations.some((d) => d.severity === \"grave\")) return \"user\"\n return config.defaultEscalationTarget\n}\n\nfunction buildReasoning(\n score: number,\n action: Decision[\"action\"],\n contributions: EvidenceContribution[],\n paralysisOverride: boolean,\n): string {\n if (paralysisOverride) {\n return `Paralysis detected: forced continue despite score ${score.toFixed(3)} (too many consecutive stops)`\n }\n\n // Find the strongest positive and negative contributions\n const sorted = [...contributions].sort((a, b) => a.weightedScore - b.weightedScore)\n const worst = sorted[0]!\n const best = sorted[sorted.length - 1]!\n\n const parts: string[] = []\n if (worst.weightedScore < 0) {\n parts.push(`primary concern: ${worst.description}`)\n }\n if (best.weightedScore > 0) {\n parts.push(`positive signal: ${best.description}`)\n }\n\n const actionLabel: Record<string, string> = {\n continue: \"Continue\",\n warn: \"Warn\",\n escalate: \"Escalate\",\n stop: \"Stop\",\n }\n\n return `${actionLabel[action]} (score: ${score.toFixed(3)}): ${parts.join(\"; \") || \"balanced signals\"}`\n}\n\n// ─── Public API ────────────────────────────────────────────────────\n\n/**\n * Core scoring function. Pure, deterministic, no side effects.\n *\n * @param ctx - DecisionContext assembled from all signal sources\n * @param config - Scoring thresholds (defaults if omitted)\n * @returns ScoringResult with Decision, evidence breakdown, and metadata\n */\nexport function score(\n ctx: DecisionContext,\n config?: Partial<ScoringConfig>,\n): ScoringResult {\n const resolvedConfig = { ...defaultScoringConfig(), ...config }\n\n // 1. Compute per-signal contributions\n const contributions = scoreSignals(ctx)\n\n // 2. Sum weighted scores → raw score in [-1, +1]\n const rawScore = contributions.reduce((sum, c) => sum + c.weightedScore, 0)\n const clampedScore = Math.max(Math.min(rawScore, 1), -1)\n\n // 3. Check paralysis (3 consecutive stops → force continue)\n const paralysisOverride =\n ctx.slotMemory.consecutiveStops >= resolvedConfig.paralysisThreshold &&\n clampedScore <= -resolvedConfig.warnThreshold\n\n // 4. Map score to action\n const action = paralysisOverride\n ? \"continue\"\n : mapScoreToAction(clampedScore, resolvedConfig)\n\n // 5. Build evidence array (cite-or-abstain)\n const evidence: Evidence[] = []\n if (action !== \"continue\" || Math.abs(clampedScore) < resolvedConfig.continueThreshold) {\n // Non-silent actions require at least 1 evidence unit\n for (const c of contributions) {\n if (Math.abs(c.weightedScore) > 0.01) {\n evidence.push({\n source: c.source,\n value: c.description,\n confidence: Math.abs(c.rawScore),\n weight: c.weight,\n })\n }\n }\n // Ensure at least 1 evidence for non-continue actions\n if (evidence.length === 0 && action !== \"continue\") {\n evidence.push({\n source: \"ambient\",\n value: buildReasoning(clampedScore, action, contributions, paralysisOverride),\n confidence: 0.5,\n weight: 0.1,\n })\n }\n }\n\n // 6. Select escalation target\n const shouldEscalateTo =\n action === \"escalate\" ? selectEscalationTarget(ctx, resolvedConfig) : null\n\n // 7. Build decision\n const decision: Decision = {\n action,\n score: clampedScore,\n reasoning: buildReasoning(clampedScore, action, contributions, paralysisOverride),\n evidence,\n shouldEscalateTo,\n }\n\n return {\n decision,\n contributions,\n rawScore: clampedScore,\n paralysisOverride,\n computedAtISO: new Date().toISOString(),\n }\n}\n",
@@ -19,7 +19,7 @@
19
19
  "import type { PluginModule } from \"@opencode-ai/plugin\"\nimport { createMetaGovernorPlugin } from \"./plugin\"\n\n/**\n * @sisyphuslabs/omo-meta-governor — Self-judging agent orchestration layer.\n *\n * Default export is an OpenCode PluginModule that registers a\n * `tool.execute.after` hook. The MetaGovernor reads session signals,\n * scores them against weighted evidence, and dispatches decisions.\n *\n * Install:\n * npm install @sisyphuslabs/omo-meta-governor\n *\n * Configure:\n * ```jsonc\n * {\n * \"meta_governor\": {\n * \"enabled\": true\n * }\n * }\n * ```\n */\nconst pluginModule: PluginModule = {\n id: \"omo-meta-governor\",\n server: createMetaGovernorPlugin(),\n}\n\nexport default pluginModule\n\nexport { createMetaGovernorPlugin, type MetaGovernorPluginDeps } from \"./plugin\"\nexport { logToFile } from \"./file-logger\"\nexport {\n runMetaGovernor,\n buildDecisionContext,\n defaultOrchestratorConfig,\n} from \"./orchestrator\"\nexport {\n loadOrchestratorConfig,\n isMetaGovernorEnabled,\n type MetaGovernorPluginConfig,\n} from \"./config\"\n\n// Core module re-exports\nexport { score, defaultScoringConfig } from \"./scoring-engine\"\nexport { predict, defaultTokenPredictorConfig, calculateBurnRate } from \"./token-predictor\"\nexport { handleDecision, defaultDecisionHandlerConfig, trimHistory, countConsecutiveStops } from \"./decision-handler\"\nexport { observeAndLearn, defaultClosedLoopConfig } from \"./closed-loop-learning\"\nexport { aggregateRead } from \"./memory-aggregator\"\nexport { recordRecovery, type RecoveryOutcome } from \"./post-repair-recorder\"\nexport {\n storeDecision,\n takeDecision,\n hasDecision,\n takeAnyDecision,\n clearAll,\n} from \"./decision-store\"\n\n// Types\nexport type {\n Decision,\n DecisionContext,\n DecisionHandlerConfig,\n DecisionHandlerInput,\n DecisionHandlerOutput,\n Deviation,\n Evidence,\n EvidenceContribution,\n InterventionConfig,\n InterventionMode,\n LearnFromOutcomeInput,\n LearnFromOutcomeOutput,\n MemoryRead,\n MemoryBackends,\n AgentmemoryWriteBackend,\n MetaGovernorInput,\n MetaGovernorOutput,\n OrchestratorConfig,\n ScoringConfig,\n ScoringResult,\n SlotMemory,\n TokenPredictorConfig,\n TokenPredictorInput,\n TokenPredictorOutput,\n ClosedLoopConfig,\n} from \"./types\"\n// Protocol enforcer\nexport {\n loadProtocol,\n buildSystemInjection,\n auditToolCall,\n DEFAULT_PROTOCOL_PATH,\n} from \"./protocol-enforcer\"\n\n// Config-file loader + graphSync + schema generator\nexport {\n stripJsoncComments,\n parseJsonc,\n loadJsoncFile,\n deepMerge,\n loadMetaGovernorConfig,\n getUserConfigPath,\n getProjectConfigPath,\n type ConfigFileSources,\n type ConfigFileResult,\n} from \"./config-file\"\nexport {\n runGraphSync,\n stopWatches,\n resetInitializedProjects,\n type GraphSyncConfig,\n type GraphSyncResult,\n type GraphSyncCode,\n type ToolAvailability,\n} from \"./graph-sync\"\nexport { generateSchema, writeSchemaFile, type JsonSchema, type JsonSchemaProperty } from \"./generate-schema\"\nexport { loadOrchestratorConfigFromSources } from \"./config\"\n\nexport type { ProtocolViolation, ProtocolEnforcementSessionState } from \"./types\"\n",
20
20
  "/**\n * JSON Schema generator for omo-meta-governor.jsonc.\n *\n * Generates a JSON Schema (draft-07) from the MetaGovernorPluginConfig\n * interface definition. The schema is used for IDE autocompletion and\n * validation when editing the .jsonc config file.\n *\n * Usage:\n * import { generateSchema } from \"./generate-schema\"\n * const schema = generateSchema()\n * await Bun.write(\"assets/omo-meta-governor.schema.json\", JSON.stringify(schema, null, 2))\n */\n\nexport interface JsonSchema {\n $schema: string\n $id: string\n title: string\n description: string\n type: \"object\"\n properties: Record<string, JsonSchemaProperty>\n additionalProperties: boolean\n definitions?: Record<string, JsonSchemaProperty>\n}\n\nexport interface JsonSchemaProperty {\n type?: string | string[]\n description?: string\n default?: unknown\n properties?: Record<string, JsonSchemaProperty>\n items?: JsonSchemaProperty\n additionalProperties?: boolean\n required?: string[]\n enum?: string[]\n oneOf?: JsonSchemaProperty[]\n anyOf?: JsonSchemaProperty[]\n $ref?: string\n minimum?: number\n maximum?: number\n}\n\nconst ID_BASE = \"https://raw.githubusercontent.com/herjarsa/omo-meta-governor/main\"\n\n/**\n * Generate the full JSON Schema for the omo-meta-governor.jsonc config file.\n */\nexport function generateSchema(): JsonSchema {\n return {\n $schema: \"http://json-schema.org/draft-07/schema#\",\n $id: `${ID_BASE}/assets/omo-meta-governor.schema.json`,\n title: \"omo-meta-governor\",\n description: \"Configuration schema for @herjarsa/omo-meta-governor — Self-judging agent orchestration layer for OpenCode.\",\n type: \"object\",\n additionalProperties: false,\n properties: {\n $schema: {\n type: \"string\",\n description: \"JSON Schema reference for IDE autocompletion.\",\n },\n enabled: {\n type: \"boolean\",\n description: \"Master feature flag — must be true to run the orchestrator.\",\n default: false,\n },\n decision: {\n type: \"object\",\n description: \"Decision handler configuration.\",\n additionalProperties: false,\n properties: {\n maxHistoryPerSession: {\n type: \"integer\",\n description: \"Maximum history entries per session before oldest are trimmed.\",\n default: 50,\n minimum: 1,\n },\n forceContinueAfterStops: {\n type: \"integer\",\n description: \"How many consecutive stops before forcing continue.\",\n default: 3,\n minimum: 1,\n },\n },\n },\n memory: {\n type: \"object\",\n description: \"Memory aggregator configuration.\",\n additionalProperties: false,\n properties: {\n agentmemoryTimeoutMs: {\n type: \"integer\",\n description: \"Timeout for agentmemory queries in milliseconds.\",\n default: 2000,\n minimum: 100,\n },\n magicContextTimeoutMs: {\n type: \"integer\",\n description: \"Timeout for magic-context queries in milliseconds.\",\n default: 1000,\n minimum: 100,\n },\n boulderStateTimeoutMs: {\n type: \"integer\",\n description: \"Timeout for boulder-state queries in milliseconds.\",\n default: 1000,\n minimum: 100,\n },\n query: {\n type: \"string\",\n description: \"Natural-language query for memory recall.\",\n default: \"meta_governor_context\",\n },\n },\n },\n tokenPredictor: {\n type: \"object\",\n description: \"Token predictor configuration.\",\n additionalProperties: false,\n properties: {\n compactBurnRateThreshold: {\n type: \"integer\",\n description: \"Burn rate threshold (tokens/turn) above which to recommend compact-now.\",\n default: 500,\n minimum: 0,\n },\n compactUsageThreshold: {\n type: \"number\",\n description: \"Context usage ratio (0..1) above which to recommend compact-now.\",\n default: 0.85,\n minimum: 0,\n maximum: 1,\n },\n switchModelUsageThreshold: {\n type: \"number\",\n description: \"Context usage ratio above which to recommend switch-model.\",\n default: 0.95,\n minimum: 0,\n maximum: 1,\n },\n delegateConsecutiveHighBurn: {\n type: \"integer\",\n description: \"Max consecutive high-burn turns before recommending delegate.\",\n default: 5,\n minimum: 1,\n },\n },\n },\n scoring: {\n type: \"object\",\n description: \"Scoring engine configuration.\",\n additionalProperties: false,\n properties: {\n continueThreshold: {\n type: \"number\",\n description: \"Score >= this -> continue silently.\",\n default: 0.3,\n minimum: 0,\n maximum: 1,\n },\n warnThreshold: {\n type: \"number\",\n description: \"Score <= -warnThreshold -> warn.\",\n default: 0.3,\n minimum: 0,\n maximum: 1,\n },\n escalateThreshold: {\n type: \"number\",\n description: \"Score <= -escalateThreshold -> escalate.\",\n default: 0.6,\n minimum: 0,\n maximum: 1,\n },\n stopThreshold: {\n type: \"number\",\n description: \"Score <= -stopThreshold -> stop.\",\n default: 0.8,\n minimum: 0,\n maximum: 1,\n },\n },\n },\n closedLoop: {\n type: \"object\",\n description: \"Closed-loop learning configuration.\",\n additionalProperties: false,\n properties: {\n saveDecisions: {\n type: \"boolean\",\n description: \"Whether to save decision records.\",\n default: true,\n },\n saveLessons: {\n type: \"boolean\",\n description: \"Whether to save lessons.\",\n default: true,\n },\n },\n },\n modelOverride: {\n type: \"object\",\n description: \"Model override for MetaGovernor internal LLM usage.\",\n additionalProperties: false,\n properties: {\n providerID: {\n type: \"string\",\n description: \"Provider ID (e.g. 'openai', 'anthropic').\",\n },\n modelID: {\n type: \"string\",\n description: \"Model ID (e.g. 'gpt-4o-mini', 'claude-sonnet-4-20250514').\",\n },\n modelLimit: {\n type: \"integer\",\n description: \"Context window size for token predictor.\",\n minimum: 1000,\n },\n temperature: {\n type: \"number\",\n description: \"Sampling temperature. Default: 0.2.\",\n default: 0.2,\n minimum: 0,\n maximum: 2,\n },\n topP: {\n type: \"number\",\n description: \"Top-p nucleus sampling. Default: 1.\",\n default: 1,\n minimum: 0,\n maximum: 1,\n },\n maxTokens: {\n type: \"integer\",\n description: \"Max output tokens for internal reasoning.\",\n default: 2048,\n minimum: 1,\n },\n reasoning: {\n type: \"boolean\",\n description: \"Enable extended reasoning / thinking mode.\",\n default: false,\n },\n verbosity: {\n type: \"string\",\n description: \"Verbosity level for internal logging.\",\n enum: [\"silent\", \"minimal\", \"verbose\"],\n default: \"minimal\",\n },\n },\n },\n intervention: {\n type: \"object\",\n description: \"Intervention config for visible decision injection.\",\n additionalProperties: false,\n properties: {\n mode: {\n type: \"string\",\n description: \"How to inject: 'silent', 'message', or 'system'.\",\n enum: [\"silent\", \"message\", \"system\"],\n default: \"silent\",\n },\n includeDecisionHistory: {\n type: \"boolean\",\n description: \"Whether to include recent decision history.\",\n default: true,\n },\n maxHistoryMessages: {\n type: \"integer\",\n description: \"Max history entries when includeDecisionHistory is true.\",\n default: 5,\n minimum: 1,\n },\n minActionForMessage: {\n type: \"string\",\n description: \"Minimum action: 'warn' (all non-continue), 'escalate', or 'stop'.\",\n enum: [\"warn\", \"escalate\", \"stop\"],\n default: \"warn\",\n },\n },\n },\n protocolEnforcement: {\n type: \"object\",\n description: \"Sisyphus protocol enforcement config.\",\n additionalProperties: false,\n properties: {\n enabled: {\n type: \"boolean\",\n description: \"Master switch for protocol enforcement.\",\n default: false,\n },\n path: {\n type: \"string\",\n description: \"Path to protocol markdown file.\",\n },\n injectIntoSystem: {\n type: \"boolean\",\n description: \"Whether to inject protocol rules into the system prompt.\",\n default: false,\n },\n auditToolCalls: {\n type: \"boolean\",\n description: \"Whether to audit tool calls for protocol violations.\",\n default: false,\n },\n },\n },\n graphSync: {\n type: \"object\",\n description: \"Graph synchronization (auto-init codegraph/graphify).\",\n additionalProperties: false,\n properties: {\n enabled: {\n type: \"boolean\",\n description: \"Enable auto-initialization of codegraph and graphify.\",\n default: true,\n },\n watch: {\n type: \"boolean\",\n description: \"Enable watch mode (re-index on file changes).\",\n default: false,\n },\n },\n },\n },\n definitions: {\n verbosity: {\n type: \"string\",\n enum: [\"silent\", \"minimal\", \"verbose\"],\n description: \"Verbosity level.\",\n },\n interventionMode: {\n type: \"string\",\n enum: [\"silent\", \"message\", \"system\"],\n description: \"Intervention injection mode.\",\n },\n minAction: {\n type: \"string\",\n enum: [\"warn\", \"escalate\", \"stop\"],\n description: \"Minimum action threshold.\",\n },\n },\n }\n}\n\n/**\n * Write the schema to a file.\n */\nexport async function writeSchemaFile(outputPath: string): Promise<void> {\n const schema = generateSchema()\n const { writeFile } = await import(\"node:fs/promises\")\n await writeFile(outputPath, JSON.stringify(schema, null, 2) + \"\\n\", \"utf-8\")\n}\n"
21
21
  ],
22
- "mappings": "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YAAa,8DACb,QAAS,EACX,EACA,SAAU,CACR,KAAM,SACN,YAAa,kCACb,qBAAsB,GACtB,WAAY,CACV,qBAAsB,CACpB,KAAM,UACN,YAAa,iEACb,QAAS,GACT,QAAS,CACX,EACA,wBAAyB,CACvB,KAAM,UACN,YAAa,sDACb,QAAS,EACT,QAAS,CACX,CACF,CACF,EACA,OAAQ,CACN,KAAM,SACN,YAAa,mCACb,qBAAsB,GACtB,WAAY,CACV,qBAAsB,CACpB,KAAM,UACN,YAAa,mDACb,QAAS,KACT,QAAS,GACX,EACA,sBAAuB,CACrB,KAAM,UACN,YAAa,qDACb,QAAS,KACT,QAAS,GACX,EACA,sBAAuB,CACrB,KAAM,UACN,YAAa,qDACb,QAAS,KACT,QAAS,GACX,EACA,MAAO,CACL,KAAM,SACN,YAAa,4CACb,QAAS,uBACX,CACF,CACF,EACA,eAAgB,CACd,KAAM,SACN,YAAa,iCACb,qBAAsB,GACtB,WAAY,CACV,yBAA0B,CACxB,KAAM,UACN,YAAa,0EACb,QAAS,IACT,QAAS,CACX,EACA,sBAAuB,CACrB,KAAM,SACN,YAAa,mEACb,QAAS,KACT,QAAS,EACT,QAAS,CACX,EACA,0BAA2B,CACzB,KAAM,SACN,YAAa,6DACb,QAAS,KACT,QAAS,EACT,QAAS,CACX,EACA,4BAA6B,CAC3B,KAAM,UACN,YAAa,gEACb,QAAS,EACT,QAAS,CACX,CACF,CACF,EACA,QAAS,CACP,KAAM,SACN,YAAa,gCACb,qBAAsB,GACtB,WAAY,CACV,kBAAmB,CACjB,KAAM,SACN,YAAa,sCACb,QAAS,IACT,QAAS,EACT,QAAS,CACX,EACA,cAAe,CACb,KAAM,SACN,YAAa,mCACb,QAAS,IACT,QAAS,EACT,QAAS,CACX,EACA,kBAAmB,CACjB,KAAM,SACN,YAAa,2CACb,QAAS,IACT,QAAS,EACT,QAAS,CACX,EACA,cAAe,CACb,KAAM,SACN,YAAa,mCACb,QAAS,IACT,QAAS,EACT,QAAS,CACX,CACF,CACF,EACA,WAAY,CACV,KAAM,SACN,YAAa,sCACb,qBAAsB,GACtB,WAAY,CACV,cAAe,CACb,KAAM,UACN,YAAa,oCACb,QAAS,EACX,EACA,YAAa,CACX,KAAM,UACN,YAAa,2BACb,QAAS,EACX,CACF,CACF,EACA,cAAe,CACb,KAAM,SACN,YAAa,sDACb,qBAAsB,GACtB,WAAY,CACV,WAAY,CACV,KAAM,SACN,YAAa,2CACf,EACA,QAAS,CACP,KAAM,SACN,YAAa,4DACf,EACA,WAAY,CACV,KAAM,UACN,YAAa,2CACb,QAAS,IACX,EACA,YAAa,CACX,KAAM,SACN,YAAa,sCACb,QAAS,IACT,QAAS,EACT,QAAS,CACX,EACA,KAAM,CACJ,KAAM,SACN,YAAa,sCACb,QAAS,EACT,QAAS,EACT,QAAS,CACX,EACA,UAAW,CACT,KAAM,UACN,YAAa,4CACb,QAAS,KACT,QAAS,CACX,EACA,UAAW,CACT,KAAM,UACN,YAAa,6CACb,QAAS,EACX,EACA,UAAW,CACT,KAAM,SACN,YAAa,wCACb,KAAM,CAAC,SAAU,UAAW,SAAS,EACrC,QAAS,SACX,CACF,CACF,EACA,aAAc,CACZ,KAAM,SACN,YAAa,sDACb,qBAAsB,GACtB,WAAY,CACV,KAAM,CACJ,KAAM,SACN,YAAa,mDACb,KAAM,CAAC,SAAU,UAAW,QAAQ,EACpC,QAAS,QACX,EACA,uBAAwB,CACtB,KAAM,UACN,YAAa,8CACb,QAAS,EACX,EACA,mBAAoB,CAClB,KAAM,UACN,YAAa,2DACb,QAAS,EACT,QAAS,CACX,EACA,oBAAqB,CACnB,KAAM,SACN,YAAa,oEACb,KAAM,CAAC,OAAQ,WAAY,MAAM,EACjC,QAAS,MACX,CACF,CACF,EACA,oBAAqB,CACnB,KAAM,SACN,YAAa,wCACb,qBAAsB,GACtB,WAAY,CACV,QAAS,CACP,KAAM,UACN,YAAa,0CACb,QAAS,EACX,EACA,KAAM,CACJ,KAAM,SACN,YAAa,iCACf,EACA,iBAAkB,CAChB,KAAM,UACN,YAAa,2DACb,QAAS,EACX,EACA,eAAgB,CACd,KAAM,UACN,YAAa,uDACb,QAAS,EACX,CACF,CACF,EACA,UAAW,CACT,KAAM,SACN,YAAa,wDACb,qBAAsB,GACtB,WAAY,CACV,QAAS,CACP,KAAM,UACN,YAAa,wDACb,QAAS,EACX,EACA,MAAO,CACL,KAAM,UACN,YAAa,gDACb,QAAS,EACX,CACF,CACF,CACF,EACA,YAAa,CACX,UAAW,CACT,KAAM,SACN,KAAM,CAAC,SAAU,UAAW,SAAS,EACrC,YAAa,kBACf,EACA,iBAAkB,CAChB,KAAM,SACN,KAAM,CAAC,SAAU,UAAW,QAAQ,EACpC,YAAa,8BACf,EACA,UAAW,CACT,KAAM,SACN,KAAM,CAAC,OAAQ,WAAY,MAAM,EACjC,YAAa,2BACf,CACF,CACF,EAMF,eAAsB,EAAe,CAAC,EAAmC,CACvE,IAAM,EAAS,GAAe,GACtB,aAAc,KAAa,4BACnC,MAAM,EAAU,EAAY,KAAK,UAAU,EAAQ,KAAM,CAAC,EAAI;AAAA,EAAM,OAAO,EDtU7E,IAAM,GAA6B,CACjC,GAAI,oBACJ,OAAQ,GAAyB,CACnC,EAEe",
23
- "debugId": "C6D81EA8D3395FF264756E2164756E21",
22
+ "mappings": "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YAAa,sDACb,QAAS,EACT,QAAS,CACX,CACF,CACF,EACA,OAAQ,CACN,KAAM,SACN,YAAa,mCACb,qBAAsB,GACtB,WAAY,CACV,qBAAsB,CACpB,KAAM,UACN,YAAa,mDACb,QAAS,KACT,QAAS,GACX,EACA,sBAAuB,CACrB,KAAM,UACN,YAAa,qDACb,QAAS,KACT,QAAS,GACX,EACA,sBAAuB,CACrB,KAAM,UACN,YAAa,qDACb,QAAS,KACT,QAAS,GACX,EACA,MAAO,CACL,KAAM,SACN,YAAa,4CACb,QAAS,uBACX,CACF,CACF,EACA,eAAgB,CACd,KAAM,SACN,YAAa,iCACb,qBAAsB,GACtB,WAAY,CACV,yBAA0B,CACxB,KAAM,UACN,YAAa,0EACb,QAAS,IACT,QAAS,CACX,EACA,sBAAuB,CACrB,KAAM,SACN,YAAa,mEACb,QAAS,KACT,QAAS,EACT,QAAS,CACX,EACA,0BAA2B,CACzB,KAAM,SACN,YAAa,6DACb,QAAS,KACT,QAAS,EACT,QAAS,CACX,EACA,4BAA6B,CAC3B,KAAM,UACN,YAAa,gEACb,QAAS,EACT,QAAS,CACX,CACF,CACF,EACA,QAAS,CACP,KAAM,SACN,YAAa,gCACb,qBAAsB,GACtB,WAAY,CACV,kBAAmB,CACjB,KAAM,SACN,YAAa,sCACb,QAAS,IACT,QAAS,EACT,QAAS,CACX,EACA,cAAe,CACb,KAAM,SACN,YAAa,mCACb,QAAS,IACT,QAAS,EACT,QAAS,CACX,EACA,kBAAmB,CACjB,KAAM,SACN,YAAa,2CACb,QAAS,IACT,QAAS,EACT,QAAS,CACX,EACA,cAAe,CACb,KAAM,SACN,YAAa,mCACb,QAAS,IACT,QAAS,EACT,QAAS,CACX,CACF,CACF,EACA,WAAY,CACV,KAAM,SACN,YAAa,sCACb,qBAAsB,GACtB,WAAY,CACV,cAAe,CACb,KAAM,UACN,YAAa,oCACb,QAAS,EACX,EACA,YAAa,CACX,KAAM,UACN,YAAa,2BACb,QAAS,EACX,CACF,CACF,EACA,cAAe,CACb,KAAM,SACN,YAAa,sDACb,qBAAsB,GACtB,WAAY,CACV,WAAY,CACV,KAAM,SACN,YAAa,2CACf,EACA,QAAS,CACP,KAAM,SACN,YAAa,4DACf,EACA,WAAY,CACV,KAAM,UACN,YAAa,2CACb,QAAS,IACX,EACA,YAAa,CACX,KAAM,SACN,YAAa,sCACb,QAAS,IACT,QAAS,EACT,QAAS,CACX,EACA,KAAM,CACJ,KAAM,SACN,YAAa,sCACb,QAAS,EACT,QAAS,EACT,QAAS,CACX,EACA,UAAW,CACT,KAAM,UACN,YAAa,4CACb,QAAS,KACT,QAAS,CACX,EACA,UAAW,CACT,KAAM,UACN,YAAa,6CACb,QAAS,EACX,EACA,UAAW,CACT,KAAM,SACN,YAAa,wCACb,KAAM,CAAC,SAAU,UAAW,SAAS,EACrC,QAAS,SACX,CACF,CACF,EACA,aAAc,CACZ,KAAM,SACN,YAAa,sDACb,qBAAsB,GACtB,WAAY,CACV,KAAM,CACJ,KAAM,SACN,YAAa,mDACb,KAAM,CAAC,SAAU,UAAW,QAAQ,EACpC,QAAS,QACX,EACA,uBAAwB,CACtB,KAAM,UACN,YAAa,8CACb,QAAS,EACX,EACA,mBAAoB,CAClB,KAAM,UACN,YAAa,2DACb,QAAS,EACT,QAAS,CACX,EACA,oBAAqB,CACnB,KAAM,SACN,YAAa,oEACb,KAAM,CAAC,OAAQ,WAAY,MAAM,EACjC,QAAS,MACX,CACF,CACF,EACA,oBAAqB,CACnB,KAAM,SACN,YAAa,wCACb,qBAAsB,GACtB,WAAY,CACV,QAAS,CACP,KAAM,UACN,YAAa,0CACb,QAAS,EACX,EACA,KAAM,CACJ,KAAM,SACN,YAAa,iCACf,EACA,iBAAkB,CAChB,KAAM,UACN,YAAa,2DACb,QAAS,EACX,EACA,eAAgB,CACd,KAAM,UACN,YAAa,uDACb,QAAS,EACX,CACF,CACF,EACA,UAAW,CACT,KAAM,SACN,YAAa,wDACb,qBAAsB,GACtB,WAAY,CACV,QAAS,CACP,KAAM,UACN,YAAa,wDACb,QAAS,EACX,EACA,MAAO,CACL,KAAM,UACN,YAAa,gDACb,QAAS,EACX,CACF,CACF,CACF,EACA,YAAa,CACX,UAAW,CACT,KAAM,SACN,KAAM,CAAC,SAAU,UAAW,SAAS,EACrC,YAAa,kBACf,EACA,iBAAkB,CAChB,KAAM,SACN,KAAM,CAAC,SAAU,UAAW,QAAQ,EACpC,YAAa,8BACf,EACA,UAAW,CACT,KAAM,SACN,KAAM,CAAC,OAAQ,WAAY,MAAM,EACjC,YAAa,2BACf,CACF,CACF,EAMF,eAAsB,EAAe,CAAC,EAAmC,CACvE,IAAM,EAAS,GAAe,GACtB,aAAc,KAAa,4BACnC,MAAM,EAAU,EAAY,KAAK,UAAU,EAAQ,KAAM,CAAC,EAAI;AAAA,EAAM,OAAO,EDtU7E,IAAM,GAA6B,CACjC,GAAI,oBACJ,OAAQ,GAAyB,CACnC,EAEe",
23
+ "debugId": "CC2367A5012E56A664756E2164756E21",
24
24
  "names": []
25
25
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@herjarsa/omo-meta-governor",
3
- "version": "0.11.2",
3
+ "version": "0.12.0",
4
4
  "type": "module",
5
5
  "description": "Self-judging agent orchestration layer for OpenCode. Reads memory, scores sessions, dispatches decisions.",
6
6
  "exports": {
@@ -33,7 +33,7 @@
33
33
  "url": "https://github.com/herjarsa/omo-meta-governor.git"
34
34
  },
35
35
  "devDependencies": {
36
- "@colbymchenry/codegraph": "^1.0.1",
36
+ "@colbymchenry/codegraph": "^1.1.0",
37
37
  "@opencode-ai/plugin": "^1.17.4",
38
38
  "@types/node": "^25.9.3"
39
39
  }