olympus-ai 4.5.11 → 4.5.13

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.
@@ -12,7 +12,7 @@ GFS4: `),console.error(e)});ne[ke]||(ju=global[ke]||[],Mu(ne,ju),ne.close=(funct
12
12
  see https://github.com/jprichardson/node-fs-extra/issues/269`,"Warning","fs-extra-WARN0001");let{srcStat:r,destStat:o}=await Fr.checkPaths(e,t,"copy",n);if(await Fr.checkParentPaths(e,r,t,"copy"),!await rd(e,t,n))return;let i=jr.dirname(t);await Pk(i)||await xk(i),await od(o,e,t,n)}async function rd(e,t,n){return n.filter?n.filter(e,t):!0}async function od(e,t,n,r){let s=await(r.dereference?ve.stat:ve.lstat)(t);if(s.isDirectory())return jk(s,e,t,n,r);if(s.isFile()||s.isCharacterDevice()||s.isBlockDevice())return $k(s,e,t,n,r);if(s.isSymbolicLink())return Fk(e,t,n,r);throw s.isSocket()?new Error(`Cannot copy a socket file: ${t}`):s.isFIFO()?new Error(`Cannot copy a FIFO pipe: ${t}`):new Error(`Unknown file: ${t}`)}async function $k(e,t,n,r,o){if(!t)return nd(e,n,r,o);if(o.overwrite)return await ve.unlink(r),nd(e,n,r,o);if(o.errorOnExist)throw new Error(`'${r}' already exists`)}async function nd(e,t,n,r){if(await ve.copyFile(t,n),r.preserveTimestamps){Dk(e.mode)&&await Nk(n,e.mode);let o=await ve.stat(t);await Ak(n,o.atime,o.mtime)}return ve.chmod(n,e.mode)}function Dk(e){return(e&128)===0}function Nk(e,t){return ve.chmod(e,t|128)}async function jk(e,t,n,r,o){t||await ve.mkdir(r),await Ik(await ve.opendir(n),async s=>{let i=jr.join(n,s.name),a=jr.join(r,s.name);if(await rd(i,a,o)){let{destStat:l}=await Fr.checkPaths(i,a,"copy",o);await od(l,i,a,o)}}),t||await ve.chmod(r,e.mode)}async function Fk(e,t,n,r){let o=await ve.readlink(t);if(r.dereference&&(o=jr.resolve(process.cwd(),o)),!e)return ve.symlink(o,n);let s=null;try{s=await ve.readlink(n)}catch(i){if(i.code==="EINVAL"||i.code==="UNKNOWN")return ve.symlink(o,n);throw i}if(r.dereference&&(s=jr.resolve(process.cwd(),s)),o!==s){if(Fr.isSrcSubdir(o,s))throw new Error(`Cannot copy '${o}' to a subdirectory of itself, '${s}'.`);if(Fr.isSrcSubdir(s,o))throw new Error(`Cannot overwrite '${s}' with '${o}'.`)}return await ve.unlink(n),ve.symlink(o,n)}sd.exports=Ok});var dd=V((AI,ud)=>{"use strict";var xe=Yn(),Mr=require("path"),Mk=ct().mkdirsSync,Lk=Di().utimesMillisSync,Lr=kn();function Uk(e,t,n){typeof n=="function"&&(n={filter:n}),n=n||{},n.clobber="clobber"in n?!!n.clobber:!0,n.overwrite="overwrite"in n?!!n.overwrite:n.clobber,n.preserveTimestamps&&process.arch==="ia32"&&process.emitWarning(`Using the preserveTimestamps option in 32-bit node is not recommended;
13
13
 
14
14
  see https://github.com/jprichardson/node-fs-extra/issues/269`,"Warning","fs-extra-WARN0002");let{srcStat:r,destStat:o}=Lr.checkPathsSync(e,t,"copy",n);if(Lr.checkParentPathsSync(e,r,t,"copy"),n.filter&&!n.filter(e,t))return;let s=Mr.dirname(t);return xe.existsSync(s)||Mk(s),ad(o,e,t,n)}function ad(e,t,n,r){let s=(r.dereference?xe.statSync:xe.lstatSync)(t);if(s.isDirectory())return Yk(s,e,t,n,r);if(s.isFile()||s.isCharacterDevice()||s.isBlockDevice())return Wk(s,e,t,n,r);if(s.isSymbolicLink())return zk(e,t,n,r);throw s.isSocket()?new Error(`Cannot copy a socket file: ${t}`):s.isFIFO()?new Error(`Cannot copy a FIFO pipe: ${t}`):new Error(`Unknown file: ${t}`)}function Wk(e,t,n,r,o){return t?Bk(e,n,r,o):cd(e,n,r,o)}function Bk(e,t,n,r){if(r.overwrite)return xe.unlinkSync(n),cd(e,t,n,r);if(r.errorOnExist)throw new Error(`'${n}' already exists`)}function cd(e,t,n,r){return xe.copyFileSync(t,n),r.preserveTimestamps&&Gk(e.mode,t,n),ji(n,e.mode)}function Gk(e,t,n){return Hk(e)&&qk(n,e),Vk(t,n)}function Hk(e){return(e&128)===0}function qk(e,t){return ji(e,t|128)}function ji(e,t){return xe.chmodSync(e,t)}function Vk(e,t){let n=xe.statSync(e);return Lk(t,n.atime,n.mtime)}function Yk(e,t,n,r,o){return t?ld(n,r,o):Kk(e.mode,n,r,o)}function Kk(e,t,n,r){return xe.mkdirSync(n),ld(t,n,r),ji(n,e)}function ld(e,t,n){let r=xe.opendirSync(e);try{let o;for(;(o=r.readSync())!==null;)Jk(o.name,e,t,n)}finally{r.closeSync()}}function Jk(e,t,n,r){let o=Mr.join(t,e),s=Mr.join(n,e);if(r.filter&&!r.filter(o,s))return;let{destStat:i}=Lr.checkPathsSync(o,s,"copy",r);return ad(i,o,s,r)}function zk(e,t,n,r){let o=xe.readlinkSync(t);if(r.dereference&&(o=Mr.resolve(process.cwd(),o)),e){let s;try{s=xe.readlinkSync(n)}catch(i){if(i.code==="EINVAL"||i.code==="UNKNOWN")return xe.symlinkSync(o,n);throw i}if(r.dereference&&(s=Mr.resolve(process.cwd(),s)),o!==s){if(Lr.isSrcSubdir(o,s))throw new Error(`Cannot copy '${o}' to a subdirectory of itself, '${s}'.`);if(Lr.isSrcSubdir(s,o))throw new Error(`Cannot overwrite '${s}' with '${o}'.`)}return Qk(o,n)}else return xe.symlinkSync(o,n)}function Qk(e,t){return xe.unlinkSync(t),xe.symlinkSync(e,t)}ud.exports=Uk});var Do=V((II,pd)=>{"use strict";var Xk=fe().fromPromise;pd.exports={copy:Xk(id()),copySync:dd()}});var Ur=V((OI,md)=>{"use strict";var fd=Yn(),Zk=fe().fromCallback;function eS(e,t){fd.rm(e,{recursive:!0,force:!0},t)}function tS(e){fd.rmSync(e,{recursive:!0,force:!0})}md.exports={remove:Zk(eS),removeSync:tS}});var vd=V(($I,Sd)=>{"use strict";var nS=fe().fromPromise,yd=Re(),wd=require("path"),_d=ct(),kd=Ur(),gd=nS(async function(t){let n;try{n=await yd.readdir(t)}catch{return _d.mkdirs(t)}return Promise.all(n.map(r=>kd.remove(wd.join(t,r))))});function hd(e){let t;try{t=yd.readdirSync(e)}catch{return _d.mkdirsSync(e)}t.forEach(n=>{n=wd.join(e,n),kd.removeSync(n)})}Sd.exports={emptyDirSync:hd,emptydirSync:hd,emptyDir:gd,emptydir:gd}});var Cd=V((DI,Td)=>{"use strict";var rS=fe().fromPromise,bd=require("path"),Nt=Re(),Ed=ct();async function oS(e){let t;try{t=await Nt.stat(e)}catch{}if(t&&t.isFile())return;let n=bd.dirname(e),r=null;try{r=await Nt.stat(n)}catch(o){if(o.code==="ENOENT"){await Ed.mkdirs(n),await Nt.writeFile(e,"");return}else throw o}r.isDirectory()?await Nt.writeFile(e,""):await Nt.readdir(n)}function sS(e){let t;try{t=Nt.statSync(e)}catch{}if(t&&t.isFile())return;let n=bd.dirname(e);try{Nt.statSync(n).isDirectory()||Nt.readdirSync(n)}catch(r){if(r&&r.code==="ENOENT")Ed.mkdirsSync(n);else throw r}Nt.writeFileSync(e,"")}Td.exports={createFile:rS(oS),createFileSync:sS}});var Id=V((NI,Ad)=>{"use strict";var iS=fe().fromPromise,Rd=require("path"),tn=Re(),xd=ct(),{pathExists:aS}=en(),{areIdentical:Pd}=kn();async function cS(e,t){let n;try{n=await tn.lstat(t)}catch{}let r;try{r=await tn.lstat(e)}catch(i){throw i.message=i.message.replace("lstat","ensureLink"),i}if(n&&Pd(r,n))return;let o=Rd.dirname(t);await aS(o)||await xd.mkdirs(o),await tn.link(e,t)}function lS(e,t){let n;try{n=tn.lstatSync(t)}catch{}try{let s=tn.lstatSync(e);if(n&&Pd(s,n))return}catch(s){throw s.message=s.message.replace("lstat","ensureLink"),s}let r=Rd.dirname(t);return tn.existsSync(r)||xd.mkdirsSync(r),tn.linkSync(e,t)}Ad.exports={createLink:iS(cS),createLinkSync:lS}});var $d=V((jI,Od)=>{"use strict";var nn=require("path"),Wr=Re(),{pathExists:uS}=en(),dS=fe().fromPromise;async function pS(e,t){if(nn.isAbsolute(e)){try{await Wr.lstat(e)}catch(s){throw s.message=s.message.replace("lstat","ensureSymlink"),s}return{toCwd:e,toDst:e}}let n=nn.dirname(t),r=nn.join(n,e);if(await uS(r))return{toCwd:r,toDst:e};try{await Wr.lstat(e)}catch(s){throw s.message=s.message.replace("lstat","ensureSymlink"),s}return{toCwd:e,toDst:nn.relative(n,e)}}function fS(e,t){if(nn.isAbsolute(e)){if(!Wr.existsSync(e))throw new Error("absolute srcpath does not exist");return{toCwd:e,toDst:e}}let n=nn.dirname(t),r=nn.join(n,e);if(Wr.existsSync(r))return{toCwd:r,toDst:e};if(!Wr.existsSync(e))throw new Error("relative srcpath does not exist");return{toCwd:e,toDst:nn.relative(n,e)}}Od.exports={symlinkPaths:dS(pS),symlinkPathsSync:fS}});var jd=V((FI,Nd)=>{"use strict";var Dd=Re(),mS=fe().fromPromise;async function gS(e,t){if(t)return t;let n;try{n=await Dd.lstat(e)}catch{return"file"}return n&&n.isDirectory()?"dir":"file"}function hS(e,t){if(t)return t;let n;try{n=Dd.lstatSync(e)}catch{return"file"}return n&&n.isDirectory()?"dir":"file"}Nd.exports={symlinkType:mS(gS),symlinkTypeSync:hS}});var Ud=V((MI,Ld)=>{"use strict";var yS=fe().fromPromise,Fd=require("path"),kt=Re(),{mkdirs:wS,mkdirsSync:_S}=ct(),{symlinkPaths:kS,symlinkPathsSync:SS}=$d(),{symlinkType:vS,symlinkTypeSync:bS}=jd(),{pathExists:ES}=en(),{areIdentical:Md}=kn();async function TS(e,t,n){let r;try{r=await kt.lstat(t)}catch{}if(r&&r.isSymbolicLink()){let[a,c]=await Promise.all([kt.stat(e),kt.stat(t)]);if(Md(a,c))return}let o=await kS(e,t);e=o.toDst;let s=await vS(o.toCwd,n),i=Fd.dirname(t);return await ES(i)||await wS(i),kt.symlink(e,t,s)}function CS(e,t,n){let r;try{r=kt.lstatSync(t)}catch{}if(r&&r.isSymbolicLink()){let a=kt.statSync(e),c=kt.statSync(t);if(Md(a,c))return}let o=SS(e,t);e=o.toDst,n=bS(o.toCwd,n);let s=Fd.dirname(t);return kt.existsSync(s)||_S(s),kt.symlinkSync(e,t,n)}Ld.exports={createSymlink:yS(TS),createSymlinkSync:CS}});var Kd=V((LI,Yd)=>{"use strict";var{createFile:Wd,createFileSync:Bd}=Cd(),{createLink:Gd,createLinkSync:Hd}=Id(),{createSymlink:qd,createSymlinkSync:Vd}=Ud();Yd.exports={createFile:Wd,createFileSync:Bd,ensureFile:Wd,ensureFileSync:Bd,createLink:Gd,createLinkSync:Hd,ensureLink:Gd,ensureLinkSync:Hd,createSymlink:qd,createSymlinkSync:Vd,ensureSymlink:qd,ensureSymlinkSync:Vd}});var No=V((UI,Jd)=>{function RS(e,{EOL:t=`
15
- `,finalEOL:n=!0,replacer:r=null,spaces:o}={}){let s=n?t:"";return JSON.stringify(e,r,o).replace(/\n/g,t)+s}function xS(e){return Buffer.isBuffer(e)&&(e=e.toString("utf8")),e.replace(/^\uFEFF/,"")}Jd.exports={stringify:RS,stripBom:xS}});var Zd=V((WI,Xd)=>{var zn;try{zn=Yn()}catch{zn=require("fs")}var jo=fe(),{stringify:zd,stripBom:Qd}=No();async function PS(e,t={}){typeof t=="string"&&(t={encoding:t});let n=t.fs||zn,r="throws"in t?t.throws:!0,o=await jo.fromCallback(n.readFile)(e,t);o=Qd(o);let s;try{s=JSON.parse(o,t?t.reviver:null)}catch(i){if(r)throw i.message=`${e}: ${i.message}`,i;return null}return s}var AS=jo.fromPromise(PS);function IS(e,t={}){typeof t=="string"&&(t={encoding:t});let n=t.fs||zn,r="throws"in t?t.throws:!0;try{let o=n.readFileSync(e,t);return o=Qd(o),JSON.parse(o,t.reviver)}catch(o){if(r)throw o.message=`${e}: ${o.message}`,o;return null}}async function OS(e,t,n={}){let r=n.fs||zn,o=zd(t,n);await jo.fromCallback(r.writeFile)(e,o,n)}var $S=jo.fromPromise(OS);function DS(e,t,n={}){let r=n.fs||zn,o=zd(t,n);return r.writeFileSync(e,o,n)}Xd.exports={readFile:AS,readFileSync:IS,writeFile:$S,writeFileSync:DS}});var tp=V((BI,ep)=>{"use strict";var Fo=Zd();ep.exports={readJson:Fo.readFile,readJsonSync:Fo.readFileSync,writeJson:Fo.writeFile,writeJsonSync:Fo.writeFileSync}});var Mo=V((GI,op)=>{"use strict";var NS=fe().fromPromise,Fi=Re(),np=require("path"),rp=ct(),jS=en().pathExists;async function FS(e,t,n="utf-8"){let r=np.dirname(e);return await jS(r)||await rp.mkdirs(r),Fi.writeFile(e,t,n)}function MS(e,...t){let n=np.dirname(e);Fi.existsSync(n)||rp.mkdirsSync(n),Fi.writeFileSync(e,...t)}op.exports={outputFile:NS(FS),outputFileSync:MS}});var ip=V((HI,sp)=>{"use strict";var{stringify:LS}=No(),{outputFile:US}=Mo();async function WS(e,t,n={}){let r=LS(t,n);await US(e,r,n)}sp.exports=WS});var cp=V((qI,ap)=>{"use strict";var{stringify:BS}=No(),{outputFileSync:GS}=Mo();function HS(e,t,n){let r=BS(t,n);GS(e,r,n)}ap.exports=HS});var up=V((VI,lp)=>{"use strict";var qS=fe().fromPromise,Pe=tp();Pe.outputJson=qS(ip());Pe.outputJsonSync=cp();Pe.outputJSON=Pe.outputJson;Pe.outputJSONSync=Pe.outputJsonSync;Pe.writeJSON=Pe.writeJson;Pe.writeJSONSync=Pe.writeJsonSync;Pe.readJSON=Pe.readJson;Pe.readJSONSync=Pe.readJsonSync;lp.exports=Pe});var gp=V((YI,mp)=>{"use strict";var VS=Re(),dp=require("path"),{copy:YS}=Do(),{remove:fp}=Ur(),{mkdirp:KS}=ct(),{pathExists:JS}=en(),pp=kn();async function zS(e,t,n={}){let r=n.overwrite||n.clobber||!1,{srcStat:o,isChangingCase:s=!1}=await pp.checkPaths(e,t,"move",n);await pp.checkParentPaths(e,o,t,"move");let i=dp.dirname(t);return dp.parse(i).root!==i&&await KS(i),QS(e,t,r,s)}async function QS(e,t,n,r){if(!r){if(n)await fp(t);else if(await JS(t))throw new Error("dest already exists.")}try{await VS.rename(e,t)}catch(o){if(o.code!=="EXDEV")throw o;await XS(e,t,n)}}async function XS(e,t,n){return await YS(e,t,{overwrite:n,errorOnExist:!0,preserveTimestamps:!0}),fp(e)}mp.exports=zS});var kp=V((KI,_p)=>{"use strict";var yp=Yn(),Li=require("path"),ZS=Do().copySync,wp=Ur().removeSync,ev=ct().mkdirpSync,hp=kn();function tv(e,t,n){n=n||{};let r=n.overwrite||n.clobber||!1,{srcStat:o,isChangingCase:s=!1}=hp.checkPathsSync(e,t,"move",n);return hp.checkParentPathsSync(e,o,t,"move"),nv(t)||ev(Li.dirname(t)),rv(e,t,r,s)}function nv(e){let t=Li.dirname(e);return Li.parse(t).root===t}function rv(e,t,n,r){if(r)return Mi(e,t,n);if(n)return wp(t),Mi(e,t,n);if(yp.existsSync(t))throw new Error("dest already exists.");return Mi(e,t,n)}function Mi(e,t,n){try{yp.renameSync(e,t)}catch(r){if(r.code!=="EXDEV")throw r;return ov(e,t,n)}}function ov(e,t,n){return ZS(e,t,{overwrite:n,errorOnExist:!0,preserveTimestamps:!0}),wp(e)}_p.exports=tv});var vp=V((JI,Sp)=>{"use strict";var sv=fe().fromPromise;Sp.exports={move:sv(gp()),moveSync:kp()}});var X=V((zI,bp)=>{"use strict";bp.exports={...Re(),...Do(),...vd(),...Kd(),...up(),...ct(),...vp(),...Mo(),...en(),...Ur()}});var Bi={};he(Bi,{archiveWorkflow:()=>Wi,clearCache:()=>uv,deleteWorkflow:()=>dv,findActiveWorkflow:()=>pv,getResumePoint:()=>lv,invalidateCache:()=>jt,listWorkflows:()=>oe,loadCheckpoint:()=>I,saveCheckpoint:()=>P});function Ui(e,t){return`${e}:${t}`}function av(e){return Date.now()-e.timestamp<iv}function Ep(e){if(e.current_stage==="idea"&&(e.current_stage="intent"),e.construction_bolts===void 0&&(e.construction_bolts={}),e.active_bolt_id===void 0&&(e.active_bolt_id=null),e.active_bolt_stage===void 0&&(e.active_bolt_stage=null),e.construction_bolts)for(let t of Object.values(e.construction_bolts))t.requires_bolts===void 0&&(t.requires_bolts=[]),t.enables_bolts===void 0&&(t.enables_bolts=[]),t.requires_units===void 0&&(t.requires_units=[]),t.blocked===void 0&&(t.blocked=!1);if(!(!e.construction_units||Array.isArray(e.construction_units)))for(let t of Object.values(e.construction_units)){if(t.stages||(t.stages={}),!t.stages["test-generation"]){let n=t.code_generation_status==="completed";t.stages["test-generation"]={status:n?"skipped":"not_started",artifact_path:null,completed_at:null,failure_count:0,last_error:null}}for(let n of Object.values(t.stages))n.failure_count===void 0&&(n.failure_count=0),n.last_error===void 0&&(n.last_error=null);t.quality_validation_status===void 0&&(t.quality_validation_status="not_started"),t.mutation_validation_status===void 0&&(t.mutation_validation_status="not_started"),t.traceability_status===void 0&&(t.traceability_status="not_started"),t.contract_validation_status===void 0&&(t.contract_validation_status="not_started"),t.coverage_status===void 0&&(t.coverage_status="not_started"),t.coverage_percentage===void 0&&(t.coverage_percentage=null),t.critical_gap_count===void 0&&(t.critical_gap_count=0),t.security_scan_status===void 0&&(t.security_scan_status="not_started"),t.security_findings_critical===void 0&&(t.security_findings_critical=0),t.security_findings_warning===void 0&&(t.security_findings_warning=0),t.security_findings_info===void 0&&(t.security_findings_info=0),t.feature_doc_status===void 0&&(t.feature_doc_status="not_started"),t.feature_doc_path===void 0&&(t.feature_doc_path=null),t.recreation_readiness_score===void 0&&(t.recreation_readiness_score=null),t.recreation_readiness_dimensions===void 0&&(t.recreation_readiness_dimensions=null),t.adr_count===void 0&&(t.adr_count=0),t.impact_scan_status===void 0&&(t.impact_scan_status="not_started")}}function lv(e){let t=e.active_bolt_id;if(t==null)return null;if(e.active_bolt_stage!=null)return{boltId:t,stage:e.active_bolt_stage};let n=e.construction_bolts?.[t];if(!n)return null;for(let r of cv){let o=n.stages?.[r];if(!o)return{boltId:t,stage:r};if(o.status!=="completed"&&o.status!=="skipped")return{boltId:t,stage:r}}return null}function uv(){Br.clear()}function jt(e,t){let n=Ui(e,t);Br.delete(n)}async function P(e,t){let n=(0,Ge.join)(e,St,t.workflow_id),r=(0,Ge.join)(n,Gr);try{if(t.updated_at=new Date().toISOString(),t.schema_version="3.1.0",await re.default.ensureDir(n),JSON.stringify(t).length>1e4){let a=JSON.stringify(t);await re.default.writeFile(r,a,"utf-8")}else await re.default.writeJson(r,t,{spaces:2});let i=Ui(e,t.workflow_id);Br.set(i,{checkpoint:structuredClone(t),timestamp:Date.now(),dirty:!1})}catch(o){let s=o;throw s.code==="ENOSPC"?(console.error("[Checkpoint] Failed to save checkpoint: Disk full"),console.error("[Checkpoint] Please free up disk space and try again."),console.error(`[Checkpoint] Attempted path: ${r}`),new Error("Failed to save checkpoint: Disk is full. Please free up space and retry.")):s.code==="EACCES"||s.code==="EPERM"?(console.error("[Checkpoint] Failed to save checkpoint: Permission denied"),console.error(`[Checkpoint] Path: ${r}`),new Error(`Failed to save checkpoint: Permission denied for ${r}`)):s.code==="EROFS"?(console.error("[Checkpoint] Failed to save checkpoint: Read-only filesystem"),console.error(`[Checkpoint] Path: ${r}`),new Error("Failed to save checkpoint: Filesystem is read-only")):(console.error("[Checkpoint] Failed to save checkpoint:",s.message),console.error(`[Checkpoint] Workflow ID: ${t.workflow_id}`),console.error(`[Checkpoint] Path: ${r}`),new Error(`Failed to save checkpoint for workflow ${t.workflow_id}: ${s.message}`))}}async function I(e,t){let n=Ui(e,t),r=Br.get(n);if(r&&av(r)){let s=structuredClone(r.checkpoint);return Ep(s),s}let o=(0,Ge.join)(e,St,t,Gr);try{let s=await re.default.readFile(o,"utf-8"),i=JSON.parse(s);return i.schema_version?i.schema_version!=="3.0.0"&&i.schema_version!=="3.1.0"?(console.warn(`[Checkpoint] Unknown checkpoint schema version ${i.schema_version} for workflow ${t}`),console.warn("[Checkpoint] Expected 3.0.0"),null):(i.current_stage==="idea"&&console.warn(`[Checkpoint] Migrating legacy 'idea' stage to 'intent' for workflow ${t}`),Ep(i),Br.set(n,{checkpoint:structuredClone(i),timestamp:Date.now(),dirty:!1}),i):(console.warn(`[Checkpoint] Checkpoint ${t} missing schema_version, treating as invalid`),console.warn("[Checkpoint] Checkpoint may be corrupt or from an older version"),console.warn(`[Checkpoint] Consider deleting: ${o}`),null)}catch(s){let i=s,a=i;return a.code==="ENOENT"?null:i.name==="SyntaxError"||i.message.includes("JSON")?(console.warn(`[Checkpoint] Corrupt checkpoint detected for workflow ${t}`),console.warn(`[Checkpoint] Path: ${o}`),console.warn(`[Checkpoint] Error: ${i.message}`),console.warn("[Checkpoint] To reset this workflow, delete the checkpoint file and start over"),null):a.code==="EACCES"||a.code==="EPERM"?(console.warn(`[Checkpoint] Permission denied reading checkpoint ${t}`),console.warn(`[Checkpoint] Path: ${o}`),null):(console.warn(`[Checkpoint] Failed to load checkpoint ${t}: ${i.message}`),console.warn(`[Checkpoint] Path: ${o}`),null)}}async function oe(e){let t=(0,Ge.join)(e,St);try{if(!await re.default.pathExists(t))return[];let r=await re.default.readdir(t,{withFileTypes:!0}),o=[];for(let s of r){if(!s.isDirectory()||s.name==="completed")continue;let i=(0,Ge.join)(t,s.name,Gr);if(await re.default.pathExists(i))try{let a=await re.default.readFile(i,"utf-8"),c=JSON.parse(a);c.workflow_id&&o.push(c.workflow_id)}catch{}}return o}catch(n){let r=n;return r.code==="EACCES"||r.code==="EPERM"?console.warn(`[Checkpoint] Permission denied reading ${t}`):console.warn(`[Checkpoint] Failed to list workflows: ${r.message}`),[]}}async function dv(e,t){let n=(0,Ge.join)(e,St,t);try{await re.default.remove(n)}catch(r){let o=r;if(o.code==="ENOENT")return;if(o.code==="EACCES"||o.code==="EPERM"){console.warn(`[Checkpoint] Permission denied deleting workflow ${t}`),console.warn(`[Checkpoint] Path: ${n}`),console.warn("[Checkpoint] Manual deletion may be required");return}console.warn(`[Checkpoint] Failed to delete workflow ${t}: ${o.message}`),console.warn(`[Checkpoint] Path: ${n}`)}}async function Wi(e,t){let n=await I(e,t);if(!n||n.status!=="complete")return;let r=(0,Ge.join)(e,St,t),o=(0,Ge.join)(e,St,"completed",t),s=(0,Ge.join)(o,Gr);if(await re.default.pathExists(s))try{let i=await re.default.readFile(s,"utf-8");if(JSON.parse(i).workflow_id===t){console.log(`[Checkpoint] Workflow ${t} already archived at ${o}`);return}}catch{await re.default.remove(o)}else await re.default.pathExists(o)&&await re.default.remove(o);n.archived_at=new Date().toISOString(),n.archived_path=`${St}/completed/${t}`,await P(e,n);try{await re.default.move(r,o,{overwrite:!1}),jt(e,t),console.log(`[Checkpoint] Workflow archived to ${St}/completed/${t}/`)}catch(i){let a=i,c=a.code==="EBUSY"&&process.platform==="win32"?" \u2014 try closing open files in the workflow directory":"";console.warn(`[Checkpoint] Failed to move workflow folder (non-fatal): ${a.message}${c}`)}try{let i=(0,Ge.join)(e,".olympus","plans",`${t}-plan.md`);if(await re.default.pathExists(i)){let a=`
15
+ `,finalEOL:n=!0,replacer:r=null,spaces:o}={}){let s=n?t:"";return JSON.stringify(e,r,o).replace(/\n/g,t)+s}function xS(e){return Buffer.isBuffer(e)&&(e=e.toString("utf8")),e.replace(/^\uFEFF/,"")}Jd.exports={stringify:RS,stripBom:xS}});var Zd=V((WI,Xd)=>{var zn;try{zn=Yn()}catch{zn=require("fs")}var jo=fe(),{stringify:zd,stripBom:Qd}=No();async function PS(e,t={}){typeof t=="string"&&(t={encoding:t});let n=t.fs||zn,r="throws"in t?t.throws:!0,o=await jo.fromCallback(n.readFile)(e,t);o=Qd(o);let s;try{s=JSON.parse(o,t?t.reviver:null)}catch(i){if(r)throw i.message=`${e}: ${i.message}`,i;return null}return s}var AS=jo.fromPromise(PS);function IS(e,t={}){typeof t=="string"&&(t={encoding:t});let n=t.fs||zn,r="throws"in t?t.throws:!0;try{let o=n.readFileSync(e,t);return o=Qd(o),JSON.parse(o,t.reviver)}catch(o){if(r)throw o.message=`${e}: ${o.message}`,o;return null}}async function OS(e,t,n={}){let r=n.fs||zn,o=zd(t,n);await jo.fromCallback(r.writeFile)(e,o,n)}var $S=jo.fromPromise(OS);function DS(e,t,n={}){let r=n.fs||zn,o=zd(t,n);return r.writeFileSync(e,o,n)}Xd.exports={readFile:AS,readFileSync:IS,writeFile:$S,writeFileSync:DS}});var tp=V((BI,ep)=>{"use strict";var Fo=Zd();ep.exports={readJson:Fo.readFile,readJsonSync:Fo.readFileSync,writeJson:Fo.writeFile,writeJsonSync:Fo.writeFileSync}});var Mo=V((GI,op)=>{"use strict";var NS=fe().fromPromise,Fi=Re(),np=require("path"),rp=ct(),jS=en().pathExists;async function FS(e,t,n="utf-8"){let r=np.dirname(e);return await jS(r)||await rp.mkdirs(r),Fi.writeFile(e,t,n)}function MS(e,...t){let n=np.dirname(e);Fi.existsSync(n)||rp.mkdirsSync(n),Fi.writeFileSync(e,...t)}op.exports={outputFile:NS(FS),outputFileSync:MS}});var ip=V((HI,sp)=>{"use strict";var{stringify:LS}=No(),{outputFile:US}=Mo();async function WS(e,t,n={}){let r=LS(t,n);await US(e,r,n)}sp.exports=WS});var cp=V((qI,ap)=>{"use strict";var{stringify:BS}=No(),{outputFileSync:GS}=Mo();function HS(e,t,n){let r=BS(t,n);GS(e,r,n)}ap.exports=HS});var up=V((VI,lp)=>{"use strict";var qS=fe().fromPromise,Pe=tp();Pe.outputJson=qS(ip());Pe.outputJsonSync=cp();Pe.outputJSON=Pe.outputJson;Pe.outputJSONSync=Pe.outputJsonSync;Pe.writeJSON=Pe.writeJson;Pe.writeJSONSync=Pe.writeJsonSync;Pe.readJSON=Pe.readJson;Pe.readJSONSync=Pe.readJsonSync;lp.exports=Pe});var gp=V((YI,mp)=>{"use strict";var VS=Re(),dp=require("path"),{copy:YS}=Do(),{remove:fp}=Ur(),{mkdirp:KS}=ct(),{pathExists:JS}=en(),pp=kn();async function zS(e,t,n={}){let r=n.overwrite||n.clobber||!1,{srcStat:o,isChangingCase:s=!1}=await pp.checkPaths(e,t,"move",n);await pp.checkParentPaths(e,o,t,"move");let i=dp.dirname(t);return dp.parse(i).root!==i&&await KS(i),QS(e,t,r,s)}async function QS(e,t,n,r){if(!r){if(n)await fp(t);else if(await JS(t))throw new Error("dest already exists.")}try{await VS.rename(e,t)}catch(o){if(o.code!=="EXDEV")throw o;await XS(e,t,n)}}async function XS(e,t,n){return await YS(e,t,{overwrite:n,errorOnExist:!0,preserveTimestamps:!0}),fp(e)}mp.exports=zS});var kp=V((KI,_p)=>{"use strict";var yp=Yn(),Li=require("path"),ZS=Do().copySync,wp=Ur().removeSync,ev=ct().mkdirpSync,hp=kn();function tv(e,t,n){n=n||{};let r=n.overwrite||n.clobber||!1,{srcStat:o,isChangingCase:s=!1}=hp.checkPathsSync(e,t,"move",n);return hp.checkParentPathsSync(e,o,t,"move"),nv(t)||ev(Li.dirname(t)),rv(e,t,r,s)}function nv(e){let t=Li.dirname(e);return Li.parse(t).root===t}function rv(e,t,n,r){if(r)return Mi(e,t,n);if(n)return wp(t),Mi(e,t,n);if(yp.existsSync(t))throw new Error("dest already exists.");return Mi(e,t,n)}function Mi(e,t,n){try{yp.renameSync(e,t)}catch(r){if(r.code!=="EXDEV")throw r;return ov(e,t,n)}}function ov(e,t,n){return ZS(e,t,{overwrite:n,errorOnExist:!0,preserveTimestamps:!0}),wp(e)}_p.exports=tv});var vp=V((JI,Sp)=>{"use strict";var sv=fe().fromPromise;Sp.exports={move:sv(gp()),moveSync:kp()}});var X=V((zI,bp)=>{"use strict";bp.exports={...Re(),...Do(),...vd(),...Kd(),...up(),...ct(),...vp(),...Mo(),...en(),...Ur()}});var Bi={};he(Bi,{archiveWorkflow:()=>Wi,clearCache:()=>uv,deleteWorkflow:()=>dv,findActiveWorkflow:()=>pv,getResumePoint:()=>lv,invalidateCache:()=>jt,listWorkflows:()=>oe,loadCheckpoint:()=>A,saveCheckpoint:()=>P});function Ui(e,t){return`${e}:${t}`}function av(e){return Date.now()-e.timestamp<iv}function Ep(e){if(e.current_stage==="idea"&&(e.current_stage="intent"),e.construction_bolts===void 0&&(e.construction_bolts={}),e.active_bolt_id===void 0&&(e.active_bolt_id=null),e.active_bolt_stage===void 0&&(e.active_bolt_stage=null),e.construction_bolts)for(let t of Object.values(e.construction_bolts))t.requires_bolts===void 0&&(t.requires_bolts=[]),t.enables_bolts===void 0&&(t.enables_bolts=[]),t.requires_units===void 0&&(t.requires_units=[]),t.blocked===void 0&&(t.blocked=!1);if(!(!e.construction_units||Array.isArray(e.construction_units)))for(let t of Object.values(e.construction_units)){if(t.stages||(t.stages={}),!t.stages["test-generation"]){let n=t.code_generation_status==="completed";t.stages["test-generation"]={status:n?"skipped":"not_started",artifact_path:null,completed_at:null,failure_count:0,last_error:null}}for(let n of Object.values(t.stages))n.failure_count===void 0&&(n.failure_count=0),n.last_error===void 0&&(n.last_error=null);t.quality_validation_status===void 0&&(t.quality_validation_status="not_started"),t.mutation_validation_status===void 0&&(t.mutation_validation_status="not_started"),t.traceability_status===void 0&&(t.traceability_status="not_started"),t.contract_validation_status===void 0&&(t.contract_validation_status="not_started"),t.coverage_status===void 0&&(t.coverage_status="not_started"),t.coverage_percentage===void 0&&(t.coverage_percentage=null),t.critical_gap_count===void 0&&(t.critical_gap_count=0),t.security_scan_status===void 0&&(t.security_scan_status="not_started"),t.security_findings_critical===void 0&&(t.security_findings_critical=0),t.security_findings_warning===void 0&&(t.security_findings_warning=0),t.security_findings_info===void 0&&(t.security_findings_info=0),t.feature_doc_status===void 0&&(t.feature_doc_status="not_started"),t.feature_doc_path===void 0&&(t.feature_doc_path=null),t.recreation_readiness_score===void 0&&(t.recreation_readiness_score=null),t.recreation_readiness_dimensions===void 0&&(t.recreation_readiness_dimensions=null),t.adr_count===void 0&&(t.adr_count=0),t.impact_scan_status===void 0&&(t.impact_scan_status="not_started")}}function lv(e){let t=e.active_bolt_id;if(t==null)return null;if(e.active_bolt_stage!=null)return{boltId:t,stage:e.active_bolt_stage};let n=e.construction_bolts?.[t];if(!n)return null;for(let r of cv){let o=n.stages?.[r];if(!o)return{boltId:t,stage:r};if(o.status!=="completed"&&o.status!=="skipped")return{boltId:t,stage:r}}return null}function uv(){Br.clear()}function jt(e,t){let n=Ui(e,t);Br.delete(n)}async function P(e,t){let n=(0,Ge.join)(e,St,t.workflow_id),r=(0,Ge.join)(n,Gr);try{if(t.updated_at=new Date().toISOString(),t.schema_version="3.1.0",await re.default.ensureDir(n),JSON.stringify(t).length>1e4){let a=JSON.stringify(t);await re.default.writeFile(r,a,"utf-8")}else await re.default.writeJson(r,t,{spaces:2});let i=Ui(e,t.workflow_id);Br.set(i,{checkpoint:structuredClone(t),timestamp:Date.now(),dirty:!1})}catch(o){let s=o;throw s.code==="ENOSPC"?(console.error("[Checkpoint] Failed to save checkpoint: Disk full"),console.error("[Checkpoint] Please free up disk space and try again."),console.error(`[Checkpoint] Attempted path: ${r}`),new Error("Failed to save checkpoint: Disk is full. Please free up space and retry.")):s.code==="EACCES"||s.code==="EPERM"?(console.error("[Checkpoint] Failed to save checkpoint: Permission denied"),console.error(`[Checkpoint] Path: ${r}`),new Error(`Failed to save checkpoint: Permission denied for ${r}`)):s.code==="EROFS"?(console.error("[Checkpoint] Failed to save checkpoint: Read-only filesystem"),console.error(`[Checkpoint] Path: ${r}`),new Error("Failed to save checkpoint: Filesystem is read-only")):(console.error("[Checkpoint] Failed to save checkpoint:",s.message),console.error(`[Checkpoint] Workflow ID: ${t.workflow_id}`),console.error(`[Checkpoint] Path: ${r}`),new Error(`Failed to save checkpoint for workflow ${t.workflow_id}: ${s.message}`))}}async function A(e,t){let n=Ui(e,t),r=Br.get(n);if(r&&av(r)){let s=structuredClone(r.checkpoint);return Ep(s),s}let o=(0,Ge.join)(e,St,t,Gr);try{let s=await re.default.readFile(o,"utf-8"),i=JSON.parse(s);return i.schema_version?i.schema_version!=="3.0.0"&&i.schema_version!=="3.1.0"?(console.warn(`[Checkpoint] Unknown checkpoint schema version ${i.schema_version} for workflow ${t}`),console.warn("[Checkpoint] Expected 3.0.0"),null):(i.current_stage==="idea"&&console.warn(`[Checkpoint] Migrating legacy 'idea' stage to 'intent' for workflow ${t}`),Ep(i),Br.set(n,{checkpoint:structuredClone(i),timestamp:Date.now(),dirty:!1}),i):(console.warn(`[Checkpoint] Checkpoint ${t} missing schema_version, treating as invalid`),console.warn("[Checkpoint] Checkpoint may be corrupt or from an older version"),console.warn(`[Checkpoint] Consider deleting: ${o}`),null)}catch(s){let i=s,a=i;return a.code==="ENOENT"?null:i.name==="SyntaxError"||i.message.includes("JSON")?(console.warn(`[Checkpoint] Corrupt checkpoint detected for workflow ${t}`),console.warn(`[Checkpoint] Path: ${o}`),console.warn(`[Checkpoint] Error: ${i.message}`),console.warn("[Checkpoint] To reset this workflow, delete the checkpoint file and start over"),null):a.code==="EACCES"||a.code==="EPERM"?(console.warn(`[Checkpoint] Permission denied reading checkpoint ${t}`),console.warn(`[Checkpoint] Path: ${o}`),null):(console.warn(`[Checkpoint] Failed to load checkpoint ${t}: ${i.message}`),console.warn(`[Checkpoint] Path: ${o}`),null)}}async function oe(e){let t=(0,Ge.join)(e,St);try{if(!await re.default.pathExists(t))return[];let r=await re.default.readdir(t,{withFileTypes:!0}),o=[];for(let s of r){if(!s.isDirectory()||s.name==="completed")continue;let i=(0,Ge.join)(t,s.name,Gr);if(await re.default.pathExists(i))try{let a=await re.default.readFile(i,"utf-8"),c=JSON.parse(a);c.workflow_id&&o.push(c.workflow_id)}catch{}}return o}catch(n){let r=n;return r.code==="EACCES"||r.code==="EPERM"?console.warn(`[Checkpoint] Permission denied reading ${t}`):console.warn(`[Checkpoint] Failed to list workflows: ${r.message}`),[]}}async function dv(e,t){let n=(0,Ge.join)(e,St,t);try{await re.default.remove(n)}catch(r){let o=r;if(o.code==="ENOENT")return;if(o.code==="EACCES"||o.code==="EPERM"){console.warn(`[Checkpoint] Permission denied deleting workflow ${t}`),console.warn(`[Checkpoint] Path: ${n}`),console.warn("[Checkpoint] Manual deletion may be required");return}console.warn(`[Checkpoint] Failed to delete workflow ${t}: ${o.message}`),console.warn(`[Checkpoint] Path: ${n}`)}}async function Wi(e,t){let n=await A(e,t);if(!n||n.status!=="complete")return;let r=(0,Ge.join)(e,St,t),o=(0,Ge.join)(e,St,"completed",t),s=(0,Ge.join)(o,Gr);if(await re.default.pathExists(s))try{let i=await re.default.readFile(s,"utf-8");if(JSON.parse(i).workflow_id===t){console.log(`[Checkpoint] Workflow ${t} already archived at ${o}`);return}}catch{await re.default.remove(o)}else await re.default.pathExists(o)&&await re.default.remove(o);n.archived_at=new Date().toISOString(),n.archived_path=`${St}/completed/${t}`,await P(e,n);try{await re.default.move(r,o,{overwrite:!1}),jt(e,t),console.log(`[Checkpoint] Workflow archived to ${St}/completed/${t}/`)}catch(i){let a=i,c=a.code==="EBUSY"&&process.platform==="win32"?" \u2014 try closing open files in the workflow directory":"";console.warn(`[Checkpoint] Failed to move workflow folder (non-fatal): ${a.message}${c}`)}try{let i=(0,Ge.join)(e,".olympus","plans",`${t}-plan.md`);if(await re.default.pathExists(i)){let a=`
16
16
 
17
17
  ---
18
18
  _This workflow was archived to \`${St}/completed/${t}/\` on ${n.archived_at}_
@@ -238,7 +238,7 @@ ${S}`);T!==b&&await dt.writeFile(h,T,"utf-8")}catch{}if(w&&l)try{let h=await Ta(
238
238
  **AGENTS.md**: ${b}
239
239
 
240
240
  ---
241
- `)}catch{}Ft(o,"discovery","blocked");let _=await I(t,n);return _&&(_.current_phase="discovery",_.phases.discovery.status="blocked",p&&g?_.deepinit_status="suggested":p?_.deepinit_status="pre-existing":m?_.deepinit_status="suggested":c?_.deepinit_status="skipped":_.deepinit_status="not_applicable",await P(t,_)),{completed:!1,gateRequired:!0,artifactsGenerated:i,sourceFileCount:a,agentsMdDetected:p,agentsMdFileCount:f,agentsMdStale:w,deepinitSuggested:m,deepinitUpdateMode:g,architectureModelGenerated:d,designSystem:u,brownfieldData:l}}catch(s){throw console.error("[Discovery] Error executing discovery phase:",s),new Error(`Discovery phase failed: ${s instanceof Error?s.message:String(s)}`)}}var Ze,dt,ts,SE,vE,ns=U(()=>{"use strict";Ze=v(require("path"),1),dt=v(X(),1);Xi();Z();ce();va();Xf();os();tm();im();Jr();cm();ts=[".ts",".tsx",".js",".jsx",".py",".go",".rs",".java",".c",".cpp",".cs",".rb",".swift",".kt",".css",".scss",".html",".vue",".svelte"],SE=new Set(["node_modules",".git","dist","build",".olympus","aidlc-docs",".next","__pycache__",".venv","vendor","target"]),vE=["analysis-plan","current-state-analysis","regression-baseline","change-impact","static-model","dynamic-model","workspace-scan"]});var gm={};he(gm,{PATHWAY_DISPLAY_NAMES:()=>pm,WORKFLOW_ROUTING_FORMAT_INSTRUCTIONS:()=>ME,applyPathwayOverride:()=>fm,buildPathwayAnnouncement:()=>AE,detectPathway:()=>Pa,generatePlanVisualization:()=>mm,generateWorkflowRouting:()=>Ia,getPathwayDisplayName:()=>Aa,isPhaseIncluded:()=>cs,isStageIncluded:()=>Oa,loadPathwayBehaviors:()=>RE,loadWorkflowRouting:()=>Xr,recordPathwayOverride:()=>IE,writeWorkflowRoutingArtifact:()=>as});async function RE(e){if(!CE.includes(e))return null;let t=Gt.join(dm.homedir(),".claude","olympus","rules","common","pathway-behaviors.json"),n=Gt.join(process.cwd(),"resources","rules","common","pathway-behaviors.json"),r=s=>sr.readFile(s,"utf-8").catch(()=>null),o=await r(t)??await r(n);if(o===null)return null;try{let i=JSON.parse(o)[e];return i?{rules:i.rules,qualityGateChecklist:i.quality_gate_checklist}:null}catch{return console.error("[PathwayBehaviors] Failed to parse pathway-behaviors.json"),null}}async function Pa(e,t){let{isBrownfield:n}=await Rn(e);if(!n)return"greenfield";let r=t.toLowerCase();for(let{pathway:o,keywords:s}of xE)for(let i of s)if(r.includes(i))return o;return"brownfield-enhancement"}function Aa(e){return pm[e]??e}function AE(e,t,n){return{detectedPathway:e,displayName:Aa(e),depthScore:t,sourceFileCount:n,rationale:PE[e]}}function fm(e,t){let n=t.pathwayType??e.detectedPathway,r=t.depthScore??e.depthScore,o=t.pathwayType!=null||t.depthScore!=null?` (overridden by user: pathway=${t.pathwayType??"unchanged"}, depthScore=${t.depthScore??"unchanged"})`:"";return{detectedPathway:n,displayName:Aa(n),depthScore:r,sourceFileCount:e.sourceFileCount,rationale:e.rationale+o}}function IE(e,t,n){let r=fm(t,n);return{original_pathway_type:t.detectedPathway,original_depth_score:t.depthScore,pathway_override:n.pathwayType,depth_override:n.depthScore,pathway_type:r.detectedPathway,depth_score:r.depthScore}}function OE(e){switch(e){case"greenfield":return{discovery:!1,inception:!0,construction:!0,operations:!0};case"brownfield-enhancement":case"brownfield-refactor":case"optimization":return{discovery:!0,inception:!0,construction:!0,operations:!0};case"bugfix":return{discovery:!1,inception:!1,construction:!0,operations:!0}}}function ss(e,t,n){if(!n)switch(e){case"discovery":return t==="greenfield"?"Greenfield project \u2014 no existing codebase to analyse":t==="bugfix"?"Bug fixes skip discovery to reduce overhead":"Not applicable for this pathway";case"inception":return t==="bugfix"?"Bug fixes proceed directly to construction":"Not applicable for this pathway";default:return"Skipped for this pathway"}switch(e){case"discovery":return"Brownfield project requires existing codebase analysis";case"inception":return"Requirements and depth assessment needed before construction";case"construction":return"Core implementation phase";case"operations":return"Deployment and monitoring artifacts required"}}function $E(e,t){switch(e){case"discovery":return["brownfield-scan","analysis"];case"inception":return["workspace-detection","reverse-engineering","requirements-analysis","workflow-planning","units-generation","user-stories","bolt-planning"];case"construction":return t==="bugfix"?["bolt-execution"]:["unit-decomposition","bolt-execution"];case"operations":return["deployment","monitoring"]}}function DE(e,t,n,r){return e==="construction"&&t==="unit-decomposition"&&r==="minimal"?"Skipped \u2014 minimal depth does not require unit decomposition":{"discovery:brownfield-scan":"Scan existing source files for architectural understanding","discovery:analysis":"Analyse change impact and regression risk","inception:intent":"Capture structured problem statement and success criteria","inception:depth-assessment":"Score 6 factors to determine workflow depth","inception:requirements":"Classify non-functional requirements and constraints","inception:workspace-detection":"Auto-detect greenfield/brownfield and determine pathway type","inception:reverse-engineering":"Reverse-engineer existing codebase architecture (brownfield only)","inception:requirements-analysis":"Structured Q&A to capture functional and non-functional requirements","inception:user-stories":"Generate user personas and stories with Given/When/Then acceptance criteria","inception:workflow-planning":"Generate execution plan with Mermaid visualization and live checkboxes","inception:units-generation":"Define units of work with inter-unit dependencies and story mapping","inception:bolt-planning":"Decompose units into executable bolts with dependency tracking","construction:unit-decomposition":"Break intent into implementable units","construction:bolt-execution":"Execute implementation bolts with validation gates","operations:deployment":"Generate deployment guide and release notes","operations:monitoring":"Configure monitoring, runbook, and observability"}[`${e}:${t}`]??"Standard stage for this phase"}async function Ia(e){let{pathwayType:t,depthAssessment:n,sourceFileCount:r}=e,{recommended_depth:o,total_score:s,risk_tier:i}=n,a=OE(t),c={discovery:{included:a.discovery,rationale:ss("discovery",t,a.discovery)},inception:{included:a.inception,rationale:ss("inception",t,a.inception)},construction:{included:a.construction,rationale:ss("construction",t,a.construction)},operations:{included:a.operations,rationale:ss("operations",t,a.operations)}},l=["discovery","inception","construction","operations"],u=[];for(let f of l)if(a[f])for(let m of $E(f,t)){let g=f==="construction"&&m==="unit-decomposition",y=f==="inception"&&m==="reverse-engineering",w=f==="inception"&&m==="user-stories",_=f==="inception"&&m==="units-generation",h=!0;g&&o==="minimal"&&(h=!1),y&&t==="greenfield"&&(h=!1),w&&(t==="bugfix"||t==="optimization")&&(h=!1),_&&o==="minimal"&&(h=!1),u.push({phase:f,stage:m,included:h,rationale:DE(f,m,t,o)})}let d;if(t==="bugfix")d=1;else switch(o){case"minimal":d=1;break;case"standard":d=Math.min(10,Math.max(1,Math.ceil(r/50)));break;case"comprehensive":d=Math.min(20,Math.max(2,Math.ceil(r/25)));break}let p=s<=10?"LOW":s<=20?"MEDIUM":"HIGH";return{pathway:t,risk_assessment:p,risk_tier:i.tier,phases:c,stages:u,estimated_bolts:d,estimated_depth:o,generated_at:new Date().toISOString(),approved_at:null,approved_by:null}}function NE(e,t){let r=["discovery","inception","construction","operations"].map(s=>{let{included:i,rationale:a}=t.phases[s];return`| ${s} | ${i?"yes":"no"} | ${a} |`}).join(`
241
+ `)}catch{}Ft(o,"discovery","blocked");let _=await A(t,n);return _&&(_.current_phase="discovery",_.phases.discovery.status="blocked",p&&g?_.deepinit_status="suggested":p?_.deepinit_status="pre-existing":m?_.deepinit_status="suggested":c?_.deepinit_status="skipped":_.deepinit_status="not_applicable",await P(t,_)),{completed:!1,gateRequired:!0,artifactsGenerated:i,sourceFileCount:a,agentsMdDetected:p,agentsMdFileCount:f,agentsMdStale:w,deepinitSuggested:m,deepinitUpdateMode:g,architectureModelGenerated:d,designSystem:u,brownfieldData:l}}catch(s){throw console.error("[Discovery] Error executing discovery phase:",s),new Error(`Discovery phase failed: ${s instanceof Error?s.message:String(s)}`)}}var Ze,dt,ts,SE,vE,ns=U(()=>{"use strict";Ze=v(require("path"),1),dt=v(X(),1);Xi();Z();ce();va();Xf();os();tm();im();Jr();cm();ts=[".ts",".tsx",".js",".jsx",".py",".go",".rs",".java",".c",".cpp",".cs",".rb",".swift",".kt",".css",".scss",".html",".vue",".svelte"],SE=new Set(["node_modules",".git","dist","build",".olympus","aidlc-docs",".next","__pycache__",".venv","vendor","target"]),vE=["analysis-plan","current-state-analysis","regression-baseline","change-impact","static-model","dynamic-model","workspace-scan"]});var gm={};he(gm,{PATHWAY_DISPLAY_NAMES:()=>pm,WORKFLOW_ROUTING_FORMAT_INSTRUCTIONS:()=>ME,applyPathwayOverride:()=>fm,buildPathwayAnnouncement:()=>AE,detectPathway:()=>Pa,generatePlanVisualization:()=>mm,generateWorkflowRouting:()=>Ia,getPathwayDisplayName:()=>Aa,isPhaseIncluded:()=>cs,isStageIncluded:()=>Oa,loadPathwayBehaviors:()=>RE,loadWorkflowRouting:()=>Xr,recordPathwayOverride:()=>IE,writeWorkflowRoutingArtifact:()=>as});async function RE(e){if(!CE.includes(e))return null;let t=Gt.join(dm.homedir(),".claude","olympus","rules","common","pathway-behaviors.json"),n=Gt.join(process.cwd(),"resources","rules","common","pathway-behaviors.json"),r=s=>sr.readFile(s,"utf-8").catch(()=>null),o=await r(t)??await r(n);if(o===null)return null;try{let i=JSON.parse(o)[e];return i?{rules:i.rules,qualityGateChecklist:i.quality_gate_checklist}:null}catch{return console.error("[PathwayBehaviors] Failed to parse pathway-behaviors.json"),null}}async function Pa(e,t){let{isBrownfield:n}=await Rn(e);if(!n)return"greenfield";let r=t.toLowerCase();for(let{pathway:o,keywords:s}of xE)for(let i of s)if(r.includes(i))return o;return"brownfield-enhancement"}function Aa(e){return pm[e]??e}function AE(e,t,n){return{detectedPathway:e,displayName:Aa(e),depthScore:t,sourceFileCount:n,rationale:PE[e]}}function fm(e,t){let n=t.pathwayType??e.detectedPathway,r=t.depthScore??e.depthScore,o=t.pathwayType!=null||t.depthScore!=null?` (overridden by user: pathway=${t.pathwayType??"unchanged"}, depthScore=${t.depthScore??"unchanged"})`:"";return{detectedPathway:n,displayName:Aa(n),depthScore:r,sourceFileCount:e.sourceFileCount,rationale:e.rationale+o}}function IE(e,t,n){let r=fm(t,n);return{original_pathway_type:t.detectedPathway,original_depth_score:t.depthScore,pathway_override:n.pathwayType,depth_override:n.depthScore,pathway_type:r.detectedPathway,depth_score:r.depthScore}}function OE(e){switch(e){case"greenfield":return{discovery:!1,inception:!0,construction:!0,operations:!0};case"brownfield-enhancement":case"brownfield-refactor":case"optimization":return{discovery:!0,inception:!0,construction:!0,operations:!0};case"bugfix":return{discovery:!1,inception:!1,construction:!0,operations:!0}}}function ss(e,t,n){if(!n)switch(e){case"discovery":return t==="greenfield"?"Greenfield project \u2014 no existing codebase to analyse":t==="bugfix"?"Bug fixes skip discovery to reduce overhead":"Not applicable for this pathway";case"inception":return t==="bugfix"?"Bug fixes proceed directly to construction":"Not applicable for this pathway";default:return"Skipped for this pathway"}switch(e){case"discovery":return"Brownfield project requires existing codebase analysis";case"inception":return"Requirements and depth assessment needed before construction";case"construction":return"Core implementation phase";case"operations":return"Deployment and monitoring artifacts required"}}function $E(e,t){switch(e){case"discovery":return["brownfield-scan","analysis"];case"inception":return["workspace-detection","reverse-engineering","requirements-analysis","workflow-planning","units-generation","user-stories","bolt-planning"];case"construction":return t==="bugfix"?["bolt-execution"]:["unit-decomposition","bolt-execution"];case"operations":return["deployment","monitoring"]}}function DE(e,t,n,r){return e==="construction"&&t==="unit-decomposition"&&r==="minimal"?"Skipped \u2014 minimal depth does not require unit decomposition":{"discovery:brownfield-scan":"Scan existing source files for architectural understanding","discovery:analysis":"Analyse change impact and regression risk","inception:intent":"Capture structured problem statement and success criteria","inception:depth-assessment":"Score 6 factors to determine workflow depth","inception:requirements":"Classify non-functional requirements and constraints","inception:workspace-detection":"Auto-detect greenfield/brownfield and determine pathway type","inception:reverse-engineering":"Reverse-engineer existing codebase architecture (brownfield only)","inception:requirements-analysis":"Structured Q&A to capture functional and non-functional requirements","inception:user-stories":"Generate user personas and stories with Given/When/Then acceptance criteria","inception:workflow-planning":"Generate execution plan with Mermaid visualization and live checkboxes","inception:units-generation":"Define units of work with inter-unit dependencies and story mapping","inception:bolt-planning":"Decompose units into executable bolts with dependency tracking","construction:unit-decomposition":"Break intent into implementable units","construction:bolt-execution":"Execute implementation bolts with validation gates","operations:deployment":"Generate deployment guide and release notes","operations:monitoring":"Configure monitoring, runbook, and observability"}[`${e}:${t}`]??"Standard stage for this phase"}async function Ia(e){let{pathwayType:t,depthAssessment:n,sourceFileCount:r}=e,{recommended_depth:o,total_score:s,risk_tier:i}=n,a=OE(t),c={discovery:{included:a.discovery,rationale:ss("discovery",t,a.discovery)},inception:{included:a.inception,rationale:ss("inception",t,a.inception)},construction:{included:a.construction,rationale:ss("construction",t,a.construction)},operations:{included:a.operations,rationale:ss("operations",t,a.operations)}},l=["discovery","inception","construction","operations"],u=[];for(let f of l)if(a[f])for(let m of $E(f,t)){let g=f==="construction"&&m==="unit-decomposition",y=f==="inception"&&m==="reverse-engineering",w=f==="inception"&&m==="user-stories",_=f==="inception"&&m==="units-generation",h=!0;g&&o==="minimal"&&(h=!1),y&&t==="greenfield"&&(h=!1),w&&(t==="bugfix"||t==="optimization")&&(h=!1),_&&o==="minimal"&&(h=!1),u.push({phase:f,stage:m,included:h,rationale:DE(f,m,t,o)})}let d;if(t==="bugfix")d=1;else switch(o){case"minimal":d=1;break;case"standard":d=Math.min(10,Math.max(1,Math.ceil(r/50)));break;case"comprehensive":d=Math.min(20,Math.max(2,Math.ceil(r/25)));break}let p=s<=10?"LOW":s<=20?"MEDIUM":"HIGH";return{pathway:t,risk_assessment:p,risk_tier:i.tier,phases:c,stages:u,estimated_bolts:d,estimated_depth:o,generated_at:new Date().toISOString(),approved_at:null,approved_by:null}}function NE(e,t){let r=["discovery","inception","construction","operations"].map(s=>{let{included:i,rationale:a}=t.phases[s];return`| ${s} | ${i?"yes":"no"} | ${a} |`}).join(`
242
242
  `),o=t.stages.map((s,i)=>`| ${i+1} | ${s.phase} | ${s.stage} | ${s.included?"yes":"no"} | ${s.rationale} |`).join(`
243
243
  `);return`# Workflow Routing: ${e}
244
244
 
@@ -309,19 +309,19 @@ Generate code for this unit according to the spec above.
309
309
  - Create/modify files listed in "Target Files"
310
310
  - Write tests per "Test Requirements"
311
311
  - Meet all "Acceptance Criteria"
312
- - Do NOT modify files outside the target list without justification`}async function UE(e,t,n){let r=(0,ir.join)(e,"aidlc-docs",t),o=(0,ir.join)(r,"construction"),s=(0,ir.join)(o,n,"spec.md"),i=(0,ar.existsSync)(s)?(0,ar.readFileSync)(s,"utf-8"):"",a=(0,ir.join)(r,"inception","intent.md"),c=(0,ar.existsSync)(a)?(0,ar.readFileSync)(a,"utf-8"):"",l=$a(c,["Business Requirements","Technical Specification"]),u=$a(c,["Problem Statement","Success Criteria"]),d=Da(i),p="";try{let{getArchitectureContext:_}=await Promise.resolve().then(()=>(Jr(),Zo)),h=[...new Set(d.map(b=>{let S=b.replace(/\\/g,"/").split("/").filter(Boolean);return S[0]==="src"&&S.length>1?S[1]:S[0]||""}).filter(Boolean))];h.length>0&&(p=await _(e,h))}catch{}let f="";try{let{loadPathwayBehaviors:_}=await Promise.resolve().then(()=>(ls(),gm)),{loadCheckpoint:h}=await Promise.resolve().then(()=>(ce(),Bi)),b=await h(e,t);if(b?.pathway_type){let S=await _(b.pathway_type);if(S){let T=S.rules.map(F=>`- **${F.name}**: ${F.description}`).join(`
312
+ - Do NOT modify files outside the target list without justification`}async function UE(e,t,n){let r=(0,ir.join)(e,"aidlc-docs",t),o=(0,ir.join)(r,"construction"),s=(0,ir.join)(o,n,"spec.md"),i=(0,ar.existsSync)(s)?(0,ar.readFileSync)(s,"utf-8"):"",a=(0,ir.join)(r,"inception","intent.md"),c=(0,ar.existsSync)(a)?(0,ar.readFileSync)(a,"utf-8"):"",l=$a(c,["Business Requirements","Technical Specification"]),u=$a(c,["Problem Statement","Success Criteria"]),d=Da(i),p="";try{let{getArchitectureContext:_}=await Promise.resolve().then(()=>(Jr(),Zo)),h=[...new Set(d.map(b=>{let S=b.replace(/\\/g,"/").split("/").filter(Boolean);return S[0]==="src"&&S.length>1?S[1]:S[0]||""}).filter(Boolean))];h.length>0&&(p=await _(e,h))}catch(_){console.warn("[CodeGenExecutor] Architecture context loading failed:",_)}let f="";try{let{loadPathwayBehaviors:_}=await Promise.resolve().then(()=>(ls(),gm)),{loadCheckpoint:h}=await Promise.resolve().then(()=>(ce(),Bi)),b=await h(e,t);if(b?.pathway_type){let S=await _(b.pathway_type);if(S){let T=S.rules.map(F=>`- **${F.name}**: ${F.description}`).join(`
313
313
  `),k=S.qualityGateChecklist.map(F=>`- [ ] ${F}`).join(`
314
314
  `);f=`
315
315
  ## Pathway Rules (${b.pathway_type})
316
316
  ${T}
317
317
 
318
318
  ### Quality Checklist
319
- ${k}`}}}catch{}let m="";try{let{loadArchitectureModel:_}=await Promise.resolve().then(()=>(Jr(),Zo)),h=await _(e);if(h?.designSystem?.detected&&h.designSystem.systems.length>0){let b=h.designSystem.systems.map(S=>S.name).join(", ");m=`
319
+ ${k}`}}}catch(_){console.warn("[CodeGenExecutor] Pathway rules loading failed:",_)}let m="";try{let{loadArchitectureModel:_}=await Promise.resolve().then(()=>(Jr(),Zo)),h=await _(e);if(h?.designSystem?.detected&&h.designSystem.systems.length>0){let b=h.designSystem.systems.map(S=>S.name).join(", ");m=`
320
320
  ## Design System Enforcement
321
321
  This project uses: ${b}. You MUST:
322
322
  - Use existing components from the detected design system before creating new ones
323
323
  - If you must create a new component, include a justification comment explaining why no existing component suffices
324
- - Do NOT duplicate functionality already provided by ${b}`}}catch{}let g=[p,f,m].filter(Boolean).join(`
324
+ - Do NOT duplicate functionality already provided by ${b}`}}catch(_){console.warn("[CodeGenExecutor] Design system detection failed:",_)}let g=[p,f,m].filter(Boolean).join(`
325
325
 
326
326
  `),y=wm(i),w=_m(u,l,i,void 0,g||void 0);return{unitName:n,agentType:y,prompt:w,context:{unitSpec:i,intentSummary:l,intentSummary2:u,targetFiles:d,architectureContext:g||void 0}}}var ar,ir,WE,ds=U(()=>{"use strict";ar=require("fs"),ir=require("path");Qo();WE=`A code generation plan must contain:
327
327
  1. A title line: "# Code Plan: {unitName}"
@@ -329,7 +329,7 @@ This project uses: ${b}. You MUST:
329
329
  3. Each step should be specific and actionable
330
330
  4. Steps should be ordered by dependency (prerequisites first)
331
331
  5. Include a "## Verification" section with test/validation checkboxes
332
- The plan file is saved at: aidlc-docs/{workflowId}/construction/{unitName}/code-plan.md`});var km={};he(km,{buildRegressionSummary:()=>HE,categorizeFailure:()=>BE,checkFlakyThreshold:()=>GE});function BE(e,t,n){return t!==null&&t.status==="failed"?"pre_existing_failure":n.some(r=>r.status==="passed")?"flaky":t===null?"intentional_change":"legitimate_regression"}function GE(e,t=.2){let n=e.length;return n===0?!1:e.filter(o=>o==="flaky").length/n>t}function HE(e,t){let n=t.filter(o=>o==="legitimate_regression").length,r=t.filter(o=>o==="flaky").length;return{regressions_count:n,flaky_count:r}}var Sm=U(()=>{"use strict"});async function vm(e,t){let n=[];for(let r of qE){let o=e.get(r);if(!o)continue;let s;try{let i=new Promise((a,c)=>setTimeout(()=>c(new Error("timeout")),t.timeoutBudgetMs));s=await Promise.race([o(t),i])}catch(i){let a=i instanceof Error&&i.message==="timeout",c={id:`${r}-error`,severity:"error",category:a?"timeout":"runtime-error",message:a?`Validator '${r}' exceeded timeout of ${t.timeoutBudgetMs}ms`:`Validator '${r}' threw an error: ${i instanceof Error?i.message:String(i)}`};console.error(`[ValidatorPipeline] ${r} validator failed:`,i),s={status:a?"timeout":"failed",findings:[c],artifactPath:""}}n.push({validator:r,result:s})}return{results:n}}function bm(e,t){if(e==="mutation"){let n=["auth","payment","security","encrypt","token","credential","password","session","permission"];if(!t.unitFiles.some(o=>n.some(s=>o.toLowerCase().includes(s))))return{skip:!0,reason:"No critical-path keywords found in unit files"}}return e==="contract"&&t.apiSurfaceFiles.length===0?{skip:!0,reason:"No API surface files in unit"}:{skip:!1}}function Te(e){return{...e,status:"passed",findings:e.findings.map(t=>({...t,severity:"info"}))}}async function Em(e,t,n,r,o,s,i){let a=await I(e,t);if(!a||!a.construction_units)return;let c=a.construction_units[n];if(!c)return;let l=VE[r];c[l]=o,r==="coverage"&&s!==void 0&&(c.coverage_percentage=s),r==="coverage"&&i!==void 0&&(c.critical_gap_count=i),await P(e,a)}var qE,VE,xn=U(()=>{"use strict";ce();qE=["quality","mutation","traceability","contract","coverage"],VE={quality:"quality_validation_status",mutation:"mutation_validation_status",traceability:"traceability_status",contract:"contract_validation_status",coverage:"coverage_status"}});function Tm(e){let t=[],n=/(?:^|\n)\s*(?:it|test)\s*\(\s*(['"`])([\s\S]*?)\1/g,r;for(;(r=n.exec(e))!==null;){let o=r[2]??"",s=r.index+r[0].length,i=e.slice(s),a=i.search(/\{/);if(a===-1)continue;let c=0,l=s+a,u=l;for(let p=a;p<i.length;p++){let f=i[p];if(f==="{")c++;else if(f==="}"&&(c--,c===0)){u=s+p+1;break}}let d=e.slice(l,u);t.push({name:o,body:d})}return t}function Na(e){return/\bexpect\s*\(/.test(e)||/\bassert\s*\(/.test(e)||/\bassert\.\w+\s*\(/.test(e)}function eT(e){return!Na(e)||zE.test(e)?!1:QE.test(e)}function tT(e){return!Na(e)||!/\.toMatchSnapshot\s*\(|\.toMatchInlineSnapshot\s*\(/.test(e)?!1:!XE.test(e)}function nT(e){let t=0;for(let n of ZE){let r=e.match(n);r&&(t+=r.length)}return t}function rT(e){let t=0;for(let n of e.split(`
332
+ The plan file is saved at: aidlc-docs/{workflowId}/construction/{unitName}/code-plan.md`});var km={};he(km,{buildRegressionSummary:()=>HE,categorizeFailure:()=>BE,checkFlakyThreshold:()=>GE});function BE(e,t,n){return t!==null&&t.status==="failed"?"pre_existing_failure":n.some(r=>r.status==="passed")?"flaky":t===null?"intentional_change":"legitimate_regression"}function GE(e,t=.2){let n=e.length;return n===0?!1:e.filter(o=>o==="flaky").length/n>t}function HE(e,t){let n=t.filter(o=>o==="legitimate_regression").length,r=t.filter(o=>o==="flaky").length;return{regressions_count:n,flaky_count:r}}var Sm=U(()=>{"use strict"});async function vm(e,t){let n=[];for(let r of qE){let o=e.get(r);if(!o)continue;let s;try{let i=new Promise((a,c)=>setTimeout(()=>c(new Error("timeout")),t.timeoutBudgetMs));s=await Promise.race([o(t),i])}catch(i){let a=i instanceof Error&&i.message==="timeout",c={id:`${r}-error`,severity:"error",category:a?"timeout":"runtime-error",message:a?`Validator '${r}' exceeded timeout of ${t.timeoutBudgetMs}ms`:`Validator '${r}' threw an error: ${i instanceof Error?i.message:String(i)}`};console.error(`[ValidatorPipeline] ${r} validator failed:`,i),s={status:a?"timeout":"failed",findings:[c],artifactPath:""}}n.push({validator:r,result:s})}return{results:n}}function bm(e,t){if(e==="mutation"){let n=["auth","payment","security","encrypt","token","credential","password","session","permission"];if(!t.unitFiles.some(o=>n.some(s=>o.toLowerCase().includes(s))))return{skip:!0,reason:"No critical-path keywords found in unit files"}}return e==="contract"&&t.apiSurfaceFiles.length===0?{skip:!0,reason:"No API surface files in unit"}:{skip:!1}}function Te(e){return{...e,status:"passed",findings:e.findings.map(t=>({...t,severity:"info"}))}}async function Em(e,t,n,r,o,s,i){let a=await A(e,t);if(!a||!a.construction_units)return;let c=a.construction_units[n];if(!c)return;let l=VE[r];c[l]=o,r==="coverage"&&s!==void 0&&(c.coverage_percentage=s),r==="coverage"&&i!==void 0&&(c.critical_gap_count=i),await P(e,a)}var qE,VE,xn=U(()=>{"use strict";ce();qE=["quality","mutation","traceability","contract","coverage"],VE={quality:"quality_validation_status",mutation:"mutation_validation_status",traceability:"traceability_status",contract:"contract_validation_status",coverage:"coverage_status"}});function Tm(e){let t=[],n=/(?:^|\n)\s*(?:it|test)\s*\(\s*(['"`])([\s\S]*?)\1/g,r;for(;(r=n.exec(e))!==null;){let o=r[2]??"",s=r.index+r[0].length,i=e.slice(s),a=i.search(/\{/);if(a===-1)continue;let c=0,l=s+a,u=l;for(let p=a;p<i.length;p++){let f=i[p];if(f==="{")c++;else if(f==="}"&&(c--,c===0)){u=s+p+1;break}}let d=e.slice(l,u);t.push({name:o,body:d})}return t}function Na(e){return/\bexpect\s*\(/.test(e)||/\bassert\s*\(/.test(e)||/\bassert\.\w+\s*\(/.test(e)}function eT(e){return!Na(e)||zE.test(e)?!1:QE.test(e)}function tT(e){return!Na(e)||!/\.toMatchSnapshot\s*\(|\.toMatchInlineSnapshot\s*\(/.test(e)?!1:!XE.test(e)}function nT(e){let t=0;for(let n of ZE){let r=e.match(n);r&&(t+=r.length)}return t}function rT(e){let t=0;for(let n of e.split(`
333
333
  `)){let r=n.trim();r&&(r.startsWith("//")||r[0]==="*"||/\bvi\.fn\b|\bjest\.fn\b|\bvi\.mock\b|\bjest\.mock\b|\bmockReturnValue\b|\bmockResolvedValue\b|\bmockImplementation\b|\bstub\b/.test(r)||/^\s*expect\s*\(|^\s*assert\s*[.(]/.test(n)||/\b\w+\s*\(/.test(r)&&t++)}return t}function ps(e,t,n){let r=[],o=Tm(e);for(let s of o){let{name:i,body:a}=s,c={file:n,testName:i||t};if(!Na(a)){r.push({id:`empty-body:${n}:${i}`,severity:"error",category:"empty-body",message:`Test "${i}" has no assertions (empty test body)`,location:c});continue}for(let d of YE)if(d.pattern.test(a)){r.push({id:`${d.category}:${n}:${i}`,severity:d.severity,category:d.category,message:`Test "${i}": ${d.description}`,location:c});break}eT(a)&&r.push({id:`surface-assertion:${n}:${i}`,severity:"warning",category:"surface-assertion",message:`Test "${i}": ${KE.find(d=>d.category==="surface-assertion")?.description??"Only surface assertions found"}`,location:c}),tT(a)&&r.push({id:`snapshot-overuse:${n}:${i}`,severity:"warning",category:"snapshot-overuse",message:`Test "${i}": Test relies exclusively on snapshot assertions without behavioral checks`,location:c});let l=nT(a),u=rT(a);l>3&&l>u*2&&r.push({id:`excessive-mocking:${n}:${i}`,severity:"warning",category:"excessive-mocking",message:`Test "${i}": Excessive mocking detected (${l} mocks vs ${u} real calls)`,location:{...c,testName:i}})}return r}function fs(e){let t=Tm(e),n=t.length;if(n===0)return{ratio:0,totalTests:0,negativeTests:0};let r=0;for(let o of t){let s=`${o.name}
334
334
  ${o.body}`;JE.some(i=>i.test(s))&&r++}return{ratio:r/n,totalTests:n,negativeTests:r}}var YE,KE,JE,zE,QE,XE,ZE,ja=U(()=>{"use strict";YE=[{category:"tautological",severity:"error",pattern:/mockReturnValue\((['"`]?)(\w+)\1\)[^]*?\.toBe\((['"`]?)\2\3\)/,description:"Mock return value is asserted against itself (tautological assertion)"},{category:"tautological",severity:"error",pattern:/mockResolvedValue\((['"`]?)(\w+)\1\)[^]*?\.resolves\.toBe\((['"`]?)\2\3\)/,description:"Mock resolved value is asserted against itself (tautological assertion)"},{category:"trivially-true",severity:"error",pattern:/expect\((true|false)\)\.toBe\(\1\)/,description:"Literal boolean asserted against itself (trivially true assertion)"},{category:"trivially-true",severity:"error",pattern:/expect\((true|1)\)\.toBeTruthy\(\)/,description:"Always-truthy literal asserted as truthy (trivially true assertion)"},{category:"trivially-true",severity:"error",pattern:/expect\((false|0)\)\.toBeFalsy\(\)/,description:"Always-falsy literal asserted as falsy (trivially true assertion)"},{category:"trivially-true",severity:"error",pattern:/expect\(null\)\.toBeNull\(\)/,description:"Null literal asserted as null (trivially true assertion)"},{category:"trivially-true",severity:"error",pattern:/expect\(undefined\)\.toBeUndefined\(\)/,description:"Undefined literal asserted as undefined (trivially true assertion)"}],KE=[{category:"surface-assertion",severity:"warning",pattern:/(?:expect\([^)]+\)\.(?:toBeInTheDocument|toBeDefined|toBeNull|toExist|toBeVisible)\(\)[\s;,]*)+/,description:"All assertions use only surface-level existence matchers without behavioral checks"},{category:"snapshot-overuse",severity:"warning",pattern:/expect\([^)]+\)\.toMatchSnapshot\(\)/,description:"Test relies exclusively on snapshot assertions without behavioral checks"},{category:"snapshot-overuse",severity:"warning",pattern:/expect\([^)]+\)\.toMatchInlineSnapshot\(/,description:"Test relies exclusively on inline snapshot assertions without behavioral checks"}],JE=[/\bthrow\b/i,/\breject\b/i,/\berror\b/i,/\binvalid\b/i,/\bfail\b/i,/\bboundary\b/i,/\bedge\b/i,/\bnegative\b/i,/\bmissing\b/i,/\bunauthorized\b/i,/\bforbidden\b/i,/\bnot.?found\b/i,/\.toThrow\b/,/\.rejects\b/,/\.toThrowError\b/],zE=/\.(?:toBe|toEqual|toStrictEqual|toMatchObject|toHaveBeenCalledWith|toHaveBeenCalled|toHaveReturnedWith|toThrow|toResolve|toReject|toHaveLength|toBeGreaterThan|toBeLessThan|toBeCloseTo)\s*\(/g,QE=/\.(?:toContain|toBeInTheDocument|toBeDefined|toBeNull|toExist|toBeVisible|toBeUndefined|toBeTruthy|toBeFalsy)\s*\(/g,XE=/\.(?:toBe|toEqual|toStrictEqual|toMatchObject|toContain|toHaveBeenCalled|toHaveBeenCalledWith|toThrow|toReject|toBeInTheDocument|toBeDefined|toHaveLength|toBeGreaterThan|toBeLessThan)\s*\(/,ZE=[/\bvi\.fn\s*\(/g,/\bjest\.fn\s*\(/g,/\bmock\s*\(/g,/\bstub\s*\(/g,/\.mockReturnValue\s*\(/g,/\.mockResolvedValue\s*\(/g,/\.mockImplementation\s*\(/g,/vi\.mock\s*\(/g,/jest\.mock\s*\(/g]});async function oT(e){if(!await cn.default.pathExists(e))return[];let n=(await cn.default.readdir(e)).filter(o=>o.endsWith(".test.ts")||o.endsWith(".test.js")||o.endsWith(".spec.ts")||o.endsWith(".spec.js")),r=[];for(let o of n){let s=Pn.default.join(e,o),i=await cn.default.readFile(s,"utf-8");r.push({filePath:s,content:i})}return r}function sT(e){let t=e.match(/(?:^|\n)\s*(?:it|test)\s*\(\s*['"`]/g);return t?t.length:0}function Cm(e,t,n,r,o,s){let i=e.filter(u=>u.severity==="error"),a=e.filter(u=>u.severity==="warning"),c=n-t,l=["# Quality Validation Report","","## Summary","","| Metric | Value |","|--------|-------|",`| Total tests | ${n} |`,`| Validated tests | ${t} |`,`| Rejected tests | ${c} |`,`| Warnings | ${a.length} |`,""];if(i.length>0){l.push("## Rejections",""),l.push("| Test | File | Reason |"),l.push("|------|------|--------|");for(let u of i){let d=u.location?.testName??"unknown",p=u.location?.file??"unknown";l.push(`| ${d} | ${p} | ${u.message} |`)}l.push("")}if(a.length>0){l.push("## Warnings",""),l.push("| Test | File | Warning | Details |"),l.push("|------|------|---------|---------|");for(let u of a){let d=u.location?.testName??"unknown",p=u.location?.file??"unknown";l.push(`| ${d} | ${p} | ${u.category} | ${u.message} |`)}l.push("")}return l.push("## Negative Case Coverage",""),l.push("| Metric | Value |"),l.push("|--------|-------|"),l.push(`| Total tests | ${o} |`),l.push(`| Negative tests | ${s} |`),l.push(`| Ratio | ${(r*100).toFixed(1)}% |`),l.push(`| Threshold | ${(ms*100).toFixed(1)}% |`),l.push(`| Status | ${r>=ms?"PASS":"BELOW THRESHOLD"} |`),l.push(""),l.join(`
335
335
  `)}function Rm(){return async e=>{let t=Pn.default.join(e.projectPath,"aidlc-docs",e.workflowId,"construction",e.unitId,"testing"),n=Pn.default.join(t,"quality-validation.md"),r=await oT(t);if(r.length===0){let w={status:"passed",findings:[],artifactPath:n};return await cn.default.ensureDir(Pn.default.dirname(n)),await cn.default.writeFile(n,Cm([],0,0,0,0,0),"utf-8"),e.allowFailures?Te(w):w}let o=[],s=0;for(let{filePath:w,content:_}of r){let h=Pn.default.basename(w),b=ps(_,h,w);o.push(...b),s+=sT(_)}let i=r.map(w=>w.content).join(`
@@ -465,7 +465,7 @@ ${a}
465
465
 
466
466
  Application Code: ${e} (NEVER in aidlc-docs/)
467
467
  Documentation: ${eo}/${t}/
468
- `;qt.ensureDirSync(dr.join(e,eo,t)),qt.writeFileSync(r,c,"utf-8")}catch(o){console.error(`[StateFile] Failed to generate state file for workflow ${t}:`,o.message)}return r}function ks(e,t,n,r){let o=dr.join(e,eo,t,lg);try{let s=qt.readFileSync(o,"utf-8"),i=new RegExp(`^(- \\[[ x\\-]\\] ${n}.*)$`,"im"),a=s;r==="completed"?a=a.replace(i,(u,d)=>`${d.replace(/\[[ x\-]\]/,"[x]").replace(/\s*\(.*?\)\s*$/,"").replace(/\s*← CURRENT\s*$/,"")} (completed ${new Date().toISOString()})`):r==="in_progress"?a=a.replace(i,(u,d)=>`${d.replace(/\[[ x\-]\]/,"[ ]").replace(/\s*\(.*?\)\s*$/,"").replace(/\s*← CURRENT\s*$/,"")} \u2190 CURRENT`):r==="skipped"&&(a=a.replace(i,(u,d)=>`${d.replace(/\[[ x\-]\]/,"[-]").replace(/\s*\(.*?\)\s*$/,"").replace(/\s*← CURRENT\s*$/,"")} (skipped)`));let c=/\| \*\*Last Updated\*\* \| .+? \|/,l=/^\*\*Last Updated\*\*: .+$/m;c.test(a)?a=a.replace(c,`| **Last Updated** | ${new Date().toISOString()} |`):a=a.replace(l,`**Last Updated**: ${new Date().toISOString()}`),qt.writeFileSync(o,a,"utf-8")}catch(s){console.error(`[StateFile] Failed to update state file for workflow ${t}:`,s.message)}}var dr,qt,eo,lg,rC,oC,Ba=U(()=>{"use strict";dr=v(require("path"),1),qt=v(X(),1),eo="aidlc-docs",lg="aidlc-state.md",rC=["discovery","inception","construction","operations"],oC=["workspace-detection","reverse-engineering","requirements-analysis","workflow-planning","units-generation","user-stories","bolt-planning"]});var gg={};he(gg,{InceptionOrchestrator:()=>Va,registerStageHandler:()=>dC});function dC(e,t){qa[e]=t}function ug(e,t,n=null){return{stage:e,status:t,started_at:null,completed_at:null,skip_reason:n,artifacts_generated:[],questions_file:null,answers_received:!1}}function Ga(e,t,n){return n&&!Oa(n,"inception",e)?{status:"skipped",skipReason:"Excluded by workflow routing plan"}:t==="greenfield"&&e==="reverse-engineering"?{status:"skipped",skipReason:"Greenfield project \u2014 no existing codebase to reverse-engineer"}:(t==="bugfix"||t==="optimization")&&e==="user-stories"?{status:"skipped",skipReason:`${t} pathway does not require ${e}`}:{status:"not_started",skipReason:null}}function dg(e){for(let t of At){let n=e[t];if(n&&(n.status==="not_started"||n.status==="in_progress"))return t}return null}function pC(e,t){let n=At.indexOf(e);for(let r=n+1;r<At.length;r++){let o=At[r],s=t[o];if(s&&(s.status==="not_started"||s.status==="in_progress"))return o}}async function fC(e,t,n){if(!n.trust_state_path)return 0;try{let r=(0,mg.join)(e,"aidlc-docs",t,n.trust_state_path),o=await fg.readFile(r,"utf-8");return JSON.parse(o).current_level??0}catch{return 0}}function mC(e,t,n){let r=e==="workspace-detection",o=t.status==="awaiting_answers";return!(n>=3||n>=2&&!o||n>=1&&r&&!o)}function pg(e){return At.every(t=>{let n=e[t];return n&&(n.status==="completed"||n.status==="skipped")})}function gC(e){let t=e.phases?.discovery;if(!t)return!1;let n=t.status;return n==="complete"||n==="completed"}function Ha(e,t=null){let n=t!==null,r=new Date().toISOString();return{stage:e,status:n?"skipped":"completed",started_at:n?null:r,completed_at:r,skip_reason:t,artifacts_generated:[],questions_file:null,answers_received:!1}}var fg,mg,qa,At,Va,hg=U(()=>{"use strict";fg=v(X(),1),mg=require("path");ce();Ba();ha();ls();qa={};At=["workspace-detection","reverse-engineering","requirements-analysis","workflow-planning","units-generation","user-stories","bolt-planning"];Va=class{async migrateCheckpoint(t,n){let r=await I(t,n);if(!r)throw new Error(`[InceptionOrchestrator] Checkpoint not found for workflow ${n}`);if(r.inception_stages)return{migrated:!1,case:"no_migration_needed"};let o=r.pathway_type??"brownfield-enhancement";if(r.current_stage!=="intent"){let a={};for(let c of At){let{skipReason:l}=Ga(c,o,null);a[c]=Ha(c,l)}return r.inception_stages=a,r.current_inception_stage=void 0,await P(t,r),jt(t,n),{migrated:!0,case:"already_past_inception"}}let s={};for(let a of At){let{status:c,skipReason:l}=Ga(a,o,null);s[a]=ug(a,c,l)}s["workspace-detection"].status!=="skipped"&&(s["workspace-detection"]=Ha("workspace-detection")),s["reverse-engineering"].status!=="skipped"&&gC(r)&&(s["reverse-engineering"]=Ha("reverse-engineering")),r.inception_stages=s;let i=dg(s);return r.current_inception_stage=i??void 0,await P(t,r),jt(t,n),{migrated:!0,case:"paused_at_intent"}}async initialize(t,n,r,o){let s=await I(t,n);if(!s)throw new Error(`[InceptionOrchestrator] Checkpoint not found for workflow ${n}`);if(s.inception_stages)return;let i={},a;for(let c of At){let{status:l,skipReason:u}=Ga(c,r,o);i[c]=ug(c,l,u),!a&&l==="not_started"&&(a=c)}s.inception_stages=i,s.current_inception_stage=a??void 0,await P(t,s),jt(t,n)}async executeNextStage(t,n){let r=await I(t,n);if(!r)throw new Error(`[InceptionOrchestrator] Checkpoint not found for workflow ${n}`);let o=r.inception_stages;if(!o)throw new Error(`[InceptionOrchestrator] inception_stages not initialized for workflow ${n}. Call initialize() first.`);let s=dg(o);if(!s)return{stage:"units-generation",status:"completed",requires_approval:!1,artifacts_generated:[],whats_next:"Inception is complete. Proceed to construction phase."};o[s].status="in_progress",o[s].started_at=new Date().toISOString(),r.current_inception_stage=s,await P(t,r),jt(t,n);let i=qa[s],a;if(i)try{a=await i(t,n,r)}catch(c){let l=c;console.error(`[InceptionOrchestrator] Stage '${s}' handler threw:`,l.message);let u=await I(t,n);return u?.inception_stages&&(u.inception_stages[s].status="not_started",u.inception_stages[s].started_at=null,await P(t,u),jt(t,n)),{stage:s,status:"review_required",requires_approval:!0,artifacts_generated:[],review_summary:`Stage '${s}' failed with error: ${l.message}`}}else a={stage:s,status:"completed",requires_approval:!0,artifacts_generated:[],review_summary:`Stage '${s}' has no handler registered yet.`,whats_next:"This stage will be implemented in a future TODO."};return await this._postStage(t,n,s,a),a}async processAnswers(t,n,r){let o=await I(t,n);if(!o)throw new Error(`[InceptionOrchestrator] Checkpoint not found for workflow ${n}`);let s=o.inception_stages;if(!s)throw new Error(`[InceptionOrchestrator] inception_stages not initialized for workflow ${n}`);let i=s[r];if(!i||i.status!=="in_progress")throw new Error(`[InceptionOrchestrator] Stage '${r}' is not in_progress (status: ${i?.status??"unknown"})`);let a=qa[r],c;if(a)try{c=await a(t,n,o)}catch(l){let u=l;return console.error(`[InceptionOrchestrator] processAnswers for '${r}' threw:`,u.message),{stage:r,status:"review_required",requires_approval:!0,artifacts_generated:[],review_summary:`Stage '${r}' answer processing failed: ${u.message}`}}else c={stage:r,status:"completed",requires_approval:!0,artifacts_generated:[],review_summary:`Stage '${r}' has no handler registered yet.`,whats_next:"This stage will be implemented in a future TODO."};return await this._postStage(t,n,r,c),c}async getProgress(t,n){let r=await I(t,n);if(!r)throw new Error(`[InceptionOrchestrator] Checkpoint not found for workflow ${n}`);let o=r.inception_stages??{},s=At.length,i=0,a=0;for(let c of At){let l=o[c];l&&(l.status==="completed"&&i++,l.status==="skipped"&&a++)}return{total_stages:s,completed_stages:i,skipped_stages:a,current_stage:r.current_inception_stage??null,stages:o}}async isComplete(t,n){let r=await I(t,n);return r?.inception_stages?pg(r.inception_stages):!1}async _postStage(t,n,r,o){let s=await I(t,n);if(!s?.inception_stages)return;let i=s.inception_stages,a=new Date().toISOString();o.status==="completed"?(i[r].status="completed",i[r].completed_at=a,i[r].artifacts_generated=o.artifacts_generated):o.status==="awaiting_answers"?(i[r].status="in_progress",i[r].questions_file=o.questions_file??null):o.status==="skipped"&&(i[r].status="skipped",i[r].completed_at=a),(o.status==="completed"||o.status==="skipped")&&(s.current_inception_stage=pC(r,i)),await P(t,s),jt(t,n);try{o.status==="completed"?ks(t,n,r,"completed"):o.status==="awaiting_answers"?ks(t,n,r,"in_progress"):o.status==="skipped"&&ks(t,n,r,"skipped")}catch(u){console.error(`[InceptionOrchestrator] Failed to update state file for stage ${r}:`,u.message)}try{let u={timestamp:a,phase:"inception",action:`Stage '${r}' ${o.status}`,actor:"ai",reason:o.review_summary??null};zo(t,n,u)}catch(u){console.error(`[InceptionOrchestrator] Failed to append to audit for stage ${r}:`,u.message)}if(pg(i))try{let u=vf(t,n);ga(u),await bf(t,n,u)}catch(u){console.error("[InceptionOrchestrator] Failed to generate final audit document:",u.message)}try{let u=await fC(t,n,s);o.requires_approval=mC(r,o,u)}catch(u){console.error("[InceptionOrchestrator] Failed to compute trust level:",u.message),o.requires_approval=!0}let l=await I(t,n);l?.current_inception_stage&&(o.next_stage=l.current_inception_stage)}}});var vg={};he(vg,{generateCostAnalysis:()=>Sg,generateDeployGuide:()=>yg,generateMonitoringConfig:()=>_g,generateOperationsArtifacts:()=>hC,generateReleaseNotes:()=>kg,generateRunbook:()=>wg});function yg(e){let{featureName:t,workflowId:n,manifest:r}=e,o=new Date().toISOString(),s=r?.artifacts?.length??0,i=r?.artifacts?.filter(c=>c.phase==="inception").length??0,a=r?.artifacts?.filter(c=>c.phase==="construction").length??0;return`---
468
+ `;qt.ensureDirSync(dr.join(e,eo,t)),qt.writeFileSync(r,c,"utf-8")}catch(o){console.error(`[StateFile] Failed to generate state file for workflow ${t}:`,o.message)}return r}function ks(e,t,n,r){let o=dr.join(e,eo,t,lg);try{let s=qt.readFileSync(o,"utf-8"),i=new RegExp(`^(- \\[[ x\\-]\\] ${n}.*)$`,"im"),a=s;r==="completed"?a=a.replace(i,(u,d)=>`${d.replace(/\[[ x\-]\]/,"[x]").replace(/\s*\(.*?\)\s*$/,"").replace(/\s*← CURRENT\s*$/,"")} (completed ${new Date().toISOString()})`):r==="in_progress"?a=a.replace(i,(u,d)=>`${d.replace(/\[[ x\-]\]/,"[ ]").replace(/\s*\(.*?\)\s*$/,"").replace(/\s*← CURRENT\s*$/,"")} \u2190 CURRENT`):r==="skipped"&&(a=a.replace(i,(u,d)=>`${d.replace(/\[[ x\-]\]/,"[-]").replace(/\s*\(.*?\)\s*$/,"").replace(/\s*← CURRENT\s*$/,"")} (skipped)`));let c=/\| \*\*Last Updated\*\* \| .+? \|/,l=/^\*\*Last Updated\*\*: .+$/m;c.test(a)?a=a.replace(c,`| **Last Updated** | ${new Date().toISOString()} |`):a=a.replace(l,`**Last Updated**: ${new Date().toISOString()}`),qt.writeFileSync(o,a,"utf-8")}catch(s){console.error(`[StateFile] Failed to update state file for workflow ${t}:`,s.message)}}var dr,qt,eo,lg,rC,oC,Ba=U(()=>{"use strict";dr=v(require("path"),1),qt=v(X(),1),eo="aidlc-docs",lg="aidlc-state.md",rC=["discovery","inception","construction","operations"],oC=["workspace-detection","reverse-engineering","requirements-analysis","workflow-planning","units-generation","user-stories","bolt-planning"]});var gg={};he(gg,{InceptionOrchestrator:()=>Va,registerStageHandler:()=>dC});function dC(e,t){qa[e]=t}function ug(e,t,n=null){return{stage:e,status:t,started_at:null,completed_at:null,skip_reason:n,artifacts_generated:[],questions_file:null,answers_received:!1}}function Ga(e,t,n){return n&&!Oa(n,"inception",e)?{status:"skipped",skipReason:"Excluded by workflow routing plan"}:t==="greenfield"&&e==="reverse-engineering"?{status:"skipped",skipReason:"Greenfield project \u2014 no existing codebase to reverse-engineer"}:(t==="bugfix"||t==="optimization")&&e==="user-stories"?{status:"skipped",skipReason:`${t} pathway does not require ${e}`}:{status:"not_started",skipReason:null}}function dg(e){for(let t of At){let n=e[t];if(n&&(n.status==="not_started"||n.status==="in_progress"))return t}return null}function pC(e,t){let n=At.indexOf(e);for(let r=n+1;r<At.length;r++){let o=At[r],s=t[o];if(s&&(s.status==="not_started"||s.status==="in_progress"))return o}}async function fC(e,t,n){if(!n.trust_state_path)return 0;try{let r=(0,mg.join)(e,"aidlc-docs",t,n.trust_state_path),o=await fg.readFile(r,"utf-8");return JSON.parse(o).current_level??0}catch{return 0}}function mC(e,t,n){let r=e==="workspace-detection",o=t.status==="awaiting_answers";return!(n>=3||n>=2&&!o||n>=1&&r&&!o)}function pg(e){return At.every(t=>{let n=e[t];return n&&(n.status==="completed"||n.status==="skipped")})}function gC(e){let t=e.phases?.discovery;if(!t)return!1;let n=t.status;return n==="complete"||n==="completed"}function Ha(e,t=null){let n=t!==null,r=new Date().toISOString();return{stage:e,status:n?"skipped":"completed",started_at:n?null:r,completed_at:r,skip_reason:t,artifacts_generated:[],questions_file:null,answers_received:!1}}var fg,mg,qa,At,Va,hg=U(()=>{"use strict";fg=v(X(),1),mg=require("path");ce();Ba();ha();ls();qa={};At=["workspace-detection","reverse-engineering","requirements-analysis","workflow-planning","units-generation","user-stories","bolt-planning"];Va=class{async migrateCheckpoint(t,n){let r=await A(t,n);if(!r)throw new Error(`[InceptionOrchestrator] Checkpoint not found for workflow ${n}`);if(r.inception_stages)return{migrated:!1,case:"no_migration_needed"};let o=r.pathway_type??"brownfield-enhancement";if(r.current_stage!=="intent"){let a={};for(let c of At){let{skipReason:l}=Ga(c,o,null);a[c]=Ha(c,l)}return r.inception_stages=a,r.current_inception_stage=void 0,await P(t,r),jt(t,n),{migrated:!0,case:"already_past_inception"}}let s={};for(let a of At){let{status:c,skipReason:l}=Ga(a,o,null);s[a]=ug(a,c,l)}s["workspace-detection"].status!=="skipped"&&(s["workspace-detection"]=Ha("workspace-detection")),s["reverse-engineering"].status!=="skipped"&&gC(r)&&(s["reverse-engineering"]=Ha("reverse-engineering")),r.inception_stages=s;let i=dg(s);return r.current_inception_stage=i??void 0,await P(t,r),jt(t,n),{migrated:!0,case:"paused_at_intent"}}async initialize(t,n,r,o){let s=await A(t,n);if(!s)throw new Error(`[InceptionOrchestrator] Checkpoint not found for workflow ${n}`);if(s.inception_stages)return;let i={},a;for(let c of At){let{status:l,skipReason:u}=Ga(c,r,o);i[c]=ug(c,l,u),!a&&l==="not_started"&&(a=c)}s.inception_stages=i,s.current_inception_stage=a??void 0,await P(t,s),jt(t,n)}async executeNextStage(t,n){let r=await A(t,n);if(!r)throw new Error(`[InceptionOrchestrator] Checkpoint not found for workflow ${n}`);let o=r.inception_stages;if(!o)throw new Error(`[InceptionOrchestrator] inception_stages not initialized for workflow ${n}. Call initialize() first.`);let s=dg(o);if(!s)return{stage:"units-generation",status:"completed",requires_approval:!1,artifacts_generated:[],whats_next:"Inception is complete. Proceed to construction phase."};o[s].status="in_progress",o[s].started_at=new Date().toISOString(),r.current_inception_stage=s,await P(t,r),jt(t,n);let i=qa[s],a;if(i)try{a=await i(t,n,r)}catch(c){let l=c;console.error(`[InceptionOrchestrator] Stage '${s}' handler threw:`,l.message);let u=await A(t,n);return u?.inception_stages&&(u.inception_stages[s].status="not_started",u.inception_stages[s].started_at=null,await P(t,u),jt(t,n)),{stage:s,status:"review_required",requires_approval:!0,artifacts_generated:[],review_summary:`Stage '${s}' failed with error: ${l.message}`}}else a={stage:s,status:"completed",requires_approval:!0,artifacts_generated:[],review_summary:`Stage '${s}' has no handler registered yet.`,whats_next:"This stage has no registered handler \u2014 skipping to next stage."};return await this._postStage(t,n,s,a),a}async processAnswers(t,n,r){let o=await A(t,n);if(!o)throw new Error(`[InceptionOrchestrator] Checkpoint not found for workflow ${n}`);let s=o.inception_stages;if(!s)throw new Error(`[InceptionOrchestrator] inception_stages not initialized for workflow ${n}`);let i=s[r];if(!i||i.status!=="in_progress")throw new Error(`[InceptionOrchestrator] Stage '${r}' is not in_progress (status: ${i?.status??"unknown"})`);let a=qa[r],c;if(a)try{c=await a(t,n,o)}catch(l){let u=l;return console.error(`[InceptionOrchestrator] processAnswers for '${r}' threw:`,u.message),{stage:r,status:"review_required",requires_approval:!0,artifacts_generated:[],review_summary:`Stage '${r}' answer processing failed: ${u.message}`}}else c={stage:r,status:"completed",requires_approval:!0,artifacts_generated:[],review_summary:`Stage '${r}' has no handler registered yet.`,whats_next:"This stage has no registered handler \u2014 skipping to next stage."};return await this._postStage(t,n,r,c),c}async getProgress(t,n){let r=await A(t,n);if(!r)throw new Error(`[InceptionOrchestrator] Checkpoint not found for workflow ${n}`);let o=r.inception_stages??{},s=At.length,i=0,a=0;for(let c of At){let l=o[c];l&&(l.status==="completed"&&i++,l.status==="skipped"&&a++)}return{total_stages:s,completed_stages:i,skipped_stages:a,current_stage:r.current_inception_stage??null,stages:o}}async isComplete(t,n){let r=await A(t,n);return r?.inception_stages?pg(r.inception_stages):!1}async _postStage(t,n,r,o){let s=await A(t,n);if(!s?.inception_stages)return;let i=s.inception_stages,a=new Date().toISOString();o.status==="completed"?(i[r].status="completed",i[r].completed_at=a,i[r].artifacts_generated=o.artifacts_generated):o.status==="awaiting_answers"?(i[r].status="in_progress",i[r].questions_file=o.questions_file??null):o.status==="skipped"&&(i[r].status="skipped",i[r].completed_at=a),(o.status==="completed"||o.status==="skipped")&&(s.current_inception_stage=pC(r,i)),await P(t,s),jt(t,n);try{o.status==="completed"?ks(t,n,r,"completed"):o.status==="awaiting_answers"?ks(t,n,r,"in_progress"):o.status==="skipped"&&ks(t,n,r,"skipped")}catch(u){console.error(`[InceptionOrchestrator] Failed to update state file for stage ${r}:`,u.message)}try{let u={timestamp:a,phase:"inception",action:`Stage '${r}' ${o.status}`,actor:"ai",reason:o.review_summary??null};zo(t,n,u)}catch(u){console.error(`[InceptionOrchestrator] Failed to append to audit for stage ${r}:`,u.message)}if(pg(i))try{let u=vf(t,n);ga(u),await bf(t,n,u)}catch(u){console.error("[InceptionOrchestrator] Failed to generate final audit document:",u.message)}try{let u=await fC(t,n,s);o.requires_approval=mC(r,o,u)}catch(u){console.error("[InceptionOrchestrator] Failed to compute trust level:",u.message),o.requires_approval=!0}let l=await A(t,n);l?.current_inception_stage&&(o.next_stage=l.current_inception_stage)}}});var vg={};he(vg,{generateCostAnalysis:()=>Sg,generateDeployGuide:()=>yg,generateMonitoringConfig:()=>_g,generateOperationsArtifacts:()=>hC,generateReleaseNotes:()=>kg,generateRunbook:()=>wg});function yg(e){let{featureName:t,workflowId:n,manifest:r}=e,o=new Date().toISOString(),s=r?.artifacts?.length??0,i=r?.artifacts?.filter(c=>c.phase==="inception").length??0,a=r?.artifacts?.filter(c=>c.phase==="construction").length??0;return`---
469
469
  id: DEPLOY-GUIDE-001
470
470
  feature: ${n}
471
471
  created: ${o}
@@ -728,7 +728,7 @@ ${l.length>2?"- High rejection rate suggests specification clarity could be impr
728
728
 
729
729
  ---
730
730
  *Generated by Operations Phase Templates*
731
- `}async function hC(e,t){let n=On.join(t,"aidlc-docs",e.workflowId,"operations");await ln.ensureDir(n);let r=[],o=e.depthLevel||"MEDIUM";return await ln.writeFile(On.join(n,"release-notes.md"),kg(e),"utf-8"),r.push("release-notes.md"),o==="SHALLOW"?{artifactsGenerated:r,operationsDir:n}:(await ln.writeFile(On.join(n,"deploy-guide.md"),yg(e),"utf-8"),r.push("deploy-guide.md"),await ln.writeFile(On.join(n,"runbook.md"),wg(e),"utf-8"),r.push("runbook.md"),await ln.writeFile(On.join(n,"monitoring.json"),_g(e),"utf-8"),r.push("monitoring.json"),await ln.writeFile(On.join(n,"cost.md"),Sg(e),"utf-8"),r.push("cost.md"),{artifactsGenerated:r,operationsDir:n})}var ln,On,bg=U(()=>{"use strict";ln=v(X(),1),On=v(require("path"),1)});var Xy={};he(Xy,{formatSessionSummaryLine:()=>Cx});function Cx(e){let t;e.agents_used.length===0?t="(none)":e.agents_used.length<=4?t=e.agents_used.join(", "):t=e.agents_used.slice(0,3).join(", ")+", ...";let n=e.duration_seconds,r=Math.floor(n/60),o=n%60,s;r>0?s=`${r}m ${o}s`:s=`${o}s`;let i=e.total_tokens.toLocaleString("en-US"),a=`$${e.estimated_cost.toFixed(e.estimated_cost>=.01?2:3)}`,c=e.agents_used.length,u=`[Olympus] Session: ${c} ${c===1?"agent":"agents"} (${t}) | ${i} tokens | ${a} | ${s}`;return u.length>200&&(u=u.substring(0,197)+"..."),u}var Zy=U(()=>{"use strict"});function aw(e){if(!e)return[];let t=e.toLowerCase(),n=[];for(let[r,o]of Object.entries(xx))for(let s of o)if(t.includes(s)){n.push(r);break}return n}var xx,cw=U(()=>{"use strict";xx={simple_search:["find file","search for","locate","where is","look for","find the"],debugging:["debug","error","fix bug","why is","not working","broken","failing","crash"],implementation:["implement","add feature","create function","build","write code","develop"],refactoring:["refactor","restructure","reorganize","clean up","rename","extract"],documentation:["document","write docs","add comments","explain","readme","api docs"],analysis:["analyze","investigate","examine","review","understand","trace"]}});var dw={};he(dw,{COLD_START_FALLBACK_RATE:()=>sl,getRoutingRecommendation:()=>Ox});function Px(){let e=(0,uw.join)(pe(),"routing-config.json"),t=_e(e,null);if(t)return t;try{at(e,lw)}catch{}return lw}function Ax(e,t){for(let[n,r]of Object.entries(t)){let o=r.indexOf(e);if(o>=0)return{family:n,tierList:r,index:o}}return null}function Ix(e,t){return!e||t===0?sl:t*e.success_rate+(1-t)*sl}function Ox(e,t,n){try{let r=Px();if(!r.preferLowerTier)return null;let o=Ax(e,r.agentTiers);if(!o||o.index===0)return null;let s=qn(n),i=o.tierList.slice(0,o.index);for(let a of i){let c=s[a],l=c?.total_invocations??0,u=Math.min(1,l/5),d=Ix(c,u);if(d<r.minSuccessRate||u>=1&&l<r.minDataPoints)continue;let p="";if(c?.task_patterns&&c.task_patterns.length>0){let g=aw(t);for(let y of c.task_patterns)if(g.includes(y.pattern)&&y.successfulAgents.includes(a)&&y.confidence>=.7){p=` (especially for ${y.pattern.replace(/_/g," ")} tasks)`;break}}let f=(d*100).toFixed(0);return`Based on ${l} data points, ${a} handles this type of task with ${f}% success rate${p}. Consider using ${a} instead of ${e} to save tokens.`}return null}catch{return null}}var uw,sl,lw,pw=U(()=>{"use strict";uw=require("path");we();cw();sl=.5,lw={minDataPoints:10,minSuccessRate:.8,preferLowerTier:!0,agentTiers:{oracle:["oracle-low","oracle-medium","oracle"],olympian:["olympian-low","olympian","olympian-high"],explore:["explore","explore-medium"],librarian:["librarian-low","librarian"],"frontend-engineer":["frontend-engineer-low","frontend-engineer","frontend-engineer-high"]}}});var yA={};he(yA,{main:()=>w_});module.exports=x_(yA);var li=new Map;function A(e){let t=li.get(e.event)||[];t.push(e),t.sort((n,r)=>(n.priority??100)-(r.priority??100)),li.set(e.event,t)}function bl(e){return li.get(e)||[]}var P_={ultrawork:/\b(ultrawork|ulw)\b/i,ultrathink:/\b(ultrathink|think)\b/i,olympus:/\b(olympus|orchestrate|coordinate|multi-?agent|conductor)\b/i,search:/\b(search|find|locate|lookup|explore|discover|scan|grep|query|browse|detect|trace|seek|track|pinpoint|hunt)\b|where\s+is|show\s+me|list\s+all/i,analyze:/\b(analyze|analyse|investigate|examine|research|study|deep.?dive|inspect|audit|evaluate|assess|review|diagnose|scrutinize|dissect|debug|comprehend|interpret|breakdown|understand)\b|why\s+is|how\s+does|how\s+to/i},A_=["ultrawork","ultrathink","olympus","search","analyze"];function El(e){let t=e.replace(/```[\s\S]*?```/g,"");return t=t.replace(/~~~[\s\S]*?~~~/g,""),t=t.replace(/`[^`]+`/g,""),t}function Tl(e,t){let n=[];for(let r of A_){let o=P_[r],s=e.match(o);s&&s.index!==void 0&&n.push({type:r,keyword:s[0],position:s.index})}return n}var Cl="auto-slash-command",vo="<auto-slash-command>",bo="</auto-slash-command>",Rl=/^\/([a-zA-Z][\w-]*)\s*(.*)/,xl=new Set(["ascent","cancel-ascent","help","clear","history","exit","quit"]);var I_=/```[\s\S]*?```/g;function Pl(e){return e.replace(I_,"")}function Al(e){let t=e.trim();if(!t.startsWith("/"))return null;let n=t.match(Rl);if(!n)return null;let[r,o,s]=n;return{command:o.toLowerCase(),args:s.trim(),raw:r}}function Il(e){return xl.has(e.toLowerCase())}function ui(e){let n=Pl(e).trim();if(!n.startsWith("/"))return null;let r=Al(n);return!r||Il(r.command)?null:r}function di(e){return e.filter(t=>t.type==="text").map(t=>t.text||"").join(" ")}var yt=require("fs"),$t=require("path"),Dl=require("os"),Ol=(0,$t.join)((0,Dl.homedir)(),".claude");function Nl(e){let t=/^---\r?\n([\s\S]*?)\r?\n---\r?\n?([\s\S]*)$/,n=e.match(t);if(!n)return{data:{},body:e};let[,r,o]=n,s={};for(let i of r.split(`
731
+ `}async function hC(e,t){let n=On.join(t,"aidlc-docs",e.workflowId,"operations");await ln.ensureDir(n);let r=[],o=e.depthLevel||"MEDIUM";return await ln.writeFile(On.join(n,"release-notes.md"),kg(e),"utf-8"),r.push("release-notes.md"),o==="SHALLOW"?{artifactsGenerated:r,operationsDir:n}:(await ln.writeFile(On.join(n,"deploy-guide.md"),yg(e),"utf-8"),r.push("deploy-guide.md"),await ln.writeFile(On.join(n,"runbook.md"),wg(e),"utf-8"),r.push("runbook.md"),await ln.writeFile(On.join(n,"monitoring.json"),_g(e),"utf-8"),r.push("monitoring.json"),await ln.writeFile(On.join(n,"cost.md"),Sg(e),"utf-8"),r.push("cost.md"),{artifactsGenerated:r,operationsDir:n})}var ln,On,bg=U(()=>{"use strict";ln=v(X(),1),On=v(require("path"),1)});var Xy={};he(Xy,{formatSessionSummaryLine:()=>Cx});function Cx(e){let t;e.agents_used.length===0?t="(none)":e.agents_used.length<=4?t=e.agents_used.join(", "):t=e.agents_used.slice(0,3).join(", ")+", ...";let n=e.duration_seconds,r=Math.floor(n/60),o=n%60,s;r>0?s=`${r}m ${o}s`:s=`${o}s`;let i=e.total_tokens.toLocaleString("en-US"),a=`$${e.estimated_cost.toFixed(e.estimated_cost>=.01?2:3)}`,c=e.agents_used.length,u=`[Olympus] Session: ${c} ${c===1?"agent":"agents"} (${t}) | ${i} tokens | ${a} | ${s}`;return u.length>200&&(u=u.substring(0,197)+"..."),u}var Zy=U(()=>{"use strict"});function aw(e){if(!e)return[];let t=e.toLowerCase(),n=[];for(let[r,o]of Object.entries(xx))for(let s of o)if(t.includes(s)){n.push(r);break}return n}var xx,cw=U(()=>{"use strict";xx={simple_search:["find file","search for","locate","where is","look for","find the"],debugging:["debug","error","fix bug","why is","not working","broken","failing","crash"],implementation:["implement","add feature","create function","build","write code","develop"],refactoring:["refactor","restructure","reorganize","clean up","rename","extract"],documentation:["document","write docs","add comments","explain","readme","api docs"],analysis:["analyze","investigate","examine","review","understand","trace"]}});var dw={};he(dw,{COLD_START_FALLBACK_RATE:()=>sl,getRoutingRecommendation:()=>Ox});function Px(){let e=(0,uw.join)(pe(),"routing-config.json"),t=_e(e,null);if(t)return t;try{at(e,lw)}catch{}return lw}function Ax(e,t){for(let[n,r]of Object.entries(t)){let o=r.indexOf(e);if(o>=0)return{family:n,tierList:r,index:o}}return null}function Ix(e,t){return!e||t===0?sl:t*e.success_rate+(1-t)*sl}function Ox(e,t,n){try{let r=Px();if(!r.preferLowerTier)return null;let o=Ax(e,r.agentTiers);if(!o||o.index===0)return null;let s=qn(n),i=o.tierList.slice(0,o.index);for(let a of i){let c=s[a],l=c?.total_invocations??0,u=Math.min(1,l/5),d=Ix(c,u);if(d<r.minSuccessRate||u>=1&&l<r.minDataPoints)continue;let p="";if(c?.task_patterns&&c.task_patterns.length>0){let g=aw(t);for(let y of c.task_patterns)if(g.includes(y.pattern)&&y.successfulAgents.includes(a)&&y.confidence>=.7){p=` (especially for ${y.pattern.replace(/_/g," ")} tasks)`;break}}let f=(d*100).toFixed(0);return`Based on ${l} data points, ${a} handles this type of task with ${f}% success rate${p}. Consider using ${a} instead of ${e} to save tokens.`}return null}catch{return null}}var uw,sl,lw,pw=U(()=>{"use strict";uw=require("path");we();cw();sl=.5,lw={minDataPoints:10,minSuccessRate:.8,preferLowerTier:!0,agentTiers:{oracle:["oracle-low","oracle-medium","oracle"],olympian:["olympian-low","olympian","olympian-high"],explore:["explore","explore-medium"],librarian:["librarian-low","librarian"],"frontend-engineer":["frontend-engineer-low","frontend-engineer","frontend-engineer-high"]}}});var yA={};he(yA,{main:()=>w_});module.exports=x_(yA);var li=new Map;function I(e){let t=li.get(e.event)||[];t.push(e),t.sort((n,r)=>(n.priority??100)-(r.priority??100)),li.set(e.event,t)}function bl(e){return li.get(e)||[]}var P_={ultrawork:/\b(ultrawork|ulw)\b/i,ultrathink:/\b(ultrathink|think)\b/i,olympus:/\b(olympus|orchestrate|coordinate|multi-?agent|conductor)\b/i,search:/\b(search|find|locate|lookup|explore|discover|scan|grep|query|browse|detect|trace|seek|track|pinpoint|hunt)\b|where\s+is|show\s+me|list\s+all/i,analyze:/\b(analyze|analyse|investigate|examine|research|study|deep.?dive|inspect|audit|evaluate|assess|review|diagnose|scrutinize|dissect|debug|comprehend|interpret|breakdown|understand)\b|why\s+is|how\s+does|how\s+to/i},A_=["ultrawork","ultrathink","olympus","search","analyze"];function El(e){let t=e.replace(/```[\s\S]*?```/g,"");return t=t.replace(/~~~[\s\S]*?~~~/g,""),t=t.replace(/`[^`]+`/g,""),t}function Tl(e,t){let n=[];for(let r of A_){let o=P_[r],s=e.match(o);s&&s.index!==void 0&&n.push({type:r,keyword:s[0],position:s.index})}return n}var Cl="auto-slash-command",vo="<auto-slash-command>",bo="</auto-slash-command>",Rl=/^\/([a-zA-Z][\w-]*)\s*(.*)/,xl=new Set(["ascent","cancel-ascent","help","clear","history","exit","quit"]);var I_=/```[\s\S]*?```/g;function Pl(e){return e.replace(I_,"")}function Al(e){let t=e.trim();if(!t.startsWith("/"))return null;let n=t.match(Rl);if(!n)return null;let[r,o,s]=n;return{command:o.toLowerCase(),args:s.trim(),raw:r}}function Il(e){return xl.has(e.toLowerCase())}function ui(e){let n=Pl(e).trim();if(!n.startsWith("/"))return null;let r=Al(n);return!r||Il(r.command)?null:r}function di(e){return e.filter(t=>t.type==="text").map(t=>t.text||"").join(" ")}var yt=require("fs"),$t=require("path"),Dl=require("os"),Ol=(0,$t.join)((0,Dl.homedir)(),".claude");function Nl(e){let t=/^---\r?\n([\s\S]*?)\r?\n---\r?\n?([\s\S]*)$/,n=e.match(t);if(!n)return{data:{},body:e};let[,r,o]=n,s={};for(let i of r.split(`
732
732
  `)){let a=i.indexOf(":");if(a===-1)continue;let c=i.slice(0,a).trim(),l=i.slice(a+1).trim();(l.startsWith('"')&&l.endsWith('"')||l.startsWith("'")&&l.endsWith("'"))&&(l=l.slice(1,-1)),s[c]=l}return{data:s,body:o}}function $l(e,t){if(!(0,yt.existsSync)(e))return[];let n;try{n=(0,yt.readdirSync)(e,{withFileTypes:!0})}catch{return[]}let r=[];for(let o of n){if(!o.isFile()||!o.name.endsWith(".md"))continue;let s=(0,$t.join)(e,o.name),i=(0,$t.basename)(o.name,".md");try{let a=(0,yt.readFileSync)(s,"utf-8"),{data:c,body:l}=Nl(a),u={name:i,description:c.description||"",argumentHint:c["argument-hint"],model:c.model,agent:c.agent};r.push({name:i,path:s,metadata:u,content:l,scope:t})}catch{continue}}return r}function pi(){let e=(0,$t.join)(Ol,"commands"),t=(0,$t.join)(process.cwd(),".claude","commands"),n=(0,$t.join)(Ol,"skills"),r=$l(e,"user"),o=$l(t,"project"),s=[];if((0,yt.existsSync)(n))try{let i=(0,yt.readdirSync)(n,{withFileTypes:!0});for(let a of i){if(!a.isDirectory())continue;let c=(0,$t.join)(n,a.name,"SKILL.md");if((0,yt.existsSync)(c))try{let l=(0,yt.readFileSync)(c,"utf-8"),{data:u,body:d}=Nl(l),p={name:u.name||a.name,description:u.description||"",argumentHint:u["argument-hint"],model:u.model,agent:u.agent};s.push({name:u.name||a.name,path:c,metadata:p,content:d,scope:"skill"})}catch{continue}}}catch{}return[...o,...r,...s]}function Eo(e){return pi().find(n=>n.name.toLowerCase()===e.toLowerCase())??null}function O_(e,t){return e.replace(/\$ARGUMENTS/g,t||"(no arguments provided)")}function $_(e,t){let n=[];n.push(`<command-name>/${e.name}</command-name>
733
733
  `),e.metadata.description&&n.push(`**Description**: ${e.metadata.description}
734
734
  `),t&&n.push(`**Arguments**: ${t}
@@ -966,7 +966,7 @@ Do not use placeholder text \u2014 write real documentation.`}function Hv(e,t){l
966
966
  `),r=null,o=[];for(let s of n){let i=s.match(/^##\s+(.+)$/);i?(r&&t.set(r,o.join(`
967
967
  `)),r=i[1].trim(),o=[]):r&&o.push(s)}return r&&t.set(r,o.join(`
968
968
  `)),t}function Cb(e){let t=e.split(`
969
- `),n=0;for(let r of t)r.trim().match(/^[-*+]\s+/)&&n++;return n}function Rb(e,t,n){let r=[],o=null,s=bb(e);if(!s)return r.push(`${t}: Missing frontmatter`),{isValid:!1,blockingIssues:r,parentIntent:o};let i=["id","title","parent_intent","status","estimated_effort"],a=[];for(let y of i)s[y]||a.push(y);if(a.length>0)return r.push(`${t}: Missing frontmatter fields: ${a.join(", ")}`),{isValid:!1,blockingIssues:r,parentIntent:o};if(o=s.parent_intent,!n.has(o)&&!o.startsWith("intent-"))return r.push(`${t}: References non-existent parent intent: ${o}`),{isValid:!1,blockingIssues:r,parentIntent:o};let c=parseInt(s.estimated_effort,10);if(isNaN(c)||!vb.includes(c))return r.push(`${t}: Invalid effort estimate ${s.estimated_effort} (must be 1, 2, 4, 8, or 16)`),{isValid:!1,blockingIssues:r,parentIntent:o};let l=Eb(e),u=Tb(l),d=["Scope & Responsibility","Interface Contracts","Dependencies","Acceptance Criteria"],p=["Goal","Acceptance Criteria","Implementation Notes"],f=d.every(y=>u.has(y)),m=p.every(y=>u.has(y));if(!f&&!m){let y=d.filter(w=>!u.has(w));return r.push(`${t}: Missing sections: ${y.join(", ")}`),{isValid:!1,blockingIssues:r,parentIntent:o}}let g=u.get("Acceptance Criteria");if(g){if(Cb(g)===0)return r.push(`${t}: No acceptance criteria found`),{isValid:!1,blockingIssues:r,parentIntent:o}}else return r.push(`${t}: Acceptance Criteria section is empty`),{isValid:!1,blockingIssues:r,parentIntent:o};return{isValid:!0,blockingIssues:r,parentIntent:o}}async function pa(e,t){let n=new Date().toISOString(),r=[],o;try{o=(0,En.readdirSync)(e,{withFileTypes:!0})}catch(m){let g=m;return console.error(`[Validation] Failed to read construction directory: ${g.message}`),console.error(`[Validation] Path: ${e}`),{passed:!1,coverage_percentage:0,blocking_issues:[g.code==="ENOENT"?"Units directory not found":g.code==="EACCES"||g.code==="EPERM"?"Permission denied reading units directory":`Failed to read units directory: ${g.message}`],timestamp:n}}let s=o.filter(m=>m.isDirectory()&&m.name!=="design"),i=o.filter(m=>m.isFile()&&m.name.endsWith(".md")&&m.name!=="design.md"),a=new Set,c=[];for(let m of s){let g=m.name,y=(0,da.join)(e,m.name,"spec.md");(0,En.existsSync)(y)&&(a.add(g),c.push({unitId:g,filePath:y}))}for(let m of i){let g=m.name.replace(".md","");a.has(g)||(a.add(g),c.push({unitId:g,filePath:(0,da.join)(e,m.name)}))}if(c.length===0)return{passed:!1,coverage_percentage:0,blocking_issues:["No unit files found in units directory"],timestamp:n};let l=new Set;try{let m=(0,En.readdirSync)(t).filter(g=>g.startsWith("INTENT-")&&g.endsWith(".md"));l=new Set(m.map(g=>g.replace(".md","")))}catch(m){let g=m;return console.error(`[Validation] Failed to read intents directory: ${g.message}`),console.error(`[Validation] Path: ${t}`),{passed:!1,coverage_percentage:0,blocking_issues:[g.code==="ENOENT"?"Intents directory not found":g.code==="EACCES"||g.code==="EPERM"?"Permission denied reading intents directory":`Failed to read intents directory: ${g.message}`],timestamp:n}}let u=new Set,d=0,p=c.length;for(let{unitId:m,filePath:g}of c){let y;try{y=(0,En.readFileSync)(g,"utf-8")}catch(_){let h=_;console.error(`[Validation] Failed to read unit file: ${h.message}`),console.error(`[Validation] Path: ${g}`);let b=h.code==="ENOENT"?`Unit file not found: ${m}`:h.code==="EACCES"||h.code==="EPERM"?`Permission denied reading unit file: ${m}`:`Failed to read unit file ${m}: ${h.message}`;r.push(b);continue}let w=Rb(y,m,l);r.push(...w.blockingIssues),w.parentIntent&&l.has(w.parentIntent)&&u.add(w.parentIntent),w.isValid&&d++}for(let m of l)u.has(m)||r.push(`Intent ${m} has no unit children`);let f=Math.round(d/p*100);return{passed:r.length===0&&d===p,coverage_percentage:f,blocking_issues:r,timestamp:n}}Uo();Z();function lf(e,t,n){let o=(n.construction_bolts?Object.keys(n.construction_bolts).length:0)+1,s=sa(e.title,o),i=e,a=Array.isArray(i.acceptance_criteria)&&i.acceptance_criteria.length>0?i.acceptance_criteria:["Implement as described in intent"],c=Array.isArray(i.target_files)?i.target_files:[];return{id:s,type:"bolt",title:e.title,parent_id:e.id,children_ids:[],status:"pending",assigned_agent:null,estimated_effort:e.estimated_effort,parent_unit_id:e.id,sequence:1,scope:t.substring(0,500)||e.title,acceptance_criteria:a,target_files:c,dependencies:[],requires_bolts:[],enables_bolts:[],requires_units:[],blocked:!1,depth_target:1,express_mode:!0,estimated_effort_hours:e.estimated_effort,requirements:[],stories:[],docs_impact:["none"]}}var xb=v(require("path"),1);function Yo(){return{status:"not_started",started_at:null,completed_at:null,failure_count:0,last_error:null,artifact_path:null}}function uf(e,t){t.construction_bolts||(t.construction_bolts={});for(let n of e){let r={bolt_id:n.id,parent_unit_id:n.parent_unit_id,status:"planned",stages:{elaboration:Yo(),code_generation:Yo(),build_and_test:Yo(),review:Yo()},failure_count:0,last_error:null,review_score:null,acknowledged_by:null,acknowledged_at:null,requires_bolts:n.requires_bolts??[],enables_bolts:n.enables_bolts??[],requires_units:n.requires_units??[],blocked:n.blocked??!1};t.construction_bolts[n.id]=r}}ce();var Pb=["elaboration","code_generation","build_and_test","review"],Ab={elaboration:"onElaboration",code_generation:"onCodeGeneration",build_and_test:"onBuildAndTest",review:"onReview"},Ib={build_and_test:"built",review:"done"};async function Ob(e,t,n,r){let o=Ab[t];return t==="build_and_test"?e.onBuildAndTest(n,r,n.target_files??[]):e[o](n,r)}async function $b(e,t,n,r,o){let s=t.construction_bolts[e.id];if(t.active_bolt_id=e.id,s.blocked)return t.active_bolt_id=null,await P(n,t),{status:s.status,stages:{...s.stages}};s.status="in_progress",await P(n,t);for(let i of Pb){let a=s.stages[i];if(e.express_mode&&i==="elaboration"){a.status="skipped",a.completed_at=new Date().toISOString(),await P(n,t);continue}i==="review"&&(s.status="in_review",await P(n,t)),t.active_bolt_stage=i,a.status="in_progress",a.started_at=new Date().toISOString(),await P(n,t);let c=await Ob(o,i,e,n);if(c.success){a.status="completed",a.completed_at=new Date().toISOString(),c.artifact_path&&(a.artifact_path=c.artifact_path);let l=Ib[i];l&&(s.status=l),await P(n,t)}else{if(a.failure_count+=1,a.last_error=c.error??"Unknown error",s.failure_count+=1,s.last_error=a.last_error,a.failure_count>=2){a.status="failed",s.status="failed",await P(n,t);break}a.status="not_started",await P(n,t);break}}if(t.active_bolt_id=null,s.status==="done"&&t.construction_bolts){let i=e.id;for(let a of Object.values(t.construction_bolts))if(a.requires_bolts?.includes(i)){let c=a.requires_bolts.every(u=>{let d=t.construction_bolts[u];return d&&d.status==="done"}),l=(a.requires_units??[]).every(u=>{let d=t.construction_units?.[u];return d?Object.values(d.stages).every(p=>p.status==="completed"||p.status==="skipped"):!1});c&&l&&(a.blocked=!1)}}return t.active_bolt_stage=null,await P(n,t),{status:s.status,stages:{...s.stages}}}var df={execute:$b};ha();var LT={unit:"olympian","code-generation":"olympian",design:"olympian"},ys=class{projectPath;workflowId;tree=null;currentStage="unit";totalUnits=0;totalCodeGenerations=0;totalEffort=0;constructor(t,n){this.projectPath=t,this.workflowId=n}async execute(t,n={}){let{depth:r="MEDIUM",max_units:o=10,max_code_gen_per_unit:s=8,max_total_code_gen:i=50,checkpointStatus:a,onCheckpointSave:c}=n;if(a==="awaiting_dev_review")return{passed:!1,coverage_percentage:0,blocking_issues:["Construction blocked: developer review of technical specification required (Risk Tier 3)."],reviewer:"construction-executor",timestamp:new Date().toISOString()};if(console.log(`[ConstructionExecutor] Starting Construction phase execution (depth: ${r})`),(n.pathwayType==="brownfield-enhancement"||n.pathwayType==="brownfield-refactor"||n.pathwayType==="bugfix")&&n.testCommand)try{let{captureBaseline:p}=await Promise.resolve().then(()=>(wa(),ya));await p(this.projectPath,this.workflowId,n.testCommand),console.log("[ConstructionExecutor] Regression baseline captured")}catch(p){console.error("[ConstructionExecutor] Baseline capture failed (non-fatal):",p)}if(r==="SHALLOW")return this.executeShallowViaBolt();this.currentStage="unit";let u=await this.executeDecompositionPhase(o,s,i,r);if(!u.passed)return console.error("[ConstructionExecutor] Decomposition phase failed"),u;if(console.log("[ConstructionExecutor] Decomposition phase complete"),c)try{await c()}catch(p){console.error("[ConstructionExecutor] Checkpoint save callback failed:",p)}this.currentStage="design";let d=await this.executeDesignStage(t);return d.passed?(console.log("[ConstructionExecutor] Design stage complete"),{passed:!0,coverage_percentage:100,blocking_issues:[],reviewer:"construction-executor",timestamp:new Date().toISOString()}):(console.error("[ConstructionExecutor] Design stage failed validation"),d)}getProgress(){let t=0,n=0;if(this.tree)for(let i of this.tree.nodes.values())i.type==="unit"&&(t++,i.status==="complete"&&n++);let r=this.totalCodeGenerations,o=0,s=0;return this.currentStage==="unit"?s=t>0?Math.round(n/t*50):0:this.currentStage==="code-generation"?s=50+(r>0?Math.round(o/r*25):0):this.currentStage==="design"&&(s=100),{current_stage:this.currentStage,units_total:t,units_complete:n,code_gen_total:r,code_gen_complete:o,design_complete:this.currentStage==="design",overall_percentage:s}}getDecompositionSummary(){return{units:this.totalUnits,codeGenerations:this.totalCodeGenerations,totalEffort:this.totalEffort}}async handleZeroBoltUnit(t,n={}){let r=n.projectPath||this.projectPath,o=n.workflowId||this.workflowId,s=await I(r,o);return!s||Object.values(s.construction_bolts??{}).filter(a=>a.parent_unit_id===t).length>0?!1:(s.construction_units||(s.construction_units={}),s.construction_units[t]&&(s.construction_units[t].code_generation_status="completed"),zo(r,o,{timestamp:new Date().toISOString(),phase:"construction",action:`Unit ${t} auto-fulfilled (zero bolts)`,actor:"construction-executor",reason:null}),await P(r,s),console.log(`[ConstructionExecutor] Unit ${t} auto-fulfilled: 0 bolts registered`),!0)}async executeCodeGenerationWithPlanApproval(t,n={}){let r=n.projectPath||this.projectPath,o=n.workflowId||this.workflowId,{buildCodePlanPath:s,dispatchCodeGeneration:i,buildCodeGenerationPrompt:a}=await Promise.resolve().then(()=>(ds(),us)),c=s(r,o,t),l=await i(r,o,t),u=a(l.context.intentSummary2,l.context.intentSummary,l.context.unitSpec,c,l.context.architectureContext);return{status:"awaiting_code_plan_approval",codePlanPath:c,prompt:u}}async approveCodePlan(t,n){let{buildCodePlanPath:r,dispatchCodeGeneration:o,buildCodeGenerationPrompt:s}=await Promise.resolve().then(()=>(ds(),us)),{addGateAuditEntry:i}=await Promise.resolve().then(()=>(Z(),vn)),a=r(this.projectPath,this.workflowId,t);if(!await Y.default.pathExists(a))throw new Error(`Code plan file not found at ${a}. The agent must create the plan before it can be approved.`);let l=H.default.join(this.projectPath,"aidlc-docs",this.workflowId,"manifest.json");try{i(l,{phase:"construction",action:"approved",actor:"human",reason:n||`Code plan for ${t} approved by developer`})}catch(p){console.error(`[ConstructionExecutor] Failed to record gate audit for ${t}:`,p)}let u=await o(this.projectPath,this.workflowId,t);return{status:"executing_code_plan",prompt:s(u.context.intentSummary2,u.context.intentSummary,u.context.unitSpec,void 0,u.context.architectureContext)}}async autoApproveCodePlan(t,n){let{addGateAuditEntry:r}=await Promise.resolve().then(()=>(Z(),vn)),o=H.default.join(this.projectPath,"aidlc-docs",this.workflowId,"manifest.json"),s=n>=3;try{r(o,{phase:"construction",action:"approved",actor:"trust",reason:s?`Code plan for ${t} auto-approved silently (trust level ${n})`:`Code plan for ${t} auto-approved with notification (trust level ${n})`})}catch(u){console.error(`[ConstructionExecutor] Failed to record gate audit for ${t}:`,u)}s||console.log(`[ConstructionExecutor] Code plan for ${t} auto-approved (trust level ${n})`);let{dispatchCodeGeneration:i,buildCodeGenerationPrompt:a}=await Promise.resolve().then(()=>(ds(),us)),c=await i(this.projectPath,this.workflowId,t);return{status:"executing_code_plan",prompt:a(c.context.intentSummary2,c.context.intentSummary,c.context.unitSpec,void 0,c.context.architectureContext)}}async executeTestGeneration(t,n={}){let r=n.projectPath||this.projectPath,o=n.workflowId||this.workflowId,i=await I(r,o)??{schema_version:"3.0.0",workflow_id:o,feature_name:"",current_phase:"construction",current_stage:"code-generation",status:"in_progress",phases:{},manifest_path:"",trust_state_path:"",created_at:new Date().toISOString(),updated_at:new Date().toISOString(),construction_units:{}};i.construction_units||(i.construction_units={});let a=i.construction_units[t]??{unitId:t,stages:{"functional-design":{status:"not_started",artifact_path:null,completed_at:null,failure_count:0,last_error:null},"nfr-requirements":{status:"not_started",artifact_path:null,completed_at:null,failure_count:0,last_error:null},"nfr-design":{status:"not_started",artifact_path:null,completed_at:null,failure_count:0,last_error:null},"infrastructure-design":{status:"not_started",artifact_path:null,completed_at:null,failure_count:0,last_error:null},"code-generation":{status:"not_started",artifact_path:null,completed_at:null,failure_count:0,last_error:null},"test-generation":{status:"not_started",artifact_path:null,completed_at:null,failure_count:0,last_error:null}},code_plan_path:null,code_generation_status:"not_started",tests_total:0,tests_passed:0,tests_failed:0,test_framework:"unknown",test_generation_status:"not_started"};a.stages["test-generation"].status="in_progress",a.test_generation_status="in_progress",i.construction_units[t]=a,await P(r,i);let c=H.default.join(r,"aidlc-docs",o,"construction",t,"testing");await Y.default.ensureDir(c);let l=H.default.join(c,"test-report.md"),u="",d=H.default.join(r,"aidlc-docs",o,"construction",t,"code","code-summary.md");try{await Y.default.pathExists(d)&&(u=await Y.default.readFile(d,"utf-8"))}catch{}let p=await this.detectTestFramework(r),f=new Date().toISOString(),m=this.buildTestReportScaffold(t,p,u,f);await Y.default.writeFile(l,m,"utf-8");let g=0,y=0,w=0,_=0,h=0;n.currentResults&&n.currentResults.length>0&&(g=n.currentResults.length,y=n.currentResults.filter(C=>C.status==="passed").length,w=n.currentResults.filter(C=>C.status==="failed").length);let b=!1,S=0,T=H.default.join(r,"aidlc-docs",o,"construction","regression-baseline.json");if(n.currentResults&&w>0&&await Y.default.pathExists(T))try{let{compareAgainstBaseline:C,writeRegressionReport:$}=await Promise.resolve().then(()=>(wa(),ya)),{categorizeFailure:D,buildRegressionSummary:x}=await Promise.resolve().then(()=>(Sm(),km)),E=await Y.default.readJson(T);b=!0;let L=C(E,n.currentResults),j=[],K=[];for(let $e of L.new_failures){let Dr=E.tests.find(Jt=>Jt.name===$e.name)??null,Ke=D($e.name,Dr,[]);j.push(Ke),K.push({test_name:$e.name,file_path:$e.filePath,category:Ke,rationale:Ke==="legitimate_regression"?"Test was passing in baseline, now fails":Ke==="flaky"?"Test passed on re-run without code changes":Ke==="intentional_change"?"New test not present in baseline":"Test was already failing in baseline"})}let q=x(K.map($e=>({test_name:$e.test_name,file_path:$e.file_path})),j);_=q.regressions_count,h=q.flaky_count,S=q.regressions_count;let hn={workflow_id:o,unit_id:t,baseline_captured_at:E.captured_at,compared_at:new Date().toISOString(),failures:K,total_regressions:j.filter($e=>$e!=="pre_existing_failure").length,legitimate_regressions:q.regressions_count};await $(r,o,t,hn)}catch(C){console.error(`[ConstructionExecutor] Regression analysis failed for ${t} (non-fatal):`,C)}let k="completed",F;if(n.allowFailures!==!0&&(g===0?(k="blocked",F=`No tests detected for unit ${t}. Set allowFailures: true to override.`):b&&S>0?(k="blocked",F=`${S} legitimate regression(s) for unit ${t}. Flaky: ${h} (non-blocking). Fix regressions before proceeding.`):!b&&w>0&&(k="blocked",F=`${w} test(s) failed for unit ${t}. Set allowFailures: true to override.`)),a.stages["test-generation"].status=k==="completed"?"completed":"in_progress",a.stages["test-generation"].artifact_path=l,k==="completed"&&(a.stages["test-generation"].completed_at=f),a.tests_total=g,a.tests_passed=y,a.tests_failed=w,a.test_framework=p,a.test_generation_status=k==="completed"?"completed":"in_progress",a.regressions_count=_,a.flaky_count=h,i.construction_units[t]=a,await P(r,i),k==="completed")try{let{updateArchitectureModel:C}=await Promise.resolve().then(()=>(Jr(),Zo)),$=await this.discoverUnitFiles(r,o,t);$.length>0&&(await C(r,$),a.architecture_model_status="updated",i.construction_units[t]=a,await P(r,i))}catch(C){console.error(`[ConstructionExecutor] Architecture model update failed for ${t} (non-blocking):`,C),a.architecture_model_status="failed",i.construction_units[t]=a;try{await P(r,i)}catch($){console.warn("[ConstructionExecutor] Failed to save checkpoint after architecture model failure:",$)}}let R;if(k==="completed")try{let{runValidationPipeline:C,shouldSkipValidator:$,updateCheckpointForValidator:D,createQualityValidator:x,createMutationValidator:E,createTraceabilityValidator:L,createContractValidator:j,createCoverageValidator:K}=await Promise.resolve().then(()=>(Gm(),Bm)),q=await this.discoverUnitFiles(r,o,t),hn=this.detectApiSurfaceFiles(q),$e=this.deriveWorkflowDepth(i),Dr={timeoutBudgetMs:3e4,allowFailures:n.allowFailures??!1,workflowDepth:$e,unitId:t,unitFiles:q,apiSurfaceFiles:hn,projectPath:r,workflowId:o},Ke=new Map;Ke.set("quality",x()),$("mutation",Dr).skip||Ke.set("mutation",E()),Ke.set("traceability",L()),$("contract",Dr).skip||Ke.set("contract",j()),Ke.set("coverage",K()),R=await C(Ke,Dr);for(let{validator:Jt,result:Ot}of R.results){let __=Ot.status==="passed"||Ot.status==="warned"?"completed":Ot.status==="skipped"?"skipped":"in_progress",k_=Jt==="coverage"?Ot.coverage_percentage:void 0,S_=Jt==="coverage"?Ot.findings.filter(v_=>v_.category==="uncovered-critical-file").length:void 0;await D(r,o,t,Jt,__,k_,S_)}if(!n.allowFailures){let Jt=R.results.filter(Ot=>Ot.result.status==="failed");Jt.length>0&&(k="blocked",F=`Validation blocked: ${Jt.map(Ot=>Ot.validator).join(", ")}`,a.stages["test-generation"].status="in_progress",a.test_generation_status="in_progress",i.construction_units[t]=a,await P(r,i))}}catch(C){console.error(`[ConstructionExecutor] Validation pipeline failed for ${t} (non-fatal):`,C)}return{status:k,unitId:t,tests_total:g,tests_passed:y,tests_failed:w,test_framework:p,reportPath:l,blockingReason:F,regressions_count:_,flaky_count:h,validationPipeline:R}}async validateBugfixTestRequirement(t,n={}){try{let r=n.projectPath||this.projectPath,o=n.workflowId||this.workflowId,s=await I(r,o);if(!s)return{valid:!1,reason:"checkpoint not found"};if(s.pathway_type!=="bugfix")return{valid:!0};let i=s.construction_units?.[t];return i?i.stages?.["test-generation"]?.status!=="completed"?{valid:!1,reason:"test-generation stage not completed for bugfix unit"}:(i.tests_total??0)===0?{valid:!1,reason:"bugfix unit must have at least one test (tests_total === 0)"}:{valid:!0}:{valid:!1,reason:`no unit progress found for unit ${t}`}}catch(r){let o=r instanceof Error?r.message:String(r);return console.error(`[ConstructionExecutor] validateBugfixTestRequirement error for ${t}:`,r),{valid:!1,reason:`validation error: ${o}`}}}async executeDocumentationGeneration(t,n={}){let r=n.projectPath||this.projectPath,o=n.workflowId||this.workflowId,s=await I(r,o),i=s?.depth_score?s.depth_score<=12?"minimal":s.depth_score<=20?"standard":"comprehensive":"standard",a=s?.pathway_type||"brownfield-enhancement",c=await this.discoverUnitFiles(r,o,t),l={unitId:t,workflowId:o,projectPath:r,depth:i,pathway:a,unitFiles:c},u=Vp(l),d,p=0,f=[],m;if(u.status==="completed"){try{let g=qp({projectPath:r,workflowId:o,unitId:t,modifiedFiles:l.unitFiles||[]});d={status:g.impactScan.status,path:g.impactScan.reportPath},p=g.adrCount,g.adrEntries&&(f=g.adrEntries)}catch{}if(u.path&&a!=="bugfix"&&i!=="minimal")try{let g=s?.construction_units?.[t];m=Zi({featureDocPath:u.path,projectPath:r,depth:i,pathway:a,override:g?.recreation_readiness_override,overrideRationale:g?.recreation_readiness_override_rationale??void 0})}catch{}}if(s?.construction_units?.[t]){let g=s.construction_units[t];g.feature_doc_status=u.status==="completed"?"completed":"not_started",g.feature_doc_path=u.path,g.impact_scan_status=d?.status==="completed"?"completed":"not_started",g.impact_scan_report_path=d?.path??null,g.adr_count=p,g.adr_entries=f.length>0?f:void 0,m&&(g.recreation_readiness_score=m.overall_score,g.recreation_readiness_dimensions=m.dimensions??null),u.status==="completed"&&(g.doc_generation_agent=LT["code-generation"],g.doc_generation_prompt=Hp(l)),await P(r,s)}return{featureDoc:u,impactScan:d,adrCount:p,recreationReadiness:m}}async executeUnitCompletion(t,n={}){let r=n.projectPath||this.projectPath,o=n.workflowId||this.workflowId,s=await this.executeTestGeneration(t,n);if(s.status==="completed"){try{let i=await this.discoverUnitFiles(r,o,t);i.length>0&&Yp(r,i)}catch(i){console.error(`[ConstructionExecutor] Secrets management failed for ${t} (non-blocking):`,i)}try{let i=await this.discoverUnitFiles(r,o,t),a=await Zp({projectPath:r,workflowId:o,unitId:t,includeGlobs:i.length>0?i:void 0}),c=await I(r,o);if(c?.construction_units?.[t]){let l=c.construction_units[t];l.security_scan_status=a.status==="completed"?"completed":a.status==="failed"?"in_progress":"not_started",l.security_findings_critical=a.findings.filter(u=>u.severity==="critical").length,l.security_findings_warning=a.findings.filter(u=>u.severity==="warning").length,l.security_findings_info=a.findings.filter(u=>u.severity==="info").length,await P(r,c)}}catch(i){console.error(`[ConstructionExecutor] Security scan failed for ${t} (non-blocking):`,i)}if(!n.skipDocumentation){let i=await this.executeDocumentationGeneration(t,{projectPath:r,workflowId:o});return{testGeneration:s,documentation:i}}}return{testGeneration:s}}async executeSmokeTest(t={}){let n=t.projectPath||this.projectPath,r=t.workflowId||this.workflowId,o=await I(n,r);if(!o||!o.construction_units)return{status:"not_run",reportPath:null};let s=o.construction_units,i=Object.keys(s);if(i.length===0)return{status:"not_run",reportPath:null};let a=0,c=0,l=0,u=0,d=0,p=0,f=0,m=0,g=[];for(let T of i){let k=s[T],F=k.tests_total??0,R=k.tests_passed??0,O=k.tests_failed??0,C=F-R-O,$=k.regressions_count??0,D=k.flaky_count??0;F>0&&(f++,O===0&&m++),a+=F,c+=R,l+=O,u+=Math.max(0,C),d+=$,p+=D;let x=F===0?"\u26A0\uFE0F":O===0?"\u2705":"\u274C";g.push(`| ${T} | ${F} | ${R} | ${O} | ${$} | ${D} | ${x} |`)}let y=a===0?"not_run":l===0?"passed":"failed",w=H.default.join(n,"aidlc-docs",r,"construction","build-and-test");await Y.default.ensureDir(w);let _=H.default.join(w,"test-report.md"),h=new Date().toISOString(),b=`# Build-Level Test Report
969
+ `),n=0;for(let r of t)r.trim().match(/^[-*+]\s+/)&&n++;return n}function Rb(e,t,n){let r=[],o=null,s=bb(e);if(!s)return r.push(`${t}: Missing frontmatter`),{isValid:!1,blockingIssues:r,parentIntent:o};let i=["id","title","parent_intent","status","estimated_effort"],a=[];for(let y of i)s[y]||a.push(y);if(a.length>0)return r.push(`${t}: Missing frontmatter fields: ${a.join(", ")}`),{isValid:!1,blockingIssues:r,parentIntent:o};if(o=s.parent_intent,!n.has(o)&&!o.startsWith("intent-"))return r.push(`${t}: References non-existent parent intent: ${o}`),{isValid:!1,blockingIssues:r,parentIntent:o};let c=parseInt(s.estimated_effort,10);if(isNaN(c)||!vb.includes(c))return r.push(`${t}: Invalid effort estimate ${s.estimated_effort} (must be 1, 2, 4, 8, or 16)`),{isValid:!1,blockingIssues:r,parentIntent:o};let l=Eb(e),u=Tb(l),d=["Scope & Responsibility","Interface Contracts","Dependencies","Acceptance Criteria"],p=["Goal","Acceptance Criteria","Implementation Notes"],f=d.every(y=>u.has(y)),m=p.every(y=>u.has(y));if(!f&&!m){let y=d.filter(w=>!u.has(w));return r.push(`${t}: Missing sections: ${y.join(", ")}`),{isValid:!1,blockingIssues:r,parentIntent:o}}let g=u.get("Acceptance Criteria");if(g){if(Cb(g)===0)return r.push(`${t}: No acceptance criteria found`),{isValid:!1,blockingIssues:r,parentIntent:o}}else return r.push(`${t}: Acceptance Criteria section is empty`),{isValid:!1,blockingIssues:r,parentIntent:o};return{isValid:!0,blockingIssues:r,parentIntent:o}}async function pa(e,t){let n=new Date().toISOString(),r=[],o;try{o=(0,En.readdirSync)(e,{withFileTypes:!0})}catch(m){let g=m;return console.error(`[Validation] Failed to read construction directory: ${g.message}`),console.error(`[Validation] Path: ${e}`),{passed:!1,coverage_percentage:0,blocking_issues:[g.code==="ENOENT"?"Units directory not found":g.code==="EACCES"||g.code==="EPERM"?"Permission denied reading units directory":`Failed to read units directory: ${g.message}`],timestamp:n}}let s=o.filter(m=>m.isDirectory()&&m.name!=="design"),i=o.filter(m=>m.isFile()&&m.name.endsWith(".md")&&m.name!=="design.md"),a=new Set,c=[];for(let m of s){let g=m.name,y=(0,da.join)(e,m.name,"spec.md");(0,En.existsSync)(y)&&(a.add(g),c.push({unitId:g,filePath:y}))}for(let m of i){let g=m.name.replace(".md","");a.has(g)||(a.add(g),c.push({unitId:g,filePath:(0,da.join)(e,m.name)}))}if(c.length===0)return{passed:!1,coverage_percentage:0,blocking_issues:["No unit files found in units directory"],timestamp:n};let l=new Set;try{let m=(0,En.readdirSync)(t).filter(g=>g.startsWith("INTENT-")&&g.endsWith(".md"));l=new Set(m.map(g=>g.replace(".md","")))}catch(m){let g=m;return console.error(`[Validation] Failed to read intents directory: ${g.message}`),console.error(`[Validation] Path: ${t}`),{passed:!1,coverage_percentage:0,blocking_issues:[g.code==="ENOENT"?"Intents directory not found":g.code==="EACCES"||g.code==="EPERM"?"Permission denied reading intents directory":`Failed to read intents directory: ${g.message}`],timestamp:n}}let u=new Set,d=0,p=c.length;for(let{unitId:m,filePath:g}of c){let y;try{y=(0,En.readFileSync)(g,"utf-8")}catch(_){let h=_;console.error(`[Validation] Failed to read unit file: ${h.message}`),console.error(`[Validation] Path: ${g}`);let b=h.code==="ENOENT"?`Unit file not found: ${m}`:h.code==="EACCES"||h.code==="EPERM"?`Permission denied reading unit file: ${m}`:`Failed to read unit file ${m}: ${h.message}`;r.push(b);continue}let w=Rb(y,m,l);r.push(...w.blockingIssues),w.parentIntent&&l.has(w.parentIntent)&&u.add(w.parentIntent),w.isValid&&d++}for(let m of l)u.has(m)||r.push(`Intent ${m} has no unit children`);let f=Math.round(d/p*100);return{passed:r.length===0&&d===p,coverage_percentage:f,blocking_issues:r,timestamp:n}}Uo();Z();function lf(e,t,n){let o=(n.construction_bolts?Object.keys(n.construction_bolts).length:0)+1,s=sa(e.title,o),i=e,a=Array.isArray(i.acceptance_criteria)&&i.acceptance_criteria.length>0?i.acceptance_criteria:["Implement as described in intent"],c=Array.isArray(i.target_files)?i.target_files:[];return{id:s,type:"bolt",title:e.title,parent_id:e.id,children_ids:[],status:"pending",assigned_agent:null,estimated_effort:e.estimated_effort,parent_unit_id:e.id,sequence:1,scope:t.substring(0,500)||e.title,acceptance_criteria:a,target_files:c,dependencies:[],requires_bolts:[],enables_bolts:[],requires_units:[],blocked:!1,depth_target:1,express_mode:!0,estimated_effort_hours:e.estimated_effort,requirements:[],stories:[],docs_impact:["none"]}}var xb=v(require("path"),1);function Yo(){return{status:"not_started",started_at:null,completed_at:null,failure_count:0,last_error:null,artifact_path:null}}function uf(e,t){t.construction_bolts||(t.construction_bolts={});for(let n of e){let r={bolt_id:n.id,parent_unit_id:n.parent_unit_id,status:"planned",stages:{elaboration:Yo(),code_generation:Yo(),build_and_test:Yo(),review:Yo()},failure_count:0,last_error:null,review_score:null,acknowledged_by:null,acknowledged_at:null,requires_bolts:n.requires_bolts??[],enables_bolts:n.enables_bolts??[],requires_units:n.requires_units??[],blocked:n.blocked??!1};t.construction_bolts[n.id]=r}}ce();var Pb=["elaboration","code_generation","build_and_test","review"],Ab={elaboration:"onElaboration",code_generation:"onCodeGeneration",build_and_test:"onBuildAndTest",review:"onReview"},Ib={build_and_test:"built",review:"done"};async function Ob(e,t,n,r){let o=Ab[t];return t==="build_and_test"?e.onBuildAndTest(n,r,n.target_files??[]):e[o](n,r)}async function $b(e,t,n,r,o){let s=t.construction_bolts[e.id];if(t.active_bolt_id=e.id,s.blocked)return t.active_bolt_id=null,await P(n,t),{status:s.status,stages:{...s.stages}};s.status="in_progress",await P(n,t);for(let i of Pb){let a=s.stages[i];if(e.express_mode&&i==="elaboration"){a.status="skipped",a.completed_at=new Date().toISOString(),await P(n,t);continue}i==="review"&&(s.status="in_review",await P(n,t)),t.active_bolt_stage=i,a.status="in_progress",a.started_at=new Date().toISOString(),await P(n,t);let c=await Ob(o,i,e,n);if(c.success){a.status="completed",a.completed_at=new Date().toISOString(),c.artifact_path&&(a.artifact_path=c.artifact_path);let l=Ib[i];l&&(s.status=l),await P(n,t)}else{if(a.failure_count+=1,a.last_error=c.error??"Unknown error",s.failure_count+=1,s.last_error=a.last_error,a.failure_count>=2){a.status="failed",s.status="failed",await P(n,t);break}a.status="not_started",await P(n,t);break}}if(t.active_bolt_id=null,s.status==="done"&&t.construction_bolts){let i=e.id;for(let a of Object.values(t.construction_bolts))if(a.requires_bolts?.includes(i)){let c=a.requires_bolts.every(u=>{let d=t.construction_bolts[u];return d&&d.status==="done"}),l=(a.requires_units??[]).every(u=>{let d=t.construction_units?.[u];return d?Object.values(d.stages).every(p=>p.status==="completed"||p.status==="skipped"):!1});c&&l&&(a.blocked=!1)}}return t.active_bolt_stage=null,await P(n,t),{status:s.status,stages:{...s.stages}}}var df={execute:$b};ha();var LT={unit:"olympian","code-generation":"olympian",design:"olympian"},ys=class{projectPath;workflowId;tree=null;currentStage="unit";totalUnits=0;totalCodeGenerations=0;totalEffort=0;constructor(t,n){this.projectPath=t,this.workflowId=n}async execute(t,n={}){let{depth:r="MEDIUM",max_units:o=10,max_code_gen_per_unit:s=8,max_total_code_gen:i=50,checkpointStatus:a,onCheckpointSave:c}=n;if(a==="awaiting_dev_review")return{passed:!1,coverage_percentage:0,blocking_issues:["Construction blocked: developer review of technical specification required (Risk Tier 3)."],reviewer:"construction-executor",timestamp:new Date().toISOString()};if(console.log(`[ConstructionExecutor] Starting Construction phase execution (depth: ${r})`),(n.pathwayType==="brownfield-enhancement"||n.pathwayType==="brownfield-refactor"||n.pathwayType==="bugfix")&&n.testCommand)try{let{captureBaseline:p}=await Promise.resolve().then(()=>(wa(),ya));await p(this.projectPath,this.workflowId,n.testCommand),console.log("[ConstructionExecutor] Regression baseline captured")}catch(p){console.error("[ConstructionExecutor] Baseline capture failed (non-fatal):",p)}if(r==="SHALLOW")return this.executeShallowViaBolt();this.currentStage="unit";let u=await this.executeDecompositionPhase(o,s,i,r);if(!u.passed)return console.error("[ConstructionExecutor] Decomposition phase failed"),u;if(console.log("[ConstructionExecutor] Decomposition phase complete"),c)try{await c()}catch(p){console.error("[ConstructionExecutor] Checkpoint save callback failed:",p)}this.currentStage="design";let d=await this.executeDesignStage(t);return d.passed?(console.log("[ConstructionExecutor] Design stage complete"),{passed:!0,coverage_percentage:100,blocking_issues:[],reviewer:"construction-executor",timestamp:new Date().toISOString()}):(console.error("[ConstructionExecutor] Design stage failed validation"),d)}getProgress(){let t=0,n=0;if(this.tree)for(let i of this.tree.nodes.values())i.type==="unit"&&(t++,i.status==="complete"&&n++);let r=this.totalCodeGenerations,o=0,s=0;return this.currentStage==="unit"?s=t>0?Math.round(n/t*50):0:this.currentStage==="code-generation"?s=50+(r>0?Math.round(o/r*25):0):this.currentStage==="design"&&(s=100),{current_stage:this.currentStage,units_total:t,units_complete:n,code_gen_total:r,code_gen_complete:o,design_complete:this.currentStage==="design",overall_percentage:s}}getDecompositionSummary(){return{units:this.totalUnits,codeGenerations:this.totalCodeGenerations,totalEffort:this.totalEffort}}async handleZeroBoltUnit(t,n={}){let r=n.projectPath||this.projectPath,o=n.workflowId||this.workflowId,s=await A(r,o);return!s||Object.values(s.construction_bolts??{}).filter(a=>a.parent_unit_id===t).length>0?!1:(s.construction_units||(s.construction_units={}),s.construction_units[t]&&(s.construction_units[t].code_generation_status="completed"),zo(r,o,{timestamp:new Date().toISOString(),phase:"construction",action:`Unit ${t} auto-fulfilled (zero bolts)`,actor:"construction-executor",reason:null}),await P(r,s),console.log(`[ConstructionExecutor] Unit ${t} auto-fulfilled: 0 bolts registered`),!0)}async executeCodeGenerationWithPlanApproval(t,n={}){let r=n.projectPath||this.projectPath,o=n.workflowId||this.workflowId,{buildCodePlanPath:s,dispatchCodeGeneration:i,buildCodeGenerationPrompt:a}=await Promise.resolve().then(()=>(ds(),us)),c=s(r,o,t),l=await i(r,o,t),u=a(l.context.intentSummary2,l.context.intentSummary,l.context.unitSpec,c,l.context.architectureContext);return{status:"awaiting_code_plan_approval",codePlanPath:c,prompt:u}}async approveCodePlan(t,n){let{buildCodePlanPath:r,dispatchCodeGeneration:o,buildCodeGenerationPrompt:s}=await Promise.resolve().then(()=>(ds(),us)),{addGateAuditEntry:i}=await Promise.resolve().then(()=>(Z(),vn)),a=r(this.projectPath,this.workflowId,t);if(!await Y.default.pathExists(a))throw new Error(`Code plan file not found at ${a}. The agent must create the plan before it can be approved.`);let l=H.default.join(this.projectPath,"aidlc-docs",this.workflowId,"manifest.json");try{i(l,{phase:"construction",action:"approved",actor:"human",reason:n||`Code plan for ${t} approved by developer`})}catch(p){console.error(`[ConstructionExecutor] Failed to record gate audit for ${t}:`,p)}let u=await o(this.projectPath,this.workflowId,t);return{status:"executing_code_plan",prompt:s(u.context.intentSummary2,u.context.intentSummary,u.context.unitSpec,void 0,u.context.architectureContext)}}async autoApproveCodePlan(t,n){let{addGateAuditEntry:r}=await Promise.resolve().then(()=>(Z(),vn)),o=H.default.join(this.projectPath,"aidlc-docs",this.workflowId,"manifest.json"),s=n>=3;try{r(o,{phase:"construction",action:"approved",actor:"trust",reason:s?`Code plan for ${t} auto-approved silently (trust level ${n})`:`Code plan for ${t} auto-approved with notification (trust level ${n})`})}catch(u){console.error(`[ConstructionExecutor] Failed to record gate audit for ${t}:`,u)}s||console.log(`[ConstructionExecutor] Code plan for ${t} auto-approved (trust level ${n})`);let{dispatchCodeGeneration:i,buildCodeGenerationPrompt:a}=await Promise.resolve().then(()=>(ds(),us)),c=await i(this.projectPath,this.workflowId,t);return{status:"executing_code_plan",prompt:a(c.context.intentSummary2,c.context.intentSummary,c.context.unitSpec,void 0,c.context.architectureContext)}}async executeTestGeneration(t,n={}){let r=n.projectPath||this.projectPath,o=n.workflowId||this.workflowId,i=await A(r,o)??{schema_version:"3.0.0",workflow_id:o,feature_name:"",current_phase:"construction",current_stage:"code-generation",status:"in_progress",phases:{},manifest_path:"",trust_state_path:"",created_at:new Date().toISOString(),updated_at:new Date().toISOString(),construction_units:{}};i.construction_units||(i.construction_units={});let a=i.construction_units[t]??{unitId:t,stages:{"functional-design":{status:"not_started",artifact_path:null,completed_at:null,failure_count:0,last_error:null},"nfr-requirements":{status:"not_started",artifact_path:null,completed_at:null,failure_count:0,last_error:null},"nfr-design":{status:"not_started",artifact_path:null,completed_at:null,failure_count:0,last_error:null},"infrastructure-design":{status:"not_started",artifact_path:null,completed_at:null,failure_count:0,last_error:null},"code-generation":{status:"not_started",artifact_path:null,completed_at:null,failure_count:0,last_error:null},"test-generation":{status:"not_started",artifact_path:null,completed_at:null,failure_count:0,last_error:null}},code_plan_path:null,code_generation_status:"not_started",tests_total:0,tests_passed:0,tests_failed:0,test_framework:"unknown",test_generation_status:"not_started"};a.stages["test-generation"].status="in_progress",a.test_generation_status="in_progress",i.construction_units[t]=a,await P(r,i);let c=H.default.join(r,"aidlc-docs",o,"construction",t,"testing");await Y.default.ensureDir(c);let l=H.default.join(c,"test-report.md"),u="",d=H.default.join(r,"aidlc-docs",o,"construction",t,"code","code-summary.md");try{await Y.default.pathExists(d)&&(u=await Y.default.readFile(d,"utf-8"))}catch{}let p=await this.detectTestFramework(r),f=new Date().toISOString(),m=this.buildTestReportScaffold(t,p,u,f);await Y.default.writeFile(l,m,"utf-8");let g=0,y=0,w=0,_=0,h=0;n.currentResults&&n.currentResults.length>0&&(g=n.currentResults.length,y=n.currentResults.filter(C=>C.status==="passed").length,w=n.currentResults.filter(C=>C.status==="failed").length);let b=!1,S=0,T=H.default.join(r,"aidlc-docs",o,"construction","regression-baseline.json");if(n.currentResults&&w>0&&await Y.default.pathExists(T))try{let{compareAgainstBaseline:C,writeRegressionReport:$}=await Promise.resolve().then(()=>(wa(),ya)),{categorizeFailure:D,buildRegressionSummary:x}=await Promise.resolve().then(()=>(Sm(),km)),E=await Y.default.readJson(T);b=!0;let L=C(E,n.currentResults),j=[],K=[];for(let $e of L.new_failures){let Dr=E.tests.find(Jt=>Jt.name===$e.name)??null,Ke=D($e.name,Dr,[]);j.push(Ke),K.push({test_name:$e.name,file_path:$e.filePath,category:Ke,rationale:Ke==="legitimate_regression"?"Test was passing in baseline, now fails":Ke==="flaky"?"Test passed on re-run without code changes":Ke==="intentional_change"?"New test not present in baseline":"Test was already failing in baseline"})}let q=x(K.map($e=>({test_name:$e.test_name,file_path:$e.file_path})),j);_=q.regressions_count,h=q.flaky_count,S=q.regressions_count;let hn={workflow_id:o,unit_id:t,baseline_captured_at:E.captured_at,compared_at:new Date().toISOString(),failures:K,total_regressions:j.filter($e=>$e!=="pre_existing_failure").length,legitimate_regressions:q.regressions_count};await $(r,o,t,hn)}catch(C){console.error(`[ConstructionExecutor] Regression analysis failed for ${t} (non-fatal):`,C)}let k="completed",F;if(n.allowFailures!==!0&&(g===0?(k="blocked",F=`No tests detected for unit ${t}. Set allowFailures: true to override.`):b&&S>0?(k="blocked",F=`${S} legitimate regression(s) for unit ${t}. Flaky: ${h} (non-blocking). Fix regressions before proceeding.`):!b&&w>0&&(k="blocked",F=`${w} test(s) failed for unit ${t}. Set allowFailures: true to override.`)),a.stages["test-generation"].status=k==="completed"?"completed":"in_progress",a.stages["test-generation"].artifact_path=l,k==="completed"&&(a.stages["test-generation"].completed_at=f),a.tests_total=g,a.tests_passed=y,a.tests_failed=w,a.test_framework=p,a.test_generation_status=k==="completed"?"completed":"in_progress",a.regressions_count=_,a.flaky_count=h,i.construction_units[t]=a,await P(r,i),k==="completed")try{let{updateArchitectureModel:C}=await Promise.resolve().then(()=>(Jr(),Zo)),$=await this.discoverUnitFiles(r,o,t);$.length>0&&(await C(r,$),a.architecture_model_status="updated",i.construction_units[t]=a,await P(r,i))}catch(C){console.error(`[ConstructionExecutor] Architecture model update failed for ${t} (non-blocking):`,C),a.architecture_model_status="failed",i.construction_units[t]=a;try{await P(r,i)}catch($){console.warn("[ConstructionExecutor] Failed to save checkpoint after architecture model failure:",$)}}let R;if(k==="completed")try{let{runValidationPipeline:C,shouldSkipValidator:$,updateCheckpointForValidator:D,createQualityValidator:x,createMutationValidator:E,createTraceabilityValidator:L,createContractValidator:j,createCoverageValidator:K}=await Promise.resolve().then(()=>(Gm(),Bm)),q=await this.discoverUnitFiles(r,o,t),hn=this.detectApiSurfaceFiles(q),$e=this.deriveWorkflowDepth(i),Dr={timeoutBudgetMs:3e4,allowFailures:n.allowFailures??!1,workflowDepth:$e,unitId:t,unitFiles:q,apiSurfaceFiles:hn,projectPath:r,workflowId:o},Ke=new Map;Ke.set("quality",x()),$("mutation",Dr).skip||Ke.set("mutation",E()),Ke.set("traceability",L()),$("contract",Dr).skip||Ke.set("contract",j()),Ke.set("coverage",K()),R=await C(Ke,Dr);for(let{validator:Jt,result:Ot}of R.results){let __=Ot.status==="passed"||Ot.status==="warned"?"completed":Ot.status==="skipped"?"skipped":"in_progress",k_=Jt==="coverage"?Ot.coverage_percentage:void 0,S_=Jt==="coverage"?Ot.findings.filter(v_=>v_.category==="uncovered-critical-file").length:void 0;await D(r,o,t,Jt,__,k_,S_)}if(!n.allowFailures){let Jt=R.results.filter(Ot=>Ot.result.status==="failed");Jt.length>0&&(k="blocked",F=`Validation blocked: ${Jt.map(Ot=>Ot.validator).join(", ")}`,a.stages["test-generation"].status="in_progress",a.test_generation_status="in_progress",i.construction_units[t]=a,await P(r,i))}}catch(C){console.error(`[ConstructionExecutor] Validation pipeline failed for ${t} (non-fatal):`,C)}return{status:k,unitId:t,tests_total:g,tests_passed:y,tests_failed:w,test_framework:p,reportPath:l,blockingReason:F,regressions_count:_,flaky_count:h,validationPipeline:R}}async validateBugfixTestRequirement(t,n={}){try{let r=n.projectPath||this.projectPath,o=n.workflowId||this.workflowId,s=await A(r,o);if(!s)return{valid:!1,reason:"checkpoint not found"};if(s.pathway_type!=="bugfix")return{valid:!0};let i=s.construction_units?.[t];return i?i.stages?.["test-generation"]?.status!=="completed"?{valid:!1,reason:"test-generation stage not completed for bugfix unit"}:(i.tests_total??0)===0?{valid:!1,reason:"bugfix unit must have at least one test (tests_total === 0)"}:{valid:!0}:{valid:!1,reason:`no unit progress found for unit ${t}`}}catch(r){let o=r instanceof Error?r.message:String(r);return console.error(`[ConstructionExecutor] validateBugfixTestRequirement error for ${t}:`,r),{valid:!1,reason:`validation error: ${o}`}}}async executeDocumentationGeneration(t,n={}){let r=n.projectPath||this.projectPath,o=n.workflowId||this.workflowId,s=await A(r,o),i=s?.depth_score?s.depth_score<=12?"minimal":s.depth_score<=20?"standard":"comprehensive":"standard",a=s?.pathway_type||"brownfield-enhancement",c=await this.discoverUnitFiles(r,o,t),l={unitId:t,workflowId:o,projectPath:r,depth:i,pathway:a,unitFiles:c},u=Vp(l),d,p=0,f=[],m;if(u.status==="completed"){try{let g=qp({projectPath:r,workflowId:o,unitId:t,modifiedFiles:l.unitFiles||[]});d={status:g.impactScan.status,path:g.impactScan.reportPath},p=g.adrCount,g.adrEntries&&(f=g.adrEntries)}catch{}if(u.path&&a!=="bugfix"&&i!=="minimal")try{let g=s?.construction_units?.[t];m=Zi({featureDocPath:u.path,projectPath:r,depth:i,pathway:a,override:g?.recreation_readiness_override,overrideRationale:g?.recreation_readiness_override_rationale??void 0})}catch{}}if(s?.construction_units?.[t]){let g=s.construction_units[t];g.feature_doc_status=u.status==="completed"?"completed":"not_started",g.feature_doc_path=u.path,g.impact_scan_status=d?.status==="completed"?"completed":"not_started",g.impact_scan_report_path=d?.path??null,g.adr_count=p,g.adr_entries=f.length>0?f:void 0,m&&(g.recreation_readiness_score=m.overall_score,g.recreation_readiness_dimensions=m.dimensions??null),u.status==="completed"&&(g.doc_generation_agent=LT["code-generation"],g.doc_generation_prompt=Hp(l)),await P(r,s)}return{featureDoc:u,impactScan:d,adrCount:p,recreationReadiness:m}}async executeUnitCompletion(t,n={}){let r=n.projectPath||this.projectPath,o=n.workflowId||this.workflowId,s=await this.executeTestGeneration(t,n);if(s.status==="completed"){try{let i=await this.discoverUnitFiles(r,o,t);i.length>0&&Yp(r,i)}catch(i){console.error(`[ConstructionExecutor] Secrets management failed for ${t} (non-blocking):`,i)}try{let i=await this.discoverUnitFiles(r,o,t),a=await Zp({projectPath:r,workflowId:o,unitId:t,includeGlobs:i.length>0?i:void 0}),c=await A(r,o);if(c?.construction_units?.[t]){let l=c.construction_units[t];l.security_scan_status=a.status==="completed"?"completed":a.status==="failed"?"in_progress":"not_started",l.security_findings_critical=a.findings.filter(u=>u.severity==="critical").length,l.security_findings_warning=a.findings.filter(u=>u.severity==="warning").length,l.security_findings_info=a.findings.filter(u=>u.severity==="info").length,await P(r,c)}}catch(i){console.error(`[ConstructionExecutor] Security scan failed for ${t} (non-blocking):`,i)}if(!n.skipDocumentation){let i=await this.executeDocumentationGeneration(t,{projectPath:r,workflowId:o});return{testGeneration:s,documentation:i}}}return{testGeneration:s}}async executeSmokeTest(t={}){let n=t.projectPath||this.projectPath,r=t.workflowId||this.workflowId,o=await A(n,r);if(!o||!o.construction_units)return{status:"not_run",reportPath:null};let s=o.construction_units,i=Object.keys(s);if(i.length===0)return{status:"not_run",reportPath:null};let a=0,c=0,l=0,u=0,d=0,p=0,f=0,m=0,g=[];for(let T of i){let k=s[T],F=k.tests_total??0,R=k.tests_passed??0,O=k.tests_failed??0,C=F-R-O,$=k.regressions_count??0,D=k.flaky_count??0;F>0&&(f++,O===0&&m++),a+=F,c+=R,l+=O,u+=Math.max(0,C),d+=$,p+=D;let x=F===0?"\u26A0\uFE0F":O===0?"\u2705":"\u274C";g.push(`| ${T} | ${F} | ${R} | ${O} | ${$} | ${D} | ${x} |`)}let y=a===0?"not_run":l===0?"passed":"failed",w=H.default.join(n,"aidlc-docs",r,"construction","build-and-test");await Y.default.ensureDir(w);let _=H.default.join(w,"test-report.md"),h=new Date().toISOString(),b=`# Build-Level Test Report
970
970
 
971
971
  **Workflow ID**: ${r}
972
972
  **Generated At**: ${h}
@@ -1010,7 +1010,7 @@ ${g.join(`
1010
1010
  |------|----------|---------------|------|
1011
1011
  ${T.join(`
1012
1012
  `)}
1013
- `,$=H.default.join(w,"coverage-report.md");await Y.default.writeFile($,C,"utf-8")}catch(T){console.error("[ConstructionExecutor] Workflow-level coverage report failed (non-fatal):",T)}let S={status:y,tests_total:a,tests_passed:c,tests_failed:l,tests_skipped:u,regressions_total:d,flaky_total:p,units_tested:f,units_passed:m,report_path:_,completed_at:h};o.smoke_test=S,o.updated_at=h,await P(n,o);try{let{generateChangelogEntry:T}=await Promise.resolve().then(()=>(Zm(),Xm)),k=Object.keys(s);T({projectPath:n,workflowId:r,featureName:o.feature_name??r,unitIds:k,pathway:o.pathway_type??void 0})}catch(T){console.error("[ConstructionExecutor] Changelog generation failed (non-fatal):",T)}try{let T=await I(n,r);T&&ef(T,{projectPath:n,workflowId:r,featureName:T.feature_name??r})}catch(T){console.error("[ConstructionExecutor] Quality scorecard generation failed (non-fatal):",T)}return{status:y,reportPath:_}}async captureBugDescription(t,n){try{let r=n?.projectPath||this.projectPath,o=n?.workflowId||this.workflowId,i=await I(r,o)??{schema_version:"3.0.0",workflow_id:o,feature_name:"",current_phase:"construction",current_stage:"code-generation",status:"in_progress",phases:{},manifest_path:"",trust_state_path:"",created_at:new Date().toISOString(),updated_at:new Date().toISOString(),construction_units:{}};i.bug_description=t,i.updated_at=new Date().toISOString(),await P(r,i)}catch(r){console.error("[ConstructionExecutor] captureBugDescription error:",r)}}async discoverUnitFiles(t,n,r){let o=H.default.join(t,"aidlc-docs",n,"construction",r,"code","code-summary.md");try{if(!await Y.default.pathExists(o))return[];let s=await Y.default.readFile(o,"utf-8"),i=[],a=[/[`|]\s*([\w/.\\-]+\.\w{1,5})\s*[`|]/g,/^[-*]\s+`?([\w/.\\-]+\.\w{1,5})`?\s*$/gm];for(let c of a){let l;for(;(l=c.exec(s))!==null;){let u=l[1];i.includes(u)||i.push(u)}}return i}catch{return[]}}detectApiSurfaceFiles(t){let n=[/route/i,/controller/i,/handler/i,/endpoint/i,/api\//i,/server/i,/middleware/i,/graphql/i];return t.filter(r=>n.some(o=>o.test(r)))}deriveWorkflowDepth(t){return t.pathway_type==="bugfix"?0:(t.depth_score??3)<=2?1:2}async detectTestFramework(t){let n=H.default.join(t,"package.json");try{if(!await Y.default.pathExists(n))return"unknown";let r=await Y.default.readFile(n,"utf-8"),o=JSON.parse(r),s={...o.dependencies,...o.devDependencies};return s.vitest?"vitest":s.jest?"jest":s.mocha?"mocha":"unknown"}catch{return"unknown"}}buildTestReportScaffold(t,n,r,o){let s="_No code-summary.md found \u2014 files in scope unknown._";if(r){let i=r.match(/## Files (?:created|modified|created\/modified)[^\n]*\n([\s\S]*?)(?=\n##|$)/i);i&&i[1].trim()&&(s=i[1].trim())}return`---
1013
+ `,$=H.default.join(w,"coverage-report.md");await Y.default.writeFile($,C,"utf-8")}catch(T){console.error("[ConstructionExecutor] Workflow-level coverage report failed (non-fatal):",T)}let S={status:y,tests_total:a,tests_passed:c,tests_failed:l,tests_skipped:u,regressions_total:d,flaky_total:p,units_tested:f,units_passed:m,report_path:_,completed_at:h};o.smoke_test=S,o.updated_at=h,await P(n,o);try{let{generateChangelogEntry:T}=await Promise.resolve().then(()=>(Zm(),Xm)),k=Object.keys(s);T({projectPath:n,workflowId:r,featureName:o.feature_name??r,unitIds:k,pathway:o.pathway_type??void 0})}catch(T){console.error("[ConstructionExecutor] Changelog generation failed (non-fatal):",T)}try{let T=await A(n,r);T&&ef(T,{projectPath:n,workflowId:r,featureName:T.feature_name??r})}catch(T){console.error("[ConstructionExecutor] Quality scorecard generation failed (non-fatal):",T)}return{status:y,reportPath:_}}async captureBugDescription(t,n){try{let r=n?.projectPath||this.projectPath,o=n?.workflowId||this.workflowId,i=await A(r,o)??{schema_version:"3.0.0",workflow_id:o,feature_name:"",current_phase:"construction",current_stage:"code-generation",status:"in_progress",phases:{},manifest_path:"",trust_state_path:"",created_at:new Date().toISOString(),updated_at:new Date().toISOString(),construction_units:{}};i.bug_description=t,i.updated_at=new Date().toISOString(),await P(r,i)}catch(r){console.error("[ConstructionExecutor] captureBugDescription error:",r)}}async discoverUnitFiles(t,n,r){let o=H.default.join(t,"aidlc-docs",n,"construction",r,"code","code-summary.md");try{if(!await Y.default.pathExists(o))return[];let s=await Y.default.readFile(o,"utf-8"),i=[],a=[/[`|]\s*([\w/.\\-]+\.\w{1,5})\s*[`|]/g,/^[-*]\s+`?([\w/.\\-]+\.\w{1,5})`?\s*$/gm];for(let c of a){let l;for(;(l=c.exec(s))!==null;){let u=l[1];i.includes(u)||i.push(u)}}return i}catch{return[]}}detectApiSurfaceFiles(t){let n=[/route/i,/controller/i,/handler/i,/endpoint/i,/api\//i,/server/i,/middleware/i,/graphql/i];return t.filter(r=>n.some(o=>o.test(r)))}deriveWorkflowDepth(t){return t.pathway_type==="bugfix"?0:(t.depth_score??3)<=2?1:2}async detectTestFramework(t){let n=H.default.join(t,"package.json");try{if(!await Y.default.pathExists(n))return"unknown";let r=await Y.default.readFile(n,"utf-8"),o=JSON.parse(r),s={...o.dependencies,...o.devDependencies};return s.vitest?"vitest":s.jest?"jest":s.mocha?"mocha":"unknown"}catch{return"unknown"}}buildTestReportScaffold(t,n,r,o){let s="_No code-summary.md found \u2014 files in scope unknown._";if(r){let i=r.match(/## Files (?:created|modified|created\/modified)[^\n]*\n([\s\S]*?)(?=\n##|$)/i);i&&i[1].trim()&&(s=i[1].trim())}return`---
1014
1014
  unit_id: ${t}
1015
1015
  framework: ${n}
1016
1016
  generated_at: ${o}
@@ -1043,7 +1043,7 @@ _No failures recorded._
1043
1043
  ## Override
1044
1044
 
1045
1045
  _allowFailures was not set._
1046
- `}async executeShallowViaBolt(){let t=H.default.join(this.projectPath,"aidlc-docs",this.workflowId,"inception","intent.md"),n="Shallow Implementation",r=2,o="",s=await aa(t);if(s){o=s.content;let d=o.match(/^title:\s*(.+)$/m);d&&(n=d[1].trim().replace(/^["']|["']$/g,""));let p=o.match(/^estimated_effort:\s*(\d+)/m);p&&(r=Number(p[1]))}else{let d=H.default.join(this.projectPath,"aidlc-docs",this.workflowId,"inception"),p=await ia(d);if(p.length===0)return{passed:!1,coverage_percentage:0,blocking_issues:["No intent found for SHALLOW construction"],reviewer:"construction-executor",timestamp:new Date().toISOString()};n=p[0].title,r=p[0].estimated_effort}let i={id:"shallow-impl",type:"unit",title:n,parent_id:null,children_ids:[],status:"pending",assigned_agent:null,estimated_effort:r},a=await I(this.projectPath,this.workflowId);if(!a)return{passed:!1,coverage_percentage:0,blocking_issues:["No checkpoint found for SHALLOW construction"],reviewer:"construction-executor",timestamp:new Date().toISOString()};let c=lf(i,o,a);uf([c],a);let l={onElaboration:async()=>({success:!0}),onCodeGeneration:async()=>({success:!0}),onBuildAndTest:async()=>({success:!0}),onReview:async()=>({success:!0})},u=await df.execute(c,a,this.projectPath,this.workflowId,l);return console.log(`[ConstructionExecutor] SHALLOW express bolt completed with status: ${u.status}`),{passed:u.status==="done",coverage_percentage:u.status==="done"?100:0,blocking_issues:u.status==="done"?[]:[`Express bolt failed with status: ${u.status}`],reviewer:"construction-executor",timestamp:new Date().toISOString()}}async executeDecompositionPhase(t,n,r,o="MEDIUM"){let s=H.default.join(this.projectPath,"aidlc-docs",this.workflowId,"inception"),i=H.default.join(this.projectPath,"aidlc-docs",this.workflowId,"construction");await Y.default.ensureDir(i);let a=H.default.join(s,"intent.md"),c=await aa(a),l=H.default.join(s,"intent.md"),u="";try{await Y.default.pathExists(l)&&(u=await Y.default.readFile(l,"utf-8"))}catch{}return c?this.executeDecompositionFromIntent(c,s,i,t,n,r,u,o):this.executeDecompositionFromLegacyIntents(s,i,t,n,r,u)}async executeDecompositionFromIntent(t,n,r,o,s,i,a,c="MEDIUM"){let l=t.content,u=l.match(/^title:\s*(.+)$/m),d=l.match(/^estimated_effort:\s*(\d+)/m),p=u?u[1].trim().replace(/^["']|["']$/g,""):"Untitled Intent",f=d?Number(d[1]):0,m="INTENT-001",g={id:m,type:"intent",title:p,parent_id:null,children_ids:[],status:"pending",assigned_agent:null,estimated_effort:f},y=`---
1046
+ `}async executeShallowViaBolt(){let t=H.default.join(this.projectPath,"aidlc-docs",this.workflowId,"inception","intent.md"),n="Shallow Implementation",r=2,o="",s=await aa(t);if(s){o=s.content;let d=o.match(/^title:\s*(.+)$/m);d&&(n=d[1].trim().replace(/^["']|["']$/g,""));let p=o.match(/^estimated_effort:\s*(\d+)/m);p&&(r=Number(p[1]))}else{let d=H.default.join(this.projectPath,"aidlc-docs",this.workflowId,"inception"),p=await ia(d);if(p.length===0)return{passed:!1,coverage_percentage:0,blocking_issues:["No intent found for SHALLOW construction"],reviewer:"construction-executor",timestamp:new Date().toISOString()};n=p[0].title,r=p[0].estimated_effort}let i={id:"shallow-impl",type:"unit",title:n,parent_id:null,children_ids:[],status:"pending",assigned_agent:null,estimated_effort:r},a=await A(this.projectPath,this.workflowId);if(!a)return{passed:!1,coverage_percentage:0,blocking_issues:["No checkpoint found for SHALLOW construction"],reviewer:"construction-executor",timestamp:new Date().toISOString()};let c=lf(i,o,a);uf([c],a);let l={onElaboration:async()=>({success:!0}),onCodeGeneration:async()=>({success:!0}),onBuildAndTest:async()=>({success:!0}),onReview:async()=>({success:!0})},u=await df.execute(c,a,this.projectPath,this.workflowId,l);return console.log(`[ConstructionExecutor] SHALLOW express bolt completed with status: ${u.status}`),{passed:u.status==="done",coverage_percentage:u.status==="done"?100:0,blocking_issues:u.status==="done"?[]:[`Express bolt failed with status: ${u.status}`],reviewer:"construction-executor",timestamp:new Date().toISOString()}}async executeDecompositionPhase(t,n,r,o="MEDIUM"){let s=H.default.join(this.projectPath,"aidlc-docs",this.workflowId,"inception"),i=H.default.join(this.projectPath,"aidlc-docs",this.workflowId,"construction");await Y.default.ensureDir(i);let a=H.default.join(s,"intent.md"),c=await aa(a),l=H.default.join(s,"intent.md"),u="";try{await Y.default.pathExists(l)&&(u=await Y.default.readFile(l,"utf-8"))}catch{}return c?this.executeDecompositionFromIntent(c,s,i,t,n,r,u,o):this.executeDecompositionFromLegacyIntents(s,i,t,n,r,u)}async executeDecompositionFromIntent(t,n,r,o,s,i,a,c="MEDIUM"){let l=t.content,u=l.match(/^title:\s*(.+)$/m),d=l.match(/^estimated_effort:\s*(\d+)/m),p=u?u[1].trim().replace(/^["']|["']$/g,""):"Untitled Intent",f=d?Number(d[1]):0,m="INTENT-001",g={id:m,type:"intent",title:p,parent_id:null,children_ids:[],status:"pending",assigned_agent:null,estimated_effort:f},y=`---
1047
1047
  id: ${m}
1048
1048
  title: ${p}
1049
1049
  status: pending
@@ -1138,8 +1138,8 @@ ${o}`:r||o||""}function Ua(e,t){return`# AI-DLC Workflow Rules (Olympus-Native)
1138
1138
 
1139
1139
  All workflow stages, agent delegation, directory layout, and rules are defined in the
1140
1140
  global \`~/.claude/CLAUDE.md\` (installed by Olympus). This block only tracks the active
1141
- workflow identity \u2014 do NOT search for a separate core-workflow.md file.`}var yC=["set up","build out","roll out","hook up","wire up","spin up","build","create","add","implement","design","make","develop","configure","integrate","fix","update","refactor","migrate","deploy","setup","establish","introduce","enable","write","construct","generate","define","prepare"];function Ka(e){let t=e.trim();(t.includes("/")||t.includes("\\"))&&(t=t.split(/[/\\]/).pop()||t),t=t.replace(/\.[a-z]{1,4}$/i,"");let n=[...yC].sort((s,i)=>i.length-s.length);for(let s of n){let i=new RegExp(`^${s}\\s+`,"i");if(i.test(t)){t=t.replace(i,"");break}}t=t.replace(/^(?:a|an|the)\s+/i,"");let r=t.replace(/\s+(?:for|with|using|via|in|to|on|at|from|into|across|through|about|of)\s+.+$/i,"").trim();r.length>0&&(t=r);let o=t.toLowerCase().replace(/[_\s]+/g,"-").replace(/[^a-z0-9-]/g,"").replace(/-+/g,"-").replace(/^-|-$/g,"");if(o.length>40){let s=o.substring(0,40),i=s.lastIndexOf("-");o=i>0?s.substring(0,i):s,o=o.replace(/-$/,"")}if(!o)throw new Error("Feature name produced an empty workflow ID after sanitization");if(o==="completed")throw new Error("'completed' is a reserved directory name and cannot be used as a workflow ID");return o}var Ya=["intent","unit","code-generation","complete"];function wC(e){let t=Ya.indexOf(e);return t===-1||t>=Ya.length-1?"complete":Ya[t+1]}var Ss=class{projectPath;featureName;workflowId;interruptHandler=null;constructor(t,n){this.projectPath=t,this.featureName=n,this.workflowId=Ka(n)}async start(t){let n={schema_version:"3.0.0",workflow_id:this.workflowId,feature_name:this.featureName,created_at:new Date().toISOString(),updated_at:new Date().toISOString(),current_phase:"inception",current_stage:"intent",status:"in_progress",origin:"hook-init",phases:{discovery:{status:"not_started",started_at:null,completed_at:null,gate_result:null,gate_bypassed:!1,bypass_reason:null},inception:{status:"in_progress",started_at:new Date().toISOString(),completed_at:null,gate_result:null,gate_bypassed:!1,bypass_reason:null},construction:{status:"not_started",started_at:null,completed_at:null,gate_result:null,gate_bypassed:!1,bypass_reason:null},operations:{status:"not_started",started_at:null,completed_at:null,gate_result:null,gate_bypassed:!1,bypass_reason:null}},manifest_path:`aidlc-docs/${this.workflowId}/manifest.json`,trust_state_path:".olympus/trust-state.json",resume_context:{initial_prompt:t}};try{await $p(this.projectPath,this.workflowId)}catch(o){let s=o;throw console.error(`[WorkflowEngine] Failed to initialize workflow directory: ${s.message}`),new Error(`Failed to start workflow: Could not create directory structure - ${s.message}`)}let r=$n.join(this.projectPath,"aidlc-docs",this.workflowId,"manifest.json");if(!ge.existsSync(r))try{Vi(this.workflowId,this.featureName,this.projectPath)}catch(o){console.warn(`[WorkflowEngine] Failed to create manifest: ${o.message}`)}try{await P(this.projectPath,n)}catch(o){let s=o;throw console.error(`[WorkflowEngine] Failed to save initial checkpoint: ${s.message}`),new Error(`Failed to start workflow: Could not save checkpoint - ${s.message}`)}try{let s=(await Rn(this.projectPath)).sourceFileCount??0,i=await Pa(this.projectPath,t),a=ws(t),c=await Ia({projectPath:this.projectPath,workflowId:this.workflowId,intentText:t,depthAssessment:a,pathwayType:i,sourceFileCount:s}),l=await as(this.projectPath,this.workflowId,c),u=await I(this.projectPath,this.workflowId);if(u){u.workflow_routing_path=l,u.pathway_type=i;let d=["discovery","inception","construction","operations"];u.skipped_phases=d.filter(p=>!cs(c,p)),await P(this.projectPath,u)}if(console.log(`[WorkflowEngine] Generated Workflow Routing: pathway=${i}, depth=${c.estimated_depth}, bolts=${c.estimated_bolts}`),c.stages.some(d=>!d.included)){let d=c.stages.filter(p=>!p.included).map(p=>`${p.phase}/${p.stage}`);console.log(`[WorkflowEngine] Stages excluded by plan: ${d.join(", ")}`)}}catch(o){console.warn(`[WorkflowEngine] Failed to generate Workflow Routing: ${o.message}`),console.warn("[WorkflowEngine] Workflow will proceed without adaptive phase selection")}try{let s=(await I(this.projectPath,this.workflowId))?.pathway_type;if(!s){let{isBrownfield:u}=await Rn(this.projectPath);s=u?"brownfield-enhancement":"greenfield"}let i=$n.join(this.projectPath,".claude","CLAUDE.md"),a=ge.existsSync(i)?ge.readFileSync(i,"utf-8"):"",c=Ua(this.workflowId,s),l=La(a,c);ge.mkdirSync($n.join(this.projectPath,".claude"),{recursive:!0}),ge.writeFileSync(i,l,"utf-8"),console.log("[WorkflowEngine] Injected AI-DLC rules into .claude/CLAUDE.md")}catch(o){console.error("[WorkflowEngine] Failed to inject AI-DLC rules into CLAUDE.md:",o)}}async resume(){let t;try{t=await I(this.projectPath,this.workflowId)}catch(r){let o=r;throw console.error(`[WorkflowEngine] Failed to load checkpoint for resume: ${o.message}`),new Error(`Failed to resume workflow: Could not load checkpoint - ${o.message}`)}if(!t)throw console.error(`[WorkflowEngine] No checkpoint found for workflow: ${this.workflowId}`),console.error("[WorkflowEngine] Available workflows: Run 'olympus workflow list' to see workflows"),new Error(`No checkpoint found for workflow: ${this.workflowId}`);if(t.status==="complete")return"Workflow already complete";if(t.status==="paused"){t.status="in_progress";try{await P(this.projectPath,t)}catch(r){let o=r;throw console.error(`[WorkflowEngine] Failed to update checkpoint status: ${o.message}`),new Error(`Failed to resume workflow: Could not save checkpoint - ${o.message}`)}}try{let r=t.pathway_type;if(!r){let{isBrownfield:c}=await Rn(this.projectPath);r=c?"brownfield-enhancement":"greenfield"}let o=$n.join(this.projectPath,".claude","CLAUDE.md"),s=ge.existsSync(o)?ge.readFileSync(o,"utf-8"):"",i=Ua(this.workflowId,r),a=La(s,i);ge.mkdirSync($n.join(this.projectPath,".claude"),{recursive:!0}),ge.writeFileSync(o,a,"utf-8"),console.log("[WorkflowEngine] Injected AI-DLC rules into .claude/CLAUDE.md")}catch(r){console.error("[WorkflowEngine] Failed to inject AI-DLC rules into CLAUDE.md:",r)}this.setupInterruptHandler();let n=t.current_stage;try{await this.executeStage(n)}catch(r){let o=r;console.error(`[WorkflowEngine] Failed to execute ${n} stage: ${o.message}`);try{let s=await I(this.projectPath,this.workflowId);s&&(s.status="paused",s.resume_context={...s.resume_context,error_message:o.message,failed_stage:n},await P(this.projectPath,s),console.log("[WorkflowEngine] Workflow saved as paused. Fix the issue and resume with `/continue`"))}catch(s){console.warn("[WorkflowEngine] Failed to save error checkpoint:",s.message)}throw new Error(`Failed to execute ${n} stage: ${o.message}`)}finally{this.cleanupInterruptHandler()}return`Resumed workflow from stage: ${n}`}async pause(){let t;try{t=await I(this.projectPath,this.workflowId)}catch(n){let r=n;throw console.error(`[WorkflowEngine] Failed to load checkpoint for pause: ${r.message}`),new Error(`Failed to pause workflow: Could not load checkpoint - ${r.message}`)}if(!t)throw console.error(`[WorkflowEngine] No checkpoint found for workflow: ${this.workflowId}`),new Error(`No checkpoint found for workflow: ${this.workflowId}`);t.status="paused";try{await P(this.projectPath,t)}catch(n){let r=n;throw console.error(`[WorkflowEngine] Failed to save paused checkpoint: ${r.message}`),new Error(`Failed to pause workflow: Could not save checkpoint - ${r.message}`)}return`aidlc-docs/${this.workflowId}/checkpoint.json`}async executeStage(t){if(t==="complete")throw new Error("No execution for complete stage");let n=await I(this.projectPath,this.workflowId);if(!n)throw new Error(`No checkpoint found for workflow: ${this.workflowId}`);switch(t){case"intent":await this.executeIntentStage(n);break;case"unit":await this.executeUnitStage(n);break;case"code-generation":await this.executeCodeGenerationStage(n);break}let r=wC(t);n.current_stage=r,r==="complete"?await this.completeWorkflow(n):await P(this.projectPath,n)}async getStatus(){let t;try{t=await I(this.projectPath,this.workflowId)}catch(r){let o=r;throw console.error(`[WorkflowEngine] Failed to load checkpoint for status: ${o.message}`),new Error(`Failed to get workflow status: Could not load checkpoint - ${o.message}`)}if(!t)throw console.error(`[WorkflowEngine] No checkpoint found for workflow: ${this.workflowId}`),new Error(`No checkpoint found for workflow: ${this.workflowId}`);let n=[];return{workflow_id:t.workflow_id,feature_name:t.feature_name,current_stage:t.current_stage,status:t.status,artifacts:n,updated_at:t.updated_at}}async executePhase(t){let n=Xr(this.projectPath,this.workflowId);if(n&&!cs(n,t)){console.log(`[WorkflowEngine] Skipping ${t} phase (excluded by Workflow Routing: ${n.phases[t]?.rationale||"no rationale"})`);let r=await I(this.projectPath,this.workflowId);if(r){let s=r;s.phases&&s.phases[t]&&(s.phases[t].status="complete",s.phases[t].completed_at=new Date().toISOString(),s.phases[t].gate_bypassed=!0,s.phases[t].bypass_reason="Excluded by Workflow Routing"),await P(this.projectPath,r)}let o=`${this.projectPath}/aidlc-docs/${this.workflowId}/manifest.json`;try{je(o,{phase:t,action:"bypassed",actor:"config",reason:`Excluded by Workflow Routing (pathway: ${n.pathway})`})}catch{}return}switch(t){case"discovery":{let r=`${this.projectPath}/aidlc-docs/${this.workflowId}/manifest.json`,o=await um({projectPath:this.projectPath,workflowId:this.workflowId,featureName:this.featureName,manifestPath:r});o.gateRequired&&(console.log(`[WorkflowEngine] Discovery phase: ${o.artifactsGenerated.length} artifacts generated (${o.sourceFileCount} source files detected)`),console.log(`[WorkflowEngine] Discovery Gate: Review findings in aidlc-docs/${this.workflowId}/discovery/ before proceeding to Inception`));try{let s=await I(this.projectPath,this.workflowId);s&&(s.phases.discovery.status="complete",s.phases.discovery.completed_at=new Date().toISOString(),await P(this.projectPath,s))}catch(s){console.error("[WorkflowEngine] Failed to persist discovery phase completion:",s)}try{let s={type:"phase_complete",phase:"discovery",details:`${o.artifactsGenerated.length} artifacts generated, ${o.sourceFileCount} source files`},i={workflowId:this.workflowId,featureName:this.featureName,projectPath:this.projectPath,sessionId:"engine",phase:"discovery"},a=Ve(s,i);ue(a)}catch(s){console.error("[WorkflowEngine] Failed to capture discovery phase discovery:",s)}break}case"inception":{let{InceptionOrchestrator:r}=await Promise.resolve().then(()=>(hg(),gg)),o=new r,s=await I(this.projectPath,this.workflowId);if(!s)throw new Error(`No checkpoint found for workflow: ${this.workflowId}`);if(s.current_stage!=="intent"){console.log(`[WorkflowEngine] Skipping inception orchestrator \u2014 checkpoint already at stage '${s.current_stage}'`);break}if(!s.inception_stages){let i=Xr(this.projectPath,this.workflowId),a=s;await o.initialize(this.projectPath,this.workflowId,a.pathway_type||"greenfield",i)}for(;!await o.isComplete(this.projectPath,this.workflowId);){let i=await o.executeNextStage(this.projectPath,this.workflowId);if(i.status==="awaiting_answers"||i.status==="review_required")break}try{let i={type:"phase_complete",phase:"inception",details:"Inception stages completed"},a={workflowId:this.workflowId,featureName:this.featureName,projectPath:this.projectPath,sessionId:"engine",phase:"inception"},c=Ve(i,a);ue(c)}catch(i){console.error("[WorkflowEngine] Failed to capture inception phase discovery:",i)}break}case"construction":{let r=await I(this.projectPath,this.workflowId);if(r&&r.status==="awaiting_dev_review"){console.log("[WorkflowEngine] Waiting for developer review of technical specification (Risk Tier 3).");return}let o=lt(this.projectPath,this.workflowId,"intent"),s;try{s=ge.readFileSync(o,"utf-8")}catch{}let a=await new ys(this.projectPath,this.workflowId).execute(s);if(!a.passed)throw console.error("[WorkflowEngine] Construction phase validation failed:",a.blocking_issues),new Error(`Construction phase validation failed: ${a.blocking_issues.join(", ")}`);try{let c=await I(this.projectPath,this.workflowId);c&&(c.phases.construction.status="complete",c.phases.construction.completed_at=new Date().toISOString(),await P(this.projectPath,c))}catch(c){console.error("[WorkflowEngine] Failed to persist construction phase completion:",c)}try{let c={type:"phase_complete",phase:"construction",details:"Construction phase completed"},l={workflowId:this.workflowId,featureName:this.featureName,projectPath:this.projectPath,sessionId:"engine",phase:"construction"},u=Ve(c,l);ue(u)}catch(c){console.error("[WorkflowEngine] Failed to capture construction phase discovery:",c)}break}case"operations":{let{generateOperationsArtifacts:r}=await Promise.resolve().then(()=>(bg(),vg)),{loadManifest:o,registerArtifact:s,updatePhaseStatus:i}=await Promise.resolve().then(()=>(Z(),vn)),a=`${this.projectPath}/aidlc-docs/${this.workflowId}/manifest.json`,c=o(a),l=null;try{l=ge.readFileSync(lt(this.projectPath,this.workflowId,"intent"),"utf-8")}catch{}let u=await I(this.projectPath,this.workflowId),d="MEDIUM";if(c?.depth_assessment){let m=c.depth_assessment.total_score;m<=10?d="SHALLOW":m>=21&&(d="DEEP")}let p={workflowId:this.workflowId,featureName:this.featureName,manifest:c,specContent:l,buildLogContent:null,depthLevel:d},f=await r(p,this.projectPath);if(c){i(a,"operations","complete");for(let m of f.artifactsGenerated){let g=`aidlc-docs/${this.workflowId}/operations/${m}`,y=m.replace(/\.(md|json)$/,"").toUpperCase().replace(/-/g,"_");s(a,{id:`OPS-${y}`,type:y,phase:"operations",stage:"code-generation",path:g,validation_passed:!0,write_complete:!0,checksum:null})}}u&&(u.current_phase="operations",u.updated_at=new Date().toISOString(),await P(this.projectPath,u)),console.log(`[WorkflowEngine] Operations phase: Generated ${f.artifactsGenerated.length} artifacts (depth: ${d})`),console.log(`[WorkflowEngine] Operations artifacts: ${f.artifactsGenerated.join(", ")}`);try{let m={type:"phase_complete",phase:"operations",details:`${f.artifactsGenerated.length} artifacts generated (depth: ${d})`},g={workflowId:this.workflowId,featureName:this.featureName,projectPath:this.projectPath,sessionId:"engine",phase:"operations"},y=Ve(m,g);ue(y)}catch(m){console.error("[WorkflowEngine] Failed to capture operations phase discovery:",m)}break}}}async completeWorkflow(t){t.status="complete";try{let n=$n.join(this.projectPath,".claude","CLAUDE.md");if(ge.existsSync(n)){let r=ge.readFileSync(n,"utf-8"),o=cg(r);ge.writeFileSync(n,o,"utf-8"),console.log("[WorkflowEngine] Removed AI-DLC rules from .claude/CLAUDE.md (workflow complete)")}}catch(n){console.error("[WorkflowEngine] Failed to remove AI-DLC rules from CLAUDE.md:",n)}await P(this.projectPath,t),await Wi(this.projectPath,this.workflowId)}async approveWorkflowRouting(t){let n=Xr(this.projectPath,this.workflowId);if(!n)throw new Error(`No Workflow Routing found for workflow: ${this.workflowId}`);n.approved_at=new Date().toISOString(),n.approved_by="human",await as(this.projectPath,this.workflowId,n);let r=await I(this.projectPath,this.workflowId);if(r){let s=r;if(s.inception_stages?.["workflow-planning"]){let i=s.inception_stages["workflow-planning"];i.status!=="completed"&&i.status!=="skipped"&&(i.status="completed",i.completed_at=new Date().toISOString(),await P(this.projectPath,r))}}let o=`${this.projectPath}/aidlc-docs/${this.workflowId}/manifest.json`;try{je(o,{phase:"inception",action:"approved",actor:"human",reason:t||"Workflow Routing approved"})}catch{}console.log("[WorkflowEngine] Workflow Routing approved")}setupInterruptHandler(){this.interruptHandler=async()=>{console.log(`
1142
- [WorkflowEngine] Workflow interrupted - saving checkpoint...`);try{let t=await I(this.projectPath,this.workflowId);t&&(t.status="paused",t.updated_at=new Date().toISOString(),t.resume_context={...t.resume_context,interrupted_at:new Date().toISOString(),current_stage:t.current_stage,message:`Workflow interrupted during ${t.current_stage} stage`},await P(this.projectPath,t),console.log("[WorkflowEngine] Checkpoint saved. Resume with `/continue`"))}catch(t){console.error("[WorkflowEngine] Failed to save checkpoint on interrupt:",t)}process.exit(0)},process.on("SIGINT",this.interruptHandler)}cleanupInterruptHandler(){this.interruptHandler&&(process.off("SIGINT",this.interruptHandler),this.interruptHandler=null)}async executeIntentStage(t){let n=t.resume_context?.initial_prompt||"No initial prompt provided";console.log(`[WorkflowEngine] Executing INTENT stage for feature: ${this.featureName}`),console.log(`[WorkflowEngine] Initial prompt: ${n}`),console.log("[WorkflowEngine] Generating merged INTENT artifact with full inception content");let r=`intent-${this.workflowId}`,o=new Date().toISOString(),s=`---
1141
+ workflow identity \u2014 do NOT search for a separate core-workflow.md file.`}var yC=["set up","build out","roll out","hook up","wire up","spin up","build","create","add","implement","design","make","develop","configure","integrate","fix","update","refactor","migrate","deploy","setup","establish","introduce","enable","write","construct","generate","define","prepare"];function Ka(e){let t=e.trim();(t.includes("/")||t.includes("\\"))&&(t=t.split(/[/\\]/).pop()||t),t=t.replace(/\.[a-z]{1,4}$/i,"");let n=[...yC].sort((s,i)=>i.length-s.length);for(let s of n){let i=new RegExp(`^${s}\\s+`,"i");if(i.test(t)){t=t.replace(i,"");break}}t=t.replace(/^(?:a|an|the)\s+/i,"");let r=t.replace(/\s+(?:for|with|using|via|in|to|on|at|from|into|across|through|about|of)\s+.+$/i,"").trim();r.length>0&&(t=r);let o=t.toLowerCase().replace(/[_\s]+/g,"-").replace(/[^a-z0-9-]/g,"").replace(/-+/g,"-").replace(/^-|-$/g,"");if(o.length>40){let s=o.substring(0,40),i=s.lastIndexOf("-");o=i>0?s.substring(0,i):s,o=o.replace(/-$/,"")}if(!o)throw new Error("Feature name produced an empty workflow ID after sanitization");if(o==="completed")throw new Error("'completed' is a reserved directory name and cannot be used as a workflow ID");return o}var Ya=["intent","unit","code-generation","complete"];function wC(e){let t=Ya.indexOf(e);return t===-1||t>=Ya.length-1?"complete":Ya[t+1]}var Ss=class{projectPath;featureName;workflowId;interruptHandler=null;constructor(t,n){this.projectPath=t,this.featureName=n,this.workflowId=Ka(n)}async start(t){let n={schema_version:"3.0.0",workflow_id:this.workflowId,feature_name:this.featureName,created_at:new Date().toISOString(),updated_at:new Date().toISOString(),current_phase:"inception",current_stage:"intent",status:"in_progress",origin:"hook-init",phases:{discovery:{status:"not_started",started_at:null,completed_at:null,gate_result:null,gate_bypassed:!1,bypass_reason:null},inception:{status:"in_progress",started_at:new Date().toISOString(),completed_at:null,gate_result:null,gate_bypassed:!1,bypass_reason:null},construction:{status:"not_started",started_at:null,completed_at:null,gate_result:null,gate_bypassed:!1,bypass_reason:null},operations:{status:"not_started",started_at:null,completed_at:null,gate_result:null,gate_bypassed:!1,bypass_reason:null}},manifest_path:`aidlc-docs/${this.workflowId}/manifest.json`,trust_state_path:".olympus/trust-state.json",resume_context:{initial_prompt:t}};try{await $p(this.projectPath,this.workflowId)}catch(o){let s=o;throw console.error(`[WorkflowEngine] Failed to initialize workflow directory: ${s.message}`),new Error(`Failed to start workflow: Could not create directory structure - ${s.message}`)}let r=$n.join(this.projectPath,"aidlc-docs",this.workflowId,"manifest.json");if(!ge.existsSync(r))try{Vi(this.workflowId,this.featureName,this.projectPath)}catch(o){console.warn(`[WorkflowEngine] Failed to create manifest: ${o.message}`)}try{await P(this.projectPath,n)}catch(o){let s=o;throw console.error(`[WorkflowEngine] Failed to save initial checkpoint: ${s.message}`),new Error(`Failed to start workflow: Could not save checkpoint - ${s.message}`)}try{let s=(await Rn(this.projectPath)).sourceFileCount??0,i=await Pa(this.projectPath,t),a=ws(t),c=await Ia({projectPath:this.projectPath,workflowId:this.workflowId,intentText:t,depthAssessment:a,pathwayType:i,sourceFileCount:s}),l=await as(this.projectPath,this.workflowId,c),u=await A(this.projectPath,this.workflowId);if(u){u.workflow_routing_path=l,u.pathway_type=i,u.depth_score=a.total_score;let d=["discovery","inception","construction","operations"];u.skipped_phases=d.filter(p=>!cs(c,p)),await P(this.projectPath,u)}if(console.log(`[WorkflowEngine] Generated Workflow Routing: pathway=${i}, depth=${c.estimated_depth}, bolts=${c.estimated_bolts}`),c.stages.some(d=>!d.included)){let d=c.stages.filter(p=>!p.included).map(p=>`${p.phase}/${p.stage}`);console.log(`[WorkflowEngine] Stages excluded by plan: ${d.join(", ")}`)}}catch(o){console.warn(`[WorkflowEngine] Failed to generate Workflow Routing: ${o.message}`),console.warn("[WorkflowEngine] Workflow will proceed without adaptive phase selection")}try{let s=(await A(this.projectPath,this.workflowId))?.pathway_type;if(!s){let{isBrownfield:u}=await Rn(this.projectPath);s=u?"brownfield-enhancement":"greenfield"}let i=$n.join(this.projectPath,".claude","CLAUDE.md"),a=ge.existsSync(i)?ge.readFileSync(i,"utf-8"):"",c=Ua(this.workflowId,s),l=La(a,c);ge.mkdirSync($n.join(this.projectPath,".claude"),{recursive:!0}),ge.writeFileSync(i,l,"utf-8"),console.log("[WorkflowEngine] Injected AI-DLC rules into .claude/CLAUDE.md")}catch(o){console.error("[WorkflowEngine] Failed to inject AI-DLC rules into CLAUDE.md:",o)}}async resume(){let t;try{t=await A(this.projectPath,this.workflowId)}catch(r){let o=r;throw console.error(`[WorkflowEngine] Failed to load checkpoint for resume: ${o.message}`),new Error(`Failed to resume workflow: Could not load checkpoint - ${o.message}`)}if(!t)throw console.error(`[WorkflowEngine] No checkpoint found for workflow: ${this.workflowId}`),console.error("[WorkflowEngine] Available workflows: Run 'olympus workflow list' to see workflows"),new Error(`No checkpoint found for workflow: ${this.workflowId}`);if(t.status==="complete")return"Workflow already complete";if(t.status==="paused"){t.status="in_progress";try{await P(this.projectPath,t)}catch(r){let o=r;throw console.error(`[WorkflowEngine] Failed to update checkpoint status: ${o.message}`),new Error(`Failed to resume workflow: Could not save checkpoint - ${o.message}`)}}try{let r=t.pathway_type;if(!r){let{isBrownfield:c}=await Rn(this.projectPath);r=c?"brownfield-enhancement":"greenfield"}let o=$n.join(this.projectPath,".claude","CLAUDE.md"),s=ge.existsSync(o)?ge.readFileSync(o,"utf-8"):"",i=Ua(this.workflowId,r),a=La(s,i);ge.mkdirSync($n.join(this.projectPath,".claude"),{recursive:!0}),ge.writeFileSync(o,a,"utf-8"),console.log("[WorkflowEngine] Injected AI-DLC rules into .claude/CLAUDE.md")}catch(r){console.error("[WorkflowEngine] Failed to inject AI-DLC rules into CLAUDE.md:",r)}this.setupInterruptHandler();let n=t.current_stage;try{await this.executeStage(n)}catch(r){let o=r;console.error(`[WorkflowEngine] Failed to execute ${n} stage: ${o.message}`);try{let s=await A(this.projectPath,this.workflowId);s&&(s.status="paused",s.resume_context={...s.resume_context,error_message:o.message,failed_stage:n},await P(this.projectPath,s),console.log("[WorkflowEngine] Workflow saved as paused. Fix the issue and resume with `/continue`"))}catch(s){console.warn("[WorkflowEngine] Failed to save error checkpoint:",s.message)}throw new Error(`Failed to execute ${n} stage: ${o.message}`)}finally{this.cleanupInterruptHandler()}return`Resumed workflow from stage: ${n}`}async pause(){let t;try{t=await A(this.projectPath,this.workflowId)}catch(n){let r=n;throw console.error(`[WorkflowEngine] Failed to load checkpoint for pause: ${r.message}`),new Error(`Failed to pause workflow: Could not load checkpoint - ${r.message}`)}if(!t)throw console.error(`[WorkflowEngine] No checkpoint found for workflow: ${this.workflowId}`),new Error(`No checkpoint found for workflow: ${this.workflowId}`);t.status="paused";try{await P(this.projectPath,t)}catch(n){let r=n;throw console.error(`[WorkflowEngine] Failed to save paused checkpoint: ${r.message}`),new Error(`Failed to pause workflow: Could not save checkpoint - ${r.message}`)}return`aidlc-docs/${this.workflowId}/checkpoint.json`}async executeStage(t){if(t==="complete")throw new Error("No execution for complete stage");let n=await A(this.projectPath,this.workflowId);if(!n)throw new Error(`No checkpoint found for workflow: ${this.workflowId}`);switch(t){case"intent":await this.executeIntentStage(n);break;case"unit":await this.executeUnitStage(n);break;case"code-generation":await this.executeCodeGenerationStage(n);break}let r=wC(t);n.current_stage=r,r==="complete"?await this.completeWorkflow(n):await P(this.projectPath,n)}async getStatus(){let t;try{t=await A(this.projectPath,this.workflowId)}catch(r){let o=r;throw console.error(`[WorkflowEngine] Failed to load checkpoint for status: ${o.message}`),new Error(`Failed to get workflow status: Could not load checkpoint - ${o.message}`)}if(!t)throw console.error(`[WorkflowEngine] No checkpoint found for workflow: ${this.workflowId}`),new Error(`No checkpoint found for workflow: ${this.workflowId}`);let n=[];return{workflow_id:t.workflow_id,feature_name:t.feature_name,current_stage:t.current_stage,status:t.status,artifacts:n,updated_at:t.updated_at}}async executePhase(t){let n=Xr(this.projectPath,this.workflowId);if(n&&!cs(n,t)){console.log(`[WorkflowEngine] Skipping ${t} phase (excluded by Workflow Routing: ${n.phases[t]?.rationale||"no rationale"})`);let r=await A(this.projectPath,this.workflowId);if(r){let s=r;s.phases&&s.phases[t]&&(s.phases[t].status="complete",s.phases[t].completed_at=new Date().toISOString(),s.phases[t].gate_bypassed=!0,s.phases[t].bypass_reason="Excluded by Workflow Routing"),await P(this.projectPath,r)}let o=`${this.projectPath}/aidlc-docs/${this.workflowId}/manifest.json`;try{je(o,{phase:t,action:"bypassed",actor:"config",reason:`Excluded by Workflow Routing (pathway: ${n.pathway})`})}catch{}return}switch(t){case"discovery":{let r=`${this.projectPath}/aidlc-docs/${this.workflowId}/manifest.json`,o=await um({projectPath:this.projectPath,workflowId:this.workflowId,featureName:this.featureName,manifestPath:r});o.gateRequired&&(console.log(`[WorkflowEngine] Discovery phase: ${o.artifactsGenerated.length} artifacts generated (${o.sourceFileCount} source files detected)`),console.log(`[WorkflowEngine] Discovery Gate: Review findings in aidlc-docs/${this.workflowId}/discovery/ before proceeding to Inception`));try{let s=await A(this.projectPath,this.workflowId);s&&(s.phases.discovery.status="complete",s.phases.discovery.completed_at=new Date().toISOString(),await P(this.projectPath,s))}catch(s){console.error("[WorkflowEngine] Failed to persist discovery phase completion:",s)}try{let s={type:"phase_complete",phase:"discovery",details:`${o.artifactsGenerated.length} artifacts generated, ${o.sourceFileCount} source files`},i={workflowId:this.workflowId,featureName:this.featureName,projectPath:this.projectPath,sessionId:"engine",phase:"discovery"},a=Ve(s,i);ue(a)}catch(s){console.error("[WorkflowEngine] Failed to capture discovery phase discovery:",s)}break}case"inception":{let{InceptionOrchestrator:r}=await Promise.resolve().then(()=>(hg(),gg)),o=new r,s=await A(this.projectPath,this.workflowId);if(!s)throw new Error(`No checkpoint found for workflow: ${this.workflowId}`);if(s.current_stage!=="intent"){console.log(`[WorkflowEngine] Skipping inception orchestrator \u2014 checkpoint already at stage '${s.current_stage}'`);break}if(!s.inception_stages){let i=Xr(this.projectPath,this.workflowId),a=s;await o.initialize(this.projectPath,this.workflowId,a.pathway_type||"greenfield",i)}for(;!await o.isComplete(this.projectPath,this.workflowId);){let i=await o.executeNextStage(this.projectPath,this.workflowId);if(i.status==="awaiting_answers"||i.status==="review_required")break}if(await o.isComplete(this.projectPath,this.workflowId))try{let i=await A(this.projectPath,this.workflowId);i&&(i.phases.inception.status="complete",i.phases.inception.completed_at=new Date().toISOString(),await P(this.projectPath,i))}catch(i){console.error("[WorkflowEngine] Failed to persist inception phase completion:",i)}try{let i={type:"phase_complete",phase:"inception",details:"Inception stages completed"},a={workflowId:this.workflowId,featureName:this.featureName,projectPath:this.projectPath,sessionId:"engine",phase:"inception"},c=Ve(i,a);ue(c)}catch(i){console.error("[WorkflowEngine] Failed to capture inception phase discovery:",i)}break}case"construction":{let r=await A(this.projectPath,this.workflowId);if(r&&r.status==="awaiting_dev_review"){console.log("[WorkflowEngine] Waiting for developer review of technical specification (Risk Tier 3).");return}let o=lt(this.projectPath,this.workflowId,"intent"),s;try{s=ge.readFileSync(o,"utf-8")}catch{}let a=await new ys(this.projectPath,this.workflowId).execute(s);if(!a.passed)throw console.error("[WorkflowEngine] Construction phase validation failed:",a.blocking_issues),new Error(`Construction phase validation failed: ${a.blocking_issues.join(", ")}`);try{let c=await A(this.projectPath,this.workflowId);c&&(c.phases.construction.status="complete",c.phases.construction.completed_at=new Date().toISOString(),await P(this.projectPath,c))}catch(c){console.error("[WorkflowEngine] Failed to persist construction phase completion:",c)}try{let c={type:"phase_complete",phase:"construction",details:"Construction phase completed"},l={workflowId:this.workflowId,featureName:this.featureName,projectPath:this.projectPath,sessionId:"engine",phase:"construction"},u=Ve(c,l);ue(u)}catch(c){console.error("[WorkflowEngine] Failed to capture construction phase discovery:",c)}break}case"operations":{let{generateOperationsArtifacts:r}=await Promise.resolve().then(()=>(bg(),vg)),{loadManifest:o,registerArtifact:s,updatePhaseStatus:i}=await Promise.resolve().then(()=>(Z(),vn)),a=`${this.projectPath}/aidlc-docs/${this.workflowId}/manifest.json`,c=o(a),l=null;try{l=ge.readFileSync(lt(this.projectPath,this.workflowId,"intent"),"utf-8")}catch{}let u=await A(this.projectPath,this.workflowId),d="MEDIUM";if(c?.depth_assessment){let m=c.depth_assessment.total_score;m<=10?d="SHALLOW":m>=21&&(d="DEEP")}let p={workflowId:this.workflowId,featureName:this.featureName,manifest:c,specContent:l,buildLogContent:null,depthLevel:d},f=await r(p,this.projectPath);if(c){i(a,"operations","complete");for(let m of f.artifactsGenerated){let g=`aidlc-docs/${this.workflowId}/operations/${m}`,y=m.replace(/\.(md|json)$/,"").toUpperCase().replace(/-/g,"_");s(a,{id:`OPS-${y}`,type:y,phase:"operations",stage:"code-generation",path:g,validation_passed:!0,write_complete:!0,checksum:null})}}u&&(u.current_phase="operations",u.phases.operations.status="complete",u.phases.operations.completed_at=new Date().toISOString(),u.updated_at=new Date().toISOString(),await P(this.projectPath,u)),console.log(`[WorkflowEngine] Operations phase: Generated ${f.artifactsGenerated.length} artifacts (depth: ${d})`),console.log(`[WorkflowEngine] Operations artifacts: ${f.artifactsGenerated.join(", ")}`);try{let m={type:"phase_complete",phase:"operations",details:`${f.artifactsGenerated.length} artifacts generated (depth: ${d})`},g={workflowId:this.workflowId,featureName:this.featureName,projectPath:this.projectPath,sessionId:"engine",phase:"operations"},y=Ve(m,g);ue(y)}catch(m){console.error("[WorkflowEngine] Failed to capture operations phase discovery:",m)}break}}}async completeWorkflow(t){t.status="complete";try{let n=$n.join(this.projectPath,".claude","CLAUDE.md");if(ge.existsSync(n)){let r=ge.readFileSync(n,"utf-8"),o=cg(r);ge.writeFileSync(n,o,"utf-8"),console.log("[WorkflowEngine] Removed AI-DLC rules from .claude/CLAUDE.md (workflow complete)")}}catch(n){console.error("[WorkflowEngine] Failed to remove AI-DLC rules from CLAUDE.md:",n)}await P(this.projectPath,t),await Wi(this.projectPath,this.workflowId)}async approveWorkflowRouting(t){let n=Xr(this.projectPath,this.workflowId);if(!n)throw new Error(`No Workflow Routing found for workflow: ${this.workflowId}`);n.approved_at=new Date().toISOString(),n.approved_by="human",await as(this.projectPath,this.workflowId,n);let r=await A(this.projectPath,this.workflowId);if(r){let s=r;if(s.inception_stages?.["workflow-planning"]){let i=s.inception_stages["workflow-planning"];i.status!=="completed"&&i.status!=="skipped"&&(i.status="completed",i.completed_at=new Date().toISOString(),await P(this.projectPath,r))}}let o=`${this.projectPath}/aidlc-docs/${this.workflowId}/manifest.json`;try{je(o,{phase:"inception",action:"approved",actor:"human",reason:t||"Workflow Routing approved"})}catch{}console.log("[WorkflowEngine] Workflow Routing approved")}setupInterruptHandler(){this.interruptHandler=async()=>{console.log(`
1142
+ [WorkflowEngine] Workflow interrupted - saving checkpoint...`);try{let t=await A(this.projectPath,this.workflowId);t&&(t.status="paused",t.updated_at=new Date().toISOString(),t.resume_context={...t.resume_context,interrupted_at:new Date().toISOString(),current_stage:t.current_stage,message:`Workflow interrupted during ${t.current_stage} stage`},await P(this.projectPath,t),console.log("[WorkflowEngine] Checkpoint saved. Resume with `/continue`"))}catch(t){console.error("[WorkflowEngine] Failed to save checkpoint on interrupt:",t)}process.exit(0)},process.on("SIGINT",this.interruptHandler)}cleanupInterruptHandler(){this.interruptHandler&&(process.off("SIGINT",this.interruptHandler),this.interruptHandler=null)}async executeIntentStage(t){let n=t.resume_context?.initial_prompt||"No initial prompt provided";console.log(`[WorkflowEngine] Executing INTENT stage for feature: ${this.featureName}`),console.log(`[WorkflowEngine] Initial prompt: ${n}`),console.log("[WorkflowEngine] Generating merged INTENT artifact with full inception content");let r=`intent-${this.workflowId}`,o=new Date().toISOString(),s=`---
1143
1143
  id: ${r}
1144
1144
  title: ${this.featureName}
1145
1145
  status: draft
@@ -1340,7 +1340,7 @@ created: ${o}
1340
1340
 
1341
1341
  ---
1342
1342
  *Generated by WorkflowEngine based on ${r}*
1343
- `;await Xn(this.projectPath,this.workflowId,"nfr",a),console.log("[WorkflowEngine] Generated NFR artifact at inception/requirements/nfr.md");let c=lt(this.projectPath,this.workflowId,"intent");console.log(`[WorkflowEngine] Validating INTENT artifact at: ${c}`);let l=await Bo(c);l.passed?(console.log("[WorkflowEngine] INTENT validation passed"),console.log(`[WorkflowEngine] Coverage: ${l.coverage_percentage}%`)):(console.log("[WorkflowEngine] INTENT validation failed:",l.blocking_issues),console.log(`[WorkflowEngine] Coverage: ${l.coverage_percentage}%`));let u=await I(this.projectPath,this.workflowId);if(u){let d=u;d.interview_progress={stage:"intent",questions_asked:0,draft_artifact_path:c},u.updated_at=new Date().toISOString(),await P(this.projectPath,u)}}async executeUnitStage(t){console.log("[WorkflowEngine] UNIT stage delegated to construction phase executor"),await this.executePhase("construction")}async executeCodeGenerationStage(t){console.log("[WorkflowEngine] CODE-GENERATION stage delegated to construction phase executor"),await this.executePhase("construction")}};ce();var Eg={intent:null,unit:null,"code-generation":null,complete:null};function Tg(e){switch(e){case"intent":return"capture the problem statement, personas, success metrics, constraints, and define business requirements, technical approach, and proposed UNITs";case"unit":return"decompose into module-scoped UNITs with interface contracts";case"code-generation":return"generate code from the approved code plan";case"complete":return"finalize and validate all workflow artifacts";default:return"proceed with the next stage"}}function Cg(e,t,n=!1){let r=t.current_stage,o=Eg[r],s=Tg(r),i=`You are beginning a structured workflow for feature: ${e}
1343
+ `;await Xn(this.projectPath,this.workflowId,"nfr",a),console.log("[WorkflowEngine] Generated NFR artifact at inception/requirements/nfr.md");let c=lt(this.projectPath,this.workflowId,"intent");console.log(`[WorkflowEngine] Validating INTENT artifact at: ${c}`);let l=await Bo(c);l.passed?(console.log("[WorkflowEngine] INTENT validation passed"),console.log(`[WorkflowEngine] Coverage: ${l.coverage_percentage}%`)):(console.log("[WorkflowEngine] INTENT validation failed:",l.blocking_issues),console.log(`[WorkflowEngine] Coverage: ${l.coverage_percentage}%`));let u=await A(this.projectPath,this.workflowId);if(u){let d=u;d.interview_progress={stage:"intent",questions_asked:0,draft_artifact_path:c},u.updated_at=new Date().toISOString(),await P(this.projectPath,u)}}async executeUnitStage(t){console.log("[WorkflowEngine] UNIT stage delegated to construction phase executor"),await this.executePhase("construction")}async executeCodeGenerationStage(t){console.log("[WorkflowEngine] CODE-GENERATION stage delegated to construction phase executor"),await this.executePhase("construction")}};ce();var Eg={intent:null,unit:null,"code-generation":null,complete:null};function Tg(e){switch(e){case"intent":return"capture the problem statement, personas, success metrics, constraints, and define business requirements, technical approach, and proposed UNITs";case"unit":return"decompose into module-scoped UNITs with interface contracts";case"code-generation":return"generate code from the approved code plan";case"complete":return"finalize and validate all workflow artifacts";default:return"proceed with the next stage"}}function Cg(e,t,n=!1){let r=t.current_stage,o=Eg[r],s=Tg(r),i=`You are beginning a structured workflow for feature: ${e}
1344
1344
 
1345
1345
  `;return i+=`Current stage: ${r}
1346
1346
  `,i+=`Status: ${t.status}
@@ -1364,17 +1364,17 @@ IMPORTANT: This is a BRAND NEW workflow just initialized. `,i+="Do NOT treat thi
1364
1364
 
1365
1365
  `,s+=`Use: Task(subagent_type="${r}", prompt="...")
1366
1366
  `):s+=`Continue from where you left off: ${o}
1367
- `,s}function Ja(e){return e.prompt?e.prompt:e.message?.content?e.message.content:e.parts?e.parts.filter(t=>t.type==="text"&&t.text).map(t=>t.text).join(" "):""}function xg(){A({name:"structuredWorkflowDetector",event:"UserPromptSubmit",priority:8,handler:async e=>{let t=Ja(e);if(!t||!e.directory)return{continue:!0};let n=t.match(/^\/plan\s+(?!continue\b|--)([\s\S]+?)$/i),r=t.match(/^\/plan\s+continue$/i);if(n){let o=n[1].trim();o=o.replace(/\s+--structured\s*/i,"").trim();let s,i=o.match(/\s+--depth\s+(shallow|medium|deep)\s*$/i);i&&(s=i[1].toLowerCase(),o=o.replace(i[0],"").trim());let a,c=o.match(/\s+--(brownfield|greenfield)\s*$/i);if(c&&(a=c[1].toLowerCase(),o=o.replace(c[0],"").trim()),o.length>120)return console.error("[Structured Workflow] Feature name too long, likely not a real feature name:",o.substring(0,50)+"..."),{continue:!0};if(/\b(lets|let's|please|proceed|creating|we should|i want to|i need to|going to)\b/i.test(o))return console.error("[Structured Workflow] Feature name looks like conversational text, skipping:",o.substring(0,50)+"..."),{continue:!0};try{await new Ss(e.directory,o).start(o);let d=Ka(o),p=await I(e.directory,d);if(!p)return{continue:!0};let f=Cg(o,p,!0),g=`${`[Workflow: ${d} | Phase: ${p.current_phase||"inception"} | Stage: ${p.current_stage||"intent"}]`}
1367
+ `,s}function Ja(e){return e.prompt?e.prompt:e.message?.content?e.message.content:e.parts?e.parts.filter(t=>t.type==="text"&&t.text).map(t=>t.text).join(" "):""}function xg(){I({name:"structuredWorkflowDetector",event:"UserPromptSubmit",priority:8,handler:async e=>{let t=Ja(e);if(!t||!e.directory)return{continue:!0};let n=t.match(/^\/plan\s+(?!continue\b|--)([\s\S]+?)$/i),r=t.match(/^\/plan\s+continue$/i);if(n){let o=n[1].trim();o=o.replace(/\s+--structured\s*/i,"").trim();let s,i=o.match(/\s+--depth\s+(shallow|medium|deep)\s*$/i);i&&(s=i[1].toLowerCase(),o=o.replace(i[0],"").trim());let a,c=o.match(/\s+--(brownfield|greenfield)\s*$/i);if(c&&(a=c[1].toLowerCase(),o=o.replace(c[0],"").trim()),o.length>120)return console.error("[Structured Workflow] Feature name too long, likely not a real feature name:",o.substring(0,50)+"..."),{continue:!0};if(/\b(lets|let's|please|proceed|creating|we should|i want to|i need to|going to)\b/i.test(o))return console.error("[Structured Workflow] Feature name looks like conversational text, skipping:",o.substring(0,50)+"..."),{continue:!0};try{await new Ss(e.directory,o).start(o);let d=Ka(o),p=await A(e.directory,d);if(!p)return{continue:!0};let f=Cg(o,p,!0),g=`${`[Workflow: ${d} | Phase: ${p.current_phase||"inception"} | Stage: ${p.current_stage||"intent"}]`}
1368
1368
 
1369
1369
  ${f}`;return s&&(g+=`
1370
1370
 
1371
1371
  Depth override: ${s}`),a&&(g+=`
1372
1372
 
1373
- Project type: ${a}`),{continue:!0,hookSpecificOutput:{hookEventName:"UserPromptSubmit",additionalContext:g}}}catch(u){return console.error("[Structured Workflow]",u),{continue:!0}}}if(r)try{let o=await oe(e.directory);if(o.length===0)return{continue:!0,hookSpecificOutput:{hookEventName:"UserPromptSubmit",additionalContext:"No active workflows found. Use `/plan {feature}` to start a new workflow."}};let s=o[0],i=await I(e.directory,s);if(!i)return{continue:!0};let a=Rg(i.feature_name,i);return{continue:!0,hookSpecificOutput:{hookEventName:"UserPromptSubmit",additionalContext:`[TIP: For full AIDLC resume with behavioral rules, use /continue instead of /plan continue]
1373
+ Project type: ${a}`),{continue:!0,hookSpecificOutput:{hookEventName:"UserPromptSubmit",additionalContext:g}}}catch(u){return console.error("[Structured Workflow]",u),{continue:!0}}}if(r)try{let o=await oe(e.directory);if(o.length===0)return{continue:!0,hookSpecificOutput:{hookEventName:"UserPromptSubmit",additionalContext:"No active workflows found. Use `/plan {feature}` to start a new workflow."}};let s=o[0],i=await A(e.directory,s);if(!i)return{continue:!0};let a=Rg(i.feature_name,i);return{continue:!0,hookSpecificOutput:{hookEventName:"UserPromptSubmit",additionalContext:`[TIP: For full AIDLC resume with behavioral rules, use /continue instead of /plan continue]
1374
1374
 
1375
1375
  ${`[Workflow: ${s} | Phase: ${i.current_phase||"inception"} | Stage: ${i.current_stage||"intent"}]`}
1376
1376
 
1377
- ${a}`}}}catch(o){return console.error("[Workflow Resume]",o),{continue:!0}}return{continue:!0}}}),A({name:"keywordDetector",event:"UserPromptSubmit",priority:10,handler:e=>{let t=Ja(e);if(!t)return{continue:!0};let n=El(t),r=Tl(n);if(r.length===0)return{continue:!0};let o=r.some(c=>c.type==="ultrawork"),s=r.some(c=>c.type==="ultrathink"),i=r.some(c=>c.type==="search"),a=r.some(c=>c.type==="analyze");return o?(Vl(t,e.sessionId,e.directory||process.cwd()),{continue:!0,hookSpecificOutput:{hookEventName:"UserPromptSubmit",additionalContext:Ql}}):s?{continue:!0,hookSpecificOutput:{hookEventName:"UserPromptSubmit",additionalContext:Xl}}:i?{continue:!0,hookSpecificOutput:{hookEventName:"UserPromptSubmit",additionalContext:Zl}}:a?{continue:!0,hookSpecificOutput:{hookEventName:"UserPromptSubmit",additionalContext:eu}}:{continue:!0}}}),A({name:"autoSlashCommand",event:"UserPromptSubmit",priority:20,handler:e=>{if(!e.parts)return{continue:!0};let n=jl().processMessage({sessionId:e.sessionId||""},e.parts);return n.detected&&n.injectedMessage?{continue:!0,hookSpecificOutput:{hookEventName:"UserPromptSubmit",additionalContext:n.injectedMessage}}:{continue:!0}}}),A({name:"thinkMode",event:"UserPromptSubmit",priority:30,handler:e=>{if(!e.message||!e.parts)return{continue:!0};let t=Hl(),n=e.sessionId||"default",r={parts:e.parts,message:{model:e.message.model&&e.message.model.providerId&&e.message.model.modelId?{providerId:e.message.model.providerId,modelId:e.message.model.modelId}:void 0}},o=t.processChatParams(n,r);return o.requested&&o.modelSwitched?{continue:!0,hookSpecificOutput:{hookEventName:"UserPromptSubmit",additionalContext:"[Think Mode Activated] Switched to high-reasoning model variant."}}:{continue:!0}}}),A({name:"learningFeedbackCapture",event:"UserPromptSubmit",priority:100,handler:async e=>{let t=Ja(e);return!t||!e.directory?{continue:!0}:(Promise.resolve().then(async()=>{try{await Cu({prompt:t,directory:e.directory,sessionId:e.sessionId}),await xu({prompt:t,directory:e.directory,sessionId:e.sessionId})}catch(n){console.error("[Olympus Learning]",n)}}),{continue:!0})}})}var za=require("child_process");var _C="mcpProcessCleanup",kC=/mcp/i;function SC(e){return e?kC.test(e):!1}function vC(e,t){return e.filter(n=>SC(n.CommandLine)?!t.has(n.ParentProcessId):!1)}function bC(e){let t=0;for(let n of e)try{(0,za.execSync)(`taskkill /T /F /PID ${n.ProcessId}`,{encoding:"utf8",timeout:5e3,stdio:"pipe"}),t++}catch{}return t}function EC(){if(process.platform!=="win32")return 0;try{let e=`
1377
+ ${a}`}}}catch(o){return console.error("[Workflow Resume]",o),{continue:!0}}return{continue:!0}}}),I({name:"keywordDetector",event:"UserPromptSubmit",priority:10,handler:e=>{let t=Ja(e);if(!t)return{continue:!0};let n=El(t),r=Tl(n);if(r.length===0)return{continue:!0};let o=r.some(c=>c.type==="ultrawork"),s=r.some(c=>c.type==="ultrathink"),i=r.some(c=>c.type==="search"),a=r.some(c=>c.type==="analyze");return o?(Vl(t,e.sessionId,e.directory||process.cwd()),{continue:!0,hookSpecificOutput:{hookEventName:"UserPromptSubmit",additionalContext:Ql}}):s?{continue:!0,hookSpecificOutput:{hookEventName:"UserPromptSubmit",additionalContext:Xl}}:i?{continue:!0,hookSpecificOutput:{hookEventName:"UserPromptSubmit",additionalContext:Zl}}:a?{continue:!0,hookSpecificOutput:{hookEventName:"UserPromptSubmit",additionalContext:eu}}:{continue:!0}}}),I({name:"autoSlashCommand",event:"UserPromptSubmit",priority:20,handler:e=>{if(!e.parts)return{continue:!0};let n=jl().processMessage({sessionId:e.sessionId||""},e.parts);return n.detected&&n.injectedMessage?{continue:!0,hookSpecificOutput:{hookEventName:"UserPromptSubmit",additionalContext:n.injectedMessage}}:{continue:!0}}}),I({name:"thinkMode",event:"UserPromptSubmit",priority:30,handler:e=>{if(!e.message||!e.parts)return{continue:!0};let t=Hl(),n=e.sessionId||"default",r={parts:e.parts,message:{model:e.message.model&&e.message.model.providerId&&e.message.model.modelId?{providerId:e.message.model.providerId,modelId:e.message.model.modelId}:void 0}},o=t.processChatParams(n,r);return o.requested&&o.modelSwitched?{continue:!0,hookSpecificOutput:{hookEventName:"UserPromptSubmit",additionalContext:"[Think Mode Activated] Switched to high-reasoning model variant."}}:{continue:!0}}}),I({name:"learningFeedbackCapture",event:"UserPromptSubmit",priority:100,handler:async e=>{let t=Ja(e);return!t||!e.directory?{continue:!0}:(Promise.resolve().then(async()=>{try{await Cu({prompt:t,directory:e.directory,sessionId:e.sessionId}),await xu({prompt:t,directory:e.directory,sessionId:e.sessionId})}catch(n){console.error("[Olympus Learning]",n)}}),{continue:!0})}})}var za=require("child_process");var _C="mcpProcessCleanup",kC=/mcp/i;function SC(e){return e?kC.test(e):!1}function vC(e,t){return e.filter(n=>SC(n.CommandLine)?!t.has(n.ParentProcessId):!1)}function bC(e){let t=0;for(let n of e)try{(0,za.execSync)(`taskkill /T /F /PID ${n.ProcessId}`,{encoding:"utf8",timeout:5e3,stdio:"pipe"}),t++}catch{}return t}function EC(){if(process.platform!=="win32")return 0;try{let e=`
1378
1378
  $nodeProcs = Get-CimInstance Win32_Process -Filter "Name='node.exe'" |
1379
1379
  Select-Object ProcessId, ParentProcessId, CommandLine;
1380
1380
  $allPids = (Get-Process -ErrorAction SilentlyContinue).Id;
@@ -1382,7 +1382,7 @@ ${a}`}}}catch(o){return console.error("[Workflow Resume]",o),{continue:!0}}retur
1382
1382
  nodeProcesses = @($nodeProcs | ForEach-Object { @{ ProcessId=$_.ProcessId; ParentProcessId=$_.ParentProcessId; CommandLine=$_.CommandLine } });
1383
1383
  allPids = @($allPids)
1384
1384
  } | ConvertTo-Json -Depth 3
1385
- `.replace(/\n/g," "),t=(0,za.execSync)(`powershell -NoProfile -Command "${e}"`,{encoding:"utf8",timeout:15e3,stdio:["pipe","pipe","pipe"]}),n=JSON.parse(t),r=Array.isArray(n.nodeProcesses)?n.nodeProcesses:n.nodeProcesses?[n.nodeProcesses]:[],o=new Set(Array.isArray(n.allPids)?n.allPids:n.allPids?[n.allPids]:[]),s=vC(r,o);return s.length===0?0:bC(s)}catch(e){return console.error("[Olympus MCP Cleanup] Error:",e),0}}function Pg(){A({name:_C,event:"SessionStart",priority:1,handler:e=>{let t=EC();return t>0?{continue:!0,hookSpecificOutput:{hookEventName:"SessionStart",additionalContext:`[MCP Cleanup] Removed ${t} orphaned MCP server process${t===1?"":"es"} from previous session(s).`}}:{continue:!0}}})}var Dn=require("fs"),un=require("path"),Ag=require("os");function TC(e,t){let n=(0,un.join)((0,Ag.homedir)(),".claude"),r=[];e&&(r.push((0,un.join)(n,"sessions",e,"todos.json")),r.push((0,un.join)(n,"todos",`${e}.json`))),t&&(r.push((0,un.join)(t,".olympus","todos.json")),r.push((0,un.join)(t,".claude","todos.json")));let o=(0,un.join)(n,"todos");if((0,Dn.existsSync)(o))try{let s=(0,Dn.readdirSync)(o);for(let i of s)i.endsWith(".json")&&r.push((0,un.join)(o,i))}catch{}return r}function CC(e){try{let t=(0,Dn.readFileSync)(e,"utf-8"),n=JSON.parse(t);return Array.isArray(n)?n.filter(r=>r&&typeof r.content=="string"&&typeof r.status=="string"):n.todos&&Array.isArray(n.todos)?n.todos.filter(r=>{let o=r;return o&&typeof o.content=="string"&&typeof o.status=="string"}):[]}catch{return[]}}function RC(e){return e.status!=="completed"&&e.status!=="cancelled"}async function to(e,t){let n=TC(e,t),r=new Set,o=[],s=[];for(let i of n){if(!(0,Dn.existsSync)(i))continue;let a=CC(i);for(let c of a){let l=`${c.content}:${c.status}`;r.has(l)||(r.add(l),o.push(c),RC(c)&&s.push(c))}}return{count:s.length,todos:s,total:o.length}}function Ig(e){let t=e.todos.find(n=>n.status==="in_progress");return t||(e.todos.find(n=>n.status==="pending")??null)}var Qa=require("path");we();Qo();we();function Og(e,t=5){return(e.token_efficiency?.invocation_count??0)>=t}Ei();var $g=500;function Dg(e){let t=_e((0,Qa.join)(pe(),"user-preferences.json"),null),n=_e((0,Qa.join)(_t(e),"patterns.json"),null),r=qn(),o=qn(e),s={...r,...o},i=[];if(t&&xC(t)){let u=t.explicit_rules.filter(p=>!p.project_path||p.project_path===e),d={...t,explicit_rules:u};i.push(PC(d))}n&&(n.conventions.length>0||n.tech_stack.length>0||n.learned_rules&&n.learned_rules.length>0||n.common_mistakes&&n.common_mistakes.length>0)&&i.push(AC(n)),t?.recurring_corrections&&t.recurring_corrections.length>0&&i.push(IC(t.recurring_corrections.slice(0,5)));let a=Object.values(s).filter(u=>u.weak_areas.length>0);a.length>0&&i.push(OC(a));let c=$C(s);if(c&&i.push(c),i.length===0)return"";let l=`<learned-context>
1385
+ `.replace(/\n/g," "),t=(0,za.execSync)(`powershell -NoProfile -Command "${e}"`,{encoding:"utf8",timeout:15e3,stdio:["pipe","pipe","pipe"]}),n=JSON.parse(t),r=Array.isArray(n.nodeProcesses)?n.nodeProcesses:n.nodeProcesses?[n.nodeProcesses]:[],o=new Set(Array.isArray(n.allPids)?n.allPids:n.allPids?[n.allPids]:[]),s=vC(r,o);return s.length===0?0:bC(s)}catch(e){return console.error("[Olympus MCP Cleanup] Error:",e),0}}function Pg(){I({name:_C,event:"SessionStart",priority:1,handler:e=>{let t=EC();return t>0?{continue:!0,hookSpecificOutput:{hookEventName:"SessionStart",additionalContext:`[MCP Cleanup] Removed ${t} orphaned MCP server process${t===1?"":"es"} from previous session(s).`}}:{continue:!0}}})}var Dn=require("fs"),un=require("path"),Ag=require("os");function TC(e,t){let n=(0,un.join)((0,Ag.homedir)(),".claude"),r=[];e&&(r.push((0,un.join)(n,"sessions",e,"todos.json")),r.push((0,un.join)(n,"todos",`${e}.json`))),t&&(r.push((0,un.join)(t,".olympus","todos.json")),r.push((0,un.join)(t,".claude","todos.json")));let o=(0,un.join)(n,"todos");if((0,Dn.existsSync)(o))try{let s=(0,Dn.readdirSync)(o);for(let i of s)i.endsWith(".json")&&r.push((0,un.join)(o,i))}catch{}return r}function CC(e){try{let t=(0,Dn.readFileSync)(e,"utf-8"),n=JSON.parse(t);return Array.isArray(n)?n.filter(r=>r&&typeof r.content=="string"&&typeof r.status=="string"):n.todos&&Array.isArray(n.todos)?n.todos.filter(r=>{let o=r;return o&&typeof o.content=="string"&&typeof o.status=="string"}):[]}catch{return[]}}function RC(e){return e.status!=="completed"&&e.status!=="cancelled"}async function to(e,t){let n=TC(e,t),r=new Set,o=[],s=[];for(let i of n){if(!(0,Dn.existsSync)(i))continue;let a=CC(i);for(let c of a){let l=`${c.content}:${c.status}`;r.has(l)||(r.add(l),o.push(c),RC(c)&&s.push(c))}}return{count:s.length,todos:s,total:o.length}}function Ig(e){let t=e.todos.find(n=>n.status==="in_progress");return t||(e.todos.find(n=>n.status==="pending")??null)}var Qa=require("path");we();Qo();we();function Og(e,t=5){return(e.token_efficiency?.invocation_count??0)>=t}Ei();var $g=500;function Dg(e){let t=_e((0,Qa.join)(pe(),"user-preferences.json"),null),n=_e((0,Qa.join)(_t(e),"patterns.json"),null),r=qn(),o=qn(e),s={...r,...o},i=[];if(t&&xC(t)){let u=t.explicit_rules.filter(p=>!p.project_path||p.project_path===e),d={...t,explicit_rules:u};i.push(PC(d))}n&&(n.conventions.length>0||n.tech_stack.length>0||n.learned_rules&&n.learned_rules.length>0||n.common_mistakes&&n.common_mistakes.length>0)&&i.push(AC(n)),t?.recurring_corrections&&t.recurring_corrections.length>0&&i.push(IC(t.recurring_corrections.slice(0,5)));let a=Object.values(s).filter(u=>u.weak_areas.length>0);a.length>0&&i.push(OC(a));let c=$C(s);if(c&&i.push(c),i.length===0)return"";let l=`<learned-context>
1386
1386
 
1387
1387
  ${i.join(`
1388
1388
 
@@ -1403,10 +1403,10 @@ ${i.join(`
1403
1403
  `)}function OC(e){let t=["## Agent Notes"];for(let n of e.slice(0,3))t.push(`- ${n.agent_name}: struggles with ${n.weak_areas.join(", ")}`);return t.join(`
1404
1404
  `)}function $C(e){let t=Object.values(e).filter(a=>a.token_efficiency&&Og(a)).sort((a,c)=>{let l=a.token_efficiency?.efficiency_score??0;return(c.token_efficiency?.efficiency_score??0)-l});if(t.length===0)return"";let n=[];n.push("<olympus-efficiency>"),n.push("AGENT EFFICIENCY (success%/avg tokens):");for(let a of t.slice(0,3)){let c=Math.round(a.success_rate*100),l=a.token_efficiency.avg_tokens_per_success,u=l>=1e3?`${(l/1e3).toFixed(1)}k`:`${Math.round(l)}`,p=a.success_rate>=.9&&a.token_efficiency.efficiency_score>.8?" [PREFERRED]":"";n.push(`- ${a.agent_name}: ${c}%/${u}${p}`)}let r=wn(),o=r>=1e3?`${(r/1e3).toFixed(0)}k`:r.toString(),s=Math.round(r*1.5),i=s>=1e3?`${(s/1e3).toFixed(0)}k`:s.toString();return n.push(""),n.push(`SESSION BUDGET: ~${o} baseline | warn at ${i}`),n.push("PATTERNS: Parallel reads save 40%"),n.push(""),n.push("Quality remains priority. Use efficiency as tiebreaker."),n.push("</olympus-efficiency>"),n.join(`
1405
1405
  `)}function Ng(e){if(e.length===0)return"";let t=["## Agent Discoveries"];t.push(""),t.push("These insights were discovered during previous work:"),t.push("");for(let n of e.slice(0,5))t.push(`- **${n.category}**: ${n.summary}`),t.push(` ${n.details.substring(0,200)}`);return t.join(`
1406
- `)}Ut();Be();var Mg=v(require("path"),1);ce();Z();var pt=v(require("path"),1),bs=v(X(),1);Z();ce();sn();async function Es(e){try{let t=await oe(e);if(t.length===0)return null;let n=t[0],r=pt.join(e,"aidlc-docs",n,"manifest.json"),o=W(r);if(!o)return null;let s=await I(e,n);if(!s)return null;let i=Ee(e),a=DC(o),l=Ki(o,"fulfilled").map(p=>p.id),d=Sn(o).filter(p=>p.contract_status!=="fulfilled").map(p=>p.id);return{workflowId:s.workflow_id,featureName:s.feature_name,currentPhase:s.current_phase,currentStage:s.current_stage,manifest:o,checkpoint:s,trustLevel:i.current_level,riskTier:s.risk_tier??0,depthScore:s.depth_score??0,pendingBolts:a,completedBolts:l,pendingUnits:d,executionMode:s.execution_mode??"manual"}}catch(t){return console.error("[WorkflowBridge] Failed to detect active workflow:",t),null}}function DC(e){return Et(e).filter(n=>n.contract_status!=="fulfilled").map(n=>n.id)}function NC(e){let t=Sn(e),n=Et(e),r=[...t].sort((a,c)=>a.id.localeCompare(c.id)),o=[],s=new Set;for(let a of r){let l=[...Et(e,a.id)].sort((u,d)=>u.id.localeCompare(d.id));for(let u of l)o.push(u.id),s.add(u.id)}let i=n.filter(a=>!s.has(a.id)).sort((a,c)=>a.id.localeCompare(c.id));for(let a of i)o.push(a.id);return o}function ro(e){let t=Et(e),n=t.length;if(n===0)return{completed:0,total:0,percentage:0};let r=t.filter(s=>s.contract_status==="fulfilled").length,o=Math.round(r/n*100);return{completed:r,total:n,percentage:o}}function no(e,t){try{if(!bs.existsSync(e))return t;let r=bs.readFileSync(e,"utf-8").split(`
1406
+ `)}Ut();Be();var Mg=v(require("path"),1);ce();Z();var pt=v(require("path"),1),bs=v(X(),1);Z();ce();sn();async function Es(e){try{let t=await oe(e);if(t.length===0)return null;let n=t[0],r=pt.join(e,"aidlc-docs",n,"manifest.json"),o=W(r);if(!o)return null;let s=await A(e,n);if(!s)return null;let i=Ee(e),a=DC(o),l=Ki(o,"fulfilled").map(p=>p.id),d=Sn(o).filter(p=>p.contract_status!=="fulfilled").map(p=>p.id);return{workflowId:s.workflow_id,featureName:s.feature_name,currentPhase:s.current_phase,currentStage:s.current_stage,manifest:o,checkpoint:s,trustLevel:i.current_level,riskTier:s.risk_tier??0,depthScore:s.depth_score??0,pendingBolts:a,completedBolts:l,pendingUnits:d,executionMode:s.execution_mode??"manual"}}catch(t){return console.error("[WorkflowBridge] Failed to detect active workflow:",t),null}}function DC(e){return Et(e).filter(n=>n.contract_status!=="fulfilled").map(n=>n.id)}function NC(e){let t=Sn(e),n=Et(e),r=[...t].sort((a,c)=>a.id.localeCompare(c.id)),o=[],s=new Set;for(let a of r){let l=[...Et(e,a.id)].sort((u,d)=>u.id.localeCompare(d.id));for(let u of l)o.push(u.id),s.add(u.id)}let i=n.filter(a=>!s.has(a.id)).sort((a,c)=>a.id.localeCompare(c.id));for(let a of i)o.push(a.id);return o}function ro(e){let t=Et(e),n=t.length;if(n===0)return{completed:0,total:0,percentage:0};let r=t.filter(s=>s.contract_status==="fulfilled").length,o=Math.round(r/n*100);return{completed:r,total:n,percentage:o}}function no(e,t){try{if(!bs.existsSync(e))return t;let r=bs.readFileSync(e,"utf-8").split(`
1407
1407
  `);for(let o of r){let s=o.trim();if(s.startsWith("# "))return s.slice(2).trim()}return t}catch{return t}}function vs(e,t){return e.links.find(r=>r.target_id===t&&(r.link_type==="derives"||r.link_type==="implements"))?.source_id??null}function jC(e){let t=e.toLowerCase(),n=["ui","component","frontend","style","css","layout","page","view"];for(let r of n)if(t.includes(r))return"frontend-engineer";return"olympian"}async function jg(e){try{let t=await Es(e);if(!t)return"";let n=ro(t.manifest),r=Et(t.manifest),o=[];for(let a of t.pendingBolts){if(!r.find(f=>f.id===a))continue;let l=vs(t.manifest,a),u=l?pt.join(e,"aidlc-docs",t.workflowId,"construction",l,`${a}.md`):pt.join(e,"aidlc-docs",t.workflowId,"construction",`${a}.md`),d=no(u,a),p=l?` (${l})`:"";o.push(`- ${a} "${d}"${p}`)}let s=[];for(let a of t.completedBolts){if(!r.find(p=>p.id===a))continue;let l=vs(t.manifest,a),u=l?pt.join(e,"aidlc-docs",t.workflowId,"construction",l,`${a}.md`):pt.join(e,"aidlc-docs",t.workflowId,"construction",`${a}.md`),d=no(u,a);s.push(`- ${a} "${d}" done`)}let i=["## Active Workflow",`Workflow: ${t.featureName} (${t.workflowId})`,`Phase: ${t.currentPhase} | Stage: ${t.currentStage}`,`Trust: Level ${t.trustLevel} | Risk: Tier ${t.riskTier} | Depth: ${t.depthScore}`,`Mode: ${t.executionMode}`,"","### Progress",`BOLTs: ${n.completed}/${n.total} (${n.percentage}%)`];return o.length>0&&(i.push("","### Pending BOLTs:"),i.push(...o)),s.length>0&&(i.push("","### Completed BOLTs:"),i.push(...s)),i.join(`
1408
1408
  `)}catch(t){return console.error("[WorkflowBridge] Failed to generate workflow summary:",t),""}}async function Fg(e){try{let t=await Es(e);if(!t)return"";let n=Et(t.manifest),r=NC(t.manifest),o=new Set(t.pendingBolts),s=Sn(t.manifest),i=[],a=1;for(let u of r){if(!o.has(u))continue;let d=n.find(w=>w.id===u);if(!d)continue;let p=vs(t.manifest,u),f=p?pt.join(e,"aidlc-docs",t.workflowId,"construction",p,`${u}.md`):pt.join(e,"aidlc-docs",t.workflowId,"construction",`${u}.md`),m=no(f,u),g=jC(d.path),y="";if(p){let w=s.find(b=>b.id===p),_=pt.join(e,"aidlc-docs",t.workflowId,"construction",p,"spec.md"),h=no(_,p);y=` (${p}: ${h})`}i.push(`${a}. ${u} "${m}"${y}`),i.push(` Agent: ${g} | Files: ${d.path}`),a++}let c=[];for(let u of t.completedBolts){if(!n.find(g=>g.id===u))continue;let p=vs(t.manifest,u),f=p?pt.join(e,"aidlc-docs",t.workflowId,"construction",p,`${u}.md`):pt.join(e,"aidlc-docs",t.workflowId,"construction",`${u}.md`),m=no(f,u);c.push(`- ${u} "${m}" done (fulfilled)`)}let l=["## Workflow Execution Plan",`Workflow: ${t.featureName} (${t.workflowId})`,`Phase: ${t.currentPhase} | Trust: Level ${t.trustLevel} | Risk: Tier ${t.riskTier}`];return i.length>0&&(l.push("","### Pending BOLTs (execute in this order):"),l.push(...i)),c.length>0&&(l.push("","### Completed BOLTs:"),l.push(...c)),l.push("","### Instructions:"),l.push("For each pending BOLT: read its spec file, dispatch to the listed agent, then present Gate 4 review."),l.join(`
1409
- `)}catch(t){return console.error("[WorkflowBridge] Failed to generate bolt execution plan:",t),""}}async function Lg(e){let t=[];try{let n=await oe(e);for(let r of n){let o=await I(e,r);if(!o||o.status==="complete"||o.status==="archived")continue;let s=Mg.join(e,"aidlc-docs",r,"manifest.json"),i=W(s),a={completed:0,total:0};i&&(a=ro(i)),t.push({workflowId:o.workflow_id,featureName:o.feature_name,currentPhase:o.current_phase,currentStage:o.current_stage,progress:a,lastActivity:o.updated_at,status:o.status,interviewProgress:o.interview_progress})}}catch(n){console.error("[ResumeDetector] Error checking aidlc-docs:",n)}return t}sn();function Ug(){Pg(),A({name:"learnedContextInjection",event:"SessionStart",priority:5,handler:e=>{if(!e.directory)return{continue:!0};try{let t=Dg(e.directory),n=Jo(e.directory,5),r=Ng(n),o=new Date,s=new Date(o.getTime()-1440*60*1e3);for(let c of n)try{new Date(c.last_useful)<s&&yf(c.id,e.directory)}catch(l){console.error("[Olympus Learning] Failed to mark discovery as useful:",l)}return{continue:!0,hookSpecificOutput:{hookEventName:"SessionStart",additionalContext:`<olympus-mode>
1409
+ `)}catch(t){return console.error("[WorkflowBridge] Failed to generate bolt execution plan:",t),""}}async function Lg(e){let t=[];try{let n=await oe(e);for(let r of n){let o=await A(e,r);if(!o||o.status==="complete"||o.status==="archived")continue;let s=Mg.join(e,"aidlc-docs",r,"manifest.json"),i=W(s),a={completed:0,total:0};i&&(a=ro(i)),t.push({workflowId:o.workflow_id,featureName:o.feature_name,currentPhase:o.current_phase,currentStage:o.current_stage,progress:a,lastActivity:o.updated_at,status:o.status,interviewProgress:o.interview_progress})}}catch(n){console.error("[ResumeDetector] Error checking aidlc-docs:",n)}return t}sn();function Ug(){Pg(),I({name:"learnedContextInjection",event:"SessionStart",priority:5,handler:e=>{if(!e.directory)return{continue:!0};try{let t=Dg(e.directory),n=Jo(e.directory,5),r=Ng(n),o=new Date,s=new Date(o.getTime()-1440*60*1e3);for(let c of n)try{new Date(c.last_useful)<s&&yf(c.id,e.directory)}catch(l){console.error("[Olympus Learning] Failed to mark discovery as useful:",l)}return{continue:!0,hookSpecificOutput:{hookEventName:"SessionStart",additionalContext:`<olympus-mode>
1410
1410
  [OLYMPUS MODE ACTIVE]
1411
1411
  You are operating as an Olympus orchestrator. MANDATORY behaviors:
1412
1412
  - DELEGATE multi-file changes to subagents (olympian, oracle, frontend-engineer, etc.) via the Task tool
@@ -1418,11 +1418,11 @@ You are operating as an Olympus orchestrator. MANDATORY behaviors:
1418
1418
 
1419
1419
  `+t+(r?`
1420
1420
 
1421
- `+r:"")}}}catch(t){console.error("[Olympus Learning]",t)}return{continue:!0}}}),A({name:"workflowResumeDetection",event:"SessionStart",priority:8,handler:async e=>{try{let t=e.directory||process.cwd(),n=await Lg(t);if(n.length===0)return{continue:!0};let r=[];for(let a of n)if(a.status==="awaiting_mode_selection")r.push(`[Active workflow: '${a.featureName}' \u2014 awaiting execution mode selection.
1421
+ `+r:"")}}}catch(t){console.error("[Olympus Learning]",t)}return{continue:!0}}}),I({name:"workflowResumeDetection",event:"SessionStart",priority:8,handler:async e=>{try{let t=e.directory||process.cwd(),n=await Lg(t);if(n.length===0)return{continue:!0};let r=[];for(let a of n)if(a.status==="awaiting_mode_selection")r.push(`[Active workflow: '${a.featureName}' \u2014 awaiting execution mode selection.
1422
1422
  Choose: /ascent, /olympus, or /ultrawork to begin Construction]`);else if(a.status==="awaiting_dev_review")r.push(`[Active workflow: '${a.featureName}' \u2014 awaiting developer review (Risk Tier 3).
1423
1423
  Review the INTENT technical specification before proceeding to Construction.]`);else{let c=a.progress.total>0?`, ${a.progress.completed}/${a.progress.total} BOLTs complete`:"";r.push(`[Active workflow: '${a.featureName}' \u2014 ${a.currentPhase} phase${c}.
1424
1424
  Resume with /continue or check status with /workflow-status]`)}let o=Ee(t);r.push(`[Trust Level: ${o.current_level}]`);let s=await jg(t);s&&r.push(s);let i=await Fg(t);i&&r.push(i);for(let a of n)a.interviewProgress&&r.push(`[Interview in progress: ${a.interviewProgress.stage} stage, ${a.interviewProgress.questions_asked} questions asked${a.interviewProgress.draft_artifact_path?". Draft artifact exists.":""}]`);if(r.length>0)return{continue:!0,hookSpecificOutput:{hookEventName:"SessionStart",additionalContext:r.join(`
1425
- `)}}}catch(t){console.error("[Olympus Resume Detection] Error:",t)}return{continue:!0}}}),A({name:"sessionStart",event:"SessionStart",priority:10,handler:async e=>{let t=e.sessionId,n=e.directory||process.cwd(),r=[];try{let i=Q(n,t);i.token_budget||(_u(i,n),ee(n,i))}catch(i){console.error("[Olympus Learning] Failed to initialize token budget:",i)}let o=Qt(n);o?.active&&r.push(`<session-restore>
1425
+ `)}}}catch(t){console.error("[Olympus Resume Detection] Error:",t)}return{continue:!0}}}),I({name:"sessionStart",event:"SessionStart",priority:10,handler:async e=>{let t=e.sessionId,n=e.directory||process.cwd(),r=[];try{let i=Q(n,t);i.token_budget||(_u(i,n),ee(n,i))}catch(i){console.error("[Olympus Learning] Failed to initialize token budget:",i)}let o=Qt(n);o?.active&&r.push(`<session-restore>
1426
1426
 
1427
1427
  [ULTRAWORK MODE RESTORED]
1428
1428
 
@@ -1606,7 +1606,7 @@ You are in ${c} mode with pending BOLTs. Continue executing the remaining BOLTs.
1606
1606
  ---
1607
1607
 
1608
1608
  `,mode:c||"none",metadata:{}};if(o){let f=await YC(e,n);if(f?.shouldBlock)return l&&(f.message=f.message+`
1609
- ${l.progressMessage}`),f}return l?{shouldBlock:!1,message:l.progressMessage,mode:"none"}:{shouldBlock:!1,message:"",mode:"none"}}function nh(e){return e.shouldBlock?{continue:!1,stopReason:e.message}:{continue:!0,message:e.message||void 0}}var gr=require("fs"),ac=require("path"),rh=require("os");Be();we();var oh=require("crypto");function JC(){let e=(0,ac.join)((0,rh.homedir)(),".claude","todos");if(!(0,gr.existsSync)(e))return 0;let t=0;try{let n=(0,gr.readdirSync)(e).filter(r=>r.endsWith(".json"));for(let r of n)try{let o=(0,gr.readFileSync)((0,ac.join)(e,r),"utf-8"),s=JSON.parse(o);Array.isArray(s)&&(t+=s.filter(i=>i.status!=="completed"&&i.status!=="cancelled").length)}catch{}}catch{}return t}async function sh(e){let{directory:t,sessionId:n}=e;if(!t)return;let r=Q(t,n),o=JC();if(o>0&&r.pending_completion){let s={id:(0,oh.randomUUID)(),timestamp:new Date().toISOString(),session_id:r.session_id,project_path:t,event_type:"cancellation",original_task:r.pending_completion.task_description,agent_used:r.pending_completion.agent_used,user_message:`[Stopped with ${o} incomplete todos]`,feedback_category:"rejection",confidence:.7};Xt(s)}r.pending_completion=null,r.todo_snapshot={total:0,completed:0,pending:o},ee(t,r)}function ih(){A({name:"persistentMode",event:"Stop",priority:10,handler:async e=>{let t=e.sessionId,n=e.directory||process.cwd(),r=await th(t,n),o=nh(r);return{continue:o.continue,message:o.message,stopReason:o.stopReason}}}),A({name:"learningCancellationCapture",event:"Stop",priority:100,handler:async e=>e.directory?(Promise.resolve().then(async()=>{try{await sh({directory:e.directory,sessionId:e.sessionId})}catch(t){console.error("[Olympus Learning]",t)}}),{continue:!0}):{continue:!0}})}var yc=require("fs"),wc=require("os"),ao=require("path");var ft=require("fs"),Ye=require("path");var cc=require("path"),ah=require("os"),zC=(0,cc.join)((0,ah.homedir)(),".olympus"),Cs=(0,cc.join)(zC,"rules-injector"),ch=[".git","pyproject.toml","package.json","Cargo.toml","go.mod",".venv"],lh=[[".github","instructions"],[".cursor","rules"],[".claude","rules"]],uh=[".github/copilot-instructions.md"],dh=/\.instructions\.md$/,ph=".claude/rules",fh=[".md",".mdc"],lc=["read","write","edit","multiedit"];function QC(e){return e.includes(".github/instructions")||e.endsWith(".github/instructions")}function XC(e,t){return QC(t)?dh.test(e):fh.some(n=>e.endsWith(n))}function pc(e){let t;try{t=(0,ft.statSync)(e).isDirectory()?e:(0,Ye.dirname)(e)}catch{t=(0,Ye.dirname)(e)}for(;;){for(let r of ch){let o=(0,Ye.join)(t,r);if((0,ft.existsSync)(o))return t}let n=(0,Ye.dirname)(t);if(n===t)return null;t=n}}function dc(e,t){if((0,ft.existsSync)(e))try{let n=(0,ft.readdirSync)(e,{withFileTypes:!0});for(let r of n){let o=(0,Ye.join)(e,r.name);r.isDirectory()?dc(o,t):r.isFile()&&XC(r.name,e)&&t.push(o)}}catch{}}function uc(e){try{return(0,ft.realpathSync)(e)}catch{return e}}function fc(e,t,n){let r=[],o=new Set,s=(0,Ye.dirname)(n),i=0;for(;;){for(let[u,d]of lh){let p=(0,Ye.join)(s,u,d),f=[];dc(p,f);for(let m of f){let g=uc(m);o.has(g)||(o.add(g),r.push({path:m,realPath:g,isGlobal:!1,distance:i}))}}if(e&&s===e)break;let l=(0,Ye.dirname)(s);if(l===s)break;s=l,i++}if(e)for(let l of uh){let u=(0,Ye.join)(e,l);if((0,ft.existsSync)(u))try{if((0,ft.statSync)(u).isFile()){let p=uc(u);o.has(p)||(o.add(p),r.push({path:u,realPath:p,isGlobal:!1,distance:0,isSingleFile:!0}))}}catch{}}let a=(0,Ye.join)(t,ph),c=[];dc(a,c);for(let l of c){let u=uc(l);o.has(u)||(o.add(u),r.push({path:l,realPath:u,isGlobal:!0,distance:9999}))}return r.sort((l,u)=>l.isGlobal!==u.isGlobal?l.isGlobal?1:-1:l.distance-u.distance),r}var mh=require("crypto"),gh=require("path");function ZC(e,t){let n=e.replace(/\./g,"\\.").replace(/\*\*/g,"<<<GLOBSTAR>>>").replace(/\*/g,"[^/]*").replace(/<<<GLOBSTAR>>>/g,".*").replace(/\?/g,".");return new RegExp(`^${n}$`).test(t)}function mc(e,t,n){if(e.alwaysApply===!0)return{applies:!0,reason:"alwaysApply"};let r=e.globs;if(!r)return{applies:!1};let o=Array.isArray(r)?r:[r];if(o.length===0)return{applies:!1};let i=(n?(0,gh.relative)(n,t):t).replace(/\\/g,"/");for(let a of o)if(ZC(a,i))return{applies:!0,reason:`glob: ${a}`};return{applies:!1}}function hh(e,t){return t.has(e)}function yh(e){return(0,mh.createHash)("sha256").update(e).digest("hex").slice(0,16)}function wh(e,t){return t.has(e)}function gc(e){let t=/^---\r?\n([\s\S]*?)\r?\n---\r?\n?([\s\S]*)$/,n=e.match(t);if(!n)return{metadata:{},body:e};let r=n[1],o=n[2];try{return{metadata:eR(r),body:o}}catch{return{metadata:{},body:e}}}function eR(e){let t=e.split(`
1609
+ ${l.progressMessage}`),f}return l?{shouldBlock:!1,message:l.progressMessage,mode:"none"}:{shouldBlock:!1,message:"",mode:"none"}}function nh(e){return e.shouldBlock?{continue:!1,stopReason:e.message}:{continue:!0,message:e.message||void 0}}var gr=require("fs"),ac=require("path"),rh=require("os");Be();we();var oh=require("crypto");function JC(){let e=(0,ac.join)((0,rh.homedir)(),".claude","todos");if(!(0,gr.existsSync)(e))return 0;let t=0;try{let n=(0,gr.readdirSync)(e).filter(r=>r.endsWith(".json"));for(let r of n)try{let o=(0,gr.readFileSync)((0,ac.join)(e,r),"utf-8"),s=JSON.parse(o);Array.isArray(s)&&(t+=s.filter(i=>i.status!=="completed"&&i.status!=="cancelled").length)}catch{}}catch{}return t}async function sh(e){let{directory:t,sessionId:n}=e;if(!t)return;let r=Q(t,n),o=JC();if(o>0&&r.pending_completion){let s={id:(0,oh.randomUUID)(),timestamp:new Date().toISOString(),session_id:r.session_id,project_path:t,event_type:"cancellation",original_task:r.pending_completion.task_description,agent_used:r.pending_completion.agent_used,user_message:`[Stopped with ${o} incomplete todos]`,feedback_category:"rejection",confidence:.7};Xt(s)}r.pending_completion=null,r.todo_snapshot={total:0,completed:0,pending:o},ee(t,r)}function ih(){I({name:"persistentMode",event:"Stop",priority:10,handler:async e=>{let t=e.sessionId,n=e.directory||process.cwd(),r=await th(t,n),o=nh(r);return{continue:o.continue,message:o.message,stopReason:o.stopReason}}}),I({name:"learningCancellationCapture",event:"Stop",priority:100,handler:async e=>e.directory?(Promise.resolve().then(async()=>{try{await sh({directory:e.directory,sessionId:e.sessionId})}catch(t){console.error("[Olympus Learning]",t)}}),{continue:!0}):{continue:!0}})}var yc=require("fs"),wc=require("os"),ao=require("path");var ft=require("fs"),Ye=require("path");var cc=require("path"),ah=require("os"),zC=(0,cc.join)((0,ah.homedir)(),".olympus"),Cs=(0,cc.join)(zC,"rules-injector"),ch=[".git","pyproject.toml","package.json","Cargo.toml","go.mod",".venv"],lh=[[".github","instructions"],[".cursor","rules"],[".claude","rules"]],uh=[".github/copilot-instructions.md"],dh=/\.instructions\.md$/,ph=".claude/rules",fh=[".md",".mdc"],lc=["read","write","edit","multiedit"];function QC(e){return e.includes(".github/instructions")||e.endsWith(".github/instructions")}function XC(e,t){return QC(t)?dh.test(e):fh.some(n=>e.endsWith(n))}function pc(e){let t;try{t=(0,ft.statSync)(e).isDirectory()?e:(0,Ye.dirname)(e)}catch{t=(0,Ye.dirname)(e)}for(;;){for(let r of ch){let o=(0,Ye.join)(t,r);if((0,ft.existsSync)(o))return t}let n=(0,Ye.dirname)(t);if(n===t)return null;t=n}}function dc(e,t){if((0,ft.existsSync)(e))try{let n=(0,ft.readdirSync)(e,{withFileTypes:!0});for(let r of n){let o=(0,Ye.join)(e,r.name);r.isDirectory()?dc(o,t):r.isFile()&&XC(r.name,e)&&t.push(o)}}catch{}}function uc(e){try{return(0,ft.realpathSync)(e)}catch{return e}}function fc(e,t,n){let r=[],o=new Set,s=(0,Ye.dirname)(n),i=0;for(;;){for(let[u,d]of lh){let p=(0,Ye.join)(s,u,d),f=[];dc(p,f);for(let m of f){let g=uc(m);o.has(g)||(o.add(g),r.push({path:m,realPath:g,isGlobal:!1,distance:i}))}}if(e&&s===e)break;let l=(0,Ye.dirname)(s);if(l===s)break;s=l,i++}if(e)for(let l of uh){let u=(0,Ye.join)(e,l);if((0,ft.existsSync)(u))try{if((0,ft.statSync)(u).isFile()){let p=uc(u);o.has(p)||(o.add(p),r.push({path:u,realPath:p,isGlobal:!1,distance:0,isSingleFile:!0}))}}catch{}}let a=(0,Ye.join)(t,ph),c=[];dc(a,c);for(let l of c){let u=uc(l);o.has(u)||(o.add(u),r.push({path:l,realPath:u,isGlobal:!0,distance:9999}))}return r.sort((l,u)=>l.isGlobal!==u.isGlobal?l.isGlobal?1:-1:l.distance-u.distance),r}var mh=require("crypto"),gh=require("path");function ZC(e,t){let n=e.replace(/\./g,"\\.").replace(/\*\*/g,"<<<GLOBSTAR>>>").replace(/\*/g,"[^/]*").replace(/<<<GLOBSTAR>>>/g,".*").replace(/\?/g,".");return new RegExp(`^${n}$`).test(t)}function mc(e,t,n){if(e.alwaysApply===!0)return{applies:!0,reason:"alwaysApply"};let r=e.globs;if(!r)return{applies:!1};let o=Array.isArray(r)?r:[r];if(o.length===0)return{applies:!1};let i=(n?(0,gh.relative)(n,t):t).replace(/\\/g,"/");for(let a of o)if(ZC(a,i))return{applies:!0,reason:`glob: ${a}`};return{applies:!1}}function hh(e,t){return t.has(e)}function yh(e){return(0,mh.createHash)("sha256").update(e).digest("hex").slice(0,16)}function wh(e,t){return t.has(e)}function gc(e){let t=/^---\r?\n([\s\S]*?)\r?\n---\r?\n?([\s\S]*)$/,n=e.match(t);if(!n)return{metadata:{},body:e};let r=n[1],o=n[2];try{return{metadata:eR(r),body:o}}catch{return{metadata:{},body:e}}}function eR(e){let t=e.split(`
1610
1610
  `),n={},r=0;for(;r<t.length;){let o=t[r],s=o.indexOf(":");if(s===-1){r++;continue}let i=o.slice(0,s).trim(),a=o.slice(s+1).trim();if(i==="description")n.description=io(a);else if(i==="alwaysApply")n.alwaysApply=a==="true";else if(i==="globs"||i==="paths"||i==="applyTo"){let{value:c,consumed:l}=tR(a,t,r);n.globs=rR(n.globs,c),r+=l;continue}r++}return n}function io(e){return e?e.startsWith('"')&&e.endsWith('"')||e.startsWith("'")&&e.endsWith("'")?e.slice(1,-1):e:""}function tR(e,t,n){if(e.startsWith("["))return{value:nR(e),consumed:1};if(!e||e===""){let o=[],s=1;for(let i=n+1;i<t.length;i++){let a=t[i],c=a.match(/^\s+-\s*(.*)$/);if(c){let l=io(c[1].trim());l&&o.push(l),s++}else if(a.trim()==="")s++;else break}if(o.length>0)return{value:o,consumed:s}}let r=io(e);return r.includes(",")?{value:r.split(",").map(s=>s.trim()).filter(s=>s.length>0),consumed:1}:{value:r,consumed:1}}function nR(e){let t=e.slice(1,e.lastIndexOf("]")).trim();if(!t)return[];let n=[],r="",o=!1,s="";for(let a=0;a<t.length;a++){let c=t[a];if(!o&&(c==='"'||c==="'"))o=!0,s=c;else if(o&&c===s)o=!1,s="";else if(!o&&c===","){let l=r.trim();l&&n.push(io(l)),r=""}else r+=c}let i=r.trim();return i&&n.push(io(i)),n}function rR(e,t){if(!e)return t;let n=Array.isArray(e)?e:[e],r=Array.isArray(t)?t:[t];return[...n,...r]}var nt=require("fs"),_h=require("path");function hc(e){return(0,_h.join)(Cs,`${e}.json`)}function kh(e){let t=hc(e);if(!(0,nt.existsSync)(t))return{contentHashes:new Set,realPaths:new Set};try{let n=(0,nt.readFileSync)(t,"utf-8"),r=JSON.parse(n);return{contentHashes:new Set(r.injectedHashes),realPaths:new Set(r.injectedRealPaths??[])}}catch{return{contentHashes:new Set,realPaths:new Set}}}function Sh(e,t){(0,nt.existsSync)(Cs)||(0,nt.mkdirSync)(Cs,{recursive:!0});let n={sessionId:e,injectedHashes:[...t.contentHashes],injectedRealPaths:[...t.realPaths],updatedAt:Date.now()};(0,nt.writeFileSync)(hc(e),JSON.stringify(n,null,2))}function vh(e){let t=hc(e);(0,nt.existsSync)(t)&&(0,nt.unlinkSync)(t)}function bh(e){let t=new Map;function n(i){return t.has(i)||t.set(i,kh(i)),t.get(i)}function r(i){return i?i.startsWith("/")?i:(0,ao.resolve)(e,i):null}function o(i,a){let c=r(i);if(!c)return[];let l=pc(c),u=n(a),d=(0,wc.homedir)(),p=fc(l,d,c),f=[];for(let m of p)if(!hh(m.realPath,u.realPaths))try{let g=(0,yc.readFileSync)(m.path,"utf-8"),{metadata:y,body:w}=gc(g),_;if(m.isSingleFile)_="copilot-instructions (always apply)";else{let S=mc(y,c,l);if(!S.applies)continue;_=S.reason??"matched"}let h=yh(w);if(wh(h,u.contentHashes))continue;let b=l?(0,ao.relative)(l,m.path):m.path;f.push({relativePath:b,matchReason:_,content:w,distance:m.distance}),u.realPaths.add(m.realPath),u.contentHashes.add(h)}catch{}return f.length>0&&(f.sort((m,g)=>m.distance-g.distance),Sh(a,u)),f}function s(i){if(i.length===0)return"";let a="";for(let c of i)a+=`
1611
1611
 
1612
1612
  [Rule: ${c.relativePath}]
@@ -1765,7 +1765,7 @@ ${wR(d.plan_name,p,s)}
1765
1765
  </system-reminder>`}}return{continue:!0,modifiedOutput:t+`
1766
1766
  <system-reminder>
1767
1767
  ${Kh(s)}
1768
- </system-reminder>`}}return{continue:!0}}function vR(e){let t=Is(e);if(!t)return{shouldContinue:!1};let n=Os(t.active_plan);if(n.isComplete)return{shouldContinue:!1};let r=n.total-n.completed;return{shouldContinue:!0,message:_R(t.plan_name,r,n.total)}}function $s(e){return{name:Nh,preTool:(t,n)=>kR({toolName:t,toolInput:n,directory:e}),postTool:(t,n,r)=>SR({toolName:t,toolInput:n,directory:e},r),checkContinuation:()=>vR(e),getSingleTaskDirective:()=>Wh}}function Jh(e){if(!e||typeof e!="object")return null;let t=e;return t.file_path||t.filePath||t.path||t.file}function zh(){A({name:"rulesInjector",event:"PreToolUse",priority:10,matcher:/^(read|edit|write|glob|grep)$/i,handler:e=>{let t=bh(e.directory||process.cwd()),n=Jh(e.toolInput);if(!n)return{continue:!0};let r=t.processToolExecution(e.toolName,n,e.sessionId||"default");return{continue:!0,hookSpecificOutput:r?{hookEventName:"PreToolUse",additionalContext:r}:void 0}}}),A({name:"directoryReadmeInjector",event:"PreToolUse",priority:20,matcher:/^(read|edit|write|glob|grep|bash)$/i,handler:e=>{let t=Ih(e.directory||process.cwd()),n=Jh(e.toolInput);if(!n)return{continue:!0};let r=t.processToolExecution(e.toolName,n,e.sessionId||"default");return{continue:!0,hookSpecificOutput:r?{hookEventName:"PreToolUse",additionalContext:r}:void 0}}}),A({name:"nonInteractiveEnv",event:"PreToolUse",priority:30,matcher:/^bash$/i,handler:async e=>{let t=e.toolInput;if(!t?.command)return{continue:!0};try{if(!bc.beforeCommand)return{continue:!0};let n=await bc.beforeCommand(t.command);return{continue:!0,hookSpecificOutput:n.warning?{hookEventName:"PreToolUse",additionalContext:n.warning}:void 0,modifiedInput:n.command!==t.command?{...t,command:n.command}:void 0}}catch(n){return console.error("[nonInteractiveEnv] Error:",n),{continue:!0}}}}),A({name:"olympusOrchestratorPre",event:"PreToolUse",priority:40,matcher:/^(write|edit|bash|task)$/i,handler:e=>$s(e.directory||process.cwd()).preTool(e.toolName,e.toolInput)})}var bR=["oldString and newString must be different","oldString not found","oldString found multiple times","old_string not found","old_string and new_string must be different"],ER=`
1768
+ </system-reminder>`}}return{continue:!0}}function vR(e){let t=Is(e);if(!t)return{shouldContinue:!1};let n=Os(t.active_plan);if(n.isComplete)return{shouldContinue:!1};let r=n.total-n.completed;return{shouldContinue:!0,message:_R(t.plan_name,r,n.total)}}function $s(e){return{name:Nh,preTool:(t,n)=>kR({toolName:t,toolInput:n,directory:e}),postTool:(t,n,r)=>SR({toolName:t,toolInput:n,directory:e},r),checkContinuation:()=>vR(e),getSingleTaskDirective:()=>Wh}}function Jh(e){if(!e||typeof e!="object")return null;let t=e;return t.file_path||t.filePath||t.path||t.file}function zh(){I({name:"rulesInjector",event:"PreToolUse",priority:10,matcher:/^(read|edit|write|glob|grep)$/i,handler:e=>{let t=bh(e.directory||process.cwd()),n=Jh(e.toolInput);if(!n)return{continue:!0};let r=t.processToolExecution(e.toolName,n,e.sessionId||"default");return{continue:!0,hookSpecificOutput:r?{hookEventName:"PreToolUse",additionalContext:r}:void 0}}}),I({name:"directoryReadmeInjector",event:"PreToolUse",priority:20,matcher:/^(read|edit|write|glob|grep|bash)$/i,handler:e=>{let t=Ih(e.directory||process.cwd()),n=Jh(e.toolInput);if(!n)return{continue:!0};let r=t.processToolExecution(e.toolName,n,e.sessionId||"default");return{continue:!0,hookSpecificOutput:r?{hookEventName:"PreToolUse",additionalContext:r}:void 0}}}),I({name:"nonInteractiveEnv",event:"PreToolUse",priority:30,matcher:/^bash$/i,handler:async e=>{let t=e.toolInput;if(!t?.command)return{continue:!0};try{if(!bc.beforeCommand)return{continue:!0};let n=await bc.beforeCommand(t.command);return{continue:!0,hookSpecificOutput:n.warning?{hookEventName:"PreToolUse",additionalContext:n.warning}:void 0,modifiedInput:n.command!==t.command?{...t,command:n.command}:void 0}}catch(n){return console.error("[nonInteractiveEnv] Error:",n),{continue:!0}}}}),I({name:"olympusOrchestratorPre",event:"PreToolUse",priority:40,matcher:/^(write|edit|bash|task)$/i,handler:e=>$s(e.directory||process.cwd()).preTool(e.toolName,e.toolInput)})}var bR=["oldString and newString must be different","oldString not found","oldString found multiple times","old_string not found","old_string and new_string must be different"],ER=`
1769
1769
  [EDIT ERROR - IMMEDIATE ACTION REQUIRED]
1770
1770
 
1771
1771
  You made an Edit mistake. STOP and do this NOW:
@@ -1993,8 +1993,8 @@ ${e>=5?"**CRITICAL**: Too many direct operations. Your next action MUST be deleg
1993
1993
 
1994
1994
  ---
1995
1995
 
1996
- `}function xy(){let e=new Map,t=new Map;function n(c){if(!e.has(c)){let u=Yc(c)??{sessionID:c,agentUsed:!1,reminderCount:0,updatedAt:Date.now()};e.set(c,u)}return e.get(c)}function r(c){let l=n(c);l.agentUsed=!0,l.updatedAt=Date.now(),Gs(l)}function o(c){e.delete(c),Kc(c),t.delete(c)}function s(c,l,u){let d=t.get(c)||{consecutiveCount:0,lastToolName:"",lastFilePath:"",sessionId:c};return l.toLowerCase()==="task"?(d.consecutiveCount=0,t.set(c,d),0):(["edit","write","multiedit"].includes(l.toLowerCase())&&(d.consecutiveCount++,d.lastToolName=l,d.lastFilePath=u,t.set(c,d)),d.consecutiveCount)}return{"tool.execute.after":async(c,l)=>{let{tool:u,sessionID:d}=c,p=u.toLowerCase();if(Hc.has(p)){r(d),s(d,p,"");return}let f=c.properties||{},m=sx(f),g=s(d,p,m||""),y=ox();if(y.active){let _=ix(g,y.mode);if(_){l.output=_+l.output;return}}if(!Gc.has(p))return;let w=n(d);w.agentUsed||(l.output+=qc,w.reminderCount++,w.updatedAt=Date.now(),Gs(w))},event:async({event:c})=>{let l=c.properties;if(c.type==="session.deleted"){let u=l?.info;u?.id&&o(u.id)}if(c.type==="session.compacted"){let u=l?.sessionID??l?.info?.id;u&&o(u)}}}}function Py(){let e=process.cwd(),t=Qh();A({name:"editErrorRecovery",event:"PostToolUse",matcher:/^edit$/i,priority:10,handler:async c=>{if(!c.toolName||!c.toolOutput)return{continue:!0};let l=t.afterToolExecute({tool:c.toolName,sessionId:c.sessionId||"",callId:""},{title:"",output:String(c.toolOutput),metadata:void 0});return l.output!==String(c.toolOutput)?{continue:!0,hookSpecificOutput:{hookEventName:"PostToolUse",additionalContext:l.output.substring(String(c.toolOutput).length)}}:{continue:!0}}});let n=ny();A({name:"commentChecker",event:"PostToolUse",matcher:/^(write|edit|multiedit)$/i,priority:20,handler:async c=>{if(!c.toolName)return{continue:!0};let l=n.postToolUse({tool_name:c.toolName,session_id:c.sessionId||"",tool_input:c.toolInput||{},tool_response:c.toolOutput?String(c.toolOutput):void 0});return l?{continue:!0,message:l}:{continue:!0}}});let r=fy();A({name:"contextWindowLimitRecovery",event:"PostToolUse",priority:30,handler:async c=>{if(!c.toolName)return{continue:!0};let l=r.postToolUse({tool_name:c.toolName,session_id:c.sessionId||"",tool_input:c.toolInput||{},tool_response:c.toolOutput?String(c.toolOutput):void 0});return l?{continue:!0,message:l}:{continue:!0}}});let o=gy();A({name:"readToolLimitRecovery",event:"PostToolUse",matcher:/^read$/i,priority:35,handler:async c=>{if(!c.toolName||c.toolName.toLowerCase()!=="read")return{continue:!0};let l=o.postToolUse({tool_name:c.toolName,session_id:c.sessionId||"",tool_input:c.toolInput||{},tool_response:c.toolOutput?String(c.toolOutput):void 0});return l?{continue:!0,message:l}:{continue:!0}}});let s=Ty();A({name:"preemptiveCompaction",event:"PostToolUse",matcher:/^(read|grep|glob|bash|webfetch)$/i,priority:40,handler:async c=>{if(!c.toolName)return{continue:!0};let l=s.postToolUse({tool_name:c.toolName,session_id:c.sessionId||"",tool_input:c.toolInput||{},tool_response:c.toolOutput?String(c.toolOutput):void 0});return l?{continue:!0,message:l}:{continue:!0}}});let i=xy();A({name:"agentUsageReminder",event:"PostToolUse",matcher:/^(read|grep|glob|edit|write)$/i,priority:50,handler:async c=>{if(!c.toolName)return{continue:!0};let l={title:"",output:c.toolOutput?String(c.toolOutput):"",metadata:void 0};await i["tool.execute.after"]({tool:c.toolName,sessionID:c.sessionId||"",callID:""},l);let u=c.toolOutput?String(c.toolOutput):"";return l.output!==u?{continue:!0,message:l.output.substring(u.length)}:{continue:!0}}});let a=$s(e);A({name:"olympusOrchestratorPost",event:"PostToolUse",matcher:/^(write|edit|bash|task)$/i,priority:60,handler:async c=>{if(!c.toolName)return{continue:!0};let l=a.postTool(c.toolName,c.toolInput||{},c.toolOutput?String(c.toolOutput):"");return l.continue?l.modifiedOutput?{continue:!0,hookSpecificOutput:{hookEventName:"PostToolUse",additionalContext:l.modifiedOutput}}:l.message?{continue:!0,hookSpecificOutput:{hookEventName:"PostToolUse",additionalContext:l.message}}:{continue:!0}:{continue:!1,stopReason:l.message}}})}var Wy=require("node:fs");var J=require("node:fs"),We=require("node:path");var wr=require("node:path"),Hs=require("node:os");function ax(){return process.env.XDG_DATA_HOME??(0,wr.join)((0,Hs.homedir)(),".local","share")}function cx(){return(0,wr.join)(ax(),"claude-code","storage")}var Ay=cx(),fo=(0,wr.join)(Ay,"message"),_r=(0,wr.join)(Ay,"part"),pn=new Set(["thinking","redacted_thinking","reasoning"]),Iy=new Set(["step-start","step-finish"]);var st="[user interrupted]",qs={tool_result_missing:{title:"Tool Crash Recovery",message:"Injecting cancelled tool results..."},thinking_block_order:{title:"Thinking Block Recovery",message:"Fixing message structure..."},thinking_disabled_violation:{title:"Thinking Strip Recovery",message:"Stripping thinking blocks..."},empty_content:{title:"Empty Content Recovery",message:"Adding placeholder content..."}};var Oy=process.env.SESSION_RECOVERY_DEBUG==="1",$y=(0,wr.join)((0,Hs.tmpdir)(),"session-recovery-debug.log");function lx(){let e=Date.now().toString(16),t=Math.random().toString(36).substring(2,10);return`prt_${e}${t}`}function ux(e){if(!(0,J.existsSync)(fo))return"";let t=(0,We.join)(fo,e);if((0,J.existsSync)(t))return t;for(let n of(0,J.readdirSync)(fo)){let r=(0,We.join)(fo,n,e);if((0,J.existsSync)(r))return r}return""}function Kt(e){let t=ux(e);if(!t||!(0,J.existsSync)(t))return[];let n=[];for(let r of(0,J.readdirSync)(t))if(r.endsWith(".json"))try{let o=(0,J.readFileSync)((0,We.join)(t,r),"utf-8");n.push(JSON.parse(o))}catch{continue}return n.sort((r,o)=>{let s=r.time?.created??0,i=o.time?.created??0;return s!==i?s-i:r.id.localeCompare(o.id)})}function It(e){let t=(0,We.join)(_r,e);if(!(0,J.existsSync)(t))return[];let n=[];for(let r of(0,J.readdirSync)(t))if(r.endsWith(".json"))try{let o=(0,J.readFileSync)((0,We.join)(t,r),"utf-8");n.push(JSON.parse(o))}catch{continue}return n}function Dy(e){return pn.has(e.type)||Iy.has(e.type)?!1:e.type==="text"?!!e.text?.trim():e.type==="tool"||e.type==="tool_use"||e.type==="tool_result"}function Ny(e){return It(e).some(Dy)}function mo(e,t,n){let r=(0,We.join)(_r,t);(0,J.existsSync)(r)||(0,J.mkdirSync)(r,{recursive:!0});let o=lx(),s={id:o,sessionID:e,messageID:t,type:"text",text:n,synthetic:!0};try{return(0,J.writeFileSync)((0,We.join)(r,`${o}.json`),JSON.stringify(s,null,2)),!0}catch{return!1}}function Jc(e){let t=Kt(e),n=[];for(let r of t)Ny(r.id)||n.push(r.id);return n}function jy(e,t){let n=Kt(e),r=[t,t-1,t+1,t-2,t+2,t-3,t-4,t-5];for(let o of r){if(o<0||o>=n.length)continue;let s=n[o];if(!Ny(s.id))return s.id}return null}function zc(e){let t=Kt(e),n=[];for(let r of t){if(r.role!=="assistant")continue;It(r.id).some(i=>pn.has(i.type))&&n.push(r.id)}return n}function Fy(e){let t=Kt(e),n=[];for(let r of t){if(r.role!=="assistant")continue;let o=It(r.id);if(o.length===0)continue;let s=o.some(a=>pn.has(a.type)),i=o.some(Dy);s&&!i&&n.push(r.id)}return n}function Qc(e){let t=Kt(e),n=[];for(let r of t){if(r.role!=="assistant")continue;let o=It(r.id);if(o.length===0)continue;let i=[...o].sort((c,l)=>c.id.localeCompare(l.id))[0];pn.has(i.type)||n.push(r.id)}return n}function dx(e,t){let n=Kt(e),r=n.findIndex(o=>o.id===t);if(r===-1)return"";for(let o=r-1;o>=0;o--){let s=n[o];if(s.role!=="assistant")continue;let i=It(s.id);for(let a of i)if(pn.has(a.type)){let c=a.thinking,l=a.text,u=c||l;if(u&&u.trim().length>0)return u}}return""}function Xc(e,t){let n=(0,We.join)(_r,t);(0,J.existsSync)(n)||(0,J.mkdirSync)(n,{recursive:!0});let r=dx(e,t),o="prt_0000000000_thinking",s={id:o,sessionID:e,messageID:t,type:"thinking",thinking:r||"[Continuing from previous reasoning]",synthetic:!0};try{return(0,J.writeFileSync)((0,We.join)(n,`${o}.json`),JSON.stringify(s,null,2)),!0}catch{return!1}}function My(e){let t=(0,We.join)(_r,e);if(!(0,J.existsSync)(t))return!1;let n=!1;for(let r of(0,J.readdirSync)(t))if(r.endsWith(".json"))try{let o=(0,We.join)(t,r),s=(0,J.readFileSync)(o,"utf-8"),i=JSON.parse(s);pn.has(i.type)&&((0,J.unlinkSync)(o),n=!0)}catch{continue}return n}function go(e,t=st){let n=(0,We.join)(_r,e);if(!(0,J.existsSync)(n))return!1;let r=!1;for(let o of(0,J.readdirSync)(n))if(o.endsWith(".json"))try{let s=(0,We.join)(n,o),i=(0,J.readFileSync)(s,"utf-8"),a=JSON.parse(i);if(a.type==="text"){let c=a;c.text?.trim()||(c.text=t,c.synthetic=!0,(0,J.writeFileSync)(s,JSON.stringify(c,null,2)),r=!0)}}catch{continue}return r}function Ly(e){let t=Kt(e),n=[];for(let r of t)It(r.id).some(i=>i.type!=="text"?!1:!i.text?.trim())&&n.push(r.id);return n}function Uy(e,t){let n=Kt(e);if(t<0||t>=n.length)return null;let r=n[t];if(r.role!=="assistant")return null;let o=It(r.id);if(o.length===0)return null;let i=[...o].sort((c,l)=>c.id.localeCompare(l.id))[0];return pn.has(i.type)?null:r.id}function Se(...e){if(Oy){let t=`[${new Date().toISOString()}] [session-recovery] ${e.map(n=>typeof n=="object"?JSON.stringify(n,null,2):String(n)).join(" ")}
1997
- `;(0,Wy.appendFileSync)($y,t)}}function By(e){if(!e)return"";if(typeof e=="string")return e.toLowerCase();let t=e,n=[t.data,t.error,t,t.data?.error];for(let r of n)if(r&&typeof r=="object"){let o=r.message;if(typeof o=="string"&&o.length>0)return o.toLowerCase()}try{return JSON.stringify(e).toLowerCase()}catch{return""}}function Gy(e){let n=By(e).match(/messages\.(\d+)/);return n?parseInt(n[1],10):null}function Hy(e){let t=By(e);return t.includes("tool_use")&&t.includes("tool_result")?"tool_result_missing":t.includes("thinking")&&(t.includes("first block")||t.includes("must start with")||t.includes("preceeding")||t.includes("final block")||t.includes("cannot be thinking")||t.includes("expected")&&t.includes("found"))?"thinking_block_order":t.includes("thinking is disabled")&&t.includes("cannot contain")?"thinking_disabled_violation":t.includes("empty")&&(t.includes("content")||t.includes("message"))?"empty_content":null}function px(e){return Hy(e)!==null}function fx(e){return e.filter(t=>t.type==="tool_use"&&!!t.id).map(t=>t.id)}async function mx(e,t){Se("recoverToolResultMissing",{sessionID:e,msgId:t.info?.id});let n=t.parts||[];n.length===0&&t.info?.id&&(n=It(t.info.id).map(s=>({type:s.type==="tool"?"tool_use":s.type,id:"callID"in s?s.callID:s.id,name:"tool"in s?s.tool:void 0,input:"state"in s?s.state?.input:void 0})));let r=fx(n);return r.length===0?(Se("No tool_use IDs found"),!1):(Se("Found tool_use IDs to inject results for",r),!0)}async function gx(e,t,n){Se("recoverThinkingBlockOrder",{sessionID:e});let r=Gy(n);if(r!==null){let i=Uy(e,r);if(i)return Se("Found target message by index",{targetIndex:r,targetMessageID:i}),Xc(e,i)}let o=Qc(e);if(o.length===0)return Se("No orphan thinking messages found"),!1;Se("Found orphan thinking messages",o);let s=!1;for(let i of o)Xc(e,i)&&(s=!0);return s}async function hx(e,t){Se("recoverThinkingDisabledViolation",{sessionID:e});let n=zc(e);if(n.length===0)return Se("No messages with thinking blocks found"),!1;Se("Found messages with thinking blocks",n);let r=!1;for(let o of n)My(o)&&(r=!0);return r}async function yx(e,t,n){Se("recoverEmptyContentMessage",{sessionID:e});let r=Gy(n),o=t.info?.id,s=!1,i=Ly(e);for(let l of i)go(l,st)&&(s=!0);let a=Fy(e);for(let l of a)mo(e,l,st)&&(s=!0);if(r!==null){let l=jy(e,r);if(l&&(go(l,st)||mo(e,l,st)))return!0}if(o&&(go(o,st)||mo(e,o,st)))return!0;let c=Jc(e);for(let l of c)go(l,st)&&(s=!0),mo(e,l,st)&&(s=!0);return s}async function wx(e,t,n,r){Se("handleSessionRecovery",{sessionID:e,error:t});let o=Hy(t);if(!o)return Se("Not a recoverable error"),{attempted:!1,success:!1};Se("Detected recoverable error type",o);try{let s=!1,i=n||{info:{},parts:[]};switch(o){case"tool_result_missing":s=await mx(e,i);break;case"thinking_block_order":s=await gx(e,i,t);break;case"thinking_disabled_violation":s=await hx(e,i);break;case"empty_content":s=await yx(e,i,t);break}Se("Recovery result",{errorType:o,success:s});let a=r?.customMessages?.[o]||qs[o]?.message||`Session recovery attempted for ${o}`;return{attempted:!0,success:s,message:s?a:void 0,errorType:o}}catch(s){return Se("Recovery failed with error",s),{attempted:!0,success:!1,errorType:o}}}function qy(e){return Se("createSessionRecoveryHook",{config:e}),{onError:async t=>wx(t.session_id,t.error,t.message,e),isRecoverable:t=>px(t),getRecoveryMessage:t=>{if(t)return e?.customMessages?.[t]||qs[t]?.message}}}function Vy(){let e=qy();A({name:"sessionRecovery",event:"PostToolUseFailure",priority:10,handler:async t=>{let n=t.error||t.toolOutput;if(!n)return{continue:!0};if(!e.isRecoverable(n))return{continue:!0};let r=await e.onError({session_id:t.sessionId||"default",error:n,message:void 0});return r.attempted&&r.success?{continue:!0,hookSpecificOutput:{hookEventName:"PostToolUseFailure",additionalContext:r.message||`[session-recovery] Recovered from ${r.errorType} error. Please retry.`}}:r.attempted&&!r.success?{continue:!0,hookSpecificOutput:{hookEventName:"PostToolUseFailure",additionalContext:`[session-recovery] Attempted recovery for ${r.errorType} but could not fix automatically. You may need to restart the session.`}}:{continue:!0}}})}var it=require("fs"),Vs=require("path"),Yy=require("os");var ho=class{config;counts=new Map;queues=new Map;constructor(t){this.config=t}getConcurrencyLimit(t){let n=this.config?.modelConcurrency?.[t];if(n!==void 0)return n===0?1/0:n;let r=t.split("/")[0],o=this.config?.providerConcurrency?.[r];if(o!==void 0)return o===0?1/0:o;let s=this.config?.defaultConcurrency;return s!==void 0?s===0?1/0:s:5}async acquire(t){let n=this.getConcurrencyLimit(t);if(n===1/0)return;let r=this.counts.get(t)??0;if(r<n){this.counts.set(t,r+1);return}return new Promise(o=>{let s=this.queues.get(t)??[];s.push(o),this.queues.set(t,s)})}release(t){if(this.getConcurrencyLimit(t)===1/0)return;let r=this.queues.get(t);if(r&&r.length>0)r.shift()();else{let o=this.counts.get(t)??0;o>0&&this.counts.set(t,o-1)}}getCount(t){return this.counts.get(t)??0}getQueueLength(t){return this.queues.get(t)?.length??0}isAtCapacity(t){let n=this.getConcurrencyLimit(t);return n===1/0?!1:(this.counts.get(t)??0)>=n}getActiveCounts(){return new Map(this.counts)}clear(){this.counts.clear(),this.queues.clear()}};var _x=1800*1e3,kr=(0,Vs.join)((0,Yy.homedir)(),".claude",".olympus","background-tasks"),Ys=class{tasks=new Map;notifications=new Map;concurrencyManager;config;pruneInterval;constructor(t){this.config=t??{},this.concurrencyManager=new ho(t),this.ensureStorageDir(),this.loadPersistedTasks(),this.startPruning()}ensureStorageDir(){(0,it.existsSync)(kr)||(0,it.mkdirSync)(kr,{recursive:!0})}generateTaskId(){let t=Date.now().toString(36),n=Math.random().toString(36).substring(2,8);return`bg_${t}${n}`}getTaskPath(t){return(0,Vs.join)(kr,`${t}.json`)}persistTask(t){let n=this.getTaskPath(t.id);(0,it.writeFileSync)(n,JSON.stringify(t,null,2))}unpersistTask(t){let n=this.getTaskPath(t);(0,it.existsSync)(n)&&(0,it.unlinkSync)(n)}loadPersistedTasks(){if((0,it.existsSync)(kr))try{let{readdirSync:t}=require("fs"),n=t(kr);for(let r of n)if(r.endsWith(".json"))try{let o=(0,Vs.join)(kr,r),s=(0,it.readFileSync)(o,"utf-8"),i=JSON.parse(s);i.startedAt=new Date(i.startedAt),i.completedAt&&(i.completedAt=new Date(i.completedAt)),i.progress?.lastUpdate&&(i.progress.lastUpdate=new Date(i.progress.lastUpdate)),i.progress?.lastMessageAt&&(i.progress.lastMessageAt=new Date(i.progress.lastMessageAt)),this.tasks.set(i.id,i)}catch{}}catch{}}startPruning(){this.pruneInterval||(this.pruneInterval=setInterval(()=>{this.pruneStaleTasksAndNotifications()},6e4),this.pruneInterval.unref&&this.pruneInterval.unref())}stopPruning(){this.pruneInterval&&(clearInterval(this.pruneInterval),this.pruneInterval=void 0)}pruneStaleTasksAndNotifications(){let t=Date.now(),n=this.config.taskTimeoutMs??_x;for(let[r,o]of this.tasks.entries())t-o.startedAt.getTime()>n&&o.status==="running"&&(o.status="error",o.error=`Task timed out after ${Math.round(n/6e4)} minutes`,o.completedAt=new Date,o.concurrencyKey&&this.concurrencyManager.release(o.concurrencyKey),this.clearNotificationsForTask(r),this.unpersistTask(r),this.tasks.delete(r));for(let[r,o]of this.notifications.entries()){let s=o.filter(i=>t-i.startedAt.getTime()<=n);s.length===0?this.notifications.delete(r):s.length!==o.length&&this.notifications.set(r,s)}}async launch(t){let n=t.agent,r=this.config.maxTotalTasks??10;if(Array.from(this.tasks.values()).filter(c=>c.status==="running").length>=r)throw new Error(`Maximum concurrent background tasks (${r}) reached. Wait for some tasks to complete.`);await this.concurrencyManager.acquire(n);let s=this.generateTaskId(),i=`ses_${this.generateTaskId()}`,a={id:s,sessionId:i,parentSessionId:t.parentSessionId,description:t.description,prompt:t.prompt,agent:t.agent,status:"running",startedAt:new Date,progress:{toolCalls:0,lastUpdate:new Date},concurrencyKey:n};return this.tasks.set(s,a),this.persistTask(a),a}async resume(t){let n=this.findBySession(t.sessionId);if(!n)throw new Error(`Task not found for session: ${t.sessionId}`);return n.status="running",n.completedAt=void 0,n.error=void 0,n.parentSessionId=t.parentSessionId,n.progress||(n.progress={toolCalls:0,lastUpdate:new Date}),n.progress.lastUpdate=new Date,this.persistTask(n),n}getTask(t){return this.tasks.get(t)}findBySession(t){for(let n of this.tasks.values())if(n.sessionId===t)return n}getTasksByParentSession(t){let n=[];for(let r of this.tasks.values())r.parentSessionId===t&&n.push(r);return n}getAllTasks(){return Array.from(this.tasks.values())}getRunningTasks(){return Array.from(this.tasks.values()).filter(t=>t.status==="running")}updateTaskStatus(t,n,r,o){let s=this.tasks.get(t);s&&(s.status=n,r&&(s.result=r),o&&(s.error=o),(n==="completed"||n==="error"||n==="cancelled")&&(s.completedAt=new Date,s.concurrencyKey&&this.concurrencyManager.release(s.concurrencyKey),this.markForNotification(s)),this.persistTask(s))}updateTaskProgress(t,n){let r=this.tasks.get(t);r&&(r.progress||(r.progress={toolCalls:0,lastUpdate:new Date}),Object.assign(r.progress,n,{lastUpdate:new Date}),this.persistTask(r))}markForNotification(t){let n=this.notifications.get(t.parentSessionId)??[];n.push(t),this.notifications.set(t.parentSessionId,n)}getPendingNotifications(t){return this.notifications.get(t)??[]}clearNotifications(t){this.notifications.delete(t)}clearNotificationsForTask(t){for(let[n,r]of this.notifications.entries()){let o=r.filter(s=>s.id!==t);o.length===0?this.notifications.delete(n):this.notifications.set(n,o)}}removeTask(t){let n=this.tasks.get(t);n?.concurrencyKey&&this.concurrencyManager.release(n.concurrencyKey),this.clearNotificationsForTask(t),this.unpersistTask(t),this.tasks.delete(t)}formatDuration(t,n){let r=(n??new Date).getTime()-t.getTime(),o=Math.floor(r/1e3),s=Math.floor(o/60),i=Math.floor(s/60);return i>0?`${i}h ${s%60}m ${o%60}s`:s>0?`${s}m ${o%60}s`:`${o}s`}getStatusSummary(){let t=this.getRunningTasks(),n=this.getAllTasks();if(n.length===0)return"No background tasks.";let r=[`Background Tasks: ${t.length} running, ${n.length} total`,""];for(let o of n){let s=this.formatDuration(o.startedAt,o.completedAt),i=o.status.toUpperCase(),a=o.progress?` (${o.progress.toolCalls} tools)`:"";r.push(` [${i}] ${o.description} - ${s}${a}`),o.error&&r.push(` Error: ${o.error}`)}return r.join(`
1996
+ `}function xy(){let e=new Map,t=new Map;function n(c){if(!e.has(c)){let u=Yc(c)??{sessionID:c,agentUsed:!1,reminderCount:0,updatedAt:Date.now()};e.set(c,u)}return e.get(c)}function r(c){let l=n(c);l.agentUsed=!0,l.updatedAt=Date.now(),Gs(l)}function o(c){e.delete(c),Kc(c),t.delete(c)}function s(c,l,u){let d=t.get(c)||{consecutiveCount:0,lastToolName:"",lastFilePath:"",sessionId:c};return l.toLowerCase()==="task"?(d.consecutiveCount=0,t.set(c,d),0):(["edit","write","multiedit"].includes(l.toLowerCase())&&(d.consecutiveCount++,d.lastToolName=l,d.lastFilePath=u,t.set(c,d)),d.consecutiveCount)}return{"tool.execute.after":async(c,l)=>{let{tool:u,sessionID:d}=c,p=u.toLowerCase();if(Hc.has(p)){r(d),s(d,p,"");return}let f=c.properties||{},m=sx(f),g=s(d,p,m||""),y=ox();if(y.active){let _=ix(g,y.mode);if(_){l.output=_+l.output;return}}if(!Gc.has(p))return;let w=n(d);w.agentUsed||(l.output+=qc,w.reminderCount++,w.updatedAt=Date.now(),Gs(w))},event:async({event:c})=>{let l=c.properties;if(c.type==="session.deleted"){let u=l?.info;u?.id&&o(u.id)}if(c.type==="session.compacted"){let u=l?.sessionID??l?.info?.id;u&&o(u)}}}}function Py(){let e=process.cwd(),t=Qh();I({name:"editErrorRecovery",event:"PostToolUse",matcher:/^edit$/i,priority:10,handler:async c=>{if(!c.toolName||!c.toolOutput)return{continue:!0};let l=t.afterToolExecute({tool:c.toolName,sessionId:c.sessionId||"",callId:""},{title:"",output:String(c.toolOutput),metadata:void 0});return l.output!==String(c.toolOutput)?{continue:!0,hookSpecificOutput:{hookEventName:"PostToolUse",additionalContext:l.output.substring(String(c.toolOutput).length)}}:{continue:!0}}});let n=ny();I({name:"commentChecker",event:"PostToolUse",matcher:/^(write|edit|multiedit)$/i,priority:20,handler:async c=>{if(!c.toolName)return{continue:!0};let l=n.postToolUse({tool_name:c.toolName,session_id:c.sessionId||"",tool_input:c.toolInput||{},tool_response:c.toolOutput?String(c.toolOutput):void 0});return l?{continue:!0,message:l}:{continue:!0}}});let r=fy();I({name:"contextWindowLimitRecovery",event:"PostToolUse",priority:30,handler:async c=>{if(!c.toolName)return{continue:!0};let l=r.postToolUse({tool_name:c.toolName,session_id:c.sessionId||"",tool_input:c.toolInput||{},tool_response:c.toolOutput?String(c.toolOutput):void 0});return l?{continue:!0,message:l}:{continue:!0}}});let o=gy();I({name:"readToolLimitRecovery",event:"PostToolUse",matcher:/^read$/i,priority:35,handler:async c=>{if(!c.toolName||c.toolName.toLowerCase()!=="read")return{continue:!0};let l=o.postToolUse({tool_name:c.toolName,session_id:c.sessionId||"",tool_input:c.toolInput||{},tool_response:c.toolOutput?String(c.toolOutput):void 0});return l?{continue:!0,message:l}:{continue:!0}}});let s=Ty();I({name:"preemptiveCompaction",event:"PostToolUse",matcher:/^(read|grep|glob|bash|webfetch)$/i,priority:40,handler:async c=>{if(!c.toolName)return{continue:!0};let l=s.postToolUse({tool_name:c.toolName,session_id:c.sessionId||"",tool_input:c.toolInput||{},tool_response:c.toolOutput?String(c.toolOutput):void 0});return l?{continue:!0,message:l}:{continue:!0}}});let i=xy();I({name:"agentUsageReminder",event:"PostToolUse",matcher:/^(read|grep|glob|edit|write)$/i,priority:50,handler:async c=>{if(!c.toolName)return{continue:!0};let l={title:"",output:c.toolOutput?String(c.toolOutput):"",metadata:void 0};await i["tool.execute.after"]({tool:c.toolName,sessionID:c.sessionId||"",callID:""},l);let u=c.toolOutput?String(c.toolOutput):"";return l.output!==u?{continue:!0,message:l.output.substring(u.length)}:{continue:!0}}});let a=$s(e);I({name:"olympusOrchestratorPost",event:"PostToolUse",matcher:/^(write|edit|bash|task)$/i,priority:60,handler:async c=>{if(!c.toolName)return{continue:!0};let l=a.postTool(c.toolName,c.toolInput||{},c.toolOutput?String(c.toolOutput):"");return l.continue?l.modifiedOutput?{continue:!0,hookSpecificOutput:{hookEventName:"PostToolUse",additionalContext:l.modifiedOutput}}:l.message?{continue:!0,hookSpecificOutput:{hookEventName:"PostToolUse",additionalContext:l.message}}:{continue:!0}:{continue:!1,stopReason:l.message}}})}var Wy=require("node:fs");var J=require("node:fs"),We=require("node:path");var wr=require("node:path"),Hs=require("node:os");function ax(){return process.env.XDG_DATA_HOME??(0,wr.join)((0,Hs.homedir)(),".local","share")}function cx(){return(0,wr.join)(ax(),"claude-code","storage")}var Ay=cx(),fo=(0,wr.join)(Ay,"message"),_r=(0,wr.join)(Ay,"part"),pn=new Set(["thinking","redacted_thinking","reasoning"]),Iy=new Set(["step-start","step-finish"]);var st="[user interrupted]",qs={tool_result_missing:{title:"Tool Crash Recovery",message:"Injecting cancelled tool results..."},thinking_block_order:{title:"Thinking Block Recovery",message:"Fixing message structure..."},thinking_disabled_violation:{title:"Thinking Strip Recovery",message:"Stripping thinking blocks..."},empty_content:{title:"Empty Content Recovery",message:"Adding placeholder content..."}};var Oy=process.env.SESSION_RECOVERY_DEBUG==="1",$y=(0,wr.join)((0,Hs.tmpdir)(),"session-recovery-debug.log");function lx(){let e=Date.now().toString(16),t=Math.random().toString(36).substring(2,10);return`prt_${e}${t}`}function ux(e){if(!(0,J.existsSync)(fo))return"";let t=(0,We.join)(fo,e);if((0,J.existsSync)(t))return t;for(let n of(0,J.readdirSync)(fo)){let r=(0,We.join)(fo,n,e);if((0,J.existsSync)(r))return r}return""}function Kt(e){let t=ux(e);if(!t||!(0,J.existsSync)(t))return[];let n=[];for(let r of(0,J.readdirSync)(t))if(r.endsWith(".json"))try{let o=(0,J.readFileSync)((0,We.join)(t,r),"utf-8");n.push(JSON.parse(o))}catch{continue}return n.sort((r,o)=>{let s=r.time?.created??0,i=o.time?.created??0;return s!==i?s-i:r.id.localeCompare(o.id)})}function It(e){let t=(0,We.join)(_r,e);if(!(0,J.existsSync)(t))return[];let n=[];for(let r of(0,J.readdirSync)(t))if(r.endsWith(".json"))try{let o=(0,J.readFileSync)((0,We.join)(t,r),"utf-8");n.push(JSON.parse(o))}catch{continue}return n}function Dy(e){return pn.has(e.type)||Iy.has(e.type)?!1:e.type==="text"?!!e.text?.trim():e.type==="tool"||e.type==="tool_use"||e.type==="tool_result"}function Ny(e){return It(e).some(Dy)}function mo(e,t,n){let r=(0,We.join)(_r,t);(0,J.existsSync)(r)||(0,J.mkdirSync)(r,{recursive:!0});let o=lx(),s={id:o,sessionID:e,messageID:t,type:"text",text:n,synthetic:!0};try{return(0,J.writeFileSync)((0,We.join)(r,`${o}.json`),JSON.stringify(s,null,2)),!0}catch{return!1}}function Jc(e){let t=Kt(e),n=[];for(let r of t)Ny(r.id)||n.push(r.id);return n}function jy(e,t){let n=Kt(e),r=[t,t-1,t+1,t-2,t+2,t-3,t-4,t-5];for(let o of r){if(o<0||o>=n.length)continue;let s=n[o];if(!Ny(s.id))return s.id}return null}function zc(e){let t=Kt(e),n=[];for(let r of t){if(r.role!=="assistant")continue;It(r.id).some(i=>pn.has(i.type))&&n.push(r.id)}return n}function Fy(e){let t=Kt(e),n=[];for(let r of t){if(r.role!=="assistant")continue;let o=It(r.id);if(o.length===0)continue;let s=o.some(a=>pn.has(a.type)),i=o.some(Dy);s&&!i&&n.push(r.id)}return n}function Qc(e){let t=Kt(e),n=[];for(let r of t){if(r.role!=="assistant")continue;let o=It(r.id);if(o.length===0)continue;let i=[...o].sort((c,l)=>c.id.localeCompare(l.id))[0];pn.has(i.type)||n.push(r.id)}return n}function dx(e,t){let n=Kt(e),r=n.findIndex(o=>o.id===t);if(r===-1)return"";for(let o=r-1;o>=0;o--){let s=n[o];if(s.role!=="assistant")continue;let i=It(s.id);for(let a of i)if(pn.has(a.type)){let c=a.thinking,l=a.text,u=c||l;if(u&&u.trim().length>0)return u}}return""}function Xc(e,t){let n=(0,We.join)(_r,t);(0,J.existsSync)(n)||(0,J.mkdirSync)(n,{recursive:!0});let r=dx(e,t),o="prt_0000000000_thinking",s={id:o,sessionID:e,messageID:t,type:"thinking",thinking:r||"[Continuing from previous reasoning]",synthetic:!0};try{return(0,J.writeFileSync)((0,We.join)(n,`${o}.json`),JSON.stringify(s,null,2)),!0}catch{return!1}}function My(e){let t=(0,We.join)(_r,e);if(!(0,J.existsSync)(t))return!1;let n=!1;for(let r of(0,J.readdirSync)(t))if(r.endsWith(".json"))try{let o=(0,We.join)(t,r),s=(0,J.readFileSync)(o,"utf-8"),i=JSON.parse(s);pn.has(i.type)&&((0,J.unlinkSync)(o),n=!0)}catch{continue}return n}function go(e,t=st){let n=(0,We.join)(_r,e);if(!(0,J.existsSync)(n))return!1;let r=!1;for(let o of(0,J.readdirSync)(n))if(o.endsWith(".json"))try{let s=(0,We.join)(n,o),i=(0,J.readFileSync)(s,"utf-8"),a=JSON.parse(i);if(a.type==="text"){let c=a;c.text?.trim()||(c.text=t,c.synthetic=!0,(0,J.writeFileSync)(s,JSON.stringify(c,null,2)),r=!0)}}catch{continue}return r}function Ly(e){let t=Kt(e),n=[];for(let r of t)It(r.id).some(i=>i.type!=="text"?!1:!i.text?.trim())&&n.push(r.id);return n}function Uy(e,t){let n=Kt(e);if(t<0||t>=n.length)return null;let r=n[t];if(r.role!=="assistant")return null;let o=It(r.id);if(o.length===0)return null;let i=[...o].sort((c,l)=>c.id.localeCompare(l.id))[0];return pn.has(i.type)?null:r.id}function Se(...e){if(Oy){let t=`[${new Date().toISOString()}] [session-recovery] ${e.map(n=>typeof n=="object"?JSON.stringify(n,null,2):String(n)).join(" ")}
1997
+ `;(0,Wy.appendFileSync)($y,t)}}function By(e){if(!e)return"";if(typeof e=="string")return e.toLowerCase();let t=e,n=[t.data,t.error,t,t.data?.error];for(let r of n)if(r&&typeof r=="object"){let o=r.message;if(typeof o=="string"&&o.length>0)return o.toLowerCase()}try{return JSON.stringify(e).toLowerCase()}catch{return""}}function Gy(e){let n=By(e).match(/messages\.(\d+)/);return n?parseInt(n[1],10):null}function Hy(e){let t=By(e);return t.includes("tool_use")&&t.includes("tool_result")?"tool_result_missing":t.includes("thinking")&&(t.includes("first block")||t.includes("must start with")||t.includes("preceeding")||t.includes("final block")||t.includes("cannot be thinking")||t.includes("expected")&&t.includes("found"))?"thinking_block_order":t.includes("thinking is disabled")&&t.includes("cannot contain")?"thinking_disabled_violation":t.includes("empty")&&(t.includes("content")||t.includes("message"))?"empty_content":null}function px(e){return Hy(e)!==null}function fx(e){return e.filter(t=>t.type==="tool_use"&&!!t.id).map(t=>t.id)}async function mx(e,t){Se("recoverToolResultMissing",{sessionID:e,msgId:t.info?.id});let n=t.parts||[];n.length===0&&t.info?.id&&(n=It(t.info.id).map(s=>({type:s.type==="tool"?"tool_use":s.type,id:"callID"in s?s.callID:s.id,name:"tool"in s?s.tool:void 0,input:"state"in s?s.state?.input:void 0})));let r=fx(n);return r.length===0?(Se("No tool_use IDs found"),!1):(Se("Found tool_use IDs to inject results for",r),!0)}async function gx(e,t,n){Se("recoverThinkingBlockOrder",{sessionID:e});let r=Gy(n);if(r!==null){let i=Uy(e,r);if(i)return Se("Found target message by index",{targetIndex:r,targetMessageID:i}),Xc(e,i)}let o=Qc(e);if(o.length===0)return Se("No orphan thinking messages found"),!1;Se("Found orphan thinking messages",o);let s=!1;for(let i of o)Xc(e,i)&&(s=!0);return s}async function hx(e,t){Se("recoverThinkingDisabledViolation",{sessionID:e});let n=zc(e);if(n.length===0)return Se("No messages with thinking blocks found"),!1;Se("Found messages with thinking blocks",n);let r=!1;for(let o of n)My(o)&&(r=!0);return r}async function yx(e,t,n){Se("recoverEmptyContentMessage",{sessionID:e});let r=Gy(n),o=t.info?.id,s=!1,i=Ly(e);for(let l of i)go(l,st)&&(s=!0);let a=Fy(e);for(let l of a)mo(e,l,st)&&(s=!0);if(r!==null){let l=jy(e,r);if(l&&(go(l,st)||mo(e,l,st)))return!0}if(o&&(go(o,st)||mo(e,o,st)))return!0;let c=Jc(e);for(let l of c)go(l,st)&&(s=!0),mo(e,l,st)&&(s=!0);return s}async function wx(e,t,n,r){Se("handleSessionRecovery",{sessionID:e,error:t});let o=Hy(t);if(!o)return Se("Not a recoverable error"),{attempted:!1,success:!1};Se("Detected recoverable error type",o);try{let s=!1,i=n||{info:{},parts:[]};switch(o){case"tool_result_missing":s=await mx(e,i);break;case"thinking_block_order":s=await gx(e,i,t);break;case"thinking_disabled_violation":s=await hx(e,i);break;case"empty_content":s=await yx(e,i,t);break}Se("Recovery result",{errorType:o,success:s});let a=r?.customMessages?.[o]||qs[o]?.message||`Session recovery attempted for ${o}`;return{attempted:!0,success:s,message:s?a:void 0,errorType:o}}catch(s){return Se("Recovery failed with error",s),{attempted:!0,success:!1,errorType:o}}}function qy(e){return Se("createSessionRecoveryHook",{config:e}),{onError:async t=>wx(t.session_id,t.error,t.message,e),isRecoverable:t=>px(t),getRecoveryMessage:t=>{if(t)return e?.customMessages?.[t]||qs[t]?.message}}}function Vy(){let e=qy();I({name:"sessionRecovery",event:"PostToolUseFailure",priority:10,handler:async t=>{let n=t.error||t.toolOutput;if(!n)return{continue:!0};if(!e.isRecoverable(n))return{continue:!0};let r=await e.onError({session_id:t.sessionId||"default",error:n,message:void 0});return r.attempted&&r.success?{continue:!0,hookSpecificOutput:{hookEventName:"PostToolUseFailure",additionalContext:r.message||`[session-recovery] Recovered from ${r.errorType} error. Please retry.`}}:r.attempted&&!r.success?{continue:!0,hookSpecificOutput:{hookEventName:"PostToolUseFailure",additionalContext:`[session-recovery] Attempted recovery for ${r.errorType} but could not fix automatically. You may need to restart the session.`}}:{continue:!0}}})}var it=require("fs"),Vs=require("path"),Yy=require("os");var ho=class{config;counts=new Map;queues=new Map;constructor(t){this.config=t}getConcurrencyLimit(t){let n=this.config?.modelConcurrency?.[t];if(n!==void 0)return n===0?1/0:n;let r=t.split("/")[0],o=this.config?.providerConcurrency?.[r];if(o!==void 0)return o===0?1/0:o;let s=this.config?.defaultConcurrency;return s!==void 0?s===0?1/0:s:5}async acquire(t){let n=this.getConcurrencyLimit(t);if(n===1/0)return;let r=this.counts.get(t)??0;if(r<n){this.counts.set(t,r+1);return}return new Promise(o=>{let s=this.queues.get(t)??[];s.push(o),this.queues.set(t,s)})}release(t){if(this.getConcurrencyLimit(t)===1/0)return;let r=this.queues.get(t);if(r&&r.length>0)r.shift()();else{let o=this.counts.get(t)??0;o>0&&this.counts.set(t,o-1)}}getCount(t){return this.counts.get(t)??0}getQueueLength(t){return this.queues.get(t)?.length??0}isAtCapacity(t){let n=this.getConcurrencyLimit(t);return n===1/0?!1:(this.counts.get(t)??0)>=n}getActiveCounts(){return new Map(this.counts)}clear(){this.counts.clear(),this.queues.clear()}};var _x=1800*1e3,kr=(0,Vs.join)((0,Yy.homedir)(),".claude",".olympus","background-tasks"),Ys=class{tasks=new Map;notifications=new Map;concurrencyManager;config;pruneInterval;constructor(t){this.config=t??{},this.concurrencyManager=new ho(t),this.ensureStorageDir(),this.loadPersistedTasks(),this.startPruning()}ensureStorageDir(){(0,it.existsSync)(kr)||(0,it.mkdirSync)(kr,{recursive:!0})}generateTaskId(){let t=Date.now().toString(36),n=Math.random().toString(36).substring(2,8);return`bg_${t}${n}`}getTaskPath(t){return(0,Vs.join)(kr,`${t}.json`)}persistTask(t){let n=this.getTaskPath(t.id);(0,it.writeFileSync)(n,JSON.stringify(t,null,2))}unpersistTask(t){let n=this.getTaskPath(t);(0,it.existsSync)(n)&&(0,it.unlinkSync)(n)}loadPersistedTasks(){if((0,it.existsSync)(kr))try{let{readdirSync:t}=require("fs"),n=t(kr);for(let r of n)if(r.endsWith(".json"))try{let o=(0,Vs.join)(kr,r),s=(0,it.readFileSync)(o,"utf-8"),i=JSON.parse(s);i.startedAt=new Date(i.startedAt),i.completedAt&&(i.completedAt=new Date(i.completedAt)),i.progress?.lastUpdate&&(i.progress.lastUpdate=new Date(i.progress.lastUpdate)),i.progress?.lastMessageAt&&(i.progress.lastMessageAt=new Date(i.progress.lastMessageAt)),this.tasks.set(i.id,i)}catch{}}catch{}}startPruning(){this.pruneInterval||(this.pruneInterval=setInterval(()=>{this.pruneStaleTasksAndNotifications()},6e4),this.pruneInterval.unref&&this.pruneInterval.unref())}stopPruning(){this.pruneInterval&&(clearInterval(this.pruneInterval),this.pruneInterval=void 0)}pruneStaleTasksAndNotifications(){let t=Date.now(),n=this.config.taskTimeoutMs??_x;for(let[r,o]of this.tasks.entries())t-o.startedAt.getTime()>n&&o.status==="running"&&(o.status="error",o.error=`Task timed out after ${Math.round(n/6e4)} minutes`,o.completedAt=new Date,o.concurrencyKey&&this.concurrencyManager.release(o.concurrencyKey),this.clearNotificationsForTask(r),this.unpersistTask(r),this.tasks.delete(r));for(let[r,o]of this.notifications.entries()){let s=o.filter(i=>t-i.startedAt.getTime()<=n);s.length===0?this.notifications.delete(r):s.length!==o.length&&this.notifications.set(r,s)}}async launch(t){let n=t.agent,r=this.config.maxTotalTasks??10;if(Array.from(this.tasks.values()).filter(c=>c.status==="running").length>=r)throw new Error(`Maximum concurrent background tasks (${r}) reached. Wait for some tasks to complete.`);await this.concurrencyManager.acquire(n);let s=this.generateTaskId(),i=`ses_${this.generateTaskId()}`,a={id:s,sessionId:i,parentSessionId:t.parentSessionId,description:t.description,prompt:t.prompt,agent:t.agent,status:"running",startedAt:new Date,progress:{toolCalls:0,lastUpdate:new Date},concurrencyKey:n};return this.tasks.set(s,a),this.persistTask(a),a}async resume(t){let n=this.findBySession(t.sessionId);if(!n)throw new Error(`Task not found for session: ${t.sessionId}`);return n.status="running",n.completedAt=void 0,n.error=void 0,n.parentSessionId=t.parentSessionId,n.progress||(n.progress={toolCalls:0,lastUpdate:new Date}),n.progress.lastUpdate=new Date,this.persistTask(n),n}getTask(t){return this.tasks.get(t)}findBySession(t){for(let n of this.tasks.values())if(n.sessionId===t)return n}getTasksByParentSession(t){let n=[];for(let r of this.tasks.values())r.parentSessionId===t&&n.push(r);return n}getAllTasks(){return Array.from(this.tasks.values())}getRunningTasks(){return Array.from(this.tasks.values()).filter(t=>t.status==="running")}updateTaskStatus(t,n,r,o){let s=this.tasks.get(t);s&&(s.status=n,r&&(s.result=r),o&&(s.error=o),(n==="completed"||n==="error"||n==="cancelled")&&(s.completedAt=new Date,s.concurrencyKey&&this.concurrencyManager.release(s.concurrencyKey),this.markForNotification(s)),this.persistTask(s))}updateTaskProgress(t,n){let r=this.tasks.get(t);r&&(r.progress||(r.progress={toolCalls:0,lastUpdate:new Date}),Object.assign(r.progress,n,{lastUpdate:new Date}),this.persistTask(r))}markForNotification(t){let n=this.notifications.get(t.parentSessionId)??[];n.push(t),this.notifications.set(t.parentSessionId,n)}getPendingNotifications(t){return this.notifications.get(t)??[]}clearNotifications(t){this.notifications.delete(t)}clearNotificationsForTask(t){for(let[n,r]of this.notifications.entries()){let o=r.filter(s=>s.id!==t);o.length===0?this.notifications.delete(n):this.notifications.set(n,o)}}removeTask(t){let n=this.tasks.get(t);n?.concurrencyKey&&this.concurrencyManager.release(n.concurrencyKey),this.clearNotificationsForTask(t),this.unpersistTask(t),this.tasks.delete(t)}formatDuration(t,n){let r=(n??new Date).getTime()-t.getTime(),o=Math.floor(r/1e3),s=Math.floor(o/60),i=Math.floor(s/60);return i>0?`${i}h ${s%60}m ${o%60}s`:s>0?`${s}m ${o%60}s`:`${o}s`}getStatusSummary(){let t=this.getRunningTasks(),n=this.getAllTasks();if(n.length===0)return"No background tasks.";let r=[`Background Tasks: ${t.length} running, ${n.length} total`,""];for(let o of n){let s=this.formatDuration(o.startedAt,o.completedAt),i=o.status.toUpperCase(),a=o.progress?` (${o.progress.toolCalls} tools)`:"";r.push(` [${i}] ${o.description} - ${s}${a}`),o.error&&r.push(` Error: ${o.error}`)}return r.join(`
1998
1998
  `)}cleanup(){this.stopPruning(),this.tasks.clear(),this.notifications.clear()}},Zc;function el(e){return Zc||(Zc=new Ys(e)),Zc}function kx(e){let t=e.status.toUpperCase(),n=Sx(e.startedAt,e.completedAt),o=[`${e.status==="completed"?"\u2713":e.status==="error"?"\u2717":"\u25CB"} [${t}] ${e.description}`,` Agent: ${e.agent}`,` Duration: ${n}`];if(e.progress?.toolCalls&&o.push(` Tool calls: ${e.progress.toolCalls}`),e.result){let s=e.result.substring(0,200),i=e.result.length>200?"...":"";o.push(` Result: ${s}${i}`)}return e.error&&o.push(` Error: ${e.error}`),o.join(`
1999
1999
  `)}function Sx(e,t){let n=(t??new Date).getTime()-e.getTime(),r=Math.floor(n/1e3),o=Math.floor(r/60),s=Math.floor(o/60);return s>0?`${s}h ${o%60}m ${r%60}s`:o>0?`${o}m ${r%60}s`:`${r}s`}function vx(e){if(e.length===0)return"";let t=e.length===1?`
2000
2000
  [BACKGROUND TASK COMPLETED]
@@ -2004,20 +2004,20 @@ ${e>=5?"**CRITICAL**: Too many direct operations. Your next action MUST be deleg
2004
2004
 
2005
2005
  `);return`${t}
2006
2006
  ${n}
2007
- `}function bx(e,t,n){let r=t.getPendingNotifications(e);if(r.length===0)return{hasNotifications:!1,tasks:[]};let s=(n?.formatNotification??vx)(r);return{hasNotifications:!0,tasks:r,message:s}}function Ky(e,t){let n=e.sessionId;if(!n)return{continue:!0};let r=el(),o=bx(n,r,t);return o.hasNotifications?((t?.autoClear??!0)&&r.clearNotifications(n),{continue:!0,message:o.message,notificationCount:o.tasks.length}):{continue:!0}}function Jy(){A({name:"backgroundNotification",event:"Notification",priority:10,handler:async e=>{let t={sessionId:e.sessionId,directory:e.directory,event:e.event?{type:e.event.type,properties:e.event.properties}:void 0},n=await Ky(t);return{continue:n.continue,hookSpecificOutput:n.message?{hookEventName:"Notification",additionalContext:n.message}:void 0}}})}var nl=null,tl=!1;async function Ex(){if(!tl)try{let{encode:e}=await import("gpt-tokenizer");nl=e,tl=!0}catch{tl=!0}}function Tx(e){return Math.ceil(e.length/4)}async function Mn(e){if(!e||e.length===0)return 0;await Ex();try{if(nl)return nl(e).length}catch{}return Tx(e)}async function zy(e){if(!e)return 0;if(typeof e=="object"&&e!==null){let n=e;if("content"in n&&typeof n.content=="string")return Mn(n.content);if("output"in n&&typeof n.output=="string")return Mn(n.output);if("text"in n&&typeof n.text=="string")return Mn(n.text);if("result"in n&&typeof n.result=="string")return Mn(n.result)}let t=typeof e=="string"?e:JSON.stringify(e);return Mn(t)}var rl=[{model_pattern:"claude-opus",input_per_million:15,output_per_million:75,effective_date:"2025-01-01"},{model_pattern:"claude-sonnet",input_per_million:3,output_per_million:15,effective_date:"2025-01-01"},{model_pattern:"claude-haiku",input_per_million:.25,output_per_million:1.25,effective_date:"2025-01-01"}];function Qy(e,t,n,r=rl){let o=r.find(a=>new RegExp(a.model_pattern,"i").test(n));if(!o){let a=r.find(u=>u.model_pattern==="claude-sonnet")||{input_per_million:3,output_per_million:15,effective_date:"2025-01-01"},c=e/1e6*a.input_per_million,l=t/1e6*a.output_per_million;return{inputCost:c,outputCost:l,totalCost:c+l,pricingVersion:a.effective_date}}let s=e/1e6*o.input_per_million,i=t/1e6*o.output_per_million;return{inputCost:s,outputCost:i,totalCost:s+i,pricingVersion:o.effective_date}}Be();we();var Sr=v(require("fs"),1),Ks=v(require("path"),1),rw=v(require("os"),1),ow=process.env.OLYMPUS_DEBUG_HOOKS==="1",ew=Ks.join(rw.homedir(),".claude","olympus","learning","hooks-debug.log");function N(e,t,n){if(ow)try{let o=`[${new Date().toISOString()}] [${e}] ${t}`;n!==void 0&&(typeof n=="object"?o+=`
2007
+ `}function bx(e,t,n){let r=t.getPendingNotifications(e);if(r.length===0)return{hasNotifications:!1,tasks:[]};let s=(n?.formatNotification??vx)(r);return{hasNotifications:!0,tasks:r,message:s}}function Ky(e,t){let n=e.sessionId;if(!n)return{continue:!0};let r=el(),o=bx(n,r,t);return o.hasNotifications?((t?.autoClear??!0)&&r.clearNotifications(n),{continue:!0,message:o.message,notificationCount:o.tasks.length}):{continue:!0}}function Jy(){I({name:"backgroundNotification",event:"Notification",priority:10,handler:async e=>{let t={sessionId:e.sessionId,directory:e.directory,event:e.event?{type:e.event.type,properties:e.event.properties}:void 0},n=await Ky(t);return{continue:n.continue,hookSpecificOutput:n.message?{hookEventName:"Notification",additionalContext:n.message}:void 0}}})}var nl=null,tl=!1;async function Ex(){if(!tl)try{let{encode:e}=await import("gpt-tokenizer");nl=e,tl=!0}catch{tl=!0}}function Tx(e){return Math.ceil(e.length/4)}async function Mn(e){if(!e||e.length===0)return 0;await Ex();try{if(nl)return nl(e).length}catch{}return Tx(e)}async function zy(e){if(!e)return 0;if(typeof e=="object"&&e!==null){let n=e;if("content"in n&&typeof n.content=="string")return Mn(n.content);if("output"in n&&typeof n.output=="string")return Mn(n.output);if("text"in n&&typeof n.text=="string")return Mn(n.text);if("result"in n&&typeof n.result=="string")return Mn(n.result)}let t=typeof e=="string"?e:JSON.stringify(e);return Mn(t)}var rl=[{model_pattern:"claude-opus",input_per_million:15,output_per_million:75,effective_date:"2025-01-01"},{model_pattern:"claude-sonnet",input_per_million:3,output_per_million:15,effective_date:"2025-01-01"},{model_pattern:"claude-haiku",input_per_million:.25,output_per_million:1.25,effective_date:"2025-01-01"}];function Qy(e,t,n,r=rl){let o=r.find(a=>new RegExp(a.model_pattern,"i").test(n));if(!o){let a=r.find(u=>u.model_pattern==="claude-sonnet")||{input_per_million:3,output_per_million:15,effective_date:"2025-01-01"},c=e/1e6*a.input_per_million,l=t/1e6*a.output_per_million;return{inputCost:c,outputCost:l,totalCost:c+l,pricingVersion:a.effective_date}}let s=e/1e6*o.input_per_million,i=t/1e6*o.output_per_million;return{inputCost:s,outputCost:i,totalCost:s+i,pricingVersion:o.effective_date}}Be();we();var Sr=v(require("fs"),1),Ks=v(require("path"),1),rw=v(require("os"),1),ow=process.env.OLYMPUS_DEBUG_HOOKS==="1",ew=Ks.join(rw.homedir(),".claude","olympus","learning","hooks-debug.log");function N(e,t,n){if(ow)try{let o=`[${new Date().toISOString()}] [${e}] ${t}`;n!==void 0&&(typeof n=="object"?o+=`
2008
2008
  ${JSON.stringify(n,null,2)}`:o+=` ${n}`),o+=`
2009
- `;let s=Ks.dirname(ew);Sr.existsSync(s)||Sr.mkdirSync(s,{recursive:!0}),Sr.appendFileSync(ew,o,"utf8")}catch(r){console.error("[Olympus Debug] Failed to write debug log:",r)}}function ol(e,t){ow&&N(e,"Context received",{directory:t.directory,sessionId:t.sessionId,hasPrompt:!!t.prompt,promptLength:t.prompt?.length||0,hasMessage:!!t.message,messageModel:t.message?.model,toolName:t.toolName,hasToolOutput:!!t.toolOutput,toolOutputType:t.toolOutput?typeof t.toolOutput:void 0,hasParts:!!t.parts,partsLength:t.parts?.length||0})}function Rx(e){return e.prompt?e.prompt:e.message?.content?e.message.content:e.parts?e.parts.filter(t=>t.type==="text"&&t.text).map(t=>t.text).join(" "):""}function tw(e){if(e.message?.model){let{providerId:t,modelId:n}=e.message.model;if(t&&n)return`${t}/${n}`;if(n)return n}}function nw(e,t=1e4){return e.token_budget?(e.token_budget.input_tokens===void 0&&(e.token_budget.input_tokens=0),e.token_budget.output_tokens===void 0&&(e.token_budget.output_tokens=0)):e.token_budget={session_baseline:t,current_usage:0,input_tokens:0,output_tokens:0,warning_threshold:1.5,warning_issued:!1,started_at:new Date().toISOString()},e}function sw(){A({name:"learningCapturePrompt",event:"UserPromptSubmit",priority:110,handler:async e=>{N("learningCapturePrompt","Hook fired"),ol("learningCapturePrompt",e);try{if(!e.directory)return N("learningCapturePrompt","No directory in context - skipping"),{continue:!0};N("learningCapturePrompt","Extracting prompt text");let t=Rx(e);if(!t)return N("learningCapturePrompt","No prompt text extracted - skipping"),{continue:!0};N("learningCapturePrompt",`Prompt text extracted (${t.length} chars)`),N("learningCapturePrompt","Estimating input tokens");let n=await Mn(t);N("learningCapturePrompt",`Estimated tokens: ${n}`),N("learningCapturePrompt","Loading session state",{directory:e.directory,sessionId:e.sessionId});let r=Q(e.directory,e.sessionId);N("learningCapturePrompt","Session state loaded",{hasTokenBudget:!!r.token_budget,currentUsage:r.token_budget?.current_usage,inputTokens:r.token_budget?.input_tokens,outputTokens:r.token_budget?.output_tokens}),nw(r),N("learningCapturePrompt","Token budget ensured");let o=tw(e);if(N("learningCapturePrompt",`Model identifier: ${o||"none"}`),o&&r.token_budget&&(r.token_budget.current_model=o,N("learningCapturePrompt",`Model set in token budget: ${o}`)),r.token_budget){let s=r.token_budget.input_tokens,i=r.token_budget.current_usage;r.token_budget.input_tokens+=n,r.token_budget.current_usage+=n,N("learningCapturePrompt","Tokens accumulated",{addedTokens:n,inputTokens:{before:s,after:r.token_budget.input_tokens},currentUsage:{before:i,after:r.token_budget.current_usage}}),N("learningCapturePrompt","Saving session state"),ee(e.directory,r),N("learningCapturePrompt","Session state saved successfully")}else N("learningCapturePrompt","WARNING: No token budget after ensure - this should not happen")}catch(t){N("learningCapturePrompt","ERROR in handler",{error:t instanceof Error?t.message:String(t),stack:t instanceof Error?t.stack:void 0}),console.error("[Olympus Learning Capture] Error in prompt handler:",t)}return N("learningCapturePrompt","Hook completed"),{continue:!0}}}),A({name:"learningCaptureTool",event:"PostToolUse",priority:70,handler:async e=>{N("learningCaptureTool","Hook fired"),ol("learningCaptureTool",e);try{if(!e.directory||!e.toolName)return N("learningCaptureTool","Missing directory or toolName - skipping",{hasDirectory:!!e.directory,hasToolName:!!e.toolName}),{continue:!0};N("learningCaptureTool",`Processing tool: ${e.toolName}`),N("learningCaptureTool","Estimating output tokens from tool result");let t=e.toolOutput?await zy(e.toolOutput):0;N("learningCaptureTool",`Estimated output tokens: ${t}`),N("learningCaptureTool","Loading session state",{directory:e.directory,sessionId:e.sessionId});let n=Q(e.directory,e.sessionId);N("learningCaptureTool","Session state loaded",{hasTokenBudget:!!n.token_budget,currentUsage:n.token_budget?.current_usage,inputTokens:n.token_budget?.input_tokens,outputTokens:n.token_budget?.output_tokens}),nw(n),N("learningCaptureTool","Token budget ensured");let r=tw(e);if(N("learningCaptureTool",`Model identifier: ${r||"none"}`),r&&n.token_budget&&(n.token_budget.current_model=r,N("learningCaptureTool",`Model set in token budget: ${r}`)),n.token_budget){let o=n.token_budget.output_tokens,s=n.token_budget.current_usage;n.token_budget.output_tokens+=t,n.token_budget.current_usage+=t,N("learningCaptureTool","Tokens accumulated",{addedTokens:t,outputTokens:{before:o,after:n.token_budget.output_tokens},currentUsage:{before:s,after:n.token_budget.current_usage}}),N("learningCaptureTool","Saving session state"),ee(e.directory,n),N("learningCaptureTool","Session state saved successfully")}else N("learningCaptureTool","WARNING: No token budget after ensure - this should not happen")}catch(t){N("learningCaptureTool","ERROR in handler",{error:t instanceof Error?t.message:String(t),stack:t instanceof Error?t.stack:void 0}),console.error("[Olympus Learning Capture] Error in tool use handler:",t)}return N("learningCaptureTool","Hook completed"),{continue:!0}}}),A({name:"learningCaptureStop",event:"Stop",priority:90,handler:async e=>{N("learningCaptureStop","Hook fired"),ol("learningCaptureStop",e);try{if(!e.directory)return N("learningCaptureStop","No directory in context - skipping"),{continue:!0};N("learningCaptureStop","Loading session state",{directory:e.directory,sessionId:e.sessionId});let t=Q(e.directory,e.sessionId);if(N("learningCaptureStop","Session state loaded",{hasTokenBudget:!!t.token_budget,currentUsage:t.token_budget?.current_usage,inputTokens:t.token_budget?.input_tokens,outputTokens:t.token_budget?.output_tokens,currentModel:t.token_budget?.current_model}),!t.token_budget)return N("learningCaptureStop","No token budget in session state - skipping (backward compatibility)"),{continue:!0};let n=t.token_budget.current_usage,r=t.token_budget.input_tokens||0,o=t.token_budget.output_tokens||0;if(N("learningCaptureStop","Token totals",{totalTokens:n,inputTokens:r,outputTokens:o}),n===0)return N("learningCaptureStop","No token usage recorded - skipping feedback entry creation"),{continue:!0};let s=t.token_budget.current_model||"unknown";N("learningCaptureStop",`Using model identifier: ${s}`),N("learningCaptureStop","Token usage object created",{input_tokens:r,output_tokens:o,total_tokens:n,estimated:!0,model:s}),N("learningCaptureStop","Calculating cost estimate");let a={input_cost:0,output_cost:0,total_cost:0,pricing_version:"2025-01-01"};try{let l=Qy(r,o,s);a.input_cost=l.inputCost,a.output_cost=l.outputCost,a.total_cost=l.totalCost,a.pricing_version=l.pricingVersion,N("learningCaptureStop","Cost calculated successfully",{inputCost:l.inputCost,outputCost:l.outputCost,totalCost:l.totalCost})}catch(l){N("learningCaptureStop","Cost calculation failed (not critical)",{error:l instanceof Error?l.message:String(l)})}let c={session_id:t.session_id,project_path:e.directory,started_at:t.token_budget.started_at,ended_at:new Date().toISOString(),duration_seconds:Math.round((Date.now()-new Date(t.token_budget.started_at).getTime())/1e3),agents_used:t.token_budget.agents_used||[],total_input_tokens:r,total_output_tokens:o,total_tokens:n,estimated_cost:a.total_cost,model:s,outcome:"success"};N("learningCaptureStop","Session summary created",{sessionId:c.session_id,duration:c.duration_seconds,agentsUsed:c.agents_used,totalTokens:c.total_tokens,cost:c.estimated_cost});try{du(c),N("learningCaptureStop","Session summary saved successfully")}catch(l){N("learningCaptureStop","Failed to save session summary (non-critical)",{error:l instanceof Error?l.message:String(l)})}try{let{formatSessionSummaryLine:l}=await Promise.resolve().then(()=>(Zy(),Xy)),u=l(c);console.error(u)}catch{}N("learningCaptureStop","Resetting token budget for next session"),t.token_budget.current_usage=0,t.token_budget.input_tokens=0,t.token_budget.output_tokens=0,t.token_budget.warning_issued=!1,t.token_budget.started_at=new Date().toISOString(),delete t.token_budget.current_model,delete t.token_budget.agents_used,N("learningCaptureStop","Saving reset session state"),ee(e.directory,t),N("learningCaptureStop","Session state saved successfully")}catch(t){N("learningCaptureStop","ERROR in handler",{error:t instanceof Error?t.message:String(t),stack:t instanceof Error?t.stack:void 0}),console.error("[Olympus Learning Capture] Error in stop handler:",t)}return N("learningCaptureStop","Hook completed"),{continue:!0}}})}Be();function iw(){A({name:"budgetWarning",event:"PostToolUse",priority:90,handler:e=>{if(!e.directory)return{continue:!0};try{let t=Q(e.directory,e.sessionId),n=0;if(e.toolOutput&&typeof e.toolOutput=="object"){let r=e.toolOutput;r.token_usage&&typeof r.token_usage=="object"&&(n=r.token_usage.total_tokens??0)}if(n>0&&ku(t,n),vu(t)){let r=t.token_budget,o=(r.current_usage/1e3).toFixed(1),s=(r.session_baseline/1e3).toFixed(0),i=(r.current_usage/r.session_baseline).toFixed(2);return Su(t),ee(e.directory,t),{continue:!0,message:`[TOKEN AWARENESS] Session at ${o}k tokens (${i}x baseline of ${s}k).
2009
+ `;let s=Ks.dirname(ew);Sr.existsSync(s)||Sr.mkdirSync(s,{recursive:!0}),Sr.appendFileSync(ew,o,"utf8")}catch(r){console.error("[Olympus Debug] Failed to write debug log:",r)}}function ol(e,t){ow&&N(e,"Context received",{directory:t.directory,sessionId:t.sessionId,hasPrompt:!!t.prompt,promptLength:t.prompt?.length||0,hasMessage:!!t.message,messageModel:t.message?.model,toolName:t.toolName,hasToolOutput:!!t.toolOutput,toolOutputType:t.toolOutput?typeof t.toolOutput:void 0,hasParts:!!t.parts,partsLength:t.parts?.length||0})}function Rx(e){return e.prompt?e.prompt:e.message?.content?e.message.content:e.parts?e.parts.filter(t=>t.type==="text"&&t.text).map(t=>t.text).join(" "):""}function tw(e){if(e.message?.model){let{providerId:t,modelId:n}=e.message.model;if(t&&n)return`${t}/${n}`;if(n)return n}}function nw(e,t=1e4){return e.token_budget?(e.token_budget.input_tokens===void 0&&(e.token_budget.input_tokens=0),e.token_budget.output_tokens===void 0&&(e.token_budget.output_tokens=0)):e.token_budget={session_baseline:t,current_usage:0,input_tokens:0,output_tokens:0,warning_threshold:1.5,warning_issued:!1,started_at:new Date().toISOString()},e}function sw(){I({name:"learningCapturePrompt",event:"UserPromptSubmit",priority:110,handler:async e=>{N("learningCapturePrompt","Hook fired"),ol("learningCapturePrompt",e);try{if(!e.directory)return N("learningCapturePrompt","No directory in context - skipping"),{continue:!0};N("learningCapturePrompt","Extracting prompt text");let t=Rx(e);if(!t)return N("learningCapturePrompt","No prompt text extracted - skipping"),{continue:!0};N("learningCapturePrompt",`Prompt text extracted (${t.length} chars)`),N("learningCapturePrompt","Estimating input tokens");let n=await Mn(t);N("learningCapturePrompt",`Estimated tokens: ${n}`),N("learningCapturePrompt","Loading session state",{directory:e.directory,sessionId:e.sessionId});let r=Q(e.directory,e.sessionId);N("learningCapturePrompt","Session state loaded",{hasTokenBudget:!!r.token_budget,currentUsage:r.token_budget?.current_usage,inputTokens:r.token_budget?.input_tokens,outputTokens:r.token_budget?.output_tokens}),nw(r),N("learningCapturePrompt","Token budget ensured");let o=tw(e);if(N("learningCapturePrompt",`Model identifier: ${o||"none"}`),o&&r.token_budget&&(r.token_budget.current_model=o,N("learningCapturePrompt",`Model set in token budget: ${o}`)),r.token_budget){let s=r.token_budget.input_tokens,i=r.token_budget.current_usage;r.token_budget.input_tokens+=n,r.token_budget.current_usage+=n,N("learningCapturePrompt","Tokens accumulated",{addedTokens:n,inputTokens:{before:s,after:r.token_budget.input_tokens},currentUsage:{before:i,after:r.token_budget.current_usage}}),N("learningCapturePrompt","Saving session state"),ee(e.directory,r),N("learningCapturePrompt","Session state saved successfully")}else N("learningCapturePrompt","WARNING: No token budget after ensure - this should not happen")}catch(t){N("learningCapturePrompt","ERROR in handler",{error:t instanceof Error?t.message:String(t),stack:t instanceof Error?t.stack:void 0}),console.error("[Olympus Learning Capture] Error in prompt handler:",t)}return N("learningCapturePrompt","Hook completed"),{continue:!0}}}),I({name:"learningCaptureTool",event:"PostToolUse",priority:70,handler:async e=>{N("learningCaptureTool","Hook fired"),ol("learningCaptureTool",e);try{if(!e.directory||!e.toolName)return N("learningCaptureTool","Missing directory or toolName - skipping",{hasDirectory:!!e.directory,hasToolName:!!e.toolName}),{continue:!0};N("learningCaptureTool",`Processing tool: ${e.toolName}`),N("learningCaptureTool","Estimating output tokens from tool result");let t=e.toolOutput?await zy(e.toolOutput):0;N("learningCaptureTool",`Estimated output tokens: ${t}`),N("learningCaptureTool","Loading session state",{directory:e.directory,sessionId:e.sessionId});let n=Q(e.directory,e.sessionId);N("learningCaptureTool","Session state loaded",{hasTokenBudget:!!n.token_budget,currentUsage:n.token_budget?.current_usage,inputTokens:n.token_budget?.input_tokens,outputTokens:n.token_budget?.output_tokens}),nw(n),N("learningCaptureTool","Token budget ensured");let r=tw(e);if(N("learningCaptureTool",`Model identifier: ${r||"none"}`),r&&n.token_budget&&(n.token_budget.current_model=r,N("learningCaptureTool",`Model set in token budget: ${r}`)),n.token_budget){let o=n.token_budget.output_tokens,s=n.token_budget.current_usage;n.token_budget.output_tokens+=t,n.token_budget.current_usage+=t,N("learningCaptureTool","Tokens accumulated",{addedTokens:t,outputTokens:{before:o,after:n.token_budget.output_tokens},currentUsage:{before:s,after:n.token_budget.current_usage}}),N("learningCaptureTool","Saving session state"),ee(e.directory,n),N("learningCaptureTool","Session state saved successfully")}else N("learningCaptureTool","WARNING: No token budget after ensure - this should not happen")}catch(t){N("learningCaptureTool","ERROR in handler",{error:t instanceof Error?t.message:String(t),stack:t instanceof Error?t.stack:void 0}),console.error("[Olympus Learning Capture] Error in tool use handler:",t)}return N("learningCaptureTool","Hook completed"),{continue:!0}}}),I({name:"learningCaptureStop",event:"Stop",priority:90,handler:async e=>{N("learningCaptureStop","Hook fired"),ol("learningCaptureStop",e);try{if(!e.directory)return N("learningCaptureStop","No directory in context - skipping"),{continue:!0};N("learningCaptureStop","Loading session state",{directory:e.directory,sessionId:e.sessionId});let t=Q(e.directory,e.sessionId);if(N("learningCaptureStop","Session state loaded",{hasTokenBudget:!!t.token_budget,currentUsage:t.token_budget?.current_usage,inputTokens:t.token_budget?.input_tokens,outputTokens:t.token_budget?.output_tokens,currentModel:t.token_budget?.current_model}),!t.token_budget)return N("learningCaptureStop","No token budget in session state - skipping (backward compatibility)"),{continue:!0};let n=t.token_budget.current_usage,r=t.token_budget.input_tokens||0,o=t.token_budget.output_tokens||0;if(N("learningCaptureStop","Token totals",{totalTokens:n,inputTokens:r,outputTokens:o}),n===0)return N("learningCaptureStop","No token usage recorded - skipping feedback entry creation"),{continue:!0};let s=t.token_budget.current_model||"unknown";N("learningCaptureStop",`Using model identifier: ${s}`),N("learningCaptureStop","Token usage object created",{input_tokens:r,output_tokens:o,total_tokens:n,estimated:!0,model:s}),N("learningCaptureStop","Calculating cost estimate");let a={input_cost:0,output_cost:0,total_cost:0,pricing_version:"2025-01-01"};try{let l=Qy(r,o,s);a.input_cost=l.inputCost,a.output_cost=l.outputCost,a.total_cost=l.totalCost,a.pricing_version=l.pricingVersion,N("learningCaptureStop","Cost calculated successfully",{inputCost:l.inputCost,outputCost:l.outputCost,totalCost:l.totalCost})}catch(l){N("learningCaptureStop","Cost calculation failed (not critical)",{error:l instanceof Error?l.message:String(l)})}let c={session_id:t.session_id,project_path:e.directory,started_at:t.token_budget.started_at,ended_at:new Date().toISOString(),duration_seconds:Math.round((Date.now()-new Date(t.token_budget.started_at).getTime())/1e3),agents_used:t.token_budget.agents_used||[],total_input_tokens:r,total_output_tokens:o,total_tokens:n,estimated_cost:a.total_cost,model:s,outcome:"success"};N("learningCaptureStop","Session summary created",{sessionId:c.session_id,duration:c.duration_seconds,agentsUsed:c.agents_used,totalTokens:c.total_tokens,cost:c.estimated_cost});try{du(c),N("learningCaptureStop","Session summary saved successfully")}catch(l){N("learningCaptureStop","Failed to save session summary (non-critical)",{error:l instanceof Error?l.message:String(l)})}try{let{formatSessionSummaryLine:l}=await Promise.resolve().then(()=>(Zy(),Xy)),u=l(c);console.error(u)}catch{}N("learningCaptureStop","Resetting token budget for next session"),t.token_budget.current_usage=0,t.token_budget.input_tokens=0,t.token_budget.output_tokens=0,t.token_budget.warning_issued=!1,t.token_budget.started_at=new Date().toISOString(),delete t.token_budget.current_model,delete t.token_budget.agents_used,N("learningCaptureStop","Saving reset session state"),ee(e.directory,t),N("learningCaptureStop","Session state saved successfully")}catch(t){N("learningCaptureStop","ERROR in handler",{error:t instanceof Error?t.message:String(t),stack:t instanceof Error?t.stack:void 0}),console.error("[Olympus Learning Capture] Error in stop handler:",t)}return N("learningCaptureStop","Hook completed"),{continue:!0}}})}Be();function iw(){I({name:"budgetWarning",event:"PostToolUse",priority:90,handler:e=>{if(!e.directory)return{continue:!0};try{let t=Q(e.directory,e.sessionId),n=0;if(e.toolOutput&&typeof e.toolOutput=="object"){let r=e.toolOutput;r.token_usage&&typeof r.token_usage=="object"&&(n=r.token_usage.total_tokens??0)}if(n>0&&ku(t,n),vu(t)){let r=t.token_budget,o=(r.current_usage/1e3).toFixed(1),s=(r.session_baseline/1e3).toFixed(0),i=(r.current_usage/r.session_baseline).toFixed(2);return Su(t),ee(e.directory,t),{continue:!0,message:`[TOKEN AWARENESS] Session at ${o}k tokens (${i}x baseline of ${s}k).
2010
2010
  This is informational - continue if task requires it.
2011
2011
  Consider: delegate to subagent, break into smaller tasks.`}}return ee(e.directory,t),{continue:!0}}catch(t){return console.error("[Olympus Learning] Budget warning error:",t),{continue:!0}}}})}Be();ce();Z();Qo();Ut();var vr=v(require("fs"),1),yo=v(require("path"),1),mw=v(require("os"),1),$x=process.env.OLYMPUS_DEBUG_HOOKS==="1",fw=yo.join(mw.homedir(),".claude","olympus","learning","hooks-debug.log");function B(e,t,n){if($x)try{let o=`[${new Date().toISOString()}] [${e}] ${t}`;n!==void 0&&(typeof n=="object"?o+=`
2012
2012
  ${JSON.stringify(n,null,2)}`:o+=` ${n}`),o+=`
2013
- `;let s=yo.dirname(fw);vr.existsSync(s)||vr.mkdirSync(s,{recursive:!0}),vr.appendFileSync(fw,o,"utf8")}catch(r){console.error("[Olympus Debug] Failed to write debug log:",r)}}async function Dx(e,t){try{let n=e.includes("executing a coding task as part of a structured workflow"),r=e.match(/BOLT-(\d+)/i);if(!n&&!r)return null;let o=await oe(t);if(o.length===0)return null;let s=await I(t,o[0]);return s?s.active_code_plan_path?{boltId:s.active_code_plan_path,workflowId:s.workflow_id}:r&&n?{boltId:`BOLT-${r[1].padStart(3,"0")}`,workflowId:s.workflow_id}:null:null}catch(n){return B("agentTracking","Error detecting BOLT execution",{error:n instanceof Error?n.message:String(n)}),null}}function gw(){A({name:"agentTracking",event:"PreToolUse",priority:50,handler:async e=>{B("agentTracking","Hook fired"),B("agentTracking","Context received",{directory:e.directory,sessionId:e.sessionId,toolName:e.toolName,hasToolInput:!!e.toolInput});let t=null;try{if(e.toolName!=="Task")return B("agentTracking",`Skipping non-Task tool: ${e.toolName}`),{continue:!0};if(B("agentTracking","Task tool detected - processing"),!e.directory)return B("agentTracking","No directory in context - skipping"),{continue:!0};if(!e.sessionId)return B("agentTracking","No sessionId in context - skipping"),{continue:!0};if(!e.toolInput)return B("agentTracking","No toolInput in context - skipping"),{continue:!0};let n=e.toolInput,r=n.subagent_type,o=n.prompt;if(B("agentTracking","Tool input extracted",{subagentType:r,hasPrompt:!!o,promptLength:typeof o=="string"?o.length:0}),!r||typeof r!="string")return B("agentTracking","Missing or invalid subagent_type - skipping"),{continue:!0};if(!o||typeof o!="string")return B("agentTracking","Missing or invalid prompt - skipping"),{continue:!0};B("agentTracking","Loading session state",{directory:e.directory,sessionId:e.sessionId});let s=Q(e.directory,e.sessionId);B("agentTracking","Session state loaded",{sessionId:s.session_id,hasPendingCompletion:!!s.pending_completion});try{let{getRoutingRecommendation:a}=await Promise.resolve().then(()=>(pw(),dw));t=a(r,o),t&&B("agentTracking","Routing recommendation generated",{recommendation:t})}catch{}let i=await Dx(o,e.directory);if(B("agentTracking","BOLT detection result",{isBoltExecution:!!i,boltId:i?.boltId,workflowId:i?.workflowId}),B("agentTracking","Marking completion claim",{agent:r,taskLength:o.length,hasBoltMetadata:!!i}),yu(s,o,r),i&&s.pending_completion){s.pending_completion.bolt_id=i.boltId,s.pending_completion.workflow_id=i.workflowId,B("agentTracking","BOLT metadata added to pending_completion",{bolt_id:i.boltId,workflow_id:i.workflowId});try{let a=await oe(e.directory),c=null;for(let l of a){let u=await I(e.directory,l);if(u&&u.status!=="complete"&&u.status!=="archived"&&u.status!=="deferred"){c=l;break}}if(!c)B("agentTracking","No active workflow found for manifest update");else{let l=yo.join(e.directory,"aidlc-docs",c,"manifest.json"),u=W(l);if(u){let d=u.artifacts.find(p=>p.id===i.boltId);d&&(d.executedBy=r,G(l,u),B("agentTracking","Set executedBy on BOLT artifact",{boltId:i.boltId,executedBy:r}))}}}catch(a){B("agentTracking","Error setting executedBy on manifest",{error:a instanceof Error?a.message:String(a)})}}B("agentTracking","Completion claim marked",{claimedAt:s.pending_completion?.claimed_at,agentUsed:s.pending_completion?.agent_used,bolt_id:s.pending_completion?.bolt_id,workflow_id:s.pending_completion?.workflow_id}),s.token_budget&&(s.token_budget.agents_used||(s.token_budget.agents_used=[]),s.token_budget.agents_used.includes(r)||s.token_budget.agents_used.push(r),B("agentTracking","Agents accumulated",{agents_used:s.token_budget.agents_used})),B("agentTracking","Saving session state"),ee(e.directory,s),B("agentTracking","Session state saved successfully")}catch(n){B("agentTracking","ERROR in handler",{error:n instanceof Error?n.message:String(n),stack:n instanceof Error?n.stack:void 0}),console.error("[Olympus Agent Tracking] Error in handler:",n)}return B("agentTracking","Hook completed"),t?{continue:!0,hookSpecificOutput:{hookEventName:"PreToolUse",additionalContext:t}}:{continue:!0}}}),A({name:"agentTrackingBoltCompletion",event:"PostToolUse",priority:51,handler:async e=>{B("agentTrackingBoltCompletion","Hook fired");try{if(e.toolName!=="Task")return B("agentTrackingBoltCompletion",`Skipping non-Task tool: ${e.toolName}`),{continue:!0};if(!e.directory||!e.sessionId)return B("agentTrackingBoltCompletion","Missing directory or sessionId - skipping"),{continue:!0};let t=Q(e.directory,e.sessionId);if(B("agentTrackingBoltCompletion","Session state loaded",{hasPendingCompletion:!!t.pending_completion,bolt_id:t.pending_completion?.bolt_id}),!t.pending_completion||!t.pending_completion.bolt_id)return B("agentTrackingBoltCompletion","No BOLT execution detected - skipping"),{continue:!0};let{bolt_id:n,workflow_id:r,agent_used:o,task_description:s}=t.pending_completion;if(!o)return B("agentTrackingBoltCompletion","No agent_used in pending_completion - skipping"),{continue:!0};B("agentTrackingBoltCompletion","Recording BOLT execution",{boltId:n,agentName:o,workflowId:r}),Rf({boltId:n,agentName:o,success:!0,sessionId:e.sessionId,projectPath:e.directory,taskDescription:s}),B("agentTrackingBoltCompletion","BOLT execution recorded successfully");try{let i={type:"bolt_execution_complete",phase:"construction",stage:"code-generation",details:`BOLT ${n} executed by ${o}`,artifactId:n,agentName:o},a={workflowId:r||"unknown",featureName:r||"unknown",projectPath:e.directory,sessionId:e.sessionId,phase:"construction"},c=Ve(i,a);ue(c),B("agentTrackingBoltCompletion","BOLT completion discovery recorded",{boltId:n,discoveryId:c.id})}catch(i){console.error("[Olympus Agent Tracking] Failed to capture BOLT completion discovery:",i),B("agentTrackingBoltCompletion","Failed to capture BOLT completion discovery",{error:i instanceof Error?i.message:String(i)})}}catch(t){B("agentTrackingBoltCompletion","ERROR in handler",{error:t instanceof Error?t.message:String(t),stack:t instanceof Error?t.stack:void 0}),console.error("[Olympus Agent Tracking BOLT Completion] Error in handler:",t)}return B("agentTrackingBoltCompletion","Hook completed"),{continue:!0}}})}Be();var il=require("path"),hw=require("os");we();var Nx={enabled:!0,minConfidence:.6,maxPerSession:5,maxPerDay:20,deduplicationWindowDays:7};function br(e){let t=(0,il.join)((0,hw.homedir)(),".claude","olympus","config.json"),n=_e(t,{}),r={};if(e){let s=(0,il.join)(e,".olympus","config.json");r=_e(s,{})}let o={...Nx,...n.autoDiscovery||{},...r.autoDiscovery||{}};return o.minConfidence=Math.max(0,Math.min(1,o.minConfidence)),o.maxPerSession=Math.max(1,Math.min(50,o.maxPerSession)),o.maxPerDay=Math.max(1,Math.min(200,o.maxPerDay)),o.deduplicationWindowDays=Math.max(1,Math.min(90,o.deduplicationWindowDays)),o}var Js=require("fs"),yw=require("path");we();var jx={praise:.85,problem_solved:.7,topic_change:.6},Fx=[{pattern:/\bworkaround\b/i,category:"workaround"},{pattern:/\bgotcha\b/i,category:"gotcha"},{pattern:/\bperformance\b/i,category:"performance"},{pattern:/\bperformant\b/i,category:"performance"},{pattern:/\bslow\b/i,category:"performance"},{pattern:/\boptimiz/i,category:"performance"},{pattern:/\bdependenc/i,category:"dependency"},{pattern:/\bpackage\b/i,category:"dependency"},{pattern:/\bpeer\s+dep/i,category:"dependency"},{pattern:/\bconfig/i,category:"configuration"},{pattern:/\benvironment\s+variable/i,category:"configuration"},{pattern:/\benv\b/i,category:"configuration"},{pattern:/\bpattern\b/i,category:"pattern"},{pattern:/\bconvention\b/i,category:"pattern"}];function ww(e,t){if(!e.pending_completion?.task_description)return null;let n=e.pending_completion.task_description,r=e.pending_completion.agent_used||"unknown",o=Bx(n),s=Gx(n),i=Mx(n,r),a=jx[t]??.6;return{session_id:e.session_id,category:i,summary:o,details:s,agent_name:r,task_context:n.substring(0,200),confidence:a,scope:"project"}}function _w(e,t,n=7){let r=Hx(t,n);if(r.length===0)return!1;let o=e.summary||"",s=e.details||"";for(let i of r)if(i.details===s&&s.length>0||o.length>0&&i.summary&&Lx(o,i.summary)>.7)return!0;return!1}function Mx(e,t){for(let{pattern:n,category:r}of Fx)if(n.test(e))return r;return"technical_insight"}function Lx(e,t){let n=a=>new Set(a.toLowerCase().replace(/[^\w\s]/g,"").split(/\s+/).filter(c=>c.length>3)),r=n(e),o=n(t);if(r.size===0&&o.size===0)return 1;if(r.size===0||o.size===0)return 0;let s=new Set([...r].filter(a=>o.has(a))),i=new Set([...r,...o]);return i.size>0?s.size/i.size:0}function Er(e,t){if(e.length<=t)return e;let n=e.substring(0,t),r=n.lastIndexOf(" ");return r>t*.5?n.substring(0,r)+"...":n+"..."}function Ux(e,t=100){if(!e||e.length===0)return"";let n=e.match(/^[^.]+\./),r=e.indexOf(`
2013
+ `;let s=yo.dirname(fw);vr.existsSync(s)||vr.mkdirSync(s,{recursive:!0}),vr.appendFileSync(fw,o,"utf8")}catch(r){console.error("[Olympus Debug] Failed to write debug log:",r)}}async function Dx(e,t){try{let n=e.includes("executing a coding task as part of a structured workflow"),r=e.match(/BOLT-(\d+)/i);if(!n&&!r)return null;let o=await oe(t);if(o.length===0)return null;let s=await A(t,o[0]);return s?s.active_code_plan_path?{boltId:s.active_code_plan_path,workflowId:s.workflow_id}:r&&n?{boltId:`BOLT-${r[1].padStart(3,"0")}`,workflowId:s.workflow_id}:null:null}catch(n){return B("agentTracking","Error detecting BOLT execution",{error:n instanceof Error?n.message:String(n)}),null}}function gw(){I({name:"agentTracking",event:"PreToolUse",priority:50,handler:async e=>{B("agentTracking","Hook fired"),B("agentTracking","Context received",{directory:e.directory,sessionId:e.sessionId,toolName:e.toolName,hasToolInput:!!e.toolInput});let t=null;try{if(e.toolName!=="Task")return B("agentTracking",`Skipping non-Task tool: ${e.toolName}`),{continue:!0};if(B("agentTracking","Task tool detected - processing"),!e.directory)return B("agentTracking","No directory in context - skipping"),{continue:!0};if(!e.sessionId)return B("agentTracking","No sessionId in context - skipping"),{continue:!0};if(!e.toolInput)return B("agentTracking","No toolInput in context - skipping"),{continue:!0};let n=e.toolInput,r=n.subagent_type,o=n.prompt;if(B("agentTracking","Tool input extracted",{subagentType:r,hasPrompt:!!o,promptLength:typeof o=="string"?o.length:0}),!r||typeof r!="string")return B("agentTracking","Missing or invalid subagent_type - skipping"),{continue:!0};if(!o||typeof o!="string")return B("agentTracking","Missing or invalid prompt - skipping"),{continue:!0};B("agentTracking","Loading session state",{directory:e.directory,sessionId:e.sessionId});let s=Q(e.directory,e.sessionId);B("agentTracking","Session state loaded",{sessionId:s.session_id,hasPendingCompletion:!!s.pending_completion});try{let{getRoutingRecommendation:a}=await Promise.resolve().then(()=>(pw(),dw));t=a(r,o),t&&B("agentTracking","Routing recommendation generated",{recommendation:t})}catch{}let i=await Dx(o,e.directory);if(B("agentTracking","BOLT detection result",{isBoltExecution:!!i,boltId:i?.boltId,workflowId:i?.workflowId}),B("agentTracking","Marking completion claim",{agent:r,taskLength:o.length,hasBoltMetadata:!!i}),yu(s,o,r),i&&s.pending_completion){s.pending_completion.bolt_id=i.boltId,s.pending_completion.workflow_id=i.workflowId,B("agentTracking","BOLT metadata added to pending_completion",{bolt_id:i.boltId,workflow_id:i.workflowId});try{let a=await oe(e.directory),c=null;for(let l of a){let u=await A(e.directory,l);if(u&&u.status!=="complete"&&u.status!=="archived"&&u.status!=="deferred"){c=l;break}}if(!c)B("agentTracking","No active workflow found for manifest update");else{let l=yo.join(e.directory,"aidlc-docs",c,"manifest.json"),u=W(l);if(u){let d=u.artifacts.find(p=>p.id===i.boltId);d&&(d.executedBy=r,G(l,u),B("agentTracking","Set executedBy on BOLT artifact",{boltId:i.boltId,executedBy:r}))}}}catch(a){B("agentTracking","Error setting executedBy on manifest",{error:a instanceof Error?a.message:String(a)})}}B("agentTracking","Completion claim marked",{claimedAt:s.pending_completion?.claimed_at,agentUsed:s.pending_completion?.agent_used,bolt_id:s.pending_completion?.bolt_id,workflow_id:s.pending_completion?.workflow_id}),s.token_budget&&(s.token_budget.agents_used||(s.token_budget.agents_used=[]),s.token_budget.agents_used.includes(r)||s.token_budget.agents_used.push(r),B("agentTracking","Agents accumulated",{agents_used:s.token_budget.agents_used})),B("agentTracking","Saving session state"),ee(e.directory,s),B("agentTracking","Session state saved successfully")}catch(n){B("agentTracking","ERROR in handler",{error:n instanceof Error?n.message:String(n),stack:n instanceof Error?n.stack:void 0}),console.error("[Olympus Agent Tracking] Error in handler:",n)}return B("agentTracking","Hook completed"),t?{continue:!0,hookSpecificOutput:{hookEventName:"PreToolUse",additionalContext:t}}:{continue:!0}}}),I({name:"agentTrackingBoltCompletion",event:"PostToolUse",priority:51,handler:async e=>{B("agentTrackingBoltCompletion","Hook fired");try{if(e.toolName!=="Task")return B("agentTrackingBoltCompletion",`Skipping non-Task tool: ${e.toolName}`),{continue:!0};if(!e.directory||!e.sessionId)return B("agentTrackingBoltCompletion","Missing directory or sessionId - skipping"),{continue:!0};let t=Q(e.directory,e.sessionId);if(B("agentTrackingBoltCompletion","Session state loaded",{hasPendingCompletion:!!t.pending_completion,bolt_id:t.pending_completion?.bolt_id}),!t.pending_completion||!t.pending_completion.bolt_id)return B("agentTrackingBoltCompletion","No BOLT execution detected - skipping"),{continue:!0};let{bolt_id:n,workflow_id:r,agent_used:o,task_description:s}=t.pending_completion;if(!o)return B("agentTrackingBoltCompletion","No agent_used in pending_completion - skipping"),{continue:!0};B("agentTrackingBoltCompletion","Recording BOLT execution",{boltId:n,agentName:o,workflowId:r}),Rf({boltId:n,agentName:o,success:!0,sessionId:e.sessionId,projectPath:e.directory,taskDescription:s}),B("agentTrackingBoltCompletion","BOLT execution recorded successfully");try{let i={type:"bolt_execution_complete",phase:"construction",stage:"code-generation",details:`BOLT ${n} executed by ${o}`,artifactId:n,agentName:o},a={workflowId:r||"unknown",featureName:r||"unknown",projectPath:e.directory,sessionId:e.sessionId,phase:"construction"},c=Ve(i,a);ue(c),B("agentTrackingBoltCompletion","BOLT completion discovery recorded",{boltId:n,discoveryId:c.id})}catch(i){console.error("[Olympus Agent Tracking] Failed to capture BOLT completion discovery:",i),B("agentTrackingBoltCompletion","Failed to capture BOLT completion discovery",{error:i instanceof Error?i.message:String(i)})}}catch(t){B("agentTrackingBoltCompletion","ERROR in handler",{error:t instanceof Error?t.message:String(t),stack:t instanceof Error?t.stack:void 0}),console.error("[Olympus Agent Tracking BOLT Completion] Error in handler:",t)}return B("agentTrackingBoltCompletion","Hook completed"),{continue:!0}}})}Be();var il=require("path"),hw=require("os");we();var Nx={enabled:!0,minConfidence:.6,maxPerSession:5,maxPerDay:20,deduplicationWindowDays:7};function br(e){let t=(0,il.join)((0,hw.homedir)(),".claude","olympus","config.json"),n=_e(t,{}),r={};if(e){let s=(0,il.join)(e,".olympus","config.json");r=_e(s,{})}let o={...Nx,...n.autoDiscovery||{},...r.autoDiscovery||{}};return o.minConfidence=Math.max(0,Math.min(1,o.minConfidence)),o.maxPerSession=Math.max(1,Math.min(50,o.maxPerSession)),o.maxPerDay=Math.max(1,Math.min(200,o.maxPerDay)),o.deduplicationWindowDays=Math.max(1,Math.min(90,o.deduplicationWindowDays)),o}var Js=require("fs"),yw=require("path");we();var jx={praise:.85,problem_solved:.7,topic_change:.6},Fx=[{pattern:/\bworkaround\b/i,category:"workaround"},{pattern:/\bgotcha\b/i,category:"gotcha"},{pattern:/\bperformance\b/i,category:"performance"},{pattern:/\bperformant\b/i,category:"performance"},{pattern:/\bslow\b/i,category:"performance"},{pattern:/\boptimiz/i,category:"performance"},{pattern:/\bdependenc/i,category:"dependency"},{pattern:/\bpackage\b/i,category:"dependency"},{pattern:/\bpeer\s+dep/i,category:"dependency"},{pattern:/\bconfig/i,category:"configuration"},{pattern:/\benvironment\s+variable/i,category:"configuration"},{pattern:/\benv\b/i,category:"configuration"},{pattern:/\bpattern\b/i,category:"pattern"},{pattern:/\bconvention\b/i,category:"pattern"}];function ww(e,t){if(!e.pending_completion?.task_description)return null;let n=e.pending_completion.task_description,r=e.pending_completion.agent_used||"unknown",o=Bx(n),s=Gx(n),i=Mx(n,r),a=jx[t]??.6;return{session_id:e.session_id,category:i,summary:o,details:s,agent_name:r,task_context:n.substring(0,200),confidence:a,scope:"project"}}function _w(e,t,n=7){let r=Hx(t,n);if(r.length===0)return!1;let o=e.summary||"",s=e.details||"";for(let i of r)if(i.details===s&&s.length>0||o.length>0&&i.summary&&Lx(o,i.summary)>.7)return!0;return!1}function Mx(e,t){for(let{pattern:n,category:r}of Fx)if(n.test(e))return r;return"technical_insight"}function Lx(e,t){let n=a=>new Set(a.toLowerCase().replace(/[^\w\s]/g,"").split(/\s+/).filter(c=>c.length>3)),r=n(e),o=n(t);if(r.size===0&&o.size===0)return 1;if(r.size===0||o.size===0)return 0;let s=new Set([...r].filter(a=>o.has(a))),i=new Set([...r,...o]);return i.size>0?s.size/i.size:0}function Er(e,t){if(e.length<=t)return e;let n=e.substring(0,t),r=n.lastIndexOf(" ");return r>t*.5?n.substring(0,r)+"...":n+"..."}function Ux(e,t=100){if(!e||e.length===0)return"";let n=e.match(/^[^.]+\./),r=e.indexOf(`
2014
2014
  `),o=e.length;n&&n[0].length<=t&&(o=Math.min(o,n[0].length)),r>0&&r<=t&&(o=Math.min(o,r)),o=Math.min(o,t);let s=e.substring(0,o).trim();return s.length<e.length&&!s.endsWith(".")?Er(s,t):s}function Wx(e){let t=e.replace(/`[^`]*[\\\/][^`]*`/g,"");return t=t.replace(/[A-Z]:[\\\/][\w\\\/.@-]+/gi,""),t=t.replace(/\/[\w-]+(?:\/[\w\/.@-]+)+/g,""),t=t.replace(/\s+/g," ").trim(),t}function Bx(e){if(!e||e.length===0)return"Completed task";let t={Create:"Created",Fix:"Fixed",Update:"Updated",Add:"Added",Implement:"Implemented",Build:"Built",Write:"Wrote",Configure:"Configured","Set up":"Set up",Setup:"Set up",Install:"Installed",Remove:"Removed",Delete:"Deleted",Refactor:"Refactored",Test:"Tested",Debug:"Debugged",Deploy:"Deployed",Migrate:"Migrated",VERIFY:"Verified",Verify:"Verified",Analyze:"Analyzed",Review:"Reviewed",Explore:"Explored",Investigate:"Investigated"},n=Wx(e),r=Ux(n,150);for(let[s,i]of Object.entries(t)){let a=new RegExp(`^${s}\\b`,"i");if(a.test(r)){let c=r.replace(a,i);return Er(c.trim(),100)}}let o=n.match(/^In the .+? project,\s*(.+)/i);if(o){let s=o[1].trim();if(s.toLowerCase().startsWith("i need to")){let i=s.replace(/^i need to\s+/i,"");return Er(i.charAt(0).toUpperCase()+i.slice(1),100)}return Er(s,100)}return Er(r,100)}function Gx(e){if(!e||e.length===0)return"";let t=e;t=t.replace(/```[\s\S]*?```/g,"[code block]"),t=t.replace(/`[^`]+`/g,"");let n=t.match(/^(.*?)(?=\n##|\n\n##|$)/s);n&&(t=n[1].trim());let r=t.match(/^\d+\.\s+(.+)/gm);return r&&r.length>0&&(t=r.slice(0,3).map(i=>i.replace(/^\d+\.\s+/,"").trim()).join("; ")),t=t.split(/\n\n/)[0]||t,t=t.replace(/\s+/g," ").trim(),t.length>500?Er(t,500):t}function Hx(e,t){let n=_t(e),r=(0,yw.join)(n,"discoveries.jsonl");if(!(0,Js.existsSync)(r))return[];try{let o=(0,Js.readFileSync)(r,"utf-8"),s=new Date(Date.now()-t*24*60*60*1e3);return o.split(`
2015
- `).filter(i=>i.trim()).map(i=>{try{return JSON.parse(i)}catch{return null}}).filter(i=>i?new Date(i.timestamp)>=s:!1)}catch{return[]}}Ut();function kw(){A({name:"discoveryCapture",event:"Stop",priority:92,handler:async e=>{try{if(!e.directory)return{continue:!0};let t=br(e.directory);if(!t.enabled)return{continue:!0};let n=Q(e.directory,e.sessionId);if(Eu(n,t))return{continue:!0};if(!xo(n))return{continue:!0};let r=qx(n);if(!r)return{continue:!0};let o=ww(n,r);if(!o)return{continue:!0};if((o.confidence||0)<t.minConfidence)return{continue:!0};if(_w(o,e.directory,t.deduplicationWindowDays))return{continue:!0};ue({...o,project_path:e.directory,session_id:n.session_id,category:o.category||"technical_insight",summary:o.summary||"",details:o.details||"",agent_name:o.agent_name||"unknown",confidence:o.confidence||.6,scope:"project"}),bu(n),ee(e.directory,n)}catch(t){console.error("[Olympus Discovery Capture] Error:",t)}return{continue:!0}}})}function qx(e){let t=e.recent_prompts||[];if(t.length===0)return null;let n=t[0];return n?.detected_feedback==="praise"?"praise":n?.prompt&&e.pending_completion?.task_description&&Vx(n.prompt,e.pending_completion.task_description)<.2?"topic_change":null}function Vx(e,t){let n=a=>new Set(a.toLowerCase().replace(/[^\w\s]/g,"").split(/\s+/).filter(c=>c.length>3)),r=n(e),o=n(t);if(r.size===0&&o.size===0)return 1;if(r.size===0||o.size===0)return 0;let s=new Set([...r].filter(a=>o.has(a))),i=new Set([...r,...o]);return i.size>0?s.size/i.size:0}Be();var Tr=require("fs"),bw=require("path"),Sw=new Map;function Ew(e,t,n){try{if(!(0,Tr.existsSync)(t))return null;let r=(0,bw.relative)(e,t),o=(0,Tr.readFileSync)(t,"utf-8"),i=(0,Tr.statSync)(t).mtimeMs,a=Sw.get(t),c=a===void 0;if(Sw.set(t,i),!c&&a===i)return null;let l=Yx(o);if(c)return{event_type:"plan_created",plan_path:r,plan_summary:l,revision_count:0,session_id:n,timestamp:new Date().toISOString()};let u=Jx(t);return{event_type:"plan_revised",plan_path:r,plan_summary:l,revision_count:u,session_id:n,timestamp:new Date().toISOString()}}catch{return null}}function Tw(e){let t=typeof e=="string"?e:String(e||"");if(!t)return{passed:!1,issues:["Empty review output"]};let n=t.toUpperCase(),o=["APPROVED","LOOKS GOOD","NO CRITICAL ISSUES","PLAN IS SOLID"].some(c=>n.includes(c)),i=["CRITICAL","REVISE","REJECT","MAJOR ISSUE","MISSING","INCOMPLETE"].some(c=>n.includes(c)),a=Kx(t);return o&&!i?{passed:!0,issues:a}:i?{passed:!1,issues:a.length>0?a:["Plan requires revision"]}:{passed:!0,issues:a}}function al(e,t,n){let r=e.plan_path.split("/").pop()||e.plan_path,o=t.length,s=e.event_type==="plan_review_failed"?`Plan '${r}' failed review: ${o} issue${o!==1?"s":""}`:`Plan '${r}' failed: ${o} issue${o!==1?"s":""}`,i=t.map(c=>`- ${c}`).join(`
2015
+ `).filter(i=>i.trim()).map(i=>{try{return JSON.parse(i)}catch{return null}}).filter(i=>i?new Date(i.timestamp)>=s:!1)}catch{return[]}}Ut();function kw(){I({name:"discoveryCapture",event:"Stop",priority:92,handler:async e=>{try{if(!e.directory)return{continue:!0};let t=br(e.directory);if(!t.enabled)return{continue:!0};let n=Q(e.directory,e.sessionId);if(Eu(n,t))return{continue:!0};if(!xo(n))return{continue:!0};let r=qx(n);if(!r)return{continue:!0};let o=ww(n,r);if(!o)return{continue:!0};if((o.confidence||0)<t.minConfidence)return{continue:!0};if(_w(o,e.directory,t.deduplicationWindowDays))return{continue:!0};ue({...o,project_path:e.directory,session_id:n.session_id,category:o.category||"technical_insight",summary:o.summary||"",details:o.details||"",agent_name:o.agent_name||"unknown",confidence:o.confidence||.6,scope:"project"}),bu(n),ee(e.directory,n)}catch(t){console.error("[Olympus Discovery Capture] Error:",t)}return{continue:!0}}})}function qx(e){let t=e.recent_prompts||[];if(t.length===0)return null;let n=t[0];return n?.detected_feedback==="praise"?"praise":n?.prompt&&e.pending_completion?.task_description&&Vx(n.prompt,e.pending_completion.task_description)<.2?"topic_change":null}function Vx(e,t){let n=a=>new Set(a.toLowerCase().replace(/[^\w\s]/g,"").split(/\s+/).filter(c=>c.length>3)),r=n(e),o=n(t);if(r.size===0&&o.size===0)return 1;if(r.size===0||o.size===0)return 0;let s=new Set([...r].filter(a=>o.has(a))),i=new Set([...r,...o]);return i.size>0?s.size/i.size:0}Be();var Tr=require("fs"),bw=require("path"),Sw=new Map;function Ew(e,t,n){try{if(!(0,Tr.existsSync)(t))return null;let r=(0,bw.relative)(e,t),o=(0,Tr.readFileSync)(t,"utf-8"),i=(0,Tr.statSync)(t).mtimeMs,a=Sw.get(t),c=a===void 0;if(Sw.set(t,i),!c&&a===i)return null;let l=Yx(o);if(c)return{event_type:"plan_created",plan_path:r,plan_summary:l,revision_count:0,session_id:n,timestamp:new Date().toISOString()};let u=Jx(t);return{event_type:"plan_revised",plan_path:r,plan_summary:l,revision_count:u,session_id:n,timestamp:new Date().toISOString()}}catch{return null}}function Tw(e){let t=typeof e=="string"?e:String(e||"");if(!t)return{passed:!1,issues:["Empty review output"]};let n=t.toUpperCase(),o=["APPROVED","LOOKS GOOD","NO CRITICAL ISSUES","PLAN IS SOLID"].some(c=>n.includes(c)),i=["CRITICAL","REVISE","REJECT","MAJOR ISSUE","MISSING","INCOMPLETE"].some(c=>n.includes(c)),a=Kx(t);return o&&!i?{passed:!0,issues:a}:i?{passed:!1,issues:a.length>0?a:["Plan requires revision"]}:{passed:!0,issues:a}}function al(e,t,n){let r=e.plan_path.split("/").pop()||e.plan_path,o=t.length,s=e.event_type==="plan_review_failed"?`Plan '${r}' failed review: ${o} issue${o!==1?"s":""}`:`Plan '${r}' failed: ${o} issue${o!==1?"s":""}`,i=t.map(c=>`- ${c}`).join(`
2016
2016
  `).substring(0,500),a=[e.reviewer?`Issues found by ${e.reviewer}:`:"Issues:",i].join(`
2017
2017
  `);return{session_id:e.session_id,project_path:n,category:"planning_insight",summary:s,details:a,agent_name:"prometheus",task_context:`Plan lifecycle: ${e.event_type}`,files_involved:[e.plan_path],confidence:.9,scope:"project"}}function Cw(e){if(e.length===0)return"";let t=["<plan-learnings>","## Planning Insights (from previous sessions)",""],n=[],r=[];for(let s of e.slice(0,5))s.summary.includes("failed")?n.push(`- ${s.summary}`):r.push(`- ${s.summary}`);n.length>0&&(t.push("**Common Planning Mistakes:**"),t.push(...n),t.push("")),r.length>0&&(t.push("**Required Considerations:**"),t.push(...r),t.push("")),t.push("</plan-learnings>");let o=t.join(`
2018
2018
  `);return o.length>1200?o.substring(0,1200)+`
2019
2019
  </plan-learnings>`:o}function Yx(e){let t=e;if(t.startsWith("---")){let r=t.indexOf("---",3);r>0&&(t=t.substring(r+3).trim())}return t.replace(/^#+\s*/gm,"").replace(/\n+/g," ").trim().substring(0,200)}function Kx(e){let t=[],n=e.split(`
2020
- `);for(let r of n){let o=r.trim();/^[-*]\s+(CRITICAL|ISSUE|PROBLEM|MISSING|BUG|CONCERN):/i.test(o)&&t.push(o.replace(/^[-*]\s+/,"")),/\b(CRITICAL|MAJOR)\s+(ISSUE|PROBLEM|BUG|GAP)/i.test(o)&&o.length<200&&(t.includes(o)||t.push(o))}return t.slice(0,10)}var vw=new Map;function Jx(e){let n=(vw.get(e)||0)+1;return vw.set(e,n),n}Ut();Ut();Z();ce();Ba();var Rw=v(require("path"),1);function xw(){A({name:"planFileMonitor",event:"PostToolUse",priority:75,handler:async e=>{try{if(e.toolName!=="Write")return{continue:!0};if(!e.directory||!e.sessionId)return{continue:!0};if(!br(e.directory).enabled)return{continue:!0};let r=e.toolInput?.file_path;if(!r)return{continue:!0};let o=r.replace(/\\/g,"/");if(!o.includes(".olympus/plans/")||!o.endsWith(".md"))return{continue:!0};let s=Ew(e.directory,r,e.sessionId);if(!s)return{continue:!0};if(s.event_type==="plan_revised"&&s.revision_count&&s.revision_count>=2){let i=al(s,[`Plan revised ${s.revision_count} times - may indicate unclear requirements`],e.directory);i.summary&&i.details&&ue({...i,project_path:e.directory,session_id:e.sessionId,category:i.category||"planning_insight",summary:i.summary,details:i.details,agent_name:i.agent_name||"prometheus",confidence:i.confidence||.7,scope:"project"})}}catch(t){console.error("[Olympus Plan Lifecycle] Error in plan file monitor:",t)}return{continue:!0}}}),A({name:"momusReviewTracker",event:"PostToolUse",priority:76,handler:async e=>{try{if(e.toolName!=="Task")return{continue:!0};if(!e.directory||!e.sessionId)return{continue:!0};if(!br(e.directory).enabled)return{continue:!0};let n=e.toolInput;if(n?.subagent_type!=="momus")return{continue:!0};let o=e.toolOutput,s=typeof o=="string"?o:JSON.stringify(o||""),i=Tw(s);if(!i.passed&&i.issues.length>0){if(!i.issues.some(m=>m!=="Plan requires revision"&&m.length>10))return{continue:!0};let l=(n?.prompt||"").match(/\.olympus\/plans\/([\w-]+\.md)/),u=l?l[0]:"unknown-plan",d=l?l[1]:"unknown-plan",p={event_type:"plan_review_failed",plan_path:u,plan_summary:`Momus review failed with ${i.issues.length} issues`,failure_reasons:i.issues,reviewer:"momus",session_id:e.sessionId,timestamp:new Date().toISOString()},f=al(p,i.issues,e.directory);f.summary&&f.details&&ue({...f,project_path:e.directory,session_id:e.sessionId,category:"planning_insight",summary:f.summary,details:f.details,agent_name:"momus",confidence:.9,scope:"project"})}}catch(t){console.error("[Olympus Plan Lifecycle] Error in Momus review tracker:",t)}return{continue:!0}}}),A({name:"completePlanTracker",event:"UserPromptSubmit",priority:115,handler:async e=>{try{if(!e.directory||!e.sessionId)return{continue:!0};if(!br(e.directory).enabled)return{continue:!0};let n=e.prompt||"";if(!((e.parts||[]).map(a=>a.text||"").join(" ")||n).includes("[PLAN COMPLETION MODE - VERIFICATION REQUIRED]"))return{continue:!0};let i=Q(e.directory,e.sessionId);i.pending_completion||(i.pending_completion={claimed_at:new Date().toISOString(),task_description:"plan_completion_verification",agent_used:"complete-plan"},ee(e.directory,i))}catch(t){console.error("[Olympus Plan Lifecycle] Error in complete-plan tracker:",t)}return{continue:!0}}}),A({name:"prometheusLearningsInjection",event:"PreToolUse",priority:55,handler:async e=>{try{if(e.toolName!=="Task")return{continue:!0};if(!e.directory)return{continue:!0};if(e.toolInput?.subagent_type!=="prometheus")return{continue:!0};let o=Jo(e.directory,20).filter(i=>i.category==="planning_insight");if(o.length===0)return{continue:!0};let s=Cw(o.slice(0,5));if(s)return{continue:!0,hookSpecificOutput:{hookEventName:"PreToolUse",additionalContext:s}}}catch(t){console.error("[Olympus Plan Lifecycle] Error in Prometheus learnings injection:",t)}return{continue:!0}}}),A({name:"workflowPhaseTransitionTracker",event:"PostToolUse",priority:83,handler:async e=>{try{if(e.toolName!=="Write"&&e.toolName!=="Task")return{continue:!0};if(!e.directory||!e.sessionId)return{continue:!0};let t=e.directory,n=await oe(t),r=null,o=null;for(let u of n){let d=await I(t,u);if(d&&d.status!=="complete"&&d.status!=="archived"&&d.status!=="deferred"){r=u,o=d;break}}if(!r||!o)return{continue:!0};let s=Rw.join(t,"aidlc-docs",r,"manifest.json"),i=W(s);if(!i)return{continue:!0};let a=Q(t,e.sessionId),c=o.current_phase,l=a.last_tracked_phase;if(l&&l!==c){let u=new Date().toISOString();i.gate_audit.push({phase:c,timestamp:u,action:"approved",actor:"trust",reason:`Phase transition: ${l} -> ${c}`});let d=l;i.phases[d]&&(i.phases[d].status="complete",i.phases[d].completed_at=u),i.phases[c]&&i.phases[c].status==="not_started"&&(i.phases[c].status="in_progress",i.phases[c].started_at=u),G(s,i),Wa(t,r,o),(o.status==="complete"||o.current_stage==="complete")&&(i.phases.operations.status="complete",i.phases.operations.completed_at=u,G(s,i)),a.last_tracked_phase=c,ee(t,a);let p={discovery:"Discovery",inception:"Inception",construction:"Construction",operations:"Operations"},f=p[l]||l,m=p[c]||c,g=`Phase transition: ${f} \u2192 ${m}`;return c==="operations"&&(g+=`
2020
+ `);for(let r of n){let o=r.trim();/^[-*]\s+(CRITICAL|ISSUE|PROBLEM|MISSING|BUG|CONCERN):/i.test(o)&&t.push(o.replace(/^[-*]\s+/,"")),/\b(CRITICAL|MAJOR)\s+(ISSUE|PROBLEM|BUG|GAP)/i.test(o)&&o.length<200&&(t.includes(o)||t.push(o))}return t.slice(0,10)}var vw=new Map;function Jx(e){let n=(vw.get(e)||0)+1;return vw.set(e,n),n}Ut();Ut();Z();ce();Ba();var Rw=v(require("path"),1);function xw(){I({name:"planFileMonitor",event:"PostToolUse",priority:75,handler:async e=>{try{if(e.toolName!=="Write")return{continue:!0};if(!e.directory||!e.sessionId)return{continue:!0};if(!br(e.directory).enabled)return{continue:!0};let r=e.toolInput?.file_path;if(!r)return{continue:!0};let o=r.replace(/\\/g,"/");if(!o.includes(".olympus/plans/")||!o.endsWith(".md"))return{continue:!0};let s=Ew(e.directory,r,e.sessionId);if(!s)return{continue:!0};if(s.event_type==="plan_revised"&&s.revision_count&&s.revision_count>=2){let i=al(s,[`Plan revised ${s.revision_count} times - may indicate unclear requirements`],e.directory);i.summary&&i.details&&ue({...i,project_path:e.directory,session_id:e.sessionId,category:i.category||"planning_insight",summary:i.summary,details:i.details,agent_name:i.agent_name||"prometheus",confidence:i.confidence||.7,scope:"project"})}}catch(t){console.error("[Olympus Plan Lifecycle] Error in plan file monitor:",t)}return{continue:!0}}}),I({name:"momusReviewTracker",event:"PostToolUse",priority:76,handler:async e=>{try{if(e.toolName!=="Task")return{continue:!0};if(!e.directory||!e.sessionId)return{continue:!0};if(!br(e.directory).enabled)return{continue:!0};let n=e.toolInput;if(n?.subagent_type!=="momus")return{continue:!0};let o=e.toolOutput,s=typeof o=="string"?o:JSON.stringify(o||""),i=Tw(s);if(!i.passed&&i.issues.length>0){if(!i.issues.some(m=>m!=="Plan requires revision"&&m.length>10))return{continue:!0};let l=(n?.prompt||"").match(/\.olympus\/plans\/([\w-]+\.md)/),u=l?l[0]:"unknown-plan",d=l?l[1]:"unknown-plan",p={event_type:"plan_review_failed",plan_path:u,plan_summary:`Momus review failed with ${i.issues.length} issues`,failure_reasons:i.issues,reviewer:"momus",session_id:e.sessionId,timestamp:new Date().toISOString()},f=al(p,i.issues,e.directory);f.summary&&f.details&&ue({...f,project_path:e.directory,session_id:e.sessionId,category:"planning_insight",summary:f.summary,details:f.details,agent_name:"momus",confidence:.9,scope:"project"})}}catch(t){console.error("[Olympus Plan Lifecycle] Error in Momus review tracker:",t)}return{continue:!0}}}),I({name:"completePlanTracker",event:"UserPromptSubmit",priority:115,handler:async e=>{try{if(!e.directory||!e.sessionId)return{continue:!0};if(!br(e.directory).enabled)return{continue:!0};let n=e.prompt||"";if(!((e.parts||[]).map(a=>a.text||"").join(" ")||n).includes("[PLAN COMPLETION MODE - VERIFICATION REQUIRED]"))return{continue:!0};let i=Q(e.directory,e.sessionId);i.pending_completion||(i.pending_completion={claimed_at:new Date().toISOString(),task_description:"plan_completion_verification",agent_used:"complete-plan"},ee(e.directory,i))}catch(t){console.error("[Olympus Plan Lifecycle] Error in complete-plan tracker:",t)}return{continue:!0}}}),I({name:"prometheusLearningsInjection",event:"PreToolUse",priority:55,handler:async e=>{try{if(e.toolName!=="Task")return{continue:!0};if(!e.directory)return{continue:!0};if(e.toolInput?.subagent_type!=="prometheus")return{continue:!0};let o=Jo(e.directory,20).filter(i=>i.category==="planning_insight");if(o.length===0)return{continue:!0};let s=Cw(o.slice(0,5));if(s)return{continue:!0,hookSpecificOutput:{hookEventName:"PreToolUse",additionalContext:s}}}catch(t){console.error("[Olympus Plan Lifecycle] Error in Prometheus learnings injection:",t)}return{continue:!0}}}),I({name:"workflowPhaseTransitionTracker",event:"PostToolUse",priority:83,handler:async e=>{try{if(e.toolName!=="Write"&&e.toolName!=="Task")return{continue:!0};if(!e.directory||!e.sessionId)return{continue:!0};let t=e.directory,n=await oe(t),r=null,o=null;for(let u of n){let d=await A(t,u);if(d&&d.status!=="complete"&&d.status!=="archived"&&d.status!=="deferred"){r=u,o=d;break}}if(!r||!o)return{continue:!0};let s=Rw.join(t,"aidlc-docs",r,"manifest.json"),i=W(s);if(!i)return{continue:!0};let a=Q(t,e.sessionId),c=o.current_phase,l=a.last_tracked_phase;if(l&&l!==c){let u=new Date().toISOString();i.gate_audit.push({phase:c,timestamp:u,action:"approved",actor:"trust",reason:`Phase transition: ${l} -> ${c}`});let d=l;i.phases[d]&&(i.phases[d].status="complete",i.phases[d].completed_at=u),i.phases[c]&&i.phases[c].status==="not_started"&&(i.phases[c].status="in_progress",i.phases[c].started_at=u),G(s,i),Wa(t,r,o),(o.status==="complete"||o.current_stage==="complete")&&(i.phases.operations.status="complete",i.phases.operations.completed_at=u,G(s,i)),a.last_tracked_phase=c,ee(t,a);let p={discovery:"Discovery",inception:"Inception",construction:"Construction",operations:"Operations"},f=p[l]||l,m=p[c]||c,g=`Phase transition: ${f} \u2192 ${m}`;return c==="operations"&&(g+=`
2021
2021
  \u2192 Generating deployment artifacts...`),{continue:!0,hookSpecificOutput:{hookEventName:"PostToolUse",additionalContext:`<phase-transition>
2022
2022
  ${g}
2023
2023
  </phase-transition>`}}}if(l||(a.last_tracked_phase=c,ee(t,a)),o.status==="complete"&&i.phases.operations.status!=="complete"){let u=new Date().toISOString();return i.phases.operations.status="complete",i.phases.operations.completed_at=u,G(s,i),Wa(t,r,o),{continue:!0,hookSpecificOutput:{hookEventName:"PostToolUse",additionalContext:`<phase-transition>
@@ -2091,7 +2091,7 @@ Please revise the artifact to address the feedback above and re-submit for appro
2091
2091
 
2092
2092
  **Content Check Failures:**
2093
2093
  ${t.map(r=>`- ${r.name}: ${r.remediation??"No remediation provided."}`).join(`
2094
- `)}`}var Cr={inception:[{question:"Does the INTENT address all stated constraints?",answer:null,answered_by:null,passed:null},{question:"Does the INTENT solve the actual business problem?",answer:null,answered_by:null,passed:null},{question:"Are NFRs properly derived from INTENT constraints?",answer:null,answered_by:null,passed:null}],construction:[{question:"Do UNITS cover all INTENT acceptance criteria?",answer:null,answered_by:null,passed:null},{question:"Does DESIGN address all UNIT requirements?",answer:null,answered_by:null,passed:null},{question:"Does BUILD satisfy DESIGN contracts?",answer:null,answered_by:null,passed:null}],operations:[{question:"Does the deployment guide cover all components?",answer:null,answered_by:null,passed:null},{question:"Does the monitoring config capture key metrics?",answer:null,answered_by:null,passed:null}],gate3:[{question:"Do UNITs cover all INTENT acceptance criteria?",answer:null,answered_by:null,passed:null},{question:"Is the decomposition granularity appropriate?",answer:null,answered_by:null,passed:null}],gate4:[{question:"Does the BOLT implementation satisfy its acceptance criteria?",answer:null,answered_by:null,passed:null},{question:"Are all tests passing?",answer:null,answered_by:null,passed:null}]};async function Qs(e){try{let t=await oe(e);if(t.length===0)return null;let n=null;for(let r of t){let o=await I(e,r);if(!o||o.status==="complete")continue;let s=o.manifest_path||(0,Oe.join)(e,".olympus","workflow",r,"manifest.json");(!n||o.updated_at>n.updatedAt)&&(n={workflowId:r,checkpoint:o,manifestPath:s,updatedAt:o.updated_at})}return n?{workflowId:n.workflowId,checkpoint:n.checkpoint,manifestPath:n.manifestPath}:null}catch(t){return console.error("[Olympus Quality Gate] Failed to find active workflow:",t),null}}function cP(e,t){let n=e.current_phase;if(!n)return e.current_stage==="intent"||e.current_stage==="complete"?"inception":null;if(t){let r=t.phases[n];if(r&&r.status==="in_progress"&&(!r.gate_result||r.gate_result&&!r.gate_result.passed&&r.gate_result.approved_by===null))return r.gate_result&&r.gate_result.approved_by===null?null:n}return n==="inception"&&(e.current_stage==="intent"||e.current_stage==="complete")?"inception":n==="construction"&&e.current_stage==="unit"||n==="construction"&&e.current_stage==="code-generation"&&e.active_code_plan_path?"construction":n==="operations"?"operations":null}function lP(e){try{let t=(0,Oe.join)(e,".olympus","config.json");if(Xs.existsSync(t)){let n=Xs.readJsonSync(t);if(n?.workflow?.qualityGates?.enabled===!1||n?.hooks?.qualityGate?.enabled===!1)return!0}}catch{}return!1}function hl(e){for(let t of["discovery","inception","construction","operations"]){let n=e.phases[t];if(n.gate_result&&!n.gate_result.passed&&n.gate_result.approved_by===null)return t}return null}function uP(e,t){return e==="inception"?t==="intent"?2:1:e==="construction"?t==="code-generation"?4:3:e==="operations"?5:1}function dP(e){return e.prompt?e.prompt:e.message?.content?e.message.content:e.parts?e.parts.filter(t=>t.type==="text"&&t.text).map(t=>t.text).join(" "):""}async function pP(e){try{if(e.toolName!=="Task")return{continue:!0};if(!e.directory||!e.sessionId)return{continue:!0};let t=await Qs(e.directory);if(!t)return{continue:!0};let{workflowId:n,checkpoint:r,manifestPath:o}=t,s=W(o);if(!s)return console.error("[Olympus Quality Gate] Manifest corrupted or missing - failing open"),{continue:!0};let i=cP(r,s);if(!i)return{continue:!0};let a=Ee(e.directory),c=(typeof r.risk_tier=="number"?r.risk_tier:r.risk_tier?.tier)||s.risk_tier?.tier||2;if(c===3&&i==="inception"&&!s.artifacts.some(_=>_.type?.toLowerCase().includes("momus")||_.type?.toLowerCase()==="momus-review"))return s.phases[i].gate_result={passed:!1,approved_by:null,approved_at:null,feedback:"Momus review required for Risk Tier 3",verification:{conformance_score:0,coverage_percentage:0,missing_items:["Momus review artifact missing"],passed:!1},validation:{alignment_score:0,alignment_questions:[],passed:!1}},G(o,s),await P(e.directory,r),{continue:!0,hookSpecificOutput:{hookEventName:"PostToolUse",additionalContext:`[BLOCKING - Acknowledgment Required] BLOCKED: Risk Tier 3 requires Momus review before INTENT approval. Run /review to invoke Momus.
2094
+ `)}`}var Cr={inception:[{question:"Does the INTENT address all stated constraints?",answer:null,answered_by:null,passed:null},{question:"Does the INTENT solve the actual business problem?",answer:null,answered_by:null,passed:null},{question:"Are NFRs properly derived from INTENT constraints?",answer:null,answered_by:null,passed:null}],construction:[{question:"Do UNITS cover all INTENT acceptance criteria?",answer:null,answered_by:null,passed:null},{question:"Does DESIGN address all UNIT requirements?",answer:null,answered_by:null,passed:null},{question:"Does BUILD satisfy DESIGN contracts?",answer:null,answered_by:null,passed:null}],operations:[{question:"Does the deployment guide cover all components?",answer:null,answered_by:null,passed:null},{question:"Does the monitoring config capture key metrics?",answer:null,answered_by:null,passed:null}],gate3:[{question:"Do UNITs cover all INTENT acceptance criteria?",answer:null,answered_by:null,passed:null},{question:"Is the decomposition granularity appropriate?",answer:null,answered_by:null,passed:null}],gate4:[{question:"Does the BOLT implementation satisfy its acceptance criteria?",answer:null,answered_by:null,passed:null},{question:"Are all tests passing?",answer:null,answered_by:null,passed:null}]};async function Qs(e){try{let t=await oe(e);if(t.length===0)return null;let n=null;for(let r of t){let o=await A(e,r);if(!o||o.status==="complete")continue;let s=o.manifest_path||(0,Oe.join)(e,".olympus","workflow",r,"manifest.json");(!n||o.updated_at>n.updatedAt)&&(n={workflowId:r,checkpoint:o,manifestPath:s,updatedAt:o.updated_at})}return n?{workflowId:n.workflowId,checkpoint:n.checkpoint,manifestPath:n.manifestPath}:null}catch(t){return console.error("[Olympus Quality Gate] Failed to find active workflow:",t),null}}function cP(e,t){let n=e.current_phase;if(!n)return e.current_stage==="intent"||e.current_stage==="complete"?"inception":null;if(t){let r=t.phases[n];if(r&&r.status==="in_progress"&&(!r.gate_result||r.gate_result&&!r.gate_result.passed&&r.gate_result.approved_by===null))return r.gate_result&&r.gate_result.approved_by===null?null:n}return n==="inception"&&(e.current_stage==="intent"||e.current_stage==="complete")?"inception":n==="construction"&&e.current_stage==="unit"||n==="construction"&&e.current_stage==="code-generation"&&e.active_code_plan_path?"construction":n==="operations"?"operations":null}function lP(e){try{let t=(0,Oe.join)(e,".olympus","config.json");if(Xs.existsSync(t)){let n=Xs.readJsonSync(t);if(n?.workflow?.qualityGates?.enabled===!1||n?.hooks?.qualityGate?.enabled===!1)return!0}}catch{}return!1}function hl(e){for(let t of["discovery","inception","construction","operations"]){let n=e.phases[t];if(n.gate_result&&!n.gate_result.passed&&n.gate_result.approved_by===null)return t}return null}function uP(e,t){return e==="inception"?t==="intent"?2:1:e==="construction"?t==="code-generation"?4:3:e==="operations"?5:1}function dP(e){return e.prompt?e.prompt:e.message?.content?e.message.content:e.parts?e.parts.filter(t=>t.type==="text"&&t.text).map(t=>t.text).join(" "):""}async function pP(e){try{if(e.toolName!=="Task")return{continue:!0};if(!e.directory||!e.sessionId)return{continue:!0};let t=await Qs(e.directory);if(!t)return{continue:!0};let{workflowId:n,checkpoint:r,manifestPath:o}=t,s=W(o);if(!s)return console.error("[Olympus Quality Gate] Manifest corrupted or missing - failing open"),{continue:!0};let i=cP(r,s);if(!i)return{continue:!0};let a=Ee(e.directory),c=(typeof r.risk_tier=="number"?r.risk_tier:r.risk_tier?.tier)||s.risk_tier?.tier||2;if(c===3&&i==="inception"&&!s.artifacts.some(_=>_.type?.toLowerCase().includes("momus")||_.type?.toLowerCase()==="momus-review"))return s.phases[i].gate_result={passed:!1,approved_by:null,approved_at:null,feedback:"Momus review required for Risk Tier 3",verification:{conformance_score:0,coverage_percentage:0,missing_items:["Momus review artifact missing"],passed:!1},validation:{alignment_score:0,alignment_questions:[],passed:!1}},G(o,s),await P(e.directory,r),{continue:!0,hookSpecificOutput:{hookEventName:"PostToolUse",additionalContext:`[BLOCKING - Acknowledgment Required] BLOCKED: Risk Tier 3 requires Momus review before INTENT approval. Run /review to invoke Momus.
2095
2095
 
2096
2096
  [GATE_PENDING]`}};if(i==="construction"&&r.current_stage==="unit"){if(cl(a.current_level,c)==="auto-advance"&&c!==3){je(o,{phase:"construction",action:"approved",actor:"trust",reason:`Gate 3 auto-advanced by Trust Level ${a.current_level} for Tier ${c}`});let R=new Date().toISOString();s.phases.construction.gate_result={passed:!0,approved_by:"trust",approved_at:R,feedback:null,verification:{conformance_score:100,coverage_percentage:100,missing_items:[],passed:!0},validation:{alignment_score:100,alignment_questions:[],passed:!0}};for(let O of s.artifacts)O.stage==="unit"&&(O.reviewedBy="auto-approved");G(o,s),await P(e.directory,r);try{let O={type:"gate_approval",phase:"construction",stage:"unit",details:`Gate 3 auto-advanced by Trust Level ${a.current_level} for Tier ${c}`},C={workflowId:n,featureName:r.feature_name||n,projectPath:e.directory,sessionId:e.sessionId||"unknown",phase:"construction"},$=Ve(O,C);ue($)}catch(O){console.error("[Olympus Quality Gate] Failed to capture Gate 3 auto-advance discovery:",O)}return{continue:!0}}let _;try{let R=(0,Oe.join)(e.directory,"aidlc-docs",n,"inception"),O=(0,Rr.readFileSync)((0,Oe.join)(R,"intent.md"),"utf-8"),C=s.artifacts.filter(x=>x.stage==="unit"),$=C.length>0?(0,Rr.readFileSync)((0,Oe.join)(e.directory,C[0].path),"utf-8"):"",D=Qn($,O,O,"intent-to-unit","unit-to-intent","intent",C[0]?.id||"unit","intent");_={conformance_score:D.parentCheck.verification.conformance_score,coverage_percentage:D.parentCheck.verification.coverage_percentage,missing_items:D.parentCheck.verification.missing_items,passed:D.passed}}catch{_={conformance_score:0,coverage_percentage:0,missing_items:["Could not read construction artifacts for alignment check"],passed:!1}}let h=Cr.gate3||[],b={alignment_score:0,alignment_questions:h,passed:!1},T=Pw(s,a.current_level).map(R=>R.reviewContent).join(`
2097
2097
 
@@ -2146,8 +2146,8 @@ Type "approve" to proceed or "reject <reason>" to block.${p}${gl(f.content_check
2146
2146
 
2147
2147
  [GATE_PENDING]`}}}catch(t){return console.error("[Olympus Quality Gate] Error in qualityGateBlocker:",t),{continue:!0}}}async function fP(e){try{let t=dP(e);if(!e.directory)return{continue:!0};if(t.includes("--no-gates")||lP(e.directory)){let n=await Qs(e.directory);if(n){let{manifestPath:r}=n,o=W(r);if(o){let s=hl(o);if(s){let i=t.includes("--no-gates")?"flag":"config";je(r,{phase:s,action:"bypassed",actor:i,reason:i==="flag"?"--no-gates flag detected":"Quality gates disabled in config"}),o.phases[s].gate_result=null,o.phases[s].gate_bypassed=!0,o.phases[s].bypass_reason=i==="flag"?"--no-gates flag":"Config disabled",G(r,o),await P(e.directory,n.checkpoint)}}}return{continue:!0}}if(t.trim().toLowerCase().startsWith("approve")){let n=await Qs(e.directory);if(!n)return{continue:!0};let{manifestPath:r}=n,o=W(r);if(!o)return{continue:!0};let s=hl(o);if(!s)return{continue:!0};let i=new Date().toISOString();o.phases[s].gate_result&&(o.phases[s].gate_result.passed=!0,o.phases[s].gate_result.approved_by="human",o.phases[s].gate_result.approved_at=i);let{checkpoint:a}=n;if(s==="construction"){if(a.current_stage==="code-generation"&&a.active_code_plan_path){let p=a.active_code_plan_path;bt(r,p,"fulfilled");let f=o.artifacts.find(m=>m.id===p);f&&(f.reviewedBy="human");try{let m=ul(o,p);if(m){let g=pl(e.directory,n.workflowId,m),y=(typeof a.risk_tier=="number"?a.risk_tier:a.risk_tier?.tier)||o.risk_tier?.tier||2;dl(g,m,{boltId:p,boltTitle:f?.type||p,commandsExecuted:[],testResults:[],filesChanged:[],gateApprovedBy:"human",dualValidation:{parentConformance:o.phases.construction.gate_result?.verification?.conformance_score??0,rootConformance:0},riskTier:y})}}catch(m){console.error("[Olympus Quality Gate] Failed to generate validation report:",m)}try{let{isWorkflowComplete:m}=await Promise.resolve().then(()=>(Z(),vn)),g=W(r);g&&m(g)&&(a.current_phase="operations",a.current_stage="code-generation",Ft(r,"construction","complete"),Ft(r,"operations","in_progress"),await P(e.directory,a),console.log("[Olympus Quality Gate] All BOLTs fulfilled \u2014 auto-transitioning to Operations phase"))}catch(m){console.error("[Olympus Quality Gate] Failed to check workflow completion:",m)}}else if(a.current_stage==="unit"){let p=o.artifacts.filter(f=>f.stage==="unit");for(let f of p)bt(r,f.id,"active"),f.reviewedBy="human"}}else{let p=o.artifacts.filter(f=>f.phase===s);for(let f of p)bt(r,f.id,"active")}je(r,{phase:s,action:"approved",actor:"human",reason:null,content_checks:o.phases[s].gate_result?.content_checks});try{let p={type:"gate_approval",phase:s,stage:a.current_stage,details:`Gate approved for ${s} phase`},f={workflowId:n.workflowId,featureName:a.feature_name||n.workflowId,projectPath:e.directory,sessionId:e.sessionId||"unknown",phase:s},m=Ve(p,f);ue(m)}catch(p){console.error("[Olympus Quality Gate] Failed to capture gate approval discovery:",p)}let c=Ee(e.directory),l=ma(c,!0,!1);fa(l,e.directory),G(r,o),await P(e.directory,n.checkpoint),o.phases[s].gate_result?.passed&&(o.phases[s].gate_result=null,G(r,o));let u="",d=n.checkpoint.depth_score;return d&&d<=10?u=" SHALLOW depth: Skip UNIT decomposition, proceed directly to single BOLT generation.":d&&d>=21&&(u=" DEEP depth: Full UNIT + BOLT decomposition with design artifacts required."),{continue:!0,hookSpecificOutput:{hookEventName:"UserPromptSubmit",additionalContext:`Gate approved. Phase ${s} transition approved. Proceeding to next phase.${u}`}}}if(t.trim().toLowerCase().startsWith("reject")){let n=await Qs(e.directory);if(!n)return{continue:!0};let{manifestPath:r}=n,o=W(r);if(!o)return{continue:!0};let s=hl(o);if(!s)return{continue:!0};let i=t.trim().substring(6).trim()||"No reason provided";o.phases[s].gate_result&&(o.phases[s].gate_result.passed=!1,o.phases[s].gate_result.feedback=i);let{checkpoint:a}=n,c="";if(s==="construction")if(a.current_stage==="code-generation"&&a.active_code_plan_path){let g=a.active_code_plan_path;bt(r,g,"violated",i),c=`The reviewer rejected ${g}: ${i}. Revise and re-submit.`}else if(a.current_stage==="unit"){let g=o.artifacts.filter(y=>y.stage==="unit");for(let y of g)bt(r,y.id,"violated",i);c=`The reviewer rejected UNIT decomposition: ${i}. Revise and re-submit.`}else{let g=o.artifacts.filter(y=>y.phase===s);for(let y of g)bt(r,y.id,"violated",i)}else{let g=o.artifacts.filter(y=>y.phase===s);for(let y of g)bt(r,y.id,"violated",i)}je(r,{phase:s,action:"rejected",actor:"human",reason:i,content_checks:o.phases[s].gate_result?.content_checks});try{let g={type:"gate_rejection",phase:s,stage:a.current_stage,details:i},y={workflowId:n.workflowId,featureName:a.feature_name||n.workflowId,projectPath:e.directory,sessionId:e.sessionId||"unknown",phase:s},w=Ve(g,y);ue(w)}catch(g){console.error("[Olympus Quality Gate] Failed to capture gate rejection discovery:",g)}let l=Ee(e.directory),u=ma(l,!1,!0);fa(u,e.directory),G(r,o),await P(e.directory,n.checkpoint);let d=uP(s,a.current_stage),p=s==="construction"&&a.current_stage==="code-generation"&&a.active_code_plan_path?a.active_code_plan_path:o.artifacts.find(g=>g.phase===s)?.id??`${s}-artifact`,f=o.gate_audit.filter(g=>g.phase===s&&g.action==="rejected").length,m;try{let g=await Ow(e.directory,o.workflow_id,{gateNumber:d,artifactId:p,rejectionReason:i,rejectedBy:"human",attemptNumber:f+1});m=`Gate ${d} rejected ${p}: ${i}.
2148
2148
 
2149
- ${g.prompt}`}catch{m=c||`Gate rejected. Reason: ${i}. Revise artifacts before retrying.`}return{continue:!0,hookSpecificOutput:{hookEventName:"UserPromptSubmit",additionalContext:m}}}return{continue:!0}}catch(t){return console.error("[Olympus Quality Gate] Error in qualityGateApprover:",t),{continue:!0}}}function Nw(){A({name:"qualityGateBlocker",event:"PostToolUse",priority:80,matcher:"task",handler:pP}),A({name:"qualityGateApprover",event:"UserPromptSubmit",priority:12,handler:fP})}var mP=["explore","explore-medium","librarian","librarian-low","oracle","oracle-low","oracle-medium","momus","metis","multimodal-looker"];function jw(e){return mP.includes(e)}var Fw=/(?:^|\s|&&|\|\||;)(?:>|>>|rm\s|mv\s|cp\s|mkdir\s|rmdir\s|touch\s|npm\s+install|pip\s+install|cargo\s+add|tee\s|dd\s|install\s|sed\s+-i|awk\s+-i|chmod\s|chown\s)/,Zs={debounceMs:1e4,mode:"soft",enabled:!0};Be();function Mw(){A({name:"agentRoleGuard",event:"PreToolUse",priority:5,matcher:"write|edit|multiedit|bash",handler:async e=>{try{if(!e.directory||!e.sessionId)return{continue:!0};let n=Q(e.directory,e.sessionId).pending_completion?.agent_used;if(!n)return{continue:!0};if(!jw(n))return{continue:!0};let r=e.toolName;if(r==="write"||r==="edit"||r==="multiedit")return{continue:!1,stopReason:`Agent "${n}" is read-only and cannot perform ${r} operations. Use an agent like "olympian" or "frontend-engineer" for file modifications.`};if(r==="bash"){let s=e.toolInput?.command;if(typeof s=="string"&&Fw.test(s))return{continue:!1,stopReason:`Agent "${n}" is read-only and cannot execute bash commands that modify files. Detected write operation in: ${s.substring(0,100)}${s.length>100?"...":""}`}}return{continue:!0}}catch(t){return console.error("[Olympus Agent Role Guard] Error in handler:",t),{continue:!0}}}})}var ei=require("child_process"),ti=require("path"),xr=require("fs"),Lw=0,mn=null,gn=null;function Uw(e){let t=(0,ti.join)(e,".olympus","config.json"),n={enabled:Zs.enabled,mode:Zs.mode,debounceMs:Zs.debounceMs};try{if((0,xr.existsSync)(t)){let r=(0,xr.readFileSync)(t,"utf8"),o=JSON.parse(r);if(o.hooks?.buildCheck){let s=o.hooks.buildCheck;typeof s.enabled=="boolean"&&(n.enabled=s.enabled),(s.mode==="soft"||s.mode==="strict")&&(n.mode=s.mode),typeof s.debounceMs=="number"&&s.debounceMs>0&&(n.debounceMs=s.debounceMs)}}}catch(r){console.error("[Olympus Build Check] Failed to load config:",r)}return n}function gP(e){let t=(0,ti.join)(e,"node_modules",".bin","tsc"),n=process.platform==="win32"?`${t}.cmd`:t;if((0,xr.existsSync)(n))return n;try{let r=process.platform==="win32"?"where":"which",s=require("child_process").execSync(`${r} tsc`,{encoding:"utf8"}).trim().split(`
2150
- `)[0];if(s)return s}catch{}return null}function hP(){if(!gn||!gn.pid)return;let e=gn.pid;try{gn.kill("SIGTERM")}catch{if(process.platform==="win32")try{(0,ei.exec)(`taskkill /PID ${e} /F`,n=>{n&&console.error("[Olympus Build Check] Failed to kill process with taskkill:",n)})}catch{}}gn=null}function Ww(){A({name:"buildCheckTrigger",event:"PostToolUse",priority:65,matcher:/write|edit|multiedit/i,handler:async e=>{try{if(!e.directory)return{continue:!0};let t=Uw(e.directory);if(!t.enabled)return{continue:!0};let n=Date.now();if(n-Lw<t.debounceMs)return{continue:!0};let r=(0,ti.join)(e.directory,"tsconfig.json");if(!(0,xr.existsSync)(r))return{continue:!0};let o=gP(e.directory);if(!o)return{continue:!0};hP();try{let s=(0,ei.spawn)(o,["--noEmit"],{cwd:e.directory,detached:!0,stdio:"pipe"});gn=s,Lw=n;let i="",a="";s.stdout&&s.stdout.on("data",c=>{i+=c.toString()}),s.stderr&&s.stderr.on("data",c=>{a+=c.toString()}),s.on("exit",c=>{let l=(i+a).trim();mn={passed:c===0,output:l,timestamp:Date.now()},gn=null}),s.on("error",c=>{console.error("[Olympus Build Check] tsc spawn error:",c),gn=null})}catch(s){console.error("[Olympus Build Check] Failed to spawn tsc:",s)}}catch(t){console.error("[Olympus Build Check] Error in buildCheckTrigger:",t)}return{continue:!0}}}),A({name:"buildCheckInjector",event:"PostToolUse",priority:66,handler:async e=>{try{if(!mn)return{continue:!0};let t=e.directory?Uw(e.directory):{mode:"soft"};if(mn.passed)return mn=null,{continue:!0};let n=mn.output.length>500?mn.output.substring(0,500)+`
2149
+ ${g.prompt}`}catch{m=c||`Gate rejected. Reason: ${i}. Revise artifacts before retrying.`}return{continue:!0,hookSpecificOutput:{hookEventName:"UserPromptSubmit",additionalContext:m}}}return{continue:!0}}catch(t){return console.error("[Olympus Quality Gate] Error in qualityGateApprover:",t),{continue:!0}}}function Nw(){I({name:"qualityGateBlocker",event:"PostToolUse",priority:80,matcher:"task",handler:pP}),I({name:"qualityGateApprover",event:"UserPromptSubmit",priority:12,handler:fP})}var mP=["explore","explore-medium","librarian","librarian-low","oracle","oracle-low","oracle-medium","momus","metis","multimodal-looker"];function jw(e){return mP.includes(e)}var Fw=/(?:^|\s|&&|\|\||;)(?:>|>>|rm\s|mv\s|cp\s|mkdir\s|rmdir\s|touch\s|npm\s+install|pip\s+install|cargo\s+add|tee\s|dd\s|install\s|sed\s+-i|awk\s+-i|chmod\s|chown\s)/,Zs={debounceMs:1e4,mode:"soft",enabled:!0};Be();function Mw(){I({name:"agentRoleGuard",event:"PreToolUse",priority:5,matcher:"write|edit|multiedit|bash",handler:async e=>{try{if(!e.directory||!e.sessionId)return{continue:!0};let n=Q(e.directory,e.sessionId).pending_completion?.agent_used;if(!n)return{continue:!0};if(!jw(n))return{continue:!0};let r=e.toolName;if(r==="write"||r==="edit"||r==="multiedit")return{continue:!1,stopReason:`Agent "${n}" is read-only and cannot perform ${r} operations. Use an agent like "olympian" or "frontend-engineer" for file modifications.`};if(r==="bash"){let s=e.toolInput?.command;if(typeof s=="string"&&Fw.test(s))return{continue:!1,stopReason:`Agent "${n}" is read-only and cannot execute bash commands that modify files. Detected write operation in: ${s.substring(0,100)}${s.length>100?"...":""}`}}return{continue:!0}}catch(t){return console.error("[Olympus Agent Role Guard] Error in handler:",t),{continue:!0}}}})}var ei=require("child_process"),ti=require("path"),xr=require("fs"),Lw=0,mn=null,gn=null;function Uw(e){let t=(0,ti.join)(e,".olympus","config.json"),n={enabled:Zs.enabled,mode:Zs.mode,debounceMs:Zs.debounceMs};try{if((0,xr.existsSync)(t)){let r=(0,xr.readFileSync)(t,"utf8"),o=JSON.parse(r);if(o.hooks?.buildCheck){let s=o.hooks.buildCheck;typeof s.enabled=="boolean"&&(n.enabled=s.enabled),(s.mode==="soft"||s.mode==="strict")&&(n.mode=s.mode),typeof s.debounceMs=="number"&&s.debounceMs>0&&(n.debounceMs=s.debounceMs)}}}catch(r){console.error("[Olympus Build Check] Failed to load config:",r)}return n}function gP(e){let t=(0,ti.join)(e,"node_modules",".bin","tsc"),n=process.platform==="win32"?`${t}.cmd`:t;if((0,xr.existsSync)(n))return n;try{let r=process.platform==="win32"?"where":"which",s=require("child_process").execSync(`${r} tsc`,{encoding:"utf8"}).trim().split(`
2150
+ `)[0];if(s)return s}catch{}return null}function hP(){if(!gn||!gn.pid)return;let e=gn.pid;try{gn.kill("SIGTERM")}catch{if(process.platform==="win32")try{(0,ei.exec)(`taskkill /PID ${e} /F`,n=>{n&&console.error("[Olympus Build Check] Failed to kill process with taskkill:",n)})}catch{}}gn=null}function Ww(){I({name:"buildCheckTrigger",event:"PostToolUse",priority:65,matcher:/write|edit|multiedit/i,handler:async e=>{try{if(!e.directory)return{continue:!0};let t=Uw(e.directory);if(!t.enabled)return{continue:!0};let n=Date.now();if(n-Lw<t.debounceMs)return{continue:!0};let r=(0,ti.join)(e.directory,"tsconfig.json");if(!(0,xr.existsSync)(r))return{continue:!0};let o=gP(e.directory);if(!o)return{continue:!0};hP();try{let s=(0,ei.spawn)(o,["--noEmit"],{cwd:e.directory,detached:!0,stdio:"pipe"});gn=s,Lw=n;let i="",a="";s.stdout&&s.stdout.on("data",c=>{i+=c.toString()}),s.stderr&&s.stderr.on("data",c=>{a+=c.toString()}),s.on("exit",c=>{let l=(i+a).trim();mn={passed:c===0,output:l,timestamp:Date.now()},gn=null}),s.on("error",c=>{console.error("[Olympus Build Check] tsc spawn error:",c),gn=null})}catch(s){console.error("[Olympus Build Check] Failed to spawn tsc:",s)}}catch(t){console.error("[Olympus Build Check] Error in buildCheckTrigger:",t)}return{continue:!0}}}),I({name:"buildCheckInjector",event:"PostToolUse",priority:66,handler:async e=>{try{if(!mn)return{continue:!0};let t=e.directory?Uw(e.directory):{mode:"soft"};if(mn.passed)return mn=null,{continue:!0};let n=mn.output.length>500?mn.output.substring(0,500)+`
2151
2151
  ... (truncated)`:mn.output,r=t.mode==="strict"?`[BUILD CHECK FAILED - BLOCKING]
2152
2152
 
2153
2153
  TypeScript compilation failed:
@@ -2160,7 +2160,7 @@ TypeScript compilation failed:
2160
2160
 
2161
2161
  ${n}
2162
2162
 
2163
- Consider fixing these errors.`;return mn=null,t.mode==="strict"?{continue:!1,stopReason:"Build check failed (strict mode)",hookSpecificOutput:{hookEventName:"PostToolUse",additionalContext:r}}:{continue:!0,hookSpecificOutput:{hookEventName:"PostToolUse",additionalContext:r}}}catch(t){console.error("[Olympus Build Check] Error in buildCheckInjector:",t)}return{continue:!0}}})}Be();ce();Z();var Pr=require("path"),Ar=require("fs"),yP={prometheus:"inception"};async function wP(e){try{let t=await oe(e);if(t.length===0)return null;let n=null;for(let r of t){let o=await I(e,r);!o||o.status==="complete"||(!n||o.updated_at>n.updatedAt)&&(n={workflowId:r,checkpoint:o,updatedAt:o.updated_at})}return n?{workflowId:n.workflowId,checkpoint:n.checkpoint}:null}catch(t){return console.error("[Olympus Artifact Gate] Failed to find active workflow:",t),null}}function _P(e,t){let n=(0,Pr.join)(e,"inception"),r=e;switch(t){case"intent":{let o=(0,Pr.join)(n,"intent.md"),s=(0,Pr.join)(r,"intent.md"),i=(0,Ar.existsSync)(o)?o:s;return(0,Ar.existsSync)(i)?{artifactPath:i,referencePaths:[]}:null}default:return null}}async function kP(e,t,n){try{switch(e){case"intent":return await Bo(t);default:return null}}catch(r){return console.error(`[Olympus Artifact Gate] Validation error for ${e}:`,r),null}}function SP(e,t){let n=e.toUpperCase();if(t.passed)return`[Artifact Validation] ${n} validation PASSED (${t.coverage_percentage}% coverage). Good work!`;let r=t.blocking_issues.map((o,s)=>` ${s+1}. ${o}`).join(`
2163
+ Consider fixing these errors.`;return mn=null,t.mode==="strict"?{continue:!1,stopReason:"Build check failed (strict mode)",hookSpecificOutput:{hookEventName:"PostToolUse",additionalContext:r}}:{continue:!0,hookSpecificOutput:{hookEventName:"PostToolUse",additionalContext:r}}}catch(t){console.error("[Olympus Build Check] Error in buildCheckInjector:",t)}return{continue:!0}}})}Be();ce();Z();var Pr=require("path"),Ar=require("fs"),yP={prometheus:"inception"};async function wP(e){try{let t=await oe(e);if(t.length===0)return null;let n=null;for(let r of t){let o=await A(e,r);!o||o.status==="complete"||(!n||o.updated_at>n.updatedAt)&&(n={workflowId:r,checkpoint:o,updatedAt:o.updated_at})}return n?{workflowId:n.workflowId,checkpoint:n.checkpoint}:null}catch(t){return console.error("[Olympus Artifact Gate] Failed to find active workflow:",t),null}}function _P(e,t){let n=(0,Pr.join)(e,"inception"),r=e;switch(t){case"intent":{let o=(0,Pr.join)(n,"intent.md"),s=(0,Pr.join)(r,"intent.md"),i=(0,Ar.existsSync)(o)?o:s;return(0,Ar.existsSync)(i)?{artifactPath:i,referencePaths:[]}:null}default:return null}}async function kP(e,t,n){try{switch(e){case"intent":return await Bo(t);default:return null}}catch(r){return console.error(`[Olympus Artifact Gate] Validation error for ${e}:`,r),null}}function SP(e,t){let n=e.toUpperCase();if(t.passed)return`[Artifact Validation] ${n} validation PASSED (${t.coverage_percentage}% coverage). Good work!`;let r=t.blocking_issues.map((o,s)=>` ${s+1}. ${o}`).join(`
2164
2164
  `);return`[Artifact Validation] WARNING: ${n} validation FAILED (${t.coverage_percentage}% coverage)
2165
2165
 
2166
2166
  Blocking issues:
@@ -2169,7 +2169,7 @@ ${r}
2169
2169
  ${t.reviewer?`Reviewer: ${t.reviewer}
2170
2170
  `:""}Please review and address these issues before proceeding to the next stage.`}async function vP(e){try{if(e.toolName!=="Task")return{continue:!0};if(!e.directory||!e.sessionId)return{continue:!0};let n=Q(e.directory,e.sessionId).pending_completion?.agent_used;if(!n)return{continue:!0};if(!yP[n])return{continue:!0};let o=await wP(e.directory);if(!o)return{continue:!0};let{workflowId:s,checkpoint:i}=o,a="intent",c=(0,Pr.join)(e.directory,"aidlc-docs",s);if(!(0,Ar.existsSync)(c))return console.error("[Olympus Artifact Gate] Workflow directory not found:",c),{continue:!0};let l=_P(c,a);if(!l)return console.error(`[Olympus Artifact Gate] Could not find artifact paths for ${a} in ${c}`),{continue:!0};let u=await kP(a,l.artifactPath,l.referencePaths);if(!u)return console.error(`[Olympus Artifact Gate] Validation failed to run for ${a}`),{continue:!0};let d=SP(a,u);if(a==="intent"&&u.passed)try{let p=(0,Ar.readFileSync)(l.artifactPath,"utf-8"),f=ws(p),m=i.manifest_path||(0,Pr.join)(e.directory,"aidlc-docs",s,"manifest.json"),g=W(m);g&&(g.depth_assessment=f,g.risk_tier=f.risk_tier,G(m,g)),i.depth_score=f.total_score,i.risk_tier=f.risk_tier.tier,await P(e.directory,i);let y=f.recommended_depth==="minimal"?"SHALLOW":f.recommended_depth==="standard"?"MEDIUM":"DEEP";d+=`
2171
2171
 
2172
- [Depth Assessment] Score: ${f.total_score}/30 \u2192 ${y} | Risk Tier: ${f.risk_tier.tier}`}catch(p){console.error("[Olympus Artifact Gate] Failed to assess depth after INTENT validation:",p)}return{continue:!0,hookSpecificOutput:{hookEventName:"PostToolUse",additionalContext:d}}}catch(t){return console.error("[Olympus Artifact Gate] Error in workflowArtifactGateHandler:",t),{continue:!0}}}function Bw(){A({name:"workflowArtifactGate",event:"PostToolUse",priority:78,matcher:"task",handler:vP})}ce();Z();var Ln=v(X(),1),ni=require("path"),Gw=require("child_process");function Hw(e){let t=(0,ni.join)(e,".olympus","config.json");try{if(Ln.existsSync(t)){let n=Ln.readJsonSync(t);if(n?.ciChecks)return{staticQuality:{enabled:n.ciChecks.staticQuality?.enabled!==!1,commands:n.ciChecks.staticQuality?.commands},security:{enabled:n.ciChecks.security?.enabled!==!1,auditLevel:n.ciChecks.security?.auditLevel||"moderate"},complexity:{enabled:n.ciChecks.complexity?.enabled!==!1,agent:n.ciChecks.complexity?.agent||"oracle-low"},customChecks:n.ciChecks.customChecks||[]}}}catch{}return bP()}function bP(){return{staticQuality:{enabled:!0},security:{enabled:!0,auditLevel:"moderate"},complexity:{enabled:!0,agent:"oracle-low"},customChecks:[]}}function EP(e){let t=[];try{let n=(0,ni.join)(e,"package.json");if(Ln.existsSync(n)){let o=Ln.readJsonSync(n)?.scripts||{};o.lint&&t.push("npm run lint"),o.typecheck&&t.push("npm run typecheck"),o.test&&t.push("npm test"),!o.typecheck&&Ln.existsSync((0,ni.join)(e,"tsconfig.json"))&&t.push("npx tsc --noEmit")}}catch{}return t}function yl(e,t,n,r){let o=Date.now();try{let s=(0,Gw.execSync)(e,{cwd:t,timeout:12e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]});return{name:n,layer:r,passed:!0,command:e,exitCode:0,stdout:(s||"").substring(0,2e3),stderr:"",duration_ms:Date.now()-o}}catch(s){return{name:n,layer:r,passed:!1,command:e,exitCode:s.status||1,stdout:(s.stdout||"").substring(0,2e3),stderr:(s.stderr||"").substring(0,2e3),duration_ms:Date.now()-o}}}function qw(e,t){let n=[],r=Date.now();if(t.staticQuality.enabled){let s=t.staticQuality.commands||EP(e);for(let i of s)n.push(yl(i,e,`Static: ${i}`,"static-quality"))}if(t.security.enabled){let s=t.security.auditLevel||"moderate";n.push(yl(`npm audit --audit-level=${s}`,e,"Security: npm audit","security"))}if(t.complexity.enabled&&n.push({name:"Complexity: AI review",layer:"complexity",passed:!0,command:`dispatch ${t.complexity.agent||"oracle-low"}`,exitCode:0,stdout:"AI complexity review dispatched",stderr:"",duration_ms:0}),t.customChecks)for(let s of t.customChecks)n.push(yl(s.command,e,`Custom: ${s.name}`,"custom"));let o=n.filter(s=>!s.passed).map(s=>s.name);return{allPassed:o.length===0,results:n,totalDuration_ms:Date.now()-r,failedChecks:o}}function Vw(e){let t=e.allPassed?"CI Review Pipeline: ALL CHECKS PASSED":`CI Review Pipeline: ${e.failedChecks.length} CHECK(S) FAILED`,n=e.results.map(r=>{let s=`[${r.passed?"PASS":"FAIL"}] ${r.name}`;return r.passed||(s+=`
2172
+ [Depth Assessment] Score: ${f.total_score}/30 \u2192 ${y} | Risk Tier: ${f.risk_tier.tier}`}catch(p){console.error("[Olympus Artifact Gate] Failed to assess depth after INTENT validation:",p)}return{continue:!0,hookSpecificOutput:{hookEventName:"PostToolUse",additionalContext:d}}}catch(t){return console.error("[Olympus Artifact Gate] Error in workflowArtifactGateHandler:",t),{continue:!0}}}function Bw(){I({name:"workflowArtifactGate",event:"PostToolUse",priority:78,matcher:"task",handler:vP})}ce();Z();var Ln=v(X(),1),ni=require("path"),Gw=require("child_process");function Hw(e){let t=(0,ni.join)(e,".olympus","config.json");try{if(Ln.existsSync(t)){let n=Ln.readJsonSync(t);if(n?.ciChecks)return{staticQuality:{enabled:n.ciChecks.staticQuality?.enabled!==!1,commands:n.ciChecks.staticQuality?.commands},security:{enabled:n.ciChecks.security?.enabled!==!1,auditLevel:n.ciChecks.security?.auditLevel||"moderate"},complexity:{enabled:n.ciChecks.complexity?.enabled!==!1,agent:n.ciChecks.complexity?.agent||"oracle-low"},customChecks:n.ciChecks.customChecks||[]}}}catch{}return bP()}function bP(){return{staticQuality:{enabled:!0},security:{enabled:!0,auditLevel:"moderate"},complexity:{enabled:!0,agent:"oracle-low"},customChecks:[]}}function EP(e){let t=[];try{let n=(0,ni.join)(e,"package.json");if(Ln.existsSync(n)){let o=Ln.readJsonSync(n)?.scripts||{};o.lint&&t.push("npm run lint"),o.typecheck&&t.push("npm run typecheck"),o.test&&t.push("npm test"),!o.typecheck&&Ln.existsSync((0,ni.join)(e,"tsconfig.json"))&&t.push("npx tsc --noEmit")}}catch{}return t}function yl(e,t,n,r){let o=Date.now();try{let s=(0,Gw.execSync)(e,{cwd:t,timeout:12e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]});return{name:n,layer:r,passed:!0,command:e,exitCode:0,stdout:(s||"").substring(0,2e3),stderr:"",duration_ms:Date.now()-o}}catch(s){return{name:n,layer:r,passed:!1,command:e,exitCode:s.status||1,stdout:(s.stdout||"").substring(0,2e3),stderr:(s.stderr||"").substring(0,2e3),duration_ms:Date.now()-o}}}function qw(e,t){let n=[],r=Date.now();if(t.staticQuality.enabled){let s=t.staticQuality.commands||EP(e);for(let i of s)n.push(yl(i,e,`Static: ${i}`,"static-quality"))}if(t.security.enabled){let s=t.security.auditLevel||"moderate";n.push(yl(`npm audit --audit-level=${s}`,e,"Security: npm audit","security"))}if(t.complexity.enabled&&n.push({name:"Complexity: AI review",layer:"complexity",passed:!0,command:`dispatch ${t.complexity.agent||"oracle-low"}`,exitCode:0,stdout:"AI complexity review dispatched",stderr:"",duration_ms:0}),t.customChecks)for(let s of t.customChecks)n.push(yl(s.command,e,`Custom: ${s.name}`,"custom"));let o=n.filter(s=>!s.passed).map(s=>s.name);return{allPassed:o.length===0,results:n,totalDuration_ms:Date.now()-r,failedChecks:o}}function Vw(e){let t=e.allPassed?"CI Review Pipeline: ALL CHECKS PASSED":`CI Review Pipeline: ${e.failedChecks.length} CHECK(S) FAILED`,n=e.results.map(r=>{let s=`[${r.passed?"PASS":"FAIL"}] ${r.name}`;return r.passed||(s+=`
2173
2173
  Command: ${r.command}`,s+=`
2174
2174
  Exit code: ${r.exitCode}`,r.stderr&&(s+=`
2175
2175
  Error: ${r.stderr.substring(0,500)}`)),s}).join(`
@@ -2177,7 +2177,7 @@ ${t.reviewer?`Reviewer: ${t.reviewer}
2177
2177
 
2178
2178
  ${n}
2179
2179
 
2180
- Total duration: ${e.totalDuration_ms}ms`}var Yw=require("fs");async function TP(e){try{if(e.toolName!=="Task")return{continue:!0};if(!e.directory||!e.sessionId)return{continue:!0};let t=await oe(e.directory);if(t.length===0)return{continue:!0};let n=null,r="";for(let f of t){let m=await I(e.directory,f);if(m&&m.status!=="complete"){n=m,r=m.manifest_path||"";break}}if(!n)return{continue:!0};if(n.current_phase!=="construction"||n.current_stage!=="code-generation"||!n.active_code_plan_path)return{continue:!0};let o=n.active_code_plan_path,s=W(r);if(!s)return{continue:!0};let i=Hw(e.directory),a=qw(e.directory,i),c=s.artifacts.find(f=>f.id===o),l=[],u=[];if(c)try{let f=(0,Yw.readFileSync)(c.path,"utf-8");l=ra(f,c.path).map(m=>m.message),u=oa(f,c.path).map(m=>m.message)}catch{}let d=Vw(a),p="";return l.length>0&&(p=`
2180
+ Total duration: ${e.totalDuration_ms}ms`}var Yw=require("fs");async function TP(e){try{if(e.toolName!=="Task")return{continue:!0};if(!e.directory||!e.sessionId)return{continue:!0};let t=await oe(e.directory);if(t.length===0)return{continue:!0};let n=null,r="";for(let f of t){let m=await A(e.directory,f);if(m&&m.status!=="complete"){n=m,r=m.manifest_path||"";break}}if(!n)return{continue:!0};if(n.current_phase!=="construction"||n.current_stage!=="code-generation"||!n.active_code_plan_path)return{continue:!0};let o=n.active_code_plan_path,s=W(r);if(!s)return{continue:!0};let i=Hw(e.directory),a=qw(e.directory,i),c=s.artifacts.find(f=>f.id===o),l=[],u=[];if(c)try{let f=(0,Yw.readFileSync)(c.path,"utf-8");l=ra(f,c.path).map(m=>m.message),u=oa(f,c.path).map(m=>m.message)}catch{}let d=Vw(a),p="";return l.length>0&&(p=`
2181
2181
 
2182
2182
  SECURITY FINDINGS:
2183
2183
  ${l.map(f=>` - ${f}`).join(`
@@ -2189,22 +2189,22 @@ ${u.map(f=>` - ${f}`).join(`
2189
2189
 
2190
2190
  ${d}${p}
2191
2191
 
2192
- Fix the failing checks and re-run the BOLT execution.`}}}catch(t){return console.error("[Olympus CI Review] Error in ciReviewPipeline:",t),{continue:!0}}}function Kw(){A({name:"ciReviewPipeline",event:"PostToolUse",priority:79,matcher:"task",handler:TP})}we();function Jw(e,t=2){let r=e.toLowerCase().replace(/[^\w\s]/g,"").split(/\s+/).filter(s=>s.length>0);if(r.length<t)return new Set(r);let o=new Set;for(let s=0;s<=r.length-t;s++)o.add(r.slice(s,s+t).join(" "));return o}function wl(e,t){let n=Jw(e),r=Jw(t),o=new Set([...n].filter(i=>r.has(i))),s=new Set([...n,...r]);return s.size>0?o.size/s.size:0}function CP(e,t=.4){let n=[],r=new Set;for(let o of e){if(r.has(o.id))continue;let s=[o];r.add(o.id);for(let i of e){if(r.has(i.id))continue;wl(o.user_message,i.user_message)>=t&&(s.push(i),r.add(i.id))}n.push(s)}return n}function zw(e,t=3,n=1e3,r){let i=(r?e.filter(c=>c.project_path===r):e).slice(-n).filter(c=>c.feedback_category==="correction"||c.feedback_category==="clarification"||c.feedback_category==="explicit_preference");return CP(i).filter(c=>c.length>=t).map(c=>{let l=c.sort((m,g)=>new Date(g.timestamp).getTime()-new Date(m.timestamp).getTime())[0],u=c.reduce((m,g)=>m+g.confidence,0)/c.length,p=new Set(c.map(m=>m.project_path)).size===1?"project":"global",f=xP(c);return{pattern:RP(c),confidence:u,evidence_count:c.length,evidence_examples:c.slice(0,3).map(m=>m.user_message.substring(0,150)),scope:p,category:f}})}function RP(e){let t=new Map;for(let o of e){let s=o.user_message.toLowerCase().replace(/[^\w\s]/g,"").split(/\s+/).filter(i=>i.length>3);for(let i of s)t.set(i,(t.get(i)||0)+1)}let n=[...t.entries()].sort((o,s)=>s[1]-o[1]).slice(0,3).map(([o])=>o);return e[0].user_message.substring(0,100)+(n.length>0?` [themes: ${n.join(", ")}]`:"")}function xP(e){let t=e.map(n=>n.user_message).join(" ").toLowerCase();return/typescript|eslint|prettier|format|indent|naming/i.test(t)?"style":/test|build|npm|yarn|run|command|install/i.test(t)?"tooling":/verbose|brief|explain|detail|ask|confirm/i.test(t)?"communication":"behavior"}var PP={verbosity:"unknown",autonomy:"unknown",explanation_depth:"unknown",explicit_rules:[],inferred_preferences:[],recurring_corrections:[],last_updated:new Date().toISOString()},AP=30;function IP(e){let t=e.filter(r=>r.feedback_category==="explicit_preference"),n=[];for(let r of t){let o=r.user_message.match(/always\s+(.+?)(?:\.|$)/i),s=r.user_message.match(/never\s+(.+?)(?:\.|$)/i);o&&n.push(`Always: ${o[1].trim()}`),s&&n.push(`Never: ${s[1].trim()}`)}return[...new Set(n)]}function OP(e){let t=e.filter(r=>/too (long|verbose|much|wordy)/i.test(r.user_message)).length,n=e.filter(r=>/more (detail|info|explanation)|too (brief|short)/i.test(r.user_message)).length;return t>=3&&t>n?"concise":n>=3&&n>t?"detailed":"unknown"}function $P(e){let t=e.filter(r=>/ask (me )?(first|before)|don't assume|confirm/i.test(r.user_message)).length,n=e.filter(r=>/just (do|make|fix)|don't ask|stop asking/i.test(r.user_message)).length;return t>=3&&t>n?"ask_first":n>=3&&n>t?"just_do_it":t>=2&&n>=2?"balanced":"unknown"}function Qw(e,t,n,r){let o={...e},s=r??t.find(f=>f.project_path)?.project_path,i=IP(t),a=new Set(o.explicit_rules.map(f=>f.rule)),c=i.filter(f=>!a.has(f)).map(f=>({rule:f,created_at:new Date().toISOString(),...s?{project_path:s}:{}}));o.explicit_rules=[...o.explicit_rules,...c];let l=OP(t);l!=="unknown"&&(o.verbosity=l);let u=$P(t);u!=="unknown"&&(o.autonomy=u);let d=n.filter(f=>f.confidence>.7&&f.scope==="global").map(f=>f.pattern);o.inferred_preferences=[...new Set([...o.inferred_preferences,...d])];for(let f of n){let m=o.recurring_corrections.find(g=>wl(g.pattern,f.pattern)>.5);m?(m.count=f.evidence_count,m.last_seen=new Date().toISOString(),m.examples=f.evidence_examples):o.recurring_corrections.push({pattern:f.pattern,count:f.evidence_count,last_seen:new Date().toISOString(),examples:f.evidence_examples})}let p=Date.now();if(o.recurring_corrections=o.recurring_corrections.filter(f=>{if(!f.last_seen)return!0;let m=Date.parse(f.last_seen);return isNaN(m)?!0:p-m<=AP*864e5}),n.length>0){let f=new Set(n.map(m=>m.pattern));o.inferred_preferences=o.inferred_preferences.filter(m=>f.has(m))}return o.last_updated=new Date().toISOString(),o}function Xw(){return{...PP,last_updated:new Date().toISOString()}}var _o=require("path"),Ir=require("fs"),DP=3,NP=10;function jP(e){let t=(0,_o.join)(e,"feedback-log.jsonl"),n=(0,_o.join)(e,"agent-performance.json");if(!(0,Ir.existsSync)(t))return!1;if(!(0,Ir.existsSync)(n))return!0;try{let r=(0,Ir.statSync)(t),o=(0,Ir.statSync)(n);return r.mtime>o.mtime}catch(r){return console.error("[Olympus Learning Aggregation] Failed to check file times:",r),!0}}function Zw(){A({name:"learningAggregation",event:"Stop",priority:95,handler:async e=>{try{if(!e.directory)return{continue:!0};let t=pe();if(!jP(t))return{continue:!0};let n=Co();if(n.length<DP)return{continue:!0};let r=new Set;for(let d of n)d.agent_used&&r.add(d.agent_used);let o=Array.from(r);if(o.length===0)return{continue:!0};let s={};for(let d of o){let p=Ro(d,n);p&&(s[d]=p)}let i=(0,_o.join)(t,"agent-performance.json");at(i,s);let a=(0,_o.join)(t,"user-preferences.json"),c=_e(a,Xw()),l=[];if(n.length>=NP)try{l=zw(n)}catch(d){console.error("[Olympus Learning Aggregation] Pattern extraction failed:",d)}let u=Qw(c,n,l);at(a,u)}catch(t){console.error("[Olympus Learning Aggregation] Error in aggregation handler:",t)}return{continue:!0}}})}var kl=["discovery","inception","construction","operations"],FP={draft:"o",active:"+",fulfilled:"++",violated:"X",stale:"!"},MP={0:"Baseline",1:"Earned",2:"Extended",3:"Trusted"};function e_(e,t=null,n=null){let r=LP(e),o=WP(e),s=BP(e.risks),i=GP(e.gate_audit),a=HP(t),c=qP(e.alignment_checks),l=VP(e.depth_assessment),u=YP(e.risk_tier),d=JP(e,r),p=KP(e),f=n?.inception_stages?QP(n.inception_stages,n.current_inception_stage):null,m=[`# Workflow Status: ${e.feature_name}`,`ID: ${e.workflow_id}`,"",d,"","## Phase Progress",...r.map(g=>UP(g)),"",...f?[f,""]:[],p,l,u,a,"","## Artifacts",o,"","## Alignment",c,"","## Risk Summary",s,"","## Gate Audit",i].filter(g=>g!==null).join(`
2192
+ Fix the failing checks and re-run the BOLT execution.`}}}catch(t){return console.error("[Olympus CI Review] Error in ciReviewPipeline:",t),{continue:!0}}}function Kw(){I({name:"ciReviewPipeline",event:"PostToolUse",priority:79,matcher:"task",handler:TP})}we();function Jw(e,t=2){let r=e.toLowerCase().replace(/[^\w\s]/g,"").split(/\s+/).filter(s=>s.length>0);if(r.length<t)return new Set(r);let o=new Set;for(let s=0;s<=r.length-t;s++)o.add(r.slice(s,s+t).join(" "));return o}function wl(e,t){let n=Jw(e),r=Jw(t),o=new Set([...n].filter(i=>r.has(i))),s=new Set([...n,...r]);return s.size>0?o.size/s.size:0}function CP(e,t=.4){let n=[],r=new Set;for(let o of e){if(r.has(o.id))continue;let s=[o];r.add(o.id);for(let i of e){if(r.has(i.id))continue;wl(o.user_message,i.user_message)>=t&&(s.push(i),r.add(i.id))}n.push(s)}return n}function zw(e,t=3,n=1e3,r){let i=(r?e.filter(c=>c.project_path===r):e).slice(-n).filter(c=>c.feedback_category==="correction"||c.feedback_category==="clarification"||c.feedback_category==="explicit_preference");return CP(i).filter(c=>c.length>=t).map(c=>{let l=c.sort((m,g)=>new Date(g.timestamp).getTime()-new Date(m.timestamp).getTime())[0],u=c.reduce((m,g)=>m+g.confidence,0)/c.length,p=new Set(c.map(m=>m.project_path)).size===1?"project":"global",f=xP(c);return{pattern:RP(c),confidence:u,evidence_count:c.length,evidence_examples:c.slice(0,3).map(m=>m.user_message.substring(0,150)),scope:p,category:f}})}function RP(e){let t=new Map;for(let o of e){let s=o.user_message.toLowerCase().replace(/[^\w\s]/g,"").split(/\s+/).filter(i=>i.length>3);for(let i of s)t.set(i,(t.get(i)||0)+1)}let n=[...t.entries()].sort((o,s)=>s[1]-o[1]).slice(0,3).map(([o])=>o);return e[0].user_message.substring(0,100)+(n.length>0?` [themes: ${n.join(", ")}]`:"")}function xP(e){let t=e.map(n=>n.user_message).join(" ").toLowerCase();return/typescript|eslint|prettier|format|indent|naming/i.test(t)?"style":/test|build|npm|yarn|run|command|install/i.test(t)?"tooling":/verbose|brief|explain|detail|ask|confirm/i.test(t)?"communication":"behavior"}var PP={verbosity:"unknown",autonomy:"unknown",explanation_depth:"unknown",explicit_rules:[],inferred_preferences:[],recurring_corrections:[],last_updated:new Date().toISOString()},AP=30;function IP(e){let t=e.filter(r=>r.feedback_category==="explicit_preference"),n=[];for(let r of t){let o=r.user_message.match(/always\s+(.+?)(?:\.|$)/i),s=r.user_message.match(/never\s+(.+?)(?:\.|$)/i);o&&n.push(`Always: ${o[1].trim()}`),s&&n.push(`Never: ${s[1].trim()}`)}return[...new Set(n)]}function OP(e){let t=e.filter(r=>/too (long|verbose|much|wordy)/i.test(r.user_message)).length,n=e.filter(r=>/more (detail|info|explanation)|too (brief|short)/i.test(r.user_message)).length;return t>=3&&t>n?"concise":n>=3&&n>t?"detailed":"unknown"}function $P(e){let t=e.filter(r=>/ask (me )?(first|before)|don't assume|confirm/i.test(r.user_message)).length,n=e.filter(r=>/just (do|make|fix)|don't ask|stop asking/i.test(r.user_message)).length;return t>=3&&t>n?"ask_first":n>=3&&n>t?"just_do_it":t>=2&&n>=2?"balanced":"unknown"}function Qw(e,t,n,r){let o={...e},s=r??t.find(f=>f.project_path)?.project_path,i=IP(t),a=new Set(o.explicit_rules.map(f=>f.rule)),c=i.filter(f=>!a.has(f)).map(f=>({rule:f,created_at:new Date().toISOString(),...s?{project_path:s}:{}}));o.explicit_rules=[...o.explicit_rules,...c];let l=OP(t);l!=="unknown"&&(o.verbosity=l);let u=$P(t);u!=="unknown"&&(o.autonomy=u);let d=n.filter(f=>f.confidence>.7&&f.scope==="global").map(f=>f.pattern);o.inferred_preferences=[...new Set([...o.inferred_preferences,...d])];for(let f of n){let m=o.recurring_corrections.find(g=>wl(g.pattern,f.pattern)>.5);m?(m.count=f.evidence_count,m.last_seen=new Date().toISOString(),m.examples=f.evidence_examples):o.recurring_corrections.push({pattern:f.pattern,count:f.evidence_count,last_seen:new Date().toISOString(),examples:f.evidence_examples})}let p=Date.now();if(o.recurring_corrections=o.recurring_corrections.filter(f=>{if(!f.last_seen)return!0;let m=Date.parse(f.last_seen);return isNaN(m)?!0:p-m<=AP*864e5}),n.length>0){let f=new Set(n.map(m=>m.pattern));o.inferred_preferences=o.inferred_preferences.filter(m=>f.has(m))}return o.last_updated=new Date().toISOString(),o}function Xw(){return{...PP,last_updated:new Date().toISOString()}}var _o=require("path"),Ir=require("fs"),DP=3,NP=10;function jP(e){let t=(0,_o.join)(e,"feedback-log.jsonl"),n=(0,_o.join)(e,"agent-performance.json");if(!(0,Ir.existsSync)(t))return!1;if(!(0,Ir.existsSync)(n))return!0;try{let r=(0,Ir.statSync)(t),o=(0,Ir.statSync)(n);return r.mtime>o.mtime}catch(r){return console.error("[Olympus Learning Aggregation] Failed to check file times:",r),!0}}function Zw(){I({name:"learningAggregation",event:"Stop",priority:95,handler:async e=>{try{if(!e.directory)return{continue:!0};let t=pe();if(!jP(t))return{continue:!0};let n=Co();if(n.length<DP)return{continue:!0};let r=new Set;for(let d of n)d.agent_used&&r.add(d.agent_used);let o=Array.from(r);if(o.length===0)return{continue:!0};let s={};for(let d of o){let p=Ro(d,n);p&&(s[d]=p)}let i=(0,_o.join)(t,"agent-performance.json");at(i,s);let a=(0,_o.join)(t,"user-preferences.json"),c=_e(a,Xw()),l=[];if(n.length>=NP)try{l=zw(n)}catch(d){console.error("[Olympus Learning Aggregation] Pattern extraction failed:",d)}let u=Qw(c,n,l);at(a,u)}catch(t){console.error("[Olympus Learning Aggregation] Error in aggregation handler:",t)}return{continue:!0}}})}var kl=["discovery","inception","construction","operations"],FP={draft:"o",active:"+",fulfilled:"++",violated:"X",stale:"!"},MP={0:"Baseline",1:"Earned",2:"Extended",3:"Trusted"};function e_(e,t=null,n=null){let r=LP(e),o=WP(e),s=BP(e.risks),i=GP(e.gate_audit),a=HP(t),c=qP(e.alignment_checks),l=VP(e.depth_assessment),u=YP(e.risk_tier),d=JP(e,r),p=KP(e),f=n?.inception_stages?QP(n.inception_stages,n.current_inception_stage):null,m=[`# Workflow Status: ${e.feature_name}`,`ID: ${e.workflow_id}`,"",d,"","## Phase Progress",...r.map(g=>UP(g)),"",...f?[f,""]:[],p,l,u,a,"","## Artifacts",o,"","## Alignment",c,"","## Risk Summary",s,"","## Gate Audit",i].filter(g=>g!==null).join(`
2193
2193
  `);return{summary:d,phaseProgress:r,artifactTree:o,riskSummary:s,gateSummary:i,trustDisplay:a,alignmentSummary:c,fullReport:m}}function LP(e){return kl.map(t=>{let n=e.phases[t],r=e.artifacts.filter(a=>a.phase===t),o=r.length;if(o===0)return{phase:t,percentage:n.status==="complete"?100:0,status:n.status,artifactCount:0};let s=r.filter(a=>a.contract_status==="active"||a.contract_status==="fulfilled").length,i=Math.round(s/o*100);return{phase:t,percentage:i,status:n.status,artifactCount:o}})}function UP(e){let n=Math.round(e.percentage/100*20),r=20-n,o="=".repeat(n)+"-".repeat(r);return`${(e.phase.charAt(0).toUpperCase()+e.phase.slice(1)).padEnd(8)} [${o}] ${String(e.percentage).padStart(3)}% (${e.status}) ${e.artifactCount} artifacts`}function WP(e){let t=[];for(let n of kl){let r=e.artifacts.filter(i=>i.phase===n);if(r.length===0)continue;let o=n.charAt(0).toUpperCase()+n.slice(1);t.push(`[${o}]`);let s=new Map;for(let i of r){let a=i.stage;s.has(a)||s.set(a,[]),s.get(a).push(i)}for(let[i,a]of s){t.push(` ${i}/`);for(let c of a){let l=FP[c.contract_status]??"?",u=c.validation_passed===!0?"v":c.validation_passed===!1?"x":"-";t.push(` [${l}] ${c.id} (${c.type}) [${u}]`)}}}return t.join(`
2194
2194
  `)}function BP(e){if(e.length===0)return"No risks registered";let t=e.filter(a=>a.status==="open").length,n=e.filter(a=>a.status==="mitigated").length,r=e.filter(a=>a.status==="accepted").length,o=e.filter(a=>a.status==="closed").length,s=[`Total: ${e.length} | Open: ${t} | Mitigated: ${n} | Accepted: ${r} | Closed: ${o}`],i=e.filter(a=>a.status==="open");for(let a of i)s.push(` [OPEN] ${a.id}: ${a.description} (${a.likelihood}/${a.impact})`);return s.join(`
2195
2195
  `)}function GP(e){if(e.length===0)return"No gate transitions recorded";let t=e.filter(s=>s.action==="approved").length,n=e.filter(s=>s.action==="rejected").length,r=e.filter(s=>s.action==="bypassed").length,o=[`Total: ${e.length} | Approved: ${t} | Rejected: ${n} | Bypassed: ${r}`];for(let s of e){let i=s.phase.charAt(0).toUpperCase()+s.phase.slice(1);o.push(` [${s.action.toUpperCase()}] ${i} by ${s.actor}${s.reason?": "+s.reason:""}`)}return o.join(`
2196
2196
  `)}function HP(e){if(!e)return"Trust: Not initialized";let t=MP[e.current_level]??"Unknown";return[`Trust Level ${e.current_level}: ${t}`,` Transitions: ${e.total_transitions} | Rejections: ${e.rejection_count} (${(e.rejection_rate*100).toFixed(1)}%) | Incidents: ${e.incident_count}`].join(`
2197
2197
  `)}function qP(e){if(e.length===0)return"No alignment checks recorded";let t=e.filter(o=>o.alignment_passed).length,n=e.filter(o=>!o.alignment_passed).length,r=[`Total: ${e.length} | Passed: ${t} | Failed: ${n}`];for(let o of e){let s=o.alignment_passed?"PASS":"FAIL",i=o.verification.conformance_score,a=o.verification.passed?"v":"x",c=o.validation.passed?"v":"x";r.push(` [${s}] ${o.source_artifact_id} -> ${o.target_artifact_id}: verification=${i}% [${a}] validation [${c}]`)}return r.join(`
2198
2198
  `)}function VP(e){return e?`Depth: ${e.recommended_depth} (score: ${e.total_score}/30)${e.skip_units?" [skip-units]":""}`:"Depth: Not assessed"}function YP(e){return e?`Risk Tier: ${e.tier} (${e.rationale})`:"Risk Tier: Not classified"}function KP(e){let t=e.artifacts.filter(o=>o.stage==="code-generation"),n=t.length;return n===0?"Bolts: 0/0":`Bolts: ${t.filter(o=>o.contract_status==="active"||o.contract_status==="fulfilled").length}/${n} complete`}function JP(e,t){let n=e.artifacts.length,r=t.filter(s=>s.status!=="not_started");return`${t.filter(s=>s.percentage===100&&s.status==="complete").length}/${kl.length} phases complete | ${n} artifacts total`}var _l=["workspace-detection","reverse-engineering","requirements-analysis","workflow-planning","units-generation","user-stories","bolt-planning"],zP={"workspace-detection":"Workspace Detection","reverse-engineering":"Reverse Engineering","requirements-analysis":"Requirements Analysis","workflow-planning":"Workflow Planning","units-generation":"Units Generation","user-stories":"User Stories","bolt-planning":"Bolt Planning"};function QP(e,t){let n=_l.length,r=_l.filter(l=>e[l]?.status==="completed").length,o=Math.round(r/n*100),s=10,i=Math.round(o/100*s),c=[`Inception [${i>=s?"=".repeat(s):"=".repeat(i)+">"+"-".repeat(s-i-1)}] ${o}% (${r}/${n} stages)`];for(let l of _l){let u=e[l],d=zP[l];if(!u){c.push(` [ ] ${d}`);continue}if(u.status==="completed")c.push(` [x] ${d}`);else if(u.status==="skipped"){let p=u.skip_reason?` (${u.skip_reason})`:" (skipped)";c.push(` [-] ${d}${p}`)}else u.status==="in_progress"||l===t?c.push(` [ ] ${d} <- current`):c.push(` [ ] ${d}`)}return c.join(`
2199
- `)}Z();sn();ce();var t_=v(require("path"),1);function n_(){A({name:"workflowStatusReporter",event:"UserPromptSubmit",priority:6,handler:async e=>{try{let t=e.directory||process.cwd(),n=e.prompt||"",o=(e.parts||[]).map(f=>f.text||"").join(" ")||n;if(!(o.includes("Show status of all active structured workflows")||o.includes("workflow-status")))return{continue:!0};let i=await oe(t),a=null;for(let f of i){let m=await I(t,f);if(m&&m.status!=="complete"&&m.status!=="archived"&&m.status!=="deferred"){a=f;break}}if(!a)return{continue:!0,hookSpecificOutput:{hookEventName:"UserPromptSubmit",additionalContext:"<workflow-status>\nNo active workflows found. Start one with `/plan <description>`\n</workflow-status>"}};let c=t_.join(t,"aidlc-docs",a,"manifest.json"),l=W(c);if(!l){let f=await I(t,a),m=f?.current_phase||"unknown",g=f?.current_stage||"unknown";return{continue:!0,hookSpecificOutput:{hookEventName:"UserPromptSubmit",additionalContext:`<workflow-status>
2199
+ `)}Z();sn();ce();var t_=v(require("path"),1);function n_(){I({name:"workflowStatusReporter",event:"UserPromptSubmit",priority:6,handler:async e=>{try{let t=e.directory||process.cwd(),n=e.prompt||"",o=(e.parts||[]).map(f=>f.text||"").join(" ")||n;if(!(o.includes("Show status of all active structured workflows")||o.includes("workflow-status")))return{continue:!0};let i=await oe(t),a=null;for(let f of i){let m=await A(t,f);if(m&&m.status!=="complete"&&m.status!=="archived"&&m.status!=="deferred"){a=f;break}}if(!a)return{continue:!0,hookSpecificOutput:{hookEventName:"UserPromptSubmit",additionalContext:"<workflow-status>\nNo active workflows found. Start one with `/plan <description>`\n</workflow-status>"}};let c=t_.join(t,"aidlc-docs",a,"manifest.json"),l=W(c);if(!l){let f=await A(t,a),m=f?.current_phase||"unknown",g=f?.current_stage||"unknown";return{continue:!0,hookSpecificOutput:{hookEventName:"UserPromptSubmit",additionalContext:`<workflow-status>
2200
2200
  # Workflow Status: ${a}
2201
2201
 
2202
2202
  Phase: ${m} | Stage: ${g}
2203
2203
 
2204
2204
  Note: manifest.json not found. Detailed artifact tracking unavailable. The workflow is active and can proceed normally.
2205
- </workflow-status>`}}}let u=Ee(t),d=await I(t,a);return{continue:!0,hookSpecificOutput:{hookEventName:"UserPromptSubmit",additionalContext:`<workflow-status>
2205
+ </workflow-status>`}}}let u=Ee(t),d=await A(t,a);return{continue:!0,hookSpecificOutput:{hookEventName:"UserPromptSubmit",additionalContext:`<workflow-status>
2206
2206
  ${e_(l,u,d).fullReport}
2207
- </workflow-status>`}}}catch(t){return console.error("[Olympus Workflow Status] Error generating report:",t),{continue:!0}}}})}Z();sn();ce();var r_=v(require("path"),1);function o_(){A({name:"workflowTransitionMessages",event:"PostToolUse",priority:82,handler:async e=>{try{let t=e.directory||process.cwd();if(e.toolName!=="Write"&&e.toolName!=="Task")return{continue:!0};let n=await oe(t),r=null,o=null;for(let m of n){let g=await I(t,m);if(g&&g.status!=="complete"&&g.status!=="archived"&&g.status!=="deferred"){r=m,o=g;break}}if(!r||!o)return{continue:!0};let s=r_.join(t,"aidlc-docs",r,"manifest.json"),i=W(s);if(!i)return{continue:!0};let a=Ee(t),c=i.gate_audit.length>0?i.gate_audit[i.gate_audit.length-1]:null,l=null,u=Et(i),d=u.filter(m=>m.contract_status==="fulfilled"),p=Sn(i),f=i.artifacts.filter(m=>m.stage==="intent");if(u.length>0&&d.length===u.length&&o.current_stage==="code-generation"&&i.phases.construction.status==="complete")l=`\u2713 All ${u.length} BOLTs executed and reviewed
2207
+ </workflow-status>`}}}catch(t){return console.error("[Olympus Workflow Status] Error generating report:",t),{continue:!0}}}})}Z();sn();ce();var r_=v(require("path"),1);function o_(){I({name:"workflowTransitionMessages",event:"PostToolUse",priority:82,handler:async e=>{try{let t=e.directory||process.cwd();if(e.toolName!=="Write"&&e.toolName!=="Task")return{continue:!0};let n=await oe(t),r=null,o=null;for(let m of n){let g=await A(t,m);if(g&&g.status!=="complete"&&g.status!=="archived"&&g.status!=="deferred"){r=m,o=g;break}}if(!r||!o)return{continue:!0};let s=r_.join(t,"aidlc-docs",r,"manifest.json"),i=W(s);if(!i)return{continue:!0};let a=Ee(t),c=i.gate_audit.length>0?i.gate_audit[i.gate_audit.length-1]:null,l=null,u=Et(i),d=u.filter(m=>m.contract_status==="fulfilled"),p=Sn(i),f=i.artifacts.filter(m=>m.stage==="intent");if(u.length>0&&d.length===u.length&&o.current_stage==="code-generation"&&i.phases.construction.status==="complete")l=`\u2713 All ${u.length} BOLTs executed and reviewed
2208
2208
  \u2192 Next: Operations phase. Generating deployment guide and release notes...`;else if(d.length>0&&d.length<u.length&&c?.phase==="construction"&&c?.action==="approved"){let m=u.length-d.length,g=d[d.length-1];l=`\u2713 BOLT ${d.length}/${u.length} complete \u2014 '${g.id}'
2209
2209
  Gate 4: Dev review of ${g.id} code
2210
2210
  \u2192 Current: ${m} remaining`}else if(p.length>0&&i.phases.construction.status==="in_progress"&&o.current_stage==="unit"&&c?.phase==="inception"&&c?.action==="approved"){let m=p.map(g=>g.id).join(", ");l=`\u2713 ${p.length} UNITs created: ${m}