omo-ai 5.1.2 → 5.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/lib/doctor.js +7 -44
- package/bin/lib/engine-prepare.js +15 -0
- package/bin/lib/launch-spec-mode.js +78 -0
- package/bin/lib/launcher.js +14 -17
- package/bin/lib/npm-dist-tags.js +42 -0
- package/bin/lib/package-paths.js +21 -1
- package/bin/lib/provider-map.json +1 -1
- package/bin/lib/rpc-stream-errors.js +2 -2
- package/bin/lib/self-update.js +46 -14
- package/bin/lib/update-args.js +49 -0
- package/bin/senpi-patch.mjs +2 -1
- package/package.json +2 -2
- package/plugin/CHANGELOG.md +58 -0
- package/plugin/extensions/memory-run-supervisor.mjs +1 -1
- package/plugin/extensions/omo-computer-use.js +1 -1
- package/plugin/extensions/omo-init-deep-advisor.js +2 -2
- package/plugin/extensions/omo-member.js +2 -2
- package/plugin/extensions/omo-task.js +2 -2
- package/plugin/extensions/omo.js +2 -2
- package/plugin/package.json +1 -1
- package/plugin/runtime/agent-toolkit-sdk/sdk.js +2 -2
- package/plugin/runtime/ast-grep-mcp/manifest.json +1 -1
- package/plugin/runtime/category-coverage/index.js +3 -3
- package/plugin/runtime/lsp-daemon/dist/.omo-runtime-manifest.json +4 -4
- package/plugin/runtime/lsp-daemon/dist/cli.js +2 -1
- package/plugin/runtime/lsp-daemon/dist/client.js +2 -1
- package/plugin/runtime/lsp-daemon/dist/index.js +2 -1
- package/plugin/runtime/rollback-migrate.js +2 -2
- package/plugin/skills/browser/runtime/omowright/manifest.json +1 -1
package/plugin/package.json
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
// omo
|
|
2
|
-
import{existsSync as e,statSync as t}from"node:fs";import{readFile as i}from"node:fs/promises";import{resolve as r}from"node:path";import{existsSync as n}from"node:fs";import{readFile as a}from"node:fs/promises";import{resolve as o}from"node:path";class s extends Error{}function c(e){return e&&"object"==typeof e&&!Array.isArray(e)?e:{}}function l(e){return e.replace(/\s+/g," ").trim()}function d(e){let t=c(e),i=Object.hasOwn(t,"goal")?t.goal:e;if(null==i||!1===i)return{available:!1,raw:e};let r=c(i),n=function(e){return"string"==typeof e?e:""}(r.objective??r.goal??r.description??r.title??t.objective??t.title),a=function(e){let t=function(e){return"string"==typeof e?e.trim():""}(e).toLowerCase();return"complete"===t||"completed"===t||"done"===t?"complete":"cancelled"===t||"canceled"===t?"cancelled":"failed"===t||"failure"===t?"failed":"paused"===t?"paused":"usage_limited"===t?"usage_limited":"budget_limited"===t?"budget_limited":"active"===t||"in_progress"===t||"pending"===t||"running"===t?"active":"unknown"}(r.status??t.status);return{available:Boolean(n||"unknown"!==a),...n?{objective:n}:{},status:a,raw:e}}async function u(e,t=process.cwd()){if(!e?.trim())return null;let i=e.trim();try{return d(JSON.parse(i))}catch{let e=o(t,i);if(!n(e))throw new s(`Codex goal snapshot is neither valid JSON nor a readable path: ${i}`);try{return d(JSON.parse(await a(e,"utf-8")))}catch(e){throw new s(`Codex goal snapshot path does not contain valid JSON: ${i}${e instanceof Error?` (${e.message})`:""}`)}}}function p(e,t){let i=e??{available:!1,raw:null},r=[],n=[],a=[],o=t.expectedObjective;if(!i.available)return a.push(`call get_goal; if none, create_goal with codexObjective "${o}" verbatim`),{ok:0===r.length,snapshot:i,warnings:n,nextActions:a,errors:r};let s,c=e=>new Set(e.map(l).filter(Boolean)),d=c([o,...t.acceptedObjectives??[]]),u=c(t.acknowledgedObjectives??[]),p=l(i.objective??"");!p||d.has(p)||u.has(p)||(n.push(`driver_objective_differs: expected "${o}", got "${p}".`),s=p);let f=i.status??"unknown";return"paused"!==f&&"usage_limited"!==f&&"budget_limited"!==f||a.push("/goal resume or raise the budget"),"complete"===f&&a.push(`driver closed early: call create_goal with codexObjective "${o}" verbatim`),{ok:0===r.length,snapshot:i,warnings:n,nextActions:a,errors:r,...void 0===s?{}:{unacknowledgedObjective:s}}}function f(e){return[...e.errors,...e.nextActions,...e.warnings].join(" ")}function g(e){return e.replace(/\s+/g," ").trim()}function v(e){return e.acknowledgedDriverObjectives??[]}function m(e,t){if(void 0===t)return!1;let i=g(t);return!(!i||v(e).includes(i))&&(e.acknowledgedDriverObjectives=[...v(e),i],!0)}import{isAbsolute as h,join as w,relative as b,sep as _}from"node:path";var y=".omo/ulw-loop",I="goals.json",O="ledger.jsonl",S=["add_subgoal","split_subgoal","reorder_pending","revise_pending_wording","revise_criterion","annotate_ledger","mark_blocked_superseded"],k=["happy","edge","regression","adversarial"];class A extends Error{constructor(e,t,i){super(e,void 0===i?.cause?void 0:{cause:i.cause}),this.name="UlwLoopError",this.code=t,void 0!==i?.details&&(this.details=i.details)}}function E(){return(new Date).toISOString()}function $(e){let t=e?.trim();if(!t)return null;let i=t.split(/[\\/]+/).filter(e=>e.length>0&&"."!==e&&".."!==e),r=(i.length>0?i.join("-"):t).replace(/[^A-Za-z0-9._-]+/g,"-").replace(/-+/g,"-").replace(/^\.+/,"").replace(/^[.-]+|[.-]+$/g,"");return r.length>0?r:null}function R(e){let t=$(e?.sessionId);return null===t?y:`${y}/${t}`}function j(e,t){return w(e,R(t))}function L(e){return`${R(e)}/brief.md`}function x(e){return`${R(e)}/${I}`}function C(e){return`${R(e)}/${O}`}function N(e,t){return w(j(e,t),".state.lock")}function P(e,t){let i=`${t}/`,r=`${t}\\`;return e.startsWith(i)?e.slice(i.length).split("\\").join("/"):e.startsWith(r)?e.slice(r.length).split("\\").join("/"):e.split("\\").join("/")}function G(e){let t=$(e?.sessionId);return null===t?".omo/evidence":`.omo/evidence/ulw/${t}`}function T(e,t,i){let r=$(i?.sessionId);if(null===r)throw new A(`Evidence for ${e} attempt ${t} needs a session scope; pass --session-id <id> so the attempt directory lives under .omo/evidence/ulw/<id>/.`,"ULW_LOOP_SESSION_SCOPE_REQUIRED",{details:{goalId:e,attempt:t}});return`.omo/evidence/ulw/${r}/${e}/a${t}`}var U={relative:b,isAbsolute:h,sep:_};var D=M();function M(e){return`Complete the durable ulw-loop plan in ${x(e)}, including later accepted/appended stories, under the original brief constraints; use ${C(e)} as the audit trail.`}function W(e){return e.codexGoalMode??"per_story"}function q(e){return"complete"===e}function Q(e,t){if("superseded"!==e.steeringStatus)return!1;let i=e.supersededBy??[];return 0!==i.length&&i.every(e=>{let i=t.goals.find(t=>t.id===e);return void 0!==i&&q(i.status)})}function J(e,t){return"superseded"===e.steeringStatus?!Q(e,t):"blocked"===e.steeringStatus||!q(e.status)}function B(e){return"complete"===e.aggregateCompletion?.status||e.goals.every(t=>!J(t,e))}function V(e,t){return J(t,e)&&e.goals.every(i=>!function(e,t,i){if(e.id===t.id)return!1;if("superseded"===e.steeringStatus){let r=e.supersededBy??[];return 0===r.length||!r.every(e=>{if(e===t.id)return!0;let r=i.goals.find(t=>t.id===e);return void 0!==r&&q(r.status)})}return J(e,i)}(i,t,e))}function F(e){return e.codexObjective??D}function z(e,t){return"aggregate"===W(e)?F(e):t.objective}function H(e){return[F(e),...e.codexObjectiveAliases??[]]}function K(e){return e.successCriteria.length>0&&e.successCriteria.every(e=>"pass"===e.status)}function X(e){return e.essential??!0}function Y(e){let t=e.successCriteria.filter(X);if(t.length>0)return t;let i=e.successCriteria.find(e=>"happy"===e.userModel);return void 0===i?[]:[i]}import{existsSync as Z}from"node:fs";import{isAbsolute as ee,relative as te,resolve as ie,sep as re}from"node:path";function ne(e,t,i){throw new A(e,t,{details:i})}function ae(e,t){let i=te(e,t);return""===i||i.startsWith("..")||ee(i)?t:i.split(re).join("/")}import{AsyncLocalStorage as oe}from"node:async_hooks";import{randomUUID as se}from"node:crypto";import{linkSync as ce,mkdirSync as le,renameSync as de,rmSync as ue,writeFileSync as pe}from"node:fs";import{rename as fe,writeFile as ge}from"node:fs/promises";import{join as ve}from"node:path";import{join as me}from"node:path";import{existsSync as he,readdirSync as we,readFileSync as be}from"node:fs";import{join as _e}from"node:path";function ye(e,t){return e instanceof Error&&"code"in e&&e.code===t}function Ie(e){try{return be(e,"utf8")}catch(e){if(ye(e,"ENOENT"))return;throw e}}function Oe(e){try{return we(_e(e,"revisions")).filter(e=>/^\d{8,}\.json$/.test(e)).sort()}catch(e){if(ye(e,"ENOENT"))return[];throw e}}function Se(e,t){try{let i=JSON.parse(be(_e(e,"revisions",t),"utf8"));return 1===i.version&&Number.isInteger(i.revision)&&1===i.plan?.version&&Array.isArray(i.plan.goals)&&Array.isArray(i.ledger)?i:void 0}catch(e){if(!(e instanceof SyntaxError))throw e;return}}function ke(e){let t=[];for(let i of Oe(e)){let r=Se(e,i);void 0!==r&&t.push(r)}return t.sort((e,t)=>e.revision-t.revision)}function Ae(e){let t,i=Ie(_e(e,"goals.json"));if(void 0!==i)try{t=JSON.parse(i)}catch(e){if(!(e instanceof SyntaxError))throw e}let r=function(e){let t=Oe(e).sort((e,t)=>Number.parseInt(t,10)-Number.parseInt(e,10));for(let i of t){let t=Se(e,i);if(void 0!==t)return t}}(e);if(void 0===r)return t;if(void 0===t)return r.plan;if((t.revision??0)>r.revision)return t;if(void 0===t.revision||t.revision===r.revision){let e=new Set(r.plan.goals.map(e=>e.id));if(Array.isArray(t.goals)&&t.goals.some(t=>!e.has(t.id)))return{...t,revision:r.revision}}return r.plan}function Ee(e){let t=new Map,i=(Ie(me(e,"ledger.jsonl"))??"").split(/\r?\n/),r=0;for(let[e,n]of i.entries())if(0!==n.trim().length)try{let i=JSON.parse(n);i.revision=i.revision||r,r=Math.max(r,i.revision),i.id??=`legacy-${e+1}`,t.set(i.id,i)}catch(e){if(!(e instanceof SyntaxError))throw e}for(let i of ke(e))for(let[e,r]of i.ledger.entries()){let n=r.id??`${i.revision}-${e}`;t.set(n,{...r,revision:i.revision,id:n})}let n=Ae(e)?.ledgerResetRevision??0,a=e=>Number(e.id?.split("-").at(-1)??0);return[...t.values()].filter(e=>(e.revision??0)>=n).sort((e,t)=>(e.revision??0)-(t.revision??0)||a(e)-a(t))}import{AsyncLocalStorage as $e}from"node:async_hooks";import{readdirSync as Re}from"node:fs";function je(e){return"omo-senpi"===e?'agentToolkit.createGoals({ brief: "<brief>" })':'omo-agent-toolkit ulw-loop create-goals --brief "<brief>" --json'}function Le(e,t,i="lazycodex"){let r=function(e,t="lazycodex"){let i=[`Recovery: bootstrap the plan with \`${je(t)}\`.`];return 0===e.length?{message:i.join("\n")}:(i.push("omo-senpi"===t?`Existing ulw-loop session ids under .omo/ulw-loop/: ${e.join(", ")}. The SDK is bound to the current session; resume the owning session to target its plan.`:`Existing ulw-loop session ids under .omo/ulw-loop/: ${e.join(", ")}. Re-run with \`--session-id <id>\` to target one of them.`),{message:i.join("\n"),details:{existingSessionIds:e}})}(t,i);return new A(`No ulw-loop plan found at ${e}.\n${r.message}`,"ULW_LOOP_PLAN_MISSING",{...void 0===r.details?{}:{details:r.details}})}import{randomUUID as xe}from"node:crypto";import{closeSync as Ce,ftruncateSync as Ne,mkdirSync as Pe,openSync as Ge,readFileSync as Te,statSync as Ue,unlinkSync as De,writeSync as Me}from"node:fs";import{dirname as We}from"node:path";var qe=1e4,Qe=3e4,Je=(new Int32Array(new SharedArrayBuffer(4)),{now:Date.now,schedule(e,t){let i=setTimeout(e,t);return{unref:()=>{i.unref()},cancel:()=>clearTimeout(i)}}});async function Be(e,t,i={}){let r,n,a=await async function(e,t){let i=t.clock??Je,r=i.now()+(t.timeoutMs??qe);Pe(We(e),{recursive:!0});for(let n=0;;){let a=Ve(e,t,i.now(),t.leaseMs??Qe);if("acquired"===a.kind)return a.holder;if("retry"!==a.kind){if(i.now()>=r)throw Xe(e,t);await new Promise(e=>i.schedule(e,Ke(n))),n+=1}}}(e,i),o=i.clock??Je,s=()=>{try{a.record.leaseUntil=o.now()+(i.leaseMs??Qe),Fe(a),c()}catch(e){n=e}},c=()=>{0!==i.heartbeatMs&&(r=o.schedule(s,i.heartbeatMs??(i.leaseMs??Qe)/3),r.unref())};c();try{let e=await t(a.record.token);if(void 0!==n)throw n;return e}finally{r?.cancel(),Ce(a.fd),function(e,t){if(ze(e,Date.now())?.record?.token!==t)return;try{De(e)}catch(e){if(!Ye(e,"ENOENT"))throw e}}(e,a.record.token)}}function Ve(e,t,i,r){try{let n=function(e,t,i){let r;try{r=Ge(e,"wx")}catch(e){if(Ye(e,"EEXIST"))return null;throw e}let n={pid:process.pid,createdAt:new Date(t).toISOString(),token:xe(),...void 0===i?{}:{leaseUntil:t+i}},a={fd:r,record:n};try{Fe(a)}catch(t){Ce(r);try{De(e)}catch(e){if(!Ye(e,"ENOENT"))throw e}throw t}return a}(e,i,r);if(null!==n)return{kind:"acquired",holder:n};let a=ze(e,i);if(null===a)return{kind:"retry"};let o=a.record;return(null===o?a.ageMs>(t.staleMs??6e4):!function(e){try{return process.kill(e,0),!0}catch(e){if(Ye(e,"ESRCH"))return!1;if(Ye(e,"EPERM"))return!0;throw e}}(o.pid)||void 0!==o.leaseUntil&&i>o.leaseUntil)&&function(e,t){let i=ze(e,Date.now());if(null===i)return!0;if(i.raw!==t)return!1;try{De(e)}catch(e){if(Ye(e,"EPERM")||Ye(e,"EACCES"))return!1;if(!Ye(e,"ENOENT"))throw e}return!0}(e,a.raw)?{kind:"retry"}:{kind:"wait"}}catch(e){if(Ye(e,"EINTR"))return{kind:"wait"};throw e}}function Fe(e){let t=Buffer.from(JSON.stringify(e.record));Ne(e.fd,0);let i=0;for(;i<t.length;){let r=Me(e.fd,t,i,t.length-i,i);if(0===r)throw Error("State lock write made no progress.");i+=r}}function ze(e,t){try{let i=Te(e,"utf8");return{raw:i,record:He(i),ageMs:t-Ue(e).mtimeMs}}catch(e){if(Ye(e,"ENOENT"))return null;throw e}}function He(e){try{let t=JSON.parse(e);return"object"!=typeof t||null===t||(!("pid"in t)||"number"!=typeof t.pid||!Number.isInteger(t.pid)||t.pid<=0)?null:"createdAt"in t&&"string"==typeof t.createdAt&&"token"in t&&"string"==typeof t.token&&0!==t.token.length?{pid:t.pid,createdAt:t.createdAt,token:t.token,..."leaseUntil"in t&&"number"==typeof t.leaseUntil?{leaseUntil:t.leaseUntil}:{}}:null}catch(e){if(e instanceof SyntaxError)return null;throw e}}function Ke(e){return Math.min(100,5*2**e)+5*Math.random()}function Xe(e,t){let i=ze(e,Date.now())?.record,r=t.timeoutMs??qe,n=null==i?"another process":`pid ${i.pid}`;return new A(`ulw-loop state lock ${e} is held by ${n} for more than ${r}ms. The lock owner is still alive. If a JS eval kernel was interrupted while writing, wait for its lease to expire (${t.leaseMs??Qe} ms) or restart the owning senpi process; never delete a lock owned by a live process.`,"ULW_LOOP_LOCK_TIMEOUT",{details:{lockPath:e,timeoutMs:r,...null==i?{}:{holderPid:i.pid}}})}function Ye(e,t){return e instanceof Error&&"code"in e&&e.code===t}function Ze(e,t){let i=N(e,t);return rt.getStore()?.has(i)&&(at(i),function(e){for(let[t,i]of gt(e)){le(ve(e,"tmp"),{recursive:!0});let r=ve(e,"tmp",`${process.pid}-${se()}-${t}`);try{pe(r,i,{flag:"wx"}),de(r,ve(e,t))}finally{ue(r,{force:!0})}}}(j(e,t))),function(e,t){return Ee(j(e,t))}(e,t)}var et=`Complete all ulw-loop stories in ${y}/${I}: `,tt=`Complete all ulw-loop stories listed in ${y}/${I}. Use ${y}/${O} as the durable audit trail.`,it=new Map,rt=new $e,nt=new $e;function at(e){let t=rt.getStore()?.get(e);if(void 0!==t&&function(e){let t=Ie(e);if(void 0!==t)try{let e=JSON.parse(t);return"object"==typeof e&&null!==e&&"token"in e&&"string"==typeof e.token?e.token:void 0}catch(e){if(e instanceof SyntaxError)return;throw e}}(e)!==t.token)throw new A("The ulw-loop mutation lock changed owners.","ULW_LOOP_LOCK_LOST")}function ot(e){for(let t of rt.getStore()?.values()??[]){let i=t.migrations.get(e.goalsPath);if(void 0!==i)return t.migrations.delete(e.goalsPath),i}return[]}async function st(e,t,i,r={}){let n="function"==typeof t?void 0:t,a="function"==typeof t?t:i;if(void 0===a)throw new A("Missing ulw-loop mutation body.","ULW_LOOP_LOCK_BODY_MISSING");let o=`${e}\0${R(n)}`,s=N(e,n),c=()=>Be(s,async e=>rt.run(new Map([...rt.getStore()??[],[s,{token:e,migrations:new Map}]]),async()=>{for(let e=0;;e+=1)try{return await a()}catch(t){if(!(t instanceof A)||"ULW_LOOP_PUBLISH_CONFLICT"!==t.code)throw t;if(at(s),0!==e)throw t}}),{...nt.getStore(),...r}),l=(it.get(o)??Promise.resolve(void 0)).then(c,c),d=l.then(()=>{},()=>{});return it.set(o,d),d.then(()=>{it.get(o)===d&&it.delete(o)}),l}function ct(e,t){let i=function(e,t){return w(j(e,t),I)}(e,t),r=Ae(j(e,t));if(void 0===r)throw Le(P(i,e),dt(e));if(1!==r.version||!Array.isArray(r.goals))throw new A(`Invalid ulw-loop plan at ${P(i,e)}.`,"ULW_LOOP_PLAN_INVALID");let n=r.codexObjective;return"aggregate"!==(r.codexGoalMode??"per_story")||void 0===n||n!==tt&&!n.startsWith(et)||(r.codexObjective=M(t),r.codexObjectiveAliases=[...new Set([...r.codexObjectiveAliases??[],n])],rt.getStore()?.get(N(e,t))?.migrations.set(r.goalsPath,[{at:E(),kind:"aggregate_objective_migrated",before:{codexObjective:n},after:{codexObjective:r.codexObjective}}])),r}async function lt(e,t){return rt.getStore()?.has(N(e,t))&&(at(N(e,t)),await vt(j(e,t))),ct(e,t)}function dt(e){try{return Re(j(e),{withFileTypes:!0}).filter(e=>e.isDirectory()).map(e=>e.name).sort()}catch{return[]}}var ut=new oe;async function pt(e,t){await(ut.getStore()?.writeView??ge)(e,t)}async function ft(e,t,i){let{plan:r}=i,n=j(e,t);at(N(e,t)),await(ut.getStore()?.beforeCommit?.());let a=(r.revision??0)+1,o=r.brief??Ie(ve(n,"brief.md"))??"",s=[...ot(r),...i.entries].map((e,t)=>({...e,revision:a,id:`${a}-${t}`})),c={version:1,revision:a,plan:{...r,revision:a,brief:o},ledger:s};le(ve(n,"revisions"),{recursive:!0}),le(ve(n,"tmp"),{recursive:!0});let l=ve(n,"tmp",`${process.pid}-${se()}.json`);try{pe(l,`${JSON.stringify(c)}\n`,{flag:"wx"});try{(ut.getStore()?.link??ce)(l,ve(n,"revisions",`${String(a).padStart(8,"0")}.json`))}catch(e){if(ye(e,"EEXIST"))throw new A("Another writer published the read revision.","ULW_LOOP_PUBLISH_CONFLICT",{cause:e});if(["EPERM","ENOTSUP","EXDEV"].some(t=>ye(e,t)))throw new A("Immutable ulw-loop publication requires atomic hard links.","ULW_LOOP_PUBLISH_UNSUPPORTED_FS",{cause:e});throw e}}finally{ue(l,{force:!0})}r.revision=a,r.brief=o;for(let[e,t]of i.entries.entries())Object.assign(t,s[e+s.length-i.entries.length]);await(ut.getStore()?.afterCommit?.()),await vt(n)}function gt(e){let t=Ae(e);if(void 0===t||0===ke(e).length)return[];let i=Ee(e);return function(e,t){let i=new Set(e.goals.map(e=>e.id)),r=new Set;for(let e of t)"goal_added"!==e.kind||void 0===e.goalId||i.has(e.goalId)||r.add(e.goalId);if(0!==r.size)throw new A(`Refusing to rewrite goals.json: the ledger records goals the plan projection lacks (${[...r].join(", ")}). Restore those goals into the newest revisions/ record (keeping plan.revision equal to its file number) before mutating this run.`,"ULW_LOOP_PROJECTION_TRUNCATED",{details:{missingGoalIds:[...r]}})}(t,i),[["goals.json",`${JSON.stringify(t,null,2)}\n`],["ledger.jsonl",0===i.length?"":`${i.map(e=>JSON.stringify(e)).join("\n")}\n`],["brief.md",t.brief??Ie(ve(e,"brief.md"))??""]].filter(([t,i])=>Ie(ve(e,t))!==i)}async function vt(e){for(let[t,i]of gt(e)){le(ve(e,"tmp"),{recursive:!0});let r=ve(e,"tmp",`${process.pid}-${se()}-${t}`);try{await pt(r,i),await fe(r,ve(e,t))}finally{ue(r,{force:!0})}}}function mt(e,t,i){throw new A(e,t,{details:i})}async function ht(e,t,i){return st(e,i,async()=>{let r=await lt(e,i),n=function(e,t){return e.goals.find(e=>e.id===t)??mt(`UlwLoop goal not found: ${t}.`,"ULW_LOOP_GOAL_NOT_FOUND",{goalId:t})}(r,t.goalId),a=function(e,t){return e.successCriteria.find(e=>e.id===t)??mt(`Success criterion not found: ${t}.`,"ULW_LOOP_CRITERION_NOT_FOUND",{goalId:e.id,criterionId:t})}(n,t.criterionId),o=function(e){return e.trim()||mt("Evidence must be a non-empty string.","ULW_LOOP_EVIDENCE_REQUIRED",{})}(t.evidence),s=function(e,t){if(void 0===t)return;let i=new Set,r=[];for(let[n,a]of t.entries()){let t="string"==typeof a?a.trim():"";t||ne(`Artifact ${n+1} must be a non-empty path.`,"ULW_LOOP_ARGUMENT_INVALID",{index:n});let o=ie(e,t);Z(o)||ne(`Evidence artifact does not exist: ${t} (resolved to ${o}).`,"ULW_LOOP_EVIDENCE_ARTIFACT_MISSING",{path:t,resolved:o});let s=ae(e,o);i.has(s)||(i.add(s),r.push(s))}return r}(e,t.artifacts),c=function(e){switch(e){case"pass":return"evidence_captured";case"fail":return"criterion_failed";case"blocked":return"criterion_blocked";default:return mt("Invalid criterion status.","ULW_LOOP_CRITERION_STATUS_INVALID",{status:e})}}(t.status),l=a.status,d=E();a.status=t.status,a.capturedEvidence=o,a.capturedAt=d,void 0!==t.notes&&(a.notes=t.notes),void 0!==s?a.artifacts=s:delete a.artifacts,n.updatedAt=d,r.updatedAt=d;let u={at:d,kind:c,goalId:n.id,criterionId:a.id,criterionStatus:t.status,evidence:o,capturedEvidence:o,...void 0===s?{}:{artifacts:s},before:{status:l},after:{goalId:n.id,criterionId:a.id,status:t.status,evidence:o,capturedAt:d,prevStatus:l}};return await ft(e,i,{plan:r,entries:[u]}),{plan:r,goal:n,criterion:a,ledgerEntry:u}})}function wt(e){return e.successCriteria.filter(e=>"pass"!==e.status)}function bt(e){let t=new Set(Y(e).map(e=>e.id));return e.successCriteria.filter(e=>t.has(e.id)&&"pass"!==e.status)}function _t(e){if(!K(e))throw new A(`Goal ${e.id} has unresolved success criteria.`,"ulw_loop_criteria_not_all_pass",{details:{goalId:e.id,unresolved:wt(e).map(e=>({id:e.id,status:e.status}))}})}function yt(e){if(!function(e){let t=Y(e);return t.length>0&&t.every(e=>"pass"===e.status)}(e))throw new A(`Goal ${e.id} has unresolved essential success criteria.`,"ulw_loop_criteria_not_all_pass",{details:{goalId:e.id,unresolved:bt(e).map(e=>({id:e.id,status:e.status}))}})}import{resolve as It}from"node:path";var Ot,St=/^(?:<replace:[^>]+>|placeholder|todo|tbd|n\/a|stub)$/i;function kt(e){let t=Ot,i={defects:[],poisonedFields:new Set,poisonedArtifactKinds:new Set};Ot=i;try{let t=e();if(0===i.defects.length)return t;!function(e){let t=[...new Map(e.map(e=>[`${e.field}\0${e.message}`,e])).values()],i=t.slice(0,25),r=t.length>i.length,n=[`Final quality gate has ${i.length}${r?"+":""} validation defects:`,...i.map(e=>`- ${e.field}: ${e.message}`)].join("\n");throw new A(n,"ULW_LOOP_QUALITY_GATE_INVALID",{details:{field:i[0]?.field,fields:i,...r?{truncated:!0}:{}}})}(i.defects)}finally{Ot=t}}function At(e,t){if(void 0===Ot)throw new A(e,"ULW_LOOP_QUALITY_GATE_INVALID",{details:{field:t}});Ot.defects.push({field:t,message:e}),Ot.poisonedFields.add(t)}function Et(e){return Ot?.poisonedFields.has(e)??!1}function $t(e){return Ot?.poisonedArtifactKinds.has(e)??!1}function Rt(e,t){return function(e){return"object"==typeof e&&null!==e&&!Array.isArray(e)}(e)?e:(At(`Final quality gate is missing ${t} evidence (accepted input: a bare object with manualQa/gateReview/iteration/criteriaCoverage and optional codeReview, or the same object under a top-level "qualityGate" key).`,t),{})}function jt(e,t){if("string"!=typeof e||""===e.trim())return At(`Final quality gate requires non-empty ${t}.`,t),"";let i=e.trim();return St.test(i)&&At(`Final quality gate rejects placeholder ${t}.`,t),i}function Lt(e,t){return"number"==typeof e&&Number.isFinite(e)?e:(At(`Final quality gate requires numeric ${t}.`,t),0)}function xt(e,t){return Array.isArray(e)&&0!==e.length?e.map(e=>jt(e,t)):(At(`Final quality gate requires ${t}.`,t),[])}function Ct(e,t){return Array.isArray(e)&&0===e.length||At(`${t} must be empty.`,t),[]}function Nt(e,t,i){return e===t||At(`${i} must be ${String(t)}.`,i),t}var Pt=["cli","http","tmux","browser","gui","data"],Gt=["cli-transcript","log","screenshot","image","http-dump","data-diff"],Tt={cli:["cli-transcript","log"],tmux:["cli-transcript","log"],http:["http-dump"],browser:["screenshot","image"],gui:["screenshot","image"],data:["data-diff"]};function Ut(e,t){return function(e){return Pt.some(t=>t===e)}(e)?e:(At(`${t} must be a supported manual QA surface (${Pt.join(", ")}).`,t),"cli")}function Dt(e,t){return function(e){return Gt.some(t=>t===e)}(e)?e:(At(`${t} must be a supported artifact kind (${Gt.join(", ")}); review/QA reports belong in codeReview.reportPath or gateReview.reportPath, not artifactRefs.`,t),"log")}function Mt(e){return Tt[e]}function Wt(e,t){return Mt(e).includes(t)}function qt(e,t,i){if(void 0===i?.repoRoot||void 0===i.fs||Et(t))return;let r=It(i.repoRoot,e);i.fs.existsSync(r)?(i.fs.statSync(r).size<=0&&At(`${t} must point to a non-empty artifact.`,t),void 0===i.currentAttemptDir||function(e,t,i=U){let r=i.relative(t,e);return""===r||".."!==r&&!r.startsWith(`..${i.sep}`)&&!i.isAbsolute(r)}(r,It(i.repoRoot,i.currentAttemptDir))||At(`${t} (${e}) must point to an artifact from the current attempt (${i.currentAttemptDir}).`,t)):At(`${t} must point to an existing artifact.`,t)}function Qt(e,t){return Array.isArray(e)&&0!==e.length?e.flatMap((e,i)=>{let r=`manualQa.artifactRefs[${i}]`,n=Rt(e,r);if(Et(r))return[];let a=`${r}.path`,o=`${r}.id`,s=`${r}.kind`,c=`${r}.description`,l=jt(n.path,a),d=jt(n.id,o),u=Dt(n.kind,s);Et(s)&&function(e){Ot?.poisonedArtifactKinds.add(e)}(d);let p=jt(n.description,c);return qt(l,a,t),[{id:d,kind:u,description:p,path:l}]}):(At("manualQa.artifactRefs must not be empty.","manualQa.artifactRefs"),[])}function Jt(e,t,i){let r=xt(e,t);return Et(t)?[]:r.flatMap(e=>{let r=i.get(e);return void 0===r?(At(`${t} references unknown artifact ${e}.`,t),[]):[r]})}function Bt(e,t){return"not_applicable"===e?(At(`${t} must not be not_applicable.`,t),"passed"):Nt(e,"passed",t)}function Vt(e,t){return"CLEAR"===e||"WATCH"===e?e:(At(`${t} must be CLEAR or WATCH.`,t),"CLEAR")}import{existsSync as Ft,readFileSync as zt}from"node:fs";import{dirname as Ht,join as Kt}from"node:path";import{fileURLToPath as Xt}from"node:url";var Yt={lazycodex:{codeReview:"lazycodex-code-reviewer",manualQa:"lazycodex-qa-executor",gateReview:"lazycodex-gate-reviewer"},"omo-senpi":{codeReview:"omo-native-code-reviewer",manualQa:"omo-native-qa-executor",gateReview:"omo-native-gate-reviewer"}},Zt={"omo-senpi-code-reviewer":Yt["omo-senpi"].codeReview,"omo-senpi-qa-executor":Yt["omo-senpi"].manualQa,"omo-senpi-gate-reviewer":Yt["omo-senpi"].gateReview},ei=Object.values(Yt).map(e=>e.gateReview),ti=(new Set([...ei,...Object.entries(Zt).filter(([,e])=>ei.includes(e)).map(([e])=>e)]),{lazycodex:["manualQa","gateReview","iteration","criteriaCoverage"],"omo-senpi":["manualQa","gateReview","iteration","criteriaCoverage"]}),ii={lazycodex:["codeReview"],"omo-senpi":[]},ri={lazycodex:{codeReview:[Yt.lazycodex.codeReview,"main-session"],manualQa:[Yt.lazycodex.manualQa,"main-session"],gateReview:[Yt.lazycodex.gateReview,"category:deep-high","category:deep-low","category:deep","category:unspecified-high","category:unspecified-low","main-session"]},"omo-senpi":{manualQa:["main-session"],gateReview:["category:deep-high","category:deep-low","category:deep","category:unspecified-high","category:unspecified-low"]}};function ni(e){return"lazycodex"===e||"omo-senpi"===e?e:null}function ai(e){let t=ni((e?.env??process.env).OMO_AGENT_TOOLKIT_SURFACE);if(null!==t)return t;let i=e?.entryDir??Ht(Xt(import.meta.url));return function(e){try{if(!Ft(e))return null;return ni(JSON.parse(zt(e,"utf8")).surface)}catch(e){if(e instanceof Error)return null;throw e}}(Kt(i,"surface.json"))??"lazycodex"}var oi="blocker blockerSignature blockerEvidence blockerOccurrences blockedAt".split(" "),si=/https?:\/\/\S+/g,ci=/[`"'()[\]{}:,;]/g,li=/\s+/g,di=/\b(auth\w*|credential\w*|token|permission\w*|scope\w*|access|unauthorized|forbidden|401|403)\b/,ui=/\b(unset|missing|required|requires|without|omit\w*|not set|not available|no read packages|read packages)\b/,pi=/\b(ghcr|github container registry|read packages|imagepullsecret|package api|anonymous|container image)\b/,fi=/\b(401|unauthorized|anonymous pull|authentication required)\b/,gi=/\b(403|forbidden|read packages|package api)\b/;function vi(e){let t=function(e){return e.toLowerCase().replace(si," ").replace(ci," ").replace(li," ").trim()}(e);return t&&di.test(t)&&ui.test(t)?pi.test(t)?`GHCR_PULL_ACCESS:${[fi.test(t)?"HTTP_401_ANONYMOUS":null,gi.test(t)?"HTTP_403_NO_READ_PACKAGES":null].filter(e=>null!==e).join("+")||"AUTHORIZATION_REQUIRED"}:GHCR_VISIBILITY_OR_CREDENTIAL_REQUIRED`:"EXTERNAL_AUTHORIZATION_REQUIRED":null}function mi(e){let t=Reflect.get(e,"blocker"),i="object"!=typeof(r=t)||null===r||Array.isArray(r)?null:t.signature;var r;return"string"==typeof i?i:null}function hi(e,t,i){let r=`${i}.by`,n=ri[t][i];if("string"!=typeof e||""===e.trim())return jt(e,r),n?.[0]??"";let a=jt(e,r);return void 0!==n&&n.includes(a)||At(`${r} must be one of ${n?.join(", ")??"the configured reviewers"}.`,r),a}function wi(e,t){return kt(()=>function(e,t){let i=t?.reviewerSurface??"lazycodex",r=e,n=Rt(r&&"object"==typeof r&&"qualityGate"in r?r.qualityGate:e,"qualityGate");for(let e of ti[i])Rt(n[e],e);for(let e of Object.keys(n))"codeReview"!==e||ii[i].includes(e)||At("omo-senpi gate has no codeReview lane.",e);"omo-senpi"===i&&void 0!==n.codeReview&&At("omo-senpi gate has no codeReview lane.","codeReview");let a=Rt(n.manualQa,"manualQa"),o=Rt(n.gateReview,"gateReview"),s=Rt(n.iteration,"iteration"),c=Rt(n.criteriaCoverage,"criteriaCoverage"),l=void 0!==n.codeReview?Rt(n.codeReview,"codeReview"):void 0,d=hi(a.by,i,"manualQa"),u=hi(o.by,i,"gateReview"),p=jt(a.evidence,"manualQa.evidence"),f=jt(o.evidence,"gateReview.evidence"),g=Lt(c.totalCriteria,"criteriaCoverage.totalCriteria"),v=Lt(c.passCount,"criteriaCoverage.passCount");!Et("criteriaCoverage.passCount")&&v<g&&At("criteriaCoverage.passCount must cover totalCriteria.","criteriaCoverage.passCount");let m=Qt(a.artifactRefs,t),h=function(e){let t=new Map;for(let i of e)t.has(i.id)&&At(`manualQa.artifactRefs contains duplicate ${i.id}.`,"manualQa.artifactRefs"),t.set(i.id,i);return t}(m),w=function(e,t){return Array.isArray(e)&&0!==e.length?e.flatMap((e,i)=>{let r=Rt(e,`manualQa.surfaceEvidence[${i}]`);if(Et(`manualQa.surfaceEvidence[${i}]`))return[];let n=Ut(r.surface,`manualQa.surfaceEvidence[${i}].surface`),a=Jt(r.artifactRefs,`manualQa.surfaceEvidence[${i}].artifactRefs`,t);for(let e of a)Et(`manualQa.surfaceEvidence[${i}].surface`)||$t(e.id)||Wt(n,e.kind)||At(`manualQa.surfaceEvidence ${n} artifact ${e.kind} is incompatible; surface "${n}" accepts artifact kinds: ${Mt(n).join(", ")}.`,"manualQa.surfaceEvidence");return{id:jt(r.id,`manualQa.surfaceEvidence[${i}].id`),criterionRef:jt(r.criterionRef,`manualQa.surfaceEvidence[${i}].criterionRef`),surface:n,invocation:jt(r.invocation,`manualQa.surfaceEvidence[${i}].invocation`),verdict:Bt(r.verdict,`manualQa.surfaceEvidence[${i}].verdict`),artifactRefs:a.map(e=>e.id)}}):(At("manualQa.surfaceEvidence must not be empty.","manualQa.surfaceEvidence"),[])}(a.surfaceEvidence,h),b=function(e,t){return Array.isArray(e)&&0!==e.length?e.flatMap((e,i)=>{let r=Rt(e,`manualQa.adversarialCases[${i}]`);if(Et(`manualQa.adversarialCases[${i}]`))return[];let n=Jt(r.artifactRefs,`manualQa.adversarialCases[${i}].artifactRefs`,t),a=function(e,t){let i=e.verdict;return"passed"===i?{verdict:"passed"}:"not_applicable"===i?{verdict:"not_applicable",reason:jt(e.reason,`${t}.reason`)}:(At(`${t} must be passed or not_applicable with a reason.`,t),{verdict:"passed"})}(r,`manualQa.adversarialCases[${i}]`);return{id:jt(r.id,`manualQa.adversarialCases[${i}].id`),criterionRef:jt(r.criterionRef,`manualQa.adversarialCases[${i}].criterionRef`),scenario:jt(r.scenario,`manualQa.adversarialCases[${i}].scenario`),expectedBehavior:jt(r.expectedBehavior,`manualQa.adversarialCases[${i}].expectedBehavior`),verdict:a.verdict,...void 0===a.reason?{}:{reason:a.reason},artifactRefs:n.map(e=>e.id)}}):(At("manualQa.adversarialCases must not be empty.","manualQa.adversarialCases"),[])}(a.adversarialCases,h),_=jt(o.reportPath,"gateReview.reportPath");Et("gateReview.reportPath")||qt(_,"gateReview.reportPath",t);let y={manualQa:{by:d,status:Nt(a.status,"passed","manualQa.status"),evidence:p,surfaceEvidence:w,adversarialCases:b,artifactRefs:m},gateReview:{by:u,recommendation:Nt(o.recommendation,"APPROVE","gateReview.recommendation"),reportPath:_,evidence:f,blockers:Ct(o.blockers,"gateReview.blockers")},iteration:{fullRerun:Nt(s.fullRerun,!0,"iteration.fullRerun"),status:Nt(s.status,"passed","iteration.status"),rerunCommands:xt(s.rerunCommands,"iteration.rerunCommands"),evidence:jt(s.evidence,"iteration.evidence")},criteriaCoverage:{totalCriteria:g,passCount:v,originalIntent:jt(c.originalIntent,"criteriaCoverage.originalIntent"),desiredOutcome:jt(c.desiredOutcome,"criteriaCoverage.desiredOutcome"),userOutcomeReview:jt(c.userOutcomeReview,"criteriaCoverage.userOutcomeReview"),adversarialClassesCovered:xt(c.adversarialClassesCovered,"criteriaCoverage.adversarialClassesCovered")}};if("omo-senpi"===i)return{surface:i,...y};if(void 0===l)return{surface:i,...y};let I=jt(l.reportPath,"codeReview.reportPath");return qt(I,"codeReview.reportPath",t),{surface:i,...y,codeReview:{by:hi(l.by,i,"codeReview"),recommendation:Nt(l.recommendation,"APPROVE","codeReview.recommendation"),codeQualityStatus:Vt(l.codeQualityStatus,"codeReview.codeQualityStatus"),reportPath:I,evidence:jt(l.evidence,"codeReview.evidence"),blockers:Ct(l.blockers,"codeReview.blockers")}}}(e,t))}import{readFile as bi}from"node:fs/promises";new Set("--brief --brief-file --session-id --codex-goal-mode --validation-batch-json --goal --goal-id --criterion-id --status --evidence --notes --codex-goal-json --quality-gate-json --kind --rationale --title --objective --target-goal-id --source --after-json --directive-json --directive-file --idempotency-key --proposals-json".split(" ")),new Set("create-goals status complete-goals criteria record-evidence checkpoint steer add-goal record-review-blockers".split(" "));function _i(e,t){return Object.entries(e).find(([e])=>e===t)?.[1]}function yi(e,t){let i=_i(e,t);return"string"==typeof i&&i.trim().length>0?i.trim():void 0}async function Ii(e,t){let i=await async function(e){if(void 0!==e)try{return JSON.parse(function(e){let t=e.trim();return t.startsWith("{")||t.startsWith("[")}(e)?e:await bi(e,"utf8"))}catch(e){let t=e instanceof Error?e.message:"unknown error";throw new A(`Invalid JSON input: ${t}`,"ULW_LOOP_JSON_INPUT_INVALID",{cause:e})}}(e);if(void 0===i)return;Array.isArray(i)||Ai("--validation-batch-json must be a JSON array.");let r=i.map(Oi);return function(e,t){let i=new Set(t.map(e=>e.id)),r=new Set,n=new Set;for(let t of e){r.has(t.batchId)&&Ai(`duplicate validation batch id: ${t.batchId}.`),r.add(t.batchId),new Set(t.memberIds).size!==t.memberIds.length&&Ai(`validation batch ${t.batchId} has duplicate memberIds.`),t.memberIds.includes(t.finalGoalId)||Ai(`validation batch ${t.batchId} finalGoalId must be a member.`,"ULW_LOOP_VALIDATION_BATCH_FINAL_NOT_MEMBER");for(let e of t.memberIds)i.has(e)||Ai(`validation batch ${t.batchId} references unknown goal: ${e}.`,"ULW_LOOP_VALIDATION_BATCH_MEMBER_UNKNOWN"),n.has(e)&&Ai(`goal appears in multiple validation batches: ${e}.`,"ULW_LOOP_VALIDATION_BATCH_OVERLAP"),n.add(e)}}(r,t),r}function Oi(e){(function(e){return"object"==typeof e&&null!==e&&!Array.isArray(e)})(e)||Ai("validation batch entries must be objects.");let t=yi(e,"batchId"),i=function(e,t){let i=_i(e,t);return Array.isArray(i)&&i.every(e=>"string"==typeof e&&e.trim().length>0)?i.map(e=>e.trim()):void 0}(e,"memberIds"),r=yi(e,"finalGoalId");return void 0===t&&Ai("validation batch requires batchId."),(void 0===i||i.length<2)&&Ai("validation batch requires at least two memberIds."),void 0===r&&Ai("validation batch requires finalGoalId."),{batchId:t,memberIds:i,finalGoalId:r}}function Si(e,t){let i=function(e,t){return e.validationBatches?.find(e=>e.memberIds.includes(t))}(e,t);return i?.finalGoalId===t?i:void 0}function ki(e,t){let i=e.goals.find(e=>e.id===t);return void 0!==i&&function(e,t){return q(e.status)||Q(e,t)}(i,e)}function Ai(e,t="ULW_LOOP_VALIDATION_BATCH_INVALID"){throw new A(e,t)}var Ei={existsSync:e,statSync:t};function $i(e,t){throw new A(e,t)}function Ri(e,t,i,r,n){let a=vi(r),o=null===a?0:function(e,t){return e.goals.filter(e=>e.blockerSignature===t||mi(e)===t).length}(t,a)+1,s=null!==a&&o>=3;e.status=s?"needs_user_decision":i,e.updatedAt=n,("failed"===i||s)&&(e.failedAt=n,e.failureReason=r),("blocked"===i||s)&&(e.blockedReason=r),null!==a&&(e.blockerSignature=a,e.blockerOccurrenceCount=o,e.requiredExternalDecision=`Resolve external authorization: ${a}`),s&&(e.nonRetriable=!0),t.activeGoalId===e.id&&delete t.activeGoalId}function ji(e,t,i){return void 0!==i?"aggregate_completed":"complete"===e?"goal_completed":"needs_user_decision"===t.status?"goal_needs_user_decision":"blocked"===e?"goal_blocked":"goal_failed"}async function Li(t,n,a,o){return st(t,a,async()=>{let c,l,d,g=await lt(t,a),h=function(e,t){return e.goals.find(e=>e.id===t)??$i(`Unknown ulw-loop id: ${t}.`,"ulw_loop_goal_not_found")}(g,n.goalId),w=n.evidence.trim()||$i("Evidence must be a non-empty string.","ulw_loop_evidence_required"),b=E(),_=[],y=[];var I,O;if("complete"===n.status){let S,k="aggregate"===W(g),E=V(g,h),$=void 0!==Si(g,h.id);E?(_t(h),function(e){let t=e.goals.flatMap(e=>wt(e).map(t=>({goalId:e.id,id:t.id,status:t.status})));if(0!==t.length)throw new A("Ulw-loop aggregate has unresolved success criteria.","ulw_loop_criteria_not_all_pass",{details:{unresolved:t}})}(g),function(e,t){let i=(e.validationBatches??[]).filter(i=>i.memberIds.some(i=>i!==t&&!ki(e,i)));if(i.length>0)throw new A("Validation batches remain open.","ULW_LOOP_VALIDATION_BATCH_OPEN",{details:{batchIds:i.map(e=>e.batchId)}})}(g,h.id)):k?yt(h):_t(h);try{let e=await async function(e){let t=await u(e.raw,e.repoRoot),i=p(t,{expectedObjective:z(e.plan,e.goal),acknowledgedObjectives:v(e.plan),..."aggregate"===W(e.plan)?{acceptedObjectives:H(e.plan)}:{}});if(!i.ok)throw new s(f(i));return{raw:t?.raw,nextActions:i.nextActions,warnings:i.warnings,...void 0===i.unacknowledgedObjective?{}:{unacknowledgedObjective:i.unacknowledgedObjective}}}({repoRoot:t,plan:g,goal:h,raw:n.codexGoalJson,evidence:w,...void 0===a?{}:{scope:a}});d=e.raw,_=e.nextActions,y=e.warnings,m(g,e.unacknowledgedObjective)}catch(e){if(!(e instanceof A))throw e;S=e}if($&&function(e,t){let i=Si(e,t.id);if(void 0===i)return;let r=i.memberIds.filter(i=>i!==t.id&&!ki(e,i));if(r.length>0)throw new A("Validation batch has unresolved members.","ULW_LOOP_VALIDATION_BATCH_OPEN",{details:{batchId:i.batchId,open:r}})}(g,h),$&&void 0===n.qualityGateJson)throw new A("Validation batch final checkpoint requires --quality-gate-json.","ULW_LOOP_VALIDATION_BATCH_GATE_REQUIRED");if(E&&(c=function(e,t,i){return{status:"complete",completedAt:e,evidence:t,codexGoal:i}}(b,w,d)),E||void 0!==c||$)try{l=wi(await async function(t,n){if(void 0===t||""===t.trim())return;let a=t.trim();try{return JSON.parse(a)}catch(e){if(!(e instanceof SyntaxError))throw e}let o=r(n,a);if(!e(o))return $i("Quality gate JSON is neither valid JSON nor a readable path.","ulw_loop_json_input_invalid");try{return JSON.parse(await i(o,"utf8"))}catch(e){return $i("Quality gate path does not contain valid JSON"+(e instanceof Error?`: ${e.message}`:"."),"ulw_loop_json_input_invalid")}}(n.qualityGateJson,t),{repoRoot:t,fs:Ei,reviewerSurface:o?.surface??ai(),...2===g.evidenceLayoutVersion?{currentAttemptDir:T(h.id,h.attempt,a)}:{}}),function(e,t,i){let r=Si(e,t.id);if(void 0===r)return;let n=r.memberIds.map(t=>e.goals.find(e=>e.id===t)).filter(e=>void 0!==e),a=n.flatMap(e=>e.successCriteria.filter(e=>"pass"!==e.status).map(t=>`${e.id}:${t.id}`));if(a.length>0)throw new A("Validation batch criteria remain pending.","ULW_LOOP_VALIDATION_BATCH_CRITERIA_PENDING",{details:{batchId:r.batchId,pending:a}});let o=n.reduce((e,t)=>e+t.successCriteria.length,0),s=n.reduce((e,t)=>e+t.successCriteria.filter(e=>"pass"===e.status).length,0);if(i.criteriaCoverage.totalCriteria!==o||i.criteriaCoverage.passCount!==s)throw new A("Validation batch gate coverage does not match member criteria.","ULW_LOOP_VALIDATION_BATCH_GATE_MISMATCH",{details:{batchId:r.batchId,expected:{totalCriteria:o,passCount:s},actual:i.criteriaCoverage}})}(g,h,l)}catch(e){if(!(e instanceof A)||void 0===S)throw e;throw O=e,new A(`${(I=S).message}\n${O.message}`,"ULW_LOOP_QUALITY_GATE_INVALID",{details:{...I.details??{},...O.details??{}}})}if(void 0!==S)throw S;h.status="complete",h.completedAt=b,h.evidence=w,delete h.failedAt,delete h.failureReason,function(e){for(let t of oi)Reflect.deleteProperty(e,t)}(h),g.activeGoalId===h.id&&delete g.activeGoalId}else Ri(h,g,n.status,w,b);h.updatedAt=b,void 0!==c&&(g.aggregateCompletion=c),void 0!==c&&(_=[..._,'aggregate complete — now update_goal({status:"complete"})']),g.updatedAt=b;let S=function(e,t,i,r,n,a){let o="lazycodex"===r?.surface&&"WATCH"===r.codeReview?.codeQualityStatus,s={at:e,kind:ji(t.status,i,a),goalId:i.id,status:i.status,evidence:o&&"lazycodex"===r.surface?`${t.evidence} | codeQuality=WATCH: ${r.codeReview?.evidence??""}`:t.evidence};return void 0!==n&&(s.codexGoal=n),void 0!==r&&(s.qualityGate=r),void 0!==i.blockerSignature&&(s.blockerSignature=i.blockerSignature),void 0!==i.blockerOccurrenceCount&&(s.blockerOccurrenceCount=i.blockerOccurrenceCount),void 0!==i.requiredExternalDecision&&(s.requiredExternalDecision=i.requiredExternalDecision),s}(b,n,h,l,d,c),k=[S],$="complete"===n.status?Si(g,h.id):void 0;return void 0!==$&&k.push({at:b,kind:"batch_closed",goalId:h.id,message:$.batchId}),await ft(t,a,{plan:g,entries:k}),void 0===c?{plan:g,goal:h,ledgerEntry:S,nextActions:_,warnings:y}:{plan:g,goal:h,ledgerEntry:S,aggregateCompletion:c,nextActions:_,warnings:y}})}function xi(e,t){return`${e}/${t}`}function Ci(e,t){return{manualQa:{by:"main-session",status:"passed",evidence:"<replace:manual QA evidence>",surfaceEvidence:[{id:"surface-cli",criterionRef:"<replace:criterion id>",surface:"cli",invocation:"<replace:command>",verdict:"passed",artifactRefs:["artifact-cli"]},{id:"surface-data",criterionRef:"<replace:criterion id>",surface:"data",invocation:"<replace:command>",verdict:"passed",artifactRefs:["artifact-data"]}],adversarialCases:[{id:"<replace:adversarial case id>",criterionRef:"<replace:criterion id>",scenario:"<replace:scenario>",expectedBehavior:"<replace:expected behavior>",verdict:"not_applicable",reason:"<replace:reason>",artifactRefs:["artifact-cli"]}],artifactRefs:[{id:"artifact-cli",kind:"cli-transcript",description:"<replace:artifact description>",path:xi(t,"cli-transcript.txt")},{id:"artifact-data",kind:"data-diff",description:"<replace:artifact description>",path:xi(t,"data-diff.txt")}]},gateReview:{by:"omo-senpi"===e?"category:deep-high":"main-session",recommendation:"APPROVE",reportPath:xi(t,"gate-review.md"),evidence:"<replace:gate review evidence>",blockers:[],notes:[]},iteration:{fullRerun:!0,status:"passed",rerunCommands:["<replace:verification command>"],evidence:"<replace:iteration evidence>"},criteriaCoverage:{totalCriteria:0,passCount:0,originalIntent:"<replace:original intent>",desiredOutcome:"<replace:desired outcome>",userOutcomeReview:"<replace:user outcome review>",adversarialClassesCovered:["<replace:adversarial class>"]}}}function Ni(e,t){throw new A(`Invalid successCriteria: ${e}`,"ULW_LOOP_ARGUMENT_INVALID",{details:t})}function Pi(e,t,i){return("string"==typeof e?e.trim():"")||Ni(`entry ${i+1} needs a non-empty ${t}.`,{index:i,field:t})}function Gi(e){return`C${String(e+1).padStart(3,"0")}`}function Ti(e){return 0===e.length&&Ni("provide at least one criterion or omit the field for placeholders.",{count:0}),e.map((e,t)=>{if("object"!=typeof e||null===e||Array.isArray(e))return Ni(`entry ${t+1} must be an object.`,{index:t});let i={...e},r=i.userModel??"happy";if("string"!=typeof(n=r)||!k.some(e=>e===n))return Ni(`entry ${t+1} userModel must be one of ${k.join(", ")}.`,{index:t,userModel:String(r)});var n;let a=i.essential;return void 0!==a&&"boolean"!=typeof a?Ni(`entry ${t+1} essential must be a boolean.`,{index:t}):{id:Gi(t),scenario:Pi(i.scenario,"scenario",t),userModel:r,expectedEvidence:Pi(i.expectedEvidence,"expectedEvidence",t),essential:a??!0,capturedEvidence:null,status:"pending"}})}function Ui(e){return e.replace(/^\s*(?:[-*+]\s+|\d+[.)]\s+)/,"").trim()}function Di(e){return e.replace(/\s+/g," ").trim()}function Mi(e,t){let i=e.split(/\r?\n/).map(e=>e.trim()).find(Boolean)??t;return i.length>72?`${i.slice(0,69).trimEnd()}...`:i}function Wi(e,t){let i=e?.trim();if(!i)throw new A(`Missing ${t}.`,"ULW_LOOP_ARGUMENT_MISSING");return i}function qi(e,t,i){return"omo-senpi"===i?`Replace via agentToolkit.steer({ kind: "revise_criterion", source: "finding", goalId: "${e}", criterionId: "${t}", scenario, expectedEvidence, evidence, rationale }) (or pass successCriteria to addGoal)`:`Replace via omo-agent-toolkit ulw-loop steer --kind revise_criterion --goal-id ${e} --criterion-id ${t} --scenario "<scenario>" --expected-evidence "<proof>" --evidence "<why>" --rationale "<why>"`}function Qi(e,t,i={}){let r=function(e){return e.length>80?`${e.slice(0,77).trimEnd()}...`:e}(Di(t)||`Goal ${e+1}`),n=i.goalId??`G${String(e+1).padStart(3,"0")}`,a=i.surface??"lazycodex";return[["happy",`happy path for: ${r}`,`observable happy-path proof for goal ${e+1}`,!0],["edge","edge case (boundary/empty/malformed)",`boundary or malformed-input proof for: ${r}`,!0],["regression","regression: adjacent surface still works",`regression proof for neighboring behavior after: ${r}`,!1]].map(([e,t,i,r],o)=>{let s=Gi(o);return{id:s,scenario:t,userModel:e,expectedEvidence:`${qi(n,s,a)} with ${i}.`,essential:r,capturedEvidence:null,status:"pending"}})}function Ji(e,t,i,r,n={}){let a=Wi(e,"title"),o=Wi(t,"objective"),s=function(e,t){let i=e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,36).replace(/-+$/g,"");return`G${String(t+1).padStart(3,"0")}${i?`-${i}`:""}`}(a,i);return{id:s,title:a,objective:o,status:"pending",successCriteria:void 0===n.successCriteria?Qi(i,o,{goalId:s,...void 0===n.surface?{}:{surface:n.surface}}):Ti(n.successCriteria),attempt:0,createdAt:r,updatedAt:r}}function Bi(e){return"superseded"!==e.steeringStatus&&"blocked"!==e.steeringStatus}async function Vi(e,t,i,r="lazycodex"){return st(e,i,async()=>{let n;if(function(e,t){let i=j(e,t);return he(_e(i,"goals.json"))||Oe(i).length>0}(e,i))try{n=await lt(e,i)}catch(e){if(!t.force)throw e}if(!t.force&&void 0!==n){if(B(n))throw function(e,t){return new A([`Existing ulw-loop aggregate is already complete at ${x(e)}.`,..."omo-senpi"===t?["Start a new run under a fresh session id (a new senpi session) or call agentToolkit.createGoals({ brief, force: true }) to recreate."]:["Start a new run with `omo-agent-toolkit ulw-loop create-goals --session-id <new-id> ...` to isolate fresh state.","Use --force only when you intentionally want to overwrite the completed evidence."]].join(" "),"ULW_LOOP_PLAN_EXISTS_COMPLETE")}(i,r);throw new A(`Refusing to overwrite existing ${x(i)}; pass --force to recreate it.`,"ULW_LOOP_PLAN_EXISTS")}let a=E(),o=function(e){let t=e.split(/\r?\n/).map(e=>({original:e,cleaned:Di(Ui(e))})).filter(({cleaned:e})=>e.length>0&&e.length<=1200).filter(({original:e,cleaned:t},i,r)=>/^\s*(?:[-*+]\s+|\d+[.)]\s+)/.test(e)&&r.findIndex(e=>e.cleaned===t)===i).map(({cleaned:e})=>e),i=e.split(/\n\s*\n/).map(Di).filter(e=>e.length>0&&!e.startsWith("#"));return((t.length>0?t:i).length>0?t.length>0?t:i:["Complete the requested project objective."]).map((e,t)=>({title:Mi(e,`Goal ${t+1}`),objective:e}))}(t.brief).map((e,t)=>Ji(e.title,e.objective,t,a,{surface:r})),s={version:1,revision:n?.revision??0,ledgerResetRevision:(n?.revision??0)+1,brief:t.brief.endsWith("\n")?t.brief:`${t.brief}\n`,evidenceLayoutVersion:2,createdAt:a,updatedAt:a,briefPath:L(i),goalsPath:x(i),ledgerPath:C(i),codexGoalMode:t.codexGoalMode??"aggregate",goals:o},c=await Ii(t.validationBatchesJson,o);return void 0!==c&&(s.validationBatches=c),"aggregate"===s.codexGoalMode&&(s.codexObjective=M(i)),await async function(){await(ut.getStore()?.beforeMutation?.())}(),await ft(e,i,{plan:s,entries:[{at:a,kind:"plan_created",message:`${o.length} goal(s) created`}]}),s})}async function Fi(e,t,i,r="lazycodex"){return st(e,i,async()=>{let n=await lt(e,i),a=E(),o=function(e,t,i,r,n={}){let a=Ji(t,i,e.goals.length,r,n);return e.goals.push(a),e.updatedAt=r,a}(n,t.title,t.objective,a,{surface:r,...void 0===t.successCriteria?{}:{successCriteria:t.successCriteria}});return await ft(e,i,{plan:n,entries:[{at:a,kind:"goal_added",goalId:o.id,status:o.status,message:o.title}]}),{plan:n,goal:o}})}function zi(e){let t=t=>e.goals.filter(e=>e.status===t).length,i=t=>e.goals.reduce((e,i)=>e+i.successCriteria.filter(e=>e.status===t).length,0);return{total:e.goals.length,pending:t("pending"),in_progress:t("in_progress"),complete:t("complete"),failed:t("failed"),blocked:t("blocked"),review_blocked:t("review_blocked"),needs_user_decision:t("needs_user_decision"),superseded:e.goals.filter(e=>"superseded"===e.steeringStatus).length,criteria:{total:e.goals.reduce((e,t)=>e+t.successCriteria.length,0),pass:i("pass"),pending:i("pending"),fail:i("fail"),blocked:i("blocked")}}}var Hi="blockedReason blockerSignature blockerOccurrenceCount requiredExternalDecision nonRetriable failedAt failureReason completedAt blocker blockerEvidence blockerOccurrences blockedAt".split(" ");function Ki(e,t){throw new A(e,t)}function Xi(e,t,i){let r=e.goals.length,n=function(e){let t=e.goals.reduce((e,t)=>{let i=/^G(\d+)/u.exec(t.id)?.[1];return void 0===i?e:Math.max(e,Number(i))},0);return`G${String(t+1).padStart(3,"0")}`}(e),a={id:n,title:t.title,objective:t.objective,status:"pending",successCriteria:Qi(r,t.objective,{goalId:n}),attempt:0,createdAt:i,updatedAt:i};return e.goals.push(a),a}function Yi(e,t="lazycodex"){let i=[],r=e.goals.find(t=>t.id===e.activeGoalId);0===e.goals.length?i.push(`No goals yet: bootstrap with \`${je(t)}\`.`):void 0!==r&&i.push(...function(e,t,i){let r=t.successCriteria.filter(e=>"pass"!==e.status);return r.length>0?["omo-senpi"===i?`${t.id} has ${r.length} unresolved criterion(s) (${r.map(e=>e.id).join(", ")}): record proof with \`agentToolkit.recordEvidence({ goalId: "${t.id}", criterionId: "<id>", status: "pass", evidence: "<observable proof>" })\`.`:`${t.id} has ${r.length} unresolved criterion(s) (${r.map(e=>e.id).join(", ")}): record proof with \`omo-agent-toolkit ulw-loop record-evidence --goal-id ${t.id} --criterion-id <id> --status pass --evidence "<observable proof>"\`.`]:K(t)&&V(e,t)?["omo-senpi"===i?`${t.id} passes every criterion and is the final story: complete the driver goal, then call \`agentToolkit.checkpoint({ goalId: "${t.id}", printTemplate: true })\` to build the final quality gate. Use status().result.currentAttemptDir for all quality-gate artifacts.`:`${t.id} passes every criterion and is the final story: update_goal complete, then checkpoint --print-template to build the final quality gate. Use status --json's currentAttemptDir for all quality-gate artifacts.`]:["omo-senpi"===i?`${t.id} passes every criterion: close it with \`agentToolkit.checkpoint({ goalId: "${t.id}", status: "complete", evidence: "<proof>" })\`. Put quality-gate artifacts under status().result.currentAttemptDir.`:`${t.id} passes every criterion: close it with \`omo-agent-toolkit ulw-loop checkpoint --goal-id ${t.id} --status complete --evidence "<proof>" --codex-goal-json '<get_goal json>'\`. Put quality-gate artifacts under the currentAttemptDir shown by status --json.`]}(e,r,t));for(let r of e.goals.filter(e=>"review_blocked"===e.status))i.push("omo-senpi"===t?`${r.id} is review_blocked: capture the reviewer verdict with \`agentToolkit.recordReviewBlockers({ goalId: "${r.id}", title: "<title>", objective: "<objective>", evidence: "<verdict>" })\`.`:`${r.id} is review_blocked: capture the reviewer verdict with \`omo-agent-toolkit ulw-loop record-review-blockers --goal-id ${r.id} --title "<title>" --objective "<objective>" --evidence "<verdict>" --codex-goal-json '<get_goal json>'\`.`);return 2===e.evidenceLayoutVersion&&void 0!==r||i.push("plan is evidence-layout v1; artifacts go under .omo/evidence/"),i}var Zi=(e,t)=>Object.entries(e).find(([e])=>e===t)?.[1],er=(e,t)=>{let i=Zi(e,t);return(e=>"string"==typeof e&&e.trim().length>0)(i)?i.trim():void 0},tr=e=>{let t=Zi(e,"after");return"object"!=typeof t||null===t||Array.isArray(t)?void 0:t},ir=(e,t,i)=>er(e,t)??er(tr(e)??e,i),rr=e=>e.targetGoalIds??[e.targetGoalId??er(e,"goalId")??""].filter(Boolean),nr=e=>{if("object"!=typeof e||null===e||Array.isArray(e))return null;let t=er(e,"title"),i=er(e,"objective");return void 0===t||void 0===i?null:{title:t,objective:i}},ar=(e,t)=>void 0===t?void 0:e.goals.find(e=>e.id===t);function or(e,t,i,r,n,a="lazycodex"){let o=function(e,t){let i=e.goals.reduce((e,t)=>{let i=/^G(\d+)(?:-|$)/u.exec(t.id)?.[1];return void 0===i?e:Math.max(e,Number(i))},0);return`G${String(i+t).padStart(3,"0")}`}(e,n),s=/^G(\d+)/u.exec(o)?.[1],c=void 0===s?e.goals.length+n-1:Number(s)-1;return{id:o,title:t.title,objective:t.objective,status:"pending",successCriteria:Qi(c,t.objective,{goalId:o,surface:a}),attempt:0,createdAt:r,updatedAt:r,evidence:i}}function sr(e,t,i,r="lazycodex"){let n=ar(e,rr(t)[0]);if(void 0===n)return;let a=(e=>{let t=e.childGoals;if(void 0!==t&&t.length>0)return t;let i=tr(e),r=void 0===i?void 0:Zi(i,"children");return Array.isArray(r)?r.map(nr).filter(e=>null!==e):[]})(t).map((n,a)=>or(e,n,t.evidence,i,a+1,r));if(n.steeringEvidence=t.evidence,n.steeringRationale=t.rationale,n.updatedAt=i,0===a.length)n.status="blocked",n.steeringStatus="blocked",n.blockedReason=t.blockedReason??t.rationale;else{n.steeringStatus="superseded",n.supersededBy=a.map(e=>e.id);for(let e of a)e.supersedes=[n.id];e.goals.splice(e.goals.indexOf(n)+1,0,...a),function(e,t,i){0!==i.length&&void 0!==e.validationBatches&&(e.validationBatches=e.validationBatches.map(e=>{if(!e.memberIds.includes(t))return e;let r=e.memberIds.flatMap(e=>e===t?[...i]:[e]),n=i[i.length-1]??e.finalGoalId,a=e.finalGoalId===t?n:e.finalGoalId;return{batchId:e.batchId,memberIds:r,finalGoalId:a}}))}(e,n.id,a.map(e=>e.id))}e.activeGoalId===n.id&&delete e.activeGoalId}function cr(e,t){let i={updatedAt:e.updatedAt,goalCount:e.goals.length,goalIds:e.goals.map(e=>e.id),goals:e.goals.filter(e=>t.has(e.id))};return void 0===e.activeGoalId?i:{...i,activeGoalId:e.activeGoalId}}var lr=["user_prompt_submit","finding","cli"],dr=new Set(["aggregateCompletion","codexObjective","codexObjectiveAliases","acknowledgedDriverObjectives","originalConstraints","qualityGate","status","completedAt","completionStatus"]),ur=e=>"object"==typeof e&&null!==e,pr=e=>ur(e)&&!Array.isArray(e),fr=(e,t)=>Object.entries(e).find(([e])=>e===t)?.[1],gr=(e,t)=>{let i=fr(e,t);return(e=>"string"==typeof e&&e.trim().length>0)(i)?i.trim():void 0},vr=e=>"string"==typeof e&&S.some(t=>t===e),mr=e=>"string"==typeof e&&lr.some(t=>t===e),hr=(e,t)=>{let i=fr(e,t);return Array.isArray(i)&&i.every(e=>"string"==typeof e)?i:[]};function wr(e){let t=hr(e,"targetGoalIds"),i=gr(e,"targetGoalId")??gr(e,"goalId");return t.length>0?t:void 0===i?[]:[i]}var br=e=>{let t=fr(e,"after");return pr(t)?t:void 0},_r=(e,t,i)=>gr(e,t)??gr(br(e)??e,i);var yr=e=>{let t=hr(e,"pendingOrder");return t.length>0?t:hr(br(e)??e,"pendingGoalIds")};function Ir(e){if(!ur(e))return!1;for(let[t,i]of Object.entries(e))if(dr.has(t)||t.toLowerCase().includes("complete")||Ir(i))return!0;return!1}function Or(e){return"string"==typeof e?e:ur(e)?Object.values(e).map(Or).filter(Boolean).join("\n"):""}function Sr(e){let t=Or(e).toLowerCase();return/\b(skip|bypass|weaken|remove|omit|auto[-\s]?complete|mark complete|complete faster)\b/.test(t)&&/\b(test|tests|verification|review|quality gate|complete|completion)\b/.test(t)}function kr(e,t){let i=[];pr(t)||i.push("proposal must be an object");let r=pr(t)?t:{},n=fr(r,"kind");return vr(n)||i.push(`invalid kind: ${String(n)}`),mr(fr(r,"source"))||i.push(`invalid source: ${String(fr(r,"source"))}`),void 0===gr(r,"evidence")&&i.push("missing evidence"),void 0===gr(r,"rationale")&&i.push("missing rationale"),Ir(t)&&i.push("protected payload"),Sr(t)&&i.push("weakened completion"),B(e)&&i.push("plan already complete"),vr(n)&&function(e,t,i,r){let n=Ar(e,wr(t)[0]);"add_subgoal"!==i||void 0!==gr(t,"title")&&void 0!==gr(t,"objective")||r.push("add_subgoal requires title/objective");"split_subgoal"!==i&&"revise_pending_wording"!==i&&"mark_blocked_superseded"!==i||void 0!==n||r.push(`${i} requires target`);"split_subgoal"!==i&&"revise_pending_wording"!==i||void 0===n||"pending"===n.status||r.push(`${i} requires pending target`);let a=function(e){let t=fr(e,"childGoals");if(Array.isArray(t)&&t.length>0)return t;let i=br(e),r=void 0===i?void 0:fr(i,"children");return Array.isArray(r)?r:[]}(t);"split_subgoal"===i&&0===a.length&&r.push("split_subgoal requires children");"split_subgoal"!==i&&"mark_blocked_superseded"!==i||!a.some(e=>null===function(e){if(!pr(e))return null;let t=gr(e,"title"),i=gr(e,"objective");return void 0===t||void 0===i?null:{title:t,objective:i}}(e))||r.push(`${i} children require title/objective`);"reorder_pending"===i&&function(e,t,i){let r=yr(t),n=e.goals.filter(e=>"pending"===e.status&&void 0===e.steeringStatus).map(e=>e.id);0===r.length&&i.push("reorder_pending requires ids");new Set(r).size!==r.length&&i.push("duplicate pending id");r.some(e=>!n.includes(e))&&i.push("unknown pending id")}(e,t,r);"revise_pending_wording"===i&&void 0===_r(t,"revisedTitle","title")&&void 0===_r(t,"revisedObjective","objective")&&r.push("revise_pending_wording requires update");"revise_criterion"===i&&function(e,t,i){let r=Ar(e,wr(t)[0]),n=gr(t,"criterionId");void 0===r?i.push("revise_criterion requires goalId"):(void 0===n||r.successCriteria.every(e=>e.id!==n))&&i.push("revise_criterion requires criterionId");let a=fr(t,"userModel");void 0===fr(t,"scenario")&&void 0===fr(t,"expectedEvidence")&&void 0===a&&i.push("revise_criterion requires update");void 0===a||(o=a,"string"==typeof o&&k.some(e=>e===o))||i.push("invalid userModel");var o}(e,t,r)}(e,r,n,i),function(e,t){let i=pr(e)?e:void 0,r=void 0===i?void 0:fr(i,"kind"),n=void 0===i?void 0:fr(i,"source"),a=void 0===i?"":gr(i,"evidence")??"",o=void 0===i?"":gr(i,"rationale")??"",s={kind:vr(r)?r:"annotate_ledger",source:mr(n)?n:"cli",targetGoalIds:void 0===i?[]:wr(i),evidence:a,rationale:o,invariant:{accepted:0===t.length,structuralInvariantAccepted:0===t.length,evidenceBackedNecessity:a.length>0&&o.length>0,noEasierCompletion:!Sr(e),rejectedReasons:t,reasons:t}};if(void 0===i)return s;let c=gr(i,"criterionId"),l=gr(i,"directiveText"),d=gr(i,"promptSignature"),u=gr(i,"idempotencyKey");return void 0!==c&&(s.criterionId=c),void 0!==l&&(s.directiveText=l),void 0!==d&&(s.promptSignature=d),void 0!==u&&(s.idempotencyKey=u),s}(t,i)}function Ar(e,t){return void 0===t?void 0:e.goals.find(e=>e.id===t)}function Er(e,t,i,r="lazycodex"){let n=structuredClone(e);if(!i.invariant.accepted)return n;let a=t.now?.toISOString()??E();if("add_subgoal"===t.kind&&n.goals.push(or(n,{title:t.title??"",objective:t.objective??""},t.evidence,a,1,r)),"reorder_pending"===t.kind){let e=yr(t);n.goals=[...e.map(e=>Ar(n,e)).filter(e=>void 0!==e),...n.goals.filter(t=>!e.includes(t.id))]}return"revise_pending_wording"===t.kind&&function(e,t,i){let r=ar(e,rr(t)[0]);void 0!==r&&(r.title=ir(t,"revisedTitle","title")??r.title,r.objective=ir(t,"revisedObjective","objective")??r.objective,r.steeringEvidence=t.evidence,r.steeringRationale=t.rationale,r.updatedAt=i)}(n,t,a),"split_subgoal"!==t.kind&&"mark_blocked_superseded"!==t.kind||sr(n,t,a,r),"revise_criterion"===t.kind&&function(e,t,i){let r=ar(e,rr(t)[0]),n=r?.successCriteria.findIndex(e=>e.id===t.criterionId)??-1,a=r?.successCriteria[n];if(void 0===r||void 0===a)return;let o=Zi(t,"userModel");var s;r.successCriteria[n]={...a,scenario:er(t,"scenario")??a.scenario,expectedEvidence:er(t,"expectedEvidence")??a.expectedEvidence,userModel:(s=o,"string"==typeof s&&k.some(e=>e===s)?o:a.userModel)},r.updatedAt=i}(n,t,a),"annotate_ledger"!==t.kind&&(n.updatedAt=a),n}async function $r(e,t,i,r="lazycodex"){return st(e,i,async()=>{let n=await lt(e,i),a=t.idempotencyKey??t.promptSignature,o=void 0===a?void 0:await async function(e,t,i){return Ze(e,i).find(e=>{return!("steering_accepted"!==(i=e.kind)&&"steering_rejected"!==i&&"criteria_revised"!==i&&"batch_updated"!==i||!0!==e.steering?.invariant.accepted||e.idempotencyKey!==t&&e.steering.idempotencyKey!==t&&e.steering.promptSignature!==t);var i})}(e,a,i);if(void 0!==o?.steering){let{before:e,after:t,...i}=o.steering;return{plan:n,accepted:!0,audit:{...i,deduped:!0},rejectedReasons:[],deduped:!0}}let s=kr(n,t),c=s.invariant.accepted,l=c?Er(n,t,s,r):n,d={...s};if(c){let e=function(e,t){let i=new Map(e.goals.map(e=>[e.id,e])),r=new Set;for(let e of t.goals){let t=i.get(e.id);void 0!==t&&JSON.stringify(t)===JSON.stringify(e)||r.add(e.id),i.delete(e.id)}for(let e of i.keys())r.add(e);return r}(n,l);d.before=cr(n,e),d.after=cr(l,e)}let u=t.now?.toISOString()??E(),p=c?function(e,t,i){return JSON.stringify(e.validationBatches??[])===JSON.stringify(t.validationBatches??[])?null:{at:i,kind:"batch_updated",before:e.validationBatches??[],after:t.validationBatches??[],message:"Validation batch membership updated after steering."}}(n,l,u):null,f=[Rr(t,d,u)];return null!==p&&f.push(p),await ft(e,i,{plan:l,entries:f}),{plan:l,accepted:c,audit:d,rejectedReasons:s.invariant.rejectedReasons,deduped:!1}})}function Rr(e,t,i){let r={at:i,kind:t.invariant.accepted?"revise_criterion"===e.kind?"criteria_revised":"steering_accepted":"steering_rejected",evidence:e.evidence,message:e.rationale,steering:t,mutationKind:e.kind},n=t.targetGoalIds[0];return void 0!==n&&(r.goalId=n),void 0!==e.criterionId&&(r.criterionId=e.criterionId),void 0!==e.idempotencyKey&&(r.idempotencyKey=e.idempotencyKey),r}var jr=["help","create-goals","status","complete-goals","checkpoint","steer","add-goal","criteria","record-evidence","record-review-blockers"],Lr={version:1,name:"ulw-loop",operations:[{name:"help",method:"help",mutating:!1,description:"Return this manifest: every operation with its method name, argument fields, and what it does.",args:{}},{name:"create-goals",method:"createGoals",mutating:!0,description:"Create the session plan from a brief; one goal per bullet, each seeded with placeholder criteria until revised.",args:{brief:"string",codexGoalMode:'"aggregate" | "per_story"?',force:"boolean?",validationBatchesJson:"string?"}},{name:"status",method:"status",mutating:!1,description:"Read the plan, its summary, structured nextActions, the stable evidenceRoot, and the active goal's currentAttemptDir.",args:{}},{name:"complete-goals",method:"completeGoals",mutating:!0,description:"Acquire the next eligible goal or resume the in-progress one; returns { done: true } once the aggregate is complete.",args:{retryFailed:"boolean?"}},{name:"checkpoint",method:"checkpoint",mutating:!0,description:"Close the goal as complete, failed, or blocked with evidence; the final goal also needs the quality gate. printTemplate returns that gate's template instead.",args:{goalId:"string",status:'"complete" | "failed" | "blocked"',evidence:"string",codexGoalJson:"string?",qualityGateJson:"string?",printTemplate:"true? (with goalId? only)"}},{name:"steer",method:"steer",mutating:!0,description:"Propose an evidence-backed plan mutation; revise_criterion replaces a criterion's scenario, expectedEvidence, or userModel.",args:{kind:'"add_subgoal" | "split_subgoal" | "reorder_pending" | "revise_pending_wording" | "revise_criterion" | "annotate_ledger" | "mark_blocked_superseded"',source:'"finding" | "user_prompt_submit" | "cli"',evidence:"string",rationale:"string",goalId:"string?",criterionId:"string? (revise_criterion)",scenario:"string? (revise_criterion)",expectedEvidence:"string? (revise_criterion)",userModel:'"happy" | "edge" | "regression" | "adversarial"? (revise_criterion)',title:"string? (add_subgoal)",objective:"string? (add_subgoal)",childGoals:"{ title: string, objective: string }[]? (split_subgoal)",revisedTitle:"string? (revise_pending_wording)",revisedObjective:"string? (revise_pending_wording)",pendingOrder:"string[]? (reorder_pending)",blockedReason:"string? (mark_blocked_superseded)",idempotencyKey:"string?"}},{name:"add-goal",method:"addGoal",mutating:!0,description:"Append a goal; pass successCriteria to define its criteria in the same call, otherwise placeholders name the revise call.",args:{title:"string",objective:"string",successCriteria:'{ scenario: string, expectedEvidence: string, userModel?: "happy" | "edge" | "regression" | "adversarial", essential?: boolean }[]?'}},{name:"criteria",method:"criteria",mutating:!1,description:"List one goal's success criteria with their status and captured evidence.",args:{goalId:"string"}},{name:"record-evidence",method:"recordEvidence",mutating:!0,description:"Record a criterion's pass, fail, or blocked evidence; artifacts must exist (resolved against the session cwd) and are stored with the criterion and the ledger entry.",args:{goalId:"string",criterionId:"string",status:'"pass" | "fail" | "blocked"',evidence:"string",notes:"string?",artifacts:"string[]?"}},{name:"record-review-blockers",method:"recordReviewBlockers",mutating:!0,description:"Mark the final goal review_blocked and append the blocker goal the reviewer verdict names.",args:{goalId:"string",title:"string",objective:"string",evidence:"string",codexGoalJson:"string?"}}]};function xr(e){let t=void 0===e.details?void 0:Object.fromEntries(Object.entries(e.details).map(([e,t])=>[e,String(t)]));return void 0===t?{code:e.code,message:e.message}:{code:e.code,message:e.message,details:t}}function Cr(e,t){return{ok:!1,operation:e,error:xr(t)}}function Nr(e,t){if(!(t in e))return[];let i=Object.entries(e).find(([e])=>e===t)?.[1];return Array.isArray(i)?i.filter(e=>"string"==typeof e).slice(0,8):[]}function Pr(e,t,i){return function(e){if(void 0!==e)try{JSON.parse(e)}catch(e){throw new A(`Invalid codexGoal: ${e instanceof Error?e.message:"not valid JSON"}`,"ULW_LOOP_CODEX_GOAL_JSON_INVALID",{cause:e})}}(i.codexGoalJson),Li(e.cwd,i,t,{surface:e.surface})}function Gr(e,t={}){!function(e){if(!e.cwd.trim())throw new A("cwd is required.","ULW_LOOP_CWD_REQUIRED");let t=e.sessionId.trim();if(!t)throw new A("ULW_LOOP_SESSION_ID_REQUIRED: sessionId is required.","ULW_LOOP_SESSION_ID_REQUIRED");if(null===$(t)||/(?:^|[\\/])\.\.(?:[\\/]|$)/.test(t))throw new A("ULW_LOOP_SESSION_ID_INVALID: sessionId normalizes to null.","ULW_LOOP_SESSION_ID_INVALID");if("omo-senpi"!==e.surface&&"lazycodex"!==e.surface)throw new A("surface must be omo-senpi or lazycodex.","ULW_LOOP_SURFACE_INVALID")}(e);let i={sessionId:e.sessionId},r=async(i,r)=>(void 0!==t.hooks?.onOperation&&await t.hooks.onOperation({operation:i,context:e,response:r}),r),n=async(t,n)=>{try{let e=await n(),i="object"==typeof e&&null!==e?Nr(e,"nextActions"):[],a="object"==typeof e&&null!==e?Nr(e,"warnings"):[];return await r(t,{ok:!0,operation:t,result:e,nextActions:i,...0===a.length?{}:{warnings:a}})}catch(n){if(n instanceof A&&"ULW_LOOP_PLAN_MISSING"===n.code&&"omo-senpi"===e.surface)return r(t,Cr(t,Le(x(i),dt(e.cwd),e.surface)));let a=function(e,t){return Cr(e,t instanceof A?t:new A(t.message,"ULW_LOOP_ERROR"))}(t,n instanceof Error?n:Error("ULW_LOOP_ERROR"));return r(t,a)}},a={dispatch:async e=>{if(!function(e){return Lr.operations.some(t=>t.name===e.operation)}(e))return Cr(e.operation,new A(`Unknown operation: ${e.operation}`,"ULW_LOOP_OPERATION_UNKNOWN"));switch(e.operation){case"help":return a.help();case"create-goals":return a.createGoals(e.args);case"status":return a.status();case"complete-goals":return a.completeGoals(e.args);case"checkpoint":return a.checkpoint(e.args);case"steer":return a.steer(e.args);case"add-goal":return a.addGoal(e.args);case"criteria":return a.criteria(e.args);case"record-evidence":return a.recordEvidence(e.args);case"record-review-blockers":return a.recordReviewBlockers(e.args);default:return function(e){throw new A(`Unhandled operation: ${String(e)}`,"ULW_LOOP_OPERATION_UNHANDLED")}(e)}},help:()=>n("help",async()=>Lr),createGoals:t=>n("create-goals",()=>Vi(e.cwd,t,i,e.surface)),status:()=>n("status",async()=>{let t=await lt(e.cwd,i),r=t.goals.find(e=>e.id===t.activeGoalId);return{plan:t,summary:zi(t),nextActions:Yi(t,e.surface),evidenceRoot:G(i),...void 0===r||2!==t.evidenceLayoutVersion?{}:{currentAttemptDir:T(r.id,r.attempt,i)}}}),completeGoals:(t={})=>n("complete-goals",()=>async function(e,t={},i){return st(e,i,async()=>{let r=await lt(e,i),n=E();if("complete"===r.aggregateCompletion?.status)return{done:!0,plan:r};let a=r.goals.find(e=>"in_progress"===e.status&&Bi(e));if(a)return{plan:r,goal:a,resumed:!0};let o=[],s=r.goals.find(e=>"pending"===e.status&&Bi(e));return!s&&t.retryFailed&&(s=r.goals.find(e=>"failed"===e.status&&!e.nonRetriable&&Bi(e)),s&&o.push({at:n,kind:"goal_retried",goalId:s.id,status:"pending",...s.failureReason?{message:s.failureReason}:{}})),s?(s.status="in_progress",s.attempt+=1,s.startedAt=n,function(e){for(let t of["blockedReason","blockerSignature","blockerOccurrenceCount","requiredExternalDecision","nonRetriable","failedAt","failureReason"])delete e[t]}(s),s.updatedAt=n,r.activeGoalId=s.id,r.updatedAt=n,o.push({at:n,kind:"goal_started",goalId:s.id,status:s.status,message:`Attempt ${s.attempt}`}),await ft(e,i,{plan:r,entries:o}),{plan:r,goal:s,resumed:!1}):{done:!0,plan:r}})}(e.cwd,t,i)),checkpoint:t=>n("checkpoint",()=>!0===t.printTemplate?async function(e,t,i,r){let n=await lt(e,t),a=r?.surface??ai(),o=i??n.activeGoalId,s=n.goals.find(e=>e.id===o);if(void 0!==i&&void 0===s)throw new A(`Unknown ulw-loop id: ${i}.`,"ULW_LOOP_GOAL_NOT_FOUND",{details:{goalId:i}});let c=2===n.evidenceLayoutVersion&&void 0!==s,l=c?T(s.id,s.attempt,t):".omo/evidence",d=["codex-goal-json requires goal.objective to equal the plan's codexObjective verbatim; do not paraphrase it.","Fill every <replace:...> value with plausible non-empty evidence and use real, non-empty artifact files.",'Passing codex-goal-json example: {"goal":{"objective":"<plan codexObjective verbatim>","status":"complete"}}.','Passing quality-gate-json example requires gateReview {"by":"category:deep-high","recommendation":"APPROVE","evidence":"review passed","reportPath":"<attemptDir>/gate-review.md","blockers":[],"notes":[]}, manualQa.artifactRefs objects, iteration, and criteriaCoverage.',..."lazycodex"===a?["Self-review defaults: manualQa.by and gateReview.by are main-session. Alternatives: manualQa.by accepts lazycodex-qa-executor; gateReview.by accepts lazycodex-gate-reviewer, category:deep-high, category:deep-low, category:unspecified-high, or category:unspecified-low. Optional codeReview.by accepts lazycodex-code-reviewer or main-session."]:[],...c?[]:["This plan is evidence-layout v1; artifacts go under .omo/evidence/."]].join(" ");return{qualityGateTemplate:Ci(a,l),codexGoalTemplate:{goal:{objective:n.codexObjective??"<replace:codex objective>",status:"complete"}},guidance:d,...c?{attemptDir:l}:{}}}(e.cwd,i,t.goalId,{surface:e.surface}):Pr(e,i,t)),steer:t=>n("steer",()=>$r(e.cwd,t,i,e.surface)),addGoal:t=>n("add-goal",()=>Fi(e.cwd,t,i,e.surface)),criteria:t=>n("criteria",async()=>{let r=(await lt(e.cwd,i)).goals.find(e=>e.id===t.goalId);if(void 0===r)throw new A(`Unknown ulw-loop id: ${t.goalId}.`,"ULW_LOOP_GOAL_NOT_FOUND");return{goalId:r.id,criteria:r.successCriteria}}),recordEvidence:t=>n("record-evidence",()=>ht(e.cwd,t,i)),recordReviewBlockers:t=>n("record-review-blockers",()=>async function(e,t,i){return st(e,i,async()=>{let r=await lt(e,i),n=r.goals.find(e=>e.id===t.goalId);void 0===n&&Ki(`Unknown ulw-loop id: ${t.goalId}`,"ulw_loop_goal_not_found"),"in_progress"!==n.status&&Ki(`${n.id} is ${n.status}.`,"ulw_loop_goal_not_in_progress"),V(r,n)||Ki(`${n.id} is not final.`,"ulw_loop_not_final_story");let a=await u(t.codexGoalJson,e),o=p(a,{expectedObjective:z(r,n),acceptedObjectives:H(r),acknowledgedObjectives:v(r)});if(!o.ok)throw new s(f(o));m(r,o.unacknowledgedObjective);let c=E();for(let e of Hi)Reflect.deleteProperty(n,e);n.status="review_blocked",n.reviewBlockedAt=c,n.evidence=t.evidence,n.updatedAt=c,r.activeGoalId===n.id&&delete r.activeGoalId;let l=Xi(r,t,c);r.updatedAt=c;let d=a?.raw,g={at:c,kind:"goal_review_blocked",goalId:n.id,status:n.status,evidence:t.evidence,codexGoal:d},h={at:c,kind:"goal_added",goalId:l.id,status:l.status,evidence:t.evidence,message:l.title},w={at:c,kind:"goal_review_blocked",goalId:n.id,status:n.status,evidence:t.evidence,codexGoal:d,message:`Review blockers recorded; appended ${l.id}.`};Reflect.set(w,"kind","blocker_recorded");let b=[g,h,w];return await ft(e,i,{plan:r,entries:b}),{plan:r,blockedGoal:n,newGoal:l,ledgerEntries:b,nextActions:o.nextActions,warnings:o.warnings}})}(e.cwd,t,i))};return a}import{readFileSync as Tr}from"node:fs";function Ur(e){return"object"==typeof e&&null!==e&&!Array.isArray(e)}function Dr(e){let t=[];for(let i of e)try{let e=JSON.parse(Tr(i,"utf8"));if(!Ur(e)||1!==e.version){t.push(`Unsupported driver goal store: ${i}`);continue}if(null===e.goal)return{codexGoalJson:void 0,warnings:t};if(Ur(e.goal))return{codexGoalJson:JSON.stringify({goal:e.goal}),warnings:t};t.push(`Invalid driver goal: ${i}`)}catch(e){if(e instanceof Error&&"code"in e&&"ENOENT"===e.code)continue;t.push(`Cannot read driver goal ${i}: ${e instanceof Error?e.message:String(e)}`)}return{codexGoalJson:void 0,warnings:t}}function Mr(e){let t=e.goals.find(t=>t.id===e.activeGoalId),i="aggregate"===W(e)?H(e):void 0===t?[]:[t.objective];return new Set(i.map(g).filter(Boolean))}import{dirname as Wr,isAbsolute as qr,join as Qr}from"node:path";import{closeSync as Jr,openSync as Br,readSync as Vr}from"node:fs";function Fr(e){let t,i,r=e?.trim();if(!r)return{problem:"PI_SESSION_FILE is unset"};try{t=function(e){let t=Br(e,"r");try{let e=Buffer.alloc(65536),i=Vr(t,e,0,65536,0),r=e.subarray(0,i).toString("utf8"),n=r.indexOf("\n");return-1===n?r:r.slice(0,n)}finally{Jr(t)}}(r)}catch(e){return{problem:`PI_SESSION_FILE is unreadable (${e instanceof Error&&"code"in e&&"string"==typeof e.code?e.code:"unreadable"})`}}try{i=JSON.parse(t)}catch{return{problem:"PI_SESSION_FILE does not start with a JSON session header"}}if("object"!=typeof i||null===i||Array.isArray(i))return{problem:"PI_SESSION_FILE header is not an object"};let n="cwd"in i&&"string"==typeof i.cwd?i.cwd.trim():"";return n?{cwd:n}:{problem:"PI_SESSION_FILE header records no cwd"}}var zr='env("PI_SESSION_CWD", "<session cwd>")';function Hr(e=process.env,t=()=>process.cwd()){let i=e.PI_SESSION_ID;if(!i?.trim())throw new A("PI_SESSION_ID is required.","ULW_LOOP_SESSION_ID_REQUIRED");let r=$(i);if(null===r)throw new A("PI_SESSION_ID is invalid.","ULW_LOOP_SESSION_ID_INVALID");let n=[],{cwd:a,source:o}=function(e,t,i){let r=e.PI_SESSION_CWD?.trim();if(r)return{cwd:r,source:"PI_SESSION_CWD"};let n,a=Fr(e.PI_SESSION_FILE);if("cwd"in a)return i.push(`PI_SESSION_CWD is unset; bound the session cwd recorded in PI_SESSION_FILE (${a.cwd}). Re-pin it with env("PI_SESSION_CWD", "${a.cwd}") to silence this warning.`),{cwd:a.cwd,source:"PI_SESSION_FILE"};try{n=t().trim()}catch(e){throw new A(`PI_SESSION_CWD is required: ${a.problem}, and process.cwd() failed (${e instanceof Error?e.message:String(e)}). Set ${zr} in the kernel or restart the session.`,"ULW_LOOP_CWD_REQUIRED")}if(!n)throw new A(`PI_SESSION_CWD is required: ${a.problem}, and process.cwd() is empty. Set ${zr} in the kernel or restart the session.`,"ULW_LOOP_CWD_REQUIRED");return i.push(`PI_SESSION_CWD is unset and ${a.problem}; bound process.cwd() (${n}), which can differ from the session cwd on a shared host. Set ${zr} to bind the session explicitly.`),{cwd:n,source:"process.cwd"}}(e,t,n),s=function(e,t,i,r){let n=[],a=e.PI_GOAL_STORE_FILE,o=`${encodeURIComponent(t)}.json`;if(a&&qr(a))n.push(a);else{a&&r.push("Ignoring relative PI_GOAL_STORE_FILE.");let t=e.PI_SESSION_FILE?.trim();t&&qr(t)&&n.push(Qr(Wr(t),"extensions","goal",o))}return n.push(Qr(i,".omo","goal",o)),[...new Set(n)]}(e,i,a,n);return{cwd:a,cwdSource:o,sessionId:r,rawSessionId:i,surface:"omo-senpi",goalStorePaths:s,warnings:n}}var Kr={import:'const { agentToolkit } = await import(`${env("OMO_AGENT_TOOLKIT_SDK_ROOT")}/sdk.js`)',example:'print(await agentToolkit.status()); await agentToolkit.recordEvidence({ goalId: "G001", criterionId: "C001", status: "pass", evidence: "<observable proof>", artifacts: ["<existing path>"] })',sessionEnv:["PI_SESSION_ID","PI_SESSION_CWD","PI_SESSION_FILE","PI_GOAL_STORE_FILE"]};function Xr(e,t){if(0===t.length)return e;let i="warnings"in e&&Array.isArray(e.warnings)?e.warnings:[];return{...e,warnings:[...i,...t]}}async function Yr(e,t){let i=[];try{let e=Hr(process.env);i.push(...e.warnings);let r=Gr(e);return Xr(await t(r,e,i),i)}catch(t){return Xr(function(e,t){return{ok:!1,operation:e,error:{code:t instanceof A?t.code:"ULW_LOOP_ERROR",message:t instanceof Error?t.message:String(t)}}}(e,t),i)}}function Zr(e,t,i){if(void 0!==e)return e;let r=Dr(t.goalStorePaths);return i.push(...r.warnings),r.codexGoalJson}function en(e){return{cwd:e.cwd,cwdSource:e.cwdSource,sessionId:e.rawSessionId,goalStorePaths:e.goalStorePaths}}var tn={help:()=>Yr("help",async e=>{let t=await e.help();return t.ok?{...t,result:{...t.result,usage:Kr}}:t}),status:()=>Yr("status",async(e,t,i)=>{let r=await e.status();if(!r.ok)return r;let n=function(e,t,i){let r=Dr(t);if(i.push(...r.warnings),void 0===r.codexGoalJson)return{available:!1};let n=d(JSON.parse(r.codexGoalJson));if(!n.available)return{available:!1};let a=g(n.objective??"");return{available:!0,status:n.status??"unknown",objectiveMatchesPlan:""===a||Mr(e).has(a),objectiveAcknowledged:v(e).includes(a)}}(r.result.plan,t.goalStorePaths,i);return{...r,result:{...r.result,binding:en(t),driver:n}}}),createGoals:e=>Yr("create-goals",t=>t.createGoals(e)),completeGoals:e=>Yr("complete-goals",t=>t.completeGoals(e)),criteria:e=>Yr("criteria",t=>t.criteria(e)),recordEvidence:e=>Yr("record-evidence",t=>t.recordEvidence(e)),addGoal:e=>Yr("add-goal",t=>t.addGoal(e)),steer:e=>Yr("steer",t=>t.steer(e)),checkpoint:e=>Yr("checkpoint",(t,i,r)=>{if(!0===e.printTemplate)return t.checkpoint(e);let n=Zr(e.codexGoalJson,i,r);return t.checkpoint({...e,...void 0===n?{}:{codexGoalJson:n}})}),recordReviewBlockers:e=>Yr("record-review-blockers",(t,i,r)=>{let n=Zr(e.codexGoalJson,i,r);if(void 0===n)throw new A("A driver goal snapshot is required.","ULW_LOOP_ARGUMENT_MISSING");return t.recordReviewBlockers({...e,codexGoalJson:n})}),dispatch:e=>{if(function(e){return jr.some(t=>t===e.operation)}(e)){if("help"===e.operation)return tn.help();if("status"===e.operation)return tn.status();if("checkpoint"===e.operation)return tn.checkpoint(e.args);if("record-review-blockers"===e.operation)return tn.recordReviewBlockers(e.args)}return Yr(e.operation,t=>t.dispatch(e))}},rn="5.1.2";export{rn as SDK_VERSION,Lr as ULW_LOOP_MANIFEST,jr as ULW_LOOP_OPERATIONS,tn as agentToolkit,Gr as createAgentToolkit,Hr as toolkitContextFromEnv};
|
|
1
|
+
// omo:DEgieqR4b0oV0h1UeLfFdhengruwS1qPIssLOj55ylY:2tlv3QtJG0buYLB4EypYHo6Qx2MoXl-CDCy6XVVP2Yo
|
|
2
|
+
import{existsSync as e,statSync as t}from"node:fs";import{readFile as i}from"node:fs/promises";import{resolve as r}from"node:path";import{existsSync as n}from"node:fs";import{readFile as a}from"node:fs/promises";import{resolve as o}from"node:path";class s extends Error{}function c(e){return e&&"object"==typeof e&&!Array.isArray(e)?e:{}}function l(e){return e.replace(/\s+/g," ").trim()}function d(e){let t=c(e),i=Object.hasOwn(t,"goal")?t.goal:e;if(null==i||!1===i)return{available:!1,raw:e};let r=c(i),n=function(e){return"string"==typeof e?e:""}(r.objective??r.goal??r.description??r.title??t.objective??t.title),a=function(e){let t=function(e){return"string"==typeof e?e.trim():""}(e).toLowerCase();return"complete"===t||"completed"===t||"done"===t?"complete":"cancelled"===t||"canceled"===t?"cancelled":"failed"===t||"failure"===t?"failed":"paused"===t?"paused":"usage_limited"===t?"usage_limited":"budget_limited"===t?"budget_limited":"active"===t||"in_progress"===t||"pending"===t||"running"===t?"active":"unknown"}(r.status??t.status);return{available:Boolean(n||"unknown"!==a),...n?{objective:n}:{},status:a,raw:e}}async function u(e,t=process.cwd()){if(!e?.trim())return null;let i=e.trim();try{return d(JSON.parse(i))}catch{let e=o(t,i);if(!n(e))throw new s(`Codex goal snapshot is neither valid JSON nor a readable path: ${i}`);try{return d(JSON.parse(await a(e,"utf-8")))}catch(e){throw new s(`Codex goal snapshot path does not contain valid JSON: ${i}${e instanceof Error?` (${e.message})`:""}`)}}}function p(e,t){let i=e??{available:!1,raw:null},r=[],n=[],a=[],o=t.expectedObjective;if(!i.available)return a.push(`call get_goal; if none, create_goal with codexObjective "${o}" verbatim`),{ok:0===r.length,snapshot:i,warnings:n,nextActions:a,errors:r};let s,c=e=>new Set(e.map(l).filter(Boolean)),d=c([o,...t.acceptedObjectives??[]]),u=c(t.acknowledgedObjectives??[]),p=l(i.objective??"");!p||d.has(p)||u.has(p)||(n.push(`driver_objective_differs: expected "${o}", got "${p}".`),s=p);let f=i.status??"unknown";return"paused"!==f&&"usage_limited"!==f&&"budget_limited"!==f||a.push("/goal resume or raise the budget"),"complete"===f&&a.push(`driver closed early: call create_goal with codexObjective "${o}" verbatim`),{ok:0===r.length,snapshot:i,warnings:n,nextActions:a,errors:r,...void 0===s?{}:{unacknowledgedObjective:s}}}function f(e){return[...e.errors,...e.nextActions,...e.warnings].join(" ")}function g(e){return e.replace(/\s+/g," ").trim()}function v(e){return e.acknowledgedDriverObjectives??[]}function m(e,t){if(void 0===t)return!1;let i=g(t);return!(!i||v(e).includes(i))&&(e.acknowledgedDriverObjectives=[...v(e),i],!0)}import{isAbsolute as h,join as w,relative as b,sep as _}from"node:path";var y=".omo/ulw-loop",I="goals.json",O="ledger.jsonl",S=["add_subgoal","split_subgoal","reorder_pending","revise_pending_wording","revise_criterion","annotate_ledger","mark_blocked_superseded"],k=["happy","edge","regression","adversarial"];class A extends Error{constructor(e,t,i){super(e,void 0===i?.cause?void 0:{cause:i.cause}),this.name="UlwLoopError",this.code=t,void 0!==i?.details&&(this.details=i.details)}}function E(){return(new Date).toISOString()}function $(e){let t=e?.trim();if(!t)return null;let i=t.split(/[\\/]+/).filter(e=>e.length>0&&"."!==e&&".."!==e),r=(i.length>0?i.join("-"):t).replace(/[^A-Za-z0-9._-]+/g,"-").replace(/-+/g,"-").replace(/^\.+/,"").replace(/^[.-]+|[.-]+$/g,"");return r.length>0?r:null}function R(e){let t=$(e?.sessionId);return null===t?y:`${y}/${t}`}function j(e,t){return w(e,R(t))}function L(e){return`${R(e)}/brief.md`}function x(e){return`${R(e)}/${I}`}function C(e){return`${R(e)}/${O}`}function N(e,t){return w(j(e,t),".state.lock")}function P(e,t){let i=`${t}/`,r=`${t}\\`;return e.startsWith(i)?e.slice(i.length).split("\\").join("/"):e.startsWith(r)?e.slice(r.length).split("\\").join("/"):e.split("\\").join("/")}function G(e){let t=$(e?.sessionId);return null===t?".omo/evidence":`.omo/evidence/ulw/${t}`}function T(e,t,i){let r=$(i?.sessionId);if(null===r)throw new A(`Evidence for ${e} attempt ${t} needs a session scope; pass --session-id <id> so the attempt directory lives under .omo/evidence/ulw/<id>/.`,"ULW_LOOP_SESSION_SCOPE_REQUIRED",{details:{goalId:e,attempt:t}});return`.omo/evidence/ulw/${r}/${e}/a${t}`}var U={relative:b,isAbsolute:h,sep:_};var D=M();function M(e){return`Complete the durable ulw-loop plan in ${x(e)}, including later accepted/appended stories, under the original brief constraints; use ${C(e)} as the audit trail.`}function W(e){return e.codexGoalMode??"per_story"}function q(e){return"complete"===e}function Q(e,t){if("superseded"!==e.steeringStatus)return!1;let i=e.supersededBy??[];return 0!==i.length&&i.every(e=>{let i=t.goals.find(t=>t.id===e);return void 0!==i&&q(i.status)})}function J(e,t){return"superseded"===e.steeringStatus?!Q(e,t):"blocked"===e.steeringStatus||!q(e.status)}function B(e){return"complete"===e.aggregateCompletion?.status||e.goals.every(t=>!J(t,e))}function V(e,t){return J(t,e)&&e.goals.every(i=>!function(e,t,i){if(e.id===t.id)return!1;if("superseded"===e.steeringStatus){let r=e.supersededBy??[];return 0===r.length||!r.every(e=>{if(e===t.id)return!0;let r=i.goals.find(t=>t.id===e);return void 0!==r&&q(r.status)})}return J(e,i)}(i,t,e))}function F(e){return e.codexObjective??D}function z(e,t){return"aggregate"===W(e)?F(e):t.objective}function H(e){return[F(e),...e.codexObjectiveAliases??[]]}function K(e){return e.successCriteria.length>0&&e.successCriteria.every(e=>"pass"===e.status)}function X(e){return e.essential??!0}function Y(e){let t=e.successCriteria.filter(X);if(t.length>0)return t;let i=e.successCriteria.find(e=>"happy"===e.userModel);return void 0===i?[]:[i]}import{existsSync as Z}from"node:fs";import{isAbsolute as ee,relative as te,resolve as ie,sep as re}from"node:path";function ne(e,t,i){throw new A(e,t,{details:i})}function ae(e,t){let i=te(e,t);return""===i||i.startsWith("..")||ee(i)?t:i.split(re).join("/")}import{AsyncLocalStorage as oe}from"node:async_hooks";import{randomUUID as se}from"node:crypto";import{linkSync as ce,mkdirSync as le,renameSync as de,rmSync as ue,writeFileSync as pe}from"node:fs";import{rename as fe,writeFile as ge}from"node:fs/promises";import{join as ve}from"node:path";import{join as me}from"node:path";import{existsSync as he,readdirSync as we,readFileSync as be}from"node:fs";import{join as _e}from"node:path";function ye(e,t){return e instanceof Error&&"code"in e&&e.code===t}function Ie(e){try{return be(e,"utf8")}catch(e){if(ye(e,"ENOENT"))return;throw e}}function Oe(e){try{return we(_e(e,"revisions")).filter(e=>/^\d{8,}\.json$/.test(e)).sort()}catch(e){if(ye(e,"ENOENT"))return[];throw e}}function Se(e,t){try{let i=JSON.parse(be(_e(e,"revisions",t),"utf8"));return 1===i.version&&Number.isInteger(i.revision)&&1===i.plan?.version&&Array.isArray(i.plan.goals)&&Array.isArray(i.ledger)?i:void 0}catch(e){if(!(e instanceof SyntaxError))throw e;return}}function ke(e){let t=[];for(let i of Oe(e)){let r=Se(e,i);void 0!==r&&t.push(r)}return t.sort((e,t)=>e.revision-t.revision)}function Ae(e){let t,i=Ie(_e(e,"goals.json"));if(void 0!==i)try{t=JSON.parse(i)}catch(e){if(!(e instanceof SyntaxError))throw e}let r=function(e){let t=Oe(e).sort((e,t)=>Number.parseInt(t,10)-Number.parseInt(e,10));for(let i of t){let t=Se(e,i);if(void 0!==t)return t}}(e);if(void 0===r)return t;if(void 0===t)return r.plan;if((t.revision??0)>r.revision)return t;if(void 0===t.revision||t.revision===r.revision){let e=new Set(r.plan.goals.map(e=>e.id));if(Array.isArray(t.goals)&&t.goals.some(t=>!e.has(t.id)))return{...t,revision:r.revision}}return r.plan}function Ee(e){let t=new Map,i=(Ie(me(e,"ledger.jsonl"))??"").split(/\r?\n/),r=0;for(let[e,n]of i.entries())if(0!==n.trim().length)try{let i=JSON.parse(n);i.revision=i.revision||r,r=Math.max(r,i.revision),i.id??=`legacy-${e+1}`,t.set(i.id,i)}catch(e){if(!(e instanceof SyntaxError))throw e}for(let i of ke(e))for(let[e,r]of i.ledger.entries()){let n=r.id??`${i.revision}-${e}`;t.set(n,{...r,revision:i.revision,id:n})}let n=Ae(e)?.ledgerResetRevision??0,a=e=>Number(e.id?.split("-").at(-1)??0);return[...t.values()].filter(e=>(e.revision??0)>=n).sort((e,t)=>(e.revision??0)-(t.revision??0)||a(e)-a(t))}import{AsyncLocalStorage as $e}from"node:async_hooks";import{readdirSync as Re}from"node:fs";function je(e){return"omo-senpi"===e?'agentToolkit.createGoals({ brief: "<brief>" })':'omo-agent-toolkit ulw-loop create-goals --brief "<brief>" --json'}function Le(e,t,i="lazycodex"){let r=function(e,t="lazycodex"){let i=[`Recovery: bootstrap the plan with \`${je(t)}\`.`];return 0===e.length?{message:i.join("\n")}:(i.push("omo-senpi"===t?`Existing ulw-loop session ids under .omo/ulw-loop/: ${e.join(", ")}. The SDK is bound to the current session; resume the owning session to target its plan.`:`Existing ulw-loop session ids under .omo/ulw-loop/: ${e.join(", ")}. Re-run with \`--session-id <id>\` to target one of them.`),{message:i.join("\n"),details:{existingSessionIds:e}})}(t,i);return new A(`No ulw-loop plan found at ${e}.\n${r.message}`,"ULW_LOOP_PLAN_MISSING",{...void 0===r.details?{}:{details:r.details}})}import{randomUUID as xe}from"node:crypto";import{closeSync as Ce,ftruncateSync as Ne,mkdirSync as Pe,openSync as Ge,readFileSync as Te,statSync as Ue,unlinkSync as De,writeSync as Me}from"node:fs";import{dirname as We}from"node:path";var qe=1e4,Qe=3e4,Je=(new Int32Array(new SharedArrayBuffer(4)),{now:Date.now,schedule(e,t){let i=setTimeout(e,t);return{unref:()=>{i.unref()},cancel:()=>clearTimeout(i)}}});async function Be(e,t,i={}){let r,n,a=await async function(e,t){let i=t.clock??Je,r=i.now()+(t.timeoutMs??qe);Pe(We(e),{recursive:!0});for(let n=0;;){let a=Ve(e,t,i.now(),t.leaseMs??Qe);if("acquired"===a.kind)return a.holder;if("retry"!==a.kind){if(i.now()>=r)throw Xe(e,t);await new Promise(e=>i.schedule(e,Ke(n))),n+=1}}}(e,i),o=i.clock??Je,s=()=>{try{a.record.leaseUntil=o.now()+(i.leaseMs??Qe),Fe(a),c()}catch(e){n=e}},c=()=>{0!==i.heartbeatMs&&(r=o.schedule(s,i.heartbeatMs??(i.leaseMs??Qe)/3),r.unref())};c();try{let e=await t(a.record.token);if(void 0!==n)throw n;return e}finally{r?.cancel(),Ce(a.fd),function(e,t){if(ze(e,Date.now())?.record?.token!==t)return;try{De(e)}catch(e){if(!Ye(e,"ENOENT"))throw e}}(e,a.record.token)}}function Ve(e,t,i,r){try{let n=function(e,t,i){let r;try{r=Ge(e,"wx")}catch(e){if(Ye(e,"EEXIST"))return null;throw e}let n={pid:process.pid,createdAt:new Date(t).toISOString(),token:xe(),...void 0===i?{}:{leaseUntil:t+i}},a={fd:r,record:n};try{Fe(a)}catch(t){Ce(r);try{De(e)}catch(e){if(!Ye(e,"ENOENT"))throw e}throw t}return a}(e,i,r);if(null!==n)return{kind:"acquired",holder:n};let a=ze(e,i);if(null===a)return{kind:"retry"};let o=a.record;return(null===o?a.ageMs>(t.staleMs??6e4):!function(e){try{return process.kill(e,0),!0}catch(e){if(Ye(e,"ESRCH"))return!1;if(Ye(e,"EPERM"))return!0;throw e}}(o.pid)||void 0!==o.leaseUntil&&i>o.leaseUntil)&&function(e,t){let i=ze(e,Date.now());if(null===i)return!0;if(i.raw!==t)return!1;try{De(e)}catch(e){if(Ye(e,"EPERM")||Ye(e,"EACCES"))return!1;if(!Ye(e,"ENOENT"))throw e}return!0}(e,a.raw)?{kind:"retry"}:{kind:"wait"}}catch(e){if(Ye(e,"EINTR"))return{kind:"wait"};throw e}}function Fe(e){let t=Buffer.from(JSON.stringify(e.record));Ne(e.fd,0);let i=0;for(;i<t.length;){let r=Me(e.fd,t,i,t.length-i,i);if(0===r)throw Error("State lock write made no progress.");i+=r}}function ze(e,t){try{let i=Te(e,"utf8");return{raw:i,record:He(i),ageMs:t-Ue(e).mtimeMs}}catch(e){if(Ye(e,"ENOENT"))return null;throw e}}function He(e){try{let t=JSON.parse(e);return"object"!=typeof t||null===t||(!("pid"in t)||"number"!=typeof t.pid||!Number.isInteger(t.pid)||t.pid<=0)?null:"createdAt"in t&&"string"==typeof t.createdAt&&"token"in t&&"string"==typeof t.token&&0!==t.token.length?{pid:t.pid,createdAt:t.createdAt,token:t.token,..."leaseUntil"in t&&"number"==typeof t.leaseUntil?{leaseUntil:t.leaseUntil}:{}}:null}catch(e){if(e instanceof SyntaxError)return null;throw e}}function Ke(e){return Math.min(100,5*2**e)+5*Math.random()}function Xe(e,t){let i=ze(e,Date.now())?.record,r=t.timeoutMs??qe,n=null==i?"another process":`pid ${i.pid}`;return new A(`ulw-loop state lock ${e} is held by ${n} for more than ${r}ms. The lock owner is still alive. If a JS eval kernel was interrupted while writing, wait for its lease to expire (${t.leaseMs??Qe} ms) or restart the owning senpi process; never delete a lock owned by a live process.`,"ULW_LOOP_LOCK_TIMEOUT",{details:{lockPath:e,timeoutMs:r,...null==i?{}:{holderPid:i.pid}}})}function Ye(e,t){return e instanceof Error&&"code"in e&&e.code===t}function Ze(e,t){let i=N(e,t);return rt.getStore()?.has(i)&&(at(i),function(e){for(let[t,i]of gt(e)){le(ve(e,"tmp"),{recursive:!0});let r=ve(e,"tmp",`${process.pid}-${se()}-${t}`);try{pe(r,i,{flag:"wx"}),de(r,ve(e,t))}finally{ue(r,{force:!0})}}}(j(e,t))),function(e,t){return Ee(j(e,t))}(e,t)}var et=`Complete all ulw-loop stories in ${y}/${I}: `,tt=`Complete all ulw-loop stories listed in ${y}/${I}. Use ${y}/${O} as the durable audit trail.`,it=new Map,rt=new $e,nt=new $e;function at(e){let t=rt.getStore()?.get(e);if(void 0!==t&&function(e){let t=Ie(e);if(void 0!==t)try{let e=JSON.parse(t);return"object"==typeof e&&null!==e&&"token"in e&&"string"==typeof e.token?e.token:void 0}catch(e){if(e instanceof SyntaxError)return;throw e}}(e)!==t.token)throw new A("The ulw-loop mutation lock changed owners.","ULW_LOOP_LOCK_LOST")}function ot(e){for(let t of rt.getStore()?.values()??[]){let i=t.migrations.get(e.goalsPath);if(void 0!==i)return t.migrations.delete(e.goalsPath),i}return[]}async function st(e,t,i,r={}){let n="function"==typeof t?void 0:t,a="function"==typeof t?t:i;if(void 0===a)throw new A("Missing ulw-loop mutation body.","ULW_LOOP_LOCK_BODY_MISSING");let o=`${e}\0${R(n)}`,s=N(e,n),c=()=>Be(s,async e=>rt.run(new Map([...rt.getStore()??[],[s,{token:e,migrations:new Map}]]),async()=>{for(let e=0;;e+=1)try{return await a()}catch(t){if(!(t instanceof A)||"ULW_LOOP_PUBLISH_CONFLICT"!==t.code)throw t;if(at(s),0!==e)throw t}}),{...nt.getStore(),...r}),l=(it.get(o)??Promise.resolve(void 0)).then(c,c),d=l.then(()=>{},()=>{});return it.set(o,d),d.then(()=>{it.get(o)===d&&it.delete(o)}),l}function ct(e,t){let i=function(e,t){return w(j(e,t),I)}(e,t),r=Ae(j(e,t));if(void 0===r)throw Le(P(i,e),dt(e));if(1!==r.version||!Array.isArray(r.goals))throw new A(`Invalid ulw-loop plan at ${P(i,e)}.`,"ULW_LOOP_PLAN_INVALID");let n=r.codexObjective;return"aggregate"!==(r.codexGoalMode??"per_story")||void 0===n||n!==tt&&!n.startsWith(et)||(r.codexObjective=M(t),r.codexObjectiveAliases=[...new Set([...r.codexObjectiveAliases??[],n])],rt.getStore()?.get(N(e,t))?.migrations.set(r.goalsPath,[{at:E(),kind:"aggregate_objective_migrated",before:{codexObjective:n},after:{codexObjective:r.codexObjective}}])),r}async function lt(e,t){return rt.getStore()?.has(N(e,t))&&(at(N(e,t)),await vt(j(e,t))),ct(e,t)}function dt(e){try{return Re(j(e),{withFileTypes:!0}).filter(e=>e.isDirectory()).map(e=>e.name).sort()}catch{return[]}}var ut=new oe;async function pt(e,t){await(ut.getStore()?.writeView??ge)(e,t)}async function ft(e,t,i){let{plan:r}=i,n=j(e,t);at(N(e,t)),await(ut.getStore()?.beforeCommit?.());let a=(r.revision??0)+1,o=r.brief??Ie(ve(n,"brief.md"))??"",s=[...ot(r),...i.entries].map((e,t)=>({...e,revision:a,id:`${a}-${t}`})),c={version:1,revision:a,plan:{...r,revision:a,brief:o},ledger:s};le(ve(n,"revisions"),{recursive:!0}),le(ve(n,"tmp"),{recursive:!0});let l=ve(n,"tmp",`${process.pid}-${se()}.json`);try{pe(l,`${JSON.stringify(c)}\n`,{flag:"wx"});try{(ut.getStore()?.link??ce)(l,ve(n,"revisions",`${String(a).padStart(8,"0")}.json`))}catch(e){if(ye(e,"EEXIST"))throw new A("Another writer published the read revision.","ULW_LOOP_PUBLISH_CONFLICT",{cause:e});if(["EPERM","ENOTSUP","EXDEV"].some(t=>ye(e,t)))throw new A("Immutable ulw-loop publication requires atomic hard links.","ULW_LOOP_PUBLISH_UNSUPPORTED_FS",{cause:e});throw e}}finally{ue(l,{force:!0})}r.revision=a,r.brief=o;for(let[e,t]of i.entries.entries())Object.assign(t,s[e+s.length-i.entries.length]);await(ut.getStore()?.afterCommit?.()),await vt(n)}function gt(e){let t=Ae(e);if(void 0===t||0===ke(e).length)return[];let i=Ee(e);return function(e,t){let i=new Set(e.goals.map(e=>e.id)),r=new Set;for(let e of t)"goal_added"!==e.kind||void 0===e.goalId||i.has(e.goalId)||r.add(e.goalId);if(0!==r.size)throw new A(`Refusing to rewrite goals.json: the ledger records goals the plan projection lacks (${[...r].join(", ")}). Restore those goals into the newest revisions/ record (keeping plan.revision equal to its file number) before mutating this run.`,"ULW_LOOP_PROJECTION_TRUNCATED",{details:{missingGoalIds:[...r]}})}(t,i),[["goals.json",`${JSON.stringify(t,null,2)}\n`],["ledger.jsonl",0===i.length?"":`${i.map(e=>JSON.stringify(e)).join("\n")}\n`],["brief.md",t.brief??Ie(ve(e,"brief.md"))??""]].filter(([t,i])=>Ie(ve(e,t))!==i)}async function vt(e){for(let[t,i]of gt(e)){le(ve(e,"tmp"),{recursive:!0});let r=ve(e,"tmp",`${process.pid}-${se()}-${t}`);try{await pt(r,i),await fe(r,ve(e,t))}finally{ue(r,{force:!0})}}}function mt(e,t,i){throw new A(e,t,{details:i})}async function ht(e,t,i){return st(e,i,async()=>{let r=await lt(e,i),n=function(e,t){return e.goals.find(e=>e.id===t)??mt(`UlwLoop goal not found: ${t}.`,"ULW_LOOP_GOAL_NOT_FOUND",{goalId:t})}(r,t.goalId),a=function(e,t){return e.successCriteria.find(e=>e.id===t)??mt(`Success criterion not found: ${t}.`,"ULW_LOOP_CRITERION_NOT_FOUND",{goalId:e.id,criterionId:t})}(n,t.criterionId),o=function(e){return e.trim()||mt("Evidence must be a non-empty string.","ULW_LOOP_EVIDENCE_REQUIRED",{})}(t.evidence),s=function(e,t){if(void 0===t)return;let i=new Set,r=[];for(let[n,a]of t.entries()){let t="string"==typeof a?a.trim():"";t||ne(`Artifact ${n+1} must be a non-empty path.`,"ULW_LOOP_ARGUMENT_INVALID",{index:n});let o=ie(e,t);Z(o)||ne(`Evidence artifact does not exist: ${t} (resolved to ${o}).`,"ULW_LOOP_EVIDENCE_ARTIFACT_MISSING",{path:t,resolved:o});let s=ae(e,o);i.has(s)||(i.add(s),r.push(s))}return r}(e,t.artifacts),c=function(e){switch(e){case"pass":return"evidence_captured";case"fail":return"criterion_failed";case"blocked":return"criterion_blocked";default:return mt("Invalid criterion status.","ULW_LOOP_CRITERION_STATUS_INVALID",{status:e})}}(t.status),l=a.status,d=E();a.status=t.status,a.capturedEvidence=o,a.capturedAt=d,void 0!==t.notes&&(a.notes=t.notes),void 0!==s?a.artifacts=s:delete a.artifacts,n.updatedAt=d,r.updatedAt=d;let u={at:d,kind:c,goalId:n.id,criterionId:a.id,criterionStatus:t.status,evidence:o,capturedEvidence:o,...void 0===s?{}:{artifacts:s},before:{status:l},after:{goalId:n.id,criterionId:a.id,status:t.status,evidence:o,capturedAt:d,prevStatus:l}};return await ft(e,i,{plan:r,entries:[u]}),{plan:r,goal:n,criterion:a,ledgerEntry:u}})}function wt(e){return e.successCriteria.filter(e=>"pass"!==e.status)}function bt(e){let t=new Set(Y(e).map(e=>e.id));return e.successCriteria.filter(e=>t.has(e.id)&&"pass"!==e.status)}function _t(e){if(!K(e))throw new A(`Goal ${e.id} has unresolved success criteria.`,"ulw_loop_criteria_not_all_pass",{details:{goalId:e.id,unresolved:wt(e).map(e=>({id:e.id,status:e.status}))}})}function yt(e){if(!function(e){let t=Y(e);return t.length>0&&t.every(e=>"pass"===e.status)}(e))throw new A(`Goal ${e.id} has unresolved essential success criteria.`,"ulw_loop_criteria_not_all_pass",{details:{goalId:e.id,unresolved:bt(e).map(e=>({id:e.id,status:e.status}))}})}import{resolve as It}from"node:path";var Ot,St=/^(?:<replace:[^>]+>|placeholder|todo|tbd|n\/a|stub)$/i;function kt(e){let t=Ot,i={defects:[],poisonedFields:new Set,poisonedArtifactKinds:new Set};Ot=i;try{let t=e();if(0===i.defects.length)return t;!function(e){let t=[...new Map(e.map(e=>[`${e.field}\0${e.message}`,e])).values()],i=t.slice(0,25),r=t.length>i.length,n=[`Final quality gate has ${i.length}${r?"+":""} validation defects:`,...i.map(e=>`- ${e.field}: ${e.message}`)].join("\n");throw new A(n,"ULW_LOOP_QUALITY_GATE_INVALID",{details:{field:i[0]?.field,fields:i,...r?{truncated:!0}:{}}})}(i.defects)}finally{Ot=t}}function At(e,t){if(void 0===Ot)throw new A(e,"ULW_LOOP_QUALITY_GATE_INVALID",{details:{field:t}});Ot.defects.push({field:t,message:e}),Ot.poisonedFields.add(t)}function Et(e){return Ot?.poisonedFields.has(e)??!1}function $t(e){return Ot?.poisonedArtifactKinds.has(e)??!1}function Rt(e,t){return function(e){return"object"==typeof e&&null!==e&&!Array.isArray(e)}(e)?e:(At(`Final quality gate is missing ${t} evidence (accepted input: a bare object with manualQa/gateReview/iteration/criteriaCoverage and optional codeReview, or the same object under a top-level "qualityGate" key).`,t),{})}function jt(e,t){if("string"!=typeof e||""===e.trim())return At(`Final quality gate requires non-empty ${t}.`,t),"";let i=e.trim();return St.test(i)&&At(`Final quality gate rejects placeholder ${t}.`,t),i}function Lt(e,t){return"number"==typeof e&&Number.isFinite(e)?e:(At(`Final quality gate requires numeric ${t}.`,t),0)}function xt(e,t){return Array.isArray(e)&&0!==e.length?e.map(e=>jt(e,t)):(At(`Final quality gate requires ${t}.`,t),[])}function Ct(e,t){return Array.isArray(e)&&0===e.length||At(`${t} must be empty.`,t),[]}function Nt(e,t,i){return e===t||At(`${i} must be ${String(t)}.`,i),t}var Pt=["cli","http","tmux","browser","gui","data"],Gt=["cli-transcript","log","screenshot","image","http-dump","data-diff"],Tt={cli:["cli-transcript","log"],tmux:["cli-transcript","log"],http:["http-dump"],browser:["screenshot","image"],gui:["screenshot","image"],data:["data-diff"]};function Ut(e,t){return function(e){return Pt.some(t=>t===e)}(e)?e:(At(`${t} must be a supported manual QA surface (${Pt.join(", ")}).`,t),"cli")}function Dt(e,t){return function(e){return Gt.some(t=>t===e)}(e)?e:(At(`${t} must be a supported artifact kind (${Gt.join(", ")}); review/QA reports belong in codeReview.reportPath or gateReview.reportPath, not artifactRefs.`,t),"log")}function Mt(e){return Tt[e]}function Wt(e,t){return Mt(e).includes(t)}function qt(e,t,i){if(void 0===i?.repoRoot||void 0===i.fs||Et(t))return;let r=It(i.repoRoot,e);i.fs.existsSync(r)?(i.fs.statSync(r).size<=0&&At(`${t} must point to a non-empty artifact.`,t),void 0===i.currentAttemptDir||function(e,t,i=U){let r=i.relative(t,e);return""===r||".."!==r&&!r.startsWith(`..${i.sep}`)&&!i.isAbsolute(r)}(r,It(i.repoRoot,i.currentAttemptDir))||At(`${t} (${e}) must point to an artifact from the current attempt (${i.currentAttemptDir}).`,t)):At(`${t} must point to an existing artifact.`,t)}function Qt(e,t){return Array.isArray(e)&&0!==e.length?e.flatMap((e,i)=>{let r=`manualQa.artifactRefs[${i}]`,n=Rt(e,r);if(Et(r))return[];let a=`${r}.path`,o=`${r}.id`,s=`${r}.kind`,c=`${r}.description`,l=jt(n.path,a),d=jt(n.id,o),u=Dt(n.kind,s);Et(s)&&function(e){Ot?.poisonedArtifactKinds.add(e)}(d);let p=jt(n.description,c);return qt(l,a,t),[{id:d,kind:u,description:p,path:l}]}):(At("manualQa.artifactRefs must not be empty.","manualQa.artifactRefs"),[])}function Jt(e,t,i){let r=xt(e,t);return Et(t)?[]:r.flatMap(e=>{let r=i.get(e);return void 0===r?(At(`${t} references unknown artifact ${e}.`,t),[]):[r]})}function Bt(e,t){return"not_applicable"===e?(At(`${t} must not be not_applicable.`,t),"passed"):Nt(e,"passed",t)}function Vt(e,t){return"CLEAR"===e||"WATCH"===e?e:(At(`${t} must be CLEAR or WATCH.`,t),"CLEAR")}import{existsSync as Ft,readFileSync as zt}from"node:fs";import{dirname as Ht,join as Kt}from"node:path";import{fileURLToPath as Xt}from"node:url";var Yt={lazycodex:{codeReview:"lazycodex-code-reviewer",manualQa:"lazycodex-qa-executor",gateReview:"lazycodex-gate-reviewer"},"omo-senpi":{codeReview:"omo-native-code-reviewer",manualQa:"omo-native-qa-executor",gateReview:"omo-native-gate-reviewer"}},Zt={"omo-senpi-code-reviewer":Yt["omo-senpi"].codeReview,"omo-senpi-qa-executor":Yt["omo-senpi"].manualQa,"omo-senpi-gate-reviewer":Yt["omo-senpi"].gateReview},ei=Object.values(Yt).map(e=>e.gateReview),ti=(new Set([...ei,...Object.entries(Zt).filter(([,e])=>ei.includes(e)).map(([e])=>e)]),{lazycodex:["manualQa","gateReview","iteration","criteriaCoverage"],"omo-senpi":["manualQa","gateReview","iteration","criteriaCoverage"]}),ii={lazycodex:["codeReview"],"omo-senpi":[]},ri={lazycodex:{codeReview:[Yt.lazycodex.codeReview,"main-session"],manualQa:[Yt.lazycodex.manualQa,"main-session"],gateReview:[Yt.lazycodex.gateReview,"category:deep-high","category:deep-low","category:deep","category:unspecified-high","category:unspecified-low","main-session"]},"omo-senpi":{manualQa:["main-session"],gateReview:["category:deep-high","category:deep-low","category:deep","category:unspecified-high","category:unspecified-low"]}};function ni(e){return"lazycodex"===e||"omo-senpi"===e?e:null}function ai(e){let t=ni((e?.env??process.env).OMO_AGENT_TOOLKIT_SURFACE);if(null!==t)return t;let i=e?.entryDir??Ht(Xt(import.meta.url));return function(e){try{if(!Ft(e))return null;return ni(JSON.parse(zt(e,"utf8")).surface)}catch(e){if(e instanceof Error)return null;throw e}}(Kt(i,"surface.json"))??"lazycodex"}var oi="blocker blockerSignature blockerEvidence blockerOccurrences blockedAt".split(" "),si=/https?:\/\/\S+/g,ci=/[`"'()[\]{}:,;]/g,li=/\s+/g,di=/\b(auth\w*|credential\w*|token|permission\w*|scope\w*|access|unauthorized|forbidden|401|403)\b/,ui=/\b(unset|missing|required|requires|without|omit\w*|not set|not available|no read packages|read packages)\b/,pi=/\b(ghcr|github container registry|read packages|imagepullsecret|package api|anonymous|container image)\b/,fi=/\b(401|unauthorized|anonymous pull|authentication required)\b/,gi=/\b(403|forbidden|read packages|package api)\b/;function vi(e){let t=function(e){return e.toLowerCase().replace(si," ").replace(ci," ").replace(li," ").trim()}(e);return t&&di.test(t)&&ui.test(t)?pi.test(t)?`GHCR_PULL_ACCESS:${[fi.test(t)?"HTTP_401_ANONYMOUS":null,gi.test(t)?"HTTP_403_NO_READ_PACKAGES":null].filter(e=>null!==e).join("+")||"AUTHORIZATION_REQUIRED"}:GHCR_VISIBILITY_OR_CREDENTIAL_REQUIRED`:"EXTERNAL_AUTHORIZATION_REQUIRED":null}function mi(e){let t=Reflect.get(e,"blocker"),i="object"!=typeof(r=t)||null===r||Array.isArray(r)?null:t.signature;var r;return"string"==typeof i?i:null}function hi(e,t,i){let r=`${i}.by`,n=ri[t][i];if("string"!=typeof e||""===e.trim())return jt(e,r),n?.[0]??"";let a=jt(e,r);return void 0!==n&&n.includes(a)||At(`${r} must be one of ${n?.join(", ")??"the configured reviewers"}.`,r),a}function wi(e,t){return kt(()=>function(e,t){let i=t?.reviewerSurface??"lazycodex",r=e,n=Rt(r&&"object"==typeof r&&"qualityGate"in r?r.qualityGate:e,"qualityGate");for(let e of ti[i])Rt(n[e],e);for(let e of Object.keys(n))"codeReview"!==e||ii[i].includes(e)||At("omo-senpi gate has no codeReview lane.",e);"omo-senpi"===i&&void 0!==n.codeReview&&At("omo-senpi gate has no codeReview lane.","codeReview");let a=Rt(n.manualQa,"manualQa"),o=Rt(n.gateReview,"gateReview"),s=Rt(n.iteration,"iteration"),c=Rt(n.criteriaCoverage,"criteriaCoverage"),l=void 0!==n.codeReview?Rt(n.codeReview,"codeReview"):void 0,d=hi(a.by,i,"manualQa"),u=hi(o.by,i,"gateReview"),p=jt(a.evidence,"manualQa.evidence"),f=jt(o.evidence,"gateReview.evidence"),g=Lt(c.totalCriteria,"criteriaCoverage.totalCriteria"),v=Lt(c.passCount,"criteriaCoverage.passCount");!Et("criteriaCoverage.passCount")&&v<g&&At("criteriaCoverage.passCount must cover totalCriteria.","criteriaCoverage.passCount");let m=Qt(a.artifactRefs,t),h=function(e){let t=new Map;for(let i of e)t.has(i.id)&&At(`manualQa.artifactRefs contains duplicate ${i.id}.`,"manualQa.artifactRefs"),t.set(i.id,i);return t}(m),w=function(e,t){return Array.isArray(e)&&0!==e.length?e.flatMap((e,i)=>{let r=Rt(e,`manualQa.surfaceEvidence[${i}]`);if(Et(`manualQa.surfaceEvidence[${i}]`))return[];let n=Ut(r.surface,`manualQa.surfaceEvidence[${i}].surface`),a=Jt(r.artifactRefs,`manualQa.surfaceEvidence[${i}].artifactRefs`,t);for(let e of a)Et(`manualQa.surfaceEvidence[${i}].surface`)||$t(e.id)||Wt(n,e.kind)||At(`manualQa.surfaceEvidence ${n} artifact ${e.kind} is incompatible; surface "${n}" accepts artifact kinds: ${Mt(n).join(", ")}.`,"manualQa.surfaceEvidence");return{id:jt(r.id,`manualQa.surfaceEvidence[${i}].id`),criterionRef:jt(r.criterionRef,`manualQa.surfaceEvidence[${i}].criterionRef`),surface:n,invocation:jt(r.invocation,`manualQa.surfaceEvidence[${i}].invocation`),verdict:Bt(r.verdict,`manualQa.surfaceEvidence[${i}].verdict`),artifactRefs:a.map(e=>e.id)}}):(At("manualQa.surfaceEvidence must not be empty.","manualQa.surfaceEvidence"),[])}(a.surfaceEvidence,h),b=function(e,t){return Array.isArray(e)&&0!==e.length?e.flatMap((e,i)=>{let r=Rt(e,`manualQa.adversarialCases[${i}]`);if(Et(`manualQa.adversarialCases[${i}]`))return[];let n=Jt(r.artifactRefs,`manualQa.adversarialCases[${i}].artifactRefs`,t),a=function(e,t){let i=e.verdict;return"passed"===i?{verdict:"passed"}:"not_applicable"===i?{verdict:"not_applicable",reason:jt(e.reason,`${t}.reason`)}:(At(`${t} must be passed or not_applicable with a reason.`,t),{verdict:"passed"})}(r,`manualQa.adversarialCases[${i}]`);return{id:jt(r.id,`manualQa.adversarialCases[${i}].id`),criterionRef:jt(r.criterionRef,`manualQa.adversarialCases[${i}].criterionRef`),scenario:jt(r.scenario,`manualQa.adversarialCases[${i}].scenario`),expectedBehavior:jt(r.expectedBehavior,`manualQa.adversarialCases[${i}].expectedBehavior`),verdict:a.verdict,...void 0===a.reason?{}:{reason:a.reason},artifactRefs:n.map(e=>e.id)}}):(At("manualQa.adversarialCases must not be empty.","manualQa.adversarialCases"),[])}(a.adversarialCases,h),_=jt(o.reportPath,"gateReview.reportPath");Et("gateReview.reportPath")||qt(_,"gateReview.reportPath",t);let y={manualQa:{by:d,status:Nt(a.status,"passed","manualQa.status"),evidence:p,surfaceEvidence:w,adversarialCases:b,artifactRefs:m},gateReview:{by:u,recommendation:Nt(o.recommendation,"APPROVE","gateReview.recommendation"),reportPath:_,evidence:f,blockers:Ct(o.blockers,"gateReview.blockers")},iteration:{fullRerun:Nt(s.fullRerun,!0,"iteration.fullRerun"),status:Nt(s.status,"passed","iteration.status"),rerunCommands:xt(s.rerunCommands,"iteration.rerunCommands"),evidence:jt(s.evidence,"iteration.evidence")},criteriaCoverage:{totalCriteria:g,passCount:v,originalIntent:jt(c.originalIntent,"criteriaCoverage.originalIntent"),desiredOutcome:jt(c.desiredOutcome,"criteriaCoverage.desiredOutcome"),userOutcomeReview:jt(c.userOutcomeReview,"criteriaCoverage.userOutcomeReview"),adversarialClassesCovered:xt(c.adversarialClassesCovered,"criteriaCoverage.adversarialClassesCovered")}};if("omo-senpi"===i)return{surface:i,...y};if(void 0===l)return{surface:i,...y};let I=jt(l.reportPath,"codeReview.reportPath");return qt(I,"codeReview.reportPath",t),{surface:i,...y,codeReview:{by:hi(l.by,i,"codeReview"),recommendation:Nt(l.recommendation,"APPROVE","codeReview.recommendation"),codeQualityStatus:Vt(l.codeQualityStatus,"codeReview.codeQualityStatus"),reportPath:I,evidence:jt(l.evidence,"codeReview.evidence"),blockers:Ct(l.blockers,"codeReview.blockers")}}}(e,t))}import{readFile as bi}from"node:fs/promises";new Set("--brief --brief-file --session-id --codex-goal-mode --validation-batch-json --goal --goal-id --criterion-id --status --evidence --notes --codex-goal-json --quality-gate-json --kind --rationale --title --objective --target-goal-id --source --after-json --directive-json --directive-file --idempotency-key --proposals-json".split(" ")),new Set("create-goals status complete-goals criteria record-evidence checkpoint steer add-goal record-review-blockers".split(" "));function _i(e,t){return Object.entries(e).find(([e])=>e===t)?.[1]}function yi(e,t){let i=_i(e,t);return"string"==typeof i&&i.trim().length>0?i.trim():void 0}async function Ii(e,t){let i=await async function(e){if(void 0!==e)try{return JSON.parse(function(e){let t=e.trim();return t.startsWith("{")||t.startsWith("[")}(e)?e:await bi(e,"utf8"))}catch(e){let t=e instanceof Error?e.message:"unknown error";throw new A(`Invalid JSON input: ${t}`,"ULW_LOOP_JSON_INPUT_INVALID",{cause:e})}}(e);if(void 0===i)return;Array.isArray(i)||Ai("--validation-batch-json must be a JSON array.");let r=i.map(Oi);return function(e,t){let i=new Set(t.map(e=>e.id)),r=new Set,n=new Set;for(let t of e){r.has(t.batchId)&&Ai(`duplicate validation batch id: ${t.batchId}.`),r.add(t.batchId),new Set(t.memberIds).size!==t.memberIds.length&&Ai(`validation batch ${t.batchId} has duplicate memberIds.`),t.memberIds.includes(t.finalGoalId)||Ai(`validation batch ${t.batchId} finalGoalId must be a member.`,"ULW_LOOP_VALIDATION_BATCH_FINAL_NOT_MEMBER");for(let e of t.memberIds)i.has(e)||Ai(`validation batch ${t.batchId} references unknown goal: ${e}.`,"ULW_LOOP_VALIDATION_BATCH_MEMBER_UNKNOWN"),n.has(e)&&Ai(`goal appears in multiple validation batches: ${e}.`,"ULW_LOOP_VALIDATION_BATCH_OVERLAP"),n.add(e)}}(r,t),r}function Oi(e){(function(e){return"object"==typeof e&&null!==e&&!Array.isArray(e)})(e)||Ai("validation batch entries must be objects.");let t=yi(e,"batchId"),i=function(e,t){let i=_i(e,t);return Array.isArray(i)&&i.every(e=>"string"==typeof e&&e.trim().length>0)?i.map(e=>e.trim()):void 0}(e,"memberIds"),r=yi(e,"finalGoalId");return void 0===t&&Ai("validation batch requires batchId."),(void 0===i||i.length<2)&&Ai("validation batch requires at least two memberIds."),void 0===r&&Ai("validation batch requires finalGoalId."),{batchId:t,memberIds:i,finalGoalId:r}}function Si(e,t){let i=function(e,t){return e.validationBatches?.find(e=>e.memberIds.includes(t))}(e,t);return i?.finalGoalId===t?i:void 0}function ki(e,t){let i=e.goals.find(e=>e.id===t);return void 0!==i&&function(e,t){return q(e.status)||Q(e,t)}(i,e)}function Ai(e,t="ULW_LOOP_VALIDATION_BATCH_INVALID"){throw new A(e,t)}var Ei={existsSync:e,statSync:t};function $i(e,t){throw new A(e,t)}function Ri(e,t,i,r,n){let a=vi(r),o=null===a?0:function(e,t){return e.goals.filter(e=>e.blockerSignature===t||mi(e)===t).length}(t,a)+1,s=null!==a&&o>=3;e.status=s?"needs_user_decision":i,e.updatedAt=n,("failed"===i||s)&&(e.failedAt=n,e.failureReason=r),("blocked"===i||s)&&(e.blockedReason=r),null!==a&&(e.blockerSignature=a,e.blockerOccurrenceCount=o,e.requiredExternalDecision=`Resolve external authorization: ${a}`),s&&(e.nonRetriable=!0),t.activeGoalId===e.id&&delete t.activeGoalId}function ji(e,t,i){return void 0!==i?"aggregate_completed":"complete"===e?"goal_completed":"needs_user_decision"===t.status?"goal_needs_user_decision":"blocked"===e?"goal_blocked":"goal_failed"}async function Li(t,n,a,o){return st(t,a,async()=>{let c,l,d,g=await lt(t,a),h=function(e,t){return e.goals.find(e=>e.id===t)??$i(`Unknown ulw-loop id: ${t}.`,"ulw_loop_goal_not_found")}(g,n.goalId),w=n.evidence.trim()||$i("Evidence must be a non-empty string.","ulw_loop_evidence_required"),b=E(),_=[],y=[];var I,O;if("complete"===n.status){let S,k="aggregate"===W(g),E=V(g,h),$=void 0!==Si(g,h.id);E?(_t(h),function(e){let t=e.goals.flatMap(e=>wt(e).map(t=>({goalId:e.id,id:t.id,status:t.status})));if(0!==t.length)throw new A("Ulw-loop aggregate has unresolved success criteria.","ulw_loop_criteria_not_all_pass",{details:{unresolved:t}})}(g),function(e,t){let i=(e.validationBatches??[]).filter(i=>i.memberIds.some(i=>i!==t&&!ki(e,i)));if(i.length>0)throw new A("Validation batches remain open.","ULW_LOOP_VALIDATION_BATCH_OPEN",{details:{batchIds:i.map(e=>e.batchId)}})}(g,h.id)):k?yt(h):_t(h);try{let e=await async function(e){let t=await u(e.raw,e.repoRoot),i=p(t,{expectedObjective:z(e.plan,e.goal),acknowledgedObjectives:v(e.plan),..."aggregate"===W(e.plan)?{acceptedObjectives:H(e.plan)}:{}});if(!i.ok)throw new s(f(i));return{raw:t?.raw,nextActions:i.nextActions,warnings:i.warnings,...void 0===i.unacknowledgedObjective?{}:{unacknowledgedObjective:i.unacknowledgedObjective}}}({repoRoot:t,plan:g,goal:h,raw:n.codexGoalJson,evidence:w,...void 0===a?{}:{scope:a}});d=e.raw,_=e.nextActions,y=e.warnings,m(g,e.unacknowledgedObjective)}catch(e){if(!(e instanceof A))throw e;S=e}if($&&function(e,t){let i=Si(e,t.id);if(void 0===i)return;let r=i.memberIds.filter(i=>i!==t.id&&!ki(e,i));if(r.length>0)throw new A("Validation batch has unresolved members.","ULW_LOOP_VALIDATION_BATCH_OPEN",{details:{batchId:i.batchId,open:r}})}(g,h),$&&void 0===n.qualityGateJson)throw new A("Validation batch final checkpoint requires --quality-gate-json.","ULW_LOOP_VALIDATION_BATCH_GATE_REQUIRED");if(E&&(c=function(e,t,i){return{status:"complete",completedAt:e,evidence:t,codexGoal:i}}(b,w,d)),E||void 0!==c||$)try{l=wi(await async function(t,n){if(void 0===t||""===t.trim())return;let a=t.trim();try{return JSON.parse(a)}catch(e){if(!(e instanceof SyntaxError))throw e}let o=r(n,a);if(!e(o))return $i("Quality gate JSON is neither valid JSON nor a readable path.","ulw_loop_json_input_invalid");try{return JSON.parse(await i(o,"utf8"))}catch(e){return $i("Quality gate path does not contain valid JSON"+(e instanceof Error?`: ${e.message}`:"."),"ulw_loop_json_input_invalid")}}(n.qualityGateJson,t),{repoRoot:t,fs:Ei,reviewerSurface:o?.surface??ai(),...2===g.evidenceLayoutVersion?{currentAttemptDir:T(h.id,h.attempt,a)}:{}}),function(e,t,i){let r=Si(e,t.id);if(void 0===r)return;let n=r.memberIds.map(t=>e.goals.find(e=>e.id===t)).filter(e=>void 0!==e),a=n.flatMap(e=>e.successCriteria.filter(e=>"pass"!==e.status).map(t=>`${e.id}:${t.id}`));if(a.length>0)throw new A("Validation batch criteria remain pending.","ULW_LOOP_VALIDATION_BATCH_CRITERIA_PENDING",{details:{batchId:r.batchId,pending:a}});let o=n.reduce((e,t)=>e+t.successCriteria.length,0),s=n.reduce((e,t)=>e+t.successCriteria.filter(e=>"pass"===e.status).length,0);if(i.criteriaCoverage.totalCriteria!==o||i.criteriaCoverage.passCount!==s)throw new A("Validation batch gate coverage does not match member criteria.","ULW_LOOP_VALIDATION_BATCH_GATE_MISMATCH",{details:{batchId:r.batchId,expected:{totalCriteria:o,passCount:s},actual:i.criteriaCoverage}})}(g,h,l)}catch(e){if(!(e instanceof A)||void 0===S)throw e;throw O=e,new A(`${(I=S).message}\n${O.message}`,"ULW_LOOP_QUALITY_GATE_INVALID",{details:{...I.details??{},...O.details??{}}})}if(void 0!==S)throw S;h.status="complete",h.completedAt=b,h.evidence=w,delete h.failedAt,delete h.failureReason,function(e){for(let t of oi)Reflect.deleteProperty(e,t)}(h),g.activeGoalId===h.id&&delete g.activeGoalId}else Ri(h,g,n.status,w,b);h.updatedAt=b,void 0!==c&&(g.aggregateCompletion=c),void 0!==c&&(_=[..._,'aggregate complete — now update_goal({status:"complete"})']),g.updatedAt=b;let S=function(e,t,i,r,n,a){let o="lazycodex"===r?.surface&&"WATCH"===r.codeReview?.codeQualityStatus,s={at:e,kind:ji(t.status,i,a),goalId:i.id,status:i.status,evidence:o&&"lazycodex"===r.surface?`${t.evidence} | codeQuality=WATCH: ${r.codeReview?.evidence??""}`:t.evidence};return void 0!==n&&(s.codexGoal=n),void 0!==r&&(s.qualityGate=r),void 0!==i.blockerSignature&&(s.blockerSignature=i.blockerSignature),void 0!==i.blockerOccurrenceCount&&(s.blockerOccurrenceCount=i.blockerOccurrenceCount),void 0!==i.requiredExternalDecision&&(s.requiredExternalDecision=i.requiredExternalDecision),s}(b,n,h,l,d,c),k=[S],$="complete"===n.status?Si(g,h.id):void 0;return void 0!==$&&k.push({at:b,kind:"batch_closed",goalId:h.id,message:$.batchId}),await ft(t,a,{plan:g,entries:k}),void 0===c?{plan:g,goal:h,ledgerEntry:S,nextActions:_,warnings:y}:{plan:g,goal:h,ledgerEntry:S,aggregateCompletion:c,nextActions:_,warnings:y}})}function xi(e,t){return`${e}/${t}`}function Ci(e,t){return{manualQa:{by:"main-session",status:"passed",evidence:"<replace:manual QA evidence>",surfaceEvidence:[{id:"surface-cli",criterionRef:"<replace:criterion id>",surface:"cli",invocation:"<replace:command>",verdict:"passed",artifactRefs:["artifact-cli"]},{id:"surface-data",criterionRef:"<replace:criterion id>",surface:"data",invocation:"<replace:command>",verdict:"passed",artifactRefs:["artifact-data"]}],adversarialCases:[{id:"<replace:adversarial case id>",criterionRef:"<replace:criterion id>",scenario:"<replace:scenario>",expectedBehavior:"<replace:expected behavior>",verdict:"not_applicable",reason:"<replace:reason>",artifactRefs:["artifact-cli"]}],artifactRefs:[{id:"artifact-cli",kind:"cli-transcript",description:"<replace:artifact description>",path:xi(t,"cli-transcript.txt")},{id:"artifact-data",kind:"data-diff",description:"<replace:artifact description>",path:xi(t,"data-diff.txt")}]},gateReview:{by:"omo-senpi"===e?"category:deep-high":"main-session",recommendation:"APPROVE",reportPath:xi(t,"gate-review.md"),evidence:"<replace:gate review evidence>",blockers:[],notes:[]},iteration:{fullRerun:!0,status:"passed",rerunCommands:["<replace:verification command>"],evidence:"<replace:iteration evidence>"},criteriaCoverage:{totalCriteria:0,passCount:0,originalIntent:"<replace:original intent>",desiredOutcome:"<replace:desired outcome>",userOutcomeReview:"<replace:user outcome review>",adversarialClassesCovered:["<replace:adversarial class>"]}}}function Ni(e,t){throw new A(`Invalid successCriteria: ${e}`,"ULW_LOOP_ARGUMENT_INVALID",{details:t})}function Pi(e,t,i){return("string"==typeof e?e.trim():"")||Ni(`entry ${i+1} needs a non-empty ${t}.`,{index:i,field:t})}function Gi(e){return`C${String(e+1).padStart(3,"0")}`}function Ti(e){return 0===e.length&&Ni("provide at least one criterion or omit the field for placeholders.",{count:0}),e.map((e,t)=>{if("object"!=typeof e||null===e||Array.isArray(e))return Ni(`entry ${t+1} must be an object.`,{index:t});let i={...e},r=i.userModel??"happy";if("string"!=typeof(n=r)||!k.some(e=>e===n))return Ni(`entry ${t+1} userModel must be one of ${k.join(", ")}.`,{index:t,userModel:String(r)});var n;let a=i.essential;return void 0!==a&&"boolean"!=typeof a?Ni(`entry ${t+1} essential must be a boolean.`,{index:t}):{id:Gi(t),scenario:Pi(i.scenario,"scenario",t),userModel:r,expectedEvidence:Pi(i.expectedEvidence,"expectedEvidence",t),essential:a??!0,capturedEvidence:null,status:"pending"}})}function Ui(e){return e.replace(/^\s*(?:[-*+]\s+|\d+[.)]\s+)/,"").trim()}function Di(e){return e.replace(/\s+/g," ").trim()}function Mi(e,t){let i=e.split(/\r?\n/).map(e=>e.trim()).find(Boolean)??t;return i.length>72?`${i.slice(0,69).trimEnd()}...`:i}function Wi(e,t){let i=e?.trim();if(!i)throw new A(`Missing ${t}.`,"ULW_LOOP_ARGUMENT_MISSING");return i}function qi(e,t,i){return"omo-senpi"===i?`Replace via agentToolkit.steer({ kind: "revise_criterion", source: "finding", goalId: "${e}", criterionId: "${t}", scenario, expectedEvidence, evidence, rationale }) (or pass successCriteria to addGoal)`:`Replace via omo-agent-toolkit ulw-loop steer --kind revise_criterion --goal-id ${e} --criterion-id ${t} --scenario "<scenario>" --expected-evidence "<proof>" --evidence "<why>" --rationale "<why>"`}function Qi(e,t,i={}){let r=function(e){return e.length>80?`${e.slice(0,77).trimEnd()}...`:e}(Di(t)||`Goal ${e+1}`),n=i.goalId??`G${String(e+1).padStart(3,"0")}`,a=i.surface??"lazycodex";return[["happy",`happy path for: ${r}`,`observable happy-path proof for goal ${e+1}`,!0],["edge","edge case (boundary/empty/malformed)",`boundary or malformed-input proof for: ${r}`,!0],["regression","regression: adjacent surface still works",`regression proof for neighboring behavior after: ${r}`,!1]].map(([e,t,i,r],o)=>{let s=Gi(o);return{id:s,scenario:t,userModel:e,expectedEvidence:`${qi(n,s,a)} with ${i}.`,essential:r,capturedEvidence:null,status:"pending"}})}function Ji(e,t,i,r,n={}){let a=Wi(e,"title"),o=Wi(t,"objective"),s=function(e,t){let i=e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,36).replace(/-+$/g,"");return`G${String(t+1).padStart(3,"0")}${i?`-${i}`:""}`}(a,i);return{id:s,title:a,objective:o,status:"pending",successCriteria:void 0===n.successCriteria?Qi(i,o,{goalId:s,...void 0===n.surface?{}:{surface:n.surface}}):Ti(n.successCriteria),attempt:0,createdAt:r,updatedAt:r}}function Bi(e){return"superseded"!==e.steeringStatus&&"blocked"!==e.steeringStatus}async function Vi(e,t,i,r="lazycodex"){return st(e,i,async()=>{let n;if(function(e,t){let i=j(e,t);return he(_e(i,"goals.json"))||Oe(i).length>0}(e,i))try{n=await lt(e,i)}catch(e){if(!t.force)throw e}if(!t.force&&void 0!==n){if(B(n))throw function(e,t){return new A([`Existing ulw-loop aggregate is already complete at ${x(e)}.`,..."omo-senpi"===t?["Start a new run under a fresh session id (a new senpi session) or call agentToolkit.createGoals({ brief, force: true }) to recreate."]:["Start a new run with `omo-agent-toolkit ulw-loop create-goals --session-id <new-id> ...` to isolate fresh state.","Use --force only when you intentionally want to overwrite the completed evidence."]].join(" "),"ULW_LOOP_PLAN_EXISTS_COMPLETE")}(i,r);throw new A(`Refusing to overwrite existing ${x(i)}; pass --force to recreate it.`,"ULW_LOOP_PLAN_EXISTS")}let a=E(),o=function(e){let t=e.split(/\r?\n/).map(e=>({original:e,cleaned:Di(Ui(e))})).filter(({cleaned:e})=>e.length>0&&e.length<=1200).filter(({original:e,cleaned:t},i,r)=>/^\s*(?:[-*+]\s+|\d+[.)]\s+)/.test(e)&&r.findIndex(e=>e.cleaned===t)===i).map(({cleaned:e})=>e),i=e.split(/\n\s*\n/).map(Di).filter(e=>e.length>0&&!e.startsWith("#"));return((t.length>0?t:i).length>0?t.length>0?t:i:["Complete the requested project objective."]).map((e,t)=>({title:Mi(e,`Goal ${t+1}`),objective:e}))}(t.brief).map((e,t)=>Ji(e.title,e.objective,t,a,{surface:r})),s={version:1,revision:n?.revision??0,ledgerResetRevision:(n?.revision??0)+1,brief:t.brief.endsWith("\n")?t.brief:`${t.brief}\n`,evidenceLayoutVersion:2,createdAt:a,updatedAt:a,briefPath:L(i),goalsPath:x(i),ledgerPath:C(i),codexGoalMode:t.codexGoalMode??"aggregate",goals:o},c=await Ii(t.validationBatchesJson,o);return void 0!==c&&(s.validationBatches=c),"aggregate"===s.codexGoalMode&&(s.codexObjective=M(i)),await async function(){await(ut.getStore()?.beforeMutation?.())}(),await ft(e,i,{plan:s,entries:[{at:a,kind:"plan_created",message:`${o.length} goal(s) created`}]}),s})}async function Fi(e,t,i,r="lazycodex"){return st(e,i,async()=>{let n=await lt(e,i),a=E(),o=function(e,t,i,r,n={}){let a=Ji(t,i,e.goals.length,r,n);return e.goals.push(a),e.updatedAt=r,a}(n,t.title,t.objective,a,{surface:r,...void 0===t.successCriteria?{}:{successCriteria:t.successCriteria}});return await ft(e,i,{plan:n,entries:[{at:a,kind:"goal_added",goalId:o.id,status:o.status,message:o.title}]}),{plan:n,goal:o}})}function zi(e){let t=t=>e.goals.filter(e=>e.status===t).length,i=t=>e.goals.reduce((e,i)=>e+i.successCriteria.filter(e=>e.status===t).length,0);return{total:e.goals.length,pending:t("pending"),in_progress:t("in_progress"),complete:t("complete"),failed:t("failed"),blocked:t("blocked"),review_blocked:t("review_blocked"),needs_user_decision:t("needs_user_decision"),superseded:e.goals.filter(e=>"superseded"===e.steeringStatus).length,criteria:{total:e.goals.reduce((e,t)=>e+t.successCriteria.length,0),pass:i("pass"),pending:i("pending"),fail:i("fail"),blocked:i("blocked")}}}var Hi="blockedReason blockerSignature blockerOccurrenceCount requiredExternalDecision nonRetriable failedAt failureReason completedAt blocker blockerEvidence blockerOccurrences blockedAt".split(" ");function Ki(e,t){throw new A(e,t)}function Xi(e,t,i){let r=e.goals.length,n=function(e){let t=e.goals.reduce((e,t)=>{let i=/^G(\d+)/u.exec(t.id)?.[1];return void 0===i?e:Math.max(e,Number(i))},0);return`G${String(t+1).padStart(3,"0")}`}(e),a={id:n,title:t.title,objective:t.objective,status:"pending",successCriteria:Qi(r,t.objective,{goalId:n}),attempt:0,createdAt:i,updatedAt:i};return e.goals.push(a),a}function Yi(e,t="lazycodex"){let i=[],r=e.goals.find(t=>t.id===e.activeGoalId);0===e.goals.length?i.push(`No goals yet: bootstrap with \`${je(t)}\`.`):void 0!==r&&i.push(...function(e,t,i){let r=t.successCriteria.filter(e=>"pass"!==e.status);return r.length>0?["omo-senpi"===i?`${t.id} has ${r.length} unresolved criterion(s) (${r.map(e=>e.id).join(", ")}): record proof with \`agentToolkit.recordEvidence({ goalId: "${t.id}", criterionId: "<id>", status: "pass", evidence: "<observable proof>" })\`.`:`${t.id} has ${r.length} unresolved criterion(s) (${r.map(e=>e.id).join(", ")}): record proof with \`omo-agent-toolkit ulw-loop record-evidence --goal-id ${t.id} --criterion-id <id> --status pass --evidence "<observable proof>"\`.`]:K(t)&&V(e,t)?["omo-senpi"===i?`${t.id} passes every criterion and is the final story: complete the driver goal, then call \`agentToolkit.checkpoint({ goalId: "${t.id}", printTemplate: true })\` to build the final quality gate. Use status().result.currentAttemptDir for all quality-gate artifacts.`:`${t.id} passes every criterion and is the final story: update_goal complete, then checkpoint --print-template to build the final quality gate. Use status --json's currentAttemptDir for all quality-gate artifacts.`]:["omo-senpi"===i?`${t.id} passes every criterion: close it with \`agentToolkit.checkpoint({ goalId: "${t.id}", status: "complete", evidence: "<proof>" })\`. Put quality-gate artifacts under status().result.currentAttemptDir.`:`${t.id} passes every criterion: close it with \`omo-agent-toolkit ulw-loop checkpoint --goal-id ${t.id} --status complete --evidence "<proof>" --codex-goal-json '<get_goal json>'\`. Put quality-gate artifacts under the currentAttemptDir shown by status --json.`]}(e,r,t));for(let r of e.goals.filter(e=>"review_blocked"===e.status))i.push("omo-senpi"===t?`${r.id} is review_blocked: capture the reviewer verdict with \`agentToolkit.recordReviewBlockers({ goalId: "${r.id}", title: "<title>", objective: "<objective>", evidence: "<verdict>" })\`.`:`${r.id} is review_blocked: capture the reviewer verdict with \`omo-agent-toolkit ulw-loop record-review-blockers --goal-id ${r.id} --title "<title>" --objective "<objective>" --evidence "<verdict>" --codex-goal-json '<get_goal json>'\`.`);return 2===e.evidenceLayoutVersion&&void 0!==r||i.push("plan is evidence-layout v1; artifacts go under .omo/evidence/"),i}var Zi=(e,t)=>Object.entries(e).find(([e])=>e===t)?.[1],er=(e,t)=>{let i=Zi(e,t);return(e=>"string"==typeof e&&e.trim().length>0)(i)?i.trim():void 0},tr=e=>{let t=Zi(e,"after");return"object"!=typeof t||null===t||Array.isArray(t)?void 0:t},ir=(e,t,i)=>er(e,t)??er(tr(e)??e,i),rr=e=>e.targetGoalIds??[e.targetGoalId??er(e,"goalId")??""].filter(Boolean),nr=e=>{if("object"!=typeof e||null===e||Array.isArray(e))return null;let t=er(e,"title"),i=er(e,"objective");return void 0===t||void 0===i?null:{title:t,objective:i}},ar=(e,t)=>void 0===t?void 0:e.goals.find(e=>e.id===t);function or(e,t,i,r,n,a="lazycodex"){let o=function(e,t){let i=e.goals.reduce((e,t)=>{let i=/^G(\d+)(?:-|$)/u.exec(t.id)?.[1];return void 0===i?e:Math.max(e,Number(i))},0);return`G${String(i+t).padStart(3,"0")}`}(e,n),s=/^G(\d+)/u.exec(o)?.[1],c=void 0===s?e.goals.length+n-1:Number(s)-1;return{id:o,title:t.title,objective:t.objective,status:"pending",successCriteria:Qi(c,t.objective,{goalId:o,surface:a}),attempt:0,createdAt:r,updatedAt:r,evidence:i}}function sr(e,t,i,r="lazycodex"){let n=ar(e,rr(t)[0]);if(void 0===n)return;let a=(e=>{let t=e.childGoals;if(void 0!==t&&t.length>0)return t;let i=tr(e),r=void 0===i?void 0:Zi(i,"children");return Array.isArray(r)?r.map(nr).filter(e=>null!==e):[]})(t).map((n,a)=>or(e,n,t.evidence,i,a+1,r));if(n.steeringEvidence=t.evidence,n.steeringRationale=t.rationale,n.updatedAt=i,0===a.length)n.status="blocked",n.steeringStatus="blocked",n.blockedReason=t.blockedReason??t.rationale;else{n.steeringStatus="superseded",n.supersededBy=a.map(e=>e.id);for(let e of a)e.supersedes=[n.id];e.goals.splice(e.goals.indexOf(n)+1,0,...a),function(e,t,i){0!==i.length&&void 0!==e.validationBatches&&(e.validationBatches=e.validationBatches.map(e=>{if(!e.memberIds.includes(t))return e;let r=e.memberIds.flatMap(e=>e===t?[...i]:[e]),n=i[i.length-1]??e.finalGoalId,a=e.finalGoalId===t?n:e.finalGoalId;return{batchId:e.batchId,memberIds:r,finalGoalId:a}}))}(e,n.id,a.map(e=>e.id))}e.activeGoalId===n.id&&delete e.activeGoalId}function cr(e,t){let i={updatedAt:e.updatedAt,goalCount:e.goals.length,goalIds:e.goals.map(e=>e.id),goals:e.goals.filter(e=>t.has(e.id))};return void 0===e.activeGoalId?i:{...i,activeGoalId:e.activeGoalId}}var lr=["user_prompt_submit","finding","cli"],dr=new Set(["aggregateCompletion","codexObjective","codexObjectiveAliases","acknowledgedDriverObjectives","originalConstraints","qualityGate","status","completedAt","completionStatus"]),ur=e=>"object"==typeof e&&null!==e,pr=e=>ur(e)&&!Array.isArray(e),fr=(e,t)=>Object.entries(e).find(([e])=>e===t)?.[1],gr=(e,t)=>{let i=fr(e,t);return(e=>"string"==typeof e&&e.trim().length>0)(i)?i.trim():void 0},vr=e=>"string"==typeof e&&S.some(t=>t===e),mr=e=>"string"==typeof e&&lr.some(t=>t===e),hr=(e,t)=>{let i=fr(e,t);return Array.isArray(i)&&i.every(e=>"string"==typeof e)?i:[]};function wr(e){let t=hr(e,"targetGoalIds"),i=gr(e,"targetGoalId")??gr(e,"goalId");return t.length>0?t:void 0===i?[]:[i]}var br=e=>{let t=fr(e,"after");return pr(t)?t:void 0},_r=(e,t,i)=>gr(e,t)??gr(br(e)??e,i);var yr=e=>{let t=hr(e,"pendingOrder");return t.length>0?t:hr(br(e)??e,"pendingGoalIds")};function Ir(e){if(!ur(e))return!1;for(let[t,i]of Object.entries(e))if(dr.has(t)||t.toLowerCase().includes("complete")||Ir(i))return!0;return!1}function Or(e){return"string"==typeof e?e:ur(e)?Object.values(e).map(Or).filter(Boolean).join("\n"):""}function Sr(e){let t=Or(e).toLowerCase();return/\b(skip|bypass|weaken|remove|omit|auto[-\s]?complete|mark complete|complete faster)\b/.test(t)&&/\b(test|tests|verification|review|quality gate|complete|completion)\b/.test(t)}function kr(e,t){let i=[];pr(t)||i.push("proposal must be an object");let r=pr(t)?t:{},n=fr(r,"kind");return vr(n)||i.push(`invalid kind: ${String(n)}`),mr(fr(r,"source"))||i.push(`invalid source: ${String(fr(r,"source"))}`),void 0===gr(r,"evidence")&&i.push("missing evidence"),void 0===gr(r,"rationale")&&i.push("missing rationale"),Ir(t)&&i.push("protected payload"),Sr(t)&&i.push("weakened completion"),B(e)&&i.push("plan already complete"),vr(n)&&function(e,t,i,r){let n=Ar(e,wr(t)[0]);"add_subgoal"!==i||void 0!==gr(t,"title")&&void 0!==gr(t,"objective")||r.push("add_subgoal requires title/objective");"split_subgoal"!==i&&"revise_pending_wording"!==i&&"mark_blocked_superseded"!==i||void 0!==n||r.push(`${i} requires target`);"split_subgoal"!==i&&"revise_pending_wording"!==i||void 0===n||"pending"===n.status||r.push(`${i} requires pending target`);let a=function(e){let t=fr(e,"childGoals");if(Array.isArray(t)&&t.length>0)return t;let i=br(e),r=void 0===i?void 0:fr(i,"children");return Array.isArray(r)?r:[]}(t);"split_subgoal"===i&&0===a.length&&r.push("split_subgoal requires children");"split_subgoal"!==i&&"mark_blocked_superseded"!==i||!a.some(e=>null===function(e){if(!pr(e))return null;let t=gr(e,"title"),i=gr(e,"objective");return void 0===t||void 0===i?null:{title:t,objective:i}}(e))||r.push(`${i} children require title/objective`);"reorder_pending"===i&&function(e,t,i){let r=yr(t),n=e.goals.filter(e=>"pending"===e.status&&void 0===e.steeringStatus).map(e=>e.id);0===r.length&&i.push("reorder_pending requires ids");new Set(r).size!==r.length&&i.push("duplicate pending id");r.some(e=>!n.includes(e))&&i.push("unknown pending id")}(e,t,r);"revise_pending_wording"===i&&void 0===_r(t,"revisedTitle","title")&&void 0===_r(t,"revisedObjective","objective")&&r.push("revise_pending_wording requires update");"revise_criterion"===i&&function(e,t,i){let r=Ar(e,wr(t)[0]),n=gr(t,"criterionId");void 0===r?i.push("revise_criterion requires goalId"):(void 0===n||r.successCriteria.every(e=>e.id!==n))&&i.push("revise_criterion requires criterionId");let a=fr(t,"userModel");void 0===fr(t,"scenario")&&void 0===fr(t,"expectedEvidence")&&void 0===a&&i.push("revise_criterion requires update");void 0===a||(o=a,"string"==typeof o&&k.some(e=>e===o))||i.push("invalid userModel");var o}(e,t,r)}(e,r,n,i),function(e,t){let i=pr(e)?e:void 0,r=void 0===i?void 0:fr(i,"kind"),n=void 0===i?void 0:fr(i,"source"),a=void 0===i?"":gr(i,"evidence")??"",o=void 0===i?"":gr(i,"rationale")??"",s={kind:vr(r)?r:"annotate_ledger",source:mr(n)?n:"cli",targetGoalIds:void 0===i?[]:wr(i),evidence:a,rationale:o,invariant:{accepted:0===t.length,structuralInvariantAccepted:0===t.length,evidenceBackedNecessity:a.length>0&&o.length>0,noEasierCompletion:!Sr(e),rejectedReasons:t,reasons:t}};if(void 0===i)return s;let c=gr(i,"criterionId"),l=gr(i,"directiveText"),d=gr(i,"promptSignature"),u=gr(i,"idempotencyKey");return void 0!==c&&(s.criterionId=c),void 0!==l&&(s.directiveText=l),void 0!==d&&(s.promptSignature=d),void 0!==u&&(s.idempotencyKey=u),s}(t,i)}function Ar(e,t){return void 0===t?void 0:e.goals.find(e=>e.id===t)}function Er(e,t,i,r="lazycodex"){let n=structuredClone(e);if(!i.invariant.accepted)return n;let a=t.now?.toISOString()??E();if("add_subgoal"===t.kind&&n.goals.push(or(n,{title:t.title??"",objective:t.objective??""},t.evidence,a,1,r)),"reorder_pending"===t.kind){let e=yr(t);n.goals=[...e.map(e=>Ar(n,e)).filter(e=>void 0!==e),...n.goals.filter(t=>!e.includes(t.id))]}return"revise_pending_wording"===t.kind&&function(e,t,i){let r=ar(e,rr(t)[0]);void 0!==r&&(r.title=ir(t,"revisedTitle","title")??r.title,r.objective=ir(t,"revisedObjective","objective")??r.objective,r.steeringEvidence=t.evidence,r.steeringRationale=t.rationale,r.updatedAt=i)}(n,t,a),"split_subgoal"!==t.kind&&"mark_blocked_superseded"!==t.kind||sr(n,t,a,r),"revise_criterion"===t.kind&&function(e,t,i){let r=ar(e,rr(t)[0]),n=r?.successCriteria.findIndex(e=>e.id===t.criterionId)??-1,a=r?.successCriteria[n];if(void 0===r||void 0===a)return;let o=Zi(t,"userModel");var s;r.successCriteria[n]={...a,scenario:er(t,"scenario")??a.scenario,expectedEvidence:er(t,"expectedEvidence")??a.expectedEvidence,userModel:(s=o,"string"==typeof s&&k.some(e=>e===s)?o:a.userModel)},r.updatedAt=i}(n,t,a),"annotate_ledger"!==t.kind&&(n.updatedAt=a),n}async function $r(e,t,i,r="lazycodex"){return st(e,i,async()=>{let n=await lt(e,i),a=t.idempotencyKey??t.promptSignature,o=void 0===a?void 0:await async function(e,t,i){return Ze(e,i).find(e=>{return!("steering_accepted"!==(i=e.kind)&&"steering_rejected"!==i&&"criteria_revised"!==i&&"batch_updated"!==i||!0!==e.steering?.invariant.accepted||e.idempotencyKey!==t&&e.steering.idempotencyKey!==t&&e.steering.promptSignature!==t);var i})}(e,a,i);if(void 0!==o?.steering){let{before:e,after:t,...i}=o.steering;return{plan:n,accepted:!0,audit:{...i,deduped:!0},rejectedReasons:[],deduped:!0}}let s=kr(n,t),c=s.invariant.accepted,l=c?Er(n,t,s,r):n,d={...s};if(c){let e=function(e,t){let i=new Map(e.goals.map(e=>[e.id,e])),r=new Set;for(let e of t.goals){let t=i.get(e.id);void 0!==t&&JSON.stringify(t)===JSON.stringify(e)||r.add(e.id),i.delete(e.id)}for(let e of i.keys())r.add(e);return r}(n,l);d.before=cr(n,e),d.after=cr(l,e)}let u=t.now?.toISOString()??E(),p=c?function(e,t,i){return JSON.stringify(e.validationBatches??[])===JSON.stringify(t.validationBatches??[])?null:{at:i,kind:"batch_updated",before:e.validationBatches??[],after:t.validationBatches??[],message:"Validation batch membership updated after steering."}}(n,l,u):null,f=[Rr(t,d,u)];return null!==p&&f.push(p),await ft(e,i,{plan:l,entries:f}),{plan:l,accepted:c,audit:d,rejectedReasons:s.invariant.rejectedReasons,deduped:!1}})}function Rr(e,t,i){let r={at:i,kind:t.invariant.accepted?"revise_criterion"===e.kind?"criteria_revised":"steering_accepted":"steering_rejected",evidence:e.evidence,message:e.rationale,steering:t,mutationKind:e.kind},n=t.targetGoalIds[0];return void 0!==n&&(r.goalId=n),void 0!==e.criterionId&&(r.criterionId=e.criterionId),void 0!==e.idempotencyKey&&(r.idempotencyKey=e.idempotencyKey),r}var jr=["help","create-goals","status","complete-goals","checkpoint","steer","add-goal","criteria","record-evidence","record-review-blockers"],Lr={version:1,name:"ulw-loop",operations:[{name:"help",method:"help",mutating:!1,description:"Return this manifest: every operation with its method name, argument fields, and what it does.",args:{}},{name:"create-goals",method:"createGoals",mutating:!0,description:"Create the session plan from a brief; one goal per bullet, each seeded with placeholder criteria until revised.",args:{brief:"string",codexGoalMode:'"aggregate" | "per_story"?',force:"boolean?",validationBatchesJson:"string?"}},{name:"status",method:"status",mutating:!1,description:"Read the plan, its summary, structured nextActions, the stable evidenceRoot, and the active goal's currentAttemptDir.",args:{}},{name:"complete-goals",method:"completeGoals",mutating:!0,description:"Acquire the next eligible goal or resume the in-progress one; returns { done: true } once the aggregate is complete.",args:{retryFailed:"boolean?"}},{name:"checkpoint",method:"checkpoint",mutating:!0,description:"Close the goal as complete, failed, or blocked with evidence; the final goal also needs the quality gate. printTemplate returns that gate's template instead.",args:{goalId:"string",status:'"complete" | "failed" | "blocked"',evidence:"string",codexGoalJson:"string?",qualityGateJson:"string?",printTemplate:"true? (with goalId? only)"}},{name:"steer",method:"steer",mutating:!0,description:"Propose an evidence-backed plan mutation; revise_criterion replaces a criterion's scenario, expectedEvidence, or userModel.",args:{kind:'"add_subgoal" | "split_subgoal" | "reorder_pending" | "revise_pending_wording" | "revise_criterion" | "annotate_ledger" | "mark_blocked_superseded"',source:'"finding" | "user_prompt_submit" | "cli"',evidence:"string",rationale:"string",goalId:"string?",criterionId:"string? (revise_criterion)",scenario:"string? (revise_criterion)",expectedEvidence:"string? (revise_criterion)",userModel:'"happy" | "edge" | "regression" | "adversarial"? (revise_criterion)',title:"string? (add_subgoal)",objective:"string? (add_subgoal)",childGoals:"{ title: string, objective: string }[]? (split_subgoal)",revisedTitle:"string? (revise_pending_wording)",revisedObjective:"string? (revise_pending_wording)",pendingOrder:"string[]? (reorder_pending)",blockedReason:"string? (mark_blocked_superseded)",idempotencyKey:"string?"}},{name:"add-goal",method:"addGoal",mutating:!0,description:"Append a goal; pass successCriteria to define its criteria in the same call, otherwise placeholders name the revise call.",args:{title:"string",objective:"string",successCriteria:'{ scenario: string, expectedEvidence: string, userModel?: "happy" | "edge" | "regression" | "adversarial", essential?: boolean }[]?'}},{name:"criteria",method:"criteria",mutating:!1,description:"List one goal's success criteria with their status and captured evidence.",args:{goalId:"string"}},{name:"record-evidence",method:"recordEvidence",mutating:!0,description:"Record a criterion's pass, fail, or blocked evidence; artifacts must exist (resolved against the session cwd) and are stored with the criterion and the ledger entry.",args:{goalId:"string",criterionId:"string",status:'"pass" | "fail" | "blocked"',evidence:"string",notes:"string?",artifacts:"string[]?"}},{name:"record-review-blockers",method:"recordReviewBlockers",mutating:!0,description:"Mark the final goal review_blocked and append the blocker goal the reviewer verdict names.",args:{goalId:"string",title:"string",objective:"string",evidence:"string",codexGoalJson:"string?"}}]};function xr(e){let t=void 0===e.details?void 0:Object.fromEntries(Object.entries(e.details).map(([e,t])=>[e,String(t)]));return void 0===t?{code:e.code,message:e.message}:{code:e.code,message:e.message,details:t}}function Cr(e,t){return{ok:!1,operation:e,error:xr(t)}}function Nr(e,t){if(!(t in e))return[];let i=Object.entries(e).find(([e])=>e===t)?.[1];return Array.isArray(i)?i.filter(e=>"string"==typeof e).slice(0,8):[]}function Pr(e,t,i){return function(e){if(void 0!==e)try{JSON.parse(e)}catch(e){throw new A(`Invalid codexGoal: ${e instanceof Error?e.message:"not valid JSON"}`,"ULW_LOOP_CODEX_GOAL_JSON_INVALID",{cause:e})}}(i.codexGoalJson),Li(e.cwd,i,t,{surface:e.surface})}function Gr(e,t={}){!function(e){if(!e.cwd.trim())throw new A("cwd is required.","ULW_LOOP_CWD_REQUIRED");let t=e.sessionId.trim();if(!t)throw new A("ULW_LOOP_SESSION_ID_REQUIRED: sessionId is required.","ULW_LOOP_SESSION_ID_REQUIRED");if(null===$(t)||/(?:^|[\\/])\.\.(?:[\\/]|$)/.test(t))throw new A("ULW_LOOP_SESSION_ID_INVALID: sessionId normalizes to null.","ULW_LOOP_SESSION_ID_INVALID");if("omo-senpi"!==e.surface&&"lazycodex"!==e.surface)throw new A("surface must be omo-senpi or lazycodex.","ULW_LOOP_SURFACE_INVALID")}(e);let i={sessionId:e.sessionId},r=async(i,r)=>(void 0!==t.hooks?.onOperation&&await t.hooks.onOperation({operation:i,context:e,response:r}),r),n=async(t,n)=>{try{let e=await n(),i="object"==typeof e&&null!==e?Nr(e,"nextActions"):[],a="object"==typeof e&&null!==e?Nr(e,"warnings"):[];return await r(t,{ok:!0,operation:t,result:e,nextActions:i,...0===a.length?{}:{warnings:a}})}catch(n){if(n instanceof A&&"ULW_LOOP_PLAN_MISSING"===n.code&&"omo-senpi"===e.surface)return r(t,Cr(t,Le(x(i),dt(e.cwd),e.surface)));let a=function(e,t){return Cr(e,t instanceof A?t:new A(t.message,"ULW_LOOP_ERROR"))}(t,n instanceof Error?n:Error("ULW_LOOP_ERROR"));return r(t,a)}},a={dispatch:async e=>{if(!function(e){return Lr.operations.some(t=>t.name===e.operation)}(e))return Cr(e.operation,new A(`Unknown operation: ${e.operation}`,"ULW_LOOP_OPERATION_UNKNOWN"));switch(e.operation){case"help":return a.help();case"create-goals":return a.createGoals(e.args);case"status":return a.status();case"complete-goals":return a.completeGoals(e.args);case"checkpoint":return a.checkpoint(e.args);case"steer":return a.steer(e.args);case"add-goal":return a.addGoal(e.args);case"criteria":return a.criteria(e.args);case"record-evidence":return a.recordEvidence(e.args);case"record-review-blockers":return a.recordReviewBlockers(e.args);default:return function(e){throw new A(`Unhandled operation: ${String(e)}`,"ULW_LOOP_OPERATION_UNHANDLED")}(e)}},help:()=>n("help",async()=>Lr),createGoals:t=>n("create-goals",()=>Vi(e.cwd,t,i,e.surface)),status:()=>n("status",async()=>{let t=await lt(e.cwd,i),r=t.goals.find(e=>e.id===t.activeGoalId);return{plan:t,summary:zi(t),nextActions:Yi(t,e.surface),evidenceRoot:G(i),...void 0===r||2!==t.evidenceLayoutVersion?{}:{currentAttemptDir:T(r.id,r.attempt,i)}}}),completeGoals:(t={})=>n("complete-goals",()=>async function(e,t={},i){return st(e,i,async()=>{let r=await lt(e,i),n=E();if("complete"===r.aggregateCompletion?.status)return{done:!0,plan:r};let a=r.goals.find(e=>"in_progress"===e.status&&Bi(e));if(a)return{plan:r,goal:a,resumed:!0};let o=[],s=r.goals.find(e=>"pending"===e.status&&Bi(e));return!s&&t.retryFailed&&(s=r.goals.find(e=>"failed"===e.status&&!e.nonRetriable&&Bi(e)),s&&o.push({at:n,kind:"goal_retried",goalId:s.id,status:"pending",...s.failureReason?{message:s.failureReason}:{}})),s?(s.status="in_progress",s.attempt+=1,s.startedAt=n,function(e){for(let t of["blockedReason","blockerSignature","blockerOccurrenceCount","requiredExternalDecision","nonRetriable","failedAt","failureReason"])delete e[t]}(s),s.updatedAt=n,r.activeGoalId=s.id,r.updatedAt=n,o.push({at:n,kind:"goal_started",goalId:s.id,status:s.status,message:`Attempt ${s.attempt}`}),await ft(e,i,{plan:r,entries:o}),{plan:r,goal:s,resumed:!1}):{done:!0,plan:r}})}(e.cwd,t,i)),checkpoint:t=>n("checkpoint",()=>!0===t.printTemplate?async function(e,t,i,r){let n=await lt(e,t),a=r?.surface??ai(),o=i??n.activeGoalId,s=n.goals.find(e=>e.id===o);if(void 0!==i&&void 0===s)throw new A(`Unknown ulw-loop id: ${i}.`,"ULW_LOOP_GOAL_NOT_FOUND",{details:{goalId:i}});let c=2===n.evidenceLayoutVersion&&void 0!==s,l=c?T(s.id,s.attempt,t):".omo/evidence",d=["codex-goal-json requires goal.objective to equal the plan's codexObjective verbatim; do not paraphrase it.","Fill every <replace:...> value with plausible non-empty evidence and use real, non-empty artifact files.",'Passing codex-goal-json example: {"goal":{"objective":"<plan codexObjective verbatim>","status":"complete"}}.','Passing quality-gate-json example requires gateReview {"by":"category:deep-high","recommendation":"APPROVE","evidence":"review passed","reportPath":"<attemptDir>/gate-review.md","blockers":[],"notes":[]}, manualQa.artifactRefs objects, iteration, and criteriaCoverage.',..."lazycodex"===a?["Self-review defaults: manualQa.by and gateReview.by are main-session. Alternatives: manualQa.by accepts lazycodex-qa-executor; gateReview.by accepts lazycodex-gate-reviewer, category:deep-high, category:deep-low, category:unspecified-high, or category:unspecified-low. Optional codeReview.by accepts lazycodex-code-reviewer or main-session."]:[],...c?[]:["This plan is evidence-layout v1; artifacts go under .omo/evidence/."]].join(" ");return{qualityGateTemplate:Ci(a,l),codexGoalTemplate:{goal:{objective:n.codexObjective??"<replace:codex objective>",status:"complete"}},guidance:d,...c?{attemptDir:l}:{}}}(e.cwd,i,t.goalId,{surface:e.surface}):Pr(e,i,t)),steer:t=>n("steer",()=>$r(e.cwd,t,i,e.surface)),addGoal:t=>n("add-goal",()=>Fi(e.cwd,t,i,e.surface)),criteria:t=>n("criteria",async()=>{let r=(await lt(e.cwd,i)).goals.find(e=>e.id===t.goalId);if(void 0===r)throw new A(`Unknown ulw-loop id: ${t.goalId}.`,"ULW_LOOP_GOAL_NOT_FOUND");return{goalId:r.id,criteria:r.successCriteria}}),recordEvidence:t=>n("record-evidence",()=>ht(e.cwd,t,i)),recordReviewBlockers:t=>n("record-review-blockers",()=>async function(e,t,i){return st(e,i,async()=>{let r=await lt(e,i),n=r.goals.find(e=>e.id===t.goalId);void 0===n&&Ki(`Unknown ulw-loop id: ${t.goalId}`,"ulw_loop_goal_not_found"),"in_progress"!==n.status&&Ki(`${n.id} is ${n.status}.`,"ulw_loop_goal_not_in_progress"),V(r,n)||Ki(`${n.id} is not final.`,"ulw_loop_not_final_story");let a=await u(t.codexGoalJson,e),o=p(a,{expectedObjective:z(r,n),acceptedObjectives:H(r),acknowledgedObjectives:v(r)});if(!o.ok)throw new s(f(o));m(r,o.unacknowledgedObjective);let c=E();for(let e of Hi)Reflect.deleteProperty(n,e);n.status="review_blocked",n.reviewBlockedAt=c,n.evidence=t.evidence,n.updatedAt=c,r.activeGoalId===n.id&&delete r.activeGoalId;let l=Xi(r,t,c);r.updatedAt=c;let d=a?.raw,g={at:c,kind:"goal_review_blocked",goalId:n.id,status:n.status,evidence:t.evidence,codexGoal:d},h={at:c,kind:"goal_added",goalId:l.id,status:l.status,evidence:t.evidence,message:l.title},w={at:c,kind:"goal_review_blocked",goalId:n.id,status:n.status,evidence:t.evidence,codexGoal:d,message:`Review blockers recorded; appended ${l.id}.`};Reflect.set(w,"kind","blocker_recorded");let b=[g,h,w];return await ft(e,i,{plan:r,entries:b}),{plan:r,blockedGoal:n,newGoal:l,ledgerEntries:b,nextActions:o.nextActions,warnings:o.warnings}})}(e.cwd,t,i))};return a}import{readFileSync as Tr}from"node:fs";function Ur(e){return"object"==typeof e&&null!==e&&!Array.isArray(e)}function Dr(e){let t=[];for(let i of e)try{let e=JSON.parse(Tr(i,"utf8"));if(!Ur(e)||1!==e.version){t.push(`Unsupported driver goal store: ${i}`);continue}if(null===e.goal)return{codexGoalJson:void 0,warnings:t};if(Ur(e.goal))return{codexGoalJson:JSON.stringify({goal:e.goal}),warnings:t};t.push(`Invalid driver goal: ${i}`)}catch(e){if(e instanceof Error&&"code"in e&&"ENOENT"===e.code)continue;t.push(`Cannot read driver goal ${i}: ${e instanceof Error?e.message:String(e)}`)}return{codexGoalJson:void 0,warnings:t}}function Mr(e){let t=e.goals.find(t=>t.id===e.activeGoalId),i="aggregate"===W(e)?H(e):void 0===t?[]:[t.objective];return new Set(i.map(g).filter(Boolean))}import{dirname as Wr,isAbsolute as qr,join as Qr}from"node:path";import{closeSync as Jr,openSync as Br,readSync as Vr}from"node:fs";function Fr(e){let t,i,r=e?.trim();if(!r)return{problem:"PI_SESSION_FILE is unset"};try{t=function(e){let t=Br(e,"r");try{let e=Buffer.alloc(65536),i=Vr(t,e,0,65536,0),r=e.subarray(0,i).toString("utf8"),n=r.indexOf("\n");return-1===n?r:r.slice(0,n)}finally{Jr(t)}}(r)}catch(e){return{problem:`PI_SESSION_FILE is unreadable (${e instanceof Error&&"code"in e&&"string"==typeof e.code?e.code:"unreadable"})`}}try{i=JSON.parse(t)}catch{return{problem:"PI_SESSION_FILE does not start with a JSON session header"}}if("object"!=typeof i||null===i||Array.isArray(i))return{problem:"PI_SESSION_FILE header is not an object"};let n="cwd"in i&&"string"==typeof i.cwd?i.cwd.trim():"";return n?{cwd:n}:{problem:"PI_SESSION_FILE header records no cwd"}}var zr='env("PI_SESSION_CWD", "<session cwd>")';function Hr(e=process.env,t=()=>process.cwd()){let i=e.PI_SESSION_ID;if(!i?.trim())throw new A("PI_SESSION_ID is required.","ULW_LOOP_SESSION_ID_REQUIRED");let r=$(i);if(null===r)throw new A("PI_SESSION_ID is invalid.","ULW_LOOP_SESSION_ID_INVALID");let n=[],{cwd:a,source:o}=function(e,t,i){let r=e.PI_SESSION_CWD?.trim();if(r)return{cwd:r,source:"PI_SESSION_CWD"};let n,a=Fr(e.PI_SESSION_FILE);if("cwd"in a)return i.push(`PI_SESSION_CWD is unset; bound the session cwd recorded in PI_SESSION_FILE (${a.cwd}). Re-pin it with env("PI_SESSION_CWD", "${a.cwd}") to silence this warning.`),{cwd:a.cwd,source:"PI_SESSION_FILE"};try{n=t().trim()}catch(e){throw new A(`PI_SESSION_CWD is required: ${a.problem}, and process.cwd() failed (${e instanceof Error?e.message:String(e)}). Set ${zr} in the kernel or restart the session.`,"ULW_LOOP_CWD_REQUIRED")}if(!n)throw new A(`PI_SESSION_CWD is required: ${a.problem}, and process.cwd() is empty. Set ${zr} in the kernel or restart the session.`,"ULW_LOOP_CWD_REQUIRED");return i.push(`PI_SESSION_CWD is unset and ${a.problem}; bound process.cwd() (${n}), which can differ from the session cwd on a shared host. Set ${zr} to bind the session explicitly.`),{cwd:n,source:"process.cwd"}}(e,t,n),s=function(e,t,i,r){let n=[],a=e.PI_GOAL_STORE_FILE,o=`${encodeURIComponent(t)}.json`;if(a&&qr(a))n.push(a);else{a&&r.push("Ignoring relative PI_GOAL_STORE_FILE.");let t=e.PI_SESSION_FILE?.trim();t&&qr(t)&&n.push(Qr(Wr(t),"extensions","goal",o))}return n.push(Qr(i,".omo","goal",o)),[...new Set(n)]}(e,i,a,n);return{cwd:a,cwdSource:o,sessionId:r,rawSessionId:i,surface:"omo-senpi",goalStorePaths:s,warnings:n}}var Kr={import:'const { agentToolkit } = await import(`${env("OMO_AGENT_TOOLKIT_SDK_ROOT")}/sdk.js`)',example:'print(await agentToolkit.status()); await agentToolkit.recordEvidence({ goalId: "G001", criterionId: "C001", status: "pass", evidence: "<observable proof>", artifacts: ["<existing path>"] })',sessionEnv:["PI_SESSION_ID","PI_SESSION_CWD","PI_SESSION_FILE","PI_GOAL_STORE_FILE"]};function Xr(e,t){if(0===t.length)return e;let i="warnings"in e&&Array.isArray(e.warnings)?e.warnings:[];return{...e,warnings:[...i,...t]}}async function Yr(e,t){let i=[];try{let e=Hr(process.env);i.push(...e.warnings);let r=Gr(e);return Xr(await t(r,e,i),i)}catch(t){return Xr(function(e,t){return{ok:!1,operation:e,error:{code:t instanceof A?t.code:"ULW_LOOP_ERROR",message:t instanceof Error?t.message:String(t)}}}(e,t),i)}}function Zr(e,t,i){if(void 0!==e)return e;let r=Dr(t.goalStorePaths);return i.push(...r.warnings),r.codexGoalJson}function en(e){return{cwd:e.cwd,cwdSource:e.cwdSource,sessionId:e.rawSessionId,goalStorePaths:e.goalStorePaths}}var tn={help:()=>Yr("help",async e=>{let t=await e.help();return t.ok?{...t,result:{...t.result,usage:Kr}}:t}),status:()=>Yr("status",async(e,t,i)=>{let r=await e.status();if(!r.ok)return r;let n=function(e,t,i){let r=Dr(t);if(i.push(...r.warnings),void 0===r.codexGoalJson)return{available:!1};let n=d(JSON.parse(r.codexGoalJson));if(!n.available)return{available:!1};let a=g(n.objective??"");return{available:!0,status:n.status??"unknown",objectiveMatchesPlan:""===a||Mr(e).has(a),objectiveAcknowledged:v(e).includes(a)}}(r.result.plan,t.goalStorePaths,i);return{...r,result:{...r.result,binding:en(t),driver:n}}}),createGoals:e=>Yr("create-goals",t=>t.createGoals(e)),completeGoals:e=>Yr("complete-goals",t=>t.completeGoals(e)),criteria:e=>Yr("criteria",t=>t.criteria(e)),recordEvidence:e=>Yr("record-evidence",t=>t.recordEvidence(e)),addGoal:e=>Yr("add-goal",t=>t.addGoal(e)),steer:e=>Yr("steer",t=>t.steer(e)),checkpoint:e=>Yr("checkpoint",(t,i,r)=>{if(!0===e.printTemplate)return t.checkpoint(e);let n=Zr(e.codexGoalJson,i,r);return t.checkpoint({...e,...void 0===n?{}:{codexGoalJson:n}})}),recordReviewBlockers:e=>Yr("record-review-blockers",(t,i,r)=>{let n=Zr(e.codexGoalJson,i,r);if(void 0===n)throw new A("A driver goal snapshot is required.","ULW_LOOP_ARGUMENT_MISSING");return t.recordReviewBlockers({...e,codexGoalJson:n})}),dispatch:e=>{if(function(e){return jr.some(t=>t===e.operation)}(e)){if("help"===e.operation)return tn.help();if("status"===e.operation)return tn.status();if("checkpoint"===e.operation)return tn.checkpoint(e.args);if("record-review-blockers"===e.operation)return tn.recordReviewBlockers(e.args)}return Yr(e.operation,t=>t.dispatch(e))}},rn="5.1.4";export{rn as SDK_VERSION,Lr as ULW_LOOP_MANIFEST,jr as ULW_LOOP_OPERATIONS,tn as agentToolkit,Gr as createAgentToolkit,Hr as toolkitContextFromEnv};
|