@zaip-ai/cli 1.0.2 → 1.0.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/README.md +4 -2
- package/dist/commands/init.d.ts +1 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +4 -1
- package/dist/commands/init.js.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/services/adapters.d.ts +1 -7
- package/dist/services/adapters.d.ts.map +1 -1
- package/dist/services/adapters.js +2 -7
- package/dist/services/adapters.js.map +1 -1
- package/dist/services/agent-adapters.js +1 -1
- package/dist/services/agent-adapters.js.map +1 -1
- package/dist/services/global-codex-config.d.ts +6 -1
- package/dist/services/global-codex-config.d.ts.map +1 -1
- package/dist/services/global-codex-config.js +48 -2
- package/dist/services/global-codex-config.js.map +1 -1
- package/dist/services/global-codex-config.test.js +9 -0
- package/dist/services/global-codex-config.test.js.map +1 -1
- package/dist/services/install-agents-template.d.ts.map +1 -1
- package/dist/services/install-agents-template.js +10 -2
- package/dist/services/install-agents-template.js.map +1 -1
- package/dist/services/logger.test.js +1 -0
- package/dist/services/logger.test.js.map +1 -1
- package/dist/services/runtime-template.test.js +5 -5
- package/dist/types.d.ts +1 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +2 -2
- package/templates/.agents/config/agents/catalog.yaml +4 -4
- package/templates/.agents/dashboard/.zaip-managed.json +4 -4
- package/templates/.agents/dashboard/apps/frontend/dist/assets/{index-BOLwg8VW.js → index-ehU9Etwm.js} +214 -16
- package/templates/.agents/dashboard/apps/frontend/dist/index.html +1 -1
- package/templates/.agents/dashboard/packages/local-runtime/server.mjs +26 -6
- package/templates/.agents/requirements/autonomous-assurance.md +1 -1
- package/templates/.agents/requirements/context-engine.md +1 -1
- package/templates/.agents/requirements/cost-observability.md +1 -1
- package/templates/.agents/requirements/design-system.md +1 -1
- package/templates/.agents/requirements/execution-engine.md +1 -1
- package/templates/.agents/requirements/kanban-dashboard.md +1 -1
- package/templates/.agents/requirements/model-orchestration.md +2 -2
- package/templates/.agents/requirements/public-distribution.md +1 -1
- package/templates/.agents/requirements/software-architecture.md +1 -1
- package/templates/.agents/requirements/work-lifecycle.md +3 -3
- package/templates/.agents/rules/zaip/core.md +1 -1
- package/templates/.agents/rules/zaip/workflow.md +1 -1
- package/templates/.agents/skills/zaip-aios/SKILL.md +9 -0
- package/templates/.agents/skills/zaip-skill-execution/SKILL.md +1 -1
- package/templates/.agents/skills/zaip-skill-task/SKILL.md +1 -1
- package/templates/.agents/zaip-aios/guides/06-execucao.md +1 -1
- package/templates/.agents/zaip-aios/guides/16-lifecycle-e-reconciliacao.md +1 -1
- package/templates/.zaip-aios/bin/zaip.mjs +9 -8
- package/templates/.zaip-aios/checksums.sha256 +16 -15
- package/templates/.zaip-aios/dashboard/.zaip-managed.json +4 -4
- package/templates/.zaip-aios/dashboard/apps/frontend/dist/assets/{index-BOLwg8VW.js → index-ehU9Etwm.js} +214 -16
- package/templates/.zaip-aios/dashboard/apps/frontend/dist/index.html +1 -1
- package/templates/.zaip-aios/dashboard/packages/local-runtime/server.mjs +26 -6
- package/templates/.zaip-aios/manifest.json +2 -1
- package/templates/.zaip-aios/templates/config/agents/catalog.yaml +4 -4
- package/templates/.zaip-aios/templates/requirements/model-orchestration.md +1 -1
- package/templates/.zaip-aios/templates/requirements/work-lifecycle.md +2 -2
- package/templates/.zaip-aios/templates/rules/zaip/core.md +1 -1
- package/templates/.zaip-aios/templates/rules/zaip/workflow.md +1 -1
- package/templates/.zaip-aios/templates/skills/zaip-aios/SKILL.md +9 -0
- package/templates/.zaip-aios/templates/skills/zaip-skill-execution/SKILL.md +1 -1
- package/templates/.zaip-aios/templates/skills/zaip-skill-task/SKILL.md +1 -1
- package/templates/.zaip-aios/templates/zaip-aios/guides/06-execucao.md +1 -1
- package/templates/.zaip-aios/templates/zaip-aios/guides/16-lifecycle-e-reconciliacao.md +1 -1
- package/templates/template-manifest.json +52 -43
|
@@ -24,7 +24,7 @@ ${pointer}
|
|
|
24
24
|
${comment}`:comment}else if(afterEmptyLine||doc.directives.docStart||!dc){doc.commentBefore=comment}else if(identity.isCollection(dc)&&!dc.flow&&dc.items.length>0){let it=dc.items[0];if(identity.isPair(it))it=it.key;const cb=it.commentBefore;it.commentBefore=cb?`${comment}
|
|
25
25
|
${cb}`:comment}else{const cb=dc.commentBefore;dc.commentBefore=cb?`${comment}
|
|
26
26
|
${cb}`:comment}}if(afterDoc){for(let i=0;i<this.errors.length;++i)doc.errors.push(this.errors[i]);for(let i=0;i<this.warnings.length;++i)doc.warnings.push(this.warnings[i])}else{doc.errors=this.errors;doc.warnings=this.warnings}this.prelude=[];this.errors=[];this.warnings=[]}streamInfo(){return{comment:parsePrelude(this.prelude).comment,directives:this.directives,errors:this.errors,warnings:this.warnings}}*compose(tokens,forceDoc=false,endOffset=-1){for(const token of tokens)yield*this.next(token);yield*this.end(forceDoc,endOffset)}*next(token){if(node_process.env.LOG_STREAM)console.dir(token,{depth:null});switch(token.type){case"directive":this.directives.add(token.source,(offset,message,warning)=>{const pos=getErrorPos(token);pos[0]+=offset;this.onError(pos,"BAD_DIRECTIVE",message,warning)});this.prelude.push(token.source);this.atDirectives=true;break;case"document":{const doc=composeDoc.composeDoc(this.options,this.directives,token,this.onError);if(this.atDirectives&&!doc.directives.docStart)this.onError(token,"MISSING_CHAR","Missing directives-end/doc-start indicator line");this.decorate(doc,false);if(this.doc)yield this.doc;this.doc=doc;this.atDirectives=false;break}case"byte-order-mark":case"space":break;case"comment":case"newline":this.prelude.push(token.source);break;case"error":{const msg=token.source?`${token.message}: ${JSON.stringify(token.source)}`:token.message;const error51=new errors.YAMLParseError(getErrorPos(token),"UNEXPECTED_TOKEN",msg);if(this.atDirectives||!this.doc)this.errors.push(error51);else this.doc.errors.push(error51);break}case"doc-end":{if(!this.doc){const msg="Unexpected doc-end without preceding document";this.errors.push(new errors.YAMLParseError(getErrorPos(token),"UNEXPECTED_TOKEN",msg));break}this.doc.directives.docEnd=true;const end=resolveEnd.resolveEnd(token.end,token.offset+token.source.length,this.doc.options.strict,this.onError);this.decorate(this.doc,true);if(end.comment){const dc=this.doc.comment;this.doc.comment=dc?`${dc}
|
|
27
|
-
${end.comment}`:end.comment}this.doc.range[2]=end.offset;break}default:this.errors.push(new errors.YAMLParseError(getErrorPos(token),"UNEXPECTED_TOKEN",`Unsupported token ${token.type}`))}}*end(forceDoc=false,endOffset=-1){if(this.doc){this.decorate(this.doc,true);yield this.doc;this.doc=null}else if(forceDoc){const opts=Object.assign({_directives:this.directives},this.options);const doc=new Document.Document(void 0,opts);if(this.atDirectives)this.onError(endOffset,"MISSING_CHAR","Missing directives-end indicator line");doc.range=[0,endOffset,endOffset];this.decorate(doc,false);yield doc}}};exports.Composer=Composer}});var require_cst_scalar=__commonJS({"../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/parse/cst-scalar.js"(exports){"use strict";var resolveBlockScalar=require_resolve_block_scalar();var resolveFlowScalar=require_resolve_flow_scalar();var errors=require_errors();var stringifyString=require_stringifyString();function resolveAsScalar(token,strict=true,onError){if(token){const _onError=(pos,code,message)=>{const offset=typeof pos==="number"?pos:Array.isArray(pos)?pos[0]:pos.offset;if(onError)onError(offset,code,message);else throw new errors.YAMLParseError([offset,offset+1],code,message)};switch(token.type){case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":return resolveFlowScalar.resolveFlowScalar(token,strict,_onError);case"block-scalar":return resolveBlockScalar.resolveBlockScalar({options:{strict}},token,_onError)}}return null}function createScalarToken(value,context){const{implicitKey=false,indent,inFlow=false,offset=-1,type="PLAIN"}=context;const source=stringifyString.stringifyString({type,value},{implicitKey,indent:indent>0?" ".repeat(indent):"",inFlow,options:{blockQuote:true,lineWidth:-1}});const end=context.end??[{type:"newline",offset:-1,indent,source:"\n"}];switch(source[0]){case"|":case">":{const he=source.indexOf("\n");const head=source.substring(0,he);const body=source.substring(he+1)+"\n";const props=[{type:"block-scalar-header",offset,indent,source:head}];if(!addEndtoBlockProps(props,end))props.push({type:"newline",offset:-1,indent,source:"\n"});return{type:"block-scalar",offset,indent,props,source:body}}case'"':return{type:"double-quoted-scalar",offset,indent,source,end};case"'":return{type:"single-quoted-scalar",offset,indent,source,end};default:return{type:"scalar",offset,indent,source,end}}}function setScalarValue(token,value,context={}){let{afterKey=false,implicitKey=false,inFlow=false,type}=context;let indent="indent"in token?token.indent:null;if(afterKey&&typeof indent==="number")indent+=2;if(!type)switch(token.type){case"single-quoted-scalar":type="QUOTE_SINGLE";break;case"double-quoted-scalar":type="QUOTE_DOUBLE";break;case"block-scalar":{const header=token.props[0];if(header.type!=="block-scalar-header")throw new Error("Invalid block scalar header");type=header.source[0]===">"?"BLOCK_FOLDED":"BLOCK_LITERAL";break}default:type="PLAIN"}const source=stringifyString.stringifyString({type,value},{implicitKey:implicitKey||indent===null,indent:indent!==null&&indent>0?" ".repeat(indent):"",inFlow,options:{blockQuote:true,lineWidth:-1}});switch(source[0]){case"|":case">":setBlockScalarValue(token,source);break;case'"':setFlowScalarValue(token,source,"double-quoted-scalar");break;case"'":setFlowScalarValue(token,source,"single-quoted-scalar");break;default:setFlowScalarValue(token,source,"scalar")}}function setBlockScalarValue(token,source){const he=source.indexOf("\n");const head=source.substring(0,he);const body=source.substring(he+1)+"\n";if(token.type==="block-scalar"){const header=token.props[0];if(header.type!=="block-scalar-header")throw new Error("Invalid block scalar header");header.source=head;token.source=body}else{const{offset}=token;const indent="indent"in token?token.indent:-1;const props=[{type:"block-scalar-header",offset,indent,source:head}];if(!addEndtoBlockProps(props,"end"in token?token.end:void 0))props.push({type:"newline",offset:-1,indent,source:"\n"});for(const key of Object.keys(token))if(key!=="type"&&key!=="offset")delete token[key];Object.assign(token,{type:"block-scalar",indent,props,source:body})}}function addEndtoBlockProps(props,end){if(end)for(const st of end)switch(st.type){case"space":case"comment":props.push(st);break;case"newline":props.push(st);return true}return false}function setFlowScalarValue(token,source,type){switch(token.type){case"scalar":case"double-quoted-scalar":case"single-quoted-scalar":token.type=type;token.source=source;break;case"block-scalar":{const end=token.props.slice(1);let oa=source.length;if(token.props[0].type==="block-scalar-header")oa-=token.props[0].source.length;for(const tok of end)tok.offset+=oa;delete token.props;Object.assign(token,{type,source,end});break}case"block-map":case"block-seq":{const offset=token.offset+source.length;const nl={type:"newline",offset,indent:token.indent,source:"\n"};delete token.items;Object.assign(token,{type,source,end:[nl]});break}default:{const indent="indent"in token?token.indent:-1;const end="end"in token&&Array.isArray(token.end)?token.end.filter(st=>st.type==="space"||st.type==="comment"||st.type==="newline"):[];for(const key of Object.keys(token))if(key!=="type"&&key!=="offset")delete token[key];Object.assign(token,{type,indent,source,end})}}}exports.createScalarToken=createScalarToken;exports.resolveAsScalar=resolveAsScalar;exports.setScalarValue=setScalarValue}});var require_cst_stringify=__commonJS({"../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/parse/cst-stringify.js"(exports){"use strict";var stringify3=cst=>"type"in cst?stringifyToken(cst):stringifyItem(cst);function stringifyToken(token){switch(token.type){case"block-scalar":{let res="";for(const tok of token.props)res+=stringifyToken(tok);return res+token.source}case"block-map":case"block-seq":{let res="";for(const item of token.items)res+=stringifyItem(item);return res}case"flow-collection":{let res=token.start.source;for(const item of token.items)res+=stringifyItem(item);for(const st of token.end)res+=st.source;return res}case"document":{let res=stringifyItem(token);if(token.end)for(const st of token.end)res+=st.source;return res}default:{let res=token.source;if("end"in token&&token.end)for(const st of token.end)res+=st.source;return res}}}function stringifyItem({start,key,sep:sep3,value}){let res="";for(const st of start)res+=st.source;if(key)res+=stringifyToken(key);if(sep3)for(const st of sep3)res+=st.source;if(value)res+=stringifyToken(value);return res}exports.stringify=stringify3}});var require_cst_visit=__commonJS({"../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/parse/cst-visit.js"(exports){"use strict";var BREAK=Symbol("break visit");var SKIP=Symbol("skip children");var REMOVE=Symbol("remove item");function visit(cst,visitor){if("type"in cst&&cst.type==="document")cst={start:cst.start,value:cst.value};_visit(Object.freeze([]),cst,visitor)}visit.BREAK=BREAK;visit.SKIP=SKIP;visit.REMOVE=REMOVE;visit.itemAtPath=(cst,path)=>{let item=cst;for(const[field,index]of path){const tok=item?.[field];if(tok&&"items"in tok){item=tok.items[index]}else return void 0}return item};visit.parentCollection=(cst,path)=>{const parent=visit.itemAtPath(cst,path.slice(0,-1));const field=path[path.length-1][0];const coll=parent?.[field];if(coll&&"items"in coll)return coll;throw new Error("Parent collection not found")};function _visit(path,item,visitor){let ctrl=visitor(item,path);if(typeof ctrl==="symbol")return ctrl;for(const field of["key","value"]){const token=item[field];if(token&&"items"in token){for(let i=0;i<token.items.length;++i){const ci=_visit(Object.freeze(path.concat([[field,i]])),token.items[i],visitor);if(typeof ci==="number")i=ci-1;else if(ci===BREAK)return BREAK;else if(ci===REMOVE){token.items.splice(i,1);i-=1}}if(typeof ctrl==="function"&&field==="key")ctrl=ctrl(item,path)}}return typeof ctrl==="function"?ctrl(item,path):ctrl}exports.visit=visit}});var require_cst=__commonJS({"../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/parse/cst.js"(exports){"use strict";var cstScalar=require_cst_scalar();var cstStringify=require_cst_stringify();var cstVisit=require_cst_visit();var BOM="\uFEFF";var DOCUMENT="";var FLOW_END="";var SCALAR="";var isCollection=token=>!!token&&"items"in token;var isScalar=token=>!!token&&(token.type==="scalar"||token.type==="single-quoted-scalar"||token.type==="double-quoted-scalar"||token.type==="block-scalar");function prettyToken(token){switch(token){case BOM:return"<BOM>";case DOCUMENT:return"<DOC>";case FLOW_END:return"<FLOW_END>";case SCALAR:return"<SCALAR>";default:return JSON.stringify(token)}}function tokenType(source){switch(source){case BOM:return"byte-order-mark";case DOCUMENT:return"doc-mode";case FLOW_END:return"flow-error-end";case SCALAR:return"scalar";case"---":return"doc-start";case"...":return"doc-end";case"":case"\n":case"\r\n":return"newline";case"-":return"seq-item-ind";case"?":return"explicit-key-ind";case":":return"map-value-ind";case"{":return"flow-map-start";case"}":return"flow-map-end";case"[":return"flow-seq-start";case"]":return"flow-seq-end";case",":return"comma"}switch(source[0]){case" ":case" ":return"space";case"#":return"comment";case"%":return"directive-line";case"*":return"alias";case"&":return"anchor";case"!":return"tag";case"'":return"single-quoted-scalar";case'"':return"double-quoted-scalar";case"|":case">":return"block-scalar-header"}return null}exports.createScalarToken=cstScalar.createScalarToken;exports.resolveAsScalar=cstScalar.resolveAsScalar;exports.setScalarValue=cstScalar.setScalarValue;exports.stringify=cstStringify.stringify;exports.visit=cstVisit.visit;exports.BOM=BOM;exports.DOCUMENT=DOCUMENT;exports.FLOW_END=FLOW_END;exports.SCALAR=SCALAR;exports.isCollection=isCollection;exports.isScalar=isScalar;exports.prettyToken=prettyToken;exports.tokenType=tokenType}});var require_lexer=__commonJS({"../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/parse/lexer.js"(exports){"use strict";var cst=require_cst();function isEmpty(ch){switch(ch){case void 0:case" ":case"\n":case"\r":case" ":return true;default:return false}}var hexDigits=new Set("0123456789ABCDEFabcdef");var tagChars=new Set("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-#;/?:@&=+$_.!~*'()");var flowIndicatorChars=new Set(",[]{}");var invalidAnchorChars=new Set(" ,[]{}\n\r ");var isNotAnchorChar=ch=>!ch||invalidAnchorChars.has(ch);var Lexer=class{constructor(){this.atEnd=false;this.blockScalarIndent=-1;this.blockScalarKeep=false;this.buffer="";this.flowKey=false;this.flowLevel=0;this.indentNext=0;this.indentValue=0;this.lineEndPos=null;this.next=null;this.pos=0}*lex(source,incomplete=false){if(source){if(typeof source!=="string")throw TypeError("source is not a string");this.buffer=this.buffer?this.buffer+source:source;this.lineEndPos=null}this.atEnd=!incomplete;let next=this.next??"stream";while(next&&(incomplete||this.hasChars(1)))next=yield*this.parseNext(next)}atLineEnd(){let i=this.pos;let ch=this.buffer[i];while(ch===" "||ch===" ")ch=this.buffer[++i];if(!ch||ch==="#"||ch==="\n")return true;if(ch==="\r")return this.buffer[i+1]==="\n";return false}charAt(n){return this.buffer[this.pos+n]}continueScalar(offset){let ch=this.buffer[offset];if(this.indentNext>0){let indent=0;while(ch===" ")ch=this.buffer[++indent+offset];if(ch==="\r"){const next=this.buffer[indent+offset+1];if(next==="\n"||!next&&!this.atEnd)return offset+indent+1}return ch==="\n"||indent>=this.indentNext||!ch&&!this.atEnd?offset+indent:-1}if(ch==="-"||ch==="."){const dt=this.buffer.substr(offset,3);if((dt==="---"||dt==="...")&&isEmpty(this.buffer[offset+3]))return-1}return offset}getLine(){let end=this.lineEndPos;if(typeof end!=="number"||end!==-1&&end<this.pos){end=this.buffer.indexOf("\n",this.pos);this.lineEndPos=end}if(end===-1)return this.atEnd?this.buffer.substring(this.pos):null;if(this.buffer[end-1]==="\r")end-=1;return this.buffer.substring(this.pos,end)}hasChars(n){return this.pos+n<=this.buffer.length}setNext(state){this.buffer=this.buffer.substring(this.pos);this.pos=0;this.lineEndPos=null;this.next=state;return null}peek(n){return this.buffer.substr(this.pos,n)}*parseNext(next){switch(next){case"stream":return yield*this.parseStream();case"line-start":return yield*this.parseLineStart();case"block-start":return yield*this.parseBlockStart();case"doc":return yield*this.parseDocument();case"flow":return yield*this.parseFlowCollection();case"quoted-scalar":return yield*this.parseQuotedScalar();case"block-scalar":return yield*this.parseBlockScalar();case"plain-scalar":return yield*this.parsePlainScalar()}}*parseStream(){let line=this.getLine();if(line===null)return this.setNext("stream");if(line[0]===cst.BOM){yield*this.pushCount(1);line=line.substring(1)}if(line[0]==="%"){let dirEnd=line.length;let cs=line.indexOf("#");while(cs!==-1){const ch=line[cs-1];if(ch===" "||ch===" "){dirEnd=cs-1;break}else{cs=line.indexOf("#",cs+1)}}while(true){const ch=line[dirEnd-1];if(ch===" "||ch===" ")dirEnd-=1;else break}const n=(yield*this.pushCount(dirEnd))+(yield*this.pushSpaces(true));yield*this.pushCount(line.length-n);this.pushNewline();return"stream"}if(this.atLineEnd()){const sp=yield*this.pushSpaces(true);yield*this.pushCount(line.length-sp);yield*this.pushNewline();return"stream"}yield cst.DOCUMENT;return yield*this.parseLineStart()}*parseLineStart(){const ch=this.charAt(0);if(!ch&&!this.atEnd)return this.setNext("line-start");if(ch==="-"||ch==="."){if(!this.atEnd&&!this.hasChars(4))return this.setNext("line-start");const s=this.peek(3);if((s==="---"||s==="...")&&isEmpty(this.charAt(3))){yield*this.pushCount(3);this.indentValue=0;this.indentNext=0;return s==="---"?"doc":"stream"}}this.indentValue=yield*this.pushSpaces(false);if(this.indentNext>this.indentValue&&!isEmpty(this.charAt(1)))this.indentNext=this.indentValue;return yield*this.parseBlockStart()}*parseBlockStart(){const[ch0,ch1]=this.peek(2);if(!ch1&&!this.atEnd)return this.setNext("block-start");if((ch0==="-"||ch0==="?"||ch0===":")&&isEmpty(ch1)){const n=(yield*this.pushCount(1))+(yield*this.pushSpaces(true));this.indentNext=this.indentValue+1;this.indentValue+=n;return"block-start"}return"doc"}*parseDocument(){yield*this.pushSpaces(true);const line=this.getLine();if(line===null)return this.setNext("doc");let n=yield*this.pushIndicators();switch(line[n]){case"#":yield*this.pushCount(line.length-n);case void 0:yield*this.pushNewline();return yield*this.parseLineStart();case"{":case"[":yield*this.pushCount(1);this.flowKey=false;this.flowLevel=1;return"flow";case"}":case"]":yield*this.pushCount(1);return"doc";case"*":yield*this.pushUntil(isNotAnchorChar);return"doc";case'"':case"'":return yield*this.parseQuotedScalar();case"|":case">":n+=yield*this.parseBlockScalarHeader();n+=yield*this.pushSpaces(true);yield*this.pushCount(line.length-n);yield*this.pushNewline();return yield*this.parseBlockScalar();default:return yield*this.parsePlainScalar()}}*parseFlowCollection(){let nl,sp;let indent=-1;do{nl=yield*this.pushNewline();if(nl>0){sp=yield*this.pushSpaces(false);this.indentValue=indent=sp}else{sp=0}sp+=yield*this.pushSpaces(true)}while(nl+sp>0);const line=this.getLine();if(line===null)return this.setNext("flow");if(indent!==-1&&indent<this.indentNext&&line[0]!=="#"||indent===0&&(line.startsWith("---")||line.startsWith("..."))&&isEmpty(line[3])){const atFlowEndMarker=indent===this.indentNext-1&&this.flowLevel===1&&(line[0]==="]"||line[0]==="}");if(!atFlowEndMarker){this.flowLevel=0;yield cst.FLOW_END;return yield*this.parseLineStart()}}let n=0;while(line[n]===","){n+=yield*this.pushCount(1);n+=yield*this.pushSpaces(true);this.flowKey=false}n+=yield*this.pushIndicators();switch(line[n]){case void 0:return"flow";case"#":yield*this.pushCount(line.length-n);return"flow";case"{":case"[":yield*this.pushCount(1);this.flowKey=false;this.flowLevel+=1;return"flow";case"}":case"]":yield*this.pushCount(1);this.flowKey=true;this.flowLevel-=1;return this.flowLevel?"flow":"doc";case"*":yield*this.pushUntil(isNotAnchorChar);return"flow";case'"':case"'":this.flowKey=true;return yield*this.parseQuotedScalar();case":":{const next=this.charAt(1);if(this.flowKey||isEmpty(next)||next===","){this.flowKey=false;yield*this.pushCount(1);yield*this.pushSpaces(true);return"flow"}}default:this.flowKey=false;return yield*this.parsePlainScalar()}}*parseQuotedScalar(){const quote=this.charAt(0);let end=this.buffer.indexOf(quote,this.pos+1);if(quote==="'"){while(end!==-1&&this.buffer[end+1]==="'")end=this.buffer.indexOf("'",end+2)}else{while(end!==-1){let n=0;while(this.buffer[end-1-n]==="\\")n+=1;if(n%2===0)break;end=this.buffer.indexOf('"',end+1)}}const qb=this.buffer.substring(0,end);let nl=qb.indexOf("\n",this.pos);if(nl!==-1){while(nl!==-1){const cs=this.continueScalar(nl+1);if(cs===-1)break;nl=qb.indexOf("\n",cs)}if(nl!==-1){end=nl-(qb[nl-1]==="\r"?2:1)}}if(end===-1){if(!this.atEnd)return this.setNext("quoted-scalar");end=this.buffer.length}yield*this.pushToIndex(end+1,false);return this.flowLevel?"flow":"doc"}*parseBlockScalarHeader(){this.blockScalarIndent=-1;this.blockScalarKeep=false;let i=this.pos;while(true){const ch=this.buffer[++i];if(ch==="+")this.blockScalarKeep=true;else if(ch>"0"&&ch<="9")this.blockScalarIndent=Number(ch)-1;else if(ch!=="-")break}return yield*this.pushUntil(ch=>isEmpty(ch)||ch==="#")}*parseBlockScalar(){let nl=this.pos-1;let indent=0;let ch;loop:for(let i2=this.pos;ch=this.buffer[i2];++i2){switch(ch){case" ":indent+=1;break;case"\n":nl=i2;indent=0;break;case"\r":{const next=this.buffer[i2+1];if(!next&&!this.atEnd)return this.setNext("block-scalar");if(next==="\n")break}default:break loop}}if(!ch&&!this.atEnd)return this.setNext("block-scalar");if(indent>=this.indentNext){if(this.blockScalarIndent===-1)this.indentNext=indent;else{this.indentNext=this.blockScalarIndent+(this.indentNext===0?1:this.indentNext)}do{const cs=this.continueScalar(nl+1);if(cs===-1)break;nl=this.buffer.indexOf("\n",cs)}while(nl!==-1);if(nl===-1){if(!this.atEnd)return this.setNext("block-scalar");nl=this.buffer.length}}let i=nl+1;ch=this.buffer[i];while(ch===" ")ch=this.buffer[++i];if(ch===" "){while(ch===" "||ch===" "||ch==="\r"||ch==="\n")ch=this.buffer[++i];nl=i-1}else if(!this.blockScalarKeep){do{let i2=nl-1;let ch2=this.buffer[i2];if(ch2==="\r")ch2=this.buffer[--i2];const lastChar=i2;while(ch2===" ")ch2=this.buffer[--i2];if(ch2==="\n"&&i2>=this.pos&&i2+1+indent>lastChar)nl=i2;else break}while(true)}yield cst.SCALAR;yield*this.pushToIndex(nl+1,true);return yield*this.parseLineStart()}*parsePlainScalar(){const inFlow=this.flowLevel>0;let end=this.pos-1;let i=this.pos-1;let ch;while(ch=this.buffer[++i]){if(ch===":"){const next=this.buffer[i+1];if(isEmpty(next)||inFlow&&flowIndicatorChars.has(next))break;end=i}else if(isEmpty(ch)){let next=this.buffer[i+1];if(ch==="\r"){if(next==="\n"){i+=1;ch="\n";next=this.buffer[i+1]}else end=i}if(next==="#"||inFlow&&flowIndicatorChars.has(next))break;if(ch==="\n"){const cs=this.continueScalar(i+1);if(cs===-1)break;i=Math.max(i,cs-2)}}else{if(inFlow&&flowIndicatorChars.has(ch))break;end=i}}if(!ch&&!this.atEnd)return this.setNext("plain-scalar");yield cst.SCALAR;yield*this.pushToIndex(end+1,true);return inFlow?"flow":"doc"}*pushCount(n){if(n>0){yield this.buffer.substr(this.pos,n);this.pos+=n;return n}return 0}*pushToIndex(i,allowEmpty){const s=this.buffer.slice(this.pos,i);if(s){yield s;this.pos+=s.length;return s.length}else if(allowEmpty)yield"";return 0}*pushIndicators(){let n=0;loop:while(true){switch(this.charAt(0)){case"!":n+=yield*this.pushTag();n+=yield*this.pushSpaces(true);continue loop;case"&":n+=yield*this.pushUntil(isNotAnchorChar);n+=yield*this.pushSpaces(true);continue loop;case"-":case"?":case":":{const inFlow=this.flowLevel>0;const ch1=this.charAt(1);if(isEmpty(ch1)||inFlow&&flowIndicatorChars.has(ch1)){if(!inFlow)this.indentNext=this.indentValue+1;else if(this.flowKey)this.flowKey=false;n+=yield*this.pushCount(1);n+=yield*this.pushSpaces(true);continue loop}}}break loop}return n}*pushTag(){if(this.charAt(1)==="<"){let i=this.pos+2;let ch=this.buffer[i];while(!isEmpty(ch)&&ch!==">")ch=this.buffer[++i];return yield*this.pushToIndex(ch===">"?i+1:i,false)}else{let i=this.pos+1;let ch=this.buffer[i];while(ch){if(tagChars.has(ch))ch=this.buffer[++i];else if(ch==="%"&&hexDigits.has(this.buffer[i+1])&&hexDigits.has(this.buffer[i+2])){ch=this.buffer[i+=3]}else break}return yield*this.pushToIndex(i,false)}}*pushNewline(){const ch=this.buffer[this.pos];if(ch==="\n")return yield*this.pushCount(1);else if(ch==="\r"&&this.charAt(1)==="\n")return yield*this.pushCount(2);else return 0}*pushSpaces(allowTabs){let i=this.pos-1;let ch;do{ch=this.buffer[++i]}while(ch===" "||allowTabs&&ch===" ");const n=i-this.pos;if(n>0){yield this.buffer.substr(this.pos,n);this.pos=i}return n}*pushUntil(test){let i=this.pos;let ch=this.buffer[i];while(!test(ch))ch=this.buffer[++i];return yield*this.pushToIndex(i,false)}};exports.Lexer=Lexer}});var require_line_counter=__commonJS({"../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/parse/line-counter.js"(exports){"use strict";var LineCounter=class{constructor(){this.lineStarts=[];this.addNewLine=offset=>this.lineStarts.push(offset);this.linePos=offset=>{let low=0;let high=this.lineStarts.length;while(low<high){const mid=low+high>>1;if(this.lineStarts[mid]<offset)low=mid+1;else high=mid}if(this.lineStarts[low]===offset)return{line:low+1,col:1};if(low===0)return{line:0,col:offset};const start=this.lineStarts[low-1];return{line:low,col:offset-start+1}}}};exports.LineCounter=LineCounter}});var require_parser=__commonJS({"../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/parse/parser.js"(exports){"use strict";var node_process=__require("process");var cst=require_cst();var lexer=require_lexer();function includesToken(list,type){for(let i=0;i<list.length;++i)if(list[i].type===type)return true;return false}function findNonEmptyIndex(list){for(let i=0;i<list.length;++i){switch(list[i].type){case"space":case"comment":case"newline":break;default:return i}}return-1}function isFlowToken(token){switch(token?.type){case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":case"flow-collection":return true;default:return false}}function getPrevProps(parent){switch(parent.type){case"document":return parent.start;case"block-map":{const it=parent.items[parent.items.length-1];return it.sep??it.start}case"block-seq":return parent.items[parent.items.length-1].start;default:return[]}}function getFirstKeyStartProps(prev){if(prev.length===0)return[];let i=prev.length;loop:while(--i>=0){switch(prev[i].type){case"doc-start":case"explicit-key-ind":case"map-value-ind":case"seq-item-ind":case"newline":break loop}}while(prev[++i]?.type==="space"){}return prev.splice(i,prev.length)}function arrayPushArray(target,source){if(source.length<1e5)Array.prototype.push.apply(target,source);else for(let i=0;i<source.length;++i)target.push(source[i])}function fixFlowSeqItems(fc){if(fc.start.type==="flow-seq-start"){for(const it of fc.items){if(it.sep&&!it.value&&!includesToken(it.start,"explicit-key-ind")&&!includesToken(it.sep,"map-value-ind")){if(it.key)it.value=it.key;delete it.key;if(isFlowToken(it.value)){if(it.value.end)arrayPushArray(it.value.end,it.sep);else it.value.end=it.sep}else arrayPushArray(it.start,it.sep);delete it.sep}}}}var Parser=class{constructor(onNewLine){this.atNewLine=true;this.atScalar=false;this.indent=0;this.offset=0;this.onKeyLine=false;this.stack=[];this.source="";this.type="";this.lexer=new lexer.Lexer;this.onNewLine=onNewLine}*parse(source,incomplete=false){if(this.onNewLine&&this.offset===0)this.onNewLine(0);for(const lexeme of this.lexer.lex(source,incomplete))yield*this.next(lexeme);if(!incomplete)yield*this.end()}*next(source){this.source=source;if(node_process.env.LOG_TOKENS)console.log("|",cst.prettyToken(source));if(this.atScalar){this.atScalar=false;yield*this.step();this.offset+=source.length;return}const type=cst.tokenType(source);if(!type){const message=`Not a YAML token: ${source}`;yield*this.pop({type:"error",offset:this.offset,message,source});this.offset+=source.length}else if(type==="scalar"){this.atNewLine=false;this.atScalar=true;this.type="scalar"}else{this.type=type;yield*this.step();switch(type){case"newline":this.atNewLine=true;this.indent=0;if(this.onNewLine)this.onNewLine(this.offset+source.length);break;case"space":if(this.atNewLine&&source[0]===" ")this.indent+=source.length;break;case"explicit-key-ind":case"map-value-ind":case"seq-item-ind":if(this.atNewLine)this.indent+=source.length;break;case"doc-mode":case"flow-error-end":return;default:this.atNewLine=false}this.offset+=source.length}}*end(){while(this.stack.length>0)yield*this.pop()}get sourceToken(){const st={type:this.type,offset:this.offset,indent:this.indent,source:this.source};return st}*step(){const top=this.peek(1);if(this.type==="doc-end"&&top?.type!=="doc-end"){while(this.stack.length>0)yield*this.pop();this.stack.push({type:"doc-end",offset:this.offset,source:this.source});return}if(!top)return yield*this.stream();switch(top.type){case"document":return yield*this.document(top);case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":return yield*this.scalar(top);case"block-scalar":return yield*this.blockScalar(top);case"block-map":return yield*this.blockMap(top);case"block-seq":return yield*this.blockSequence(top);case"flow-collection":return yield*this.flowCollection(top);case"doc-end":return yield*this.documentEnd(top)}yield*this.pop()}peek(n){return this.stack[this.stack.length-n]}*pop(error51){const token=error51??this.stack.pop();if(!token){const message="Tried to pop an empty stack";yield{type:"error",offset:this.offset,source:"",message}}else if(this.stack.length===0){yield token}else{const top=this.peek(1);if(token.type==="block-scalar"){token.indent="indent"in top?top.indent:0}else if(token.type==="flow-collection"&&top.type==="document"){token.indent=0}if(token.type==="flow-collection")fixFlowSeqItems(token);switch(top.type){case"document":top.value=token;break;case"block-scalar":top.props.push(token);break;case"block-map":{const it=top.items[top.items.length-1];if(it.value){top.items.push({start:[],key:token,sep:[]});this.onKeyLine=true;return}else if(it.sep){it.value=token}else{Object.assign(it,{key:token,sep:[]});this.onKeyLine=!it.explicitKey;return}break}case"block-seq":{const it=top.items[top.items.length-1];if(it.value)top.items.push({start:[],value:token});else it.value=token;break}case"flow-collection":{const it=top.items[top.items.length-1];if(!it||it.value)top.items.push({start:[],key:token,sep:[]});else if(it.sep)it.value=token;else Object.assign(it,{key:token,sep:[]});return}default:yield*this.pop();yield*this.pop(token)}if((top.type==="document"||top.type==="block-map"||top.type==="block-seq")&&(token.type==="block-map"||token.type==="block-seq")){const last=token.items[token.items.length-1];if(last&&!last.sep&&!last.value&&last.start.length>0&&findNonEmptyIndex(last.start)===-1&&(token.indent===0||last.start.every(st=>st.type!=="comment"||st.indent<token.indent))){if(top.type==="document")top.end=last.start;else top.items.push({start:last.start});token.items.splice(-1,1)}}}}*stream(){switch(this.type){case"directive-line":yield{type:"directive",offset:this.offset,source:this.source};return;case"byte-order-mark":case"space":case"comment":case"newline":yield this.sourceToken;return;case"doc-mode":case"doc-start":{const doc={type:"document",offset:this.offset,start:[]};if(this.type==="doc-start")doc.start.push(this.sourceToken);this.stack.push(doc);return}}yield{type:"error",offset:this.offset,message:`Unexpected ${this.type} token in YAML stream`,source:this.source}}*document(doc){if(doc.value)return yield*this.lineEnd(doc);switch(this.type){case"doc-start":{if(findNonEmptyIndex(doc.start)!==-1){yield*this.pop();yield*this.step()}else doc.start.push(this.sourceToken);return}case"anchor":case"tag":case"space":case"comment":case"newline":doc.start.push(this.sourceToken);return}const bv=this.startBlockValue(doc);if(bv)this.stack.push(bv);else{yield{type:"error",offset:this.offset,message:`Unexpected ${this.type} token in YAML document`,source:this.source}}}*scalar(scalar){if(this.type==="map-value-ind"){const prev=getPrevProps(this.peek(2));const start=getFirstKeyStartProps(prev);let sep3;if(scalar.end){sep3=scalar.end;sep3.push(this.sourceToken);delete scalar.end}else sep3=[this.sourceToken];const map2={type:"block-map",offset:scalar.offset,indent:scalar.indent,items:[{start,key:scalar,sep:sep3}]};this.onKeyLine=true;this.stack[this.stack.length-1]=map2}else yield*this.lineEnd(scalar)}*blockScalar(scalar){switch(this.type){case"space":case"comment":case"newline":scalar.props.push(this.sourceToken);return;case"scalar":scalar.source=this.source;this.atNewLine=true;this.indent=0;if(this.onNewLine){let nl=this.source.indexOf("\n")+1;while(nl!==0){this.onNewLine(this.offset+nl);nl=this.source.indexOf("\n",nl)+1}}yield*this.pop();break;default:yield*this.pop();yield*this.step()}}*blockMap(map2){const it=map2.items[map2.items.length-1];switch(this.type){case"newline":this.onKeyLine=false;if(it.value){const end="end"in it.value?it.value.end:void 0;const last=Array.isArray(end)?end[end.length-1]:void 0;if(last?.type==="comment")end?.push(this.sourceToken);else map2.items.push({start:[this.sourceToken]})}else if(it.sep){it.sep.push(this.sourceToken)}else{it.start.push(this.sourceToken)}return;case"space":case"comment":if(it.value){map2.items.push({start:[this.sourceToken]})}else if(it.sep){it.sep.push(this.sourceToken)}else{if(this.atIndentedComment(it.start,map2.indent)){const prev=map2.items[map2.items.length-2];const end=prev?.value?.end;if(Array.isArray(end)){arrayPushArray(end,it.start);end.push(this.sourceToken);map2.items.pop();return}}it.start.push(this.sourceToken)}return}if(this.indent>=map2.indent){const atMapIndent=!this.onKeyLine&&this.indent===map2.indent;const atNextItem=atMapIndent&&(it.sep||it.explicitKey)&&this.type!=="seq-item-ind";let start=[];if(atNextItem&&it.sep&&!it.value){const nl=[];for(let i=0;i<it.sep.length;++i){const st=it.sep[i];switch(st.type){case"newline":nl.push(i);break;case"space":break;case"comment":if(st.indent>map2.indent)nl.length=0;break;default:nl.length=0}}if(nl.length>=2)start=it.sep.splice(nl[1])}switch(this.type){case"anchor":case"tag":if(atNextItem||it.value){start.push(this.sourceToken);map2.items.push({start});this.onKeyLine=true}else if(it.sep){it.sep.push(this.sourceToken)}else{it.start.push(this.sourceToken)}return;case"explicit-key-ind":if(!it.sep&&!it.explicitKey){it.start.push(this.sourceToken);it.explicitKey=true}else if(atNextItem||it.value){start.push(this.sourceToken);map2.items.push({start,explicitKey:true})}else{this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:[this.sourceToken],explicitKey:true}]})}this.onKeyLine=true;return;case"map-value-ind":if(it.explicitKey){if(!it.sep){if(includesToken(it.start,"newline")){Object.assign(it,{key:null,sep:[this.sourceToken]})}else{const start2=getFirstKeyStartProps(it.start);this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:start2,key:null,sep:[this.sourceToken]}]})}}else if(it.value){map2.items.push({start:[],key:null,sep:[this.sourceToken]})}else if(includesToken(it.sep,"map-value-ind")){this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start,key:null,sep:[this.sourceToken]}]})}else if(isFlowToken(it.key)&&!includesToken(it.sep,"newline")){const start2=getFirstKeyStartProps(it.start);const key=it.key;const sep3=it.sep;sep3.push(this.sourceToken);delete it.key;delete it.sep;this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:start2,key,sep:sep3}]})}else if(start.length>0){it.sep=it.sep.concat(start,this.sourceToken)}else{it.sep.push(this.sourceToken)}}else{if(!it.sep){Object.assign(it,{key:null,sep:[this.sourceToken]})}else if(it.value||atNextItem){map2.items.push({start,key:null,sep:[this.sourceToken]})}else if(includesToken(it.sep,"map-value-ind")){this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:[],key:null,sep:[this.sourceToken]}]})}else{it.sep.push(this.sourceToken)}}this.onKeyLine=true;return;case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":{const fs=this.flowScalar(this.type);if(atNextItem||it.value){map2.items.push({start,key:fs,sep:[]});this.onKeyLine=true}else if(it.sep){this.stack.push(fs)}else{Object.assign(it,{key:fs,sep:[]});this.onKeyLine=true}return}default:{const bv=this.startBlockValue(map2);if(bv){if(bv.type==="block-seq"){if(!it.explicitKey&&it.sep&&!includesToken(it.sep,"newline")){yield*this.pop({type:"error",offset:this.offset,message:"Unexpected block-seq-ind on same line with key",source:this.source});return}}else if(atMapIndent){map2.items.push({start})}this.stack.push(bv);return}}}}yield*this.pop();yield*this.step()}*blockSequence(seq){const it=seq.items[seq.items.length-1];switch(this.type){case"newline":if(it.value){const end="end"in it.value?it.value.end:void 0;const last=Array.isArray(end)?end[end.length-1]:void 0;if(last?.type==="comment")end?.push(this.sourceToken);else seq.items.push({start:[this.sourceToken]})}else it.start.push(this.sourceToken);return;case"space":case"comment":if(it.value)seq.items.push({start:[this.sourceToken]});else{if(this.atIndentedComment(it.start,seq.indent)){const prev=seq.items[seq.items.length-2];const end=prev?.value?.end;if(Array.isArray(end)){arrayPushArray(end,it.start);end.push(this.sourceToken);seq.items.pop();return}}it.start.push(this.sourceToken)}return;case"anchor":case"tag":if(it.value||this.indent<=seq.indent)break;it.start.push(this.sourceToken);return;case"seq-item-ind":if(this.indent!==seq.indent)break;if(it.value||includesToken(it.start,"seq-item-ind"))seq.items.push({start:[this.sourceToken]});else it.start.push(this.sourceToken);return}if(this.indent>seq.indent){const bv=this.startBlockValue(seq);if(bv){this.stack.push(bv);return}}yield*this.pop();yield*this.step()}*flowCollection(fc){const it=fc.items[fc.items.length-1];if(this.type==="flow-error-end"){let top;do{yield*this.pop();top=this.peek(1)}while(top?.type==="flow-collection")}else if(fc.end.length===0){switch(this.type){case"comma":case"explicit-key-ind":if(!it||it.sep)fc.items.push({start:[this.sourceToken]});else it.start.push(this.sourceToken);return;case"map-value-ind":if(!it||it.value)fc.items.push({start:[],key:null,sep:[this.sourceToken]});else if(it.sep)it.sep.push(this.sourceToken);else Object.assign(it,{key:null,sep:[this.sourceToken]});return;case"space":case"comment":case"newline":case"anchor":case"tag":if(!it||it.value)fc.items.push({start:[this.sourceToken]});else if(it.sep)it.sep.push(this.sourceToken);else it.start.push(this.sourceToken);return;case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":{const fs=this.flowScalar(this.type);if(!it||it.value)fc.items.push({start:[],key:fs,sep:[]});else if(it.sep)this.stack.push(fs);else Object.assign(it,{key:fs,sep:[]});return}case"flow-map-end":case"flow-seq-end":fc.end.push(this.sourceToken);return}const bv=this.startBlockValue(fc);if(bv)this.stack.push(bv);else{yield*this.pop();yield*this.step()}}else{const parent=this.peek(2);if(parent.type==="block-map"&&(this.type==="map-value-ind"&&parent.indent===fc.indent||this.type==="newline"&&!parent.items[parent.items.length-1].sep)){yield*this.pop();yield*this.step()}else if(this.type==="map-value-ind"&&parent.type!=="flow-collection"){const prev=getPrevProps(parent);const start=getFirstKeyStartProps(prev);fixFlowSeqItems(fc);const sep3=fc.end.splice(1,fc.end.length);sep3.push(this.sourceToken);const map2={type:"block-map",offset:fc.offset,indent:fc.indent,items:[{start,key:fc,sep:sep3}]};this.onKeyLine=true;this.stack[this.stack.length-1]=map2}else{yield*this.lineEnd(fc)}}}flowScalar(type){if(this.onNewLine){let nl=this.source.indexOf("\n")+1;while(nl!==0){this.onNewLine(this.offset+nl);nl=this.source.indexOf("\n",nl)+1}}return{type,offset:this.offset,indent:this.indent,source:this.source}}startBlockValue(parent){switch(this.type){case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":return this.flowScalar(this.type);case"block-scalar-header":return{type:"block-scalar",offset:this.offset,indent:this.indent,props:[this.sourceToken],source:""};case"flow-map-start":case"flow-seq-start":return{type:"flow-collection",offset:this.offset,indent:this.indent,start:this.sourceToken,items:[],end:[]};case"seq-item-ind":return{type:"block-seq",offset:this.offset,indent:this.indent,items:[{start:[this.sourceToken]}]};case"explicit-key-ind":{this.onKeyLine=true;const prev=getPrevProps(parent);const start=getFirstKeyStartProps(prev);start.push(this.sourceToken);return{type:"block-map",offset:this.offset,indent:this.indent,items:[{start,explicitKey:true}]}}case"map-value-ind":{this.onKeyLine=true;const prev=getPrevProps(parent);const start=getFirstKeyStartProps(prev);return{type:"block-map",offset:this.offset,indent:this.indent,items:[{start,key:null,sep:[this.sourceToken]}]}}}return null}atIndentedComment(start,indent){if(this.type!=="comment")return false;if(this.indent<=indent)return false;return start.every(st=>st.type==="newline"||st.type==="space")}*documentEnd(docEnd){if(this.type!=="doc-mode"){if(docEnd.end)docEnd.end.push(this.sourceToken);else docEnd.end=[this.sourceToken];if(this.type==="newline")yield*this.pop()}}*lineEnd(token){switch(this.type){case"comma":case"doc-start":case"doc-end":case"flow-seq-end":case"flow-map-end":case"map-value-ind":yield*this.pop();yield*this.step();break;case"newline":this.onKeyLine=false;case"space":case"comment":default:if(token.end)token.end.push(this.sourceToken);else token.end=[this.sourceToken];if(this.type==="newline")yield*this.pop()}}};exports.Parser=Parser}});var require_public_api=__commonJS({"../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/public-api.js"(exports){"use strict";var composer=require_composer();var Document=require_Document();var errors=require_errors();var log=require_log();var identity=require_identity();var lineCounter=require_line_counter();var parser=require_parser();function parseOptions(options){const prettyErrors=options.prettyErrors!==false;const lineCounter$1=options.lineCounter||prettyErrors&&new lineCounter.LineCounter||null;return{lineCounter:lineCounter$1,prettyErrors}}function parseAllDocuments(source,options={}){const{lineCounter:lineCounter2,prettyErrors}=parseOptions(options);const parser$1=new parser.Parser(lineCounter2?.addNewLine);const composer$1=new composer.Composer(options);const docs=Array.from(composer$1.compose(parser$1.parse(source)));if(prettyErrors&&lineCounter2)for(const doc of docs){doc.errors.forEach(errors.prettifyError(source,lineCounter2));doc.warnings.forEach(errors.prettifyError(source,lineCounter2))}if(docs.length>0)return docs;return Object.assign([],{empty:true},composer$1.streamInfo())}function parseDocument3(source,options={}){const{lineCounter:lineCounter2,prettyErrors}=parseOptions(options);const parser$1=new parser.Parser(lineCounter2?.addNewLine);const composer$1=new composer.Composer(options);let doc=null;for(const _doc of composer$1.compose(parser$1.parse(source),true,source.length)){if(!doc)doc=_doc;else if(doc.options.logLevel!=="silent"){doc.errors.push(new errors.YAMLParseError(_doc.range.slice(0,2),"MULTIPLE_DOCS","Source contains multiple documents; please use YAML.parseAllDocuments()"));break}}if(prettyErrors&&lineCounter2){doc.errors.forEach(errors.prettifyError(source,lineCounter2));doc.warnings.forEach(errors.prettifyError(source,lineCounter2))}return doc}function parse3(src,reviver,options){let _reviver=void 0;if(typeof reviver==="function"){_reviver=reviver}else if(options===void 0&&reviver&&typeof reviver==="object"){options=reviver}const doc=parseDocument3(src,options);if(!doc)return null;doc.warnings.forEach(warning=>log.warn(doc.options.logLevel,warning));if(doc.errors.length>0){if(doc.options.logLevel!=="silent")throw doc.errors[0];else doc.errors=[]}return doc.toJS(Object.assign({reviver:_reviver},options))}function stringify3(value,replacer,options){let _replacer=null;if(typeof replacer==="function"||Array.isArray(replacer)){_replacer=replacer}else if(options===void 0&&replacer){options=replacer}if(typeof options==="string")options=options.length;if(typeof options==="number"){const indent=Math.round(options);options=indent<1?void 0:indent>8?{indent:8}:{indent}}if(value===void 0){const{keepUndefined}=options??replacer??{};if(!keepUndefined)return void 0}if(identity.isDocument(value)&&!_replacer)return value.toString(options);return new Document.Document(value,_replacer,options).toString(options)}exports.parse=parse3;exports.parseAllDocuments=parseAllDocuments;exports.parseDocument=parseDocument3;exports.stringify=stringify3}});var require_dist=__commonJS({"../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/index.js"(exports){"use strict";var composer=require_composer();var Document=require_Document();var Schema=require_Schema();var errors=require_errors();var Alias=require_Alias();var identity=require_identity();var Pair=require_Pair();var Scalar=require_Scalar();var YAMLMap=require_YAMLMap();var YAMLSeq=require_YAMLSeq();var cst=require_cst();var lexer=require_lexer();var lineCounter=require_line_counter();var parser=require_parser();var publicApi=require_public_api();var visit=require_visit();exports.Composer=composer.Composer;exports.Document=Document.Document;exports.Schema=Schema.Schema;exports.YAMLError=errors.YAMLError;exports.YAMLParseError=errors.YAMLParseError;exports.YAMLWarning=errors.YAMLWarning;exports.Alias=Alias.Alias;exports.isAlias=identity.isAlias;exports.isCollection=identity.isCollection;exports.isDocument=identity.isDocument;exports.isMap=identity.isMap;exports.isNode=identity.isNode;exports.isPair=identity.isPair;exports.isScalar=identity.isScalar;exports.isSeq=identity.isSeq;exports.Pair=Pair.Pair;exports.Scalar=Scalar.Scalar;exports.YAMLMap=YAMLMap.YAMLMap;exports.YAMLSeq=YAMLSeq.YAMLSeq;exports.CST=cst;exports.Lexer=lexer.Lexer;exports.LineCounter=lineCounter.LineCounter;exports.Parser=parser.Parser;exports.parse=publicApi.parse;exports.parseAllDocuments=publicApi.parseAllDocuments;exports.parseDocument=publicApi.parseDocument;exports.stringify=publicApi.stringify;exports.visit=visit.visit;exports.visitAsync=visit.visitAsync}});import{spawn as spawn3}from"node:child_process";import{basename as basename3,dirname as dirname7,resolve as resolve9}from"node:path";import{pathToFileURL}from"node:url";import{resolve as resolve3}from"node:path";import{createHash}from"node:crypto";function agentGuidanceFiles(catalog){validateGuidanceCatalog(catalog);const files=[];for(const agent of[...catalog.agents].sort(byId)){const payload=stableJson({kind:"agent",schema_version:1,definition:agent});const semanticHash=digest(payload);files.push({client:"codex",subject:agent.id,path:`.codex/agents/${agent.codex_name}.toml`,content:renderCodexAgent(agent,payload),semantic_hash:semanticHash});files.push({client:"claude",subject:agent.id,path:`.claude/agents/${agent.id}.md`,content:renderGuidance(agent.id,agent.purpose,payload),semantic_hash:semanticHash})}for(const squad of[...catalog.squads].sort(byId)){const payload=stableJson({kind:"squad",schema_version:1,definition:squad});files.push(...clientFiles("squads",squad.id,renderGuidance(squad.id,squad.purpose,payload),digest(payload)))}return files}function compareAgentGuidance(files){const drifted=[];const bySubject=new Map;for(const file2 of files){const entry=bySubject.get(file2.subject)??{};if(entry[file2.client]!==void 0)drifted.push(`${file2.subject}:${file2.client}:duplicate`);entry[file2.client]=file2;bySubject.set(file2.subject,entry)}for(const[subject2,entry]of[...bySubject].sort(([left],[right])=>left.localeCompare(right))){if(entry.codex===void 0||entry.claude===void 0){drifted.push(`${subject2}:missing-client`);continue}if(entry.codex.semantic_hash!==entry.claude.semantic_hash){drifted.push(`${subject2}:semantic-drift`)}}const manifest=[...files].sort((left,right)=>left.path.localeCompare(right.path)).map(({client,subject:subject2,semantic_hash})=>({client,subject:subject2,semantic_hash}));return{valid:drifted.length===0,drifted,semantic_hash:digest(stableJson(manifest))}}async function buildAgentGuidance(filesystem,catalog){const files=agentGuidanceFiles(catalog);const parity=compareAgentGuidance(files);if(!parity.valid)throw new Error(`Agent guidance parity failed: ${parity.drifted.join(", ")}`);for(const file2 of files){if(await filesystem.exists(file2.path)){const current=await filesystem.readText(file2.path);if(!isManagedGuidance(current)){throw new Error(`Refusing to overwrite user-owned agent guidance: ${file2.path}`)}}}for(const file2 of files)await filesystem.writeTextAtomic(file2.path,file2.content);return parity}async function checkAgentGuidance(filesystem,catalog){const files=agentGuidanceFiles(catalog);const parity=compareAgentGuidance(files);const drifted=[...parity.drifted];for(const file2 of files){if(!await filesystem.exists(file2.path)||await filesystem.readText(file2.path)!==file2.content){drifted.push(file2.path)}}return{...parity,valid:drifted.length===0,drifted:[...new Set(drifted)].sort()}}function validateGuidanceCatalog(catalog){const agents=new Map(catalog.agents.map(agent=>[agent.id,agent]));if(agents.size!==catalog.agents.length)throw new Error("Agent ids must be unique");const squadIds=new Set(catalog.squads.map(squad=>squad.id));if(squadIds.size!==catalog.squads.length)throw new Error("Squad ids must be unique");for(const agent of catalog.agents){if(!agent.codex_name.startsWith("zaip-agent-")){throw new Error(`${agent.id} codex_name must start with zaip-agent-`)}if(agent.nickname_candidates.length===0||agent.nickname_candidates.some(nickname=>!nickname.startsWith("zaip-agent-"))){throw new Error(`${agent.id} nickname_candidates must all start with zaip-agent-`)}}for(const squad of catalog.squads){if(!squad.review_policy.independent)throw new Error(`${squad.id} requires independent review`);const unresolvedMembers=squad.members.map(id=>agents.get(id));if(unresolvedMembers.some(agent=>agent===void 0)){throw new Error(`${squad.id} has unknown members`)}const members=unresolvedMembers.filter(isDefined);const executorIds=new Set(members.filter(agent=>agent!==void 0&&squad.review_policy.executor_roles.includes(agent.role)).map(agent=>agent.id));const reviewerIds=new Set(members.filter(agent=>agent!==void 0&&squad.review_policy.reviewer_roles.includes(agent.role)).map(agent=>agent.id));if(executorIds.size===0||reviewerIds.size===0){throw new Error(`${squad.id} must contain executor and reviewer roles`)}if([...executorIds].some(id=>reviewerIds.has(id))){throw new Error(`${squad.id} cannot assign self-review`)}}}function clientFiles(group,subject2,content,semanticHash){return["codex","claude"].map(client=>({client,subject:subject2,path:`.${client}/${group}/${subject2}.md`,content,semantic_hash:semanticHash}))}function renderCodexAgent(agent,payload){const hash2=digest(payload);const name=agent.codex_name;const instructions=[`Operate as Codex agent ${name} (ZAIP catalog id ${agent.id}) with role ${agent.role}.`,agent.purpose,`Capabilities: ${agent.capabilities.join(", ")}.`,`Allowed tools: ${agent.tools.join(", ")||"none"}.`,`Required skills: ${agent.skills.join(", ")||"none"}.`,`Model policy: ${agent.model.preferred.join(", ")}; select model and reasoning effort once when this Agent Run starts and keep both immutable until it finishes.`,`Write scopes: ${agent.write_scopes.join(", ")||"read-only"}.`,agent.write_scopes.length===0?"This role is read-only. Do not create, modify, move, or delete workspace files.":"The Codex host grants workspace-write at the workspace boundary, not per-path. Treat the declared write scopes as mandatory: do not modify files outside them; report any required expansion to the parent before writing.",`Inputs: ${agent.contract.inputs.join(", ")}.`,`Outputs: ${agent.contract.outputs.join(", ")}.`,`Evidence: ${agent.contract.evidence.join(", ")}.`,...agent.role==="orchestrator"?["You are the first catalog subagent of a delegated Execution and its sole dispatcher. Select and start all subsequent catalog Sub-Runs yourself; the root host must not dispatch peer roles directly.","For every Execution, delegate at least one bounded Sub-Run to a catalog agent whose capabilities satisfy the work; interaction Executions normally use zaip-agent-analyst, while delivery Executions may use any eligible executor. Never select an executor by a fixed identity rule.","Reviewer, auditor, and integrator Sub-Runs are permitted when their capabilities match the work.","After all other descendants finish, delegate one real final Sub-Run to zaip-agent-execution-finalizer with agent_type zaip-agent-execution-finalizer and task_name zaip_agent_execution_finalizer. Do not finish the root Run or report a terminal Execution outcome before that Sub-Run has completed."]:[],...agent.role==="orchestrator"?[]:["You are a worker selected by zaip-agent-orchestrator. Do not dispatch peer catalog roles; return your bounded result to the orchestrator, which exclusively controls further delegation."],`Escalate only to catalog identities: ${agent.escalation.map(id=>catalogCodexName(id)).join(", ")||"root agent"}.`,"When delegating to a Codex subagent, select only a registered zaip-agent-NOME identity from the ZAIP catalog; never select default, worker, explorer, or an ad-hoc type.","Set agent_type to the exact zaip-agent-NOME identity. Set task_name exactly to the matching host-compatible identity zaip_agent_NOME (for example, zaip_agent_builder); never add a work title, purpose label, or other suffix.","Codex may render task_name in its Subagents pane. The exact zaip_agent_NOME task_name is therefore mandatory: the host renders it as Zaip Agent NOME. Do not use a task-specific label there and do not claim that the UI label can be forced to include hyphens.","Accept only concrete bounded delegated work. Preserve parent requirements and return a concise result with evidence locators.",agent.review.can_approve?`You may approve only roles outside: ${agent.review.cannot_review_roles.join(", ")||"none"}.`:"You cannot approve your own work or issue final approval."].join("\n");const sandboxMode=agent.write_scopes.length===0?"read-only":"workspace-write";const reasoningEffort=agent.model.reasoning_effort;const preferredModel=agent.model.preferred[0];const modelConfig=agent.model.preferred.length===1&&preferredModel!==void 0&&preferredModel!=="policy-selected"?`model = ${tomlString(preferredModel)}
|
|
27
|
+
${end.comment}`:end.comment}this.doc.range[2]=end.offset;break}default:this.errors.push(new errors.YAMLParseError(getErrorPos(token),"UNEXPECTED_TOKEN",`Unsupported token ${token.type}`))}}*end(forceDoc=false,endOffset=-1){if(this.doc){this.decorate(this.doc,true);yield this.doc;this.doc=null}else if(forceDoc){const opts=Object.assign({_directives:this.directives},this.options);const doc=new Document.Document(void 0,opts);if(this.atDirectives)this.onError(endOffset,"MISSING_CHAR","Missing directives-end indicator line");doc.range=[0,endOffset,endOffset];this.decorate(doc,false);yield doc}}};exports.Composer=Composer}});var require_cst_scalar=__commonJS({"../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/parse/cst-scalar.js"(exports){"use strict";var resolveBlockScalar=require_resolve_block_scalar();var resolveFlowScalar=require_resolve_flow_scalar();var errors=require_errors();var stringifyString=require_stringifyString();function resolveAsScalar(token,strict=true,onError){if(token){const _onError=(pos,code,message)=>{const offset=typeof pos==="number"?pos:Array.isArray(pos)?pos[0]:pos.offset;if(onError)onError(offset,code,message);else throw new errors.YAMLParseError([offset,offset+1],code,message)};switch(token.type){case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":return resolveFlowScalar.resolveFlowScalar(token,strict,_onError);case"block-scalar":return resolveBlockScalar.resolveBlockScalar({options:{strict}},token,_onError)}}return null}function createScalarToken(value,context){const{implicitKey=false,indent,inFlow=false,offset=-1,type="PLAIN"}=context;const source=stringifyString.stringifyString({type,value},{implicitKey,indent:indent>0?" ".repeat(indent):"",inFlow,options:{blockQuote:true,lineWidth:-1}});const end=context.end??[{type:"newline",offset:-1,indent,source:"\n"}];switch(source[0]){case"|":case">":{const he=source.indexOf("\n");const head=source.substring(0,he);const body=source.substring(he+1)+"\n";const props=[{type:"block-scalar-header",offset,indent,source:head}];if(!addEndtoBlockProps(props,end))props.push({type:"newline",offset:-1,indent,source:"\n"});return{type:"block-scalar",offset,indent,props,source:body}}case'"':return{type:"double-quoted-scalar",offset,indent,source,end};case"'":return{type:"single-quoted-scalar",offset,indent,source,end};default:return{type:"scalar",offset,indent,source,end}}}function setScalarValue(token,value,context={}){let{afterKey=false,implicitKey=false,inFlow=false,type}=context;let indent="indent"in token?token.indent:null;if(afterKey&&typeof indent==="number")indent+=2;if(!type)switch(token.type){case"single-quoted-scalar":type="QUOTE_SINGLE";break;case"double-quoted-scalar":type="QUOTE_DOUBLE";break;case"block-scalar":{const header=token.props[0];if(header.type!=="block-scalar-header")throw new Error("Invalid block scalar header");type=header.source[0]===">"?"BLOCK_FOLDED":"BLOCK_LITERAL";break}default:type="PLAIN"}const source=stringifyString.stringifyString({type,value},{implicitKey:implicitKey||indent===null,indent:indent!==null&&indent>0?" ".repeat(indent):"",inFlow,options:{blockQuote:true,lineWidth:-1}});switch(source[0]){case"|":case">":setBlockScalarValue(token,source);break;case'"':setFlowScalarValue(token,source,"double-quoted-scalar");break;case"'":setFlowScalarValue(token,source,"single-quoted-scalar");break;default:setFlowScalarValue(token,source,"scalar")}}function setBlockScalarValue(token,source){const he=source.indexOf("\n");const head=source.substring(0,he);const body=source.substring(he+1)+"\n";if(token.type==="block-scalar"){const header=token.props[0];if(header.type!=="block-scalar-header")throw new Error("Invalid block scalar header");header.source=head;token.source=body}else{const{offset}=token;const indent="indent"in token?token.indent:-1;const props=[{type:"block-scalar-header",offset,indent,source:head}];if(!addEndtoBlockProps(props,"end"in token?token.end:void 0))props.push({type:"newline",offset:-1,indent,source:"\n"});for(const key of Object.keys(token))if(key!=="type"&&key!=="offset")delete token[key];Object.assign(token,{type:"block-scalar",indent,props,source:body})}}function addEndtoBlockProps(props,end){if(end)for(const st of end)switch(st.type){case"space":case"comment":props.push(st);break;case"newline":props.push(st);return true}return false}function setFlowScalarValue(token,source,type){switch(token.type){case"scalar":case"double-quoted-scalar":case"single-quoted-scalar":token.type=type;token.source=source;break;case"block-scalar":{const end=token.props.slice(1);let oa=source.length;if(token.props[0].type==="block-scalar-header")oa-=token.props[0].source.length;for(const tok of end)tok.offset+=oa;delete token.props;Object.assign(token,{type,source,end});break}case"block-map":case"block-seq":{const offset=token.offset+source.length;const nl={type:"newline",offset,indent:token.indent,source:"\n"};delete token.items;Object.assign(token,{type,source,end:[nl]});break}default:{const indent="indent"in token?token.indent:-1;const end="end"in token&&Array.isArray(token.end)?token.end.filter(st=>st.type==="space"||st.type==="comment"||st.type==="newline"):[];for(const key of Object.keys(token))if(key!=="type"&&key!=="offset")delete token[key];Object.assign(token,{type,indent,source,end})}}}exports.createScalarToken=createScalarToken;exports.resolveAsScalar=resolveAsScalar;exports.setScalarValue=setScalarValue}});var require_cst_stringify=__commonJS({"../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/parse/cst-stringify.js"(exports){"use strict";var stringify3=cst=>"type"in cst?stringifyToken(cst):stringifyItem(cst);function stringifyToken(token){switch(token.type){case"block-scalar":{let res="";for(const tok of token.props)res+=stringifyToken(tok);return res+token.source}case"block-map":case"block-seq":{let res="";for(const item of token.items)res+=stringifyItem(item);return res}case"flow-collection":{let res=token.start.source;for(const item of token.items)res+=stringifyItem(item);for(const st of token.end)res+=st.source;return res}case"document":{let res=stringifyItem(token);if(token.end)for(const st of token.end)res+=st.source;return res}default:{let res=token.source;if("end"in token&&token.end)for(const st of token.end)res+=st.source;return res}}}function stringifyItem({start,key,sep:sep3,value}){let res="";for(const st of start)res+=st.source;if(key)res+=stringifyToken(key);if(sep3)for(const st of sep3)res+=st.source;if(value)res+=stringifyToken(value);return res}exports.stringify=stringify3}});var require_cst_visit=__commonJS({"../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/parse/cst-visit.js"(exports){"use strict";var BREAK=Symbol("break visit");var SKIP=Symbol("skip children");var REMOVE=Symbol("remove item");function visit(cst,visitor){if("type"in cst&&cst.type==="document")cst={start:cst.start,value:cst.value};_visit(Object.freeze([]),cst,visitor)}visit.BREAK=BREAK;visit.SKIP=SKIP;visit.REMOVE=REMOVE;visit.itemAtPath=(cst,path)=>{let item=cst;for(const[field,index]of path){const tok=item?.[field];if(tok&&"items"in tok){item=tok.items[index]}else return void 0}return item};visit.parentCollection=(cst,path)=>{const parent=visit.itemAtPath(cst,path.slice(0,-1));const field=path[path.length-1][0];const coll=parent?.[field];if(coll&&"items"in coll)return coll;throw new Error("Parent collection not found")};function _visit(path,item,visitor){let ctrl=visitor(item,path);if(typeof ctrl==="symbol")return ctrl;for(const field of["key","value"]){const token=item[field];if(token&&"items"in token){for(let i=0;i<token.items.length;++i){const ci=_visit(Object.freeze(path.concat([[field,i]])),token.items[i],visitor);if(typeof ci==="number")i=ci-1;else if(ci===BREAK)return BREAK;else if(ci===REMOVE){token.items.splice(i,1);i-=1}}if(typeof ctrl==="function"&&field==="key")ctrl=ctrl(item,path)}}return typeof ctrl==="function"?ctrl(item,path):ctrl}exports.visit=visit}});var require_cst=__commonJS({"../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/parse/cst.js"(exports){"use strict";var cstScalar=require_cst_scalar();var cstStringify=require_cst_stringify();var cstVisit=require_cst_visit();var BOM="\uFEFF";var DOCUMENT="";var FLOW_END="";var SCALAR="";var isCollection=token=>!!token&&"items"in token;var isScalar=token=>!!token&&(token.type==="scalar"||token.type==="single-quoted-scalar"||token.type==="double-quoted-scalar"||token.type==="block-scalar");function prettyToken(token){switch(token){case BOM:return"<BOM>";case DOCUMENT:return"<DOC>";case FLOW_END:return"<FLOW_END>";case SCALAR:return"<SCALAR>";default:return JSON.stringify(token)}}function tokenType(source){switch(source){case BOM:return"byte-order-mark";case DOCUMENT:return"doc-mode";case FLOW_END:return"flow-error-end";case SCALAR:return"scalar";case"---":return"doc-start";case"...":return"doc-end";case"":case"\n":case"\r\n":return"newline";case"-":return"seq-item-ind";case"?":return"explicit-key-ind";case":":return"map-value-ind";case"{":return"flow-map-start";case"}":return"flow-map-end";case"[":return"flow-seq-start";case"]":return"flow-seq-end";case",":return"comma"}switch(source[0]){case" ":case" ":return"space";case"#":return"comment";case"%":return"directive-line";case"*":return"alias";case"&":return"anchor";case"!":return"tag";case"'":return"single-quoted-scalar";case'"':return"double-quoted-scalar";case"|":case">":return"block-scalar-header"}return null}exports.createScalarToken=cstScalar.createScalarToken;exports.resolveAsScalar=cstScalar.resolveAsScalar;exports.setScalarValue=cstScalar.setScalarValue;exports.stringify=cstStringify.stringify;exports.visit=cstVisit.visit;exports.BOM=BOM;exports.DOCUMENT=DOCUMENT;exports.FLOW_END=FLOW_END;exports.SCALAR=SCALAR;exports.isCollection=isCollection;exports.isScalar=isScalar;exports.prettyToken=prettyToken;exports.tokenType=tokenType}});var require_lexer=__commonJS({"../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/parse/lexer.js"(exports){"use strict";var cst=require_cst();function isEmpty(ch){switch(ch){case void 0:case" ":case"\n":case"\r":case" ":return true;default:return false}}var hexDigits=new Set("0123456789ABCDEFabcdef");var tagChars=new Set("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-#;/?:@&=+$_.!~*'()");var flowIndicatorChars=new Set(",[]{}");var invalidAnchorChars=new Set(" ,[]{}\n\r ");var isNotAnchorChar=ch=>!ch||invalidAnchorChars.has(ch);var Lexer=class{constructor(){this.atEnd=false;this.blockScalarIndent=-1;this.blockScalarKeep=false;this.buffer="";this.flowKey=false;this.flowLevel=0;this.indentNext=0;this.indentValue=0;this.lineEndPos=null;this.next=null;this.pos=0}*lex(source,incomplete=false){if(source){if(typeof source!=="string")throw TypeError("source is not a string");this.buffer=this.buffer?this.buffer+source:source;this.lineEndPos=null}this.atEnd=!incomplete;let next=this.next??"stream";while(next&&(incomplete||this.hasChars(1)))next=yield*this.parseNext(next)}atLineEnd(){let i=this.pos;let ch=this.buffer[i];while(ch===" "||ch===" ")ch=this.buffer[++i];if(!ch||ch==="#"||ch==="\n")return true;if(ch==="\r")return this.buffer[i+1]==="\n";return false}charAt(n){return this.buffer[this.pos+n]}continueScalar(offset){let ch=this.buffer[offset];if(this.indentNext>0){let indent=0;while(ch===" ")ch=this.buffer[++indent+offset];if(ch==="\r"){const next=this.buffer[indent+offset+1];if(next==="\n"||!next&&!this.atEnd)return offset+indent+1}return ch==="\n"||indent>=this.indentNext||!ch&&!this.atEnd?offset+indent:-1}if(ch==="-"||ch==="."){const dt=this.buffer.substr(offset,3);if((dt==="---"||dt==="...")&&isEmpty(this.buffer[offset+3]))return-1}return offset}getLine(){let end=this.lineEndPos;if(typeof end!=="number"||end!==-1&&end<this.pos){end=this.buffer.indexOf("\n",this.pos);this.lineEndPos=end}if(end===-1)return this.atEnd?this.buffer.substring(this.pos):null;if(this.buffer[end-1]==="\r")end-=1;return this.buffer.substring(this.pos,end)}hasChars(n){return this.pos+n<=this.buffer.length}setNext(state){this.buffer=this.buffer.substring(this.pos);this.pos=0;this.lineEndPos=null;this.next=state;return null}peek(n){return this.buffer.substr(this.pos,n)}*parseNext(next){switch(next){case"stream":return yield*this.parseStream();case"line-start":return yield*this.parseLineStart();case"block-start":return yield*this.parseBlockStart();case"doc":return yield*this.parseDocument();case"flow":return yield*this.parseFlowCollection();case"quoted-scalar":return yield*this.parseQuotedScalar();case"block-scalar":return yield*this.parseBlockScalar();case"plain-scalar":return yield*this.parsePlainScalar()}}*parseStream(){let line=this.getLine();if(line===null)return this.setNext("stream");if(line[0]===cst.BOM){yield*this.pushCount(1);line=line.substring(1)}if(line[0]==="%"){let dirEnd=line.length;let cs=line.indexOf("#");while(cs!==-1){const ch=line[cs-1];if(ch===" "||ch===" "){dirEnd=cs-1;break}else{cs=line.indexOf("#",cs+1)}}while(true){const ch=line[dirEnd-1];if(ch===" "||ch===" ")dirEnd-=1;else break}const n=(yield*this.pushCount(dirEnd))+(yield*this.pushSpaces(true));yield*this.pushCount(line.length-n);this.pushNewline();return"stream"}if(this.atLineEnd()){const sp=yield*this.pushSpaces(true);yield*this.pushCount(line.length-sp);yield*this.pushNewline();return"stream"}yield cst.DOCUMENT;return yield*this.parseLineStart()}*parseLineStart(){const ch=this.charAt(0);if(!ch&&!this.atEnd)return this.setNext("line-start");if(ch==="-"||ch==="."){if(!this.atEnd&&!this.hasChars(4))return this.setNext("line-start");const s=this.peek(3);if((s==="---"||s==="...")&&isEmpty(this.charAt(3))){yield*this.pushCount(3);this.indentValue=0;this.indentNext=0;return s==="---"?"doc":"stream"}}this.indentValue=yield*this.pushSpaces(false);if(this.indentNext>this.indentValue&&!isEmpty(this.charAt(1)))this.indentNext=this.indentValue;return yield*this.parseBlockStart()}*parseBlockStart(){const[ch0,ch1]=this.peek(2);if(!ch1&&!this.atEnd)return this.setNext("block-start");if((ch0==="-"||ch0==="?"||ch0===":")&&isEmpty(ch1)){const n=(yield*this.pushCount(1))+(yield*this.pushSpaces(true));this.indentNext=this.indentValue+1;this.indentValue+=n;return"block-start"}return"doc"}*parseDocument(){yield*this.pushSpaces(true);const line=this.getLine();if(line===null)return this.setNext("doc");let n=yield*this.pushIndicators();switch(line[n]){case"#":yield*this.pushCount(line.length-n);case void 0:yield*this.pushNewline();return yield*this.parseLineStart();case"{":case"[":yield*this.pushCount(1);this.flowKey=false;this.flowLevel=1;return"flow";case"}":case"]":yield*this.pushCount(1);return"doc";case"*":yield*this.pushUntil(isNotAnchorChar);return"doc";case'"':case"'":return yield*this.parseQuotedScalar();case"|":case">":n+=yield*this.parseBlockScalarHeader();n+=yield*this.pushSpaces(true);yield*this.pushCount(line.length-n);yield*this.pushNewline();return yield*this.parseBlockScalar();default:return yield*this.parsePlainScalar()}}*parseFlowCollection(){let nl,sp;let indent=-1;do{nl=yield*this.pushNewline();if(nl>0){sp=yield*this.pushSpaces(false);this.indentValue=indent=sp}else{sp=0}sp+=yield*this.pushSpaces(true)}while(nl+sp>0);const line=this.getLine();if(line===null)return this.setNext("flow");if(indent!==-1&&indent<this.indentNext&&line[0]!=="#"||indent===0&&(line.startsWith("---")||line.startsWith("..."))&&isEmpty(line[3])){const atFlowEndMarker=indent===this.indentNext-1&&this.flowLevel===1&&(line[0]==="]"||line[0]==="}");if(!atFlowEndMarker){this.flowLevel=0;yield cst.FLOW_END;return yield*this.parseLineStart()}}let n=0;while(line[n]===","){n+=yield*this.pushCount(1);n+=yield*this.pushSpaces(true);this.flowKey=false}n+=yield*this.pushIndicators();switch(line[n]){case void 0:return"flow";case"#":yield*this.pushCount(line.length-n);return"flow";case"{":case"[":yield*this.pushCount(1);this.flowKey=false;this.flowLevel+=1;return"flow";case"}":case"]":yield*this.pushCount(1);this.flowKey=true;this.flowLevel-=1;return this.flowLevel?"flow":"doc";case"*":yield*this.pushUntil(isNotAnchorChar);return"flow";case'"':case"'":this.flowKey=true;return yield*this.parseQuotedScalar();case":":{const next=this.charAt(1);if(this.flowKey||isEmpty(next)||next===","){this.flowKey=false;yield*this.pushCount(1);yield*this.pushSpaces(true);return"flow"}}default:this.flowKey=false;return yield*this.parsePlainScalar()}}*parseQuotedScalar(){const quote=this.charAt(0);let end=this.buffer.indexOf(quote,this.pos+1);if(quote==="'"){while(end!==-1&&this.buffer[end+1]==="'")end=this.buffer.indexOf("'",end+2)}else{while(end!==-1){let n=0;while(this.buffer[end-1-n]==="\\")n+=1;if(n%2===0)break;end=this.buffer.indexOf('"',end+1)}}const qb=this.buffer.substring(0,end);let nl=qb.indexOf("\n",this.pos);if(nl!==-1){while(nl!==-1){const cs=this.continueScalar(nl+1);if(cs===-1)break;nl=qb.indexOf("\n",cs)}if(nl!==-1){end=nl-(qb[nl-1]==="\r"?2:1)}}if(end===-1){if(!this.atEnd)return this.setNext("quoted-scalar");end=this.buffer.length}yield*this.pushToIndex(end+1,false);return this.flowLevel?"flow":"doc"}*parseBlockScalarHeader(){this.blockScalarIndent=-1;this.blockScalarKeep=false;let i=this.pos;while(true){const ch=this.buffer[++i];if(ch==="+")this.blockScalarKeep=true;else if(ch>"0"&&ch<="9")this.blockScalarIndent=Number(ch)-1;else if(ch!=="-")break}return yield*this.pushUntil(ch=>isEmpty(ch)||ch==="#")}*parseBlockScalar(){let nl=this.pos-1;let indent=0;let ch;loop:for(let i2=this.pos;ch=this.buffer[i2];++i2){switch(ch){case" ":indent+=1;break;case"\n":nl=i2;indent=0;break;case"\r":{const next=this.buffer[i2+1];if(!next&&!this.atEnd)return this.setNext("block-scalar");if(next==="\n")break}default:break loop}}if(!ch&&!this.atEnd)return this.setNext("block-scalar");if(indent>=this.indentNext){if(this.blockScalarIndent===-1)this.indentNext=indent;else{this.indentNext=this.blockScalarIndent+(this.indentNext===0?1:this.indentNext)}do{const cs=this.continueScalar(nl+1);if(cs===-1)break;nl=this.buffer.indexOf("\n",cs)}while(nl!==-1);if(nl===-1){if(!this.atEnd)return this.setNext("block-scalar");nl=this.buffer.length}}let i=nl+1;ch=this.buffer[i];while(ch===" ")ch=this.buffer[++i];if(ch===" "){while(ch===" "||ch===" "||ch==="\r"||ch==="\n")ch=this.buffer[++i];nl=i-1}else if(!this.blockScalarKeep){do{let i2=nl-1;let ch2=this.buffer[i2];if(ch2==="\r")ch2=this.buffer[--i2];const lastChar=i2;while(ch2===" ")ch2=this.buffer[--i2];if(ch2==="\n"&&i2>=this.pos&&i2+1+indent>lastChar)nl=i2;else break}while(true)}yield cst.SCALAR;yield*this.pushToIndex(nl+1,true);return yield*this.parseLineStart()}*parsePlainScalar(){const inFlow=this.flowLevel>0;let end=this.pos-1;let i=this.pos-1;let ch;while(ch=this.buffer[++i]){if(ch===":"){const next=this.buffer[i+1];if(isEmpty(next)||inFlow&&flowIndicatorChars.has(next))break;end=i}else if(isEmpty(ch)){let next=this.buffer[i+1];if(ch==="\r"){if(next==="\n"){i+=1;ch="\n";next=this.buffer[i+1]}else end=i}if(next==="#"||inFlow&&flowIndicatorChars.has(next))break;if(ch==="\n"){const cs=this.continueScalar(i+1);if(cs===-1)break;i=Math.max(i,cs-2)}}else{if(inFlow&&flowIndicatorChars.has(ch))break;end=i}}if(!ch&&!this.atEnd)return this.setNext("plain-scalar");yield cst.SCALAR;yield*this.pushToIndex(end+1,true);return inFlow?"flow":"doc"}*pushCount(n){if(n>0){yield this.buffer.substr(this.pos,n);this.pos+=n;return n}return 0}*pushToIndex(i,allowEmpty){const s=this.buffer.slice(this.pos,i);if(s){yield s;this.pos+=s.length;return s.length}else if(allowEmpty)yield"";return 0}*pushIndicators(){let n=0;loop:while(true){switch(this.charAt(0)){case"!":n+=yield*this.pushTag();n+=yield*this.pushSpaces(true);continue loop;case"&":n+=yield*this.pushUntil(isNotAnchorChar);n+=yield*this.pushSpaces(true);continue loop;case"-":case"?":case":":{const inFlow=this.flowLevel>0;const ch1=this.charAt(1);if(isEmpty(ch1)||inFlow&&flowIndicatorChars.has(ch1)){if(!inFlow)this.indentNext=this.indentValue+1;else if(this.flowKey)this.flowKey=false;n+=yield*this.pushCount(1);n+=yield*this.pushSpaces(true);continue loop}}}break loop}return n}*pushTag(){if(this.charAt(1)==="<"){let i=this.pos+2;let ch=this.buffer[i];while(!isEmpty(ch)&&ch!==">")ch=this.buffer[++i];return yield*this.pushToIndex(ch===">"?i+1:i,false)}else{let i=this.pos+1;let ch=this.buffer[i];while(ch){if(tagChars.has(ch))ch=this.buffer[++i];else if(ch==="%"&&hexDigits.has(this.buffer[i+1])&&hexDigits.has(this.buffer[i+2])){ch=this.buffer[i+=3]}else break}return yield*this.pushToIndex(i,false)}}*pushNewline(){const ch=this.buffer[this.pos];if(ch==="\n")return yield*this.pushCount(1);else if(ch==="\r"&&this.charAt(1)==="\n")return yield*this.pushCount(2);else return 0}*pushSpaces(allowTabs){let i=this.pos-1;let ch;do{ch=this.buffer[++i]}while(ch===" "||allowTabs&&ch===" ");const n=i-this.pos;if(n>0){yield this.buffer.substr(this.pos,n);this.pos=i}return n}*pushUntil(test){let i=this.pos;let ch=this.buffer[i];while(!test(ch))ch=this.buffer[++i];return yield*this.pushToIndex(i,false)}};exports.Lexer=Lexer}});var require_line_counter=__commonJS({"../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/parse/line-counter.js"(exports){"use strict";var LineCounter=class{constructor(){this.lineStarts=[];this.addNewLine=offset=>this.lineStarts.push(offset);this.linePos=offset=>{let low=0;let high=this.lineStarts.length;while(low<high){const mid=low+high>>1;if(this.lineStarts[mid]<offset)low=mid+1;else high=mid}if(this.lineStarts[low]===offset)return{line:low+1,col:1};if(low===0)return{line:0,col:offset};const start=this.lineStarts[low-1];return{line:low,col:offset-start+1}}}};exports.LineCounter=LineCounter}});var require_parser=__commonJS({"../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/parse/parser.js"(exports){"use strict";var node_process=__require("process");var cst=require_cst();var lexer=require_lexer();function includesToken(list,type){for(let i=0;i<list.length;++i)if(list[i].type===type)return true;return false}function findNonEmptyIndex(list){for(let i=0;i<list.length;++i){switch(list[i].type){case"space":case"comment":case"newline":break;default:return i}}return-1}function isFlowToken(token){switch(token?.type){case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":case"flow-collection":return true;default:return false}}function getPrevProps(parent){switch(parent.type){case"document":return parent.start;case"block-map":{const it=parent.items[parent.items.length-1];return it.sep??it.start}case"block-seq":return parent.items[parent.items.length-1].start;default:return[]}}function getFirstKeyStartProps(prev){if(prev.length===0)return[];let i=prev.length;loop:while(--i>=0){switch(prev[i].type){case"doc-start":case"explicit-key-ind":case"map-value-ind":case"seq-item-ind":case"newline":break loop}}while(prev[++i]?.type==="space"){}return prev.splice(i,prev.length)}function arrayPushArray(target,source){if(source.length<1e5)Array.prototype.push.apply(target,source);else for(let i=0;i<source.length;++i)target.push(source[i])}function fixFlowSeqItems(fc){if(fc.start.type==="flow-seq-start"){for(const it of fc.items){if(it.sep&&!it.value&&!includesToken(it.start,"explicit-key-ind")&&!includesToken(it.sep,"map-value-ind")){if(it.key)it.value=it.key;delete it.key;if(isFlowToken(it.value)){if(it.value.end)arrayPushArray(it.value.end,it.sep);else it.value.end=it.sep}else arrayPushArray(it.start,it.sep);delete it.sep}}}}var Parser=class{constructor(onNewLine){this.atNewLine=true;this.atScalar=false;this.indent=0;this.offset=0;this.onKeyLine=false;this.stack=[];this.source="";this.type="";this.lexer=new lexer.Lexer;this.onNewLine=onNewLine}*parse(source,incomplete=false){if(this.onNewLine&&this.offset===0)this.onNewLine(0);for(const lexeme of this.lexer.lex(source,incomplete))yield*this.next(lexeme);if(!incomplete)yield*this.end()}*next(source){this.source=source;if(node_process.env.LOG_TOKENS)console.log("|",cst.prettyToken(source));if(this.atScalar){this.atScalar=false;yield*this.step();this.offset+=source.length;return}const type=cst.tokenType(source);if(!type){const message=`Not a YAML token: ${source}`;yield*this.pop({type:"error",offset:this.offset,message,source});this.offset+=source.length}else if(type==="scalar"){this.atNewLine=false;this.atScalar=true;this.type="scalar"}else{this.type=type;yield*this.step();switch(type){case"newline":this.atNewLine=true;this.indent=0;if(this.onNewLine)this.onNewLine(this.offset+source.length);break;case"space":if(this.atNewLine&&source[0]===" ")this.indent+=source.length;break;case"explicit-key-ind":case"map-value-ind":case"seq-item-ind":if(this.atNewLine)this.indent+=source.length;break;case"doc-mode":case"flow-error-end":return;default:this.atNewLine=false}this.offset+=source.length}}*end(){while(this.stack.length>0)yield*this.pop()}get sourceToken(){const st={type:this.type,offset:this.offset,indent:this.indent,source:this.source};return st}*step(){const top=this.peek(1);if(this.type==="doc-end"&&top?.type!=="doc-end"){while(this.stack.length>0)yield*this.pop();this.stack.push({type:"doc-end",offset:this.offset,source:this.source});return}if(!top)return yield*this.stream();switch(top.type){case"document":return yield*this.document(top);case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":return yield*this.scalar(top);case"block-scalar":return yield*this.blockScalar(top);case"block-map":return yield*this.blockMap(top);case"block-seq":return yield*this.blockSequence(top);case"flow-collection":return yield*this.flowCollection(top);case"doc-end":return yield*this.documentEnd(top)}yield*this.pop()}peek(n){return this.stack[this.stack.length-n]}*pop(error51){const token=error51??this.stack.pop();if(!token){const message="Tried to pop an empty stack";yield{type:"error",offset:this.offset,source:"",message}}else if(this.stack.length===0){yield token}else{const top=this.peek(1);if(token.type==="block-scalar"){token.indent="indent"in top?top.indent:0}else if(token.type==="flow-collection"&&top.type==="document"){token.indent=0}if(token.type==="flow-collection")fixFlowSeqItems(token);switch(top.type){case"document":top.value=token;break;case"block-scalar":top.props.push(token);break;case"block-map":{const it=top.items[top.items.length-1];if(it.value){top.items.push({start:[],key:token,sep:[]});this.onKeyLine=true;return}else if(it.sep){it.value=token}else{Object.assign(it,{key:token,sep:[]});this.onKeyLine=!it.explicitKey;return}break}case"block-seq":{const it=top.items[top.items.length-1];if(it.value)top.items.push({start:[],value:token});else it.value=token;break}case"flow-collection":{const it=top.items[top.items.length-1];if(!it||it.value)top.items.push({start:[],key:token,sep:[]});else if(it.sep)it.value=token;else Object.assign(it,{key:token,sep:[]});return}default:yield*this.pop();yield*this.pop(token)}if((top.type==="document"||top.type==="block-map"||top.type==="block-seq")&&(token.type==="block-map"||token.type==="block-seq")){const last=token.items[token.items.length-1];if(last&&!last.sep&&!last.value&&last.start.length>0&&findNonEmptyIndex(last.start)===-1&&(token.indent===0||last.start.every(st=>st.type!=="comment"||st.indent<token.indent))){if(top.type==="document")top.end=last.start;else top.items.push({start:last.start});token.items.splice(-1,1)}}}}*stream(){switch(this.type){case"directive-line":yield{type:"directive",offset:this.offset,source:this.source};return;case"byte-order-mark":case"space":case"comment":case"newline":yield this.sourceToken;return;case"doc-mode":case"doc-start":{const doc={type:"document",offset:this.offset,start:[]};if(this.type==="doc-start")doc.start.push(this.sourceToken);this.stack.push(doc);return}}yield{type:"error",offset:this.offset,message:`Unexpected ${this.type} token in YAML stream`,source:this.source}}*document(doc){if(doc.value)return yield*this.lineEnd(doc);switch(this.type){case"doc-start":{if(findNonEmptyIndex(doc.start)!==-1){yield*this.pop();yield*this.step()}else doc.start.push(this.sourceToken);return}case"anchor":case"tag":case"space":case"comment":case"newline":doc.start.push(this.sourceToken);return}const bv=this.startBlockValue(doc);if(bv)this.stack.push(bv);else{yield{type:"error",offset:this.offset,message:`Unexpected ${this.type} token in YAML document`,source:this.source}}}*scalar(scalar){if(this.type==="map-value-ind"){const prev=getPrevProps(this.peek(2));const start=getFirstKeyStartProps(prev);let sep3;if(scalar.end){sep3=scalar.end;sep3.push(this.sourceToken);delete scalar.end}else sep3=[this.sourceToken];const map2={type:"block-map",offset:scalar.offset,indent:scalar.indent,items:[{start,key:scalar,sep:sep3}]};this.onKeyLine=true;this.stack[this.stack.length-1]=map2}else yield*this.lineEnd(scalar)}*blockScalar(scalar){switch(this.type){case"space":case"comment":case"newline":scalar.props.push(this.sourceToken);return;case"scalar":scalar.source=this.source;this.atNewLine=true;this.indent=0;if(this.onNewLine){let nl=this.source.indexOf("\n")+1;while(nl!==0){this.onNewLine(this.offset+nl);nl=this.source.indexOf("\n",nl)+1}}yield*this.pop();break;default:yield*this.pop();yield*this.step()}}*blockMap(map2){const it=map2.items[map2.items.length-1];switch(this.type){case"newline":this.onKeyLine=false;if(it.value){const end="end"in it.value?it.value.end:void 0;const last=Array.isArray(end)?end[end.length-1]:void 0;if(last?.type==="comment")end?.push(this.sourceToken);else map2.items.push({start:[this.sourceToken]})}else if(it.sep){it.sep.push(this.sourceToken)}else{it.start.push(this.sourceToken)}return;case"space":case"comment":if(it.value){map2.items.push({start:[this.sourceToken]})}else if(it.sep){it.sep.push(this.sourceToken)}else{if(this.atIndentedComment(it.start,map2.indent)){const prev=map2.items[map2.items.length-2];const end=prev?.value?.end;if(Array.isArray(end)){arrayPushArray(end,it.start);end.push(this.sourceToken);map2.items.pop();return}}it.start.push(this.sourceToken)}return}if(this.indent>=map2.indent){const atMapIndent=!this.onKeyLine&&this.indent===map2.indent;const atNextItem=atMapIndent&&(it.sep||it.explicitKey)&&this.type!=="seq-item-ind";let start=[];if(atNextItem&&it.sep&&!it.value){const nl=[];for(let i=0;i<it.sep.length;++i){const st=it.sep[i];switch(st.type){case"newline":nl.push(i);break;case"space":break;case"comment":if(st.indent>map2.indent)nl.length=0;break;default:nl.length=0}}if(nl.length>=2)start=it.sep.splice(nl[1])}switch(this.type){case"anchor":case"tag":if(atNextItem||it.value){start.push(this.sourceToken);map2.items.push({start});this.onKeyLine=true}else if(it.sep){it.sep.push(this.sourceToken)}else{it.start.push(this.sourceToken)}return;case"explicit-key-ind":if(!it.sep&&!it.explicitKey){it.start.push(this.sourceToken);it.explicitKey=true}else if(atNextItem||it.value){start.push(this.sourceToken);map2.items.push({start,explicitKey:true})}else{this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:[this.sourceToken],explicitKey:true}]})}this.onKeyLine=true;return;case"map-value-ind":if(it.explicitKey){if(!it.sep){if(includesToken(it.start,"newline")){Object.assign(it,{key:null,sep:[this.sourceToken]})}else{const start2=getFirstKeyStartProps(it.start);this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:start2,key:null,sep:[this.sourceToken]}]})}}else if(it.value){map2.items.push({start:[],key:null,sep:[this.sourceToken]})}else if(includesToken(it.sep,"map-value-ind")){this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start,key:null,sep:[this.sourceToken]}]})}else if(isFlowToken(it.key)&&!includesToken(it.sep,"newline")){const start2=getFirstKeyStartProps(it.start);const key=it.key;const sep3=it.sep;sep3.push(this.sourceToken);delete it.key;delete it.sep;this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:start2,key,sep:sep3}]})}else if(start.length>0){it.sep=it.sep.concat(start,this.sourceToken)}else{it.sep.push(this.sourceToken)}}else{if(!it.sep){Object.assign(it,{key:null,sep:[this.sourceToken]})}else if(it.value||atNextItem){map2.items.push({start,key:null,sep:[this.sourceToken]})}else if(includesToken(it.sep,"map-value-ind")){this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:[],key:null,sep:[this.sourceToken]}]})}else{it.sep.push(this.sourceToken)}}this.onKeyLine=true;return;case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":{const fs=this.flowScalar(this.type);if(atNextItem||it.value){map2.items.push({start,key:fs,sep:[]});this.onKeyLine=true}else if(it.sep){this.stack.push(fs)}else{Object.assign(it,{key:fs,sep:[]});this.onKeyLine=true}return}default:{const bv=this.startBlockValue(map2);if(bv){if(bv.type==="block-seq"){if(!it.explicitKey&&it.sep&&!includesToken(it.sep,"newline")){yield*this.pop({type:"error",offset:this.offset,message:"Unexpected block-seq-ind on same line with key",source:this.source});return}}else if(atMapIndent){map2.items.push({start})}this.stack.push(bv);return}}}}yield*this.pop();yield*this.step()}*blockSequence(seq){const it=seq.items[seq.items.length-1];switch(this.type){case"newline":if(it.value){const end="end"in it.value?it.value.end:void 0;const last=Array.isArray(end)?end[end.length-1]:void 0;if(last?.type==="comment")end?.push(this.sourceToken);else seq.items.push({start:[this.sourceToken]})}else it.start.push(this.sourceToken);return;case"space":case"comment":if(it.value)seq.items.push({start:[this.sourceToken]});else{if(this.atIndentedComment(it.start,seq.indent)){const prev=seq.items[seq.items.length-2];const end=prev?.value?.end;if(Array.isArray(end)){arrayPushArray(end,it.start);end.push(this.sourceToken);seq.items.pop();return}}it.start.push(this.sourceToken)}return;case"anchor":case"tag":if(it.value||this.indent<=seq.indent)break;it.start.push(this.sourceToken);return;case"seq-item-ind":if(this.indent!==seq.indent)break;if(it.value||includesToken(it.start,"seq-item-ind"))seq.items.push({start:[this.sourceToken]});else it.start.push(this.sourceToken);return}if(this.indent>seq.indent){const bv=this.startBlockValue(seq);if(bv){this.stack.push(bv);return}}yield*this.pop();yield*this.step()}*flowCollection(fc){const it=fc.items[fc.items.length-1];if(this.type==="flow-error-end"){let top;do{yield*this.pop();top=this.peek(1)}while(top?.type==="flow-collection")}else if(fc.end.length===0){switch(this.type){case"comma":case"explicit-key-ind":if(!it||it.sep)fc.items.push({start:[this.sourceToken]});else it.start.push(this.sourceToken);return;case"map-value-ind":if(!it||it.value)fc.items.push({start:[],key:null,sep:[this.sourceToken]});else if(it.sep)it.sep.push(this.sourceToken);else Object.assign(it,{key:null,sep:[this.sourceToken]});return;case"space":case"comment":case"newline":case"anchor":case"tag":if(!it||it.value)fc.items.push({start:[this.sourceToken]});else if(it.sep)it.sep.push(this.sourceToken);else it.start.push(this.sourceToken);return;case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":{const fs=this.flowScalar(this.type);if(!it||it.value)fc.items.push({start:[],key:fs,sep:[]});else if(it.sep)this.stack.push(fs);else Object.assign(it,{key:fs,sep:[]});return}case"flow-map-end":case"flow-seq-end":fc.end.push(this.sourceToken);return}const bv=this.startBlockValue(fc);if(bv)this.stack.push(bv);else{yield*this.pop();yield*this.step()}}else{const parent=this.peek(2);if(parent.type==="block-map"&&(this.type==="map-value-ind"&&parent.indent===fc.indent||this.type==="newline"&&!parent.items[parent.items.length-1].sep)){yield*this.pop();yield*this.step()}else if(this.type==="map-value-ind"&&parent.type!=="flow-collection"){const prev=getPrevProps(parent);const start=getFirstKeyStartProps(prev);fixFlowSeqItems(fc);const sep3=fc.end.splice(1,fc.end.length);sep3.push(this.sourceToken);const map2={type:"block-map",offset:fc.offset,indent:fc.indent,items:[{start,key:fc,sep:sep3}]};this.onKeyLine=true;this.stack[this.stack.length-1]=map2}else{yield*this.lineEnd(fc)}}}flowScalar(type){if(this.onNewLine){let nl=this.source.indexOf("\n")+1;while(nl!==0){this.onNewLine(this.offset+nl);nl=this.source.indexOf("\n",nl)+1}}return{type,offset:this.offset,indent:this.indent,source:this.source}}startBlockValue(parent){switch(this.type){case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":return this.flowScalar(this.type);case"block-scalar-header":return{type:"block-scalar",offset:this.offset,indent:this.indent,props:[this.sourceToken],source:""};case"flow-map-start":case"flow-seq-start":return{type:"flow-collection",offset:this.offset,indent:this.indent,start:this.sourceToken,items:[],end:[]};case"seq-item-ind":return{type:"block-seq",offset:this.offset,indent:this.indent,items:[{start:[this.sourceToken]}]};case"explicit-key-ind":{this.onKeyLine=true;const prev=getPrevProps(parent);const start=getFirstKeyStartProps(prev);start.push(this.sourceToken);return{type:"block-map",offset:this.offset,indent:this.indent,items:[{start,explicitKey:true}]}}case"map-value-ind":{this.onKeyLine=true;const prev=getPrevProps(parent);const start=getFirstKeyStartProps(prev);return{type:"block-map",offset:this.offset,indent:this.indent,items:[{start,key:null,sep:[this.sourceToken]}]}}}return null}atIndentedComment(start,indent){if(this.type!=="comment")return false;if(this.indent<=indent)return false;return start.every(st=>st.type==="newline"||st.type==="space")}*documentEnd(docEnd){if(this.type!=="doc-mode"){if(docEnd.end)docEnd.end.push(this.sourceToken);else docEnd.end=[this.sourceToken];if(this.type==="newline")yield*this.pop()}}*lineEnd(token){switch(this.type){case"comma":case"doc-start":case"doc-end":case"flow-seq-end":case"flow-map-end":case"map-value-ind":yield*this.pop();yield*this.step();break;case"newline":this.onKeyLine=false;case"space":case"comment":default:if(token.end)token.end.push(this.sourceToken);else token.end=[this.sourceToken];if(this.type==="newline")yield*this.pop()}}};exports.Parser=Parser}});var require_public_api=__commonJS({"../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/public-api.js"(exports){"use strict";var composer=require_composer();var Document=require_Document();var errors=require_errors();var log=require_log();var identity=require_identity();var lineCounter=require_line_counter();var parser=require_parser();function parseOptions(options){const prettyErrors=options.prettyErrors!==false;const lineCounter$1=options.lineCounter||prettyErrors&&new lineCounter.LineCounter||null;return{lineCounter:lineCounter$1,prettyErrors}}function parseAllDocuments(source,options={}){const{lineCounter:lineCounter2,prettyErrors}=parseOptions(options);const parser$1=new parser.Parser(lineCounter2?.addNewLine);const composer$1=new composer.Composer(options);const docs=Array.from(composer$1.compose(parser$1.parse(source)));if(prettyErrors&&lineCounter2)for(const doc of docs){doc.errors.forEach(errors.prettifyError(source,lineCounter2));doc.warnings.forEach(errors.prettifyError(source,lineCounter2))}if(docs.length>0)return docs;return Object.assign([],{empty:true},composer$1.streamInfo())}function parseDocument3(source,options={}){const{lineCounter:lineCounter2,prettyErrors}=parseOptions(options);const parser$1=new parser.Parser(lineCounter2?.addNewLine);const composer$1=new composer.Composer(options);let doc=null;for(const _doc of composer$1.compose(parser$1.parse(source),true,source.length)){if(!doc)doc=_doc;else if(doc.options.logLevel!=="silent"){doc.errors.push(new errors.YAMLParseError(_doc.range.slice(0,2),"MULTIPLE_DOCS","Source contains multiple documents; please use YAML.parseAllDocuments()"));break}}if(prettyErrors&&lineCounter2){doc.errors.forEach(errors.prettifyError(source,lineCounter2));doc.warnings.forEach(errors.prettifyError(source,lineCounter2))}return doc}function parse3(src,reviver,options){let _reviver=void 0;if(typeof reviver==="function"){_reviver=reviver}else if(options===void 0&&reviver&&typeof reviver==="object"){options=reviver}const doc=parseDocument3(src,options);if(!doc)return null;doc.warnings.forEach(warning=>log.warn(doc.options.logLevel,warning));if(doc.errors.length>0){if(doc.options.logLevel!=="silent")throw doc.errors[0];else doc.errors=[]}return doc.toJS(Object.assign({reviver:_reviver},options))}function stringify3(value,replacer,options){let _replacer=null;if(typeof replacer==="function"||Array.isArray(replacer)){_replacer=replacer}else if(options===void 0&&replacer){options=replacer}if(typeof options==="string")options=options.length;if(typeof options==="number"){const indent=Math.round(options);options=indent<1?void 0:indent>8?{indent:8}:{indent}}if(value===void 0){const{keepUndefined}=options??replacer??{};if(!keepUndefined)return void 0}if(identity.isDocument(value)&&!_replacer)return value.toString(options);return new Document.Document(value,_replacer,options).toString(options)}exports.parse=parse3;exports.parseAllDocuments=parseAllDocuments;exports.parseDocument=parseDocument3;exports.stringify=stringify3}});var require_dist=__commonJS({"../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/index.js"(exports){"use strict";var composer=require_composer();var Document=require_Document();var Schema=require_Schema();var errors=require_errors();var Alias=require_Alias();var identity=require_identity();var Pair=require_Pair();var Scalar=require_Scalar();var YAMLMap=require_YAMLMap();var YAMLSeq=require_YAMLSeq();var cst=require_cst();var lexer=require_lexer();var lineCounter=require_line_counter();var parser=require_parser();var publicApi=require_public_api();var visit=require_visit();exports.Composer=composer.Composer;exports.Document=Document.Document;exports.Schema=Schema.Schema;exports.YAMLError=errors.YAMLError;exports.YAMLParseError=errors.YAMLParseError;exports.YAMLWarning=errors.YAMLWarning;exports.Alias=Alias.Alias;exports.isAlias=identity.isAlias;exports.isCollection=identity.isCollection;exports.isDocument=identity.isDocument;exports.isMap=identity.isMap;exports.isNode=identity.isNode;exports.isPair=identity.isPair;exports.isScalar=identity.isScalar;exports.isSeq=identity.isSeq;exports.Pair=Pair.Pair;exports.Scalar=Scalar.Scalar;exports.YAMLMap=YAMLMap.YAMLMap;exports.YAMLSeq=YAMLSeq.YAMLSeq;exports.CST=cst;exports.Lexer=lexer.Lexer;exports.LineCounter=lineCounter.LineCounter;exports.Parser=parser.Parser;exports.parse=publicApi.parse;exports.parseAllDocuments=publicApi.parseAllDocuments;exports.parseDocument=publicApi.parseDocument;exports.stringify=publicApi.stringify;exports.visit=visit.visit;exports.visitAsync=visit.visitAsync}});import{spawn as spawn3}from"node:child_process";import{basename as basename3,dirname as dirname7,resolve as resolve9}from"node:path";import{pathToFileURL}from"node:url";import{resolve as resolve3}from"node:path";import{createHash}from"node:crypto";function agentGuidanceFiles(catalog){validateGuidanceCatalog(catalog);const files=[];for(const agent of[...catalog.agents].sort(byId)){const payload=stableJson({kind:"agent",schema_version:1,definition:agent});const semanticHash=digest(payload);files.push({client:"codex",subject:agent.id,path:`.codex/agents/${agent.codex_name}.toml`,content:renderCodexAgent(agent,payload),semantic_hash:semanticHash});files.push({client:"claude",subject:agent.id,path:`.claude/agents/${agent.id}.md`,content:renderGuidance(agent.id,agent.purpose,payload),semantic_hash:semanticHash})}for(const squad of[...catalog.squads].sort(byId)){const payload=stableJson({kind:"squad",schema_version:1,definition:squad});files.push(...clientFiles("squads",squad.id,renderGuidance(squad.id,squad.purpose,payload),digest(payload)))}return files}function compareAgentGuidance(files){const drifted=[];const bySubject=new Map;for(const file2 of files){const entry=bySubject.get(file2.subject)??{};if(entry[file2.client]!==void 0)drifted.push(`${file2.subject}:${file2.client}:duplicate`);entry[file2.client]=file2;bySubject.set(file2.subject,entry)}for(const[subject2,entry]of[...bySubject].sort(([left],[right])=>left.localeCompare(right))){if(entry.codex===void 0||entry.claude===void 0){drifted.push(`${subject2}:missing-client`);continue}if(entry.codex.semantic_hash!==entry.claude.semantic_hash){drifted.push(`${subject2}:semantic-drift`)}}const manifest=[...files].sort((left,right)=>left.path.localeCompare(right.path)).map(({client,subject:subject2,semantic_hash})=>({client,subject:subject2,semantic_hash}));return{valid:drifted.length===0,drifted,semantic_hash:digest(stableJson(manifest))}}async function buildAgentGuidance(filesystem,catalog){const files=agentGuidanceFiles(catalog);const parity=compareAgentGuidance(files);if(!parity.valid)throw new Error(`Agent guidance parity failed: ${parity.drifted.join(", ")}`);for(const file2 of files){if(await filesystem.exists(file2.path)){const current=await filesystem.readText(file2.path);if(!isManagedGuidance(current)){throw new Error(`Refusing to overwrite user-owned agent guidance: ${file2.path}`)}}}for(const file2 of files)await filesystem.writeTextAtomic(file2.path,file2.content);return parity}async function checkAgentGuidance(filesystem,catalog){const files=agentGuidanceFiles(catalog);const parity=compareAgentGuidance(files);const drifted=[...parity.drifted];for(const file2 of files){if(!await filesystem.exists(file2.path)||await filesystem.readText(file2.path)!==file2.content){drifted.push(file2.path)}}return{...parity,valid:drifted.length===0,drifted:[...new Set(drifted)].sort()}}function validateGuidanceCatalog(catalog){const agents=new Map(catalog.agents.map(agent=>[agent.id,agent]));if(agents.size!==catalog.agents.length)throw new Error("Agent ids must be unique");const squadIds=new Set(catalog.squads.map(squad=>squad.id));if(squadIds.size!==catalog.squads.length)throw new Error("Squad ids must be unique");for(const agent of catalog.agents){if(!agent.codex_name.startsWith("zaip-agent-")){throw new Error(`${agent.id} codex_name must start with zaip-agent-`)}if(agent.nickname_candidates.length===0||agent.nickname_candidates.some(nickname=>!nickname.startsWith("zaip-agent-"))){throw new Error(`${agent.id} nickname_candidates must all start with zaip-agent-`)}}for(const squad of catalog.squads){if(!squad.review_policy.independent)throw new Error(`${squad.id} requires independent review`);const unresolvedMembers=squad.members.map(id=>agents.get(id));if(unresolvedMembers.some(agent=>agent===void 0)){throw new Error(`${squad.id} has unknown members`)}const members=unresolvedMembers.filter(isDefined);const executorIds=new Set(members.filter(agent=>agent!==void 0&&squad.review_policy.executor_roles.includes(agent.role)).map(agent=>agent.id));const reviewerIds=new Set(members.filter(agent=>agent!==void 0&&squad.review_policy.reviewer_roles.includes(agent.role)).map(agent=>agent.id));if(executorIds.size===0||reviewerIds.size===0){throw new Error(`${squad.id} must contain executor and reviewer roles`)}if([...executorIds].some(id=>reviewerIds.has(id))){throw new Error(`${squad.id} cannot assign self-review`)}}}function clientFiles(group,subject2,content,semanticHash){return["codex","claude"].map(client=>({client,subject:subject2,path:`.${client}/${group}/${subject2}.md`,content,semantic_hash:semanticHash}))}function renderCodexAgent(agent,payload){const hash2=digest(payload);const name=agent.codex_name;const instructions=[`Operate as Codex agent ${name} (ZAIP catalog id ${agent.id}) with role ${agent.role}.`,agent.purpose,`Capabilities: ${agent.capabilities.join(", ")}.`,`Allowed tools: ${agent.tools.join(", ")||"none"}.`,`Required skills: ${agent.skills.join(", ")||"none"}.`,`Model policy: ${agent.model.preferred.join(", ")}; select model and reasoning effort once when this Agent Run starts and keep both immutable until it finishes.`,`Write scopes: ${agent.write_scopes.join(", ")||"read-only"}.`,agent.write_scopes.length===0?"This role is read-only. Do not create, modify, move, or delete workspace files.":"The Codex host grants workspace-write at the workspace boundary, not per-path. Treat the declared write scopes as mandatory: do not modify files outside them; report any required expansion to the parent before writing.",`Inputs: ${agent.contract.inputs.join(", ")}.`,`Outputs: ${agent.contract.outputs.join(", ")}.`,`Evidence: ${agent.contract.evidence.join(", ")}.`,...agent.role==="orchestrator"?["You are the first catalog subagent of a delegated Execution and its sole dispatcher. Select and start all subsequent catalog Sub-Runs yourself; the root host must not dispatch peer roles directly.","For every Execution, delegate at least one bounded Sub-Run to a catalog agent whose capabilities satisfy the work; interaction Executions normally use zaip-agent-analyst, while delivery Executions may use any eligible executor. Never select an executor by a fixed identity rule.","Reviewer, auditor, and integrator Sub-Runs are permitted when their capabilities match the work.","After all other descendants finish, delegate one real final Sub-Run to zaip-agent-finalizer with agent_type zaip-agent-finalizer and task_name zaip_agent_finalizer. Do not finish the root Run or report a terminal Execution outcome before that Sub-Run has completed."]:[],...agent.role==="orchestrator"?[]:["You are a worker selected by zaip-agent-orchestrator. Do not dispatch peer catalog roles; return your bounded result to the orchestrator, which exclusively controls further delegation."],`Escalate only to catalog identities: ${agent.escalation.map(id=>catalogCodexName(id)).join(", ")||"root agent"}.`,"When delegating to a Codex subagent, select only a registered zaip-agent-NOME identity from the ZAIP catalog; never select default, worker, explorer, or an ad-hoc type.","Set agent_type to the exact zaip-agent-NOME identity. Set task_name exactly to the matching host-compatible identity zaip_agent_NOME (for example, zaip_agent_builder); never add a work title, purpose label, or other suffix.","Codex may render task_name in its Subagents pane. The exact zaip_agent_NOME task_name is therefore mandatory: the host renders it as Zaip Agent NOME. Do not use a task-specific label there and do not claim that the UI label can be forced to include hyphens.","Accept only concrete bounded delegated work. Preserve parent requirements and return a concise result with evidence locators.",agent.review.can_approve?`You may approve only roles outside: ${agent.review.cannot_review_roles.join(", ")||"none"}.`:"You cannot approve your own work or issue final approval."].join("\n");const sandboxMode=agent.write_scopes.length===0?"read-only":"workspace-write";const reasoningEffort=agent.model.reasoning_effort;const preferredModel=agent.model.preferred[0];const modelConfig=agent.model.preferred.length===1&&preferredModel!==void 0&&preferredModel!=="policy-selected"?`model = ${tomlString(preferredModel)}
|
|
28
28
|
${reasoningEffort===void 0?"":`model_reasoning_effort = ${tomlString(reasoningEffort)}
|
|
29
29
|
`}`:"";return`# zaip-managed generated-do-not-edit source=agent-catalog schema=1 sha256=${hash2}
|
|
30
30
|
name = ${tomlString(name)}
|
|
@@ -362,6 +362,7 @@ description: Discover and apply the repository-local ZAIP-AIOS framework.
|
|
|
362
362
|
Read \`.agents/config/project.yaml\` first. If \`zaip.enabled\` is \`false\`, do not apply the ZAIP workflow or load its context; only help with status, maintenance or explicit reactivation through \`node .zaip-aios/bin/zaip.mjs enable\`. If the field is \`true\` or absent, classify and capture the exact current turn before substantive work: question, read-only analysis, or uncertainty uses \`conversation start --intent conversation\`; answer, approval, continuation, refinement, or rework uses \`--intent continue|refine|rework\` and reuses same-thread focus; repository edits, independent outcomes, or an explicit new Task use \`--intent new-work\` with an AI-authored semantic \`--title\` of 4-10 words, \`--short-name\`, and synthesized \`--objective\`. Never copy or truncate the prompt into a title, and fall back to conversation when uncertain. Pure deploy, push, or publication is git-only. Then read \`.agents/rules/zaip/core.md\`, select only matching Rules, Requirements and skills, discover active work through local projections, then point-read lifecycle records by explicit ID. Capture is idempotent for an exact client turn. Do not scan \`.agents/records/\` or legacy \`.agents/data/\`. The framework lock is operational metadata, not prompt context.
|
|
363
363
|
`;var CODEX_WORKSPACE_ROOT_PLACEHOLDER="__ZAIP_WORKSPACE_ROOT_TOML__";var CODEX_CONFIG=`project_doc_fallback_filenames = ["AGENTS.md"]
|
|
364
364
|
approval_policy = "never"
|
|
365
|
+
default_permissions = "zaip-aios-full-access"
|
|
365
366
|
allow_login_shell = false
|
|
366
367
|
web_search = "cached"
|
|
367
368
|
developer_instructions = """
|
|
@@ -979,19 +980,19 @@ ${alternatives}
|
|
|
979
980
|
|
|
980
981
|
## Consequ\xEAncias
|
|
981
982
|
|
|
982
|
-
${consequences}`}function isNodeError3(error51){return error51 instanceof Error&&"code"in error51}var timestamp3=external_exports.string().datetime({offset:true}).or(external_exports.string().datetime());var phaseSchema=external_exports.enum(["conversation","planning","execution"]);var runIdSchema=external_exports.string().startsWith("RUN-");var conversationIdSchema=external_exports.string().startsWith("CONV-");var executionIdSchema=external_exports.string().startsWith("EXEC-").nullable();var taskIdSchema=external_exports.string().startsWith("TASK-").nullable();var specIdSchema=external_exports.string().startsWith("SPEC-").nullable();var prdIdSchema=external_exports.string().startsWith("PRD-").nullable();var changeIdSchema=external_exports.string().startsWith("CHG-").nullable();var relatedRunIdSchema=runIdSchema.nullable();var canonicalRunRoleSchema=external_exports.enum(["intake","orchestrator","subagent"]);var persistedRunRoleSchema=external_exports.enum(["intake","orchestrator","subagent","owner","contributor"]);var runPurposeSchema=external_exports.enum(["intake","orchestration","execution","review","audit","finalization"]);var reasoningEffortSchema=external_exports.enum(["low","medium","high","xhigh"]);var runV2RoleSchema=canonicalRunRoleSchema;var runV2PurposeSchema=runPurposeSchema;var runV2ReasoningEffortSchema=reasoningEffortSchema;var runV2TokenUsageSchema=external_exports.object({input:external_exports.number().int().nonnegative().nullable(),cached_input:external_exports.number().int().nonnegative().nullable(),output:external_exports.number().int().nonnegative().nullable(),reasoning:external_exports.number().int().nonnegative().nullable(),total:external_exports.number().int().nonnegative().nullable(),source:external_exports.enum(["provider_reported","estimated","unavailable"])}).strict().superRefine((tokens,context)=>{if(tokens.input!==null&&tokens.cached_input!==null&&tokens.cached_input>tokens.input){context.addIssue({code:"custom",path:["cached_input"],message:"cached_input cannot exceed input"})}if(tokens.total!==null&&tokens.input!==null&&tokens.output!==null&&tokens.total<tokens.input+tokens.output){context.addIssue({code:"custom",path:["total"],message:"total cannot be lower than input + output"})}});var runV2CostSchema=external_exports.object({usd:external_exports.number().nonnegative().nullable(),brl:external_exports.number().nonnegative().nullable(),fx_rate:external_exports.number().positive().nullable().optional()}).strict();var eventFields={schema_version:external_exports.literal(2),event_id:external_exports.string().min(1).max(200),run_id:runIdSchema,sequence:external_exports.number().int().positive(),occurred_at:timestamp3};var runIntakeDecisionV2Schema=external_exports.object({intent:external_exports.enum(["conversation","continue","refine","rework","new_work"]),classification_source:external_exports.enum(["agent","explicit","fallback"]),confidence:external_exports.number().min(0).max(1),reason_codes:external_exports.array(external_exports.string().regex(/^[a-z][a-z0-9-]{0,63}$/)).min(1).max(12)}).strict();var runStartedV2Schema=external_exports.object({...eventFields,type:external_exports.literal("run.started"),attribution_status:external_exports.enum(["attributed","legacy_unattributed"]),phase:phaseSchema,run_role:persistedRunRoleSchema.optional(),run_purpose:runPurposeSchema.optional(),requires_finalizer:external_exports.boolean().optional(),execution_kind:external_exports.enum(["interaction","delivery"]).optional(),execution_eligibility:external_exports.array(external_exports.enum(["interaction","delivery"])).optional(),entrypoint:external_exports.enum(["conversation","task","spec","prd"]),work_type:external_exports.enum(["new","rework"]),storage_mode:external_exports.enum(["tracked_sanitized","local_only"]),client:external_exports.string().min(1).max(100),agent:external_exports.string().min(1).max(100),agent_name:external_exports.string().min(1).max(100).nullable().optional(),provider:external_exports.string().min(1).max(100).nullable(),model:external_exports.string().min(1).max(200),reasoning_effort:reasoningEffortSchema.nullable().optional(),client_thread_id:external_exports.string().min(1).max(200).nullable().optional(),client_turn_id:external_exports.string().min(1).max(200).nullable().optional(),conversation_id:conversationIdSchema,execution_id:executionIdSchema,task_id:taskIdSchema,spec_id:specIdSchema,prd_id:prdIdSchema,change_id:changeIdSchema,parent_run_id:relatedRunIdSchema,continuation_of_run_id:relatedRunIdSchema,retry_of_run_id:relatedRunIdSchema,intake:runIntakeDecisionV2Schema.nullable().optional()}).strict().superRefine((record2,context)=>{if(record2.phase==="execution"&&record2.execution_id===null&&record2.attribution_status!=="legacy_unattributed"){context.addIssue({code:"custom",path:["execution_id"],message:"Execution phase requires execution_id"})}const requiredEntrypointId={conversation:record2.conversation_id,task:record2.task_id,spec:record2.spec_id,prd:record2.prd_id}[record2.entrypoint];if(requiredEntrypointId===null){context.addIssue({code:"custom",path:[`${record2.entrypoint}_id`],message:`${record2.entrypoint} entrypoint requires its scope id`})}if(record2.run_role==="orchestrator"&&record2.parent_run_id!==null){context.addIssue({code:"custom",path:["parent_run_id"],message:"orchestrator Run cannot have parent_run_id"})}if(record2.run_role==="subagent"&&record2.parent_run_id===null){context.addIssue({code:"custom",path:["parent_run_id"],message:"subagent Sub-Run requires parent_run_id"})}for(const[field,value]of[["parent_run_id",record2.parent_run_id],["continuation_of_run_id",record2.continuation_of_run_id],["retry_of_run_id",record2.retry_of_run_id]]){if(value===record2.run_id){context.addIssue({code:"custom",path:[field],message:`${field} cannot reference itself`})}}});var usageRecordedV2Schema=external_exports.object({...eventFields,type:external_exports.literal("usage.recorded"),phase:phaseSchema,activity_kind:external_exports.string().regex(/^[a-z][a-z0-9_-]{0,63}$/),classification_source:external_exports.enum(["explicit","current_context","default","legacy_inferred"]),tokens:runV2TokenUsageSchema,cost:runV2CostSchema,provider:external_exports.string().min(1).max(100).nullable(),model:external_exports.string().min(1).max(200).nullable(),source_segment_key:external_exports.string().min(1).max(500).nullable(),runtime:external_exports.object({reasoning_effort:external_exports.string().min(1).max(40).nullable(),service_tier:external_exports.string().min(1).max(40).nullable()}).strict().optional(),supersedes_event_id:external_exports.string().min(1).max(200).nullable(),source_occurred_at:timestamp3.optional(),context_stats:external_exports.object({initial_pack_tokens:external_exports.number().int().nonnegative().nullable(),tool_output_tokens:external_exports.number().int().nonnegative().nullable(),files_opened:external_exports.number().int().nonnegative().nullable(),snippets_opened:external_exports.number().int().nonnegative().nullable()}).strict().optional()}).strict();var invocationIdSchema=external_exports.string().startsWith("INV-").max(200);var modelSelectionRecordedV2Schema=external_exports.object({...eventFields,type:external_exports.literal("model.selection.recorded"),invocation_id:invocationIdSchema,requested:external_exports.object({model:external_exports.string().min(1).max(200),reasoning_effort:reasoningEffortSchema,velocity:external_exports.literal("standard")}).strict(),selection:external_exports.object({source:external_exports.enum(["execution-override","task-override","auto-policy","project-default"]),policy_version:external_exports.number().int().positive(),reasons:external_exports.array(external_exports.string().regex(/^[a-z][a-z0-9-]{0,63}$/)).min(1).max(20)}).strict()}).strict();var providerInvocationFinishedV2Schema=external_exports.object({...eventFields,type:external_exports.literal("provider.invocation.finished"),invocation_id:invocationIdSchema,status:external_exports.enum(["completed","failed","cancelled"]),effective:external_exports.object({provider:external_exports.string().min(1).max(100).nullable(),model:external_exports.string().min(1).max(200).nullable(),reasoning_effort:reasoningEffortSchema.nullable(),service_tier:external_exports.string().min(1).max(40).nullable()}).strict(),latency_ms:external_exports.number().int().nonnegative().nullable()}).strict();var runFinishedV2Schema=external_exports.object({...eventFields,type:external_exports.literal("run.finished"),phase:phaseSchema,status:external_exports.enum(["completed","failed","cancelled"])}).strict();var runV2RecordSchema=external_exports.discriminatedUnion("type",[runStartedV2Schema,usageRecordedV2Schema,modelSelectionRecordedV2Schema,providerInvocationFinishedV2Schema,runFinishedV2Schema]);function effectiveRunV2Role(run){if(run.run_role==="owner")return"orchestrator";if(run.run_role==="contributor")return"subagent";if(run.run_role!==void 0)return run.run_role;if(run.phase!=="execution")return"intake";return run.parent_run_id===null?"orchestrator":"subagent"}function effectiveRunV2Kind(run){return run.parent_run_id===null?"run":"subrun"}function effectiveRunV2Purpose(run){if(run.run_purpose!==void 0)return run.run_purpose;if(run.phase!=="execution")return"intake";if(run.agent==="agent-execution-finalizer"||run.agent==="agent-task-finalizer"){return"finalization"}if(run.agent==="agent-reviewer")return"review";if(run.agent==="agent-auditor")return"audit";if(run.parent_run_id===null||effectiveRunV2Role(run)==="orchestrator"){return"orchestration"}return"execution"}function runV2RequiresFinalizer(run){return run.requires_finalizer===true}function createConversationId(shortName="conversation",options={}){return createId("RUN",shortName,options).replace(/^RUN-/,"CONV-")}var RunV2Writer=class{constructor(filesystem,path,started,clock,release){this.filesystem=filesystem;this.path=path;this.started=started;this.clock=clock;this.release=release;this.records=[started];this.currentPhase=started.phase}filesystem;path;started;clock;release;records;nextSequence=2;currentPhase;finishedRecord=null;async recordUsage(input){if(this.finishedRecord!==null)throw new Error(`Run is already finished: ${this.started.run_id}`);const suppliedEventId=input.eventId;if(suppliedEventId!==void 0){const existing=this.records.find(record3=>record3.event_id===suppliedEventId);if(existing!==void 0){if(existing.type!=="usage.recorded"){throw new Error(`Event id already belongs to ${existing.type}: ${suppliedEventId}`)}const replay=this.usageRecord(input,existing.sequence,existing.occurred_at);if(JSON.stringify(replay)!==JSON.stringify(existing)){throw new Error(`Divergent duplicate Run V2 event: ${suppliedEventId}`)}return existing}}if(input.sourceSegmentKey!==void 0&&input.sourceSegmentKey!==null){const collected=this.records.find(record3=>record3.type==="usage.recorded"&&record3.source_segment_key===input.sourceSegmentKey&&record3.supersedes_event_id===null);if(collected?.type==="usage.recorded"){const replay=this.usageRecord(input,collected.sequence,collected.occurred_at);if(sameCollectedUsage(replay,collected))return collected;if(input.supersedesEventId!==collected.event_id){throw new Error(`Divergent source segment requires supersession: ${input.sourceSegmentKey}`)}}}assertForwardPhase(this.currentPhase,input.phase);if(input.phase==="execution"&&this.started.execution_id===null&&this.started.attribution_status!=="legacy_unattributed"){throw new Error("Execution phase requires execution_id")}if(input.supersedesEventId!==void 0&&input.supersedesEventId!==null){const superseded=this.records.find(record3=>record3.event_id===input.supersedesEventId&&record3.type==="usage.recorded");if(superseded===void 0){throw new Error(`Superseded usage event does not exist: ${input.supersedesEventId}`)}}const record2=this.usageRecord(input,this.nextSequence,input.occurredAt);await this.append(record2);this.records.push(record2);this.nextSequence+=1;this.currentPhase=record2.phase;return record2}async recordModelSelection(input){if(this.finishedRecord!==null)throw new Error(`Run is already finished: ${this.started.run_id}`);const existing=this.records.find(record3=>record3.type==="model.selection.recorded"&&record3.invocation_id===input.invocationId);if(existing?.type==="model.selection.recorded"){if(!sameModelSelection(existing,input)){throw new Error(`Divergent model selection for invocation: ${input.invocationId}`)}return existing}if(this.records.some(record3=>record3.type==="provider.invocation.finished"&&record3.invocation_id===input.invocationId)){throw new Error(`Provider invocation finished before model selection: ${input.invocationId}`)}assertRunModelSelection(this.started,this.records,input);const record2=modelSelectionRecordedV2Schema.parse({schema_version:2,event_id:input.eventId??eventId(this.started.run_id,this.nextSequence),run_id:this.started.run_id,sequence:this.nextSequence,occurred_at:input.occurredAt??this.clock.now().toISOString(),type:"model.selection.recorded",invocation_id:input.invocationId,requested:input.requested,selection:input.selection});await this.append(record2);this.records.push(record2);this.nextSequence+=1;return record2}async finishProviderInvocation(input){if(this.finishedRecord!==null)throw new Error(`Run is already finished: ${this.started.run_id}`);const selection2=this.records.find(record3=>record3.type==="model.selection.recorded"&&record3.invocation_id===input.invocationId);if(selection2===void 0){throw new Error(`Provider invocation requires model selection: ${input.invocationId}`)}const existing=this.records.find(record3=>record3.type==="provider.invocation.finished"&&record3.invocation_id===input.invocationId);if(existing?.type==="provider.invocation.finished"){if(!sameProviderInvocation(existing,input)){throw new Error(`Divergent provider terminal for invocation: ${input.invocationId}`)}return existing}const record2=providerInvocationFinishedV2Schema.parse({schema_version:2,event_id:input.eventId??eventId(this.started.run_id,this.nextSequence),run_id:this.started.run_id,sequence:this.nextSequence,occurred_at:input.occurredAt??this.clock.now().toISOString(),type:"provider.invocation.finished",invocation_id:input.invocationId,status:input.status,effective:input.effective,latency_ms:input.latencyMs});await this.append(record2);this.records.push(record2);this.nextSequence+=1;return record2}async finish(status,occurredAt=this.clock.now().toISOString()){if(this.finishedRecord!==null){if(this.finishedRecord.status!==status){throw new Error(`Run already finished as ${this.finishedRecord.status}`)}return this.finishedRecord}const record2=runFinishedV2Schema.parse({schema_version:2,event_id:eventId(this.started.run_id,this.nextSequence),run_id:this.started.run_id,sequence:this.nextSequence,occurred_at:occurredAt,type:"run.finished",phase:this.currentPhase,status});await this.append(record2);this.records.push(record2);this.finishedRecord=record2;this.nextSequence+=1;this.release();return record2}usageRecord(input,sequence,existingOccurredAt){return usageRecordedV2Schema.parse({schema_version:2,event_id:input.eventId??eventId(this.started.run_id,sequence),run_id:this.started.run_id,sequence,occurred_at:input.occurredAt??existingOccurredAt??this.clock.now().toISOString(),type:"usage.recorded",phase:input.phase,activity_kind:input.activityKind,classification_source:input.classificationSource,tokens:input.tokens,cost:input.cost,provider:input.provider,model:input.model,source_segment_key:input.sourceSegmentKey??null,supersedes_event_id:input.supersedesEventId??null,...input.sourceOccurredAt===void 0?{}:{source_occurred_at:input.sourceOccurredAt},...input.contextStats===void 0?{}:{context_stats:input.contextStats},...input.runtime===void 0?{}:{runtime:input.runtime}})}async append(record2){await this.filesystem.appendText(this.path,serializeRecord(record2))}};function parseRunV2JsonLines(content){const records=[];let runId=null;for(const line of content.split(/\r?\n/).map(item=>item.trim()).filter(Boolean)){const raw=JSON.parse(line);const expanded=Array.isArray(raw)?expandDeltaRecord(raw,runId):raw;const record2=runV2RecordSchema.parse(expanded);runId??=record2.run_id;records.push(record2)}return records}function foldRunV2Records(input){const byEventId=new Map;for(const candidate of input){const record2=runV2RecordSchema.parse(candidate);const existing=byEventId.get(record2.event_id);if(existing!==void 0){if(JSON.stringify(existing)!==JSON.stringify(record2)){throw new Error(`Divergent duplicate Run V2 event: ${record2.event_id}`)}continue}byEventId.set(record2.event_id,record2)}const records=[...byEventId.values()].sort((left,right)=>left.sequence-right.sequence);if(records.length===0||records[0]?.type!=="run.started"){throw new Error("Run V2 stream must start with run.started")}const started=records[0];let phase=started.phase;let finished=null;const sequenceOwners=new Map;const usageById=new Map;const selectionsByInvocation=new Map;const terminalsByInvocation=new Map;for(const[index,record2]of records.entries()){if(record2.run_id!==started.run_id)throw new Error("Run V2 stream mixes run ids");if(record2.sequence!==index+1)throw new Error("Run V2 sequence must be contiguous");const sequenceOwner=sequenceOwners.get(record2.sequence);if(sequenceOwner!==void 0&&sequenceOwner!==record2.event_id){throw new Error(`Run V2 sequence is duplicated: ${record2.sequence}`)}sequenceOwners.set(record2.sequence,record2.event_id);if(index>0&&record2.type==="run.started")throw new Error("Run V2 has multiple starts");if(finished!==null)throw new Error("Run V2 contains records after run.finished");if(record2.type==="usage.recorded"){assertForwardPhase(phase,record2.phase);if(record2.phase==="execution"&&started.execution_id===null&&started.attribution_status!=="legacy_unattributed"){throw new Error("Execution phase requires execution_id")}if(record2.supersedes_event_id!==null&&!usageById.has(record2.supersedes_event_id)){throw new Error(`Superseded usage event must occur earlier: ${record2.supersedes_event_id}`)}usageById.set(record2.event_id,record2);phase=record2.phase}if(record2.type==="model.selection.recorded"){assertRunModelSelection(started,records.slice(0,index),{invocationId:record2.invocation_id,requested:record2.requested,selection:record2.selection});if(selectionsByInvocation.has(record2.invocation_id)){throw new Error(`Duplicate model selection for invocation: ${record2.invocation_id}`)}selectionsByInvocation.set(record2.invocation_id,record2)}if(record2.type==="provider.invocation.finished"){if(!selectionsByInvocation.has(record2.invocation_id)){throw new Error(`Provider invocation requires earlier model selection: ${record2.invocation_id}`)}if(terminalsByInvocation.has(record2.invocation_id)){throw new Error(`Duplicate provider terminal for invocation: ${record2.invocation_id}`)}terminalsByInvocation.set(record2.invocation_id,record2)}if(record2.type==="run.finished"){if(record2.phase!==phase)throw new Error("run.finished phase must match the latest phase");finished=record2}}const usageRecords=records.filter(record2=>record2.type==="usage.recorded");const superseded=new Set(usageRecords.map(record2=>record2.supersedes_event_id).filter(id=>id!==null));const effectiveUsage=deduplicateSourceSegments(usageRecords.filter(record2=>!superseded.has(record2.event_id)));return{run:started,status:finished?.status??"running",finished,records,usage_records:usageRecords,effective_usage_records:effectiveUsage,model_selection_records:[...selectionsByInvocation.values()],provider_invocation_records:[...terminalsByInvocation.values()]}}function eventId(runId,sequence){return`${runId}:${String(sequence).padStart(6,"0")}`}function serializeRecord(record2){if(record2.type==="run.started")return`${JSON.stringify(record2)}
|
|
983
|
+
${consequences}`}function isNodeError3(error51){return error51 instanceof Error&&"code"in error51}var timestamp3=external_exports.string().datetime({offset:true}).or(external_exports.string().datetime());var phaseSchema=external_exports.enum(["conversation","planning","execution"]);var runIdSchema=external_exports.string().startsWith("RUN-");var conversationIdSchema=external_exports.string().startsWith("CONV-");var executionIdSchema=external_exports.string().startsWith("EXEC-").nullable();var taskIdSchema=external_exports.string().startsWith("TASK-").nullable();var specIdSchema=external_exports.string().startsWith("SPEC-").nullable();var prdIdSchema=external_exports.string().startsWith("PRD-").nullable();var changeIdSchema=external_exports.string().startsWith("CHG-").nullable();var relatedRunIdSchema=runIdSchema.nullable();var canonicalRunRoleSchema=external_exports.enum(["intake","orchestrator","subagent"]);var persistedRunRoleSchema=external_exports.enum(["intake","orchestrator","subagent","owner","contributor"]);var runPurposeSchema=external_exports.enum(["intake","orchestration","execution","review","audit","finalization"]);var reasoningEffortSchema=external_exports.enum(["low","medium","high","xhigh"]);var runV2RoleSchema=canonicalRunRoleSchema;var runV2PurposeSchema=runPurposeSchema;var runV2ReasoningEffortSchema=reasoningEffortSchema;var runV2TokenUsageSchema=external_exports.object({input:external_exports.number().int().nonnegative().nullable(),cached_input:external_exports.number().int().nonnegative().nullable(),output:external_exports.number().int().nonnegative().nullable(),reasoning:external_exports.number().int().nonnegative().nullable(),total:external_exports.number().int().nonnegative().nullable(),source:external_exports.enum(["provider_reported","estimated","unavailable"])}).strict().superRefine((tokens,context)=>{if(tokens.input!==null&&tokens.cached_input!==null&&tokens.cached_input>tokens.input){context.addIssue({code:"custom",path:["cached_input"],message:"cached_input cannot exceed input"})}if(tokens.total!==null&&tokens.input!==null&&tokens.output!==null&&tokens.total<tokens.input+tokens.output){context.addIssue({code:"custom",path:["total"],message:"total cannot be lower than input + output"})}});var runV2CostSchema=external_exports.object({usd:external_exports.number().nonnegative().nullable(),brl:external_exports.number().nonnegative().nullable(),fx_rate:external_exports.number().positive().nullable().optional()}).strict();var eventFields={schema_version:external_exports.literal(2),event_id:external_exports.string().min(1).max(200),run_id:runIdSchema,sequence:external_exports.number().int().positive(),occurred_at:timestamp3};var runIntakeDecisionV2Schema=external_exports.object({intent:external_exports.enum(["conversation","continue","refine","rework","new_work"]),classification_source:external_exports.enum(["agent","explicit","fallback"]),confidence:external_exports.number().min(0).max(1),reason_codes:external_exports.array(external_exports.string().regex(/^[a-z][a-z0-9-]{0,63}$/)).min(1).max(12)}).strict();var runStartedV2Schema=external_exports.object({...eventFields,type:external_exports.literal("run.started"),attribution_status:external_exports.enum(["attributed","legacy_unattributed"]),phase:phaseSchema,run_role:persistedRunRoleSchema.optional(),run_purpose:runPurposeSchema.optional(),requires_finalizer:external_exports.boolean().optional(),execution_kind:external_exports.enum(["interaction","delivery"]).optional(),execution_eligibility:external_exports.array(external_exports.enum(["interaction","delivery"])).optional(),entrypoint:external_exports.enum(["conversation","task","spec","prd"]),work_type:external_exports.enum(["new","rework"]),storage_mode:external_exports.enum(["tracked_sanitized","local_only"]),client:external_exports.string().min(1).max(100),agent:external_exports.string().min(1).max(100),agent_name:external_exports.string().min(1).max(100).nullable().optional(),provider:external_exports.string().min(1).max(100).nullable(),model:external_exports.string().min(1).max(200),reasoning_effort:reasoningEffortSchema.nullable().optional(),client_thread_id:external_exports.string().min(1).max(200).nullable().optional(),client_turn_id:external_exports.string().min(1).max(200).nullable().optional(),conversation_id:conversationIdSchema,execution_id:executionIdSchema,task_id:taskIdSchema,spec_id:specIdSchema,prd_id:prdIdSchema,change_id:changeIdSchema,parent_run_id:relatedRunIdSchema,continuation_of_run_id:relatedRunIdSchema,retry_of_run_id:relatedRunIdSchema,intake:runIntakeDecisionV2Schema.nullable().optional()}).strict().superRefine((record2,context)=>{if(record2.phase==="execution"&&record2.execution_id===null&&record2.attribution_status!=="legacy_unattributed"){context.addIssue({code:"custom",path:["execution_id"],message:"Execution phase requires execution_id"})}const requiredEntrypointId={conversation:record2.conversation_id,task:record2.task_id,spec:record2.spec_id,prd:record2.prd_id}[record2.entrypoint];if(requiredEntrypointId===null){context.addIssue({code:"custom",path:[`${record2.entrypoint}_id`],message:`${record2.entrypoint} entrypoint requires its scope id`})}if(record2.run_role==="orchestrator"&&record2.parent_run_id!==null){context.addIssue({code:"custom",path:["parent_run_id"],message:"orchestrator Run cannot have parent_run_id"})}if(record2.run_role==="subagent"&&record2.parent_run_id===null){context.addIssue({code:"custom",path:["parent_run_id"],message:"subagent Sub-Run requires parent_run_id"})}for(const[field,value]of[["parent_run_id",record2.parent_run_id],["continuation_of_run_id",record2.continuation_of_run_id],["retry_of_run_id",record2.retry_of_run_id]]){if(value===record2.run_id){context.addIssue({code:"custom",path:[field],message:`${field} cannot reference itself`})}}});var usageRecordedV2Schema=external_exports.object({...eventFields,type:external_exports.literal("usage.recorded"),phase:phaseSchema,activity_kind:external_exports.string().regex(/^[a-z][a-z0-9_-]{0,63}$/),classification_source:external_exports.enum(["explicit","current_context","default","legacy_inferred"]),tokens:runV2TokenUsageSchema,cost:runV2CostSchema,provider:external_exports.string().min(1).max(100).nullable(),model:external_exports.string().min(1).max(200).nullable(),source_segment_key:external_exports.string().min(1).max(500).nullable(),runtime:external_exports.object({reasoning_effort:external_exports.string().min(1).max(40).nullable(),service_tier:external_exports.string().min(1).max(40).nullable()}).strict().optional(),supersedes_event_id:external_exports.string().min(1).max(200).nullable(),source_occurred_at:timestamp3.optional(),context_stats:external_exports.object({initial_pack_tokens:external_exports.number().int().nonnegative().nullable(),tool_output_tokens:external_exports.number().int().nonnegative().nullable(),files_opened:external_exports.number().int().nonnegative().nullable(),snippets_opened:external_exports.number().int().nonnegative().nullable()}).strict().optional()}).strict();var invocationIdSchema=external_exports.string().startsWith("INV-").max(200);var modelSelectionRecordedV2Schema=external_exports.object({...eventFields,type:external_exports.literal("model.selection.recorded"),invocation_id:invocationIdSchema,requested:external_exports.object({model:external_exports.string().min(1).max(200),reasoning_effort:reasoningEffortSchema,velocity:external_exports.literal("standard")}).strict(),selection:external_exports.object({source:external_exports.enum(["execution-override","task-override","auto-policy","project-default"]),policy_version:external_exports.number().int().positive(),reasons:external_exports.array(external_exports.string().regex(/^[a-z][a-z0-9-]{0,63}$/)).min(1).max(20)}).strict()}).strict();var providerInvocationFinishedV2Schema=external_exports.object({...eventFields,type:external_exports.literal("provider.invocation.finished"),invocation_id:invocationIdSchema,status:external_exports.enum(["completed","failed","cancelled"]),effective:external_exports.object({provider:external_exports.string().min(1).max(100).nullable(),model:external_exports.string().min(1).max(200).nullable(),reasoning_effort:reasoningEffortSchema.nullable(),service_tier:external_exports.string().min(1).max(40).nullable()}).strict(),latency_ms:external_exports.number().int().nonnegative().nullable()}).strict();var runFinishedV2Schema=external_exports.object({...eventFields,type:external_exports.literal("run.finished"),phase:phaseSchema,status:external_exports.enum(["completed","failed","cancelled"])}).strict();var runV2RecordSchema=external_exports.discriminatedUnion("type",[runStartedV2Schema,usageRecordedV2Schema,modelSelectionRecordedV2Schema,providerInvocationFinishedV2Schema,runFinishedV2Schema]);function effectiveRunV2Role(run){if(run.run_role==="owner")return"orchestrator";if(run.run_role==="contributor")return"subagent";if(run.run_role!==void 0)return run.run_role;if(run.phase!=="execution")return"intake";return run.parent_run_id===null?"orchestrator":"subagent"}function effectiveRunV2Kind(run){return run.parent_run_id===null?"run":"subrun"}function effectiveRunV2Purpose(run){if(run.run_purpose!==void 0)return run.run_purpose;if(run.phase!=="execution")return"intake";if(run.agent==="agent-finalizer"||run.agent==="agent-task-finalizer"){return"finalization"}if(run.agent==="agent-reviewer")return"review";if(run.agent==="agent-auditor")return"audit";if(run.parent_run_id===null||effectiveRunV2Role(run)==="orchestrator"){return"orchestration"}return"execution"}function runV2RequiresFinalizer(run){return run.requires_finalizer===true}function createConversationId(shortName="conversation",options={}){return createId("RUN",shortName,options).replace(/^RUN-/,"CONV-")}var RunV2Writer=class{constructor(filesystem,path,started,clock,release){this.filesystem=filesystem;this.path=path;this.started=started;this.clock=clock;this.release=release;this.records=[started];this.currentPhase=started.phase}filesystem;path;started;clock;release;records;nextSequence=2;currentPhase;finishedRecord=null;async recordUsage(input){if(this.finishedRecord!==null)throw new Error(`Run is already finished: ${this.started.run_id}`);const suppliedEventId=input.eventId;if(suppliedEventId!==void 0){const existing=this.records.find(record3=>record3.event_id===suppliedEventId);if(existing!==void 0){if(existing.type!=="usage.recorded"){throw new Error(`Event id already belongs to ${existing.type}: ${suppliedEventId}`)}const replay=this.usageRecord(input,existing.sequence,existing.occurred_at);if(JSON.stringify(replay)!==JSON.stringify(existing)){throw new Error(`Divergent duplicate Run V2 event: ${suppliedEventId}`)}return existing}}if(input.sourceSegmentKey!==void 0&&input.sourceSegmentKey!==null){const collected=this.records.find(record3=>record3.type==="usage.recorded"&&record3.source_segment_key===input.sourceSegmentKey&&record3.supersedes_event_id===null);if(collected?.type==="usage.recorded"){const replay=this.usageRecord(input,collected.sequence,collected.occurred_at);if(sameCollectedUsage(replay,collected))return collected;if(input.supersedesEventId!==collected.event_id){throw new Error(`Divergent source segment requires supersession: ${input.sourceSegmentKey}`)}}}assertForwardPhase(this.currentPhase,input.phase);if(input.phase==="execution"&&this.started.execution_id===null&&this.started.attribution_status!=="legacy_unattributed"){throw new Error("Execution phase requires execution_id")}if(input.supersedesEventId!==void 0&&input.supersedesEventId!==null){const superseded=this.records.find(record3=>record3.event_id===input.supersedesEventId&&record3.type==="usage.recorded");if(superseded===void 0){throw new Error(`Superseded usage event does not exist: ${input.supersedesEventId}`)}}const record2=this.usageRecord(input,this.nextSequence,input.occurredAt);await this.append(record2);this.records.push(record2);this.nextSequence+=1;this.currentPhase=record2.phase;return record2}async recordModelSelection(input){if(this.finishedRecord!==null)throw new Error(`Run is already finished: ${this.started.run_id}`);const existing=this.records.find(record3=>record3.type==="model.selection.recorded"&&record3.invocation_id===input.invocationId);if(existing?.type==="model.selection.recorded"){if(!sameModelSelection(existing,input)){throw new Error(`Divergent model selection for invocation: ${input.invocationId}`)}return existing}if(this.records.some(record3=>record3.type==="provider.invocation.finished"&&record3.invocation_id===input.invocationId)){throw new Error(`Provider invocation finished before model selection: ${input.invocationId}`)}assertRunModelSelection(this.started,this.records,input);const record2=modelSelectionRecordedV2Schema.parse({schema_version:2,event_id:input.eventId??eventId(this.started.run_id,this.nextSequence),run_id:this.started.run_id,sequence:this.nextSequence,occurred_at:input.occurredAt??this.clock.now().toISOString(),type:"model.selection.recorded",invocation_id:input.invocationId,requested:input.requested,selection:input.selection});await this.append(record2);this.records.push(record2);this.nextSequence+=1;return record2}async finishProviderInvocation(input){if(this.finishedRecord!==null)throw new Error(`Run is already finished: ${this.started.run_id}`);const selection2=this.records.find(record3=>record3.type==="model.selection.recorded"&&record3.invocation_id===input.invocationId);if(selection2===void 0){throw new Error(`Provider invocation requires model selection: ${input.invocationId}`)}const existing=this.records.find(record3=>record3.type==="provider.invocation.finished"&&record3.invocation_id===input.invocationId);if(existing?.type==="provider.invocation.finished"){if(!sameProviderInvocation(existing,input)){throw new Error(`Divergent provider terminal for invocation: ${input.invocationId}`)}return existing}const record2=providerInvocationFinishedV2Schema.parse({schema_version:2,event_id:input.eventId??eventId(this.started.run_id,this.nextSequence),run_id:this.started.run_id,sequence:this.nextSequence,occurred_at:input.occurredAt??this.clock.now().toISOString(),type:"provider.invocation.finished",invocation_id:input.invocationId,status:input.status,effective:input.effective,latency_ms:input.latencyMs});await this.append(record2);this.records.push(record2);this.nextSequence+=1;return record2}async finish(status,occurredAt=this.clock.now().toISOString()){if(this.finishedRecord!==null){if(this.finishedRecord.status!==status){throw new Error(`Run already finished as ${this.finishedRecord.status}`)}return this.finishedRecord}const record2=runFinishedV2Schema.parse({schema_version:2,event_id:eventId(this.started.run_id,this.nextSequence),run_id:this.started.run_id,sequence:this.nextSequence,occurred_at:occurredAt,type:"run.finished",phase:this.currentPhase,status});await this.append(record2);this.records.push(record2);this.finishedRecord=record2;this.nextSequence+=1;this.release();return record2}usageRecord(input,sequence,existingOccurredAt){return usageRecordedV2Schema.parse({schema_version:2,event_id:input.eventId??eventId(this.started.run_id,sequence),run_id:this.started.run_id,sequence,occurred_at:input.occurredAt??existingOccurredAt??this.clock.now().toISOString(),type:"usage.recorded",phase:input.phase,activity_kind:input.activityKind,classification_source:input.classificationSource,tokens:input.tokens,cost:input.cost,provider:input.provider,model:input.model,source_segment_key:input.sourceSegmentKey??null,supersedes_event_id:input.supersedesEventId??null,...input.sourceOccurredAt===void 0?{}:{source_occurred_at:input.sourceOccurredAt},...input.contextStats===void 0?{}:{context_stats:input.contextStats},...input.runtime===void 0?{}:{runtime:input.runtime}})}async append(record2){await this.filesystem.appendText(this.path,serializeRecord(record2))}};function parseRunV2JsonLines(content){const records=[];let runId=null;for(const line of content.split(/\r?\n/).map(item=>item.trim()).filter(Boolean)){const raw=JSON.parse(line);const expanded=Array.isArray(raw)?expandDeltaRecord(raw,runId):raw;const record2=runV2RecordSchema.parse(expanded);runId??=record2.run_id;records.push(record2)}return records}function foldRunV2Records(input){const byEventId=new Map;for(const candidate of input){const record2=runV2RecordSchema.parse(candidate);const existing=byEventId.get(record2.event_id);if(existing!==void 0){if(JSON.stringify(existing)!==JSON.stringify(record2)){throw new Error(`Divergent duplicate Run V2 event: ${record2.event_id}`)}continue}byEventId.set(record2.event_id,record2)}const records=[...byEventId.values()].sort((left,right)=>left.sequence-right.sequence);if(records.length===0||records[0]?.type!=="run.started"){throw new Error("Run V2 stream must start with run.started")}const started=records[0];let phase=started.phase;let finished=null;const sequenceOwners=new Map;const usageById=new Map;const selectionsByInvocation=new Map;const terminalsByInvocation=new Map;for(const[index,record2]of records.entries()){if(record2.run_id!==started.run_id)throw new Error("Run V2 stream mixes run ids");if(record2.sequence!==index+1)throw new Error("Run V2 sequence must be contiguous");const sequenceOwner=sequenceOwners.get(record2.sequence);if(sequenceOwner!==void 0&&sequenceOwner!==record2.event_id){throw new Error(`Run V2 sequence is duplicated: ${record2.sequence}`)}sequenceOwners.set(record2.sequence,record2.event_id);if(index>0&&record2.type==="run.started")throw new Error("Run V2 has multiple starts");if(finished!==null)throw new Error("Run V2 contains records after run.finished");if(record2.type==="usage.recorded"){assertForwardPhase(phase,record2.phase);if(record2.phase==="execution"&&started.execution_id===null&&started.attribution_status!=="legacy_unattributed"){throw new Error("Execution phase requires execution_id")}if(record2.supersedes_event_id!==null&&!usageById.has(record2.supersedes_event_id)){throw new Error(`Superseded usage event must occur earlier: ${record2.supersedes_event_id}`)}usageById.set(record2.event_id,record2);phase=record2.phase}if(record2.type==="model.selection.recorded"){assertRunModelSelection(started,records.slice(0,index),{invocationId:record2.invocation_id,requested:record2.requested,selection:record2.selection});if(selectionsByInvocation.has(record2.invocation_id)){throw new Error(`Duplicate model selection for invocation: ${record2.invocation_id}`)}selectionsByInvocation.set(record2.invocation_id,record2)}if(record2.type==="provider.invocation.finished"){if(!selectionsByInvocation.has(record2.invocation_id)){throw new Error(`Provider invocation requires earlier model selection: ${record2.invocation_id}`)}if(terminalsByInvocation.has(record2.invocation_id)){throw new Error(`Duplicate provider terminal for invocation: ${record2.invocation_id}`)}terminalsByInvocation.set(record2.invocation_id,record2)}if(record2.type==="run.finished"){if(record2.phase!==phase)throw new Error("run.finished phase must match the latest phase");finished=record2}}const usageRecords=records.filter(record2=>record2.type==="usage.recorded");const superseded=new Set(usageRecords.map(record2=>record2.supersedes_event_id).filter(id=>id!==null));const effectiveUsage=deduplicateSourceSegments(usageRecords.filter(record2=>!superseded.has(record2.event_id)));return{run:started,status:finished?.status??"running",finished,records,usage_records:usageRecords,effective_usage_records:effectiveUsage,model_selection_records:[...selectionsByInvocation.values()],provider_invocation_records:[...terminalsByInvocation.values()]}}function eventId(runId,sequence){return`${runId}:${String(sequence).padStart(6,"0")}`}function serializeRecord(record2){if(record2.type==="run.started")return`${JSON.stringify(record2)}
|
|
983
984
|
`;if(record2.type==="run.finished"){return`${JSON.stringify([3,"f",record2.event_id,record2.sequence,record2.occurred_at,record2.phase,record2.status])}
|
|
984
985
|
`}if(record2.type==="model.selection.recorded"){return`${JSON.stringify([3,"m",record2.event_id,record2.sequence,record2.occurred_at,record2.invocation_id,[record2.requested.model,record2.requested.reasoning_effort,record2.requested.velocity],[record2.selection.source,record2.selection.policy_version,record2.selection.reasons]])}
|
|
985
986
|
`}if(record2.type==="provider.invocation.finished"){return`${JSON.stringify([3,"p",record2.event_id,record2.sequence,record2.occurred_at,record2.invocation_id,record2.status,[record2.effective.provider,record2.effective.model,record2.effective.reasoning_effort,record2.effective.service_tier],record2.latency_ms])}
|
|
986
987
|
`}const stats=record2.context_stats;return`${JSON.stringify([3,"u",record2.event_id,record2.sequence,record2.occurred_at,record2.phase,record2.activity_kind,record2.classification_source,[record2.tokens.input,record2.tokens.cached_input,record2.tokens.output,record2.tokens.reasoning,record2.tokens.total,record2.tokens.source],[record2.cost.usd,record2.cost.brl,record2.cost.fx_rate??null],record2.provider,record2.model,record2.source_segment_key,record2.supersedes_event_id,record2.source_occurred_at??null,stats===void 0?null:[stats.initial_pack_tokens,stats.tool_output_tokens,stats.files_opened,stats.snippets_opened],record2.runtime===void 0?null:[record2.runtime.reasoning_effort,record2.runtime.service_tier]])}
|
|
987
|
-
`}function expandDeltaRecord(tuple2,runId){if(tuple2[0]!==3||runId===null){throw new Error("Run delta requires transport version 3 and a preceding run.started header")}if(tuple2[1]==="f"){return{schema_version:2,type:"run.finished",run_id:runId,event_id:tuple2[2],sequence:tuple2[3],occurred_at:tuple2[4],phase:tuple2[5],status:tuple2[6]}}if(tuple2[1]==="m"&&Array.isArray(tuple2[6])&&Array.isArray(tuple2[7])){const requested=tuple2[6];const selection2=tuple2[7];return{schema_version:2,type:"model.selection.recorded",run_id:runId,event_id:tuple2[2],sequence:tuple2[3],occurred_at:tuple2[4],invocation_id:tuple2[5],requested:{model:requested[0],reasoning_effort:requested[1],velocity:requested[2]},selection:{source:selection2[0],policy_version:selection2[1],reasons:selection2[2]}}}if(tuple2[1]==="p"&&Array.isArray(tuple2[7])){const effective=tuple2[7];return{schema_version:2,type:"provider.invocation.finished",run_id:runId,event_id:tuple2[2],sequence:tuple2[3],occurred_at:tuple2[4],invocation_id:tuple2[5],status:tuple2[6],effective:{provider:effective[0],model:effective[1],reasoning_effort:effective[2],service_tier:effective[3]},latency_ms:tuple2[8]}}if(tuple2[1]!=="u"||!Array.isArray(tuple2[8])||!Array.isArray(tuple2[9])){throw new Error("Invalid Run transport v3 delta")}const tokens=tuple2[8];const cost=tuple2[9];const stats=tuple2[15];const runtime=tuple2[16];return{schema_version:2,type:"usage.recorded",run_id:runId,event_id:tuple2[2],sequence:tuple2[3],occurred_at:tuple2[4],phase:tuple2[5],activity_kind:tuple2[6],classification_source:tuple2[7],tokens:{input:tokens[0],cached_input:tokens[1],output:tokens[2],reasoning:tokens[3],total:tokens[4],source:tokens[5]},cost:{usd:cost[0],brl:cost[1],fx_rate:cost[2]??null},provider:tuple2[10],model:tuple2[11],source_segment_key:tuple2[12],supersedes_event_id:tuple2[13],...tuple2[14]===null?{}:{source_occurred_at:tuple2[14]},...stats===null||!Array.isArray(stats)?{}:{context_stats:{initial_pack_tokens:stats[0],tool_output_tokens:stats[1],files_opened:stats[2],snippets_opened:stats[3]}},...runtime===null||!Array.isArray(runtime)?{}:{runtime:{reasoning_effort:runtime[0],service_tier:runtime[1]}}}}function deduplicateSourceSegments(records){const collected=new Map;const effective=[];for(const record2 of records){if(record2.source_segment_key===null){effective.push(record2);continue}const existing=collected.get(record2.source_segment_key);if(existing===void 0){collected.set(record2.source_segment_key,record2);effective.push(record2);continue}if(!sameCollectedUsage(record2,existing)){throw new Error(`Divergent duplicate source segment: ${record2.source_segment_key}`)}}return effective}function sameCollectedUsage(left,right){return JSON.stringify({phase:left.phase,activity_kind:left.activity_kind,classification_source:left.classification_source,tokens:left.tokens,cost:left.cost,provider:left.provider,model:left.model,source_segment_key:left.source_segment_key})===JSON.stringify({phase:right.phase,activity_kind:right.activity_kind,classification_source:right.classification_source,tokens:right.tokens,cost:right.cost,provider:right.provider,model:right.model,source_segment_key:right.source_segment_key})}function sameModelSelection(record2,input){return(input.eventId===void 0||input.eventId===record2.event_id)&&(input.occurredAt===void 0||input.occurredAt===record2.occurred_at)&&JSON.stringify(record2.requested)===JSON.stringify(input.requested)&&JSON.stringify(record2.selection)===JSON.stringify(input.selection)}function sameProviderInvocation(record2,input){return(input.eventId===void 0||input.eventId===record2.event_id)&&(input.occurredAt===void 0||input.occurredAt===record2.occurred_at)&&record2.status===input.status&&record2.latency_ms===input.latencyMs&&JSON.stringify(record2.effective)===JSON.stringify(input.effective)}function assertRunModelSelection(started,records,input){if(started.model!=="unknown"&&input.requested.model!==started.model){throw new Error(`Agent Run model is immutable: expected ${started.model}, received ${input.requested.model}`)}if(started.reasoning_effort!==void 0&&started.reasoning_effort!==null&&input.requested.reasoning_effort!==started.reasoning_effort){throw new Error(`Agent Run reasoning effort is immutable: expected ${started.reasoning_effort}, received ${input.requested.reasoning_effort}`)}const first=records.find(record2=>record2.type==="model.selection.recorded");if(first===void 0)return;if(JSON.stringify(first.requested)!==JSON.stringify(input.requested)){throw new Error(`Agent Run calls must inherit one model configuration: ${started.run_id}`)}if(JSON.stringify(first.selection)!==JSON.stringify(input.selection)){throw new Error(`Agent Run calls must inherit one selection decision: ${started.run_id}`)}}function assertForwardPhase(current,next){const order={conversation:0,planning:1,execution:2};if(order[next]<order[current]){throw new Error(`Run V2 phase cannot move backward from ${current} to ${next}`)}}var RunV2Repository=class{constructor(filesystem,storage){this.filesystem=filesystem;this.storage=storage;if(storage.storageMode==="tracked_sanitized"&&storage.layout.version===1){throw new Error("tracked_sanitized Run V2 storage requires a modern WorkspaceLayout")}if(storage.storageMode==="local_only")assertCanonicalBasePath(storage.localBasePath)}filesystem;storage;activeWriters=new Set;async start(input){const clock=input.clock??new SystemClock;const id=input.id??createId("RUN",input.shortName,{clock,...input.collisionCode===void 0?{}:{collisionCode:input.collisionCode},...input.timeZone===void 0?{}:{timeZone:input.timeZone}});const started=runStartedV2Schema.parse({schema_version:2,event_id:eventId(id,1),run_id:id,sequence:1,occurred_at:clock.now().toISOString(),type:"run.started",attribution_status:"attributed",phase:input.phase,run_role:input.runRole??(input.phase!=="execution"?"intake":input.parentRunId!==void 0&&input.parentRunId!==null?"subagent":"orchestrator"),run_purpose:input.runPurpose??(input.phase!=="execution"?"intake":input.agent==="agent-
|
|
988
|
+
`}function expandDeltaRecord(tuple2,runId){if(tuple2[0]!==3||runId===null){throw new Error("Run delta requires transport version 3 and a preceding run.started header")}if(tuple2[1]==="f"){return{schema_version:2,type:"run.finished",run_id:runId,event_id:tuple2[2],sequence:tuple2[3],occurred_at:tuple2[4],phase:tuple2[5],status:tuple2[6]}}if(tuple2[1]==="m"&&Array.isArray(tuple2[6])&&Array.isArray(tuple2[7])){const requested=tuple2[6];const selection2=tuple2[7];return{schema_version:2,type:"model.selection.recorded",run_id:runId,event_id:tuple2[2],sequence:tuple2[3],occurred_at:tuple2[4],invocation_id:tuple2[5],requested:{model:requested[0],reasoning_effort:requested[1],velocity:requested[2]},selection:{source:selection2[0],policy_version:selection2[1],reasons:selection2[2]}}}if(tuple2[1]==="p"&&Array.isArray(tuple2[7])){const effective=tuple2[7];return{schema_version:2,type:"provider.invocation.finished",run_id:runId,event_id:tuple2[2],sequence:tuple2[3],occurred_at:tuple2[4],invocation_id:tuple2[5],status:tuple2[6],effective:{provider:effective[0],model:effective[1],reasoning_effort:effective[2],service_tier:effective[3]},latency_ms:tuple2[8]}}if(tuple2[1]!=="u"||!Array.isArray(tuple2[8])||!Array.isArray(tuple2[9])){throw new Error("Invalid Run transport v3 delta")}const tokens=tuple2[8];const cost=tuple2[9];const stats=tuple2[15];const runtime=tuple2[16];return{schema_version:2,type:"usage.recorded",run_id:runId,event_id:tuple2[2],sequence:tuple2[3],occurred_at:tuple2[4],phase:tuple2[5],activity_kind:tuple2[6],classification_source:tuple2[7],tokens:{input:tokens[0],cached_input:tokens[1],output:tokens[2],reasoning:tokens[3],total:tokens[4],source:tokens[5]},cost:{usd:cost[0],brl:cost[1],fx_rate:cost[2]??null},provider:tuple2[10],model:tuple2[11],source_segment_key:tuple2[12],supersedes_event_id:tuple2[13],...tuple2[14]===null?{}:{source_occurred_at:tuple2[14]},...stats===null||!Array.isArray(stats)?{}:{context_stats:{initial_pack_tokens:stats[0],tool_output_tokens:stats[1],files_opened:stats[2],snippets_opened:stats[3]}},...runtime===null||!Array.isArray(runtime)?{}:{runtime:{reasoning_effort:runtime[0],service_tier:runtime[1]}}}}function deduplicateSourceSegments(records){const collected=new Map;const effective=[];for(const record2 of records){if(record2.source_segment_key===null){effective.push(record2);continue}const existing=collected.get(record2.source_segment_key);if(existing===void 0){collected.set(record2.source_segment_key,record2);effective.push(record2);continue}if(!sameCollectedUsage(record2,existing)){throw new Error(`Divergent duplicate source segment: ${record2.source_segment_key}`)}}return effective}function sameCollectedUsage(left,right){return JSON.stringify({phase:left.phase,activity_kind:left.activity_kind,classification_source:left.classification_source,tokens:left.tokens,cost:left.cost,provider:left.provider,model:left.model,source_segment_key:left.source_segment_key})===JSON.stringify({phase:right.phase,activity_kind:right.activity_kind,classification_source:right.classification_source,tokens:right.tokens,cost:right.cost,provider:right.provider,model:right.model,source_segment_key:right.source_segment_key})}function sameModelSelection(record2,input){return(input.eventId===void 0||input.eventId===record2.event_id)&&(input.occurredAt===void 0||input.occurredAt===record2.occurred_at)&&JSON.stringify(record2.requested)===JSON.stringify(input.requested)&&JSON.stringify(record2.selection)===JSON.stringify(input.selection)}function sameProviderInvocation(record2,input){return(input.eventId===void 0||input.eventId===record2.event_id)&&(input.occurredAt===void 0||input.occurredAt===record2.occurred_at)&&record2.status===input.status&&record2.latency_ms===input.latencyMs&&JSON.stringify(record2.effective)===JSON.stringify(input.effective)}function assertRunModelSelection(started,records,input){if(started.model!=="unknown"&&input.requested.model!==started.model){throw new Error(`Agent Run model is immutable: expected ${started.model}, received ${input.requested.model}`)}if(started.reasoning_effort!==void 0&&started.reasoning_effort!==null&&input.requested.reasoning_effort!==started.reasoning_effort){throw new Error(`Agent Run reasoning effort is immutable: expected ${started.reasoning_effort}, received ${input.requested.reasoning_effort}`)}const first=records.find(record2=>record2.type==="model.selection.recorded");if(first===void 0)return;if(JSON.stringify(first.requested)!==JSON.stringify(input.requested)){throw new Error(`Agent Run calls must inherit one model configuration: ${started.run_id}`)}if(JSON.stringify(first.selection)!==JSON.stringify(input.selection)){throw new Error(`Agent Run calls must inherit one selection decision: ${started.run_id}`)}}function assertForwardPhase(current,next){const order={conversation:0,planning:1,execution:2};if(order[next]<order[current]){throw new Error(`Run V2 phase cannot move backward from ${current} to ${next}`)}}var RunV2Repository=class{constructor(filesystem,storage){this.filesystem=filesystem;this.storage=storage;if(storage.storageMode==="tracked_sanitized"&&storage.layout.version===1){throw new Error("tracked_sanitized Run V2 storage requires a modern WorkspaceLayout")}if(storage.storageMode==="local_only")assertCanonicalBasePath(storage.localBasePath)}filesystem;storage;activeWriters=new Set;async start(input){const clock=input.clock??new SystemClock;const id=input.id??createId("RUN",input.shortName,{clock,...input.collisionCode===void 0?{}:{collisionCode:input.collisionCode},...input.timeZone===void 0?{}:{timeZone:input.timeZone}});const started=runStartedV2Schema.parse({schema_version:2,event_id:eventId(id,1),run_id:id,sequence:1,occurred_at:clock.now().toISOString(),type:"run.started",attribution_status:"attributed",phase:input.phase,run_role:input.runRole??(input.phase!=="execution"?"intake":input.parentRunId!==void 0&&input.parentRunId!==null?"subagent":"orchestrator"),run_purpose:input.runPurpose??(input.phase!=="execution"?"intake":input.agent==="agent-finalizer"?"finalization":input.agent==="agent-reviewer"?"review":input.agent==="agent-auditor"?"audit":input.parentRunId===void 0||input.parentRunId===null?"orchestration":"execution"),requires_finalizer:input.requiresFinalizer??(input.phase==="execution"&&(input.parentRunId===void 0||input.parentRunId===null)&&input.executionId!==void 0&&input.executionId!==null),execution_kind:input.executionKind,execution_eligibility:[...input.executionEligibility??[]],entrypoint:input.entrypoint,work_type:input.workType,storage_mode:this.storage.storageMode,client:input.client,agent:input.agent,agent_name:input.agentName??null,provider:input.provider,model:input.model,reasoning_effort:input.reasoningEffort??null,client_thread_id:input.clientThreadId??null,client_turn_id:input.clientTurnId??null,conversation_id:input.conversationId,execution_id:input.executionId??null,task_id:input.taskId??null,spec_id:input.specId??null,prd_id:input.prdId??null,change_id:input.changeId??null,parent_run_id:input.parentRunId??null,continuation_of_run_id:input.continuationOfRunId??null,retry_of_run_id:input.retryOfRunId??null,intake:input.intake??null});const path=this.path(id);if(this.activeWriters.has(id)){throw new Error(`Run V2 already has a writer or persisted stream: ${id}`)}try{await this.filesystem.writeTextExclusive(path,serializeRecord(started))}catch(error51){if(!isNodeError4(error51)||error51.code!=="EEXIST")throw error51;throw new Error(`Run V2 already has a writer or persisted stream: ${id}`)}this.activeWriters.add(id);return new RunV2Writer(this.filesystem,path,started,clock,()=>{this.activeWriters.delete(id)})}async read(id){const path=await this.readPath(id);if(path===null)throw new Error(`Run V2 not found: ${id}`);return foldRunV2Records(parseRunV2JsonLines(await this.filesystem.readText(path)))}async list(){const paths=await this.filesystem.listFiles(this.basePath(),".jsonl");const entries=await Promise.all(paths.map(async path=>{const run=foldRunV2Records(parseRunV2JsonLines(await this.filesystem.readText(path)));if(!this.candidatePaths(run.run.run_id).includes(path)){throw new Error(`Run V2 id does not match storage path: ${path}`)}return{path,run}}));const byId2=new Map;for(const entry of entries){const existing=byId2.get(entry.run.run.run_id);if(existing===void 0){byId2.set(entry.run.run.run_id,entry);continue}if(JSON.stringify(existing.run.records)!==JSON.stringify(entry.run.records)){throw new Error(`Run V2 has divergent monthly and legacy streams: ${entry.run.run.run_id}`)}if(entry.path===this.path(entry.run.run.run_id)){byId2.set(entry.run.run.run_id,entry)}}const runs=[...byId2.values()].map(entry=>entry.run);return runs.sort((left,right)=>right.run.occurred_at.localeCompare(left.run.occurred_at)||right.run.run_id.localeCompare(left.run.run_id))}async appendRecord(record2){const validated=runV2RecordSchema.parse(record2);const path=this.path(validated.run_id);const lockPath=`${path}.lock`;try{await this.filesystem.writeTextExclusive(lockPath,`${JSON.stringify({run_id:validated.run_id,pid:process.pid})}
|
|
988
989
|
`)}catch(error51){if(isNodeError4(error51)&&error51.code==="EEXIST"){throw new Error(`Run V2 is being updated concurrently: ${validated.run_id}`)}throw error51}try{const persistedPath=await this.readPath(validated.run_id);if(persistedPath!==path){throw new Error(`Run V2 ${validated.run_id} is stored in a legacy daily path; migrate it before append`)}const current=await this.read(validated.run_id);if(current.finished!==null){throw new Error(`Run V2 is already finished: ${validated.run_id}`)}const expectedSequence=current.records.length+1;if(validated.sequence!==expectedSequence){throw new Error(`Run V2 compare-and-append failed: expected sequence ${expectedSequence}, received ${validated.sequence}`)}foldRunV2Records([...current.records,validated]);await this.filesystem.appendText(path,serializeRecord(validated))}finally{await this.filesystem.removeFile(lockPath)}}async withUsageAttributionLock(operation){const lockPath=`${this.basePath()}/.usage-attribution.lock`;const deadline=Date.now()+12e4;while(true){try{await this.filesystem.writeTextExclusive(lockPath,`${JSON.stringify({purpose:"usage-attribution",pid:process.pid})}
|
|
989
990
|
`);break}catch(error51){if(!isNodeError4(error51)||error51.code!=="EEXIST"||Date.now()>=deadline){throw error51}await delay2(25)}}try{return await operation()}finally{await this.filesystem.removeFile(lockPath)}}path(id){if(this.storage.storageMode==="tracked_sanitized"){return this.storage.layout.activePath("run",id)}const{year,month}=datedIdParts(id);return`${this.storage.localBasePath}/${year}/${month}/${id}.jsonl`}candidatePaths(id){if(this.storage.storageMode==="tracked_sanitized"){return[this.path(id),...this.storage.layout.legacyReadCandidates("run",id).map(candidate=>candidate.path)]}const{year,month,day}=datedIdPartsWithDay(id);return[this.path(id),`${this.storage.localBasePath}/${year}/${month}/${day}/${id}.jsonl`]}async readPath(id){if(this.storage.storageMode==="tracked_sanitized"){return resolveArtifactReadPath(this.filesystem,this.storage.layout,"run",id)}for(const path of this.candidatePaths(id)){if(await this.filesystem.exists(path))return path}return null}basePath(){return this.storage.storageMode==="tracked_sanitized"?this.storage.layout.entityRoot("run"):this.storage.localBasePath}};function assertCanonicalBasePath(path){if(path.length===0||path.includes("\\")||path.includes("\0")||path.startsWith("/")||path.startsWith("./")||path.endsWith("/")||/^[A-Za-z]:/.test(path)||path.split("/").some(segment=>segment.length===0||segment==="."||segment==="..")){throw new Error(`local_only Run basePath must be canonical and explicit: ${path}`)}}function isNodeError4(error51){return error51 instanceof Error&&"code"in error51}async function delay2(milliseconds){await new Promise(resolveDelay=>setTimeout(resolveDelay,milliseconds))}var timestamp4=external_exports.string().datetime({offset:true});var persistedTokenSourceSchema=external_exports.preprocess(value=>value==="client"?"provider_reported":value,external_exports.enum(["provider_reported","estimated","unavailable"]));var decisionSchema=external_exports.object({id:external_exports.string().regex(/^DEC-(?:HUMAN|AI)-/),title:external_exports.string().min(1),origin:external_exports.enum(["human","agent"]),category:external_exports.enum(["architecture","contract","database","security","dependency","network","infrastructure","cost","implementation"]),status:external_exports.enum(["active","superseded","rejected"]),task:external_exports.string().startsWith("TASK-").nullable(),change:external_exports.string().startsWith("CHG-").nullable(),context:external_exports.string().min(1),decision:external_exports.string().min(1),reason:external_exports.string().min(1),alternatives:external_exports.array(external_exports.string()),consequences:external_exports.array(external_exports.string()),reversible:external_exports.boolean(),rollback:external_exports.string(),confidence:external_exports.number().min(0).max(1).nullable(),created_at:timestamp4,confirmed_at:timestamp4.nullable()}).strict();var DecisionRepository=class{constructor(filesystem,basePath=".agents/decisions"){this.filesystem=filesystem;this.basePath=basePath}filesystem;basePath;async record(input){const clock=input.clock??new SystemClock;const createdAt=clock.now().toISOString();const prefix=input.origin==="human"?"DEC-HUMAN":"DEC-AI";const decision={id:createId(prefix,input.shortName,{clock}),title:input.title,origin:input.origin,category:input.category,status:"active",task:input.task,change:input.change,context:input.context,decision:input.decision,reason:input.reason,alternatives:[...input.alternatives],consequences:[...input.consequences],reversible:input.reversible,rollback:input.rollback,confidence:input.origin==="agent"?input.confidence:null,created_at:createdAt,confirmed_at:input.confirmed?createdAt:null};await this.filesystem.writeTextAtomic(this.path(decision.id,decision.origin),serializeMarkdown({metadata:decision,body:`# ${decision.title}
|
|
990
991
|
|
|
991
992
|
${decision.decision}`}));return decision}async read(id,origin){return parseMarkdown(await this.filesystem.readText(this.path(id,origin)),decisionSchema).metadata}async list(){const paths=await this.filesystem.listFiles(this.basePath,".md");return Promise.all(paths.map(async path=>parseMarkdown(await this.filesystem.readText(path),decisionSchema).metadata))}path(id,origin){return datedMarkdownPath(`${this.basePath}/${origin==="human"?"human":"agent"}`,id)}};var runSchema=external_exports.object({id:external_exports.string().startsWith("RUN-"),task:external_exports.string().startsWith("TASK-"),status:external_exports.enum(["running","completed","failed"]),client:external_exports.string().min(1),agent:external_exports.string().min(1),model:external_exports.string().min(1),started_at:timestamp4,finished_at:timestamp4.nullable(),duration_ms:external_exports.number().int().nonnegative().nullable(),provider:external_exports.string().min(1).nullable().default(null),token_usage:external_exports.object({input:external_exports.number().int().nonnegative().nullable(),cached_input:external_exports.number().int().nonnegative().nullable().default(null),output:external_exports.number().int().nonnegative().nullable(),reasoning:external_exports.number().int().nonnegative().nullable(),total:external_exports.number().int().nonnegative().nullable().default(null),source:persistedTokenSourceSchema}),cost:external_exports.object({estimated_usd:external_exports.number().nonnegative().nullable(),estimated_brl:external_exports.number().nonnegative().nullable(),fx_rate:external_exports.number().positive().nullable(),pricing_model:external_exports.string().nullable(),pricing_source:external_exports.string().nullable(),input_usd:external_exports.number().nonnegative().nullable().default(null),cached_input_usd:external_exports.number().nonnegative().nullable().default(null),output_usd:external_exports.number().nonnegative().nullable().default(null),reasoning_usd:external_exports.number().nonnegative().nullable().default(null)}).default({estimated_usd:null,estimated_brl:null,fx_rate:null,pricing_model:null,pricing_source:null,input_usd:null,cached_input_usd:null,output_usd:null,reasoning_usd:null}),telemetry:external_exports.object({cycle_count:external_exports.number().int().nonnegative().nullable(),source:external_exports.enum(["repository","local-codex","manual","unavailable"]),segment_key:external_exports.string().nullable()}).default({cycle_count:null,source:"unavailable",segment_key:null}),commands:external_exports.array(external_exports.string()),gates:external_exports.array(external_exports.string()),decisions:external_exports.array(external_exports.string()),evidence:external_exports.array(external_exports.string())}).strict();var RunRepository=class{constructor(filesystem,basePath=".agents/runs"){this.filesystem=filesystem;this.basePath=basePath}filesystem;basePath;async start(task,client,agent,model,clock=new SystemClock){const run={id:createId("RUN",task.replace(/^TASK-[\d-]+/,"task"),{clock}),task,status:"running",client,agent,model,started_at:clock.now().toISOString(),finished_at:null,duration_ms:null,provider:null,token_usage:{input:null,cached_input:null,output:null,reasoning:null,total:null,source:"unavailable"},cost:{estimated_usd:null,estimated_brl:null,fx_rate:null,pricing_model:null,pricing_source:null,input_usd:null,cached_input_usd:null,output_usd:null,reasoning_usd:null},telemetry:{cycle_count:null,source:"unavailable",segment_key:null},commands:[],gates:[],decisions:[],evidence:[]};await this.write(run);return run}async read(id){return parseMarkdown(await this.filesystem.readText(datedMarkdownPath(this.basePath,id)),runSchema).metadata}async list(){const paths=await this.filesystem.listFiles(this.basePath,".md");return Promise.all(paths.map(async path=>parseMarkdown(await this.filesystem.readText(path),runSchema).metadata))}async finish(run,status,clock=new SystemClock,details={}){const finishedAt=clock.now();const completed={...run,status,model:details.model??run.model,finished_at:finishedAt.toISOString(),duration_ms:Math.max(0,finishedAt.getTime()-new Date(run.started_at).getTime()),provider:details.provider??run.provider,token_usage:details.tokenUsage??run.token_usage,cost:details.cost??run.cost,telemetry:details.telemetry??run.telemetry,commands:[...details.commands??run.commands],gates:[...details.gates??run.gates],decisions:[...details.decisions??run.decisions],evidence:[...details.evidence??run.evidence]};await this.write(completed);return completed}async write(run){await this.filesystem.writeTextAtomic(datedMarkdownPath(this.basePath,run.id),serializeMarkdown({metadata:run,body:`# Run ${run.id}
|
|
992
993
|
|
|
993
994
|
Execution record for ${run.task}.`}))}};var EVAL_VERSION="1.0.0";async function persistEvalReport(filesystem,report,shortName="offline-suite"){const id=createId("EVAL",shortName);const{year,month}=datedIdParts(id);const path=`.agents/evals/results/${year}/${month}/${id}.json`;const persisted={id,version:EVAL_VERSION,generated_at:new Date().toISOString(),report};await filesystem.writeTextAtomic(path,`${JSON.stringify(persisted,null,2)}
|
|
994
|
-
`);return{id,path}}function runEvalSuite(cases,profile){const results=cases.map(testCase=>{const startedAt=performance.now();const findings=testCase.validator==="cqrs"?validateCqrs(testCase.units,profile):validateArchitecture(testCase.units,profile);const actualRules=[...new Set(findings.map(item=>item.rule))].sort();const expectedRules=[...testCase.expectedRules].sort();return{id:testCase.id,passed:JSON.stringify(actualRules)===JSON.stringify(expectedRules),expectedRules,actualRules,durationMs:Math.max(0,performance.now()-startedAt)}});return{passed:results.every(result2=>result2.passed),offline:true,cases:results}}function guardDiff(changedFiles,ledgerFiles){const canonicalChanges=changedFiles.filter(path=>!path.startsWith(".agents/"));return canonicalChanges.filter(path=>!ledgerFiles.includes(path)).map(path=>({rule:"untracked-diff",message:`${path} is not present in the active task ledger`}))}var BUILTIN_EVAL_CASES=[{id:"domain-rejects-framework",units:[{path:"src/modules/a/domain/entity.ts",content:'import { Hono } from "hono";'}],expectedRules:["domain-framework-dependency"]},{id:"query-rejects-write",units:[{path:"src/modules/a/application/queries/get.query.ts",content:"export const get = (port: WritePort) => port.save({});"}],expectedRules:["query-side-effect","query-write-port"],validator:"cqrs"},{id:"pure-query-passes",units:[{path:"src/modules/a/application/queries/get.query.ts",content:"export const get = (port: ReadPort) => port.find();"}],expectedRules:[],validator:"cqrs"}];function scanInfrastructureSecurity(path,content){const findings=[];if(/\.ya?ml$/.test(path)&&/(?:privileged:\s*true|network_mode:\s*["']?host)/i.test(content)){findings.push({rule:"docker-unsafe-isolation",path})}if(/\.tf$/.test(path)&&/(?:cidr_blocks|source_ranges)\s*=\s*\[[^\]]*["']0\.0\.0\.0\/0/i.test(content)){findings.push({rule:"terraform-public-ingress",path})}if(/\.sql$/.test(path)&&/GRANT\s+ALL(?:\s+PRIVILEGES)?[\s\S]*\sTO\s+(?:PUBLIC|\w+)/i.test(content)){findings.push({rule:"sql-overprivileged-grant",path})}return findings}function runCategoryEval(category){if(category==="architecture"){return runEvalSuite(BUILTIN_EVAL_CASES.filter(item=>item.id.includes("domain")))}if(category==="cqrs"){return runEvalSuite(BUILTIN_EVAL_CASES.filter(item=>!item.id.includes("domain")))}const startedAt=performance.now();let passed=false;let actualRules=[];let expectedRules=[];if(category==="specs"){expectedRules=["untracked-diff"];actualRules=guardDiff(["src/new.ts"],[]).map(item=>item.rule);passed=expectedRules.every(rule=>actualRules.includes(rule))}else if(category==="security"){expectedRules=["generic-secret"];actualRules=scanSecrets("fixture.ts",'const token = "definitely-not-a-real-secret"').map(item=>item.kind);passed=expectedRules.every(rule=>actualRules.includes(rule))}else if(category==="infrastructure"){expectedRules=["docker-unsafe-isolation","terraform-public-ingress","sql-overprivileged-grant"];actualRules=[...scanInfrastructureSecurity("compose.yaml","services:\n app:\n privileged: true"),...scanInfrastructureSecurity("main.tf",'ingress { cidr_blocks = ["0.0.0.0/0"] }'),...scanInfrastructureSecurity("grant.sql","GRANT ALL PRIVILEGES ON app TO PUBLIC;")].map(item=>item.rule);passed=expectedRules.every(rule=>actualRules.includes(rule))}else if(category==="adapters"){const files=adapterFiles(process.cwd());actualRules=files.map(file2=>file2.path);expectedRules=[...actualRules];passed=files.length>0&&new Set(files.map(file2=>file2.path)).size===files.length&&files.every(file2=>file2.content.includes("zaip-managed"))}else if(category==="context"){actualRules=[String(estimateTokens("12345678"))];expectedRules=[...actualRules];passed=Number(actualRules[0])>0}return{passed,offline:true,cases:[{id:`${category}-builtin`,passed,expectedRules,actualRules,durationMs:performance.now()-startedAt}]}}function runAllCategoryEvals(){const categories=["specs","architecture","cqrs","security","infrastructure","adapters","context"];const reports=categories.map(runCategoryEval);return{passed:reports.every(report=>report.passed),offline:true,cases:reports.flatMap(report=>report.cases)}}var SHARED_FIELDS=["objective","requirement_ids","acceptance_ids","write_scopes"];var ADAPTIVE_TEMPLATES={simple:{level:"simple",requiredFields:[...SHARED_FIELDS,"verification"],optionalFields:["risk_notes","rollback"],maximumUnresolvedQuestions:0},standard:{level:"standard",requiredFields:[...SHARED_FIELDS,"included_scope","excluded_scope","design","risks","verification","rollback"],optionalFields:["rollout","open_questions"],maximumUnresolvedQuestions:2},complex:{level:"complex",requiredFields:[...SHARED_FIELDS,"problem","outcomes","included_scope","excluded_scope","architecture","security","dag","budgets","risks","rollout","rollback","verification","independent_reviewer"],optionalFields:["open_questions"],maximumUnresolvedQuestions:3}};var assuranceValidationKindSchema=external_exports.enum(["test","eval","check","review","spec_review","quality_review","mutation","integration","cross_spec_e2e"]);var taskAssuranceContractV2Schema=external_exports.object({schema_version:external_exports.literal(2),assurance_version:external_exports.literal(1),profile:external_exports.enum(["task-lite","task-standard-2","task-standard-3","task-critical"]),risk:external_exports.enum(["lite","standard","critical"]),minimum_validation_artifacts:external_exports.number().int().positive(),maximum_validation_artifacts:external_exports.number().int().positive().nullable(),minimum_evidence_artifacts:external_exports.number().int().positive(),maximum_evidence_artifacts:external_exports.number().int().positive().nullable(),minimum_distinct_modalities:external_exports.number().int().positive(),complete_acceptance_coverage:external_exports.literal(true),evidence_per_acceptance:external_exports.boolean(),requires_independent_verifier:external_exports.boolean(),requires_mutation_discrimination:external_exports.boolean(),minimum_mutation_kill_ratio:external_exports.number().min(0).max(1).nullable(),requires_rollback:external_exports.boolean(),requires_final_commit_evidence:external_exports.boolean(),required_modalities:external_exports.array(assuranceValidationKindSchema)}).strict().superRefine((value,context)=>{if(value.maximum_validation_artifacts!==null&&value.maximum_validation_artifacts<value.minimum_validation_artifacts){context.addIssue({code:"custom",path:["maximum_validation_artifacts"],message:"maximum validation artifacts cannot be lower than the minimum"})}if(value.maximum_evidence_artifacts!==null&&value.maximum_evidence_artifacts<value.minimum_evidence_artifacts){context.addIssue({code:"custom",path:["maximum_evidence_artifacts"],message:"maximum Evidence artifacts cannot be lower than the minimum"})}});function resolveTaskAssuranceContract(input){if(input.risk==="lite"){return taskAssuranceContractV2Schema.parse({...taskContractBase("task-lite","lite",1,1),maximum_validation_artifacts:1,maximum_evidence_artifacts:1})}if(input.risk==="standard"){const count=input.standard_depth==="elevated"?3:2;return taskAssuranceContractV2Schema.parse({...taskContractBase(`task-standard-${count}`,"standard",count,count),maximum_validation_artifacts:count,maximum_evidence_artifacts:count,required_modalities:["test"]})}return taskAssuranceContractV2Schema.parse({...taskContractBase("task-critical","critical",3,1),maximum_validation_artifacts:null,maximum_evidence_artifacts:null,evidence_per_acceptance:true,requires_independent_verifier:true,requires_mutation_discrimination:true,minimum_mutation_kill_ratio:1,requires_rollback:true,requires_final_commit_evidence:true,required_modalities:["test","quality_review","mutation"]})}var deliveryAssuranceContractV2Schema=external_exports.object({schema_version:external_exports.literal(2),assurance_version:external_exports.literal(1),profile:external_exports.enum(["spec-delivery","prd-delivery"]),origin:external_exports.enum(["spec","prd"]),minimum_parent_validation_artifacts:external_exports.number().int().positive(),minimum_parent_evidence_artifacts:external_exports.number().int().positive(),minimum_distinct_modalities:external_exports.number().int().positive(),complete_acceptance_coverage:external_exports.literal(true),requires_acceptance_matrix:external_exports.literal(true),requires_independent_verifier:external_exports.literal(true),integration_modality:external_exports.enum(["integration","cross_spec_e2e"]),evidence_per_outcome:external_exports.boolean(),requires_final_commit_evidence:external_exports.boolean(),required_modalities:external_exports.array(assuranceValidationKindSchema).min(3)}).strict();function resolveDeliveryAssuranceContract(origin){const integrationModality=origin==="spec"?"integration":"cross_spec_e2e";return deliveryAssuranceContractV2Schema.parse({schema_version:2,assurance_version:1,profile:origin==="spec"?"spec-delivery":"prd-delivery",origin,minimum_parent_validation_artifacts:3,minimum_parent_evidence_artifacts:3,minimum_distinct_modalities:3,complete_acceptance_coverage:true,requires_acceptance_matrix:true,requires_independent_verifier:true,integration_modality:integrationModality,evidence_per_outcome:origin==="prd",requires_final_commit_evidence:true,required_modalities:[integrationModality,"spec_review","quality_review"]})}function taskContractBase(profile,risk2,validationCount,evidenceCount){return{schema_version:2,assurance_version:1,profile,risk:risk2,minimum_validation_artifacts:validationCount,maximum_validation_artifacts:null,minimum_evidence_artifacts:evidenceCount,maximum_evidence_artifacts:null,minimum_distinct_modalities:validationCount,complete_acceptance_coverage:true,evidence_per_acceptance:false,requires_independent_verifier:false,requires_mutation_discrimination:false,minimum_mutation_kill_ratio:null,requires_rollback:false,requires_final_commit_evidence:false,required_modalities:[]}}var timestampSchema=external_exports.string().datetime({offset:true});var commitShaSchema=external_exports.string().regex(/^(?:[a-f0-9]{40}|[a-f0-9]{64})$/).nullable();var acceptanceIdsSchema=uniqueStrings(external_exports.string().startsWith("AC-")).min(1);var validationPrefixes={test:"TEST-",eval:"EVAL-",check:"CHECK-",review:"REVIEW-",spec_review:"REVIEW-SPEC-",quality_review:"REVIEW-QUALITY-",mutation:"MUT-",integration:"INT-",cross_spec_e2e:"E2E-"};var validationArtifactV2Schema=external_exports.object({schema_version:external_exports.literal(2),id:external_exports.string().min(1),kind:assuranceValidationKindSchema,task_id:external_exports.string().startsWith("TASK-"),change_id:external_exports.string().startsWith("CHG-"),execution_id:external_exports.string().startsWith("EXEC-"),run_id:external_exports.string().startsWith("RUN-"),acceptance_ids:acceptanceIdsSchema,executed_at:timestampSchema,command:external_exports.string().min(1).nullable(),status:external_exports.enum(["passed","failed","not_applicable"]),asserted_outcomes:uniqueStrings(external_exports.string().min(1)).min(1),locators:uniqueStrings(external_exports.string().min(1)).min(1),author_id:external_exports.string().min(1),commit_sha:commitShaSchema,not_applicable_reason:external_exports.string().min(1).nullable()}).strict().superRefine((value,context)=>{if(!value.id.startsWith(validationPrefixes[value.kind])){context.addIssue({code:"custom",path:["id"],message:`${value.kind} validation id must start with ${validationPrefixes[value.kind]}`})}if(!isReview(value.kind)&&value.command===null){context.addIssue({code:"custom",path:["command"],message:`${value.kind} validation requires its executed command`})}addApplicabilityIssues(value.status,value.not_applicable_reason,context)});var evidenceArtifactV2Schema=external_exports.object({schema_version:external_exports.literal(2),id:external_exports.string().startsWith("EVD-"),task_id:external_exports.string().startsWith("TASK-"),change_id:external_exports.string().startsWith("CHG-"),execution_id:external_exports.string().startsWith("EXEC-"),run_id:external_exports.string().startsWith("RUN-"),acceptance_ids:acceptanceIdsSchema,outcome_ids:uniqueStrings(external_exports.string().startsWith("OUT-")).default([]),validation_artifact_ids:uniqueStrings(external_exports.string().min(1)).min(1),observed_at:timestampSchema,status:external_exports.enum(["passed","not_applicable"]),summary:external_exports.string().min(1),locators:uniqueStrings(external_exports.string().min(1)).min(1),commit_sha:commitShaSchema,not_applicable_reason:external_exports.string().min(1).nullable()}).strict().superRefine((value,context)=>{addApplicabilityIssues(value.status,value.not_applicable_reason,context)});function uniqueStrings(item){return external_exports.array(item).superRefine((values2,context)=>{const seen=new Set;for(const[index,value]of values2.entries()){if(seen.has(value)){context.addIssue({code:"custom",path:[index],message:`duplicate value: ${value}`})}seen.add(value)}})}function addApplicabilityIssues(status,reason,context){if(status==="not_applicable"&&reason===null){context.addIssue({code:"custom",path:["not_applicable_reason"],message:"not-applicable artifacts require a reason"})}if(status!=="not_applicable"&&reason!==null){context.addIssue({code:"custom",path:["not_applicable_reason"],message:"applicable artifacts cannot retain a not-applicable reason"})}}function isReview(kind){return kind==="review"||kind==="spec_review"||kind==="quality_review"}function assessTaskAssurance(input){const validations=input.validations.filter(artifact=>artifact.status==="passed");const evidences=input.evidences.filter(artifact=>artifact.status==="passed");const findings=[];addCountFinding(findings,"validation-count","validation artifacts",validations.length,input.contract.minimum_validation_artifacts,input.contract.maximum_validation_artifacts);addCountFinding(findings,"evidence-count","Evidence artifacts",evidences.length,input.contract.minimum_evidence_artifacts,input.contract.maximum_evidence_artifacts);const modalities=new Set(validations.map(artifact=>artifact.kind));if(modalities.size<input.contract.minimum_distinct_modalities||input.contract.required_modalities.some(modality=>!modalities.has(modality))){findings.push({code:"validation-modality",message:`Task assurance requires ${input.contract.minimum_distinct_modalities} distinct modalities including ${input.contract.required_modalities.join(", ")||"any valid modality"}`})}addCoverageFinding(findings,"acceptance-validation-coverage","Validation",input.acceptance_ids,validations.flatMap(artifact=>artifact.acceptance_ids));addCoverageFinding(findings,"acceptance-evidence-coverage","Evidence",input.acceptance_ids,evidences.flatMap(artifact=>artifact.acceptance_ids));addEvidenceLinkFindings(findings,validations,evidences);if(input.contract.evidence_per_acceptance&&input.acceptance_ids.some(acceptanceId=>!evidences.some(evidence=>evidence.acceptance_ids.length===1&&evidence.acceptance_ids[0]===acceptanceId))){findings.push({code:"evidence-per-acceptance",message:"Critical assurance requires a dedicated passed Evidence for every Acceptance Criterion"})}if(input.contract.requires_independent_verifier&&!isIndependentApproval(input.verifier)){findings.push({code:"independent-verifier",message:"An approved verifier distinct from the author is required"})}if(input.contract.requires_mutation_discrimination&&!mutationSatisfies(input.mutation,input.acceptance_ids,input.contract.minimum_mutation_kill_ratio)){findings.push({code:"mutation-discrimination",message:"Mutation discrimination must cover every Acceptance Criterion at the required kill ratio"})}if(input.contract.requires_rollback&&(input.rollback_evidence_id===null||!evidences.some(evidence=>evidence.id===input.rollback_evidence_id))){findings.push({code:"rollback",message:"Passed rollback Evidence is required"})}if(input.contract.requires_final_commit_evidence&&!artifactsMatchCommit(validations,evidences,input.expected_commit_sha)){findings.push({code:"final-commit-evidence",message:"Critical validation and Evidence must be executed on the expected final commit"})}return{valid:findings.length===0,findings}}function assessDeliveryAssurance(input){const validations=input.validations.filter(artifact=>artifact.status==="passed");const evidences=input.evidences.filter(artifact=>artifact.status==="passed");const findings=[];if(validations.length<input.contract.minimum_parent_validation_artifacts){findings.push({code:"delivery-validation-count",message:`Delivery requires at least ${input.contract.minimum_parent_validation_artifacts} parent validations`})}if(evidences.length<input.contract.minimum_parent_evidence_artifacts){findings.push({code:"delivery-evidence-count",message:`Delivery requires at least ${input.contract.minimum_parent_evidence_artifacts} parent Evidence artifacts`})}const modalities=new Set(validations.map(artifact=>artifact.kind));if(modalities.size<input.contract.minimum_distinct_modalities||input.contract.required_modalities.some(modality=>!modalities.has(modality))){findings.push({code:"delivery-modality",message:`Delivery requires ${input.contract.required_modalities.join(" and ")}`})}addCoverageFinding(findings,"acceptance-validation-coverage","Validation",input.acceptance_ids,validations.flatMap(artifact=>artifact.acceptance_ids));addCoverageFinding(findings,"acceptance-evidence-coverage","Evidence",input.acceptance_ids,evidences.flatMap(artifact=>artifact.acceptance_ids));if(input.contract.evidence_per_outcome){addCoverageFinding(findings,"outcome-evidence-coverage","Outcome Evidence",input.outcome_ids,evidences.flatMap(artifact=>artifact.outcome_ids))}addEvidenceLinkFindings(findings,validations,evidences);if(!isIndependentApproval(input.verifier)){findings.push({code:"independent-verifier",message:"Delivery requires approval from a verifier distinct from the author"})}if(input.contract.requires_final_commit_evidence&&!artifactsMatchCommit(validations,evidences,input.expected_commit_sha)){findings.push({code:"final-commit-evidence",message:"Delivery validation and Evidence must be executed on the expected final commit"})}return{valid:findings.length===0,findings}}function addCountFinding(findings,code,label,actual,minimum,maximum){if(actual<minimum||maximum!==null&&actual>maximum){findings.push({code,message:`${label} count ${actual} is outside ${minimum}..${maximum??"unbounded"}`})}}function addCoverageFinding(findings,code,label,required2,coveredValues){const covered=new Set(coveredValues);const missing=required2.filter(id=>!covered.has(id));if(missing.length>0)findings.push({code,message:`${label} is missing: ${missing.join(", ")}`})}function addEvidenceLinkFindings(findings,validations,evidences){const validationById=new Map(validations.map(artifact=>[artifact.id,artifact]));const unlinked=evidences.filter(evidence=>{const linked=evidence.validation_artifact_ids.map(id=>validationById.get(id));if(linked.some(artifact=>artifact===void 0))return true;const resolved=linked.filter(artifact=>artifact!==void 0);const acceptanceIds=new Set(resolved.flatMap(artifact=>artifact.acceptance_ids));return evidence.acceptance_ids.some(id=>!acceptanceIds.has(id))||resolved.some(artifact=>artifact.task_id!==evidence.task_id||artifact.change_id!==evidence.change_id||artifact.execution_id!==evidence.execution_id)});if(unlinked.length>0){findings.push({code:"evidence-link",message:`Evidence references validation that did not pass: ${unlinked.map(item=>item.id).join(", ")}`})}}function artifactsMatchCommit(validations,evidences,expectedCommitSha){return expectedCommitSha!==null&&validations.length>0&&evidences.length>0&&validations.every(artifact=>artifact.commit_sha===expectedCommitSha)&&evidences.every(artifact=>artifact.commit_sha===expectedCommitSha)}function isIndependentApproval(verifier){return verifier!==null&&verifier.status==="approved"&&verifier.author_id!==verifier.reviewer_id}function mutationSatisfies(mutation,acceptanceIds,threshold){if(mutation===null||!mutation.baseline_passed||mutation.total_mutants<1||mutation.killed_mutants<1||mutation.kill_ratio<(threshold??0)){return false}const covered=new Set(mutation.acceptance_ids);return acceptanceIds.every(id=>covered.has(id))}import{createHash as createHash5}from"node:crypto";var timestampV2Schema=external_exports.string().datetime({offset:true});var sha256V2Schema=external_exports.string().regex(/^[a-f0-9]{64}$/);var prdIdV2Schema=external_exports.string().startsWith("PRD-");var specIdV2Schema=external_exports.string().startsWith("SPEC-");var changeIdV2Schema=external_exports.string().startsWith("CHG-");var taskIdV2Schema=external_exports.string().startsWith("TASK-");var executionIdV2Schema=external_exports.string().startsWith("EXEC-");var requirementIdV2Schema=external_exports.string().startsWith("REQ-");var acceptanceIdV2Schema=external_exports.string().startsWith("AC-");var outcomeIdV2Schema=external_exports.string().startsWith("OUT-");var riskProfileV2Schema=external_exports.enum(["lite","standard","critical"]);var priorityV2Schema=external_exports.enum(["low","medium","high","urgent"]);var planRefV2Schema=external_exports.object({revision:external_exports.number().int().positive(),hash:sha256V2Schema,execution_id:executionIdV2Schema}).strict();function planRefV2(plan){return planRefV2Schema.parse({revision:plan.revision,hash:plan.hash,execution_id:plan.execution_id})}var planSourceV2Schema=external_exports.discriminatedUnion("type",[external_exports.object({type:external_exports.literal("task"),task_id:taskIdV2Schema}).strict(),external_exports.object({type:external_exports.literal("spec"),spec_id:specIdV2Schema}).strict(),external_exports.object({type:external_exports.literal("prd"),prd_id:prdIdV2Schema}).strict()]);var changeSourceV2Schema=external_exports.discriminatedUnion("type",[external_exports.object({type:external_exports.literal("task"),task_id:taskIdV2Schema}).strict(),external_exports.object({type:external_exports.literal("spec"),spec_id:specIdV2Schema}).strict(),external_exports.object({type:external_exports.literal("prd"),prd_id:prdIdV2Schema,spec_id:specIdV2Schema.nullable()}).strict()]);var requirementImpactV2Schema=external_exports.discriminatedUnion("type",[external_exports.object({type:external_exports.literal("none"),reason:external_exports.string().min(1)}).strict(),external_exports.object({type:external_exports.literal("update"),requirement_ids:external_exports.array(requirementIdV2Schema).min(1)}).strict()]);var preparedRuntimeSelectionV2Schema=external_exports.object({model:autoModelSchema,reasoning_effort:autoReasoningEffortSchema,velocity:standardVelocitySchema.optional()}).strict();var preparedRuntimeDefaultsV2Schema=preparedRuntimeSelectionV2Schema.extend({client:external_exports.string().min(1),provider:external_exports.string().min(1)}).strict();var executionPolicyV2Schema=external_exports.object({failure_policy:external_exports.enum(["stop_on_terminal_failure","continue_independent"]),max_parallelism:external_exports.number().int().positive(),max_operational_retries:external_exports.number().int().nonnegative(),max_repair_cycles_per_task:external_exports.number().int().nonnegative(),soft_model_cycle_budget:external_exports.number().int().positive().optional(),soft_input_token_budget:external_exports.number().int().positive().optional(),context_refresh_after_cycles:external_exports.number().int().positive().optional(),verification_mode:external_exports.enum(["scoped","full"]).optional(),runtime_defaults:preparedRuntimeDefaultsV2Schema.optional()}).strict();var blueprintKeySchema=external_exports.string().regex(/^[a-z][a-z0-9-]*$/);var writeScopeSchema=external_exports.string().min(1).superRefine((value,context)=>{if(value.includes("\\")||value.includes("\0")||value.startsWith("/")||value.startsWith("./")||/^[A-Za-z]:/.test(value)||value.split("/").some(segment=>segment.length===0||segment==="."||segment==="..")){context.addIssue({code:"custom",message:"write_scope must be workspace-relative"})}});var changeBlueprintV2Schema=external_exports.object({key:blueprintKeySchema,id:changeIdV2Schema,title:external_exports.string().min(1),short_name:external_exports.string().min(1),risk:riskProfileV2Schema,source:changeSourceV2Schema,requirement_ids:external_exports.array(requirementIdV2Schema).min(1),acceptance_ids:external_exports.array(acceptanceIdV2Schema).min(1),requirement_impact:requirementImpactV2Schema}).strict().superRefine((value,context)=>{addDuplicateIssues(value.requirement_ids,"requirement_ids",context);addDuplicateIssues(value.acceptance_ids,"acceptance_ids",context)});var taskBlueprintV2Schema=external_exports.object({key:blueprintKeySchema,id:taskIdV2Schema,change_id:changeIdV2Schema,title:external_exports.string().min(1),short_name:external_exports.string().min(1),objective:external_exports.string().min(1),risk:riskProfileV2Schema,priority:priorityV2Schema,owner:external_exports.string().min(1).nullable(),requirement_ids:external_exports.array(requirementIdV2Schema).min(1),acceptance_ids:external_exports.array(acceptanceIdV2Schema).min(1),write_scopes:external_exports.array(writeScopeSchema),runtime:preparedRuntimeSelectionV2Schema.optional()}).strict().superRefine((value,context)=>{addDuplicateIssues(value.requirement_ids,"requirement_ids",context);addDuplicateIssues(value.acceptance_ids,"acceptance_ids",context);addDuplicateIssues(value.write_scopes,"write_scopes",context)});var preparedDagNodeV2Schema=external_exports.object({task_id:taskIdV2Schema,depends_on:external_exports.array(taskIdV2Schema)}).strict().superRefine((value,context)=>{if(value.depends_on.includes(value.task_id)){context.addIssue({code:"custom",path:["depends_on"],message:"self dependency"})}addDuplicateIssues(value.depends_on,"depends_on",context)});var preparedPlanDraftV2Schema=external_exports.object({revision:external_exports.number().int().positive(),source:planSourceV2Schema,execution_id:executionIdV2Schema,prepared_at:timestampV2Schema,policy:executionPolicyV2Schema,blueprints:external_exports.object({changes:external_exports.array(changeBlueprintV2Schema).min(1),tasks:external_exports.array(taskBlueprintV2Schema).min(1)}).strict(),dag:external_exports.object({nodes:external_exports.array(preparedDagNodeV2Schema).min(1)}).strict()}).strict();var preparedPlanDataV2Schema=preparedPlanDraftV2Schema.extend({schema_version:external_exports.literal(2),dag:external_exports.object({nodes:external_exports.array(preparedDagNodeV2Schema).min(1),topological_order:external_exports.array(taskIdV2Schema).min(1)}).strict(),hash:sha256V2Schema}).strict();var preparedPlanV2Schema=preparedPlanDataV2Schema.superRefine((plan,context)=>{for(const finding2 of validatePreparedPlanV2(plan)){context.addIssue({code:"custom",path:[...finding2.path],message:finding2.message})}});function createPreparedPlanV2(input){const draft=preparedPlanDraftV2Schema.parse(input);const topologicalOrder=calculateTopologicalOrder(draft.dag.nodes);const withoutHash={schema_version:2,...draft,dag:{...draft.dag,topological_order:topologicalOrder}};return preparedPlanV2Schema.parse({...withoutHash,hash:hashCanonicalValue(withoutHash)})}function validatePreparedPlanV2(plan){const findings=[];const changes=new Map(plan.blueprints.changes.map(change=>[change.id,change]));const tasks=new Map(plan.blueprints.tasks.map(task=>[task.id,task]));findDuplicates([...plan.blueprints.changes,...plan.blueprints.tasks].map(item=>item.key),"duplicate-key",["blueprints"],findings);findDuplicates([...plan.blueprints.changes,...plan.blueprints.tasks].map(item=>item.id),"duplicate-id",["blueprints"],findings);for(const[index,task]of plan.blueprints.tasks.entries()){const change=changes.get(task.change_id);if(change===void 0){findings.push({rule:"missing-change",path:["blueprints","tasks",index,"change_id"],message:`${task.change_id} does not resolve`});continue}for(const requirement of task.requirement_ids){if(!change.requirement_ids.includes(requirement)){findings.push({rule:"requirement-outside-change",path:["blueprints","tasks",index,"requirement_ids"],message:`${requirement} is absent from ${change.id}`})}}for(const acceptance of task.acceptance_ids){if(!change.acceptance_ids.includes(acceptance)){findings.push({rule:"acceptance-outside-change",path:["blueprints","tasks",index,"acceptance_ids"],message:`${acceptance} is absent from ${change.id}`})}}}for(const[index,change]of plan.blueprints.changes.entries()){if(![...tasks.values()].some(task=>task.change_id===change.id)){findings.push({rule:"change-without-task",path:["blueprints","changes",index],message:`${change.id} has no task`})}if(!sourceMatches(plan.source,change.source)){findings.push({rule:"source-mismatch",path:["blueprints","changes",index,"source"],message:`${change.id} source does not match the prepared plan source`})}if(plan.source.type==="prd"&&change.source.type==="prd"&&change.source.spec_id===null){findings.push({rule:"prd-change-without-spec",path:["blueprints","changes",index,"source","spec_id"],message:`${change.id} must belong to a SPEC of ${plan.source.prd_id}`})}}if(plan.source.type==="task"&&!tasks.has(plan.source.task_id)){findings.push({rule:"missing-task",path:["source","task_id"],message:`${plan.source.task_id} does not resolve`})}const nodes=new Map(plan.dag.nodes.map(node=>[node.task_id,node]));findDuplicates(plan.dag.nodes.map(node=>node.task_id),"duplicate-id",["dag","nodes"],findings);for(const task of tasks.values()){if(!nodes.has(task.id)){findings.push({rule:"missing-task",path:["dag","nodes"],message:`${task.id} is missing from the DAG`})}}for(const[index,node]of plan.dag.nodes.entries()){if(!tasks.has(node.task_id)){findings.push({rule:"missing-task",path:["dag","nodes",index,"task_id"],message:`${node.task_id} does not resolve`})}for(const dependency of node.depends_on){if(dependency===node.task_id){findings.push({rule:"self-dependency",path:["dag","nodes",index,"depends_on"],message:`${node.task_id} depends on itself`})}else if(!tasks.has(dependency)){findings.push({rule:"missing-dependency",path:["dag","nodes",index,"depends_on"],message:`${dependency} does not resolve`})}}}const order=calculateTopologicalOrder(plan.dag.nodes);if(order.length!==tasks.size){findings.push({rule:"cycle",path:["dag"],message:"DAG contains a cycle"})}else if(JSON.stringify(order)!==JSON.stringify(plan.dag.topological_order)){findings.push({rule:"topological-order",path:["dag","topological_order"],message:"topological_order is not canonical"})}if(order.length===tasks.size){const dependencies=transitiveDependencies(plan.dag.nodes);const taskEntries=[...tasks.values()];for(let leftIndex=0;leftIndex<taskEntries.length;leftIndex+=1){for(let rightIndex=leftIndex+1;rightIndex<taskEntries.length;rightIndex+=1){const left=taskEntries[leftIndex];const right=taskEntries[rightIndex];if(left===void 0||right===void 0)continue;const overlap=left.write_scopes.find(leftScope=>right.write_scopes.some(rightScope=>writeScopesMayOverlap(leftScope,rightScope)));if(overlap===void 0)continue;const serialized=dependencies.get(left.id)?.has(right.id)===true||dependencies.get(right.id)?.has(left.id)===true;if(!serialized){findings.push({rule:"overlapping-write-scope",path:["blueprints","tasks"],message:`${left.id} and ${right.id} may overlap at ${overlap}; add a DAG dependency`})}}}}const{hash:_hash,...withoutHash}=plan;if(hashCanonicalValue(withoutHash)!==plan.hash){findings.push({rule:"hash",path:["hash"],message:"prepared plan hash does not match"})}return findings}function calculateTopologicalOrder(nodes){const ids=new Set(nodes.map(node=>node.task_id));const indegree=new Map(nodes.map(node=>[node.task_id,0]));const dependents=new Map;for(const node of nodes){for(const dependency of new Set(node.depends_on)){if(!ids.has(dependency)||dependency===node.task_id)continue;indegree.set(node.task_id,(indegree.get(node.task_id)??0)+1);dependents.set(dependency,[...dependents.get(dependency)??[],node.task_id])}}const ready=[...indegree].filter(([,degree])=>degree===0).map(([id])=>id).sort();const order=[];while(ready.length>0){const current=ready.shift();order.push(current);for(const dependent of(dependents.get(current)??[]).sort()){const next=(indegree.get(dependent)??0)-1;indegree.set(dependent,next);if(next===0){ready.push(dependent);ready.sort()}}}return order}function specIdsForPrdPlanV2(plan,prdId){if(plan.source.type!=="prd"||plan.source.prd_id!==prdId){throw new TypeError(`Prepared plan source must be prd ${prdId}`)}const ids=plan.blueprints.changes.map(change=>{if(change.source.type!=="prd"||change.source.prd_id!==prdId||change.source.spec_id===null){throw new TypeError(`Every PRD Change must belong to a SPEC of ${prdId}`)}return change.source.spec_id});return[...new Set(ids)].sort()}function transitiveDependencies(nodes){const direct=new Map(nodes.map(node=>[node.task_id,node.depends_on]));const result2=new Map;const visit=(taskId,seen)=>{const cached2=result2.get(taskId);if(cached2!==void 0)return cached2;if(seen.has(taskId))return new Set;const dependencies=new Set;for(const dependency of direct.get(taskId)??[]){dependencies.add(dependency);for(const ancestor of visit(dependency,new Set([...seen,taskId]))){dependencies.add(ancestor)}}result2.set(taskId,dependencies);return dependencies};for(const taskId of direct.keys())visit(taskId,new Set);return result2}function writeScopesMayOverlap(left,right){if(left===right)return true;const leftWildcard=left.search(/[*?]/);const rightWildcard=right.search(/[*?]/);if(leftWildcard===-1&&rightWildcard===-1)return false;const leftRoot=left.slice(0,leftWildcard===-1?left.length:leftWildcard).replace(/\/$/,"");const rightRoot=right.slice(0,rightWildcard===-1?right.length:rightWildcard).replace(/\/$/,"");return leftRoot===rightRoot||leftRoot.startsWith(`${rightRoot}/`)||rightRoot.startsWith(`${leftRoot}/`)}function sourceMatches(planSource,changeSource){if(planSource.type!==changeSource.type)return false;if(planSource.type==="task"&&changeSource.type==="task"){return planSource.task_id===changeSource.task_id}if(planSource.type==="spec"&&changeSource.type==="spec"){return planSource.spec_id===changeSource.spec_id}return planSource.type==="prd"&&changeSource.type==="prd"&&planSource.prd_id===changeSource.prd_id}function findDuplicates(values2,rule,path,findings){const seen=new Set;for(const value of values2){if(seen.has(value))findings.push({rule,path,message:`Duplicate value: ${value}`});seen.add(value)}}function addDuplicateIssues(values2,field,context){const seen=new Set;for(const value of values2){if(seen.has(value)){context.addIssue({code:"custom",path:[field],message:`Duplicate value: ${value}`})}seen.add(value)}}function hashCanonicalValue(value){return createHash5("sha256").update(JSON.stringify(canonicalize(value))).digest("hex")}function canonicalize(value){if(Array.isArray(value))return value.map(canonicalize);if(value!==null&&typeof value==="object"){return Object.fromEntries(Object.entries(value).sort(([left],[right])=>left.localeCompare(right)).map(([key,nested])=>[key,canonicalize(nested)]))}return value}var exactVersionSchema=external_exports.string().min(1).superRefine((value,context)=>{if(value.toLowerCase()==="latest"||/[<>=~^*|,\s]/.test(value)||/(?:^|[.-])[xX](?:$|[.-])/.test(value)){context.addIssue({code:"custom",message:"Expected an exact resolved version, not a range, wildcard, or moving tag"})}});var workspaceSourceSchema=external_exports.string().min(1).superRefine((value,context)=>{if(value.includes("\\")||value.includes("\0")||value.startsWith("/")||value.startsWith("./")||/^[A-Za-z]:/.test(value)||value.split("/").some(segment=>segment.length===0||segment==="."||segment==="..")){context.addIssue({code:"custom",message:"version_source must be a canonical workspace-relative file path"})}});var stackComponentV2Schema=external_exports.object({name:external_exports.string().min(1),kind:external_exports.enum(["language","runtime","framework","library","persistence","database","tooling","platform"]),version:exactVersionSchema,version_source:workspaceSourceSchema}).strict();var specImplementationV2Schema=external_exports.object({stack_profile:external_exports.string().min(1),stack_overrides:external_exports.record(external_exports.string(),external_exports.unknown()),stack_description:external_exports.string().min(20),stack_components:external_exports.array(stackComponentV2Schema).min(1)}).strict().superRefine((value,context)=>{if(!value.stack_components.some(component=>component.kind==="language")){context.addIssue({code:"custom",path:["stack_components"],message:"SPEC implementation requires at least one exact programming language"})}const description=value.stack_description.toLocaleLowerCase("en");for(const[index,component]of value.stack_components.entries()){if(!description.includes(component.name.toLocaleLowerCase("en"))||!description.includes(component.version.toLocaleLowerCase("en"))){context.addIssue({code:"custom",path:["stack_components",index],message:`stack_description must mention ${component.name} ${component.version}`})}}});async function assertSpecImplementationMatchesProject(implementation,filesystem,layout){if(implementation===null){throw new TypeError("SPEC requires an implementation stack snapshot before prepare or execute")}const projectStack=layout.projectConfig?.stack;if(projectStack===void 0){throw new TypeError("SPEC stack validation requires .agents/config/project.yaml")}if(implementation.stack_profile!==projectStack.profile){throw new TypeError(`SPEC stack_profile ${implementation.stack_profile} does not match project stack.profile ${projectStack.profile}`)}if(canonicalJson(implementation.stack_overrides)!==canonicalJson(projectStack.overrides)){throw new TypeError("SPEC stack_overrides do not match project stack.overrides")}for(const component of implementation.stack_components){if(!await filesystem.exists(component.version_source)){throw new TypeError(`SPEC stack component ${component.name} has missing version source ${component.version_source}`)}const source=await filesystem.readText(component.version_source);if(!source.includes(component.version)){throw new TypeError(`SPEC stack component ${component.name} version source ${component.version_source} does not contain exact version ${component.version}`)}}}function canonicalJson(value){if(Array.isArray(value))return`[${value.map(canonicalJson).join(",")}]`;if(value!==null&&typeof value==="object"){return`{${Object.entries(value).sort(([left],[right])=>left.localeCompare(right)).map(([key,nested])=>`${JSON.stringify(key)}:${canonicalJson(nested)}`).join(",")}}`}return JSON.stringify(value)}var prdV2DocumentSchema=external_exports.object({schema_version:external_exports.literal(2),id:prdIdV2Schema,revision:external_exports.number().int().positive(),title:external_exports.string().min(1),status:external_exports.enum(["draft","ready","active","delivered","blocked","failed","cancelled"]),status_reason:external_exports.string().min(1).nullable().default(null),outcome_status:external_exports.enum(["unmeasured","measuring","met","not_met","inconclusive"]),problem:external_exports.string().min(1),audiences:external_exports.array(external_exports.string().min(1)),outcomes:external_exports.array(external_exports.string().min(1)),outcome_ids:external_exports.array(outcomeIdV2Schema),constraints:external_exports.array(external_exports.string().min(1)),non_goals:external_exports.array(external_exports.string().min(1)),prepared_plan:preparedPlanV2Schema.nullable(),plan_ref:planRefV2Schema.nullable().default(null),creation_run_id:external_exports.string().startsWith("RUN-").nullable().default(null),created_at:timestampV2Schema,updated_at:timestampV2Schema}).strict().superRefine((value,context)=>{if(value.prepared_plan!==null&&value.plan_ref!==null){context.addIssue({code:"custom",message:"PRD cannot contain prepared_plan and plan_ref"})}if(value.outcome_ids.length!==value.outcomes.length){context.addIssue({code:"custom",path:["outcome_ids"],message:"PRD outcome_ids must identify every declared outcome exactly once"})}if(new Set(value.outcome_ids).size!==value.outcome_ids.length){context.addIssue({code:"custom",path:["outcome_ids"],message:"PRD outcome_ids must be unique"})}});var prdV2Schema=external_exports.preprocess(withCanonicalOutcomeIds,prdV2DocumentSchema);var deliverySpecV2Schema=external_exports.object({schema_version:external_exports.literal(2),id:specIdV2Schema,prd_id:prdIdV2Schema.nullable(),revision:external_exports.number().int().positive(),title:external_exports.string().min(1),status:external_exports.enum(["draft","ready","active","delivered","blocked","failed","cancelled"]),status_reason:external_exports.string().min(1).nullable().default(null),objective:external_exports.string().min(1),included_scope:external_exports.array(external_exports.string().min(1)),excluded_scope:external_exports.array(external_exports.string().min(1)),requirement_ids:external_exports.array(requirementIdV2Schema),acceptance_ids:external_exports.array(acceptanceIdV2Schema),implementation:specImplementationV2Schema.nullable().default(null),prepared_plan:preparedPlanV2Schema.nullable(),plan_ref:planRefV2Schema.nullable().default(null),creation_run_id:external_exports.string().startsWith("RUN-").nullable().default(null),created_at:timestampV2Schema,updated_at:timestampV2Schema}).strict().superRefine((value,context)=>{if(value.prepared_plan!==null&&value.plan_ref!==null){context.addIssue({code:"custom",message:"SPEC cannot contain prepared_plan and plan_ref"})}});var changeV2Schema=external_exports.object({schema_version:external_exports.literal(2),id:changeIdV2Schema,revision:external_exports.number().int().positive(),title:external_exports.string().min(1),status:external_exports.enum(["draft","planned","executing","verifying","completed","failed","blocked","cancelled"]),status_reason:external_exports.string().min(1).nullable().optional(),risk:riskProfileV2Schema,source:changeSourceV2Schema,requirement_ids:external_exports.array(requirementIdV2Schema).min(1),acceptance_ids:external_exports.array(acceptanceIdV2Schema).min(1),requirement_impact:requirementImpactV2Schema,task_ids:external_exports.array(taskIdV2Schema).min(1),plan_revision:external_exports.number().int().positive().nullable(),plan_hash:sha256V2Schema.nullable(),created_at:timestampV2Schema,updated_at:timestampV2Schema,started_at:timestampV2Schema.nullable(),finished_at:timestampV2Schema.nullable(),result:external_exports.string().min(1).nullable()}).strict().superRefine((value,context)=>{const hasNoPlan=value.plan_revision===null&&value.plan_hash===null;if(value.status==="draft"||value.status==="cancelled"&&hasNoPlan){if(!hasNoPlan){context.addIssue({code:"custom",message:"draft Change cannot contain a prepared plan"})}}else if(hasNoPlan||value.plan_revision===null||value.plan_hash===null){context.addIssue({code:"custom",message:`${value.status} Change requires plan_revision and plan_hash`})}const terminal=["completed","failed","cancelled"].includes(value.status);if(terminal&&(value.finished_at===null||value.result===null)){context.addIssue({code:"custom",message:"terminal Change requires finished_at and result"})}if(!terminal&&(value.finished_at!==null||value.result!==null)){context.addIssue({code:"custom",message:"non-terminal Change cannot contain finished_at or result"})}if(["executing","verifying","completed"].includes(value.status)&&value.started_at===null){context.addIssue({code:"custom",message:`${value.status} Change requires started_at`})}});var executionDagNodeV2Schema=external_exports.object({task_id:taskIdV2Schema,change_id:changeIdV2Schema,depends_on:external_exports.array(taskIdV2Schema)}).strict();var executionCommonV2Fields={schema_version:external_exports.literal(2),id:executionIdV2Schema,revision:external_exports.number().int().positive(),status:external_exports.enum(["planned","running","paused","verifying","completed","failed","blocked","cancelled"]),status_reason:external_exports.string().min(1).nullable().optional(),policy:executionPolicyV2Schema,created_at:timestampV2Schema,updated_at:timestampV2Schema,started_at:timestampV2Schema.nullable(),finished_at:timestampV2Schema.nullable(),result:external_exports.string().min(1).nullable()};var materializedDeliveryExecutionV2Schema=external_exports.object({...executionCommonV2Fields,kind:external_exports.literal("delivery").optional(),client_turn_id:external_exports.string().min(1).max(200).nullable().optional(),origin:planSourceV2Schema,plan_revision:external_exports.number().int().positive(),plan_hash:sha256V2Schema,dag:external_exports.object({nodes:external_exports.array(executionDagNodeV2Schema).min(1),topological_order:external_exports.array(taskIdV2Schema).min(1)}).strict()}).strict();var deliveryIntakeExecutionV2Schema=external_exports.object({...executionCommonV2Fields,kind:external_exports.literal("delivery"),client_turn_id:external_exports.string().min(1).max(200),origin:planSourceV2Schema,status:external_exports.literal("planned"),plan_revision:external_exports.null(),plan_hash:external_exports.null(),dag:external_exports.object({nodes:external_exports.array(executionDagNodeV2Schema).length(0),topological_order:external_exports.array(taskIdV2Schema).length(0)}).strict()}).strict();var interactionExecutionV2Schema=external_exports.object({...executionCommonV2Fields,kind:external_exports.literal("interaction"),client_turn_id:external_exports.string().min(1).max(200),origin:external_exports.object({type:external_exports.literal("interaction"),conversation_id:external_exports.string().startsWith("CONV-")}).strict(),plan_revision:external_exports.null(),plan_hash:external_exports.null(),dag:external_exports.object({nodes:external_exports.array(executionDagNodeV2Schema).length(0),topological_order:external_exports.array(taskIdV2Schema).length(0)}).strict()}).strict();var executionV2Schema=external_exports.union([interactionExecutionV2Schema,deliveryIntakeExecutionV2Schema,materializedDeliveryExecutionV2Schema]).superRefine((value,context)=>{const terminal=["completed","failed","cancelled"].includes(value.status);if(terminal&&(value.finished_at===null||value.result===null)){context.addIssue({code:"custom",message:"terminal Execution requires finished_at and result"})}if(!terminal&&(value.finished_at!==null||value.result!==null)){context.addIssue({code:"custom",message:"non-terminal Execution cannot contain finished_at or result"})}if(["running","paused","verifying","completed"].includes(value.status)&&value.started_at===null){context.addIssue({code:"custom",message:`${value.status} Execution requires started_at`})}});function withCanonicalOutcomeIds(value){if(typeof value!=="object"||value===null||Array.isArray(value))return value;const record2=value;if(Object.hasOwn(record2,"outcome_ids"))return value;if(typeof record2.id!=="string"||!Array.isArray(record2.outcomes))return value;return{...record2,outcome_ids:canonicalOutcomeIds(record2.id,record2.outcomes)}}function canonicalOutcomeIds(prdId,outcomes){const stableStem=prdId.replace(/^PRD-/,"OUT-");return outcomes.map((_,index)=>`${stableStem}-${String(index+1).padStart(2,"0")}`)}import{createHash as createHash6}from"node:crypto";var ExecutionClientTurnConflictError=class extends Error{name="ExecutionClientTurnConflictError"};var ExecutionClientTurnClaimsV2=class{constructor(filesystem,layout){this.filesystem=filesystem;this.layout=layout}filesystem;layout;async claimIdentity(clientTurnId,proposedId,kind,origin,executions){const existing=executions.filter(execution=>execution.client_turn_id===clientTurnId);if(existing.length>1){throw new ExecutionClientTurnConflictError(`Client turn resolves to multiple Executions: ${clientTurnId}`)}const expected=existing[0];if(expected!==void 0)this.assertExpectedExecution(expected,kind,origin);const claim={schema_version:1,client_turn_id:clientTurnId,execution_id:expected?.id??proposedId,kind,origin};const path=this.claimPath(clientTurnId);try{await this.filesystem.writeTextExclusive(path,`${JSON.stringify(claim)}
|
|
995
|
+
`);return{id,path}}function runEvalSuite(cases,profile){const results=cases.map(testCase=>{const startedAt=performance.now();const findings=testCase.validator==="cqrs"?validateCqrs(testCase.units,profile):validateArchitecture(testCase.units,profile);const actualRules=[...new Set(findings.map(item=>item.rule))].sort();const expectedRules=[...testCase.expectedRules].sort();return{id:testCase.id,passed:JSON.stringify(actualRules)===JSON.stringify(expectedRules),expectedRules,actualRules,durationMs:Math.max(0,performance.now()-startedAt)}});return{passed:results.every(result2=>result2.passed),offline:true,cases:results}}function guardDiff(changedFiles,ledgerFiles){const canonicalChanges=changedFiles.filter(path=>!path.startsWith(".agents/"));return canonicalChanges.filter(path=>!ledgerFiles.includes(path)).map(path=>({rule:"untracked-diff",message:`${path} is not present in the active task ledger`}))}var BUILTIN_EVAL_CASES=[{id:"domain-rejects-framework",units:[{path:"src/modules/a/domain/entity.ts",content:'import { Hono } from "hono";'}],expectedRules:["domain-framework-dependency"]},{id:"query-rejects-write",units:[{path:"src/modules/a/application/queries/get.query.ts",content:"export const get = (port: WritePort) => port.save({});"}],expectedRules:["query-side-effect","query-write-port"],validator:"cqrs"},{id:"pure-query-passes",units:[{path:"src/modules/a/application/queries/get.query.ts",content:"export const get = (port: ReadPort) => port.find();"}],expectedRules:[],validator:"cqrs"}];function scanInfrastructureSecurity(path,content){const findings=[];if(/\.ya?ml$/.test(path)&&/(?:privileged:\s*true|network_mode:\s*["']?host)/i.test(content)){findings.push({rule:"docker-unsafe-isolation",path})}if(/\.tf$/.test(path)&&/(?:cidr_blocks|source_ranges)\s*=\s*\[[^\]]*["']0\.0\.0\.0\/0/i.test(content)){findings.push({rule:"terraform-public-ingress",path})}if(/\.sql$/.test(path)&&/GRANT\s+ALL(?:\s+PRIVILEGES)?[\s\S]*\sTO\s+(?:PUBLIC|\w+)/i.test(content)){findings.push({rule:"sql-overprivileged-grant",path})}return findings}function runCategoryEval(category){if(category==="architecture"){return runEvalSuite(BUILTIN_EVAL_CASES.filter(item=>item.id.includes("domain")))}if(category==="cqrs"){return runEvalSuite(BUILTIN_EVAL_CASES.filter(item=>!item.id.includes("domain")))}const startedAt=performance.now();let passed=false;let actualRules=[];let expectedRules=[];if(category==="specs"){expectedRules=["untracked-diff"];actualRules=guardDiff(["src/new.ts"],[]).map(item=>item.rule);passed=expectedRules.every(rule=>actualRules.includes(rule))}else if(category==="security"){expectedRules=["generic-secret"];actualRules=scanSecrets("fixture.ts",'const token = "definitely-not-a-real-secret"').map(item=>item.kind);passed=expectedRules.every(rule=>actualRules.includes(rule))}else if(category==="infrastructure"){expectedRules=["docker-unsafe-isolation","terraform-public-ingress","sql-overprivileged-grant"];actualRules=[...scanInfrastructureSecurity("compose.yaml","services:\n app:\n privileged: true"),...scanInfrastructureSecurity("main.tf",'ingress { cidr_blocks = ["0.0.0.0/0"] }'),...scanInfrastructureSecurity("grant.sql","GRANT ALL PRIVILEGES ON app TO PUBLIC;")].map(item=>item.rule);passed=expectedRules.every(rule=>actualRules.includes(rule))}else if(category==="adapters"){const files=adapterFiles(process.cwd());actualRules=files.map(file2=>file2.path);expectedRules=[...actualRules];passed=files.length>0&&new Set(files.map(file2=>file2.path)).size===files.length&&files.every(file2=>file2.content.includes("zaip-managed"))}else if(category==="context"){actualRules=[String(estimateTokens("12345678"))];expectedRules=[...actualRules];passed=Number(actualRules[0])>0}return{passed,offline:true,cases:[{id:`${category}-builtin`,passed,expectedRules,actualRules,durationMs:performance.now()-startedAt}]}}function runAllCategoryEvals(){const categories=["specs","architecture","cqrs","security","infrastructure","adapters","context"];const reports=categories.map(runCategoryEval);return{passed:reports.every(report=>report.passed),offline:true,cases:reports.flatMap(report=>report.cases)}}var SHARED_FIELDS=["objective","requirement_ids","acceptance_ids","write_scopes"];var ADAPTIVE_TEMPLATES={simple:{level:"simple",requiredFields:[...SHARED_FIELDS,"verification"],optionalFields:["risk_notes","rollback"],maximumUnresolvedQuestions:0},standard:{level:"standard",requiredFields:[...SHARED_FIELDS,"included_scope","excluded_scope","design","risks","verification","rollback"],optionalFields:["rollout","open_questions"],maximumUnresolvedQuestions:2},complex:{level:"complex",requiredFields:[...SHARED_FIELDS,"problem","outcomes","included_scope","excluded_scope","architecture","security","dag","budgets","risks","rollout","rollback","verification","independent_reviewer"],optionalFields:["open_questions"],maximumUnresolvedQuestions:3}};var assuranceValidationKindSchema=external_exports.enum(["test","eval","check","review","spec_review","quality_review","mutation","integration","cross_spec_e2e"]);var taskAssuranceContractV2Schema=external_exports.object({schema_version:external_exports.literal(2),assurance_version:external_exports.literal(1),profile:external_exports.enum(["task-lite","task-standard-2","task-standard-3","task-critical"]),risk:external_exports.enum(["lite","standard","critical"]),minimum_validation_artifacts:external_exports.number().int().positive(),maximum_validation_artifacts:external_exports.number().int().positive().nullable(),minimum_evidence_artifacts:external_exports.number().int().positive(),maximum_evidence_artifacts:external_exports.number().int().positive().nullable(),minimum_distinct_modalities:external_exports.number().int().positive(),complete_acceptance_coverage:external_exports.literal(true),evidence_per_acceptance:external_exports.boolean(),requires_independent_verifier:external_exports.boolean(),requires_mutation_discrimination:external_exports.boolean(),minimum_mutation_kill_ratio:external_exports.number().min(0).max(1).nullable(),requires_rollback:external_exports.boolean(),requires_final_commit_evidence:external_exports.boolean(),required_modalities:external_exports.array(assuranceValidationKindSchema)}).strict().superRefine((value,context)=>{if(value.maximum_validation_artifacts!==null&&value.maximum_validation_artifacts<value.minimum_validation_artifacts){context.addIssue({code:"custom",path:["maximum_validation_artifacts"],message:"maximum validation artifacts cannot be lower than the minimum"})}if(value.maximum_evidence_artifacts!==null&&value.maximum_evidence_artifacts<value.minimum_evidence_artifacts){context.addIssue({code:"custom",path:["maximum_evidence_artifacts"],message:"maximum Evidence artifacts cannot be lower than the minimum"})}});function resolveTaskAssuranceContract(input){if(input.risk==="lite"){return taskAssuranceContractV2Schema.parse({...taskContractBase("task-lite","lite",1,1),maximum_validation_artifacts:1,maximum_evidence_artifacts:1})}if(input.risk==="standard"){const count=input.standard_depth==="elevated"?3:2;return taskAssuranceContractV2Schema.parse({...taskContractBase(`task-standard-${count}`,"standard",count,count),maximum_validation_artifacts:count,maximum_evidence_artifacts:count,required_modalities:["test"]})}return taskAssuranceContractV2Schema.parse({...taskContractBase("task-critical","critical",3,1),maximum_validation_artifacts:null,maximum_evidence_artifacts:null,evidence_per_acceptance:true,requires_independent_verifier:true,requires_mutation_discrimination:true,minimum_mutation_kill_ratio:1,requires_rollback:true,requires_final_commit_evidence:true,required_modalities:["test","quality_review","mutation"]})}var deliveryAssuranceContractV2Schema=external_exports.object({schema_version:external_exports.literal(2),assurance_version:external_exports.literal(1),profile:external_exports.enum(["spec-delivery","prd-delivery"]),origin:external_exports.enum(["spec","prd"]),minimum_parent_validation_artifacts:external_exports.number().int().positive(),minimum_parent_evidence_artifacts:external_exports.number().int().positive(),minimum_distinct_modalities:external_exports.number().int().positive(),complete_acceptance_coverage:external_exports.literal(true),requires_acceptance_matrix:external_exports.literal(true),requires_independent_verifier:external_exports.literal(true),integration_modality:external_exports.enum(["integration","cross_spec_e2e"]),evidence_per_acceptance:external_exports.boolean(),evidence_per_outcome:external_exports.boolean(),requires_mutation_discrimination:external_exports.boolean(),minimum_mutation_kill_ratio:external_exports.number().min(0).max(1).nullable(),requires_rollback:external_exports.boolean(),requires_final_commit_evidence:external_exports.boolean(),required_modalities:external_exports.array(assuranceValidationKindSchema).min(3)}).strict();function resolveDeliveryAssuranceContract(origin){const integrationModality=origin==="spec"?"integration":"cross_spec_e2e";return deliveryAssuranceContractV2Schema.parse({schema_version:2,assurance_version:1,profile:origin==="spec"?"spec-delivery":"prd-delivery",origin,minimum_parent_validation_artifacts:origin==="prd"?5:3,minimum_parent_evidence_artifacts:3,minimum_distinct_modalities:origin==="prd"?5:3,complete_acceptance_coverage:true,requires_acceptance_matrix:true,requires_independent_verifier:true,integration_modality:integrationModality,evidence_per_acceptance:origin==="prd",evidence_per_outcome:origin==="prd",requires_mutation_discrimination:origin==="prd",minimum_mutation_kill_ratio:origin==="prd"?1:null,requires_rollback:origin==="prd",requires_final_commit_evidence:true,required_modalities:origin==="prd"?[integrationModality,"spec_review","quality_review","test","mutation"]:[integrationModality,"spec_review","quality_review"]})}function taskContractBase(profile,risk2,validationCount,evidenceCount){return{schema_version:2,assurance_version:1,profile,risk:risk2,minimum_validation_artifacts:validationCount,maximum_validation_artifacts:null,minimum_evidence_artifacts:evidenceCount,maximum_evidence_artifacts:null,minimum_distinct_modalities:validationCount,complete_acceptance_coverage:true,evidence_per_acceptance:false,requires_independent_verifier:false,requires_mutation_discrimination:false,minimum_mutation_kill_ratio:null,requires_rollback:false,requires_final_commit_evidence:false,required_modalities:[]}}var timestampSchema=external_exports.string().datetime({offset:true});var commitShaSchema=external_exports.string().regex(/^(?:[a-f0-9]{40}|[a-f0-9]{64})$/).nullable();var acceptanceIdsSchema=uniqueStrings(external_exports.string().startsWith("AC-")).min(1);var validationPrefixes={test:"TEST-",eval:"EVAL-",check:"CHECK-",review:"REVIEW-",spec_review:"REVIEW-SPEC-",quality_review:"REVIEW-QUALITY-",mutation:"MUT-",integration:"INT-",cross_spec_e2e:"E2E-"};var validationArtifactV2Schema=external_exports.object({schema_version:external_exports.literal(2),id:external_exports.string().min(1),kind:assuranceValidationKindSchema,task_id:external_exports.string().startsWith("TASK-"),change_id:external_exports.string().startsWith("CHG-"),execution_id:external_exports.string().startsWith("EXEC-"),run_id:external_exports.string().startsWith("RUN-"),acceptance_ids:acceptanceIdsSchema,executed_at:timestampSchema,command:external_exports.string().min(1).nullable(),status:external_exports.enum(["passed","failed","not_applicable"]),asserted_outcomes:uniqueStrings(external_exports.string().min(1)).min(1),locators:uniqueStrings(external_exports.string().min(1)).min(1),author_id:external_exports.string().min(1),commit_sha:commitShaSchema,not_applicable_reason:external_exports.string().min(1).nullable()}).strict().superRefine((value,context)=>{if(!value.id.startsWith(validationPrefixes[value.kind])){context.addIssue({code:"custom",path:["id"],message:`${value.kind} validation id must start with ${validationPrefixes[value.kind]}`})}if(!isReview(value.kind)&&value.command===null){context.addIssue({code:"custom",path:["command"],message:`${value.kind} validation requires its executed command`})}addApplicabilityIssues(value.status,value.not_applicable_reason,context)});var evidenceArtifactV2Schema=external_exports.object({schema_version:external_exports.literal(2),id:external_exports.string().startsWith("EVD-"),task_id:external_exports.string().startsWith("TASK-"),change_id:external_exports.string().startsWith("CHG-"),execution_id:external_exports.string().startsWith("EXEC-"),run_id:external_exports.string().startsWith("RUN-"),acceptance_ids:acceptanceIdsSchema,outcome_ids:uniqueStrings(external_exports.string().startsWith("OUT-")).default([]),validation_artifact_ids:uniqueStrings(external_exports.string().min(1)).min(1),observed_at:timestampSchema,status:external_exports.enum(["passed","not_applicable"]),summary:external_exports.string().min(1),locators:uniqueStrings(external_exports.string().min(1)).min(1),commit_sha:commitShaSchema,not_applicable_reason:external_exports.string().min(1).nullable()}).strict().superRefine((value,context)=>{addApplicabilityIssues(value.status,value.not_applicable_reason,context)});function uniqueStrings(item){return external_exports.array(item).superRefine((values2,context)=>{const seen=new Set;for(const[index,value]of values2.entries()){if(seen.has(value)){context.addIssue({code:"custom",path:[index],message:`duplicate value: ${value}`})}seen.add(value)}})}function addApplicabilityIssues(status,reason,context){if(status==="not_applicable"&&reason===null){context.addIssue({code:"custom",path:["not_applicable_reason"],message:"not-applicable artifacts require a reason"})}if(status!=="not_applicable"&&reason!==null){context.addIssue({code:"custom",path:["not_applicable_reason"],message:"applicable artifacts cannot retain a not-applicable reason"})}}function isReview(kind){return kind==="review"||kind==="spec_review"||kind==="quality_review"}function assessTaskAssurance(input){const validations=input.validations.filter(artifact=>artifact.status==="passed");const evidences=input.evidences.filter(artifact=>artifact.status==="passed");const findings=[];addCountFinding(findings,"validation-count","validation artifacts",validations.length,input.contract.minimum_validation_artifacts,input.contract.maximum_validation_artifacts);addCountFinding(findings,"evidence-count","Evidence artifacts",evidences.length,input.contract.minimum_evidence_artifacts,input.contract.maximum_evidence_artifacts);const modalities=new Set(validations.map(artifact=>artifact.kind));if(modalities.size<input.contract.minimum_distinct_modalities||input.contract.required_modalities.some(modality=>!modalities.has(modality))){findings.push({code:"validation-modality",message:`Task assurance requires ${input.contract.minimum_distinct_modalities} distinct modalities including ${input.contract.required_modalities.join(", ")||"any valid modality"}`})}addCoverageFinding(findings,"acceptance-validation-coverage","Validation",input.acceptance_ids,validations.flatMap(artifact=>artifact.acceptance_ids));addCoverageFinding(findings,"acceptance-evidence-coverage","Evidence",input.acceptance_ids,evidences.flatMap(artifact=>artifact.acceptance_ids));addEvidenceLinkFindings(findings,validations,evidences);if(input.contract.evidence_per_acceptance&&input.acceptance_ids.some(acceptanceId=>!evidences.some(evidence=>evidence.acceptance_ids.length===1&&evidence.acceptance_ids[0]===acceptanceId))){findings.push({code:"evidence-per-acceptance",message:"Critical assurance requires a dedicated passed Evidence for every Acceptance Criterion"})}if(input.contract.requires_independent_verifier&&!isIndependentApproval(input.verifier)){findings.push({code:"independent-verifier",message:"An approved verifier distinct from the author is required"})}if(input.contract.requires_mutation_discrimination&&!mutationSatisfies(input.mutation,input.acceptance_ids,input.contract.minimum_mutation_kill_ratio)){findings.push({code:"mutation-discrimination",message:"Mutation discrimination must cover every Acceptance Criterion at the required kill ratio"})}if(input.contract.requires_rollback&&(input.rollback_evidence_id===null||!evidences.some(evidence=>evidence.id===input.rollback_evidence_id))){findings.push({code:"rollback",message:"Passed rollback Evidence is required"})}if(input.contract.requires_final_commit_evidence&&!artifactsMatchCommit(validations,evidences,input.expected_commit_sha)){findings.push({code:"final-commit-evidence",message:"Critical validation and Evidence must be executed on the expected final commit"})}return{valid:findings.length===0,findings}}function assessDeliveryAssurance(input){const validations=input.validations.filter(artifact=>artifact.status==="passed");const evidences=input.evidences.filter(artifact=>artifact.status==="passed");const findings=[];if(validations.length<input.contract.minimum_parent_validation_artifacts){findings.push({code:"delivery-validation-count",message:`Delivery requires at least ${input.contract.minimum_parent_validation_artifacts} parent validations`})}if(evidences.length<input.contract.minimum_parent_evidence_artifacts){findings.push({code:"delivery-evidence-count",message:`Delivery requires at least ${input.contract.minimum_parent_evidence_artifacts} parent Evidence artifacts`})}const modalities=new Set(validations.map(artifact=>artifact.kind));if(modalities.size<input.contract.minimum_distinct_modalities||input.contract.required_modalities.some(modality=>!modalities.has(modality))){findings.push({code:"delivery-modality",message:`Delivery requires ${input.contract.required_modalities.join(" and ")}`})}addCoverageFinding(findings,"acceptance-validation-coverage","Validation",input.acceptance_ids,validations.flatMap(artifact=>artifact.acceptance_ids));if(input.contract.evidence_per_acceptance&&input.acceptance_ids.some(acceptanceId=>!evidences.some(evidence=>evidence.acceptance_ids.length===1&&evidence.acceptance_ids[0]===acceptanceId))){findings.push({code:"evidence-per-acceptance",message:"PRD delivery requires a dedicated passed Evidence for every Acceptance Criterion"})}addCoverageFinding(findings,"acceptance-evidence-coverage","Evidence",input.acceptance_ids,evidences.flatMap(artifact=>artifact.acceptance_ids));if(input.contract.evidence_per_outcome){addCoverageFinding(findings,"outcome-evidence-coverage","Outcome Evidence",input.outcome_ids,evidences.flatMap(artifact=>artifact.outcome_ids))}addEvidenceLinkFindings(findings,validations,evidences);if(!isIndependentApproval(input.verifier)){findings.push({code:"independent-verifier",message:"Delivery requires approval from a verifier distinct from the author"})}if(input.contract.requires_mutation_discrimination&&!mutationSatisfies(input.mutation,input.acceptance_ids,input.contract.minimum_mutation_kill_ratio)){findings.push({code:"mutation-discrimination",message:"PRD delivery requires mutation discrimination for every Acceptance Criterion"})}if(input.contract.requires_rollback&&(input.rollback_evidence_id===null||!evidences.some(evidence=>evidence.id===input.rollback_evidence_id))){findings.push({code:"rollback",message:"PRD delivery requires passed rollback Evidence"})}if(input.contract.requires_final_commit_evidence&&!artifactsMatchCommit(validations,evidences,input.expected_commit_sha)){findings.push({code:"final-commit-evidence",message:"Delivery validation and Evidence must be executed on the expected final commit"})}return{valid:findings.length===0,findings}}function addCountFinding(findings,code,label,actual,minimum,maximum){if(actual<minimum||maximum!==null&&actual>maximum){findings.push({code,message:`${label} count ${actual} is outside ${minimum}..${maximum??"unbounded"}`})}}function addCoverageFinding(findings,code,label,required2,coveredValues){const covered=new Set(coveredValues);const missing=required2.filter(id=>!covered.has(id));if(missing.length>0)findings.push({code,message:`${label} is missing: ${missing.join(", ")}`})}function addEvidenceLinkFindings(findings,validations,evidences){const validationById=new Map(validations.map(artifact=>[artifact.id,artifact]));const unlinked=evidences.filter(evidence=>{const linked=evidence.validation_artifact_ids.map(id=>validationById.get(id));if(linked.some(artifact=>artifact===void 0))return true;const resolved=linked.filter(artifact=>artifact!==void 0);const acceptanceIds=new Set(resolved.flatMap(artifact=>artifact.acceptance_ids));return evidence.acceptance_ids.some(id=>!acceptanceIds.has(id))||resolved.some(artifact=>artifact.task_id!==evidence.task_id||artifact.change_id!==evidence.change_id||artifact.execution_id!==evidence.execution_id)});if(unlinked.length>0){findings.push({code:"evidence-link",message:`Evidence references validation that did not pass: ${unlinked.map(item=>item.id).join(", ")}`})}}function artifactsMatchCommit(validations,evidences,expectedCommitSha){return expectedCommitSha!==null&&validations.length>0&&evidences.length>0&&validations.every(artifact=>artifact.commit_sha===expectedCommitSha)&&evidences.every(artifact=>artifact.commit_sha===expectedCommitSha)}function isIndependentApproval(verifier){return verifier!==null&&verifier.status==="approved"&&verifier.author_id!==verifier.reviewer_id}function mutationSatisfies(mutation,acceptanceIds,threshold){if(mutation===null||!mutation.baseline_passed||mutation.total_mutants<1||mutation.killed_mutants<1||mutation.kill_ratio<(threshold??0)){return false}const covered=new Set(mutation.acceptance_ids);return acceptanceIds.every(id=>covered.has(id))}import{createHash as createHash5}from"node:crypto";var timestampV2Schema=external_exports.string().datetime({offset:true});var sha256V2Schema=external_exports.string().regex(/^[a-f0-9]{64}$/);var prdIdV2Schema=external_exports.string().startsWith("PRD-");var specIdV2Schema=external_exports.string().startsWith("SPEC-");var changeIdV2Schema=external_exports.string().startsWith("CHG-");var taskIdV2Schema=external_exports.string().startsWith("TASK-");var executionIdV2Schema=external_exports.string().startsWith("EXEC-");var requirementIdV2Schema=external_exports.string().startsWith("REQ-");var acceptanceIdV2Schema=external_exports.string().startsWith("AC-");var outcomeIdV2Schema=external_exports.string().startsWith("OUT-");var riskProfileV2Schema=external_exports.enum(["lite","standard","critical"]);var priorityV2Schema=external_exports.enum(["low","medium","high","urgent"]);var planRefV2Schema=external_exports.object({revision:external_exports.number().int().positive(),hash:sha256V2Schema,execution_id:executionIdV2Schema}).strict();function planRefV2(plan){return planRefV2Schema.parse({revision:plan.revision,hash:plan.hash,execution_id:plan.execution_id})}var planSourceV2Schema=external_exports.discriminatedUnion("type",[external_exports.object({type:external_exports.literal("task"),task_id:taskIdV2Schema}).strict(),external_exports.object({type:external_exports.literal("spec"),spec_id:specIdV2Schema}).strict(),external_exports.object({type:external_exports.literal("prd"),prd_id:prdIdV2Schema}).strict()]);var changeSourceV2Schema=external_exports.discriminatedUnion("type",[external_exports.object({type:external_exports.literal("task"),task_id:taskIdV2Schema}).strict(),external_exports.object({type:external_exports.literal("spec"),spec_id:specIdV2Schema}).strict(),external_exports.object({type:external_exports.literal("prd"),prd_id:prdIdV2Schema,spec_id:specIdV2Schema.nullable()}).strict()]);var requirementImpactV2Schema=external_exports.discriminatedUnion("type",[external_exports.object({type:external_exports.literal("none"),reason:external_exports.string().min(1)}).strict(),external_exports.object({type:external_exports.literal("update"),requirement_ids:external_exports.array(requirementIdV2Schema).min(1)}).strict()]);var preparedRuntimeSelectionV2Schema=external_exports.object({model:autoModelSchema,reasoning_effort:autoReasoningEffortSchema,velocity:standardVelocitySchema.optional()}).strict();var preparedRuntimeDefaultsV2Schema=preparedRuntimeSelectionV2Schema.extend({client:external_exports.string().min(1),provider:external_exports.string().min(1)}).strict();var executionPolicyV2Schema=external_exports.object({failure_policy:external_exports.enum(["stop_on_terminal_failure","continue_independent"]),max_parallelism:external_exports.number().int().positive(),max_operational_retries:external_exports.number().int().nonnegative(),max_repair_cycles_per_task:external_exports.number().int().nonnegative(),soft_model_cycle_budget:external_exports.number().int().positive().optional(),soft_input_token_budget:external_exports.number().int().positive().optional(),context_refresh_after_cycles:external_exports.number().int().positive().optional(),verification_mode:external_exports.enum(["scoped","full"]).optional(),runtime_defaults:preparedRuntimeDefaultsV2Schema.optional()}).strict();var blueprintKeySchema=external_exports.string().regex(/^[a-z][a-z0-9-]*$/);var writeScopeSchema=external_exports.string().min(1).superRefine((value,context)=>{if(value.includes("\\")||value.includes("\0")||value.startsWith("/")||value.startsWith("./")||/^[A-Za-z]:/.test(value)||value.split("/").some(segment=>segment.length===0||segment==="."||segment==="..")){context.addIssue({code:"custom",message:"write_scope must be workspace-relative"})}});var changeBlueprintV2Schema=external_exports.object({key:blueprintKeySchema,id:changeIdV2Schema,title:external_exports.string().min(1),short_name:external_exports.string().min(1),risk:riskProfileV2Schema,source:changeSourceV2Schema,requirement_ids:external_exports.array(requirementIdV2Schema).min(1),acceptance_ids:external_exports.array(acceptanceIdV2Schema).min(1),requirement_impact:requirementImpactV2Schema}).strict().superRefine((value,context)=>{addDuplicateIssues(value.requirement_ids,"requirement_ids",context);addDuplicateIssues(value.acceptance_ids,"acceptance_ids",context)});var taskBlueprintV2Schema=external_exports.object({key:blueprintKeySchema,id:taskIdV2Schema,change_id:changeIdV2Schema,title:external_exports.string().min(1),short_name:external_exports.string().min(1),objective:external_exports.string().min(1),risk:riskProfileV2Schema,priority:priorityV2Schema,owner:external_exports.string().min(1).nullable(),requirement_ids:external_exports.array(requirementIdV2Schema).min(1),acceptance_ids:external_exports.array(acceptanceIdV2Schema).min(1),write_scopes:external_exports.array(writeScopeSchema),runtime:preparedRuntimeSelectionV2Schema.optional()}).strict().superRefine((value,context)=>{addDuplicateIssues(value.requirement_ids,"requirement_ids",context);addDuplicateIssues(value.acceptance_ids,"acceptance_ids",context);addDuplicateIssues(value.write_scopes,"write_scopes",context)});var preparedDagNodeV2Schema=external_exports.object({task_id:taskIdV2Schema,depends_on:external_exports.array(taskIdV2Schema)}).strict().superRefine((value,context)=>{if(value.depends_on.includes(value.task_id)){context.addIssue({code:"custom",path:["depends_on"],message:"self dependency"})}addDuplicateIssues(value.depends_on,"depends_on",context)});var preparedPlanDraftV2Schema=external_exports.object({revision:external_exports.number().int().positive(),source:planSourceV2Schema,execution_id:executionIdV2Schema,prepared_at:timestampV2Schema,policy:executionPolicyV2Schema,blueprints:external_exports.object({changes:external_exports.array(changeBlueprintV2Schema).min(1),tasks:external_exports.array(taskBlueprintV2Schema).min(1)}).strict(),dag:external_exports.object({nodes:external_exports.array(preparedDagNodeV2Schema).min(1)}).strict()}).strict();var preparedPlanDataV2Schema=preparedPlanDraftV2Schema.extend({schema_version:external_exports.literal(2),dag:external_exports.object({nodes:external_exports.array(preparedDagNodeV2Schema).min(1),topological_order:external_exports.array(taskIdV2Schema).min(1)}).strict(),hash:sha256V2Schema}).strict();var preparedPlanV2Schema=preparedPlanDataV2Schema.superRefine((plan,context)=>{for(const finding2 of validatePreparedPlanV2(plan)){context.addIssue({code:"custom",path:[...finding2.path],message:finding2.message})}});function createPreparedPlanV2(input){const draft=preparedPlanDraftV2Schema.parse(input);const topologicalOrder=calculateTopologicalOrder(draft.dag.nodes);const withoutHash={schema_version:2,...draft,dag:{...draft.dag,topological_order:topologicalOrder}};return preparedPlanV2Schema.parse({...withoutHash,hash:hashCanonicalValue(withoutHash)})}function validatePreparedPlanV2(plan){const findings=[];const changes=new Map(plan.blueprints.changes.map(change=>[change.id,change]));const tasks=new Map(plan.blueprints.tasks.map(task=>[task.id,task]));findDuplicates(plan.blueprints.changes.map(change=>change.key),"duplicate-key",["blueprints","changes"],findings);findDuplicates(plan.blueprints.tasks.map(task=>task.key),"duplicate-key",["blueprints","tasks"],findings);findDuplicates([...plan.blueprints.changes,...plan.blueprints.tasks].map(item=>item.id),"duplicate-id",["blueprints"],findings);for(const[index,task]of plan.blueprints.tasks.entries()){const change=changes.get(task.change_id);if(change===void 0){findings.push({rule:"missing-change",path:["blueprints","tasks",index,"change_id"],message:`${task.change_id} does not resolve`});continue}for(const requirement of task.requirement_ids){if(!change.requirement_ids.includes(requirement)){findings.push({rule:"requirement-outside-change",path:["blueprints","tasks",index,"requirement_ids"],message:`${requirement} is absent from ${change.id}`})}}for(const acceptance of task.acceptance_ids){if(!change.acceptance_ids.includes(acceptance)){findings.push({rule:"acceptance-outside-change",path:["blueprints","tasks",index,"acceptance_ids"],message:`${acceptance} is absent from ${change.id}`})}}}for(const[index,change]of plan.blueprints.changes.entries()){if(![...tasks.values()].some(task=>task.change_id===change.id)){findings.push({rule:"change-without-task",path:["blueprints","changes",index],message:`${change.id} has no task`})}if(!sourceMatches(plan.source,change.source)){findings.push({rule:"source-mismatch",path:["blueprints","changes",index,"source"],message:`${change.id} source does not match the prepared plan source`})}if(plan.source.type==="prd"&&change.source.type==="prd"&&change.source.spec_id===null){findings.push({rule:"prd-change-without-spec",path:["blueprints","changes",index,"source","spec_id"],message:`${change.id} must belong to a SPEC of ${plan.source.prd_id}`})}}if(plan.source.type==="task"&&!tasks.has(plan.source.task_id)){findings.push({rule:"missing-task",path:["source","task_id"],message:`${plan.source.task_id} does not resolve`})}const nodes=new Map(plan.dag.nodes.map(node=>[node.task_id,node]));findDuplicates(plan.dag.nodes.map(node=>node.task_id),"duplicate-id",["dag","nodes"],findings);for(const task of tasks.values()){if(!nodes.has(task.id)){findings.push({rule:"missing-task",path:["dag","nodes"],message:`${task.id} is missing from the DAG`})}}for(const[index,node]of plan.dag.nodes.entries()){if(!tasks.has(node.task_id)){findings.push({rule:"missing-task",path:["dag","nodes",index,"task_id"],message:`${node.task_id} does not resolve`})}for(const dependency of node.depends_on){if(dependency===node.task_id){findings.push({rule:"self-dependency",path:["dag","nodes",index,"depends_on"],message:`${node.task_id} depends on itself`})}else if(!tasks.has(dependency)){findings.push({rule:"missing-dependency",path:["dag","nodes",index,"depends_on"],message:`${dependency} does not resolve`})}}}const order=calculateTopologicalOrder(plan.dag.nodes);if(order.length!==tasks.size){findings.push({rule:"cycle",path:["dag"],message:"DAG contains a cycle"})}else if(JSON.stringify(order)!==JSON.stringify(plan.dag.topological_order)){findings.push({rule:"topological-order",path:["dag","topological_order"],message:"topological_order is not canonical"})}if(order.length===tasks.size){const dependencies=transitiveDependencies(plan.dag.nodes);const taskEntries=[...tasks.values()];for(let leftIndex=0;leftIndex<taskEntries.length;leftIndex+=1){for(let rightIndex=leftIndex+1;rightIndex<taskEntries.length;rightIndex+=1){const left=taskEntries[leftIndex];const right=taskEntries[rightIndex];if(left===void 0||right===void 0)continue;const overlap=left.write_scopes.find(leftScope=>right.write_scopes.some(rightScope=>writeScopesMayOverlap(leftScope,rightScope)));if(overlap===void 0)continue;const serialized=dependencies.get(left.id)?.has(right.id)===true||dependencies.get(right.id)?.has(left.id)===true;if(!serialized){findings.push({rule:"overlapping-write-scope",path:["blueprints","tasks"],message:`${left.id} and ${right.id} may overlap at ${overlap}; add a DAG dependency`})}}}}const{hash:_hash,...withoutHash}=plan;if(hashCanonicalValue(withoutHash)!==plan.hash){findings.push({rule:"hash",path:["hash"],message:"prepared plan hash does not match"})}return findings}function calculateTopologicalOrder(nodes){const ids=new Set(nodes.map(node=>node.task_id));const indegree=new Map(nodes.map(node=>[node.task_id,0]));const dependents=new Map;for(const node of nodes){for(const dependency of new Set(node.depends_on)){if(!ids.has(dependency)||dependency===node.task_id)continue;indegree.set(node.task_id,(indegree.get(node.task_id)??0)+1);dependents.set(dependency,[...dependents.get(dependency)??[],node.task_id])}}const ready=[...indegree].filter(([,degree])=>degree===0).map(([id])=>id).sort();const order=[];while(ready.length>0){const current=ready.shift();order.push(current);for(const dependent of(dependents.get(current)??[]).sort()){const next=(indegree.get(dependent)??0)-1;indegree.set(dependent,next);if(next===0){ready.push(dependent);ready.sort()}}}return order}function specIdsForPrdPlanV2(plan,prdId){if(plan.source.type!=="prd"||plan.source.prd_id!==prdId){throw new TypeError(`Prepared plan source must be prd ${prdId}`)}const ids=plan.blueprints.changes.map(change=>{if(change.source.type!=="prd"||change.source.prd_id!==prdId||change.source.spec_id===null){throw new TypeError(`Every PRD Change must belong to a SPEC of ${prdId}`)}return change.source.spec_id});return[...new Set(ids)].sort()}function transitiveDependencies(nodes){const direct=new Map(nodes.map(node=>[node.task_id,node.depends_on]));const result2=new Map;const visit=(taskId,seen)=>{const cached2=result2.get(taskId);if(cached2!==void 0)return cached2;if(seen.has(taskId))return new Set;const dependencies=new Set;for(const dependency of direct.get(taskId)??[]){dependencies.add(dependency);for(const ancestor of visit(dependency,new Set([...seen,taskId]))){dependencies.add(ancestor)}}result2.set(taskId,dependencies);return dependencies};for(const taskId of direct.keys())visit(taskId,new Set);return result2}function writeScopesMayOverlap(left,right){if(left===right)return true;const leftWildcard=left.search(/[*?]/);const rightWildcard=right.search(/[*?]/);if(leftWildcard===-1&&rightWildcard===-1)return false;const leftRoot=left.slice(0,leftWildcard===-1?left.length:leftWildcard).replace(/\/$/,"");const rightRoot=right.slice(0,rightWildcard===-1?right.length:rightWildcard).replace(/\/$/,"");return leftRoot===rightRoot||leftRoot.startsWith(`${rightRoot}/`)||rightRoot.startsWith(`${leftRoot}/`)}function sourceMatches(planSource,changeSource){if(planSource.type!==changeSource.type)return false;if(planSource.type==="task"&&changeSource.type==="task"){return planSource.task_id===changeSource.task_id}if(planSource.type==="spec"&&changeSource.type==="spec"){return planSource.spec_id===changeSource.spec_id}return planSource.type==="prd"&&changeSource.type==="prd"&&planSource.prd_id===changeSource.prd_id}function findDuplicates(values2,rule,path,findings){const seen=new Set;for(const value of values2){if(seen.has(value))findings.push({rule,path,message:`Duplicate value: ${value}`});seen.add(value)}}function addDuplicateIssues(values2,field,context){const seen=new Set;for(const value of values2){if(seen.has(value)){context.addIssue({code:"custom",path:[field],message:`Duplicate value: ${value}`})}seen.add(value)}}function hashCanonicalValue(value){return createHash5("sha256").update(JSON.stringify(canonicalize(value))).digest("hex")}function canonicalize(value){if(Array.isArray(value))return value.map(canonicalize);if(value!==null&&typeof value==="object"){return Object.fromEntries(Object.entries(value).sort(([left],[right])=>left.localeCompare(right)).map(([key,nested])=>[key,canonicalize(nested)]))}return value}var exactVersionSchema=external_exports.string().min(1).superRefine((value,context)=>{if(value.toLowerCase()==="latest"||/[<>=~^*|,\s]/.test(value)||/(?:^|[.-])[xX](?:$|[.-])/.test(value)){context.addIssue({code:"custom",message:"Expected an exact resolved version, not a range, wildcard, or moving tag"})}});var workspaceSourceSchema=external_exports.string().min(1).superRefine((value,context)=>{if(value.includes("\\")||value.includes("\0")||value.startsWith("/")||value.startsWith("./")||/^[A-Za-z]:/.test(value)||value.split("/").some(segment=>segment.length===0||segment==="."||segment==="..")){context.addIssue({code:"custom",message:"version_source must be a canonical workspace-relative file path"})}});var stackComponentV2Schema=external_exports.object({name:external_exports.string().min(1),kind:external_exports.enum(["language","runtime","framework","library","persistence","database","tooling","platform"]),version:exactVersionSchema,version_source:workspaceSourceSchema}).strict();var specImplementationV2Schema=external_exports.object({stack_profile:external_exports.string().min(1),stack_overrides:external_exports.record(external_exports.string(),external_exports.unknown()),stack_description:external_exports.string().min(20),stack_components:external_exports.array(stackComponentV2Schema).min(1)}).strict().superRefine((value,context)=>{if(!value.stack_components.some(component=>component.kind==="language")){context.addIssue({code:"custom",path:["stack_components"],message:"SPEC implementation requires at least one exact programming language"})}const description=value.stack_description.toLocaleLowerCase("en");for(const[index,component]of value.stack_components.entries()){if(!description.includes(component.name.toLocaleLowerCase("en"))||!description.includes(component.version.toLocaleLowerCase("en"))){context.addIssue({code:"custom",path:["stack_components",index],message:`stack_description must mention ${component.name} ${component.version}`})}}});async function assertSpecImplementationMatchesProject(implementation,filesystem,layout){if(implementation===null){throw new TypeError("SPEC requires an implementation stack snapshot before prepare or execute")}const projectStack=layout.projectConfig?.stack;if(projectStack===void 0){throw new TypeError("SPEC stack validation requires .agents/config/project.yaml")}if(implementation.stack_profile!==projectStack.profile){throw new TypeError(`SPEC stack_profile ${implementation.stack_profile} does not match project stack.profile ${projectStack.profile}`)}if(canonicalJson(implementation.stack_overrides)!==canonicalJson(projectStack.overrides)){throw new TypeError("SPEC stack_overrides do not match project stack.overrides")}for(const component of implementation.stack_components){if(!await filesystem.exists(component.version_source)){throw new TypeError(`SPEC stack component ${component.name} has missing version source ${component.version_source}`)}const source=await filesystem.readText(component.version_source);if(!source.includes(component.version)){throw new TypeError(`SPEC stack component ${component.name} version source ${component.version_source} does not contain exact version ${component.version}`)}}}function canonicalJson(value){if(Array.isArray(value))return`[${value.map(canonicalJson).join(",")}]`;if(value!==null&&typeof value==="object"){return`{${Object.entries(value).sort(([left],[right])=>left.localeCompare(right)).map(([key,nested])=>`${JSON.stringify(key)}:${canonicalJson(nested)}`).join(",")}}`}return JSON.stringify(value)}var prdV2DocumentSchema=external_exports.object({schema_version:external_exports.literal(2),id:prdIdV2Schema,revision:external_exports.number().int().positive(),title:external_exports.string().min(1),status:external_exports.enum(["draft","ready","active","delivered","blocked","failed","cancelled"]),status_reason:external_exports.string().min(1).nullable().default(null),outcome_status:external_exports.enum(["unmeasured","measuring","met","not_met","inconclusive"]),problem:external_exports.string().min(1),audiences:external_exports.array(external_exports.string().min(1)),outcomes:external_exports.array(external_exports.string().min(1)),outcome_ids:external_exports.array(outcomeIdV2Schema),constraints:external_exports.array(external_exports.string().min(1)),non_goals:external_exports.array(external_exports.string().min(1)),prepared_plan:preparedPlanV2Schema.nullable(),plan_ref:planRefV2Schema.nullable().default(null),creation_run_id:external_exports.string().startsWith("RUN-").nullable().default(null),created_at:timestampV2Schema,updated_at:timestampV2Schema}).strict().superRefine((value,context)=>{if(value.prepared_plan!==null&&value.plan_ref!==null){context.addIssue({code:"custom",message:"PRD cannot contain prepared_plan and plan_ref"})}if(value.outcome_ids.length!==value.outcomes.length){context.addIssue({code:"custom",path:["outcome_ids"],message:"PRD outcome_ids must identify every declared outcome exactly once"})}if(new Set(value.outcome_ids).size!==value.outcome_ids.length){context.addIssue({code:"custom",path:["outcome_ids"],message:"PRD outcome_ids must be unique"})}});var prdV2Schema=external_exports.preprocess(withCanonicalOutcomeIds,prdV2DocumentSchema);var deliverySpecV2Schema=external_exports.object({schema_version:external_exports.literal(2),id:specIdV2Schema,prd_id:prdIdV2Schema.nullable(),revision:external_exports.number().int().positive(),title:external_exports.string().min(1),status:external_exports.enum(["draft","ready","active","delivered","blocked","failed","cancelled"]),status_reason:external_exports.string().min(1).nullable().default(null),objective:external_exports.string().min(1),included_scope:external_exports.array(external_exports.string().min(1)),excluded_scope:external_exports.array(external_exports.string().min(1)),requirement_ids:external_exports.array(requirementIdV2Schema),acceptance_ids:external_exports.array(acceptanceIdV2Schema),implementation:specImplementationV2Schema.nullable().default(null),prepared_plan:preparedPlanV2Schema.nullable(),plan_ref:planRefV2Schema.nullable().default(null),creation_run_id:external_exports.string().startsWith("RUN-").nullable().default(null),created_at:timestampV2Schema,updated_at:timestampV2Schema}).strict().superRefine((value,context)=>{if(value.prepared_plan!==null&&value.plan_ref!==null){context.addIssue({code:"custom",message:"SPEC cannot contain prepared_plan and plan_ref"})}});var changeV2Schema=external_exports.object({schema_version:external_exports.literal(2),id:changeIdV2Schema,revision:external_exports.number().int().positive(),title:external_exports.string().min(1),status:external_exports.enum(["draft","planned","executing","verifying","completed","failed","blocked","cancelled"]),status_reason:external_exports.string().min(1).nullable().optional(),risk:riskProfileV2Schema,source:changeSourceV2Schema,requirement_ids:external_exports.array(requirementIdV2Schema).min(1),acceptance_ids:external_exports.array(acceptanceIdV2Schema).min(1),requirement_impact:requirementImpactV2Schema,task_ids:external_exports.array(taskIdV2Schema).min(1),plan_revision:external_exports.number().int().positive().nullable(),plan_hash:sha256V2Schema.nullable(),created_at:timestampV2Schema,updated_at:timestampV2Schema,started_at:timestampV2Schema.nullable(),finished_at:timestampV2Schema.nullable(),result:external_exports.string().min(1).nullable()}).strict().superRefine((value,context)=>{const hasNoPlan=value.plan_revision===null&&value.plan_hash===null;if(value.status==="draft"||value.status==="cancelled"&&hasNoPlan){if(!hasNoPlan){context.addIssue({code:"custom",message:"draft Change cannot contain a prepared plan"})}}else if(hasNoPlan||value.plan_revision===null||value.plan_hash===null){context.addIssue({code:"custom",message:`${value.status} Change requires plan_revision and plan_hash`})}const terminal=["completed","failed","cancelled"].includes(value.status);if(terminal&&(value.finished_at===null||value.result===null)){context.addIssue({code:"custom",message:"terminal Change requires finished_at and result"})}if(!terminal&&(value.finished_at!==null||value.result!==null)){context.addIssue({code:"custom",message:"non-terminal Change cannot contain finished_at or result"})}if(["executing","verifying","completed"].includes(value.status)&&value.started_at===null){context.addIssue({code:"custom",message:`${value.status} Change requires started_at`})}});var executionDagNodeV2Schema=external_exports.object({task_id:taskIdV2Schema,change_id:changeIdV2Schema,depends_on:external_exports.array(taskIdV2Schema)}).strict();var executionCommonV2Fields={schema_version:external_exports.literal(2),id:executionIdV2Schema,revision:external_exports.number().int().positive(),status:external_exports.enum(["planned","running","paused","verifying","completed","failed","blocked","cancelled"]),status_reason:external_exports.string().min(1).nullable().optional(),policy:executionPolicyV2Schema,created_at:timestampV2Schema,updated_at:timestampV2Schema,started_at:timestampV2Schema.nullable(),finished_at:timestampV2Schema.nullable(),result:external_exports.string().min(1).nullable()};var materializedDeliveryExecutionV2Schema=external_exports.object({...executionCommonV2Fields,kind:external_exports.literal("delivery").optional(),client_turn_id:external_exports.string().min(1).max(200).nullable().optional(),origin:planSourceV2Schema,plan_revision:external_exports.number().int().positive(),plan_hash:sha256V2Schema,dag:external_exports.object({nodes:external_exports.array(executionDagNodeV2Schema).min(1),topological_order:external_exports.array(taskIdV2Schema).min(1)}).strict()}).strict();var deliveryIntakeExecutionV2Schema=external_exports.object({...executionCommonV2Fields,kind:external_exports.literal("delivery"),client_turn_id:external_exports.string().min(1).max(200),origin:planSourceV2Schema,status:external_exports.literal("planned"),plan_revision:external_exports.null(),plan_hash:external_exports.null(),dag:external_exports.object({nodes:external_exports.array(executionDagNodeV2Schema).length(0),topological_order:external_exports.array(taskIdV2Schema).length(0)}).strict()}).strict();var interactionExecutionV2Schema=external_exports.object({...executionCommonV2Fields,kind:external_exports.literal("interaction"),client_turn_id:external_exports.string().min(1).max(200),origin:external_exports.object({type:external_exports.literal("interaction"),conversation_id:external_exports.string().startsWith("CONV-")}).strict(),plan_revision:external_exports.null(),plan_hash:external_exports.null(),dag:external_exports.object({nodes:external_exports.array(executionDagNodeV2Schema).length(0),topological_order:external_exports.array(taskIdV2Schema).length(0)}).strict()}).strict();var executionV2Schema=external_exports.union([interactionExecutionV2Schema,deliveryIntakeExecutionV2Schema,materializedDeliveryExecutionV2Schema]).superRefine((value,context)=>{const terminal=["completed","failed","cancelled"].includes(value.status);if(terminal&&(value.finished_at===null||value.result===null)){context.addIssue({code:"custom",message:"terminal Execution requires finished_at and result"})}if(!terminal&&(value.finished_at!==null||value.result!==null)){context.addIssue({code:"custom",message:"non-terminal Execution cannot contain finished_at or result"})}if(["running","paused","verifying","completed"].includes(value.status)&&value.started_at===null){context.addIssue({code:"custom",message:`${value.status} Execution requires started_at`})}});function withCanonicalOutcomeIds(value){if(typeof value!=="object"||value===null||Array.isArray(value))return value;const record2=value;if(Object.hasOwn(record2,"outcome_ids"))return value;if(typeof record2.id!=="string"||!Array.isArray(record2.outcomes))return value;return{...record2,outcome_ids:canonicalOutcomeIds(record2.id,record2.outcomes)}}function canonicalOutcomeIds(prdId,outcomes){const stableStem=prdId.replace(/^PRD-/,"OUT-");return outcomes.map((_,index)=>`${stableStem}-${String(index+1).padStart(2,"0")}`)}import{createHash as createHash6}from"node:crypto";var ExecutionClientTurnConflictError=class extends Error{name="ExecutionClientTurnConflictError"};var ExecutionClientTurnClaimsV2=class{constructor(filesystem,layout){this.filesystem=filesystem;this.layout=layout}filesystem;layout;async claimIdentity(clientTurnId,proposedId,kind,origin,executions){const existing=executions.filter(execution=>execution.client_turn_id===clientTurnId);if(existing.length>1){throw new ExecutionClientTurnConflictError(`Client turn resolves to multiple Executions: ${clientTurnId}`)}const expected=existing[0];if(expected!==void 0)this.assertExpectedExecution(expected,kind,origin);const claim={schema_version:1,client_turn_id:clientTurnId,execution_id:expected?.id??proposedId,kind,origin};const path=this.claimPath(clientTurnId);try{await this.filesystem.writeTextExclusive(path,`${JSON.stringify(claim)}
|
|
995
996
|
`);return claim.execution_id}catch(error51){if(!isFileExistsError(error51))throw error51}const persisted=parseExecutionTurnClaim(await this.filesystem.readText(path));if(persisted.client_turn_id!==clientTurnId||persisted.kind!==kind||JSON.stringify(persisted.origin)!==JSON.stringify(origin)){throw new ExecutionClientTurnConflictError(`Client turn ${clientTurnId} is already claimed by incompatible Execution ${persisted.execution_id}`)}return persisted.execution_id}async createExecution(execution,kind,origin,path,serialized,read){try{await this.filesystem.writeTextExclusive(path,serialized);return execution}catch(error51){if(!isFileExistsError(error51))throw error51;return this.assertExpectedExecution(await read(),kind,origin)}}assertExpectedExecution(execution,kind,origin){if(execution.kind!==kind||JSON.stringify(execution.origin)!==JSON.stringify(origin)){throw new ExecutionClientTurnConflictError(`Client turn ${execution.client_turn_id??"unknown"} resolves to incompatible ${execution.kind??"legacy-delivery"} Execution ${execution.id}`)}return execution}claimPath(clientTurnId){const digest2=createHash6("sha256").update(clientTurnId).digest("hex");return`${this.layout.entityRoot("execution")}/.client-turn-claims/${digest2}.json`}};function createInteractionTurnExecution(input){return executionV2Schema.parse({schema_version:2,id:input.id,revision:1,kind:"interaction",client_turn_id:input.clientTurnId,origin:input.origin,status:"running",status_reason:null,plan_revision:null,plan_hash:null,policy:input.policy,dag:{nodes:[],topological_order:[]},created_at:input.now,updated_at:input.now,started_at:input.now,finished_at:null,result:null})}function createDeliveryTurnExecution(input){return executionV2Schema.parse({schema_version:2,id:input.id,revision:1,kind:"delivery",client_turn_id:input.clientTurnId,origin:input.origin,status:"planned",status_reason:null,plan_revision:null,plan_hash:null,policy:input.policy,dag:{nodes:[],topological_order:[]},created_at:input.now,updated_at:input.now,started_at:null,finished_at:null,result:null})}function parseExecutionTurnClaim(source){let value;try{value=JSON.parse(source)}catch{throw new ExecutionClientTurnConflictError("Invalid persisted client turn claim")}if(value.schema_version!==1||typeof value.client_turn_id!=="string"||typeof value.execution_id!=="string"||value.kind!=="interaction"&&value.kind!=="delivery"||typeof value.origin!=="object"||value.origin===null){throw new ExecutionClientTurnConflictError("Invalid persisted client turn claim")}return{schema_version:1,client_turn_id:value.client_turn_id,execution_id:value.execution_id,kind:value.kind,origin:value.origin}}function isFileExistsError(error51){return error51 instanceof Error&&"code"in error51&&error51.code==="EEXIST"}var PrdV2Repository=class{constructor(filesystem,layout){this.filesystem=filesystem;this.layout=layout;assertV2Layout(layout)}filesystem;layout;async create(input){const clock=input.clock??new SystemClock;const now=clock.now().toISOString();const id=input.id??createV2Id("PRD",input.shortName,clock,this.layout.project.timezone);const outcomes=[...input.outcomes??[]];const prd=prdV2Schema.parse({schema_version:2,id,revision:1,title:input.title,status:"draft",status_reason:null,outcome_status:"unmeasured",problem:input.problem,audiences:[...input.audiences??[]],outcomes,outcome_ids:input.outcomeIds??canonicalOutcomeIds(id,outcomes),constraints:[...input.constraints??[]],non_goals:[...input.nonGoals??[]],prepared_plan:null,plan_ref:null,creation_run_id:input.creationRunId??null,created_at:now,updated_at:now});await this.write(prd,prdBody(prd));return prd}async read(id){const path=await requiredReadPath(this.filesystem,this.layout,"prd",id);const document=parseMarkdown(await this.filesystem.readText(path),prdV2Schema);return{prd:document.metadata,body:document.body}}async list(){return listV2Metadata(this.filesystem,this.layout.entityRoot("prd"),".md",prdV2Schema)}async setPreparedPlan(id,plan){const validated=preparedPlanV2Schema.parse(plan);const current=await this.read(id);if(!new Set(["draft","ready"]).has(current.prd.status)){throw new TypeError(`PRD ${id} cannot be prepared from status ${current.prd.status}`)}const specIds=specIdsForPrdPlanV2(validated,id);if(specIds.length===0)throw new TypeError(`PRD ${id} requires at least one SPEC`);const specs=await listV2Metadata(this.filesystem,this.layout.entityRoot("spec"),".md",deliverySpecV2Schema);const byId2=new Map(specs.map(spec=>[spec.id,spec]));for(const specId of specIds){const spec=byId2.get(specId);if(spec===void 0)throw new TypeError(`PRD SPEC does not resolve: ${specId}`);if(spec.prd_id!==id){throw new TypeError(`SPEC ${specId} does not belong to PRD ${id}`)}if(["active","delivered","cancelled"].includes(spec.status)){throw new TypeError(`SPEC ${specId} cannot be prepared from status ${spec.status}`)}await assertSpecImplementationMatchesProject(spec.implementation,this.filesystem,this.layout)}const next=prdV2Schema.parse({...current.prd,revision:current.prd.revision+1,prepared_plan:validated,plan_ref:null,updated_at:validated.prepared_at});await this.write(next,current.body);return next}async transition(id,status,clockOrReason=new SystemClock,reason=null){const current=await this.read(id);assertStatusTransition(PRD_TRANSITIONS,current.prd.status,status,"PRD");const clock=typeof clockOrReason==="string"?new SystemClock:clockOrReason;const statusReason=typeof clockOrReason==="string"?clockOrReason:reason;const next=prdV2Schema.parse({...current.prd,revision:current.prd.revision+1,status,status_reason:["blocked","failed","cancelled"].includes(status)?statusReason??`PRD moved to ${status}.`:null,updated_at:clock.now().toISOString()});await this.write(next,current.body);return next}async normalizePreparedPlan(id,plan){const current=await this.read(id);if(current.prd.plan_ref?.hash===plan.hash)return current.prd;if(current.prd.prepared_plan?.hash!==plan.hash){throw new Error(`PRD ${id} does not contain PreparedPlan ${plan.hash}`)}const next=prdV2Schema.parse({...current.prd,revision:current.prd.revision+1,prepared_plan:null,plan_ref:planRefV2(plan),updated_at:new Date().toISOString()});await this.write(next,current.body);return next}path(id){return this.layout.activePath("prd",id)}async write(prd,body){await this.filesystem.writeTextAtomic(this.path(prd.id),serializeMarkdown({metadata:prdV2Schema.parse(prd),body}))}};var DeliverySpecV2Repository=class{constructor(filesystem,layout){this.filesystem=filesystem;this.layout=layout;assertV2Layout(layout)}filesystem;layout;async create(input){const clock=input.clock??new SystemClock;const now=clock.now().toISOString();const spec=deliverySpecV2Schema.parse({schema_version:2,id:input.id??createV2Id("SPEC",input.shortName,clock,this.layout.project.timezone),prd_id:input.prdId??null,revision:1,title:input.title,status:"draft",status_reason:null,objective:input.objective,included_scope:[...input.includedScope??[]],excluded_scope:[...input.excludedScope??[]],requirement_ids:[...input.requirementIds??[]],acceptance_ids:[...input.acceptanceIds??[]],implementation:input.implementation??null,prepared_plan:null,plan_ref:null,creation_run_id:input.creationRunId??null,created_at:now,updated_at:now});await this.write(spec,deliverySpecBody(spec));return spec}async read(id){const path=await requiredReadPath(this.filesystem,this.layout,"spec",id);const document=parseMarkdown(await this.filesystem.readText(path),deliverySpecV2Schema);return{spec:document.metadata,body:document.body}}async list(){return listV2Metadata(this.filesystem,this.layout.entityRoot("spec"),".md",deliverySpecV2Schema)}async setPreparedPlan(id,plan){const validated=preparedPlanV2Schema.parse(plan);if(validated.source.type!=="spec"||validated.source.spec_id!==id){throw new TypeError(`Prepared plan source must be spec ${id}`)}const current=await this.read(id);if(!new Set(["draft","ready"]).has(current.spec.status)){throw new TypeError(`SPEC ${id} cannot be prepared from status ${current.spec.status}`)}await assertSpecImplementationMatchesProject(current.spec.implementation,this.filesystem,this.layout);const next=deliverySpecV2Schema.parse({...current.spec,revision:current.spec.revision+1,prepared_plan:validated,plan_ref:null,updated_at:validated.prepared_at});await this.write(next,current.body);return next}async transition(id,status,clockOrReason=new SystemClock,reason=null){const current=await this.read(id);assertStatusTransition(SPEC_TRANSITIONS,current.spec.status,status,"DeliverySpec");const clock=typeof clockOrReason==="string"?new SystemClock:clockOrReason;const statusReason=typeof clockOrReason==="string"?clockOrReason:reason;if(["active","delivered"].includes(status)){await assertSpecImplementationMatchesProject(current.spec.implementation,this.filesystem,this.layout)}const next=deliverySpecV2Schema.parse({...current.spec,revision:current.spec.revision+1,status,status_reason:["blocked","failed","cancelled"].includes(status)?statusReason??`SPEC moved to ${status}.`:null,updated_at:clock.now().toISOString()});await this.write(next,current.body);return next}async normalizePreparedPlan(id,plan){const current=await this.read(id);if(current.spec.plan_ref?.hash===plan.hash)return current.spec;if(current.spec.prepared_plan?.hash!==plan.hash){throw new Error(`SPEC ${id} does not contain PreparedPlan ${plan.hash}`)}const next=deliverySpecV2Schema.parse({...current.spec,revision:current.spec.revision+1,prepared_plan:null,plan_ref:planRefV2(plan),updated_at:new Date().toISOString()});await this.write(next,current.body);return next}path(id){return this.layout.activePath("spec",id)}async write(spec,body){await this.filesystem.writeTextAtomic(this.path(spec.id),serializeMarkdown({metadata:deliverySpecV2Schema.parse(spec),body}))}};var ChangeV2Repository=class{constructor(filesystem,layout){this.filesystem=filesystem;this.layout=layout;assertV2Layout(layout)}filesystem;layout;async read(id){const path=await requiredReadPath(this.filesystem,this.layout,"change",id);const document=parseMarkdown(await this.filesystem.readText(path),changeV2Schema);return{change:document.metadata,body:document.body}}async createDraft(input){const clock=input.clock??new SystemClock;const now=clock.now().toISOString();const change=changeV2Schema.parse({schema_version:2,id:input.id,revision:1,title:input.title,status:"draft",risk:input.risk,source:{type:"task",task_id:input.taskId},requirement_ids:[...input.requirementIds],acceptance_ids:[...input.acceptanceIds],requirement_impact:{type:"none",reason:"Awaiting prepared plan."},task_ids:[input.taskId],plan_revision:null,plan_hash:null,created_at:now,updated_at:now,started_at:null,finished_at:null,result:null});await this.filesystem.writeTextExclusive(this.path(change.id),this.serialize(change));return change}async promoteDraft(id,planned){const current=await this.read(id);if(current.change.status==="planned"&&samePlannedChange(current.change,planned)){return current.change}if(current.change.status!=="draft"||!sameDraftChange(current.change,planned)){throw new TypeError(`Change ${id} does not match its Task draft`)}const next=changeV2Schema.parse({...planned,revision:current.change.revision+1,created_at:current.change.created_at,updated_at:planned.updated_at});await this.write(next);return next}async list(){return listV2Metadata(this.filesystem,this.layout.entityRoot("change"),"change.md",changeV2Schema)}async transition(id,status,result2=null,clock=new SystemClock,reason=null){const current=await this.read(id);assertStatusTransition(CHANGE_TRANSITIONS,current.change.status,status,"Change");const now=clock.now().toISOString();const terminal=["completed","failed","cancelled"].includes(status);const next=changeV2Schema.parse({...current.change,revision:current.change.revision+1,status,status_reason:["blocked","failed","cancelled"].includes(status)?reason??result2??`Change moved to ${status}.`:null,updated_at:now,started_at:status==="executing"&¤t.change.started_at===null?now:current.change.started_at,finished_at:terminal?now:null,result:terminal?result2:null});await this.write(next,current.body);return next}async write(change,body=changeV2Body(change.title)){await this.filesystem.writeTextAtomic(this.path(change.id),this.serialize(change,body))}serialize(change,body=changeV2Body(change.title)){return serializeMarkdown({metadata:changeV2Schema.parse(change),body})}path(id){return this.layout.activePath("change",id)}};var ExecutionV2Repository=class{constructor(filesystem,layout){this.filesystem=filesystem;this.layout=layout;assertV2Layout(layout);this.clientTurnClaims=new ExecutionClientTurnClaimsV2(filesystem,layout)}filesystem;layout;clientTurnClaims;async read(id){const path=await requiredReadPath(this.filesystem,this.layout,"execution",id);const document=parseMarkdown(await this.filesystem.readText(path),executionV2Schema);return{execution:document.metadata,body:document.body}}async list(){return listV2Metadata(this.filesystem,this.layout.entityRoot("execution"),"execution.md",executionV2Schema)}async createInteraction(input){const origin={type:"interaction",conversation_id:input.conversationId};const claimedId=await this.clientTurnClaims.claimIdentity(input.clientTurnId,input.id,"interaction",origin,await this.list());const claimed=await this.read(claimedId).catch(()=>null);if(claimed!==null)return this.clientTurnClaims.assertExpectedExecution(claimed.execution,"interaction",origin);const clock=input.clock??new SystemClock;const now=clock.now().toISOString();const execution=createInteractionTurnExecution({id:claimedId,clientTurnId:input.clientTurnId,origin,policy:input.policy,now});return this.clientTurnClaims.createExecution(execution,"interaction",origin,this.path(execution.id),this.serialize(execution),async()=>(await this.read(execution.id)).execution)}async createDeliveryIntake(input){const claimedId=await this.clientTurnClaims.claimIdentity(input.clientTurnId,input.id,"delivery",input.origin,await this.list());const claimed=await this.read(claimedId).catch(()=>null);if(claimed!==null)return this.clientTurnClaims.assertExpectedExecution(claimed.execution,"delivery",input.origin);const clock=input.clock??new SystemClock;const now=clock.now().toISOString();const execution=createDeliveryTurnExecution({id:claimedId,clientTurnId:input.clientTurnId,origin:input.origin,policy:input.policy,now});return this.clientTurnClaims.createExecution(execution,"delivery",input.origin,this.path(execution.id),this.serialize(execution),async()=>(await this.read(execution.id)).execution)}async promoteDeliveryIntake(id,planned){const current=await this.read(id);if(current.execution.plan_hash===planned.plan_hash)return current.execution;if(current.execution.kind!=="delivery"||current.execution.plan_hash!==null||current.execution.plan_revision!==null||JSON.stringify(current.execution.origin)!==JSON.stringify(planned.origin)){throw new TypeError(`Execution ${id} is not a matching delivery intake`)}const next=executionV2Schema.parse({...planned,kind:"delivery",client_turn_id:current.execution.client_turn_id,revision:current.execution.revision+1,created_at:current.execution.created_at});await this.write(next);return next}async claimClientTurn(id,clientTurnId){const current=await this.read(id);const kind=current.execution.kind??"delivery";const claimedId=await this.clientTurnClaims.claimIdentity(clientTurnId,id,kind,current.execution.origin,await this.list());if(claimedId!==id){const claimed=await this.read(claimedId);return this.clientTurnClaims.assertExpectedExecution(claimed.execution,kind,current.execution.origin)}if(current.execution.kind==="interaction"){if(current.execution.client_turn_id!==clientTurnId){throw new Error(`Interaction Execution ${id} belongs to another client turn`)}return current.execution}if(current.execution.client_turn_id===clientTurnId)return current.execution;if(current.execution.client_turn_id!=null){throw new Error(`Delivery Execution ${id} already belongs to another client turn`)}const next=executionV2Schema.parse({...current.execution,revision:current.execution.revision+1,kind:"delivery",client_turn_id:clientTurnId,updated_at:new Date().toISOString()});await this.write(next);return next}async normalizeBody(id){const current=await this.read(id);await this.write(current.execution);return current.execution}async transition(id,status,result2=null,clock=new SystemClock,reason=null){const current=await this.read(id);assertStatusTransition(EXECUTION_TRANSITIONS,current.execution.status,status,"Execution");const now=clock.now().toISOString();const terminal=["completed","failed","cancelled"].includes(status);const next=executionV2Schema.parse({...current.execution,revision:current.execution.revision+1,status,status_reason:["blocked","failed","cancelled"].includes(status)?reason??result2??`Execution moved to ${status}.`:null,updated_at:now,started_at:status==="running"&¤t.execution.started_at===null?now:current.execution.started_at,finished_at:terminal?now:null,result:terminal?result2:null});await this.write(next);return next}async write(execution,body=executionV2Body(execution)){await this.filesystem.writeTextAtomic(this.path(execution.id),this.serialize(execution,body))}serialize(execution,body=executionV2Body(execution)){return serializeMarkdown({metadata:executionV2Schema.parse(execution),body})}path(id){return this.layout.activePath("execution",id)}};function changeV2Body(title){return`# ${title}
|
|
996
997
|
|
|
997
998
|
## Plano
|
|
@@ -1119,7 +1120,7 @@ A preencher.
|
|
|
1119
1120
|
|
|
1120
1121
|
## Acceptance
|
|
1121
1122
|
|
|
1122
|
-
A preencher.`}var SCHEDULER_LOCK_TYPES=["file","module","migration","environment","resource","git-ref","global"];var AutonomousScheduler=class{#tasks=new Map;#leases=new Map;#fencingToken=0;constructor(tasks){for(const task of tasks){if(this.#tasks.has(task.id))throw new Error(`Duplicate Task: ${task.id}`);validateLocks(task.locks);this.#tasks.set(task.id,{...task,depends_on:[...task.depends_on],locks:[...task.locks]})}for(const task of tasks){for(const dependency of task.depends_on){if(!this.#tasks.has(dependency))throw new Error(`Unknown dependency ${dependency}`)}}assertAcyclic(this.#tasks)}claim(workerId,now,leaseMs){if(leaseMs<=0)throw new Error("Lease duration must be positive");this.expire(now);const completed=new Set([...this.#tasks.values()].filter(task2=>task2.status==="completed").map(task2=>task2.id));const held=new Set([...this.#leases.values()].flatMap(lease2=>lease2.locks.map(lockKey)));const eligible=[...this.#tasks.values()].filter(task2=>task2.status==="planned"&&task2.depends_on.every(dependency=>completed.has(dependency))&&task2.locks.every(lock=>!held.has(lockKey(lock)))).sort((left,right)=>left.priority-right.priority||left.queued_at.localeCompare(right.queued_at)||left.id.localeCompare(right.id));const task=eligible[0];if(task===void 0)return null;const lease={task_id:task.id,worker_id:workerId,fencing_token:++this.#fencingToken,acquired_at:now.toISOString(),expires_at:new Date(now.getTime()+leaseMs).toISOString(),locks:task.locks};this.#tasks.set(task.id,{...task,status:"running"});this.#leases.set(task.id,lease);return lease}heartbeat(lease,now,extendMs){const current=this.#assertCurrentLease(lease,now);const updated={...current,expires_at:new Date(now.getTime()+extendMs).toISOString()};this.#leases.set(lease.task_id,updated);return updated}complete(lease,now){this.#assertCurrentLease(lease,now);const task=this.#requiredTask(lease.task_id);this.#tasks.set(task.id,{...task,status:"completed"});this.#leases.delete(task.id)}fail(lease,now){this.#assertCurrentLease(lease,now);const task=this.#requiredTask(lease.task_id);this.#tasks.set(task.id,{...task,status:"failed"});this.#leases.delete(task.id);const blocked=[];let changed=true;while(changed){changed=false;for(const candidate of this.#tasks.values()){if(candidate.status==="planned"&&candidate.depends_on.some(dependency=>{const status=this.#requiredTask(dependency).status;return status==="failed"||status==="blocked"})){this.#tasks.set(candidate.id,{...candidate,status:"blocked"});blocked.push(candidate.id);changed=true}}}return blocked.sort()}expire(now){const expired=[];for(const[taskId,lease]of this.#leases){if(Date.parse(lease.expires_at)<=now.getTime()){const task=this.#requiredTask(taskId);this.#tasks.set(taskId,{...task,status:"planned"});this.#leases.delete(taskId);expired.push(taskId)}}return expired.sort()}snapshot(){return[...this.#tasks.values()].sort((left,right)=>left.id.localeCompare(right.id))}#assertCurrentLease(lease,now){const current=this.#leases.get(lease.task_id);if(current===void 0||current.worker_id!==lease.worker_id||current.fencing_token!==lease.fencing_token)throw new Error("Stale scheduler fencing token");if(Date.parse(current.expires_at)<=now.getTime())throw new Error("Scheduler lease expired");return current}#requiredTask(id){const task=this.#tasks.get(id);if(task===void 0)throw new Error(`Unknown Task: ${id}`);return task}};function validateLocks(locks){const keys=locks.map(lockKey);if(new Set(keys).size!==keys.length)throw new Error("Duplicate scheduler lock");if(locks.some(lock=>lock.key.length===0||!SCHEDULER_LOCK_TYPES.includes(lock.type))){throw new Error("Invalid scheduler lock")}}function lockKey(lock){return`${lock.type}:${lock.key}`}function assertAcyclic(tasks){const visiting=new Set;const visited=new Set;const visit=id=>{if(visiting.has(id))throw new Error("Scheduler DAG contains a cycle");if(visited.has(id))return;visiting.add(id);for(const dependency of tasks.get(id)?.depends_on??[])visit(dependency);visiting.delete(id);visited.add(id)};for(const id of tasks.keys())visit(id)}import{createHash as createHash7}from"node:crypto";var SDC_PHASES=["validate","develop","review","fix","verify","close"];function createSdcState(input){if(input.acceptance_ids.length===0)throw new Error("SDC requires Acceptance Criteria");for(const phase of SDC_PHASES)validateBudget(input.budgets[phase]);return{schema_version:1,id:input.id,phase:"validate",status:"running",revision:1,acceptance_ids:[...input.acceptance_ids],budgets:input.budgets,attempts:emptyAttempts(),checkpoints:[],evidence:[],processed_event_ids:[],blocker:null}}function advanceSdc(state,event){if(state.processed_event_ids.includes(event.id))return state;if(state.status!=="running"||event.phase!==state.phase){throw new Error(`SDC cannot advance ${state.status}:${state.phase} with ${event.phase}`)}const attempts={...state.attempts,[state.phase]:state.attempts[state.phase]+1};const budget=state.budgets[state.phase];if(attempts[state.phase]>budget.max_attempts)throw new Error(`SDC ${state.phase} attempt budget exceeded`);const measured=event.observed_input_tokens??event.observable_context_tokens;const source=event.observed_input_tokens!==null?"provider-uncached-input":event.observable_context_tokens!==null?"observable-context-fallback":"unavailable";const evidence=mergeEvidence(state.evidence,event.evidence);const nextPhase=transition(state.phase,event.outcome);if(state.phase==="close"&&event.outcome==="pass")assertEvidenceComplete(state.acceptance_ids,evidence);const checkpointPayload={phase:state.phase,event_id:event.id,cycles:event.cycles,input_tokens:measured,measurement_source:source,checkpoint_required:event.cycles>=budget.soft_cycles||measured!==null&&measured>=budget.soft_input_tokens};const checkpoint={...checkpointPayload,state_hash:createHash7("sha256").update(JSON.stringify({state_revision:state.revision,checkpointPayload,evidence})).digest("hex")};return{...state,phase:nextPhase,status:state.phase==="close"&&event.outcome==="pass"?"completed":"running",revision:state.revision+1,attempts,checkpoints:[...state.checkpoints,checkpoint],evidence,processed_event_ids:[...state.processed_event_ids,event.id]}}function transition(phase,outcome){const transitions={validate:{pass:"develop",fail:"validate"},develop:{pass:"review",fail:"develop"},review:{pass:"verify",fail:"fix"},fix:{pass:"review",fail:"fix"},verify:{pass:"close",fail:"fix"},close:{pass:"close",fail:"fix"}};return transitions[phase][outcome]}function mergeEvidence(current,added){const byId2=new Map(current.map(evidence=>[evidence.id,evidence]));for(const evidence of added)byId2.set(evidence.id,evidence);return[...byId2.values()].sort((left,right)=>left.id.localeCompare(right.id))}function assertEvidenceComplete(acceptanceIds,evidence){const covered=new Set(evidence.flatMap(item=>item.acceptance_ids));const missing=acceptanceIds.filter(id=>!covered.has(id));if(missing.length>0)throw new Error(`SDC close missing evidence for: ${missing.join(", ")}`)}function validateBudget(budget){if(budget.soft_cycles<=0||budget.soft_input_tokens<=0||budget.max_attempts<=0){throw new Error("Invalid SDC phase budget")}}function emptyAttempts(){return{validate:0,develop:0,review:0,fix:0,verify:0,close:0}}function deriveAutonomousLocks(task){if(task.risk==="critical")return[{type:"global",key:"critical-execution"}];const locks=task.write_scopes.map(scope=>{const wildcard=scope.search(/[?*]/);const prefix=(wildcard<0?scope:scope.slice(0,wildcard)).replace(/\/$/,"");return wildcard<0?{type:"file",key:scope}:{type:"module",key:prefix.length===0?"workspace":prefix}});return[...new Map(locks.map(lock=>[`${lock.type}:${lock.key}`,lock])).values()]}function resolveAutonomousRigor(source,risk2){const riskMinimum={lite:1,standard:2,critical:3}[risk2];const sourceMinimum=source==="task"?1:3;return{minimum_validations:Math.max(riskMinimum,sourceMinimum),minimum_evidence:Math.max(riskMinimum,sourceMinimum),acceptance_evidence_required:true,independent_verifier_required:source!=="task"||risk2==="critical",cross_scope_validation_required:source==="prd",tdd_required:risk2==="standard"||risk2==="critical",fresh_context_per_task_required:risk2==="critical",max_debug_attempts:risk2==="lite"?1:3}}function claimNextTask(state){const tasks=state.tasks.map(task=>({id:task.id,execution_id:state.execution_id,depends_on:task.depends_on,locks:deriveAutonomousLocks(task),priority:task.priority,queued_at:state.created_at,status:task.status}));return new AutonomousScheduler(tasks).claim("autonomous-coordinator",new Date(state.updated_at),6e4)?.task_id??null}function createInvocation(input,task,assignment,active,resumeFrom){const rigor=resolveAutonomousRigor(input.source,task.risk);const selection2=resolveInvocationSelection(input,task,assignment,active);const roleInstruction=active.role==="verifier"?'Review independently. Return JSON {"approved":true|false}. Do not mutate files.':assignment.id==="agent-orchestrator"?`Act as the Task orchestrator. Do not implement directly. Delegate at least one eligible Sub-Run. Preserve the declared Task write scopes for every Sub-Run. Call zaip-agent-execution-finalizer as the last Sub-Run. Do not create children after zaip-agent-execution-finalizer.`:`Implement only the declared Task scopes.${rigor.tdd_required?" Use strict red-green-refactor TDD.":""} Commit the final product candidate first. Execute validations against that SHA, write typed assurance artifacts referencing it, then commit only those assurance artifacts.`;return{schema_version:1,invocation_id:active.invocation_id,agent_id:assignment.id,model:selection2.model,reasoning_effort:selection2.reasoning_effort,velocity:selection2.velocity,input:{messages:[{role:"system",content:`${roleInstruction} Maximum debugging/repair attempts: ${rigor.max_debug_attempts}.`,name:null},{role:"user",content:JSON.stringify({execution_id:input.execution_id,task_id:task.id,acceptance_ids:task.acceptance_ids,write_scopes:task.write_scopes,fresh_context:rigor.fresh_context_per_task_required}),name:null}],context_refs:[task.id,task.change_id,...task.acceptance_ids],tools:[...assignment.tools??[]],response_format:active.role==="verifier"?"json":"text"},budget:{max_output_tokens:16e3,timeout_ms:15*6e4,max_tool_calls:active.role==="verifier"?0:100},metadata:{role:active.role,source:input.source,risk:task.risk,worktree_path:requiredWorktree(task),tdd_required:String(rigor.tdd_required),fresh_context_required:String(rigor.fresh_context_per_task_required),cross_scope_validation_required:String(rigor.cross_scope_validation_required),model_selection_origin:selection2.origin,model_policy_version:selection2.policy_version,model_selection_reasons:selection2.reasons.join(",")},resume_from:resumeFrom}}function resolveInvocationSelection(input,task,assignment,active){const config2=input.policy.model_orchestration;if(config2===void 0){return{model:assignment.model,reasoning_effort:assignment.reasoning_effort??"medium",velocity:"standard",origin:"project_defaults",sources:{model:"project_defaults",reasoning_effort:"project_defaults",velocity:"project_defaults"},policy_version:"model-orchestration-v1",reasons:["PROJECT_DEFAULTS"]}}const isRepair=active.phase==="fix";const transversality=task.write_scopes.length>1?"multi_module":"local";return resolveModelSelection({config:config2,task_override:task.runtime,task:{phase:active.phase==="review"?"review":isRepair?"rework":"implementation",agent_role:assignment.id,complexity:task.write_scopes.length<=1&&task.risk==="lite"?"simple":"standard",risk:task.risk,transversality,ambiguity:isRepair?"medium":"low",rework:isRepair?"localized":"none",rework_cost:isRepair?"medium":"low",bounded:true,high_volume:false,xhigh_triggers:[]}})}function assertAutonomousInput(input){if(input.tasks.length===0)throw new Error("Autonomous execution requires Tasks");const ids=new Set(input.tasks.map(task=>task.id));if(ids.size!==input.tasks.length)throw new Error("Autonomous execution has duplicate Tasks");for(const task of input.tasks){if(task.acceptance_ids.length===0)throw new Error(`${task.id} requires Acceptance Criteria`);for(const dependency of task.depends_on){if(!ids.has(dependency))throw new Error(`${task.id} has unknown dependency ${dependency}`)}const rigor=resolveAutonomousRigor(input.source,task.risk);const verifier=input.agents.verifier;if(rigor.independent_verifier_required&&(verifier===null||verifier.id===input.agents.builder.id)){throw new Error(`${task.id} requires a distinct independent verifier`)}}if(input.policy.max_parallelism<1)throw new Error("Invalid autonomous parallelism");if(input.policy.max_operational_retries<0||input.policy.max_repair_cycles_per_task<0){throw new Error("Invalid autonomous retry policy")}new AutonomousScheduler(input.tasks.map(task=>({id:task.id,execution_id:input.execution_id,depends_on:task.depends_on,locks:deriveAutonomousLocks(task),priority:task.priority,queued_at:input.created_at,status:"planned"})))}function assertStateMatchesInput(state,input){if(state.execution_id!==input.execution_id||state.source!==input.source){throw new Error("Durable autonomous state does not match the execution input")}const expected=input.tasks.map(task=>task.id).sort();const actual=state.tasks.map(task=>task.id).sort();if(JSON.stringify(expected)!==JSON.stringify(actual)){throw new Error("Durable autonomous Task set does not match the execution input")}}function assertValidationResult(task,rigor,result2){if(new Set(result2.validation_ids).size<rigor.minimum_validations){throw new Error(`${task.id} requires at least ${rigor.minimum_validations} validation artifacts`)}if(new Set(result2.evidence.map(item=>item.id)).size<rigor.minimum_evidence){throw new Error(`${task.id} requires at least ${rigor.minimum_evidence} Evidence artifacts`)}const covered=new Set(result2.evidence.flatMap(item=>item.acceptance_ids));const missing=task.acceptance_ids.filter(id=>!covered.has(id));if(missing.length>0)throw new Error(`${task.id} has uncovered Acceptance Criteria: ${missing.join(", ")}`)}function requiredVerifier(input){if(input.agents.verifier===null)throw new Error("Independent verifier is not configured");return input.agents.verifier}function requiredTask(state,taskId){const task=state.tasks.find(candidate=>candidate.id===taskId);if(task===void 0)throw new Error(`Unknown autonomous Task: ${taskId}`);return task}function requiredWorktree(task){if(task.worktree_path===null)throw new Error(`${task.id} has no prepared worktree`);return task.worktree_path}function invocationId(executionId,taskId,phase,attempt){return`INV-${executionId}-${taskId}-${phase}-${attempt}`.toUpperCase().replace(/[^A-Z0-9-]/g,"-")}function verifierApproved(event){if(event?.type!=="invocation.completed")return false;try{const value=JSON.parse(event.output);return typeof value==="object"&&value!==null&&"approved"in value&&value.approved===true}catch{return false}}var timestamp6=external_exports.string().datetime();var evidenceSchema=external_exports.object({id:external_exports.string().min(1),acceptance_ids:external_exports.array(external_exports.string().min(1))}).strict();var phaseBudgetSchema=external_exports.object({soft_cycles:external_exports.number().int().positive(),soft_input_tokens:external_exports.number().int().positive(),max_attempts:external_exports.number().int().positive()}).strict();var checkpointSchema=external_exports.object({phase:external_exports.enum(SDC_PHASES),event_id:external_exports.string().min(1),state_hash:external_exports.string().regex(/^[a-f0-9]{64}$/),cycles:external_exports.number().int().nonnegative(),input_tokens:external_exports.number().int().nonnegative().nullable(),measurement_source:external_exports.enum(["provider-uncached-input","observable-context-fallback","unavailable"]),checkpoint_required:external_exports.boolean()}).strict();var sdcStateSchema=external_exports.object({schema_version:external_exports.literal(1),id:external_exports.string().min(1),phase:external_exports.enum(SDC_PHASES),status:external_exports.enum(["running","blocked","completed"]),revision:external_exports.number().int().positive(),acceptance_ids:external_exports.array(external_exports.string().min(1)).min(1),budgets:external_exports.object(Object.fromEntries(SDC_PHASES.map(phase=>[phase,phaseBudgetSchema]))),attempts:external_exports.object(Object.fromEntries(SDC_PHASES.map(phase=>[phase,external_exports.number().int().nonnegative()]))),checkpoints:external_exports.array(checkpointSchema),evidence:external_exports.array(evidenceSchema),processed_event_ids:external_exports.array(external_exports.string().min(1)),blocker:external_exports.string().min(1).nullable()}).strict();var activeInvocationSchema=external_exports.object({invocation_id:external_exports.string().regex(/^INV-[A-Z0-9-]+$/),phase:external_exports.enum(SDC_PHASES),role:external_exports.enum(["builder","verifier"]),checkpoint_id:external_exports.string().min(1).nullable(),checkpoint_hash:external_exports.string().regex(/^[a-f0-9]{64}$/).nullable()}).strict();var taskStateSchema=external_exports.object({id:external_exports.string().min(1),change_id:external_exports.string().min(1),risk:external_exports.enum(["lite","standard","critical"]),priority:external_exports.number().int(),depends_on:external_exports.array(external_exports.string().min(1)),acceptance_ids:external_exports.array(external_exports.string().min(1)).min(1),write_scopes:external_exports.array(external_exports.string().min(1)),runtime:modelSelectionOverrideSchema.optional(),status:external_exports.enum(["planned","running","completed","failed","blocked"]),worktree_path:external_exports.string().min(1).nullable(),integration_commit:external_exports.string().min(1).nullable(),active_invocation:activeInvocationSchema.nullable(),sdc:sdcStateSchema,validation_ids:external_exports.array(external_exports.string().min(1)),evidence:external_exports.array(evidenceSchema),last_error:external_exports.string().min(1).nullable()}).strict();var autonomousExecutionStateSchema=external_exports.object({schema_version:external_exports.literal(1),execution_id:external_exports.string().min(1),source:external_exports.enum(["task","spec","prd"]),status:external_exports.enum(["running","completed","failed","blocked"]),revision:external_exports.number().int().nonnegative(),created_at:timestamp6,updated_at:timestamp6,handoff_worktree_path:external_exports.string().min(1).nullable().default(null),handoff_branch:external_exports.string().min(1).nullable().default(null),handoff_commit:external_exports.string().min(1).nullable().default(null),tasks:external_exports.array(taskStateSchema).min(1),last_error:external_exports.string().min(1).nullable()}).strict();function parseAutonomousExecutionState(value){return autonomousExecutionStateSchema.parse(value)}var AutonomousExecutionCoordinator=class{constructor(dependencies){this.dependencies=dependencies;this.now=dependencies.now??(()=>new Date().toISOString())}dependencies;now;createInitialState(input){assertAutonomousInput(input);const tasks=input.tasks.map(task=>this.initialTask(input,task));return parseAutonomousExecutionState({schema_version:1,execution_id:input.execution_id,source:input.source,status:"running",revision:0,created_at:input.created_at,updated_at:input.created_at,handoff_worktree_path:null,handoff_branch:null,handoff_commit:null,tasks,last_error:null})}async execute(input){if(input.mode==="manual"){return{mode:"manual",status:"materialized",state:null}}assertAutonomousInput(input);const loaded=await this.dependencies.state.load(input.execution_id);let state=loaded===null?await this.persist(this.createInitialState(input)):parseAutonomousExecutionState(loaded);assertStateMatchesInput(state,input);if(state.status==="completed")return{mode:"autonomous",status:state.status,state};if(state.status==="blocked")return{mode:"autonomous",status:state.status,state};if(requiresHandoff(input)&&state.handoff_worktree_path===null){const handoff=await this.dependencies.worktrees.prepareHandoff({execution_id:input.execution_id});state=await this.persist({...state,handoff_worktree_path:handoff.path,handoff_branch:handoff.branch,handoff_commit:handoff.commit})}try{while(state.status==="running"){const running=state.tasks.find(task=>task.status==="running");if(running!==void 0){state=await this.driveTask(input,state,running.id);continue}const taskId=claimNextTask(state);if(taskId===null){if(state.tasks.every(task=>task.status==="completed")){state=await this.persist({...state,status:"completed",last_error:null});break}state=await this.persist({...state,status:"blocked",last_error:"No executable Task remains in the autonomous DAG"});break}state=await this.updateTask(state,taskId,task=>({...task,status:"running",last_error:null}))}}catch(error51){const message=error51 instanceof Error?error51.message:String(error51);const latest=await this.dependencies.state.load(input.execution_id);state=await this.persist({...latest===null?state:parseAutonomousExecutionState(latest),status:"failed",last_error:message});throw error51}return{mode:"autonomous",status:state.status,state}}initialTask(input,task){const rigor=resolveAutonomousRigor(input.source,task.risk);const attempts=Math.min(rigor.max_debug_attempts,Math.max(input.policy.max_operational_retries+1,input.policy.max_repair_cycles_per_task+1));const budgets=Object.fromEntries(SDC_PHASES.map(phase=>[phase,{soft_cycles:input.policy.soft_cycles,soft_input_tokens:input.policy.soft_input_tokens,max_attempts:phase==="develop"||phase==="review"||phase==="fix"?attempts:1}]));return{...task,depends_on:[...task.depends_on],acceptance_ids:[...task.acceptance_ids],write_scopes:[...task.write_scopes],status:"planned",worktree_path:null,integration_commit:null,validation_ids:[],evidence:[],active_invocation:null,sdc:createSdcState({id:`SDC-${task.id}`,acceptance_ids:task.acceptance_ids,budgets}),last_error:null}}async driveTask(input,initial,taskId){let state=initial;let task=requiredTask(state,taskId);if(task.worktree_path===null){const worktree=await this.dependencies.worktrees.prepare({execution_id:input.execution_id,task_id:task.id,depends_on:task.depends_on,write_scopes:task.write_scopes,...state.handoff_branch===null?{}:{base_branch:state.handoff_branch}});state=await this.updateTask(state,taskId,current=>({...current,worktree_path:worktree.path}));task=requiredTask(state,taskId)}while(task.status==="running"){const phase=task.sdc.phase;if(phase==="validate"){state=await this.advanceTask(state,taskId,phase,"pass",[])}else if(phase==="develop"||phase==="fix"){state=await this.runAgentPhase(input,state,taskId,phase,"builder")}else if(phase==="review"){const rigor=resolveAutonomousRigor(input.source,task.risk);state=rigor.independent_verifier_required?await this.runAgentPhase(input,state,taskId,phase,"verifier"):await this.advanceTask(state,taskId,phase,"pass",[])}else if(phase==="verify"){const current=requiredTask(state,taskId);const rigor=resolveAutonomousRigor(input.source,current.risk);const result2=await this.dependencies.validation.validate({execution_id:input.execution_id,source:input.source,task:current,worktree_path:requiredWorktree(current),rigor});assertValidationResult(current,rigor,result2);state=await this.updateTask(state,taskId,value=>({...value,validation_ids:[...result2.validation_ids],evidence:[...result2.evidence]}));state=await this.advanceTask(state,taskId,phase,"pass",result2.evidence)}else{const current=requiredTask(state,taskId);const integration=await this.dependencies.worktrees.integrate({execution_id:input.execution_id,task_id:current.id,worktree_path:requiredWorktree(current),write_scopes:current.write_scopes,...state.handoff_worktree_path===null?{}:{handoff_worktree_path:state.handoff_worktree_path}});if(integration.status==="conflict"){return this.updateTask(await this.persist({...state,status:"blocked",last_error:`Integration conflict: ${integration.conflicts.join(", ")}`}),taskId,value=>({...value,status:"blocked",last_error:"Integration conflict"}))}state=await this.advanceTask(state,taskId,phase,"pass",[]);state=await this.updateTask(state,taskId,value=>({...value,status:"completed",integration_commit:integration.commit,last_error:null}));if(state.handoff_worktree_path!==null){state=await this.persist({...state,handoff_commit:integration.commit})}await this.dependencies.worktrees.cleanup({execution_id:input.execution_id,task_id:current.id,worktree_path:requiredWorktree(current)})}task=requiredTask(state,taskId)}return state}async runAgentPhase(input,initial,taskId,phase,role){let state=initial;let task=requiredTask(state,taskId);const assignment=role==="builder"?input.agents.builder:requiredVerifier(input);let active=task.active_invocation;if(active===null){active={invocation_id:invocationId(input.execution_id,task.id,phase,task.sdc.attempts[phase]+1),phase,role,checkpoint_id:null,checkpoint_hash:null};state=await this.updateTask(state,taskId,value=>({...value,active_invocation:active}));task=requiredTask(state,taskId)}const checkpoint=await this.dependencies.checkpoints.load(active.invocation_id);const invocation=createInvocation(input,task,assignment,active,checkpoint?.opaque_token??null);const stream=checkpoint===null?this.dependencies.runtime.invoke(invocation):this.dependencies.runtime.resume(invocation);const events=[];for await(const event of stream){events.push(event);if(event.type==="checkpoint.created"){await this.dependencies.checkpoints.save(active.invocation_id,event.checkpoint);state=await this.updateTask(state,taskId,value=>({...value,active_invocation:{...value.active_invocation,checkpoint_id:event.checkpoint.checkpoint_id,checkpoint_hash:event.checkpoint.state_hash}}))}}const summary=validateRuntimeEventStream(invocation,events);const terminal=events.at(-1);await this.dependencies.checkpoints.remove(active.invocation_id);state=await this.updateTask(state,taskId,value=>({...value,active_invocation:null}));if(summary.terminal_type!=="invocation.completed"){return this.recordAgentFailure(state,taskId,phase,summary.terminal_type)}if(role==="verifier"){const approved=verifierApproved(terminal);return approved?this.advanceTask(state,taskId,phase,"pass",[]):this.advanceTask(state,taskId,phase,"fail",[])}return this.advanceTask(state,taskId,phase,"pass",[])}async recordAgentFailure(state,taskId,phase,terminal){const advanced=await this.advanceTask(state,taskId,phase,"fail",[]);const task=requiredTask(advanced,taskId);if(task.sdc.attempts[phase]>=task.sdc.budgets[phase].max_attempts){throw new Error(`${task.id} exhausted ${phase} attempts after ${terminal}`)}return advanced}async advanceTask(state,taskId,phase,outcome,evidence){return this.updateTask(state,taskId,task=>({...task,sdc:advanceSdc(task.sdc,{id:`${task.id}:${phase}:${task.sdc.attempts[phase]+1}:${outcome}`,phase,outcome,cycles:1,observed_input_tokens:null,observable_context_tokens:null,evidence})}))}async updateTask(state,taskId,update){return this.persist({...state,tasks:state.tasks.map(task=>task.id===taskId?update(task):task)})}async persist(state){const next=parseAutonomousExecutionState({...state,revision:state.revision+1,updated_at:this.now()});await this.dependencies.state.save(next,state.revision);return next}};function requiresHandoff(_input){return true}var FileAutonomousStatePort=class{constructor(filesystem,options={}){this.filesystem=filesystem;this.#basePath=options.state_base_path??".zaip-aios/local-data/autonomous/state"}filesystem;#basePath;async load(executionId){const path=this.#path(executionId);if(!await this.filesystem.exists(path))return null;return parseAutonomousExecutionState(JSON.parse(await this.filesystem.readText(path)))}async save(state,expectedRevision){const candidate=parseAutonomousExecutionState(state);if(candidate.revision!==expectedRevision+1){throw new Error(`Autonomous state revision must advance once: ${expectedRevision} -> ${candidate.revision}`)}const path=this.#path(candidate.execution_id);const lockPath=`${path}.lock`;try{await this.filesystem.writeTextExclusive(lockPath,`${process.pid}
|
|
1123
|
+
A preencher.`}var SCHEDULER_LOCK_TYPES=["file","module","migration","environment","resource","git-ref","global"];var AutonomousScheduler=class{#tasks=new Map;#leases=new Map;#fencingToken=0;constructor(tasks){for(const task of tasks){if(this.#tasks.has(task.id))throw new Error(`Duplicate Task: ${task.id}`);validateLocks(task.locks);this.#tasks.set(task.id,{...task,depends_on:[...task.depends_on],locks:[...task.locks]})}for(const task of tasks){for(const dependency of task.depends_on){if(!this.#tasks.has(dependency))throw new Error(`Unknown dependency ${dependency}`)}}assertAcyclic(this.#tasks)}claim(workerId,now,leaseMs){if(leaseMs<=0)throw new Error("Lease duration must be positive");this.expire(now);const completed=new Set([...this.#tasks.values()].filter(task2=>task2.status==="completed").map(task2=>task2.id));const held=new Set([...this.#leases.values()].flatMap(lease2=>lease2.locks.map(lockKey)));const eligible=[...this.#tasks.values()].filter(task2=>task2.status==="planned"&&task2.depends_on.every(dependency=>completed.has(dependency))&&task2.locks.every(lock=>!held.has(lockKey(lock)))).sort((left,right)=>left.priority-right.priority||left.queued_at.localeCompare(right.queued_at)||left.id.localeCompare(right.id));const task=eligible[0];if(task===void 0)return null;const lease={task_id:task.id,worker_id:workerId,fencing_token:++this.#fencingToken,acquired_at:now.toISOString(),expires_at:new Date(now.getTime()+leaseMs).toISOString(),locks:task.locks};this.#tasks.set(task.id,{...task,status:"running"});this.#leases.set(task.id,lease);return lease}heartbeat(lease,now,extendMs){const current=this.#assertCurrentLease(lease,now);const updated={...current,expires_at:new Date(now.getTime()+extendMs).toISOString()};this.#leases.set(lease.task_id,updated);return updated}complete(lease,now){this.#assertCurrentLease(lease,now);const task=this.#requiredTask(lease.task_id);this.#tasks.set(task.id,{...task,status:"completed"});this.#leases.delete(task.id)}fail(lease,now){this.#assertCurrentLease(lease,now);const task=this.#requiredTask(lease.task_id);this.#tasks.set(task.id,{...task,status:"failed"});this.#leases.delete(task.id);const blocked=[];let changed=true;while(changed){changed=false;for(const candidate of this.#tasks.values()){if(candidate.status==="planned"&&candidate.depends_on.some(dependency=>{const status=this.#requiredTask(dependency).status;return status==="failed"||status==="blocked"})){this.#tasks.set(candidate.id,{...candidate,status:"blocked"});blocked.push(candidate.id);changed=true}}}return blocked.sort()}expire(now){const expired=[];for(const[taskId,lease]of this.#leases){if(Date.parse(lease.expires_at)<=now.getTime()){const task=this.#requiredTask(taskId);this.#tasks.set(taskId,{...task,status:"planned"});this.#leases.delete(taskId);expired.push(taskId)}}return expired.sort()}snapshot(){return[...this.#tasks.values()].sort((left,right)=>left.id.localeCompare(right.id))}#assertCurrentLease(lease,now){const current=this.#leases.get(lease.task_id);if(current===void 0||current.worker_id!==lease.worker_id||current.fencing_token!==lease.fencing_token)throw new Error("Stale scheduler fencing token");if(Date.parse(current.expires_at)<=now.getTime())throw new Error("Scheduler lease expired");return current}#requiredTask(id){const task=this.#tasks.get(id);if(task===void 0)throw new Error(`Unknown Task: ${id}`);return task}};function validateLocks(locks){const keys=locks.map(lockKey);if(new Set(keys).size!==keys.length)throw new Error("Duplicate scheduler lock");if(locks.some(lock=>lock.key.length===0||!SCHEDULER_LOCK_TYPES.includes(lock.type))){throw new Error("Invalid scheduler lock")}}function lockKey(lock){return`${lock.type}:${lock.key}`}function assertAcyclic(tasks){const visiting=new Set;const visited=new Set;const visit=id=>{if(visiting.has(id))throw new Error("Scheduler DAG contains a cycle");if(visited.has(id))return;visiting.add(id);for(const dependency of tasks.get(id)?.depends_on??[])visit(dependency);visiting.delete(id);visited.add(id)};for(const id of tasks.keys())visit(id)}import{createHash as createHash7}from"node:crypto";var SDC_PHASES=["validate","develop","review","fix","verify","close"];function createSdcState(input){if(input.acceptance_ids.length===0)throw new Error("SDC requires Acceptance Criteria");for(const phase of SDC_PHASES)validateBudget(input.budgets[phase]);return{schema_version:1,id:input.id,phase:"validate",status:"running",revision:1,acceptance_ids:[...input.acceptance_ids],budgets:input.budgets,attempts:emptyAttempts(),checkpoints:[],evidence:[],processed_event_ids:[],blocker:null}}function advanceSdc(state,event){if(state.processed_event_ids.includes(event.id))return state;if(state.status!=="running"||event.phase!==state.phase){throw new Error(`SDC cannot advance ${state.status}:${state.phase} with ${event.phase}`)}const attempts={...state.attempts,[state.phase]:state.attempts[state.phase]+1};const budget=state.budgets[state.phase];if(attempts[state.phase]>budget.max_attempts)throw new Error(`SDC ${state.phase} attempt budget exceeded`);const measured=event.observed_input_tokens??event.observable_context_tokens;const source=event.observed_input_tokens!==null?"provider-uncached-input":event.observable_context_tokens!==null?"observable-context-fallback":"unavailable";const evidence=mergeEvidence(state.evidence,event.evidence);const nextPhase=transition(state.phase,event.outcome);if(state.phase==="close"&&event.outcome==="pass")assertEvidenceComplete(state.acceptance_ids,evidence);const checkpointPayload={phase:state.phase,event_id:event.id,cycles:event.cycles,input_tokens:measured,measurement_source:source,checkpoint_required:event.cycles>=budget.soft_cycles||measured!==null&&measured>=budget.soft_input_tokens};const checkpoint={...checkpointPayload,state_hash:createHash7("sha256").update(JSON.stringify({state_revision:state.revision,checkpointPayload,evidence})).digest("hex")};return{...state,phase:nextPhase,status:state.phase==="close"&&event.outcome==="pass"?"completed":"running",revision:state.revision+1,attempts,checkpoints:[...state.checkpoints,checkpoint],evidence,processed_event_ids:[...state.processed_event_ids,event.id]}}function transition(phase,outcome){const transitions={validate:{pass:"develop",fail:"validate"},develop:{pass:"review",fail:"develop"},review:{pass:"verify",fail:"fix"},fix:{pass:"review",fail:"fix"},verify:{pass:"close",fail:"fix"},close:{pass:"close",fail:"fix"}};return transitions[phase][outcome]}function mergeEvidence(current,added){const byId2=new Map(current.map(evidence=>[evidence.id,evidence]));for(const evidence of added)byId2.set(evidence.id,evidence);return[...byId2.values()].sort((left,right)=>left.id.localeCompare(right.id))}function assertEvidenceComplete(acceptanceIds,evidence){const covered=new Set(evidence.flatMap(item=>item.acceptance_ids));const missing=acceptanceIds.filter(id=>!covered.has(id));if(missing.length>0)throw new Error(`SDC close missing evidence for: ${missing.join(", ")}`)}function validateBudget(budget){if(budget.soft_cycles<=0||budget.soft_input_tokens<=0||budget.max_attempts<=0){throw new Error("Invalid SDC phase budget")}}function emptyAttempts(){return{validate:0,develop:0,review:0,fix:0,verify:0,close:0}}function deriveAutonomousLocks(task){if(task.risk==="critical")return[{type:"global",key:"critical-execution"}];const locks=task.write_scopes.map(scope=>{const wildcard=scope.search(/[?*]/);const prefix=(wildcard<0?scope:scope.slice(0,wildcard)).replace(/\/$/,"");return wildcard<0?{type:"file",key:scope}:{type:"module",key:prefix.length===0?"workspace":prefix}});return[...new Map(locks.map(lock=>[`${lock.type}:${lock.key}`,lock])).values()]}function resolveAutonomousRigor(source,risk2){const riskMinimum={lite:1,standard:2,critical:3}[risk2];const sourceMinimum=source==="task"?1:3;return{minimum_validations:Math.max(riskMinimum,sourceMinimum),minimum_evidence:Math.max(riskMinimum,sourceMinimum),acceptance_evidence_required:true,independent_verifier_required:source!=="task"||risk2==="critical",cross_scope_validation_required:source==="prd",tdd_required:risk2==="standard"||risk2==="critical",fresh_context_per_task_required:risk2==="critical",max_debug_attempts:risk2==="lite"?1:3}}function claimNextTask(state){const tasks=state.tasks.map(task=>({id:task.id,execution_id:state.execution_id,depends_on:task.depends_on,locks:deriveAutonomousLocks(task),priority:task.priority,queued_at:state.created_at,status:task.status}));return new AutonomousScheduler(tasks).claim("autonomous-coordinator",new Date(state.updated_at),6e4)?.task_id??null}function createInvocation(input,task,assignment,active,resumeFrom){const rigor=resolveAutonomousRigor(input.source,task.risk);const selection2=resolveInvocationSelection(input,task,assignment,active);const roleInstruction=active.role==="verifier"?'Review independently. Return JSON {"approved":true|false}. Do not mutate files.':active.role==="finalizer"?'Evaluate terminal Task evidence and return JSON {"approved":true|false}. Do not mutate files.':assignment.id==="agent-orchestrator"?`Act as the Task orchestrator. Do not implement directly. Delegate at least one eligible Sub-Run. Preserve the declared Task write scopes for every Sub-Run. Call zaip-agent-finalizer as the last Sub-Run. Do not create children after zaip-agent-finalizer.`:`Implement only the declared Task scopes.${rigor.tdd_required?" Use strict red-green-refactor TDD.":""} Commit the final product candidate first. Execute validations against that SHA, write typed assurance artifacts referencing it, then commit only those assurance artifacts.`;return{schema_version:1,invocation_id:active.invocation_id,agent_id:assignment.id,model:selection2.model,reasoning_effort:selection2.reasoning_effort,velocity:selection2.velocity,input:{messages:[{role:"system",content:`${roleInstruction} Maximum debugging/repair attempts: ${rigor.max_debug_attempts}.`,name:null},{role:"user",content:JSON.stringify({execution_id:input.execution_id,task_id:task.id,title:task.title,objective:task.objective,acceptance_ids:task.acceptance_ids,write_scopes:task.write_scopes,fresh_context:rigor.fresh_context_per_task_required}),name:null}],context_refs:[task.id,task.change_id,...task.acceptance_ids],tools:[...assignment.tools??[]],response_format:active.role==="verifier"||active.role==="finalizer"?"json":"text"},budget:{max_output_tokens:16e3,timeout_ms:input.policy.max_invocation_ms,max_tool_calls:active.role==="verifier"?0:active.role==="finalizer"?20:100},metadata:{role:active.role,source:input.source,risk:task.risk,worktree_path:requiredWorktree(task),tdd_required:String(rigor.tdd_required),fresh_context_required:String(rigor.fresh_context_per_task_required),cross_scope_validation_required:String(rigor.cross_scope_validation_required),model_selection_origin:selection2.origin,model_policy_version:selection2.policy_version,model_selection_reasons:selection2.reasons.join(",")},resume_from:resumeFrom}}function resolveInvocationSelection(input,task,assignment,active){const config2=input.policy.model_orchestration;if(config2===void 0){return{model:assignment.model,reasoning_effort:assignment.reasoning_effort??"medium",velocity:"standard",origin:"project_defaults",sources:{model:"project_defaults",reasoning_effort:"project_defaults",velocity:"project_defaults"},policy_version:"model-orchestration-v1",reasons:["PROJECT_DEFAULTS"]}}const isRepair=active.phase==="fix";const transversality=task.write_scopes.length>1?"multi_module":"local";return resolveModelSelection({config:config2,task_override:task.runtime,task:{phase:active.phase==="review"?"review":isRepair?"rework":"implementation",agent_role:assignment.id,complexity:task.write_scopes.length<=1&&task.risk==="lite"?"simple":"standard",risk:task.risk,transversality,ambiguity:isRepair?"medium":"low",rework:isRepair?"localized":"none",rework_cost:isRepair?"medium":"low",bounded:true,high_volume:false,xhigh_triggers:[]}})}function assertAutonomousInput(input){if(input.tasks.length===0)throw new Error("Autonomous execution requires Tasks");const ids=new Set(input.tasks.map(task=>task.id));if(ids.size!==input.tasks.length)throw new Error("Autonomous execution has duplicate Tasks");for(const task of input.tasks){if(task.acceptance_ids.length===0)throw new Error(`${task.id} requires Acceptance Criteria`);for(const dependency of task.depends_on){if(!ids.has(dependency))throw new Error(`${task.id} has unknown dependency ${dependency}`)}const rigor=resolveAutonomousRigor(input.source,task.risk);const verifier=input.agents.verifier;if(rigor.independent_verifier_required&&(verifier===null||verifier.id===input.agents.builder.id)){throw new Error(`${task.id} requires a distinct independent verifier`)}}if(input.policy.max_parallelism<1)throw new Error("Invalid autonomous parallelism");if(input.policy.max_operational_retries<0||input.policy.max_repair_cycles_per_task<0){throw new Error("Invalid autonomous retry policy")}for(const[name,value]of Object.entries({max_execution_ms:input.policy.max_execution_ms,max_invocation_ms:input.policy.max_invocation_ms,max_total_invocations:input.policy.max_total_invocations,max_stalled_cycles:input.policy.max_stalled_cycles})){if(!Number.isInteger(value)||value<=0)throw new Error(`Invalid autonomous ${name}`)}new AutonomousScheduler(input.tasks.map(task=>({id:task.id,execution_id:input.execution_id,depends_on:task.depends_on,locks:deriveAutonomousLocks(task),priority:task.priority,queued_at:input.created_at,status:"planned"})))}function assertStateMatchesInput(state,input){if(state.execution_id!==input.execution_id||state.source!==input.source){throw new Error("Durable autonomous state does not match the execution input")}const expected=input.tasks.map(task=>task.id).sort();const actual=state.tasks.map(task=>task.id).sort();if(JSON.stringify(expected)!==JSON.stringify(actual)){throw new Error("Durable autonomous Task set does not match the execution input")}}function assertValidationResult(task,rigor,result2){if(new Set(result2.validation_ids).size<rigor.minimum_validations){throw new Error(`${task.id} requires at least ${rigor.minimum_validations} validation artifacts`)}if(new Set(result2.evidence.map(item=>item.id)).size<rigor.minimum_evidence){throw new Error(`${task.id} requires at least ${rigor.minimum_evidence} Evidence artifacts`)}const covered=new Set(result2.evidence.flatMap(item=>item.acceptance_ids));const missing=task.acceptance_ids.filter(id=>!covered.has(id));if(missing.length>0)throw new Error(`${task.id} has uncovered Acceptance Criteria: ${missing.join(", ")}`)}function requiredVerifier(input){if(input.agents.verifier===null)throw new Error("Independent verifier is not configured");return input.agents.verifier}function requiredFinalizer(input){return input.agents.finalizer}function requiredTask(state,taskId){const task=state.tasks.find(candidate=>candidate.id===taskId);if(task===void 0)throw new Error(`Unknown autonomous Task: ${taskId}`);return task}function requiredWorktree(task){if(task.worktree_path===null)throw new Error(`${task.id} has no prepared worktree`);return task.worktree_path}function invocationId(executionId,taskId,phase,attempt){return`INV-${executionId}-${taskId}-${phase}-${attempt}`.toUpperCase().replace(/[^A-Z0-9-]/g,"-")}function verifierApproved(event){if(event?.type!=="invocation.completed")return false;try{const value=JSON.parse(event.output);return typeof value==="object"&&value!==null&&"approved"in value&&value.approved===true}catch{return false}}var timestamp6=external_exports.string().datetime();var evidenceSchema=external_exports.object({id:external_exports.string().min(1),acceptance_ids:external_exports.array(external_exports.string().min(1))}).strict();var phaseBudgetSchema=external_exports.object({soft_cycles:external_exports.number().int().positive(),soft_input_tokens:external_exports.number().int().positive(),max_attempts:external_exports.number().int().positive()}).strict();var checkpointSchema=external_exports.object({phase:external_exports.enum(SDC_PHASES),event_id:external_exports.string().min(1),state_hash:external_exports.string().regex(/^[a-f0-9]{64}$/),cycles:external_exports.number().int().nonnegative(),input_tokens:external_exports.number().int().nonnegative().nullable(),measurement_source:external_exports.enum(["provider-uncached-input","observable-context-fallback","unavailable"]),checkpoint_required:external_exports.boolean()}).strict();var sdcStateSchema=external_exports.object({schema_version:external_exports.literal(1),id:external_exports.string().min(1),phase:external_exports.enum(SDC_PHASES),status:external_exports.enum(["running","blocked","completed"]),revision:external_exports.number().int().positive(),acceptance_ids:external_exports.array(external_exports.string().min(1)).min(1),budgets:external_exports.object(Object.fromEntries(SDC_PHASES.map(phase=>[phase,phaseBudgetSchema]))),attempts:external_exports.object(Object.fromEntries(SDC_PHASES.map(phase=>[phase,external_exports.number().int().nonnegative()]))),checkpoints:external_exports.array(checkpointSchema),evidence:external_exports.array(evidenceSchema),processed_event_ids:external_exports.array(external_exports.string().min(1)),blocker:external_exports.string().min(1).nullable()}).strict();var activeInvocationSchema=external_exports.object({invocation_id:external_exports.string().regex(/^INV-[A-Z0-9-]+$/),run_id:external_exports.string().min(1).nullable().default(null),phase:external_exports.enum(SDC_PHASES),role:external_exports.enum(["builder","verifier","finalizer"]),checkpoint_id:external_exports.string().min(1).nullable(),checkpoint_hash:external_exports.string().regex(/^[a-f0-9]{64}$/).nullable()}).strict();var taskStateSchema=external_exports.object({id:external_exports.string().min(1),change_id:external_exports.string().min(1),title:external_exports.string().min(1),objective:external_exports.string().min(1),risk:external_exports.enum(["lite","standard","critical"]),priority:external_exports.number().int(),depends_on:external_exports.array(external_exports.string().min(1)),acceptance_ids:external_exports.array(external_exports.string().min(1)).min(1),write_scopes:external_exports.array(external_exports.string().min(1)),runtime:modelSelectionOverrideSchema.optional(),status:external_exports.enum(["planned","running","completed","failed","blocked"]),worktree_path:external_exports.string().min(1).nullable(),integration_commit:external_exports.string().min(1).nullable(),changed_files:external_exports.array(external_exports.string().min(1)).default([]),task_run_id:external_exports.string().min(1).nullable().default(null),finalizer_approved:external_exports.boolean().default(false),active_invocation:activeInvocationSchema.nullable(),sdc:sdcStateSchema,validation_ids:external_exports.array(external_exports.string().min(1)),evidence:external_exports.array(evidenceSchema),last_error:external_exports.string().min(1).nullable()}).strict();var autonomousExecutionStateSchema=external_exports.object({schema_version:external_exports.literal(1),execution_id:external_exports.string().min(1),source:external_exports.enum(["task","spec","prd"]),status:external_exports.enum(["running","completed","failed","blocked"]),revision:external_exports.number().int().nonnegative(),created_at:timestamp6,updated_at:timestamp6,execution_started_at:timestamp6.nullable().default(null),invocation_count:external_exports.number().int().nonnegative().default(0),stalled_cycles:external_exports.number().int().nonnegative().default(0),handoff_worktree_path:external_exports.string().min(1).nullable().default(null),handoff_branch:external_exports.string().min(1).nullable().default(null),handoff_commit:external_exports.string().min(1).nullable().default(null),tasks:external_exports.array(taskStateSchema).min(1),last_error:external_exports.string().min(1).nullable()}).strict();function parseAutonomousExecutionState(value){return autonomousExecutionStateSchema.parse(value)}var AutonomousExecutionCoordinator=class{constructor(dependencies){this.dependencies=dependencies;this.now=dependencies.now??(()=>new Date().toISOString())}dependencies;now;createInitialState(input){assertAutonomousInput(input);const tasks=input.tasks.map(task=>this.initialTask(input,task));return parseAutonomousExecutionState({schema_version:1,execution_id:input.execution_id,source:input.source,status:"running",revision:0,created_at:input.created_at,updated_at:input.created_at,execution_started_at:null,invocation_count:0,stalled_cycles:0,handoff_worktree_path:null,handoff_branch:null,handoff_commit:null,tasks,last_error:null})}async execute(input){if(input.mode==="manual"){return{mode:"manual",status:"materialized",state:null}}assertAutonomousInput(input);const loaded=await this.dependencies.state.load(input.execution_id);let state=loaded===null?await this.persist(this.createInitialState(input)):parseAutonomousExecutionState(loaded);assertStateMatchesInput(state,input);if(state.status==="completed")return{mode:"autonomous",status:state.status,state};if(state.status==="blocked"||state.status==="failed")return{mode:"autonomous",status:state.status,state};if(state.execution_started_at===null){state=await this.persist({...state,execution_started_at:this.now()})}if(requiresHandoff(input)&&state.handoff_worktree_path===null){const handoff=await this.dependencies.worktrees.prepareHandoff({execution_id:input.execution_id,seed_paths:input.handoff_seed_paths});state=await this.persist({...state,handoff_worktree_path:handoff.path,handoff_branch:handoff.branch,handoff_commit:handoff.commit})}try{while(state.status==="running"){if(Date.parse(this.now())-Date.parse(state.execution_started_at)>=input.policy.max_execution_ms){const reason=`Autonomous execution deadline exceeded (${input.policy.max_execution_ms}ms)`;state=await this.persist({...state,status:"blocked",last_error:reason,tasks:state.tasks.map(task=>task.status==="running"?{...task,status:"blocked",last_error:reason}:task)});break}const before=progressFingerprint(state);const running=state.tasks.find(task=>task.status==="running");if(running!==void 0){state=await this.driveTask(input,state,running.id);state=await this.recordProgress(input,state,before);continue}const taskId=claimNextTask(state);if(taskId===null){if(state.tasks.every(task=>task.status==="completed")){state=await this.persist({...state,status:"completed",last_error:null});break}state=await this.persist({...state,status:"blocked",last_error:"No executable Task remains in the autonomous DAG"});break}state=await this.updateTask(state,taskId,task=>({...task,status:"running",last_error:null}));state=await this.recordProgress(input,state,before)}}catch(error51){const message=error51 instanceof Error?error51.message:String(error51);const latest=await this.dependencies.state.load(input.execution_id);const terminal=latest===null?state:parseAutonomousExecutionState(latest);await this.closeRunningLifecycle(terminal);state=await this.persist({...terminal,status:"failed",last_error:message,tasks:terminal.tasks.map(task=>task.status==="running"?{...task,status:"failed",last_error:message}:task)});throw error51}return{mode:"autonomous",status:state.status,state}}initialTask(input,task){const rigor=resolveAutonomousRigor(input.source,task.risk);const attempts=Math.min(rigor.max_debug_attempts,Math.max(input.policy.max_operational_retries+1,input.policy.max_repair_cycles_per_task+1));const budgets=Object.fromEntries(SDC_PHASES.map(phase=>[phase,{soft_cycles:input.policy.soft_cycles,soft_input_tokens:input.policy.soft_input_tokens,max_attempts:phase==="develop"||phase==="review"||phase==="fix"?attempts:1}]));return{...task,depends_on:[...task.depends_on],acceptance_ids:[...task.acceptance_ids],write_scopes:[...task.write_scopes],status:"planned",worktree_path:null,integration_commit:null,changed_files:[],task_run_id:null,finalizer_approved:false,validation_ids:[],evidence:[],active_invocation:null,sdc:createSdcState({id:`SDC-${task.id}`,acceptance_ids:task.acceptance_ids,budgets}),last_error:null}}async driveTask(input,initial,taskId){let state=initial;let task=requiredTask(state,taskId);if(task.task_run_id===null){if(state.handoff_worktree_path===null){throw new Error(`${task.id} requires an autonomous handoff worktree`)}const taskRunId=await this.dependencies.lifecycle.startTaskRun({execution_id:input.execution_id,task,handoff_path:state.handoff_worktree_path,assignment:input.agents.orchestrator});state=await this.updateTask(state,taskId,current=>({...current,task_run_id:taskRunId}));task=requiredTask(state,taskId)}if(task.worktree_path===null){const worktree=await this.dependencies.worktrees.prepare({execution_id:input.execution_id,task_id:task.id,depends_on:task.depends_on,write_scopes:task.write_scopes,...state.handoff_branch===null?{}:{base_branch:state.handoff_branch}});state=await this.updateTask(state,taskId,current=>({...current,worktree_path:worktree.path}));task=requiredTask(state,taskId)}while(task.status==="running"){const phase=task.sdc.phase;if(phase==="validate"){state=await this.advanceTask(state,taskId,phase,"pass",[])}else if(phase==="develop"||phase==="fix"){state=await this.runAgentPhase(input,state,taskId,phase,"builder")}else if(phase==="review"){const rigor=resolveAutonomousRigor(input.source,task.risk);state=rigor.independent_verifier_required?await this.runAgentPhase(input,state,taskId,phase,"verifier"):await this.advanceTask(state,taskId,phase,"pass",[])}else if(phase==="verify"){const current=requiredTask(state,taskId);const rigor=resolveAutonomousRigor(input.source,current.risk);const result2=await this.dependencies.validation.validate({execution_id:input.execution_id,source:input.source,task:current,worktree_path:requiredWorktree(current),rigor});assertValidationResult(current,rigor,result2);state=await this.updateTask(state,taskId,value=>({...value,validation_ids:[...result2.validation_ids],evidence:[...result2.evidence]}));state=await this.advanceTask(state,taskId,phase,"pass",result2.evidence)}else{const current=requiredTask(state,taskId);if(!current.finalizer_approved){state=await this.runAgentPhase(input,state,taskId,"close","finalizer");task=requiredTask(state,taskId);continue}const integration=await this.dependencies.worktrees.integrate({execution_id:input.execution_id,task_id:current.id,worktree_path:requiredWorktree(current),write_scopes:current.write_scopes,...state.handoff_worktree_path===null?{}:{handoff_worktree_path:state.handoff_worktree_path}});if(integration.status==="conflict"){await this.dependencies.lifecycle.finishTaskRun({run_id:requiredTaskRunId(current),handoff_path:requiredHandoffPath(state),status:"failed"});return this.updateTask(await this.persist({...state,status:"blocked",last_error:`Integration conflict: ${integration.conflicts.join(", ")}`}),taskId,value=>({...value,status:"blocked",last_error:"Integration conflict"}))}state=await this.advanceTask(state,taskId,phase,"pass",[]);await this.dependencies.lifecycle.finishTaskRun({run_id:requiredTaskRunId(current),handoff_path:requiredHandoffPath(state),status:"completed"});state=await this.updateTask(state,taskId,value=>({...value,status:"completed",integration_commit:integration.commit,changed_files:integration.changed_files,last_error:null}));if(state.handoff_worktree_path!==null){state=await this.persist({...state,handoff_commit:integration.commit})}await this.dependencies.worktrees.cleanup({execution_id:input.execution_id,task_id:current.id,worktree_path:requiredWorktree(current)})}task=requiredTask(state,taskId)}return state}async runAgentPhase(input,initial,taskId,phase,role){let state=initial;let task=requiredTask(state,taskId);const assignment=role==="builder"?input.agents.builder:role==="verifier"?requiredVerifier(input):requiredFinalizer(input);let active=task.active_invocation;if(active===null){active={invocation_id:invocationId(input.execution_id,task.id,phase,task.sdc.attempts[phase]+1),run_id:null,phase,role,checkpoint_id:null,checkpoint_hash:null};state=await this.updateTask(state,taskId,value=>({...value,active_invocation:active}));task=requiredTask(state,taskId)}if(state.invocation_count>=input.policy.max_total_invocations){throw new Error(`Autonomous invocation budget exhausted: ${input.policy.max_total_invocations}`)}state=await this.persist({...state,invocation_count:state.invocation_count+1});if(active.run_id===null){if(task.task_run_id===null||state.handoff_worktree_path===null){throw new Error(`${task.id} has no lifecycle Run or handoff worktree`)}const runId=await this.dependencies.lifecycle.startInvocationSubrun({execution_id:input.execution_id,task,invocation_id:active.invocation_id,parent_run_id:task.task_run_id,handoff_path:state.handoff_worktree_path,phase,role,assignment});state=await this.updateTask(state,taskId,value=>({...value,active_invocation:{...value.active_invocation,run_id:runId}}));task=requiredTask(state,taskId);active=task.active_invocation}const checkpoint=await this.dependencies.checkpoints.load(active.invocation_id);const invocation=createInvocation(input,task,assignment,active,checkpoint?.opaque_token??null);const stream=checkpoint===null?this.dependencies.runtime.invoke(invocation):this.dependencies.runtime.resume(invocation);const events=[];const iterator=stream[Symbol.asyncIterator]();try{while(true){const item=await nextWithDeadline(iterator,invocation.budget.timeout_ms);if(item.done)break;const event=item.value;events.push(event);if(event.type==="checkpoint.created"){await this.dependencies.checkpoints.save(active.invocation_id,event.checkpoint);state=await this.updateTask(state,taskId,value=>({...value,active_invocation:{...value.active_invocation,checkpoint_id:event.checkpoint.checkpoint_id,checkpoint_hash:event.checkpoint.state_hash}}))}}}catch(error51){if(error51 instanceof Error&&error51.message.startsWith("Autonomous invocation deadline exceeded")){await this.dependencies.runtime.cancel({invocation_id:active.invocation_id,reason:"timeout",requested_at:this.now()}).catch(()=>void 0);await iterator.return?.().catch(()=>void 0);if(active.run_id!==null){await this.dependencies.lifecycle.finishInvocationSubrun({run_id:active.run_id,handoff_path:requiredHandoffPath(state),status:"failed"}).catch(()=>void 0)}}throw error51}const summary=validateRuntimeEventStream(invocation,events);const terminal=events.at(-1);await this.dependencies.lifecycle.finishInvocationSubrun({run_id:active.run_id,handoff_path:requiredHandoffPath(state),status:summary.terminal_type==="invocation.completed"?"completed":"failed"});await this.dependencies.checkpoints.remove(active.invocation_id);state=await this.updateTask(state,taskId,value=>({...value,active_invocation:null}));if(role==="finalizer"){return this.settleFinalizer(state,taskId,summary.terminal_type==="invocation.completed"&&verifierApproved(terminal),`Finalizer ${summary.terminal_type}`)}if(phase==="close")throw new Error("Finalizer close phase escaped terminal handling");if(summary.terminal_type!=="invocation.completed"){return this.recordAgentFailure(state,taskId,phase,summary.terminal_type)}if(role==="verifier"){const approved=verifierApproved(terminal);return approved?this.advanceTask(state,taskId,phase,"pass",[]):this.advanceTask(state,taskId,phase,"fail",[])}return this.advanceTask(state,taskId,phase,"pass",[])}async settleFinalizer(state,taskId,approved,reason){if(approved)return this.updateTask(state,taskId,task2=>({...task2,finalizer_approved:true}));const task=requiredTask(state,taskId);await this.dependencies.lifecycle.finishTaskRun({run_id:requiredTaskRunId(task),handoff_path:requiredHandoffPath(state),status:"failed"});state=await this.updateTask(state,taskId,value=>({...value,status:"blocked",last_error:reason}));return this.persist({...state,status:"blocked",last_error:reason})}async recordAgentFailure(state,taskId,phase,terminal){const advanced=await this.advanceTask(state,taskId,phase,"fail",[]);const task=requiredTask(advanced,taskId);if(task.sdc.attempts[phase]>=task.sdc.budgets[phase].max_attempts){throw new Error(`${task.id} exhausted ${phase} attempts after ${terminal}`)}return advanced}async advanceTask(state,taskId,phase,outcome,evidence){return this.updateTask(state,taskId,task=>({...task,sdc:advanceSdc(task.sdc,{id:`${task.id}:${phase}:${task.sdc.attempts[phase]+1}:${outcome}`,phase,outcome,cycles:1,observed_input_tokens:null,observable_context_tokens:null,evidence})}))}async updateTask(state,taskId,update){return this.persist({...state,tasks:state.tasks.map(task=>task.id===taskId?update(task):task)})}async persist(state){const next=parseAutonomousExecutionState({...state,revision:state.revision+1,updated_at:this.now()});await this.dependencies.state.save(next,state.revision);return next}async recordProgress(input,state,before){if(progressFingerprint(state)!==before){return state.stalled_cycles===0?state:this.persist({...state,stalled_cycles:0})}const next=state.stalled_cycles+1;if(next<input.policy.max_stalled_cycles){return this.persist({...state,stalled_cycles:next})}const reason=`Autonomous execution made no progress for ${next} cycles`;return this.persist({...state,stalled_cycles:next,status:"blocked",last_error:reason,tasks:state.tasks.map(task=>task.status==="running"?{...task,status:"blocked",last_error:reason}:task)})}async closeRunningLifecycle(state){if(state.handoff_worktree_path===null)return;for(const task of state.tasks.filter(candidate=>candidate.status==="running")){if(task.active_invocation?.run_id!==null&&task.active_invocation?.run_id!==void 0){await this.dependencies.lifecycle.finishInvocationSubrun({run_id:task.active_invocation.run_id,handoff_path:state.handoff_worktree_path,status:"failed"}).catch(()=>void 0)}if(task.task_run_id!==null){await this.dependencies.lifecycle.finishTaskRun({run_id:task.task_run_id,handoff_path:state.handoff_worktree_path,status:"failed"}).catch(()=>void 0)}}}};function requiresHandoff(_input){return true}function requiredTaskRunId(task){if(task.task_run_id===null)throw new Error(`${task.id} has no autonomous task Run`);return task.task_run_id}function requiredHandoffPath(state){if(state.handoff_worktree_path===null)throw new Error("Autonomous execution has no handoff worktree");return state.handoff_worktree_path}function progressFingerprint(state){return JSON.stringify({status:state.status,invocation_count:state.invocation_count,tasks:state.tasks.map(task=>({id:task.id,status:task.status,phase:task.sdc.phase,attempts:task.sdc.attempts,active_invocation:task.active_invocation===null?null:{id:task.active_invocation.invocation_id,run_id:task.active_invocation.run_id},integration_commit:task.integration_commit,finalizer_approved:task.finalizer_approved}))})}function nextWithDeadline(iterator,timeoutMs){return new Promise((resolve10,reject)=>{const timer=setTimeout(()=>reject(new Error(`Autonomous invocation deadline exceeded (${timeoutMs}ms)`)),timeoutMs);iterator.next().then(value=>{clearTimeout(timer);resolve10(value)},error51=>{clearTimeout(timer);reject(error51)})})}var FileAutonomousStatePort=class{constructor(filesystem,options={}){this.filesystem=filesystem;this.#basePath=options.state_base_path??".zaip-aios/local-data/autonomous/state"}filesystem;#basePath;async load(executionId){const path=this.#path(executionId);if(!await this.filesystem.exists(path))return null;return parseAutonomousExecutionState(JSON.parse(await this.filesystem.readText(path)))}async save(state,expectedRevision){const candidate=parseAutonomousExecutionState(state);if(candidate.revision!==expectedRevision+1){throw new Error(`Autonomous state revision must advance once: ${expectedRevision} -> ${candidate.revision}`)}const path=this.#path(candidate.execution_id);const lockPath=`${path}.lock`;try{await this.filesystem.writeTextExclusive(lockPath,`${process.pid}
|
|
1123
1124
|
`)}catch(error51){if(isAlreadyExists(error51)){throw new Error(`Autonomous state writer is already active: ${candidate.execution_id}`)}throw error51}try{const current=await this.load(candidate.execution_id);const actualRevision=current?.revision??0;if(actualRevision!==expectedRevision){throw new Error(`Autonomous state CAS conflict for ${candidate.execution_id}: expected ${expectedRevision}, actual ${actualRevision}`)}await this.filesystem.writeTextAtomic(path,`${JSON.stringify(candidate,null,2)}
|
|
1124
1125
|
`)}finally{await this.filesystem.removeFile(lockPath)}}#path(executionId){return`${this.#basePath}/${safeSegment(executionId)}.json`}};var FileAutonomousCheckpointPort=class{constructor(filesystem,options={}){this.filesystem=filesystem;this.#basePath=options.checkpoint_base_path??".zaip-aios/local-data/autonomous/checkpoints"}filesystem;#basePath;async load(invocationId2){const path=this.#path(invocationId2);if(!await this.filesystem.exists(path))return null;return checkpointTokenSchema.parse(JSON.parse(await this.filesystem.readText(path)))}async save(invocationId2,checkpoint){const parsed=checkpointTokenSchema.parse(checkpoint);await this.filesystem.writeTextAtomic(this.#path(invocationId2),`${JSON.stringify(parsed,null,2)}
|
|
1125
1126
|
`)}async remove(invocationId2){await this.filesystem.removeFile(this.#path(invocationId2))}#path(invocationId2){return`${this.#basePath}/${safeSegment(invocationId2)}.json`}};function safeSegment(value){const segment=value.replace(/[^A-Za-z0-9._-]/g,"-");if(segment.length===0||segment==="."||segment===".."){throw new TypeError("Autonomous storage id is invalid")}return segment}function isAlreadyExists(error51){return error51 instanceof Error&&"code"in error51&&error51.code==="EEXIST"}var timestampV2Schema2=external_exports.string().datetime({offset:true});var sha256V2Schema2=external_exports.string().regex(/^[a-f0-9]{64}$/);var taskIdV2Schema2=external_exports.string().startsWith("TASK-");var changeIdV2Schema2=external_exports.string().startsWith("CHG-");var requirementIdV2Schema2=external_exports.string().startsWith("REQ-");var acceptanceIdV2Schema2=external_exports.string().startsWith("AC-");var taskResultV2Schema=external_exports.object({summary:external_exports.string().min(1),changed_files:external_exports.array(external_exports.string().min(1)),evidence_ids:external_exports.array(external_exports.string().startsWith("EVD-")),completed_run_id:external_exports.string().startsWith("RUN-").nullable()}).strict();var taskV2Schema=external_exports.object({schema_version:external_exports.literal(2),id:taskIdV2Schema2,revision:external_exports.number().int().positive(),change_id:changeIdV2Schema2,title:external_exports.string().min(1),short_name:external_exports.string().min(1),objective:external_exports.string().min(1),status:external_exports.enum(["draft","planned","executing","verifying","completed","failed","blocked","cancelled"]),status_reason:external_exports.string().min(1).nullable().optional(),attempt_count:external_exports.number().int().nonnegative().optional(),risk:external_exports.enum(["lite","standard","critical"]),priority:external_exports.enum(["low","medium","high","urgent"]),owner:external_exports.string().min(1).nullable(),requirement_ids:external_exports.array(requirementIdV2Schema2).min(1),acceptance_ids:external_exports.array(acceptanceIdV2Schema2).min(1),depends_on:external_exports.array(taskIdV2Schema2),write_scopes:external_exports.array(external_exports.string().min(1)),plan_revision:external_exports.number().int().positive().nullable(),plan_hash:sha256V2Schema2.nullable(),prepared_plan:preparedPlanV2Schema.optional(),plan_ref:planRefV2Schema.optional(),created_at:timestampV2Schema2,updated_at:timestampV2Schema2,started_at:timestampV2Schema2.nullable(),finished_at:timestampV2Schema2.nullable(),result:taskResultV2Schema.nullable()}).strict().superRefine((value,context)=>{const hasNoPlan=value.plan_revision===null&&value.plan_hash===null;if(value.status==="draft"||hasNoPlan&&["blocked","failed","cancelled"].includes(value.status)){if(!hasNoPlan||value.prepared_plan!==void 0||value.plan_ref!==void 0){context.addIssue({code:"custom",message:`${value.status} Task without materialization cannot contain a prepared plan`})}}else if(value.plan_revision===null||value.plan_hash===null){context.addIssue({code:"custom",message:`${value.status} Task requires plan_revision and plan_hash`})}if(value.prepared_plan!==void 0&&value.plan_ref!==void 0){context.addIssue({code:"custom",message:"Task cannot contain prepared_plan and plan_ref"})}if(value.plan_ref!==void 0&&value.plan_ref.hash!==value.plan_hash){context.addIssue({code:"custom",path:["plan_ref"],message:"plan_ref must match plan_hash"})}if(value.prepared_plan!==void 0&&(value.prepared_plan.source.type!=="task"||value.prepared_plan.source.task_id!==value.id||value.prepared_plan.hash!==value.plan_hash)){context.addIssue({code:"custom",path:["prepared_plan"],message:"prepared_plan must belong to the Task and match plan_hash"})}const terminal=["completed","failed","cancelled"].includes(value.status);if(terminal&&(value.finished_at===null||value.result===null)){context.addIssue({code:"custom",message:"terminal Task requires finished_at and result"})}if(!terminal&&(value.finished_at!==null||value.result!==null)){context.addIssue({code:"custom",message:"non-terminal Task cannot contain finished_at or result"})}if(["executing","verifying","completed"].includes(value.status)&&value.started_at===null){context.addIssue({code:"custom",message:`${value.status} Task requires started_at`})}if(value.status==="completed"&&(value.result?.completed_run_id===null||value.result?.evidence_ids.length===0)){context.addIssue({code:"custom",path:["result"],message:"completed Task requires completed_run_id and at least one Evidence"})}addDuplicateIssues2(value.requirement_ids,"requirement_ids",context);addDuplicateIssues2(value.acceptance_ids,"acceptance_ids",context);addDuplicateIssues2(value.depends_on,"depends_on",context);addDuplicateIssues2(value.write_scopes,"write_scopes",context)});var TaskV2Repository=class{constructor(filesystem,layout){this.filesystem=filesystem;this.layout=layout;if(layout.version===1)throw new TypeError("TaskV2Repository requires a modern WorkspaceLayout")}filesystem;layout;async read(id){const path=await resolveArtifactReadPath(this.filesystem,this.layout,"task",id);if(path===null)throw new Error(`task not found: ${id}`);const document=parseMarkdown(await this.filesystem.readText(path),taskV2Schema);return{task:document.metadata,body:document.body}}async list(){const paths=await this.filesystem.listFiles(this.layout.entityRoot("task"),".md");return Promise.all(paths.map(async path=>parseMarkdown(await this.filesystem.readText(path),taskV2Schema).metadata))}async createDraft(input){const clock=input.clock??new SystemClock;const now=clock.now().toISOString();const task=taskV2Schema.parse({schema_version:2,id:input.id,revision:1,change_id:input.changeId,title:input.title,short_name:input.shortName,objective:input.objective,status:"draft",attempt_count:0,risk:input.risk,priority:input.priority,owner:input.owner??null,requirement_ids:[...input.requirementIds],acceptance_ids:[...input.acceptanceIds],depends_on:[...input.dependsOn??[]],write_scopes:[...input.writeScopes??[]],plan_revision:null,plan_hash:null,created_at:now,updated_at:now,started_at:null,finished_at:null,result:null});await this.filesystem.writeTextExclusive(this.path(task.id),this.serialize(task));return task}async setPreparedPlan(id,plan){const validated=preparedPlanV2Schema.parse(plan);if(validated.source.type!=="task"||validated.source.task_id!==id){throw new TypeError(`Prepared plan source must be task ${id}`)}const current=await this.read(id);if(current.task.status==="planned"&¤t.task.prepared_plan?.hash===validated.hash){return current.task}if(current.task.status!=="draft"){throw new Error(`Task ${id} must be draft before prepare`)}const blueprint=validated.blueprints.tasks.find(task=>task.id===id);if(blueprint===void 0)throw new Error(`Prepared plan does not contain Task ${id}`);const mismatches=[blueprint.change_id===current.task.change_id?null:"change_id",blueprint.title===current.task.title?null:"title",blueprint.short_name===current.task.short_name?null:"short_name",blueprint.objective===current.task.objective?null:"objective",blueprint.risk===current.task.risk?null:"risk",blueprint.priority===current.task.priority?null:"priority",blueprint.owner===current.task.owner?null:"owner",sameValues(blueprint.requirement_ids,current.task.requirement_ids)?null:"requirement_ids",sameValues(blueprint.acceptance_ids,current.task.acceptance_ids)?null:"acceptance_ids",sameValues(blueprint.write_scopes,current.task.write_scopes)?null:"write_scopes"].filter(value=>value!==null);const node=validated.dag.nodes.find(candidate=>candidate.task_id===id);if(node===void 0||!sameValues(node.depends_on,current.task.depends_on)){mismatches.push("depends_on")}if(mismatches.length>0){throw new Error(`Prepared plan diverges from Task draft: ${mismatches.join(", ")}`)}const next=taskV2Schema.parse({...current.task,revision:current.task.revision+1,status:"planned",plan_revision:validated.revision,plan_hash:validated.hash,prepared_plan:validated,updated_at:validated.prepared_at});await this.write(next);return next}async write(task,body=taskV2Body(task)){await this.filesystem.writeTextAtomic(this.path(task.id),this.serialize(task,body))}async normalizePreparedPlan(id,plan){const current=await this.read(id);if(current.task.plan_ref?.hash===plan.hash)return current.task;if(current.task.prepared_plan?.hash!==plan.hash){throw new Error(`Task ${id} does not contain PreparedPlan ${plan.hash}`)}const{prepared_plan:_preparedPlan,...withoutPlan}=current.task;const next=taskV2Schema.parse({...withoutPlan,revision:current.task.revision+1,plan_ref:planRefV2(plan),updated_at:new Date().toISOString()});await this.write(next);return next}async normalizeBody(id){const current=await this.read(id);await this.write(current.task);return current.task}serialize(task,body=taskV2Body(task)){return serializeMarkdown({metadata:taskV2Schema.parse(task),body})}async transition(id,status,result2=null,clock=new SystemClock,reason=null){const current=await this.read(id);if(!TASK_TRANSITIONS[current.task.status].includes(status)){throw new Error(`Invalid Task transition: ${current.task.status} -> ${status}`)}const now=clock.now().toISOString();const terminal=["completed","failed","cancelled"].includes(status);const next=taskV2Schema.parse({...current.task,revision:current.task.revision+1,status,attempt_count:status==="executing"?(current.task.attempt_count??0)+1:current.task.attempt_count,status_reason:["blocked","failed","cancelled"].includes(status)?reason??result2?.summary??`Task moved to ${status}.`:null,updated_at:now,started_at:status==="executing"&¤t.task.started_at===null?now:current.task.started_at,finished_at:terminal?now:null,result:terminal?result2:null});await this.write(next);return next}path(id){return this.layout.activePath("task",id)}};var MaterializationCollisionError=class extends Error{name="MaterializationCollisionError"};var PreparedPlanV2Materializer=class{constructor(filesystem,layout){this.filesystem=filesystem;this.layout=layout;if(layout.version===1){throw new TypeError("PreparedPlanV2Materializer requires a modern WorkspaceLayout")}this.changes=new ChangeV2Repository(filesystem,layout);this.tasks=new TaskV2Repository(filesystem,layout);this.executions=new ExecutionV2Repository(filesystem,layout)}filesystem;layout;changes;tasks;executions;activeNormalizations=new Map;async execute(input){const plan=preparedPlanV2Schema.parse(input);const materialized=materializeEntities(plan);const candidates=[...materialized.changes.map(change=>({kind:"change",id:change.id,path:this.changes.path(change.id),content:this.changes.serialize(change)})),...materialized.tasks.map(task=>({kind:"task",id:task.id,path:this.tasks.path(task.id),content:this.tasks.serialize(task)})),{kind:"execution",id:materialized.execution.id,path:this.executions.path(materialized.execution.id),content:this.executions.serialize(materialized.execution)}];const missing=[];const reusedPaths=[];const draftChanges=[];let promoteExecution=false;for(const candidate of candidates){const resolved=await resolveArtifactReadPath(this.filesystem,this.layout,candidate.kind,candidate.id);if(resolved===null){missing.push(candidate);continue}if(resolved!==candidate.path){throw new MaterializationCollisionError(`${candidate.kind} ${candidate.id} collides with inactive layout path ${resolved}`)}const actual=await this.filesystem.readText(resolved);if(actual!==candidate.content){if(candidate.kind==="execution"){const current=parseMarkdown(actual,executionV2Schema).metadata;if(current.kind==="delivery"&¤t.plan_hash===null&¤t.plan_revision===null&&JSON.stringify(current.origin)===JSON.stringify(materialized.execution.origin)){promoteExecution=true;reusedPaths.push(candidate.path);continue}}if(candidate.kind==="change"){const planned=materialized.changes.find(change=>change.id===candidate.id);const matchingStatus=planned===void 0?null:matchingPreparedChangeStatus(actual,planned);if(planned!==void 0&&matchingStatus!==null){if(matchingStatus==="draft")draftChanges.push(planned);reusedPaths.push(candidate.path);continue}}if(candidate.kind==="task"&&plan.source.type==="task"&&candidate.id===plan.source.task_id&&isMatchingPreparedTask(actual,plan)){reusedPaths.push(candidate.path);continue}throw new MaterializationCollisionError(`${candidate.kind} ${candidate.id} already exists with divergent content`)}reusedPaths.push(candidate.path)}const created=[];const createdPaths=[];try{for(const candidate of missing){try{await this.filesystem.writeTextExclusive(candidate.path,candidate.content);created.push(candidate);createdPaths.push(candidate.path)}catch(error51){if(!await isIdenticalConcurrentWrite(this.filesystem,candidate,error51))throw error51;reusedPaths.push(candidate.path)}}for(const change of draftChanges){await this.changes.promoteDraft(change.id,change)}if(promoteExecution){await this.executions.promoteDeliveryIntake(materialized.execution.id,materialized.execution)}}catch(error51){await rollbackCreated(this.filesystem,created);throw error51}const execution=(await this.executions.read(plan.execution_id)).execution;await this.normalizeSource(plan);const tasks=await Promise.all(materialized.tasks.map(async task=>(await this.tasks.read(task.id)).task));return{execution,changes:await Promise.all(materialized.changes.map(async change=>(await this.changes.read(change.id)).change)),tasks,created_paths:createdPaths,reused_paths:reusedPaths}}async normalizeSource(plan){const active=this.activeNormalizations.get(plan.hash);if(active!==void 0)return active;const normalization=(async()=>{if(plan.source.type==="task"){await this.tasks.normalizePreparedPlan(plan.source.task_id,plan)}else if(plan.source.type==="spec"){await new DeliverySpecV2Repository(this.filesystem,this.layout).normalizePreparedPlan(plan.source.spec_id,plan)}else{await new PrdV2Repository(this.filesystem,this.layout).normalizePreparedPlan(plan.source.prd_id,plan)}})();this.activeNormalizations.set(plan.hash,normalization);try{await normalization}finally{this.activeNormalizations.delete(plan.hash)}}};function isMatchingPreparedTask(source,plan){try{const task=parseMarkdown(source,taskV2Schema).metadata;return task.status==="planned"&&(task.prepared_plan?.hash===plan.hash||task.plan_ref?.hash===plan.hash)&&task.plan_hash===plan.hash&&task.id===(plan.source.type==="task"?plan.source.task_id:"")}catch{return false}}function matchingPreparedChangeStatus(source,planned){try{const change=parseMarkdown(source,changeV2Schema).metadata;const status=change.status==="draft"||change.status==="planned"?change.status:null;const matches=status!==null&&change.id===planned.id&&change.title===planned.title&&change.risk===planned.risk&&JSON.stringify(change.source)===JSON.stringify(planned.source)&&change.requirement_ids.every(id=>planned.requirement_ids.includes(id))&&change.acceptance_ids.every(id=>planned.acceptance_ids.includes(id))&&change.task_ids.every(id=>planned.task_ids.includes(id));return matches?status:null}catch{return null}}function materializeEntities(plan){const nodes=new Map(plan.dag.nodes.map(node=>[node.task_id,node]));const taskBlueprints=new Map(plan.blueprints.tasks.map(task=>[task.id,task]));const tasks=plan.blueprints.tasks.map(blueprint=>{const node=nodes.get(blueprint.id);if(node===void 0)throw new Error(`Prepared DAG does not contain ${blueprint.id}`);return taskV2Schema.parse({schema_version:2,id:blueprint.id,revision:1,change_id:blueprint.change_id,title:blueprint.title,short_name:blueprint.short_name,objective:blueprint.objective,status:"planned",risk:blueprint.risk,priority:blueprint.priority,owner:blueprint.owner,requirement_ids:blueprint.requirement_ids,acceptance_ids:blueprint.acceptance_ids,depends_on:node.depends_on,write_scopes:blueprint.write_scopes,plan_revision:plan.revision,plan_hash:plan.hash,...plan.source.type==="task"&&plan.source.task_id===blueprint.id?{prepared_plan:plan}:{},created_at:plan.prepared_at,updated_at:plan.prepared_at,started_at:null,finished_at:null,result:null})});const changes=plan.blueprints.changes.map(blueprint=>changeV2Schema.parse({schema_version:2,id:blueprint.id,revision:1,title:blueprint.title,status:"planned",risk:blueprint.risk,source:blueprint.source,requirement_ids:blueprint.requirement_ids,acceptance_ids:blueprint.acceptance_ids,requirement_impact:blueprint.requirement_impact,task_ids:tasks.filter(task=>task.change_id===blueprint.id).map(task=>task.id),plan_revision:plan.revision,plan_hash:plan.hash,created_at:plan.prepared_at,updated_at:plan.prepared_at,started_at:null,finished_at:null,result:null}));const execution=executionV2Schema.parse({schema_version:2,id:plan.execution_id,revision:1,kind:"delivery",client_turn_id:null,origin:plan.source,status:"planned",plan_revision:plan.revision,plan_hash:plan.hash,policy:plan.policy,dag:{nodes:plan.dag.nodes.map(node=>({task_id:node.task_id,change_id:taskBlueprints.get(node.task_id)?.change_id,depends_on:node.depends_on})),topological_order:plan.dag.topological_order},created_at:plan.prepared_at,updated_at:plan.prepared_at,started_at:null,finished_at:null,result:null});return{changes,tasks,execution}}async function isIdenticalConcurrentWrite(filesystem,candidate,error51){if(!isFileExistsError2(error51)||!await filesystem.exists(candidate.path))return false;const actual=await filesystem.readText(candidate.path);if(actual===candidate.content)return true;throw new MaterializationCollisionError(`${candidate.kind} ${candidate.id} was created concurrently with divergent content`)}function isFileExistsError2(error51){return typeof error51==="object"&&error51!==null&&"code"in error51&&error51.code==="EEXIST"}async function rollbackCreated(filesystem,created){for(const candidate of[...created].reverse()){if(!await filesystem.exists(candidate.path))continue;const current=await filesystem.readText(candidate.path);if(current===candidate.content)await filesystem.removeFile(candidate.path)}}var TASK_TRANSITIONS={draft:["planned","blocked","failed","cancelled"],planned:["executing","blocked","failed","cancelled"],executing:["verifying","failed","blocked","cancelled"],verifying:["executing","completed","failed","blocked","cancelled"],blocked:["executing","cancelled"],completed:[],failed:["executing"],cancelled:[]};function taskV2Body(task){const plan=task.status==="draft"?"Rascunho aguardando classifica\xE7\xE3o; pode possuir Run de conversa, mas nenhum Change ou Execution foi criado.":task.plan_hash===null?`Captura encerrada como ${task.status} sem materializar Change ou Execution.`:`Plano ${task.plan_revision??"-"} materializado em ${task.change_id}; estado atual: ${task.status}.`;const result2=task.result?.summary??task.status_reason??"Ainda n\xE3o conclu\xEDda.";const evidence=task.result?.evidence_ids.length?task.result.evidence_ids.map(id=>`- ${id}`).join("\n"):"Nenhuma evid\xEAncia registrada.";return`# ${task.title}
|
|
@@ -1251,14 +1252,14 @@ V1 state converted to V2 with source fingerprint \`${fingerprint.sha256}\`.`})),
|
|
|
1251
1252
|
\`\`\`json
|
|
1252
1253
|
${JSON.stringify(metadata,null,2)}
|
|
1253
1254
|
\`\`\``}function decisionCategory(value){const allowed=["architecture","contract","database","security","dependency","network","infrastructure","cost","implementation","rollback"];return allowed.find(candidate=>candidate===value)??"implementation"}function stringArray(value){return Array.isArray(value)?value.filter(candidate=>typeof candidate==="string"):[]}function firstDuplicate(values2){const seen=new Set;for(const value of values2){if(seen.has(value))return value;seen.add(value)}return null}function nullableTimestamp(value){return typeof value==="string"&&!Number.isNaN(Date.parse(value))?new Date(value).toISOString():null}function nullableString(value){return typeof value==="string"&&value.length>0?value:null}function numberOr(value,fallback){return typeof value==="number"&&Number.isFinite(value)?value:fallback}function nullableNonnegativeInteger(value){return typeof value==="number"&&Number.isInteger(value)&&value>=0?value:null}function nullableNonnegativeNumber(value){return typeof value==="number"&&Number.isFinite(value)&&value>=0?value:null}function legacyTokenUsage(value){const record2=value!==null&&typeof value==="object"?asRecord2(value,"token usage"):{};const input=nullableNonnegativeInteger(record2.input);const cached2=nullableNonnegativeInteger(record2.cached_input);const output2=nullableNonnegativeInteger(record2.output);const reasoning=nullableNonnegativeInteger(record2.reasoning);const declaredTotal=nullableNonnegativeInteger(record2.total);const minimumTotal=input!==null&&output2!==null?input+output2:null;const source=record2.source==="client"||record2.source==="provider_reported"?"provider_reported":record2.source==="estimated"?"estimated":"unavailable";return{input,cached_input:input===null||cached2===null?cached2:Math.min(cached2,input),output:output2,reasoning,total:declaredTotal===null?minimumTotal:minimumTotal===null?declaredTotal:Math.max(declaredTotal,minimumTotal),source}}function legacyCost(value){const record2=value!==null&&typeof value==="object"?asRecord2(value,"cost"):{};return{usd:nullableNonnegativeNumber(record2.usd??record2.estimated_usd),brl:nullableNonnegativeNumber(record2.brl??record2.estimated_brl)}}function runEventId(runId,sequence){return`${runId}:event:${String(sequence).padStart(6,"0")}`}async function readManagedFiles(filesystem){const paths=(await Promise.all([".agents/rules",".agents/requirements",".agents/skills"].map(root=>filesystem.listFiles(root)))).flat().sort();return Object.fromEntries(await Promise.all(paths.map(async path=>[path,sha2562(await readFile2(filesystem.resolve(path)))])))}async function readLegacyManagedPaths(filesystem){const path=".agents/managed/files.json";if(!await filesystem.exists(path))return new Set;const parsed=JSON.parse(await filesystem.readText(path));return new Set(Object.keys(parsed.files??{}))}function assertPromotionMappings(mappings){const legacyIds2=new Set;const targetIds=new Set;for(const mapping of mappings){if(legacyIds2.has(mapping.legacy_spec_id)||targetIds.has(mapping.delivery_spec_id)){throw new Error("Promotion mappings must be one-to-one")}datedIdPartsWithDay(mapping.delivery_spec_id);if(!mapping.delivery_spec_id.startsWith("SPEC-"))throw new Error("Promotion target must be a SPEC id");if(!mapping.authorized_by.startsWith("DEC-HUMAN-")){throw new Error("Capability promotion requires authorized_by DEC-HUMAN-*")}legacyIds2.add(mapping.legacy_spec_id);targetIds.add(mapping.delivery_spec_id)}}function assertPromotionAuthorizations(mappings,decisions){const byId2=new Map(decisions.filter(decision=>typeof decision.metadata.id==="string").map(decision=>[decision.metadata.id,decision]));for(const mapping of mappings){const authorization=byId2.get(mapping.authorized_by);if(authorization===void 0||authorization.metadata.origin!=="human"||nullableTimestamp(authorization.metadata.confirmed_at)===null){throw new Error(`Capability promotion authorization must resolve to a confirmed human Decision: ${mapping.authorized_by}`)}}}function operationOrder(left,right){const leftConfig=left.kind==="activate-config"?1:0;const rightConfig=right.kind==="activate-config"?1:0;return leftConfig-rightConfig||(leftConfig===1?configOrder(left.target_path)-configOrder(right.target_path):left.target_path.localeCompare(right.target_path))}function asRecord2(value,label){if(value===null||typeof value!=="object"||Array.isArray(value))throw new Error(`${label} must be an object`);return value}function requiredString2(value,label){if(typeof value!=="string"||value.length===0)throw new Error(`${label} must be a non-empty string`);return value}function stringOr(value,fallback){return typeof value==="string"&&value.length>0?value:fallback}function sha2562(value){return createHash9("sha256").update(value).digest("hex")}function hashCanonical(value){return sha2562(JSON.stringify(canonicalize2(value)))}function canonicalize2(value){if(Array.isArray(value))return value.map(canonicalize2);if(value!==null&&typeof value==="object"){return Object.fromEntries(Object.entries(value).sort(([left],[right])=>left.localeCompare(right)).map(([key,nested])=>[key,canonicalize2(nested)]))}return value}var DISTRIBUTION_VERSION="1.0.0";async function verifyDistribution(filesystem){const checksumPath="checksums.sha256";if(!await filesystem.exists(checksumPath)){return{valid:false,invalid:[checksumPath]}}const lines=(await filesystem.readText(checksumPath)).split(/\r?\n/).filter(Boolean);const invalid=[];for(const line of lines){const match=line.match(/^([a-f0-9]{64}) {2}(.+)$/);if(!match?.[1]||!match[2]||!await filesystem.exists(match[2])){invalid.push(match?.[2]??line);continue}const actual=createHash10("sha256").update(await filesystem.readBytes(match[2])).digest("hex");if(actual!==match[1])invalid.push(match[2])}return{valid:invalid.length===0,invalid}}async function migrateProject(filesystem,dryRun=false){const path=".agents/manifest.yaml";const raw=parseYaml(await filesystem.readText(path));if(typeof raw==="object"&&raw!==null&&"schema_version"in raw){await new ManifestRepository(filesystem).read();return{from:1,to:1,changed:[],dryRun}}if(typeof raw!=="object"||raw===null||!("version"in raw)||!("project"in raw)){throw new Error("Unsupported legacy manifest; automatic migration is unsafe")}const legacy=raw;if(legacy.version!==1||typeof legacy.project.name!=="string"){throw new Error("Unsupported legacy manifest version")}const migrated={schema_version:1,project:{id:typeof legacy.project.id==="string"?legacy.project.id:normalizeShortName(legacy.project.name).toLowerCase(),name:legacy.project.name,timezone:"America/Sao_Paulo"},framework:{version:DISTRIBUTION_VERSION},layout:{version:1,managed_namespace:".agents/managed",project_namespace:".agents/project"},profile:{id:"typescript-hono-kysely"},agents:["codex","claude"],paths:{specs:".agents/specs",changes:".agents/changes",tasks:".agents/tasks",decisions:".agents/decisions",runs:".agents/runs"}};if(!dryRun)await filesystem.writeTextAtomic(path,serializeYaml(migrated));return{from:0,to:1,changed:[path],dryRun}}async function upgradeDistribution(workspaceRoot,sourcePath,dryRun=false){const root=resolve4(workspaceRoot);const source=resolve4(root,sourcePath);const target=resolve4(root,".zaip-aios");const backup=resolve4(root,".zaip-aios.rollback");const fromRoot=relative3(root,source);if(fromRoot===".."||fromRoot.startsWith("../")||fromRoot.startsWith("..\\")||isAbsolute3(fromRoot)){throw new Error("Upgrade source escapes workspace")}if(source===target||source.startsWith(`${target}\\`)||source.startsWith(`${target}/`)){throw new Error("Upgrade source must not be inside the active distribution")}const verification=await verifyDistribution(new WorkspaceFileSystem(source));if(!verification.valid){throw new Error(`Upgrade source checksum failed: ${verification.invalid.join(", ")}`)}if(dryRun)return{changed:[".zaip-aios"],backup:".zaip-aios.rollback",dryRun:true};await rm3(backup,{recursive:true,force:true});await rename3(target,backup);try{await cp(source,target,{recursive:true,force:false,errorOnExist:true})}catch(error51){await rm3(target,{recursive:true,force:true});await rename3(backup,target);throw error51}return{changed:[".zaip-aios"],backup:".zaip-aios.rollback",dryRun:false}}async function rollbackDistribution(workspaceRoot){const root=resolve4(workspaceRoot);const target=resolve4(root,".zaip-aios");const backup=resolve4(root,".zaip-aios.rollback");await rm3(target,{recursive:true,force:true});await rename3(backup,target)}async function distributionTemplateFiles(filesystem){const paths=await filesystem.listFiles("templates");return Promise.all(paths.map(async path=>{const relativePath=path.replace(/^templates\//,"");const target=relativePath==="constitution.md"?".agents/constitution.md":`.agents/${relativePath}`;return{path:target,content:await filesystem.readText(path)}}))}async function doctorProject(filesystem){const findings=[];for(const path of[".agents/manifest.yaml",".agents/constitution.md","AGENTS.md","CLAUDE.md"]){if(!await filesystem.exists(path)){findings.push({severity:"error",path,message:"Required ZAIP-AIOS file is missing"})}}if(!await filesystem.exists(".git")){findings.push({severity:"warning",path:".git",message:"Git-native audit requires a Git repository"})}return findings}import{createHash as createHash11}from"node:crypto";import{cp as cp2,lstat,mkdir as mkdir3,readdir as readdir2,readFile as readFile3,rename as rename4,rm as rm4}from"node:fs/promises";import{dirname as dirname3,relative as relative4,resolve as resolve5,sep as sep2}from"node:path";var MANIFEST=".zaip-managed.json";async function planManagedAssetInstalls(distributionRoot,workspaceRoot){const[dashboard,design]=await Promise.all([planDashboardInstall(distributionRoot,workspaceRoot),planDesignInstall(distributionRoot,workspaceRoot)]);return{dashboard,design}}async function applyManagedAssetInstalls(plans){const[dashboard,design]=await Promise.all([applyDashboardInstall(plans.dashboard),applyDesignInstall(plans.design)]);return{dashboard,design}}async function planDashboardInstall(distributionRoot,workspaceRoot){return planManagedAssetInstall(distributionRoot,workspaceRoot,"dashboard")}async function planDesignInstall(distributionRoot,workspaceRoot){return planManagedAssetInstall(distributionRoot,workspaceRoot,"design")}async function planManagedAssetInstall(distributionRoot,workspaceRoot,asset){const source=resolve5(distributionRoot,asset);const destination=resolve5(workspaceRoot,`.agents/${asset}`);const sourceManifest=await readAndValidateManifest(source,asset);await assertManifestFiles(source,sourceManifest,asset);const sourceFiles=new Map(sourceManifest.files.map(file2=>[file2.path,file2.sha256]));const sourcePaths=[...sourceFiles.keys(),MANIFEST].sort();if(!await exists(destination)){return result(asset,source,destination,sourcePaths.map(path=>`.agents/${asset}/${path}`),[],[],[],false)}const currentManifestPath=resolve5(destination,MANIFEST);if(!await exists(currentManifestPath)){return result(asset,source,destination,[],[],[],[`.agents/${asset}`],false)}let currentManifest;try{currentManifest=await readAndValidateManifest(destination,asset)}catch{return result(asset,source,destination,[],[],[],[`.agents/${asset}/${MANIFEST}`],false)}const currentFiles=new Map(currentManifest.files.map(file2=>[file2.path,file2.sha256]));const conflicts=[];const actual=await relativeFiles(destination);const known=new Set([...currentFiles.keys(),MANIFEST]);for(const path of actual){if(!known.has(path))conflicts.push(`.agents/${asset}/${path}`)}for(const[path,expected]of currentFiles){const absolute=safeResolve(destination,path);if(!await exists(absolute)||await hashFile(absolute)!==expected){conflicts.push(`.agents/${asset}/${path}`)}}if(conflicts.length>0){return result(asset,source,destination,[],[],[],[...new Set(conflicts)].sort(),false)}const created=[];const updated=[];const existing=[];for(const[path,expected]of sourceFiles){const portable=`.agents/${asset}/${path}`;const current=currentFiles.get(path);if(current===void 0)created.push(portable);else if(current===expected)existing.push(portable);else updated.push(portable)}for(const path of currentFiles.keys()){if(!sourceFiles.has(path))updated.push(`.agents/${asset}/${path}`)}updated.push(`.agents/${asset}/${MANIFEST}`);return result(asset,source,destination,created,updated,existing,[],false)}async function applyDashboardInstall(plan){return applyManagedAssetInstall(plan)}async function applyDesignInstall(plan){return applyManagedAssetInstall(plan)}async function applyManagedAssetInstall(plan){if(plan.conflicts.length>0)throw new Error(`${plan.asset} install has unresolved conflicts`);const parent=dirname3(plan.destination);const nonce=`${process.pid}-${Date.now()}`;const staging=resolve5(parent,`.${plan.asset}.zaip-new-${nonce}`);const backup=resolve5(parent,`.${plan.asset}.zaip-old-${nonce}`);await mkdir3(parent,{recursive:true});await cp2(plan.source,staging,{recursive:true,errorOnExist:true,force:false});const hadDestination=await exists(plan.destination);try{if(hadDestination)await rename4(plan.destination,backup);await rename4(staging,plan.destination);if(hadDestination)await rm4(backup,{recursive:true,force:true})}catch(error51){await rm4(staging,{recursive:true,force:true});if(hadDestination&&await exists(backup)&&!await exists(plan.destination)){await rename4(backup,plan.destination)}throw error51}return{...plan,applied:true}}async function validateInstalledDashboard(workspaceRoot){return validateInstalledManagedAsset(workspaceRoot,"dashboard")}async function validateInstalledDesign(workspaceRoot){return validateInstalledManagedAsset(workspaceRoot,"design")}async function validateInstalledManagedAsset(workspaceRoot,asset){const root=resolve5(workspaceRoot,`.agents/${asset}`);if(!await exists(root)){return[{path:`.agents/${asset}`,message:`Managed ZAIP ${asset} is missing`}]}let manifest;try{manifest=await readAndValidateManifest(root,asset)}catch(error51){return[{path:`.agents/${asset}/${MANIFEST}`,message:error51 instanceof Error?error51.message:String(error51)}]}const findings=[];for(const file2 of manifest.files){const absolute=safeResolve(root,file2.path);if(!await exists(absolute)){findings.push({path:`.agents/${asset}/${file2.path}`,message:"Managed file is missing"})}else if(await hashFile(absolute)!==file2.sha256){findings.push({path:`.agents/${asset}/${file2.path}`,message:"Managed file checksum drift"})}}return findings}async function readAndValidateManifest(root,asset){const parsed=JSON.parse(await readFile3(resolve5(root,MANIFEST),"utf8"));if(typeof parsed!=="object"||parsed===null)throw new Error(`Invalid ${asset} manifest`);const value=parsed;if(value.schemaVersion!==1||typeof value.version!=="string"||!Array.isArray(value.files)){throw new Error(`Invalid ${asset} manifest fields`)}const seen=new Set;const files=value.files.map(entry=>{if(typeof entry!=="object"||entry===null)throw new Error(`Invalid ${asset} file`);const file2=entry;if(typeof file2.path!=="string"||typeof file2.sha256!=="string"||!/^[a-f0-9]{64}$/.test(file2.sha256)){throw new Error(`Invalid ${asset} file fields`)}safeResolve(root,file2.path);if(seen.has(file2.path))throw new Error(`Duplicate ${asset} path: ${file2.path}`);seen.add(file2.path);return{path:file2.path,sha256:file2.sha256}});return{schemaVersion:1,version:value.version,files}}async function assertManifestFiles(root,manifest,asset){const actual=await relativeFiles(root);const expected=new Set([...manifest.files.map(file2=>file2.path),MANIFEST]);const extra=actual.filter(path=>!expected.has(path));if(extra.length>0)throw new Error(`Unmanaged ${asset} release files: ${extra.join(", ")}`);for(const file2 of manifest.files){const absolute=safeResolve(root,file2.path);if(!await exists(absolute))throw new Error(`${asset} release file missing: ${file2.path}`);if(await hashFile(absolute)!==file2.sha256){throw new Error(`${asset} release checksum mismatch: ${file2.path}`)}}}async function relativeFiles(root){const entries=await readdir2(root,{recursive:true,withFileTypes:true});return entries.filter(entry=>entry.isFile()).map(entry=>relative4(root,resolve5(entry.parentPath,entry.name)).replaceAll("\\","/")).sort()}function safeResolve(root,portable){if(portable.length===0||portable.includes("\\")||portable.includes("\0")||portable.startsWith("/")||/^[A-Za-z]:/.test(portable)||portable.split("/").some(part=>part.length===0||part==="."||part==="..")){throw new Error(`Unsafe managed asset path: ${portable}`)}const destination=resolve5(root,portable);if(!destination.startsWith(`${resolve5(root)}${sep2}`)){throw new Error(`Managed asset path escapes root: ${portable}`)}return destination}async function hashFile(path){return createHash11("sha256").update(await readFile3(path)).digest("hex")}async function exists(path){return lstat(path).then(()=>true,error51=>{if(error51 instanceof Error&&"code"in error51&&error51.code==="ENOENT")return false;throw error51})}function result(asset,source,destination,created,updated,existing,conflicts,applied){return{asset,source,destination,created:[...created].sort(),updated:[...new Set(updated)].sort(),existing:[...existing].sort(),conflicts:[...conflicts].sort(),applied}}import{basename,dirname as dirname4,resolve as resolve6}from"node:path";async function dashboardDoctorFindings(executable,workspaceRoot){if(executable===void 0)return[];const distributionRoot=resolve6(dirname4(executable),"..");if(basename(distributionRoot)!==".zaip-aios")return[];return(await validateInstalledDashboard(workspaceRoot)).map(finding2=>({severity:"error",code:"dashboard-drift",...finding2,state:"active"}))}async function designDoctorFindings(executable,workspaceRoot){if(executable===void 0)return[];const distributionRoot=resolve6(dirname4(executable),"..");if(basename(distributionRoot)!==".zaip-aios")return[];return(await validateInstalledDesign(workspaceRoot)).map(finding2=>({severity:"error",code:"design-drift",...finding2,state:"active"}))}async function managedAssetDoctorFindings(executable,workspaceRoot,filesystem){if(executable!==void 0&&filesystem!==void 0){const distributionRoot=resolve6(dirname4(executable),"..");if(await isFrameworkSourceWorkspace(filesystem,workspaceRoot,distributionRoot))return[]}return(await Promise.all([dashboardDoctorFindings(executable,workspaceRoot),designDoctorFindings(executable,workspaceRoot)])).flat()}async function isFrameworkSourceWorkspace(filesystem,root,distributionRoot){if(resolve6(root,".zaip-aios")!==distributionRoot||!await filesystem.exists("package.json")){return false}try{const manifest=JSON.parse(await filesystem.readText("package.json"));return manifest.name==="@zaip-ai/aios"}catch{return false}}async function frameworkSourceTemplateFiles(filesystem){const paths=(await Promise.all([".agents/rules/zaip",".agents/requirements",".agents/skills",".agents/zaip-aios",".agents/tools"].map(path=>filesystem.listFiles(path)))).flat().filter(path=>!path.endsWith("/.gitkeep")).sort();return Promise.all(paths.map(async path=>({path,content:await filesystem.readText(path)})))}async function readMigrationOptions(filesystem,parsed){const path=parsed.options.promotions;if(path===void 0)return{};const decoded=JSON.parse(await filesystem.readText(path));const promotions=Array.isArray(decoded)?decoded:typeof decoded==="object"&&decoded!==null&&"promotions"in decoded?decoded.promotions:void 0;if(!Array.isArray(promotions)){throw new UsageError("--promotions must point to a JSON array or an object containing a promotions array")}return{promotions}}function migrationPlanOutput(plan,verbose){const operationCounts=Object.fromEntries([...new Set(plan.operations.map(operation=>operation.category))].sort().map(category=>[category,plan.operations.filter(operation=>operation.category===category).length]));return{schema_version:plan.schema_version,migration_id:plan.migration_id,from_layout:plan.from_layout,to_layout:plan.to_layout,source_fingerprint:{sha256:plan.source_fingerprint.sha256,file_count:plan.source_fingerprint.files.length,total_bytes:plan.source_fingerprint.files.reduce((total,file2)=>total+file2.size,0)},promotions:plan.promotions,counts:plan.counts,operation_counts:operationCounts,findings:plan.findings,cleanup:{path_count:plan.cleanup_paths.length,roots:plan.cleanup_roots},plan_sha256:plan.plan_sha256,...verbose?{operations:plan.operations.map(({content_base64:_,...operation})=>operation),source_files:plan.source_fingerprint.files,cleanup_paths:plan.cleanup_paths}:{}}}var EXIT={success:0,error:1,conformity:3,security:5,prerequisite:6};async function runDistributionCommand(context){const{area,action,parsed,filesystem,root,json:json2}=context;if(area==="setup"){const executable=process.argv[1];let templateFiles=[];let assetPlans=null;if(executable!==void 0){const distributionRoot=resolve7(dirname5(executable),"..");if(basename2(distributionRoot)===".zaip-aios"){const distributionFilesystem=new WorkspaceFileSystem(distributionRoot);const verification=await verifyDistribution(distributionFilesystem);if(!verification.valid){output(verification,json2,true);return EXIT.security}const frameworkSource=await isFrameworkSourceWorkspace(filesystem,root,distributionRoot);templateFiles=frameworkSource?await frameworkSourceTemplateFiles(filesystem):await distributionTemplateFiles(distributionFilesystem);if(!frameworkSource)assetPlans=await planManagedAssetInstalls(distributionRoot,root)}}const hasLegacyManifest=await filesystem.exists(".agents/manifest.yaml");const hasV2Config=await filesystem.exists(".agents/config/project.yaml")||await filesystem.exists(".agents/config/framework.lock.yaml");if(hasLegacyManifest&&!hasV2Config){throw new UsageError("V1 workspace is read-only: review `migrate plan`, then run `migrate apply`")}const options={projectName:parsed.options.name??basename2(root),bootstrapTask:parsed.flags.has("bootstrap-task"),templateFiles:templateFiles.filter(file2=>/^(?:\.agents\/config\/agents\/catalog\.yaml|\.agents\/(?:rules|requirements|skills)\/)/.test(file2.path))};const dryRun=parsed.flags.has("dry-run");if(assetPlans!==null){const preflight=await setupProjectV2(filesystem,{...options,dryRun:true});const conflicts=[...preflight.conflicts,...Object.values(assetPlans).flatMap(plan=>plan.conflicts)].sort();if(dryRun||conflicts.length>0){const result3={...preflight,conflicts,...assetPlans};output(result3,json2);return conflicts.length>0?EXIT.conformity:EXIT.success}}const setup=await setupProjectV2(filesystem,{...options,dryRun});const installedAssets=assetPlans!==null&&setup.applied?await applyManagedAssetInstalls(assetPlans):assetPlans;const result2=installedAssets===null?setup:{...setup,...installedAssets};output(result2,json2);return setup.conflicts.length>0||!setup.dryRun&&!setup.applied?EXIT.conformity:EXIT.success}if(area==="doctor"){const hasV2Config=await filesystem.exists(".agents/config/project.yaml")||await filesystem.exists(".agents/config/framework.lock.yaml");const findings=hasV2Config?await doctorProjectV2(filesystem):await doctorProject(filesystem);const assetFindings=await managedAssetDoctorFindings(process.argv[1],root,filesystem);const combinedFindings=[...findings,...assetFindings];output({valid:combinedFindings.every(item=>item.severity!=="error"),findings:combinedFindings},json2);return combinedFindings.some(item=>item.severity==="error")?EXIT.prerequisite:EXIT.success}if(area==="migrate"){if(action==="legacy-manifest"){if(await filesystem.exists(".agents/config/project.yaml")||await filesystem.exists(".agents/config/framework.lock.yaml")){throw new UsageError("legacy-manifest is disabled after V2 activation")}output(await migrateProject(filesystem,parsed.flags.has("dry-run")),json2);return EXIT.success}const migrationOptions=await readMigrationOptions(filesystem,parsed);if(action==="plan"||action===void 0&&parsed.flags.has("dry-run")){const plan=await planV1ToV2Migration(filesystem,migrationOptions);output(migrationPlanOutput(plan,parsed.flags.has("verbose")),json2);return EXIT.success}if(action==="apply"){requireOptions(parsed.options,["plan-hash"]);const plan=parsed.options.migration===void 0?await planV1ToV2Migration(filesystem,migrationOptions):await readPersistedMigrationPlan(filesystem,parsed.options.migration);if(plan===null){throw new UsageError(`Migration plan not found: ${parsed.options.migration}`)}output(await applyV1ToV2Migration(filesystem,plan,parsed.options["plan-hash"]),json2);return EXIT.success}if(action==="status"||action==="rollback"){requireOptions(parsed.options,["migration"]);const migrationId=parsed.options.migration;const plan=await readPersistedMigrationPlan(filesystem,migrationId);if(plan===null)throw new UsageError(`Migration plan not found: ${migrationId}`);if(action==="rollback"){output(await rollbackV1ToV2Migration(filesystem,plan,parsed.options["plan-hash"]??plan.plan_sha256),json2)}else{output({migration_id:migrationId,plan_hash:plan.plan_sha256,status:await inspectV1ToV2Migration(filesystem,plan),plan:migrationPlanOutput(plan,parsed.flags.has("verbose"))},json2)}return EXIT.success}throw new UsageError("migrate requires plan, apply --plan-hash HASH, status --migration ID, or rollback --migration ID")}if(area==="upgrade"){if(parsed.flags.has("rollback")){await rollbackDistribution(root);output({rolledBack:true},json2);return EXIT.success}const source=parsed.options.from;if(source===void 0)throw new UsageError("upgrade requires --from PATH or --rollback");output(await upgradeDistribution(root,source,parsed.flags.has("dry-run")),json2);return EXIT.success}return null}import{dirname as dirname6}from"node:path";async function persistEvalReportV2(filesystem,layout,report,shortName,parsed){const scope=decisionV2ScopeOption(parsed);if(scope===void 0){throw new UsageError("V2 eval persistence requires --change or --execution (or use --no-write)")}const ownerPath=layout.activePath(scope.type,scope.id);if(!await filesystem.exists(ownerPath)){throw new UsageError(`${scope.type} not found for eval evidence: ${scope.id}`)}const id=createId("EVAL",shortName,{timeZone:layout.project.timezone});const path=`${dirname6(ownerPath)}/artifacts/evals/${id}.json`;await filesystem.writeTextExclusive(path,`${JSON.stringify({schema_version:2,id,generated_at:new Date().toISOString(),report},null,2)}
|
|
1254
|
-
`);return{id,path}}function resolveExecutionRuntime(config2,limits={plan:1,provider:1,squad:1}){if(config2.execution?.runtime!=="autonomous")return{runtime:"manual"};const autonomous=config2.execution.autonomous;const effectiveParallelism=Math.min(autonomous.max_parallelism,positiveLimit(limits.plan,"plan"),positiveLimit(limits.provider,"provider"),positiveLimit(limits.squad,"squad"));return{runtime:"autonomous",provider:autonomous.provider,model:autonomous.model,lease_ms:autonomous.lease_ms,effective_parallelism:effectiveParallelism}}function positiveLimit(value,label){if(!Number.isInteger(value)||value<1){throw new TypeError(`${label} parallelism must be a positive integer`)}return value}async function runAutonomousExecutionCommand(executionId,parsed,composition,driver,agentCatalog){const config2=composition.layout.projectConfig;if(config2===null)throw new UsageError("Autonomous execution requires project.yaml");const{execution}=await composition.executions.read(executionId);const configured=resolveExecutionRuntime(config2);if(configured.runtime==="manual"||parsed.flags.has("materialize-only")){return{mode:"manual",status:"materialized",execution,side_effects:false,artifact_path:composition.executions.path?.(executionId)}}if(driver===void 0){throw new UsageError("Autonomous provider protocol is not qualified; keep execution.runtime manual until clean-room qualification")}const capabilities=await driver.capabilities();if(capabilities.provider!==configured.provider){throw new UsageError(`Configured provider ${configured.provider} does not match runtime ${capabilities.provider}`)}if(!capabilities.models.includes(configured.model)){throw new UsageError(`Configured model is not supported by runtime: ${configured.model}`)}const input=await buildAutonomousExecutionInput(composition,execution,{providerParallelism:capabilities.max_parallel_invocations},agentCatalog);return driver.execute(input)}async function buildAutonomousExecutionInput(composition,execution,limits,agentCatalog){const config2=composition.layout.projectConfig;if(config2===null)throw new UsageError("Autonomous execution requires project.yaml");const runtime=resolveExecutionRuntime(config2,{plan:execution.policy.max_parallelism,provider:limits.providerParallelism,squad:execution.policy.max_parallelism});if(runtime.runtime!=="autonomous")throw new UsageError("Autonomous runtime is not enabled");const tasks=await Promise.all(execution.dag.topological_order.map(async taskId=>{const{task}=await composition.tasks.read(taskId);return{id:task.id,change_id:task.change_id,risk:task.risk,priority:priorityNumber(task.priority),depends_on:[...task.depends_on],acceptance_ids:[...task.acceptance_ids],write_scopes:[...task.write_scopes]}}));if(execution.origin.type==="interaction"){throw new Error(`Interaction Execution ${execution.id} cannot use the delivery runtime`)}return{mode:"autonomous",execution_id:execution.id,source:execution.origin.type,created_at:execution.created_at,policy:{max_parallelism:runtime.effective_parallelism,max_operational_retries:execution.policy.max_operational_retries,max_repair_cycles_per_task:Math.min(3,execution.policy.max_repair_cycles_per_task),soft_cycles:execution.policy.soft_model_cycle_budget??24,soft_input_tokens:execution.policy.soft_input_token_budget??4e6,...isAutomaticModelSource(execution,config2.model_orchestration)?{model_orchestration:config2.model_orchestration}:{}},agents:autonomousAgents(runtime.provider,runtime.model,agentCatalog),tasks}}function isAutomaticModelSource(execution,config2){return config2?.mode==="auto"&&config2.automatic_sources.some(source=>source===execution.origin.type)}function autonomousAgents(provider,model,catalog){if(catalog===void 0){return{builder:{id:`${provider}-builder`,model},verifier:{id:`${provider}-verifier`,model,tools:[]}}}const builder=selectAgent(catalog,{role:"orchestrator",capability:"dag-orchestration"}).agent;const verifier=selectAgent(catalog,{role:"reviewer",capability:"independent-review"}).agent;return{builder:{id:builder.id,model,tools:builder.tools},verifier:{id:verifier.id,model,tools:verifier.tools}}}function priorityNumber(priority2){return{low:1,medium:2,high:3,urgent:4}[priority2]}import{execFile as execFile4}from"node:child_process";import{posix as posix3}from"node:path";import{promisify as promisify4}from"node:util";var LifecycleGateError=class extends Error{name="LifecycleGateError"};function taskAssurancePreflightResult(evidenceIds){return{summary:"Typed assurance preflight",changed_files:[],evidence_ids:[...evidenceIds],completed_run_id:null}}async function assertTaskAssurancePreflightV1(input){const bundle=await readAssuranceBundle(input.filesystem,input.layout,[input.task],input.evidence_ids);assertTaskAssuranceV1({config:input.config,risk:input.task.risk,write_scopes:input.task.write_scopes,acceptance_ids:input.task.acceptance_ids,validations:bundle.validations,evidences:bundle.evidences,verifier:null,mutation:mutationFrom(bundle.metadata,input.task.id),rollback_evidence_id:bundle.evidences.find(evidence=>evidence.id.includes("ROLLBACK"))?.id??null,expected_commit_sha:null})}function assertHostAssuranceV1(assessment){if(assessment.valid)return;throw new LifecycleGateError(`Host assurance ${assessment.status}: ${assessment.findings.map(finding2=>`${finding2.code}:${finding2.subject}`).join("; ")}`)}function assertTaskAssuranceV1(input){const standardDepth=input.config.standard_depth==="auto"?input.write_scopes.length>1?"elevated":"base":input.config.standard_depth;const contract=resolveTaskAssuranceContract({risk:input.risk,standard_depth:standardDepth});const assessment=assessTaskAssurance({...input,contract:input.config.require_final_commit?contract:{...contract,requires_final_commit_evidence:false}});assertAssessment(`Task ${contract.profile}`,assessment);if(input.host_assurance!==void 0)assertHostAssuranceV1(input.host_assurance)}function assertDeliveryAssuranceV1(input){if(input.acceptance_ids.length===0){throw new LifecycleGateError(`${input.origin.toUpperCase()} assurance requires an AC matrix`)}if(input.origin==="prd"&&input.outcome_ids.length===0){throw new LifecycleGateError("PRD assurance requires outcome Evidence ids")}const contract=resolveDeliveryAssuranceContract(input.origin);const assessment=assessDeliveryAssurance({...input,contract:input.config.require_final_commit?contract:{...contract,requires_final_commit_evidence:false}});assertAssessment(`${input.origin.toUpperCase()} delivery`,assessment)}async function readAssuranceBundle(filesystem,layout,tasks,selectedEvidenceIds){const taskIds=new Set(tasks.map(task=>task.id));const evidenceIds=selectedEvidenceIds===void 0?null:new Set(selectedEvidenceIds);const directories=[...new Set(tasks.map(task=>posix3.dirname(layout.activePath("change",task.change_id))))];const validations=[];const evidences=[];const metadata=[];for(const directory of directories){const verificationPaths=(await Promise.all(["tests","evals","checks"].map(kind=>filesystem.listFiles(`${directory}/artifacts/${kind}`)))).flat();for(const path of verificationPaths){const source=await filesystem.readText(path);const raw=frontmatterMetadata(source);if(raw!==null)metadata.push(raw);try{const artifact=parseMarkdown(source,validationArtifactV2Schema).metadata;if(taskIds.has(artifact.task_id))validations.push(artifact)}catch{}}for(const path of await filesystem.listFiles(`${directory}/artifacts/evidence`)){try{const artifact=parseMarkdown(await filesystem.readText(path),evidenceArtifactV2Schema).metadata;if(taskIds.has(artifact.task_id)&&(evidenceIds===null||evidenceIds.has(artifact.id))){evidences.push(artifact)}}catch{}}}return{validations:uniqueById(validations),evidences:uniqueById(evidences),metadata}}function mutationFrom(metadata,taskId){const item=metadata.find(value=>value.kind==="mutation_discrimination"&&value.task_id===taskId);if(item===void 0||!Array.isArray(item.acceptance_ids))return null;if(item.baseline_passed!==true||typeof item.total_mutants!=="number"||typeof item.killed_mutants!=="number"||typeof item.kill_ratio!=="number"||!item.acceptance_ids.every(value=>typeof value==="string")){return null}return{baseline_passed:true,total_mutants:item.total_mutants,killed_mutants:item.killed_mutants,kill_ratio:item.kill_ratio,acceptance_ids:item.acceptance_ids}}function verifierFrom(validations,authorId,authorRunId){const review=validations.find(item=>isReviewKind(item.kind)&&item.status==="passed"&&item.author_id!==authorId&&item.run_id!==authorRunId);return review===void 0?null:{author_id:authorId,reviewer_id:review.author_id,status:"approved"}}function isReviewKind(kind){return kind==="review"||kind==="spec_review"||kind==="quality_review"}var execFileAsync4=promisify4(execFile4);async function resolveFinalProductCandidate(root,validations,evidences){const commits=[...new Set([...validations,...evidences].map(artifact=>artifact.commit_sha).filter(value=>value!==null))];const candidates=[];for(const commit of commits){if(await isFinalProductCandidate(root,commit))candidates.push(commit)}return candidates.length===1?candidates[0]??null:null}async function isFinalProductCandidate(root,commit){try{await execFileAsync4("git",["cat-file","-e",`${commit}^{commit}`],{cwd:root,encoding:"utf8",windowsHide:true});await execFileAsync4("git",["merge-base","--is-ancestor",commit,"HEAD"],{cwd:root,encoding:"utf8",windowsHide:true});const outputs=await Promise.all([execFileAsync4("git",["diff","--name-only","-z",`${commit}..HEAD`],{cwd:root,encoding:"utf8",windowsHide:true}),execFileAsync4("git",["diff","--name-only","-z"],{cwd:root,encoding:"utf8",windowsHide:true}),execFileAsync4("git",["diff","--cached","--name-only","-z"],{cwd:root,encoding:"utf8",windowsHide:true}),execFileAsync4("git",["ls-files","--others","--exclude-standard","-z"],{cwd:root,encoding:"utf8",windowsHide:true})]);const paths=outputs.flatMap(({stdout})=>splitZero(stdout));return paths.every(isAssuranceOnlyPath)}catch{return false}}function isAssuranceOnlyPath(path){return/^\.agents\/records\/.+\/artifacts\/(?:tests|evals|checks|evidence)\/.+/.test(path)}function splitZero(value){return value.split("\0").filter(Boolean).map(path=>path.replaceAll("\\","/"))}function assertAssessment(label,assessment){if(assessment.valid)return;throw new LifecycleGateError(`${label} assurance failed: ${assessment.findings.map(finding2=>`${finding2.code}: ${finding2.message}`).join("; ")}`)}function frontmatterMetadata(source){const normalized=source.replace(/^\uFEFF/,"").replace(/\r\n/g,"\n");if(!normalized.startsWith("---\n"))return null;const end=normalized.indexOf("\n---\n",4);if(end===-1)return null;try{const metadata=parseYaml(normalized.slice(4,end));return isRecord(metadata)?metadata:null}catch{return null}}function uniqueById(items){return[...new Map(items.map(item=>[item.id,item])).values()]}function isRecord(value){return value!==null&&typeof value==="object"&&!Array.isArray(value)}var LifecycleAutonomousValidationPort=class{async validate(input){const filesystem=new WorkspaceFileSystem(input.worktree_path);const layout=await loadWorkspaceLayout(filesystem);const task=(await new TaskV2Repository(filesystem,layout).read(input.task.id)).task;const bundle=await readAssuranceBundle(filesystem,layout,[task]);const validations=bundle.validations.filter(artifact=>artifact.task_id===task.id&&artifact.status==="passed");const evidences=bundle.evidences.filter(artifact=>artifact.task_id===task.id&&artifact.status==="passed");const author=validations.find(artifact=>artifact.kind!=="review"&&artifact.kind!=="spec_review"&&artifact.kind!=="quality_review")??validations[0];const commit=await resolveFinalProductCandidate(input.worktree_path,validations,evidences);const contract=resolveTaskAssuranceContract({risk:task.risk,standard_depth:task.write_scopes.length>1?"elevated":"base"});const assessment=assessTaskAssurance({contract,acceptance_ids:task.acceptance_ids,validations,evidences,verifier:author===void 0?null:verifierFrom(validations,author.author_id,author.run_id),mutation:mutationFrom(bundle.metadata,task.id),rollback_evidence_id:evidences.find(evidence=>evidence.id.includes("ROLLBACK"))?.id??null,expected_commit_sha:commit});if(!assessment.valid){throw new Error(`${task.id} typed assurance failed: ${assessment.findings.map(finding2=>`${finding2.code}: ${finding2.message}`).join("; ")}`)}return{validation_ids:validations.map(artifact=>artifact.id),evidence:evidences.map(artifact=>({id:artifact.id,acceptance_ids:artifact.acceptance_ids}))}}};import{execFile as execFile5}from"node:child_process";import{createHash as createHash12}from"node:crypto";import{mkdir as mkdir4,realpath as realpath4,rm as rm5,stat as stat2}from"node:fs/promises";import{isAbsolute as isAbsolute4,relative as relative5,resolve as resolve8}from"node:path";import{promisify as promisify5}from"node:util";var execFileAsync5=promisify5(execFile5);var GitAutonomousWorktreePort=class{#root;#basePath;constructor(root,basePath=".zaip-aios/local-data/worktrees"){this.#root=resolve8(root);this.#basePath=resolve8(this.#root,basePath);assertWithin(this.#root,this.#basePath,"worktree base")}async prepareHandoff(input){const path=this.#handoffPath(input.execution_id);const branch=handoffBranchName(input.execution_id);if(await exists2(path)){await this.#assertRegistered(path)}else{await mkdir4(resolve8(path,".."),{recursive:true});try{await this.#git(["worktree","add","-b",branch,path,"HEAD"])}catch(error51){await rm5(path,{recursive:true,force:true});throw error51}}const commit=(await this.#git(["rev-parse","HEAD"],path)).stdout.trim();return{path,branch,commit}}async prepare(input){const path=this.#taskPath(input.execution_id,input.task_id);const branch=branchName(input.execution_id,input.task_id);if(await exists2(path)){await this.#assertRegistered(path);return{path}}await mkdir4(resolve8(path,".."),{recursive:true});try{await this.#git(["worktree","add","-b",branch,path,input.base_branch??"HEAD"])}catch(error51){await rm5(path,{recursive:true,force:true});throw error51}return{path}}async integrate(input){const path=await this.#checkedTaskPath(input);const integrationPath=input.handoff_worktree_path===void 0?this.#root:await this.#checkedHandoffPath(input.execution_id,input.handoff_worktree_path);if(integrationPath===this.#root&&await this.#isRootDirty()){return{status:"conflict",conflicts:["repository root is dirty; integration blocked"]}}const worktreeStatus=(await this.#git(["status","--porcelain"],path)).stdout.trim();if(worktreeStatus!==""){throw new Error(`${input.task_id} worktree must contain a final commit before integration`)}const branch=branchName(input.execution_id,input.task_id);const base=(await this.#git(["merge-base","HEAD",branch],integrationPath)).stdout.trim();const changed=splitZero2((await this.#git(["diff","--name-only","-z",`${base}..${branch}`])).stdout);if(changed.length===0)throw new Error(`${input.task_id} has no committed changes`);const outside=changed.filter(candidate=>!input.write_scopes.some(scope=>workspaceScopeMatches(scope,candidate)));if(outside.length>0){throw new Error(`${input.task_id} committed files outside write scopes: ${outside.join(", ")}`)}try{await this.#git(["merge","--no-ff","--no-edit",branch],integrationPath)}catch(error51){const conflicts=splitZero2((await this.#git(["diff","--name-only","--diff-filter=U","-z"],integrationPath)).stdout);await this.#git(["merge","--abort"],integrationPath).catch(()=>void 0);if(conflicts.length>0)return{status:"conflict",conflicts};throw error51}const commit=(await this.#git(["rev-parse","HEAD"],integrationPath)).stdout.trim();return{status:"integrated",commit}}async cleanup(input){const path=await this.#checkedTaskPath(input);await this.#git(["worktree","remove",path]);await this.#git(["branch","-d",branchName(input.execution_id,input.task_id)])}async#checkedTaskPath(input){const expected=this.#taskPath(input.execution_id,input.task_id);const actual=await realpath4(input.worktree_path);if(actual!==await realpath4(expected)){throw new Error(`Autonomous worktree path mismatch for ${input.task_id}`)}assertWithin(this.#basePath,actual,"worktree");await this.#assertRegistered(actual);return actual}#taskPath(executionId,taskId){const path=resolve8(this.#basePath,safeSegment2(executionId),safeSegment2(taskId));assertWithin(this.#basePath,path,"worktree");return path}#handoffPath(executionId){const path=resolve8(this.#basePath,safeSegment2(executionId),"handoff");assertWithin(this.#basePath,path,"handoff worktree");return path}async#checkedHandoffPath(executionId,handoffPath){const expected=this.#handoffPath(executionId);const actual=await realpath4(handoffPath);if(actual!==await realpath4(expected)){throw new Error(`Autonomous handoff worktree path mismatch for ${executionId}`)}assertWithin(this.#basePath,actual,"handoff worktree");await this.#assertRegistered(actual);return actual}async#isRootDirty(){const status=(await this.#git(["status","--porcelain"])).stdout.trim();return status!==""}async#assertRegistered(path){const common=(await this.#git(["rev-parse","--git-common-dir"],path)).stdout.trim();if(common==="")throw new Error(`Path is not a registered Git worktree: ${path}`)}#git(arguments_,cwd=this.#root){return execFileAsync5("git",[...arguments_],{cwd,encoding:"utf8",windowsHide:true,maxBuffer:10*1024*1024})}};function branchName(executionId,taskId){const slug2=`${executionId}-${taskId}`.toLowerCase().replace(/[^a-z0-9-]+/g,"-").replace(/^-|-$/g,"").slice(0,72);const hash2=createHash12("sha256").update(`${executionId}:${taskId}`).digest("hex").slice(0,10);return`codex/zaip-auto-${slug2}-${hash2}`}function handoffBranchName(executionId){const slug2=executionId.toLowerCase().replace(/[^a-z0-9-]+/g,"-").replace(/^-|-$/g,"").slice(0,72);const hash2=createHash12("sha256").update(executionId).digest("hex").slice(0,10);return`codex/zaip-auto-handoff-${slug2}-${hash2}`}function safeSegment2(value){const result2=value.replace(/[^A-Za-z0-9._-]/g,"-");if(result2.length===0||result2==="."||result2==="..")throw new Error("Invalid id");return result2}function workspaceScopeMatches(scope,path){const normalizedScope=scope.replaceAll("\\","/").replace(/\/+$/,"");const normalizedPath=path.replaceAll("\\","/");if(!normalizedScope.includes("*")){return normalizedPath===normalizedScope||normalizedPath.startsWith(`${normalizedScope}/`)}const pattern=normalizedScope.split("**").map(part=>part.replace(/[.+^${}()|[\]\\]/g,"\\$&").replace(/\*/g,"[^/]*")).join(".*");return new RegExp(`^${pattern}$`).test(normalizedPath)}function assertWithin(root,candidate,label){const path=relative5(root,candidate);if(path===""||!isAbsolute4(path)&&path!==".."&&!path.startsWith(`..\\`)&&!path.startsWith("../"))return;throw new Error(`Autonomous ${label} escapes its allowed root`)}function splitZero2(value){return value.split("\0").filter(Boolean).map(path=>path.replaceAll("\\","/")).sort()}async function exists2(path){try{await stat2(path);return true}catch(error51){if(error51 instanceof Error&&"code"in error51&&error51.code==="ENOENT")return false;throw error51}}function createAutonomousProductionDriver(filesystem,config2){const resolved=resolveExecutionRuntime(config2);if(resolved.runtime!=="autonomous"){throw new Error("Production autonomous driver requires execution.runtime autonomous")}const runtime=providerRuntime(filesystem.root,resolved.provider,config2.model_orchestration?.mode==="auto"?[...config2.model_orchestration.allowed_models]:[resolved.model],safeRuntimeEnvironment(process.env));const coordinator=new AutonomousExecutionCoordinator({state:new FileAutonomousStatePort(filesystem),checkpoints:new FileAutonomousCheckpointPort(filesystem),runtime,worktrees:new GitAutonomousWorktreePort(filesystem.root),validation:new LifecycleAutonomousValidationPort});return new ProductionDriver(runtime,coordinator)}var ProductionDriver=class{constructor(runtime,coordinator){this.runtime=runtime;this.coordinator=coordinator}runtime;coordinator;capabilities(){return this.runtime.capabilities()}execute(input){return this.coordinator.execute(input)}};function providerRuntime(root,provider,models,environment){const command=provider;const factory=new NodeRuntimeProcessFactory({allowedCommands:[command],allowedWorkingRoots:[root],allowedEnvironmentKeys:[],baseEnvironment:environment,maxLineBytes:2*1024*1024,maxStderrBytes:128*1024});const processOptions={environment:{},workingDirectory:invocation=>{const path=invocation.metadata.worktree_path;if(path===void 0||path.length===0){throw new Error("Autonomous invocation is missing its worktree path")}return path}};return provider==="codex"?codexRuntime(factory,command,models,processOptions):claudeRuntime(factory,command,models,processOptions)}function safeRuntimeEnvironment(source){const allowed=["PATH","Path","SystemRoot","WINDIR","HOME","USERPROFILE","TEMP","TMP"];return Object.fromEntries(allowed.flatMap(key=>source[key]===void 0?[]:[[key,source[key]]]))}async function runExecutionV2Command(action,parsed,composition,lifecycle,runAutonomous){if(action==="list"){const executions=(await composition.executions.list()).filter(execution=>(parsed.options.prd===void 0||execution.origin.type==="prd"&&execution.origin.prd_id===parsed.options.prd)&&(parsed.options.spec===void 0||execution.origin.type==="spec"&&execution.origin.spec_id===parsed.options.spec)&&(parsed.options.task===void 0||execution.dag.nodes.some(node=>node.task_id===parsed.options.task)));return listLifecyclePage(executions,parsed).map(execution=>({execution,artifact_path:composition.executions.path(execution.id)}))}const id=requiredEntityId(parsed,2,"Execution id");if(action==="show"){return{...await composition.executions.read(id),artifact_path:composition.executions.path(id)}}if(action==="run")return runAutonomous(id,parsed);if(action==="verify"){const execution=await lifecycle.verifyExecution(id);return{execution,artifact_path:composition.executions.path(id)}}if(action==="complete"){requireOptions(parsed.options,["result"]);const execution=await lifecycle.completeExecution(id,parsed.options.result);return{execution,artifact_path:composition.executions.path(id)}}if(["start","resume","pause","block","fail","cancel"].includes(action??"")){if(action==="fail"||action==="cancel")requireOptions(parsed.options,["result"]);const statuses={start:"running",resume:"running",pause:"paused",block:"blocked",fail:"failed",cancel:"cancelled"};const execution=await composition.executions.transition(id,statuses[action],action==="fail"||action==="cancel"?parsed.options.result:null);return{execution,artifact_path:composition.executions.path(id)}}throw new UsageError(`Unknown V2 Execution action: ${action??""}`)}async function runChangeV2Command(action,parsed,composition,lifecycle){if(action==="list"){const changes=(await composition.changes.list()).filter(change=>(parsed.options.prd===void 0||change.source.type==="prd"&&change.source.prd_id===parsed.options.prd)&&(parsed.options.spec===void 0||change.source.type==="spec"&&change.source.spec_id===parsed.options.spec||change.source.type==="prd"&&change.source.spec_id===parsed.options.spec));return listLifecyclePage(changes,parsed).map(change=>({change,artifact_path:composition.changes.path(change.id)}))}const id=requiredEntityId(parsed,2,"Change id");if(action==="show"){return{...await composition.changes.read(id),artifact_path:composition.changes.path(id)}}if(action==="verify"){const change=await lifecycle.verifyChange(id);return{change,artifact_path:composition.changes.path(id)}}if(action==="complete"){requireOptions(parsed.options,["result"]);const change=await lifecycle.completeChange(id,parsed.options.result);return{change,artifact_path:composition.changes.path(id)}}if(["start","resume","block","fail","cancel"].includes(action??"")){if(action==="fail"||action==="cancel")requireOptions(parsed.options,["result"]);const statuses={start:"executing",resume:"executing",block:"blocked",fail:"failed",cancel:"cancelled"};const change=await composition.changes.transition(id,statuses[action],action==="fail"||action==="cancel"?parsed.options.result:null);return{change,artifact_path:composition.changes.path(id)}}throw new UsageError(`Unknown V2 Change action: ${action??""}`)}async function runDecisionV2Command(action,parsed,filesystem,composition){const scope=decisionV2ScopeOption(parsed);if(action==="list"){const decisions=await composition.decisions.list(scope);return decisions.map(decision=>({decision,artifact_path:composition.decisions.path(decision.scope_type,decision.scope_id,decision.id)}))}if(action==="show"){if(scope===void 0)throw new UsageError("decision show requires --change or --execution");const id=requiredEntityId(parsed,2,"Decision id");return{decision:await composition.decisions.read(scope.type,scope.id,id),artifact_path:composition.decisions.path(scope.type,scope.id,id)}}if(action==="record"){if(scope===void 0)throw new UsageError("decision record requires --change or --execution");if(!await filesystem.exists(composition.layout.activePath(scope.type,scope.id))){throw new UsageError(`Decision owner does not resolve: ${scope.type} ${scope.id}`)}requireOptions(parsed.options,["origin","title","short-name","category","context","decision","reason"]);const origin=originOption(parsed.options.origin);const decision=await composition.decisions.record({...parsed.options.id===void 0?{}:{id:parsed.options.id},shortName:parsed.options["short-name"],title:parsed.options.title,scopeType:scope.type,scopeId:scope.id,origin,category:categoryV2Option(parsed.options.category),context:parsed.options.context,decision:parsed.options.decision,reason:parsed.options.reason,alternatives:csvOption(parsed.options.alternatives),consequences:csvOption(parsed.options.consequences),reversible:parsed.flags.has("reversible"),rollback:parsed.options.rollback??"Not applicable.",confidence:origin==="agent"?confidenceOption(parsed.options.confidence):null,confirmed:origin==="human"&&parsed.flags.has("confirmed"),timeZone:composition.layout.project.timezone});return{decision,artifact_path:composition.decisions.path(scope.type,scope.id,decision.id)}}throw new UsageError(`Unknown V2 Decision action: ${action??""}`)}import{posix as posix4}from"node:path";function changedFilesOutsideTaskScopes(writeScopes,changedFiles){if(writeScopes.length===0)return[];return changedFiles.filter(path=>!writeScopes.some(scope=>workspaceScopeMatches2(scope,path)))}function containsIdentifier(content,identifier){const escaped=identifier.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return new RegExp(`(?:^|[^A-Z0-9-])${escaped}(?:$|[^A-Z0-9-])`,"m").test(content)}function containsIsoTimestamp(content){return/\b\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})\b/.test(content)}function assertRiskScaledArtifactCounts(taskId,risk2,verificationCount,evidenceCount){if(risk2!=="lite")return;if(verificationCount!==1)throw new LifecycleGateError(`Lite Task ${taskId} requires exactly one verification artifact; found ${verificationCount}`);if(evidenceCount!==1)throw new LifecycleGateError(`Lite Task ${taskId} requires exactly one Evidence; found ${evidenceCount}`)}function workspaceScopeMatches2(scope,path){const normalizedScope=scope.replaceAll("\\","/").replace(/\/+$/,"");const normalizedPath=path.replaceAll("\\","/");if(!normalizedScope.includes("*"))return normalizedPath===normalizedScope||normalizedPath.startsWith(`${normalizedScope}/`);const pattern=normalizedScope.split("**").map(segment=>segment.replace(/[.+^${}()|[\]\\]/g,"\\$&").replace(/\*/g,"[^/]*")).join(".*");return new RegExp(`^${pattern}$`).test(normalizedPath)}function formatLifecycleState(entity){return`${entity.id} (${entity.status})`}function isTerminalLifecycleStatus(status){return new Set(["completed","failed","cancelled"]).has(status)}async function activateTaskMacroParents(change,repositories){const specId=change.source.type==="task"?null:change.source.spec_id;const prdId=change.source.type==="prd"?change.source.prd_id:null;if(specId!==null){const{spec}=await repositories.specs.read(specId);if(spec.status==="ready"||spec.status==="blocked"){await repositories.specs.transition(spec.id,"active")}else if(spec.status!=="active"){throw new LifecycleGateError(`SPEC ${spec.id} must be ready, active, or blocked before Task start`)}}if(prdId!==null){const{prd}=await repositories.prds.read(prdId);if(prd.status==="ready"||prd.status==="blocked"){await repositories.prds.transition(prd.id,"active")}else if(prd.status!=="active"){throw new LifecycleGateError(`PRD ${prd.id} must be ready, active, or blocked before Task start`)}}}var LifecycleV2Gate=class{constructor(filesystem,layout,repositories){this.filesystem=filesystem;this.layout=layout;this.repositories=repositories;if(layout.version===1)throw new TypeError("LifecycleV2Gate requires a modern layout")}filesystem;layout;repositories;async completeTask(id,result2){const{task}=await this.repositories.tasks.read(id);if(task.status!=="verifying"){throw new LifecycleGateError(`Task ${id} must be verifying before completion`)}try{return await this.completeVerifyingTask(task,result2)}catch(error51){if(error51 instanceof LifecycleGateError){await this.repositories.tasks.transition(id,"executing")}throw error51}}async verifyTask(id,evidenceIds){const{task}=await this.repositories.tasks.read(id);if(task.status!=="executing"&&task.status!=="verifying"){throw new LifecycleGateError(`Task ${id} must be executing or verifying before verification`)}const execution=await this.executionForTask(task.id,task.change_id);const result2=taskAssurancePreflightResult(evidenceIds);await this.assertEvidenceCoverage(task,result2);const assurance=this.assuranceConfig();await this.assertSixStageCoverage(task,result2,execution.id,assurance===null);if(assurance!==null){await assertTaskAssurancePreflightV1({filesystem:this.filesystem,layout:this.layout,task,evidence_ids:result2.evidence_ids,config:assurance})}return task.status==="verifying"?task:this.repositories.tasks.transition(id,"verifying")}async completeVerifyingTask(task,result2){for(const dependencyId of task.depends_on){const{task:dependency}=await this.repositories.tasks.read(dependencyId).catch(()=>{throw new LifecycleGateError(`Task dependency does not resolve: ${dependencyId}`)});if(dependency.status!=="completed"){throw new LifecycleGateError(`Task dependency must be completed: ${dependencyId} is ${dependency.status}`)}}const{change}=await this.repositories.changes.read(task.change_id);if(!change.task_ids.includes(task.id)){throw new LifecycleGateError(`Change ${change.id} does not own Task ${task.id}`)}if(!new Set(["executing","verifying"]).has(change.status)){throw new LifecycleGateError(`Change ${change.id} is not executing or verifying`)}const execution=await this.executionForTask(task.id,task.change_id);if(!new Set(["running","verifying"]).has(execution.status)){throw new LifecycleGateError(`Execution ${execution.id} is not running or verifying`)}if(result2.completed_run_id===null){throw new LifecycleGateError(`Completed Task ${task.id} requires a completed Run`)}const run=await this.readRequiredRun(result2.completed_run_id);this.assertCompletedRunAttribution(run,task,execution.id);await this.assertEvidenceCoverage(task,result2);const assurance=this.assuranceConfig();await this.assertSixStageCoverage(task,result2,execution.id,assurance===null);if(assurance!==null){const bundle=await readAssuranceBundle(this.filesystem,this.layout,[task],result2.evidence_ids);const expectedCommit=assurance.require_final_commit?await resolveFinalProductCandidate(this.filesystem.root,bundle.validations,bundle.evidences):null;assertTaskAssuranceV1({config:assurance,risk:task.risk,write_scopes:task.write_scopes,acceptance_ids:task.acceptance_ids,validations:bundle.validations,evidences:bundle.evidences,verifier:verifierFrom(bundle.validations,run.run.agent,run.run.run_id),mutation:mutationFrom(bundle.metadata,task.id),rollback_evidence_id:bundle.evidences.find(evidence=>evidence.id.includes("ROLLBACK"))?.id??null,expected_commit_sha:expectedCommit})}this.assertChangedFilesInScope(task,result2.changed_files);return this.repositories.tasks.transition(task.id,"completed",result2)}async startTask(id,mode="start"){const{task}=await this.repositories.tasks.read(id);const expected=mode==="resume"?"blocked":mode==="rework"?"failed":"planned";if(task.status!==expected){throw new LifecycleGateError(`Task ${id} must be ${expected} before ${mode}`)}for(const dependencyId of task.depends_on){const dependency=await this.repositories.tasks.read(dependencyId).catch(()=>null);if(dependency===null||dependency.task.status!=="completed"){throw new LifecycleGateError(`Task dependency is not completed: ${dependencyId}`)}}let{change}=await this.repositories.changes.read(task.change_id);const execution=await this.executionForTask(task.id,task.change_id);let latestExecution=execution;if(mode!=="start"){if(change.status==="blocked"||change.status==="failed"){change=await this.repositories.changes.transition(change.id,"executing")}if(latestExecution.status==="blocked"||latestExecution.status==="failed"){latestExecution=await this.repositories.executions.transition(latestExecution.id,"running")}}if(change.status!=="executing"){throw new LifecycleGateError(`Change ${change.id} must be executing before Task start`)}if(latestExecution.status!=="running"){throw new LifecycleGateError(`Execution ${latestExecution.id} must be running before Task start`)}await activateTaskMacroParents(change,this.repositories);return this.repositories.tasks.transition(id,"executing")}async failTask(id,result2){const{task}=await this.repositories.tasks.read(id);if(!new Set(["executing","verifying"]).has(task.status)){throw new LifecycleGateError(`Task ${id} must be executing or verifying before failure`)}if(result2.completed_run_id===null){throw new LifecycleGateError(`Failed Task ${id} requires a failed Run`)}const execution=await this.executionForTask(task.id,task.change_id);const run=await this.readRequiredRun(result2.completed_run_id);if(run.finished?.status!=="failed"){throw new LifecycleGateError(`Run ${result2.completed_run_id} must be failed`)}this.assertRunAttribution(run,task,execution.id);this.assertChangedFilesInScope(task,result2.changed_files);return this.repositories.tasks.transition(id,"failed",result2)}async verifyChange(id){const{change}=await this.repositories.changes.read(id);if(change.status!=="executing"){throw new LifecycleGateError(`Change ${id} must be executing before verification`)}const tasks=await this.tasksForChange(change.id,change.task_ids);const incomplete=tasks.filter(task=>task.status!=="completed");if(incomplete.length>0){throw new LifecycleGateError(`Change ${id} has incomplete Tasks: ${incomplete.map(formatLifecycleState).join(", ")}`)}return this.repositories.changes.transition(id,"verifying")}async completeChange(id,result2){const{change}=await this.repositories.changes.read(id);if(change.status!=="verifying"){throw new LifecycleGateError(`Change ${id} must be verifying before completion`)}const tasks=await this.tasksForChange(change.id,change.task_ids);const incomplete=tasks.filter(task=>task.status!=="completed");if(incomplete.length>0){throw new LifecycleGateError(`Change ${id} has incomplete Tasks: ${incomplete.map(formatLifecycleState).join(", ")}`)}const covered=new Set(tasks.flatMap(task=>task.acceptance_ids));const missing=change.acceptance_ids.filter(acceptanceId=>!covered.has(acceptanceId));if(missing.length>0){throw new LifecycleGateError(`Change ${id} has uncovered Acceptance Criteria: ${missing.join(", ")}`)}for(const task of tasks){if(task.result===null)throw new LifecycleGateError(`Task ${task.id} has no terminal result`);await this.assertEvidenceCoverage(task,task.result)}return this.repositories.changes.transition(id,"completed",result2)}async verifyExecution(id){const{execution}=await this.repositories.executions.read(id);if(execution.status!=="running"){throw new LifecycleGateError(`Execution ${id} must be running before verification`)}await this.assertExecutionDescendantsComplete(execution.id,execution.dag.nodes);return this.repositories.executions.transition(id,"verifying")}async completeExecution(id,result2){const{execution}=await this.repositories.executions.read(id);let completedExecution;if(execution.status==="verifying"){await this.assertExecutionDescendantsComplete(execution.id,execution.dag.nodes);const changeIds=[...new Set(execution.dag.nodes.map(node=>node.change_id))];for(const changeId of changeIds){const{change}=await this.repositories.changes.read(changeId);if(change.status!=="completed"){throw new LifecycleGateError(`Execution Change must be completed: ${formatLifecycleState(change)}`)}}completedExecution=await this.repositories.executions.transition(id,"completed",result2)}else if(execution.status==="completed"){completedExecution=execution}else{throw new LifecycleGateError(`Execution ${id} must be verifying before completion`)}await this.reconcileCompletedExecutionOrigin(completedExecution);return completedExecution}async reconcileCompletedExecutionOrigin(execution){if(execution.origin.type==="prd"){const{prd}=await this.repositories.prds.read(execution.origin.prd_id);if(prd.status==="active")await this.deliverPrd(prd.id);else if(prd.status!=="delivered"){throw new LifecycleGateError(`Completed Execution ${execution.id} has non-deliverable PRD ${prd.id}: ${prd.status}`)}}else if(execution.origin.type==="spec"){const{spec}=await this.repositories.specs.read(execution.origin.spec_id);if(spec.status==="active")await this.deliverSpec(spec.id);else if(spec.status!=="delivered"){throw new LifecycleGateError(`Completed Execution ${execution.id} has non-deliverable SPEC ${spec.id}: ${spec.status}`)}}}async deliverSpec(id){const{spec}=await this.repositories.specs.read(id);if(spec.status!=="active"){throw new LifecycleGateError(`SPEC ${id} must be active before delivery`)}const[changes,executions]=await Promise.all([this.repositories.changes.list(),this.repositories.executions.list()]);const descendants=changes.filter(change=>change.source.type==="spec"&&change.source.spec_id===id||change.source.type==="prd"&&change.source.spec_id===id);const descendantChangeIds=new Set(descendants.map(change=>change.id));const relatedExecutions=executions.filter(execution=>execution.origin.type==="spec"&&execution.origin.spec_id===id||execution.dag.nodes.some(node=>descendantChangeIds.has(node.change_id)));if(descendants.length===0||relatedExecutions.length===0){throw new LifecycleGateError(`SPEC ${id} has no materialized Change and Execution`)}this.assertAllTerminal(descendants,"SPEC Change");this.assertAllTerminal(relatedExecutions,"SPEC Execution");const assurance=this.assuranceConfig();if(assurance!==null){const tasks=await this.readTasks(relatedExecutions.flatMap(item=>item.dag.nodes.map(node=>node.task_id)));await this.assertDeliveryAssurance("spec",spec.acceptance_ids,[],tasks,assurance)}return this.repositories.specs.transition(id,"delivered")}async deliverPrd(id){const{prd}=await this.repositories.prds.read(id);if(prd.status!=="active"){throw new LifecycleGateError(`PRD ${id} must be active before delivery`)}const[specs,changes,executions]=await Promise.all([this.repositories.specs.list(),this.repositories.changes.list(),this.repositories.executions.list()]);const executionId=prd.prepared_plan?.execution_id??prd.plan_ref?.execution_id;if(executionId===void 0){throw new LifecycleGateError(`PRD ${id} has no prepared plan or plan reference`)}const selectedExecution=executions.find(execution=>execution.id===executionId&&execution.origin.type==="prd"&&execution.origin.prd_id===id);if(selectedExecution===void 0){throw new LifecycleGateError(`PRD ${id} plan Execution does not resolve: ${executionId}`)}const selectedChangeIds=new Set(selectedExecution.dag.nodes.map(node=>node.change_id));const directChanges=changes.filter(change=>selectedChangeIds.has(change.id));const selectedSpecIds=prd.prepared_plan===null?new Set(directChanges.flatMap(change=>change.source.type==="prd"&&change.source.prd_id===id?[change.source.spec_id]:[])):new Set(specIdsForPrdPlanV2(prd.prepared_plan,id));const childSpecs=specs.filter(spec=>spec.prd_id===id&&selectedSpecIds.has(spec.id));const directExecutions=[selectedExecution];if(childSpecs.length===0){throw new LifecycleGateError(`PRD ${id} requires at least one SPEC`)}for(const spec of childSpecs){if(spec.status==="active")await this.deliverSpec(spec.id)}const refreshedSpecs=(await this.repositories.specs.list()).filter(spec=>spec.prd_id===id&&selectedSpecIds.has(spec.id));this.assertAllTerminal(refreshedSpecs,"PRD SPEC","delivered");this.assertAllTerminal(directChanges,"PRD Change");this.assertAllTerminal(directExecutions,"PRD Execution");const assurance=this.assuranceConfig();if(assurance!==null){const tasks=await this.readTasks(selectedExecution.dag.nodes.map(node=>node.task_id));const metadata=prd;await this.assertDeliveryAssurance("prd",metadata.acceptance_ids??refreshedSpecs.flatMap(spec=>spec.acceptance_ids),prd.outcome_ids,tasks,assurance)}return this.repositories.prds.transition(id,"delivered")}async cancelPrd(id){const{prd}=await this.repositories.prds.read(id);if(prd.status==="delivered"){throw new LifecycleGateError(`Delivered PRD ${id} cannot be cancelled`)}const specs=(await this.repositories.specs.list()).filter(spec=>spec.prd_id===id);const specIds=new Set(specs.map(spec=>spec.id));const changes=(await this.repositories.changes.list()).filter(change=>change.source.type==="prd"&&change.source.prd_id===id||change.source.type==="spec"&&specIds.has(change.source.spec_id));const cascade=await this.cancelDescendants(specs,changes,(await this.repositories.executions.list()).filter(execution=>execution.origin.type==="prd"&&execution.origin.prd_id===id||execution.origin.type==="spec"&&specIds.has(execution.origin.spec_id)),`PRD ${id}`);const cancelledPrd=prd.status==="cancelled"?prd:await this.repositories.prds.transition(id,"cancelled");return{prd:cancelledPrd,cascade}}async cancelSpec(id){const{spec}=await this.repositories.specs.read(id);if(spec.status==="delivered"){throw new LifecycleGateError(`Delivered SPEC ${id} cannot be cancelled`)}const changes=(await this.repositories.changes.list()).filter(change=>change.source.type==="spec"&&change.source.spec_id===id||change.source.type==="prd"&&change.source.spec_id===id);const cascade=await this.cancelDescendants([],changes,(await this.repositories.executions.list()).filter(execution=>execution.origin.type==="spec"&&execution.origin.spec_id===id),`SPEC ${id}`);const cancelledSpec=spec.status==="cancelled"?spec:await this.repositories.specs.transition(id,"cancelled");return{spec:cancelledSpec,cascade}}async cancelDescendants(specs,changes,originExecutions,parent){const changeIds=new Set(changes.map(change=>change.id));const allExecutions=await this.repositories.executions.list();const executions=[...new Map([...originExecutions,...allExecutions.filter(execution=>execution.dag.nodes.some(node=>changeIds.has(node.change_id)))].map(execution=>[execution.id,execution])).values()];const taskIds=new Set([...changes.flatMap(change=>change.task_ids),...executions.flatMap(execution=>execution.dag.nodes.map(node=>node.task_id))]);const tasks=(await this.repositories.tasks.list()).filter(task=>taskIds.has(task.id));const reason=`Cancelled automatically because ${parent} was cancelled.`;const cancelledTasks=await Promise.all(tasks.filter(task=>!isTerminalLifecycleStatus(task.status)).map(task=>this.repositories.tasks.transition(task.id,"cancelled",{summary:reason,changed_files:[],evidence_ids:[],completed_run_id:null})));const cancelledChanges=await Promise.all(changes.filter(change=>!isTerminalLifecycleStatus(change.status)).map(change=>this.repositories.changes.transition(change.id,"cancelled",reason)));const cancelledExecutions=await Promise.all(executions.filter(execution=>!isTerminalLifecycleStatus(execution.status)).map(execution=>this.repositories.executions.transition(execution.id,"cancelled",reason)));const cancelledSpecs=await Promise.all(specs.filter(spec=>!new Set(["delivered","cancelled"]).has(spec.status)).map(spec=>this.repositories.specs.transition(spec.id,"cancelled")));return{specs:cancelledSpecs,tasks:cancelledTasks,changes:cancelledChanges,executions:cancelledExecutions}}assuranceConfig(){const config2=this.layout.projectConfig?.assurance;return config2?.version===1?config2:null}async readTasks(ids){return Promise.all([...new Set(ids)].map(async id=>(await this.repositories.tasks.read(id)).task))}async assertDeliveryAssurance(origin,acceptanceIds,outcomeIds,tasks,config2){const bundle=await readAssuranceBundle(this.filesystem,this.layout,tasks);const expected=config2.require_final_commit?await resolveFinalProductCandidate(this.filesystem.root,bundle.validations,bundle.evidences):null;const validations=expected===null?bundle.validations:bundle.validations.filter(item=>item.commit_sha===expected);const evidences=expected===null?bundle.evidences:bundle.evidences.filter(item=>item.commit_sha===expected);const verifier=await this.deliveryVerifier(validations,tasks);assertDeliveryAssuranceV1({origin,config:config2,acceptance_ids:acceptanceIds,outcome_ids:outcomeIds,validations,evidences,verifier,expected_commit_sha:expected})}async deliveryVerifier(validations,tasks){for(const review of validations.filter(item=>isReviewKind(item.kind))){const task=tasks.find(item=>item.id===review.task_id);if(task?.result?.completed_run_id==null)continue;const run=await this.readRequiredRun(task.result.completed_run_id);const approval=verifierFrom([review],run.run.agent,run.run.run_id);if(approval!==null)return approval}return null}async tasksForChange(changeId,expectedIds){const tasks=await Promise.all(expectedIds.map(taskId=>this.repositories.tasks.read(taskId)));for(const{task}of tasks){if(task.change_id!==changeId){throw new LifecycleGateError(`Task ${task.id} does not belong to Change ${changeId}`)}}return tasks.map(({task})=>task)}async executionForTask(taskId,changeId){const executions=(await this.repositories.executions.list()).filter(execution=>execution.dag.nodes.some(node=>node.task_id===taskId&&node.change_id===changeId));if(executions.length!==1){throw new LifecycleGateError(`Task ${taskId} must resolve to exactly one Execution; found ${executions.length}`)}return executions[0]}async readRequiredRun(id){try{return await this.repositories.runs.read(id)}catch(error51){throw new LifecycleGateError(`Run ${id} does not resolve: ${error51 instanceof Error?error51.message:String(error51)}`)}}assertCompletedRunAttribution(run,task,executionId){if(run.finished?.status!=="completed"){throw new LifecycleGateError(`Run ${run.run.run_id} must be completed`)}this.assertRunAttribution(run,task,executionId)}assertRunAttribution(run,task,executionId){const mismatches=[run.run.phase==="execution"?null:"phase",run.run.execution_id===executionId?null:"execution_id",run.run.task_id===task.id?null:"task_id",run.run.change_id===task.change_id?null:"change_id"].filter(value=>value!==null);if(mismatches.length>0){throw new LifecycleGateError(`Run ${run.run.run_id} attribution mismatch: ${mismatches.join(", ")}`)}}async assertEvidenceCoverage(task,result2){if(result2.evidence_ids.length===0){throw new LifecycleGateError(`Task ${task.id} requires at least one Evidence`)}const changeDirectory=posix4.dirname(this.layout.activePath("change",task.change_id));const mainDocuments=[await this.filesystem.readText(this.layout.activePath("change",task.change_id))];const executions=(await this.repositories.executions.list()).filter(execution=>execution.dag.nodes.some(node=>node.task_id===task.id));for(const execution of executions){mainDocuments.push(await this.filesystem.readText(this.layout.activePath("execution",execution.id)))}const documents=[];for(const evidenceId of result2.evidence_ids){const path=`${changeDirectory}/artifacts/evidence/${evidenceId}.md`;const candidates=mainDocuments.filter(document=>containsIdentifier(document,evidenceId)&&containsIdentifier(document,task.id));if(await this.filesystem.exists(path)){candidates.push(`${evidenceId}
|
|
1255
|
+
`);return{id,path}}function resolveExecutionRuntime(config2,limits={plan:1,provider:1,squad:1}){if(config2.execution?.runtime!=="autonomous")return{runtime:"manual"};const autonomous=config2.execution.autonomous;const effectiveParallelism=Math.min(autonomous.max_parallelism,positiveLimit(limits.plan,"plan"),positiveLimit(limits.provider,"provider"),positiveLimit(limits.squad,"squad"));return{runtime:"autonomous",provider:autonomous.provider,model:autonomous.model,lease_ms:autonomous.lease_ms,effective_parallelism:effectiveParallelism}}function positiveLimit(value,label){if(!Number.isInteger(value)||value<1){throw new TypeError(`${label} parallelism must be a positive integer`)}return value}async function runAutonomousExecutionCommand(executionId,parsed,composition,driver,agentCatalog){const config2=composition.layout.projectConfig;if(config2===null)throw new UsageError("Autonomous execution requires project.yaml");const{execution}=await composition.executions.read(executionId);const configured=resolveExecutionRuntime(config2);if(configured.runtime==="manual"||parsed.flags.has("materialize-only")){return{mode:"manual",status:"materialized",execution,side_effects:false,artifact_path:composition.executions.path?.(executionId)}}if(driver===void 0){throw new UsageError("Autonomous provider protocol is not qualified; keep execution.runtime manual until clean-room qualification")}const capabilities=await driver.capabilities();if(capabilities.provider!==configured.provider){throw new UsageError(`Configured provider ${configured.provider} does not match runtime ${capabilities.provider}`)}if(!capabilities.models.includes(configured.model)){throw new UsageError(`Configured model is not supported by runtime: ${configured.model}`)}const input=await buildAutonomousExecutionInput(composition,execution,{providerParallelism:capabilities.max_parallel_invocations},agentCatalog);return driver.execute(input)}async function buildAutonomousExecutionInput(composition,execution,limits,agentCatalog){const config2=composition.layout.projectConfig;if(config2===null)throw new UsageError("Autonomous execution requires project.yaml");const runtime=resolveExecutionRuntime(config2,{plan:execution.policy.max_parallelism,provider:limits.providerParallelism,squad:execution.policy.max_parallelism});if(runtime.runtime!=="autonomous")throw new UsageError("Autonomous runtime is not enabled");const tasks=await Promise.all(execution.dag.topological_order.map(async taskId=>{const{task}=await composition.tasks.read(taskId);return{id:task.id,change_id:task.change_id,title:task.title,objective:task.objective,risk:task.risk,priority:priorityNumber(task.priority),depends_on:[...task.depends_on],acceptance_ids:[...task.acceptance_ids],write_scopes:[...task.write_scopes]}}));const changes=await Promise.all([...new Set(execution.dag.nodes.map(node=>node.change_id))].map(async changeId=>(await composition.changes.read(changeId)).change));const referencedSpecIds=changes.flatMap(change=>change.source.type==="spec"?[change.source.spec_id]:change.source.type==="prd"&&change.source.spec_id!==null?[change.source.spec_id]:[]);if(execution.origin.type==="interaction"){throw new Error(`Interaction Execution ${execution.id} cannot use the delivery runtime`)}return{mode:"autonomous",execution_id:execution.id,source:execution.origin.type,created_at:execution.created_at,handoff_seed_paths:[...new Set([composition.layout.activePath("execution",execution.id),...execution.dag.nodes.flatMap(node=>[composition.layout.activePath("task",node.task_id),composition.layout.activePath("change",node.change_id)]),...execution.origin.type==="prd"?[composition.layout.activePath("prd",execution.origin.prd_id)]:execution.origin.type==="spec"?[composition.layout.activePath("spec",execution.origin.spec_id)]:[],...referencedSpecIds.map(specId=>composition.layout.activePath("spec",specId))])].sort(),policy:{max_parallelism:runtime.effective_parallelism,max_operational_retries:execution.policy.max_operational_retries,max_repair_cycles_per_task:Math.min(3,execution.policy.max_repair_cycles_per_task),soft_cycles:execution.policy.soft_model_cycle_budget??24,soft_input_tokens:execution.policy.soft_input_token_budget??4e6,max_execution_ms:60*60*1e3,max_invocation_ms:10*60*1e3,max_total_invocations:Math.max(1,tasks.length*10),max_stalled_cycles:3,...isAutomaticModelSource(execution,config2.model_orchestration)?{model_orchestration:config2.model_orchestration}:{}},agents:autonomousAgents(runtime.provider,runtime.model,agentCatalog),tasks}}function isAutomaticModelSource(execution,config2){return config2?.mode==="auto"&&config2.automatic_sources.some(source=>source===execution.origin.type)}function autonomousAgents(provider,model,catalog){if(catalog===void 0){return{orchestrator:{id:`${provider}-orchestrator`,model},builder:{id:`${provider}-task-executor`,model,execution_eligibility:["delivery"]},verifier:{id:`${provider}-verifier`,model,tools:[]},finalizer:{id:`${provider}-execution-finalizer`,model}}}const orchestrator=selectAgent(catalog,{role:"orchestrator",capability:"dag-orchestration"}).agent;const builder=selectAgent(catalog,{role:"task-executor",capability:"task-delivery"}).agent;const verifier=selectAgent(catalog,{role:"reviewer",capability:"independent-review"}).agent;const finalizer=selectAgent(catalog,{role:"execution-finalizer",capability:"lifecycle-finalization"}).agent;return{orchestrator:{id:orchestrator.id,model,tools:orchestrator.tools,execution_eligibility:orchestrator.execution_eligibility},builder:{id:builder.id,model,tools:builder.tools,execution_eligibility:builder.execution_eligibility},verifier:{id:verifier.id,model,tools:verifier.tools,execution_eligibility:verifier.execution_eligibility},finalizer:{id:finalizer.id,model,tools:finalizer.tools,execution_eligibility:finalizer.execution_eligibility}}}function priorityNumber(priority2){return{low:1,medium:2,high:3,urgent:4}[priority2]}import{execFile as execFile4}from"node:child_process";import{posix as posix3}from"node:path";import{promisify as promisify4}from"node:util";var LifecycleGateError=class extends Error{name="LifecycleGateError"};function taskAssurancePreflightResult(evidenceIds){return{summary:"Typed assurance preflight",changed_files:[],evidence_ids:[...evidenceIds],completed_run_id:null}}async function assertTaskAssurancePreflightV1(input){const bundle=await readAssuranceBundle(input.filesystem,input.layout,[input.task],input.evidence_ids);assertTaskAssuranceV1({config:input.config,risk:input.task.risk,write_scopes:input.task.write_scopes,acceptance_ids:input.task.acceptance_ids,validations:bundle.validations,evidences:bundle.evidences,verifier:null,mutation:mutationFrom(bundle.metadata,input.task.id),rollback_evidence_id:bundle.evidences.find(evidence=>evidence.id.includes("ROLLBACK"))?.id??null,expected_commit_sha:null})}function assertHostAssuranceV1(assessment){if(assessment.valid)return;throw new LifecycleGateError(`Host assurance ${assessment.status}: ${assessment.findings.map(finding2=>`${finding2.code}:${finding2.subject}`).join("; ")}`)}function assertTaskAssuranceV1(input){const standardDepth=input.config.standard_depth==="auto"?input.write_scopes.length>1?"elevated":"base":input.config.standard_depth;const contract=resolveTaskAssuranceContract({risk:input.risk,standard_depth:standardDepth});const assessment=assessTaskAssurance({...input,contract:input.config.require_final_commit?contract:{...contract,requires_final_commit_evidence:false}});assertAssessment(`Task ${contract.profile}`,assessment);if(input.host_assurance!==void 0)assertHostAssuranceV1(input.host_assurance)}function assertDeliveryAssuranceV1(input){if(input.acceptance_ids.length===0){throw new LifecycleGateError(`${input.origin.toUpperCase()} assurance requires an AC matrix`)}if(input.origin==="prd"&&input.outcome_ids.length===0){throw new LifecycleGateError("PRD assurance requires outcome Evidence ids")}const contract=resolveDeliveryAssuranceContract(input.origin);const assessment=assessDeliveryAssurance({...input,contract:input.config.require_final_commit?contract:{...contract,requires_final_commit_evidence:false}});assertAssessment(`${input.origin.toUpperCase()} delivery`,assessment)}async function readAssuranceBundle(filesystem,layout,tasks,selectedEvidenceIds){const taskIds=new Set(tasks.map(task=>task.id));const evidenceIds=selectedEvidenceIds===void 0?null:new Set(selectedEvidenceIds);const directories=[...new Set(tasks.map(task=>posix3.dirname(layout.activePath("change",task.change_id))))];const validations=[];const evidences=[];const metadata=[];for(const directory of directories){const verificationPaths=(await Promise.all(["tests","evals","checks"].map(kind=>filesystem.listFiles(`${directory}/artifacts/${kind}`)))).flat();for(const path of verificationPaths){const source=await filesystem.readText(path);const raw=frontmatterMetadata(source);if(raw!==null)metadata.push(raw);try{const artifact=parseMarkdown(source,validationArtifactV2Schema).metadata;if(taskIds.has(artifact.task_id))validations.push(artifact)}catch{}}for(const path of await filesystem.listFiles(`${directory}/artifacts/evidence`)){try{const artifact=parseMarkdown(await filesystem.readText(path),evidenceArtifactV2Schema).metadata;if(taskIds.has(artifact.task_id)&&(evidenceIds===null||evidenceIds.has(artifact.id))){evidences.push(artifact)}}catch{}}}return{validations:uniqueById(validations),evidences:uniqueById(evidences),metadata}}function mutationFrom(metadata,taskId){const item=metadata.find(value=>value.kind==="mutation_discrimination"&&value.task_id===taskId);if(item===void 0||!Array.isArray(item.acceptance_ids))return null;if(item.baseline_passed!==true||typeof item.total_mutants!=="number"||typeof item.killed_mutants!=="number"||typeof item.kill_ratio!=="number"||!item.acceptance_ids.every(value=>typeof value==="string")){return null}return{baseline_passed:true,total_mutants:item.total_mutants,killed_mutants:item.killed_mutants,kill_ratio:item.kill_ratio,acceptance_ids:item.acceptance_ids}}function deliveryMutationFrom(metadata,taskIds){const mutations=[...new Set(taskIds)].map(taskId=>mutationFrom(metadata,taskId)).filter(item=>item!==null);if(mutations.length===0||mutations.some(item=>!item.baseline_passed))return null;const total_mutants=mutations.reduce((total,item)=>total+item.total_mutants,0);const killed_mutants=mutations.reduce((total,item)=>total+item.killed_mutants,0);return{baseline_passed:true,total_mutants,killed_mutants,kill_ratio:Math.min(...mutations.map(item=>item.kill_ratio)),acceptance_ids:[...new Set(mutations.flatMap(item=>item.acceptance_ids))]}}function verifierFrom(validations,authorId,authorRunId){const review=validations.find(item=>isReviewKind(item.kind)&&item.status==="passed"&&item.author_id!==authorId&&item.run_id!==authorRunId);return review===void 0?null:{author_id:authorId,reviewer_id:review.author_id,status:"approved"}}function isReviewKind(kind){return kind==="review"||kind==="spec_review"||kind==="quality_review"}var execFileAsync4=promisify4(execFile4);async function resolveFinalProductCandidate(root,validations,evidences){const commits=[...new Set([...validations,...evidences].map(artifact=>artifact.commit_sha).filter(value=>value!==null))];const candidates=[];for(const commit of commits){if(await isFinalProductCandidate(root,commit))candidates.push(commit)}return candidates.length===1?candidates[0]??null:null}async function isFinalProductCandidate(root,commit){try{await execFileAsync4("git",["cat-file","-e",`${commit}^{commit}`],{cwd:root,encoding:"utf8",windowsHide:true});await execFileAsync4("git",["merge-base","--is-ancestor",commit,"HEAD"],{cwd:root,encoding:"utf8",windowsHide:true});const outputs=await Promise.all([execFileAsync4("git",["diff","--name-only","-z",`${commit}..HEAD`],{cwd:root,encoding:"utf8",windowsHide:true}),execFileAsync4("git",["diff","--name-only","-z"],{cwd:root,encoding:"utf8",windowsHide:true}),execFileAsync4("git",["diff","--cached","--name-only","-z"],{cwd:root,encoding:"utf8",windowsHide:true}),execFileAsync4("git",["ls-files","--others","--exclude-standard","-z"],{cwd:root,encoding:"utf8",windowsHide:true})]);const paths=outputs.flatMap(({stdout})=>splitZero(stdout));return paths.every(isAssuranceOnlyPath)}catch{return false}}function isAssuranceOnlyPath(path){return/^\.agents\/records\/.+\/artifacts\/(?:tests|evals|checks|evidence)\/.+/.test(path)}function splitZero(value){return value.split("\0").filter(Boolean).map(path=>path.replaceAll("\\","/"))}function assertAssessment(label,assessment){if(assessment.valid)return;throw new LifecycleGateError(`${label} assurance failed: ${assessment.findings.map(finding2=>`${finding2.code}: ${finding2.message}`).join("; ")}`)}function frontmatterMetadata(source){const normalized=source.replace(/^\uFEFF/,"").replace(/\r\n/g,"\n");if(!normalized.startsWith("---\n"))return null;const end=normalized.indexOf("\n---\n",4);if(end===-1)return null;try{const metadata=parseYaml(normalized.slice(4,end));return isRecord(metadata)?metadata:null}catch{return null}}function uniqueById(items){return[...new Map(items.map(item=>[item.id,item])).values()]}function isRecord(value){return value!==null&&typeof value==="object"&&!Array.isArray(value)}var LifecycleAutonomousValidationPort=class{async validate(input){const filesystem=new WorkspaceFileSystem(input.worktree_path);const layout=await loadWorkspaceLayout(filesystem);const task=(await new TaskV2Repository(filesystem,layout).read(input.task.id)).task;const bundle=await readAssuranceBundle(filesystem,layout,[task]);const validations=bundle.validations.filter(artifact=>artifact.task_id===task.id&&artifact.status==="passed");const evidences=bundle.evidences.filter(artifact=>artifact.task_id===task.id&&artifact.status==="passed");const author=validations.find(artifact=>artifact.kind!=="review"&&artifact.kind!=="spec_review"&&artifact.kind!=="quality_review")??validations[0];const commit=await resolveFinalProductCandidate(input.worktree_path,validations,evidences);const contract=resolveTaskAssuranceContract({risk:task.risk,standard_depth:task.write_scopes.length>1?"elevated":"base"});const assessment=assessTaskAssurance({contract,acceptance_ids:task.acceptance_ids,validations,evidences,verifier:author===void 0?null:verifierFrom(validations,author.author_id,author.run_id),mutation:mutationFrom(bundle.metadata,task.id),rollback_evidence_id:evidences.find(evidence=>evidence.id.includes("ROLLBACK"))?.id??null,expected_commit_sha:commit});if(!assessment.valid){throw new Error(`${task.id} typed assurance failed: ${assessment.findings.map(finding2=>`${finding2.code}: ${finding2.message}`).join("; ")}`)}return{validation_ids:validations.map(artifact=>artifact.id),evidence:evidences.map(artifact=>({id:artifact.id,acceptance_ids:artifact.acceptance_ids}))}}};var AutonomousRunLifecyclePort=class{constructor(provider){this.provider=provider}provider;async startTaskRun(input){const runs=await this.runs(input.handoff_path);const existing=(await runs.list()).find(candidate=>candidate.run.execution_id===input.execution_id&&candidate.run.task_id===input.task.id&&candidate.run.parent_run_id===null&&candidate.run.run_role==="orchestrator");if(existing!==void 0)return existing.run.run_id;const writer=await runs.start({shortName:"autonomous-task",phase:"execution",runRole:"orchestrator",runPurpose:"orchestration",requiresFinalizer:true,executionKind:"delivery",executionEligibility:input.assignment.execution_eligibility??["delivery"],entrypoint:"task",workType:"new",client:this.provider,agent:agentId(input.assignment.id,"orchestrator"),agentName:agentName(input.assignment.id),provider:this.provider,model:input.assignment.model,reasoningEffort:input.assignment.reasoning_effort??null,conversationId:conversationId(input.execution_id),executionId:input.execution_id,taskId:input.task.id,changeId:input.task.change_id});return writer.started.run_id}async startInvocationSubrun(input){const runs=await this.runs(input.handoff_path);const existing=(await runs.list()).find(candidate=>candidate.run.client_turn_id===input.invocation_id);if(existing!==void 0)return existing.run.run_id;const finalizer=input.role==="finalizer";const writer=await runs.start({shortName:`autonomous-${input.role}`,phase:"execution",runRole:"subagent",runPurpose:finalizer?"finalization":input.role==="verifier"?"review":"execution",requiresFinalizer:false,executionKind:"delivery",executionEligibility:input.assignment.execution_eligibility??["delivery"],entrypoint:"task",workType:"new",client:this.provider,agent:agentId(input.assignment.id,input.role),agentName:agentName(input.assignment.id),provider:this.provider,model:input.assignment.model,reasoningEffort:input.assignment.reasoning_effort??null,clientTurnId:input.invocation_id,conversationId:conversationId(input.execution_id),executionId:input.execution_id,taskId:input.task.id,changeId:input.task.change_id,parentRunId:input.parent_run_id});return writer.started.run_id}async finishInvocationSubrun(input){await this.finish(input.handoff_path,input.run_id,input.status)}async finishTaskRun(input){const runs=await this.runs(input.handoff_path);const descendants=(await runs.list()).filter(candidate=>candidate.run.parent_run_id===input.run_id&&candidate.finished===null);if(descendants.length>0){throw new Error(`Task Run ${input.run_id} has active Sub-Runs: ${descendants.map(run=>run.run.run_id).join(", ")}`)}await this.finishWith(runs,input.run_id,input.status)}async runs(handoffPath){const filesystem=new WorkspaceFileSystem(handoffPath);const layout=await loadWorkspaceLayout(filesystem);return new RunV2Repository(filesystem,{storageMode:"tracked_sanitized",layout})}async finish(handoffPath,runId,status){await this.finishWith(await this.runs(handoffPath),runId,status)}async finishWith(runs,runId,status){const current=await runs.read(runId);if(current.finished!==null){if(current.finished.status!==status)throw new Error(`Run ${runId} already finished as ${current.finished.status}`);return}await runs.appendRecord(runFinishedV2Schema.parse({schema_version:2,event_id:eventId(runId,current.records.length+1),run_id:runId,sequence:current.records.length+1,occurred_at:new Date().toISOString(),type:"run.finished",phase:"execution",status}))}};function conversationId(executionId){return`CONV-AUTONOMOUS-${executionId.slice(5)}`}function agentId(id,role){if(role==="finalizer")return"agent-finalizer";return id.startsWith("agent-")?id:`agent-${id.replace(/^(codex|claude)-/,"")}`}function agentName(id){return id.startsWith("zaip-agent-")?id:`zaip-agent-${id.replace(/^agent-/,"")}`}import{execFile as execFile5}from"node:child_process";import{createHash as createHash12}from"node:crypto";import{cp as cp3,mkdir as mkdir4,realpath as realpath4,rm as rm5,stat as stat2}from"node:fs/promises";import{isAbsolute as isAbsolute4,relative as relative5,resolve as resolve8}from"node:path";import{promisify as promisify5}from"node:util";var execFileAsync5=promisify5(execFile5);var GitAutonomousWorktreePort=class{#root;#basePath;constructor(root,basePath=".zaip-aios/local-data/worktrees"){this.#root=resolve8(root);this.#basePath=resolve8(this.#root,basePath);assertWithin(this.#root,this.#basePath,"worktree base")}async prepareHandoff(input){const seeds=await Promise.all([...new Set(input.seed_paths)].sort().map(async seedPath=>{const source=resolveSeedPath(this.#root,seedPath);await stat2(source);return{seedPath,source}}));const path=this.#handoffPath(input.execution_id);const branch=handoffBranchName(input.execution_id);if(await exists2(path)){await this.#assertRegistered(path)}else{await mkdir4(resolve8(path,".."),{recursive:true});try{await this.#git(["worktree","add","-b",branch,path,"HEAD"])}catch(error51){await rm5(path,{recursive:true,force:true});throw error51}}for(const{seedPath,source}of seeds){const target=resolveSeedPath(path,seedPath);await mkdir4(resolve8(target,".."),{recursive:true});await cp3(source,target,{recursive:true,force:true})}if(seeds.length>0){await this.#git(["add","--",...seeds.map(seed=>seed.seedPath)],path);const staged=(await this.#git(["diff","--cached","--name-only","-z"],path)).stdout;if(staged!=="")await this.#git(["commit","-m","chore(zaip): seed autonomous execution records"],path)}const commit=(await this.#git(["rev-parse","HEAD"],path)).stdout.trim();return{path,branch,commit}}async prepare(input){const path=this.#taskPath(input.execution_id,input.task_id);const branch=branchName(input.execution_id,input.task_id);if(await exists2(path)){await this.#assertRegistered(path);return{path}}await mkdir4(resolve8(path,".."),{recursive:true});try{await this.#git(["worktree","add","-b",branch,path,input.base_branch??"HEAD"])}catch(error51){await rm5(path,{recursive:true,force:true});throw error51}return{path}}async integrate(input){const path=await this.#checkedTaskPath(input);const integrationPath=input.handoff_worktree_path===void 0?this.#root:await this.#checkedHandoffPath(input.execution_id,input.handoff_worktree_path);if(integrationPath===this.#root&&await this.#isRootDirty()){return{status:"conflict",conflicts:["repository root is dirty; integration blocked"]}}const worktreeStatus=(await this.#git(["status","--porcelain"],path)).stdout.trim();if(worktreeStatus!==""){throw new Error(`${input.task_id} worktree must contain a final commit before integration`)}const branch=branchName(input.execution_id,input.task_id);const base=(await this.#git(["merge-base","HEAD",branch],integrationPath)).stdout.trim();const changed=splitZero2((await this.#git(["diff","--name-only","-z",`${base}..${branch}`])).stdout);if(changed.length===0)throw new Error(`${input.task_id} has no committed changes`);const outside=changed.filter(candidate=>!input.write_scopes.some(scope=>workspaceScopeMatches(scope,candidate)));if(outside.length>0){throw new Error(`${input.task_id} committed files outside write scopes: ${outside.join(", ")}`)}try{await this.#git(["merge","--no-ff","--no-edit",branch],integrationPath)}catch(error51){const conflicts=splitZero2((await this.#git(["diff","--name-only","--diff-filter=U","-z"],integrationPath)).stdout);await this.#git(["merge","--abort"],integrationPath).catch(()=>void 0);if(conflicts.length>0)return{status:"conflict",conflicts};throw error51}const commit=(await this.#git(["rev-parse","HEAD"],integrationPath)).stdout.trim();return{status:"integrated",commit,changed_files:changed}}async cleanup(input){const path=await this.#checkedTaskPath(input);await this.#git(["worktree","remove",path]);await this.#git(["branch","-d",branchName(input.execution_id,input.task_id)])}async#checkedTaskPath(input){const expected=this.#taskPath(input.execution_id,input.task_id);const actual=await realpath4(input.worktree_path);if(actual!==await realpath4(expected)){throw new Error(`Autonomous worktree path mismatch for ${input.task_id}`)}assertWithin(this.#basePath,actual,"worktree");await this.#assertRegistered(actual);return actual}#taskPath(executionId,taskId){const path=resolve8(this.#basePath,safeSegment2(executionId),safeSegment2(taskId));assertWithin(this.#basePath,path,"worktree");return path}#handoffPath(executionId){const path=resolve8(this.#basePath,safeSegment2(executionId),"handoff");assertWithin(this.#basePath,path,"handoff worktree");return path}async#checkedHandoffPath(executionId,handoffPath){const expected=this.#handoffPath(executionId);const actual=await realpath4(handoffPath);if(actual!==await realpath4(expected)){throw new Error(`Autonomous handoff worktree path mismatch for ${executionId}`)}assertWithin(this.#basePath,actual,"handoff worktree");await this.#assertRegistered(actual);return actual}async#isRootDirty(){const status=(await this.#git(["status","--porcelain"])).stdout.trim();return status!==""}async#assertRegistered(path){const common=(await this.#git(["rev-parse","--git-common-dir"],path)).stdout.trim();if(common==="")throw new Error(`Path is not a registered Git worktree: ${path}`)}#git(arguments_,cwd=this.#root){return execFileAsync5("git",[...arguments_],{cwd,encoding:"utf8",windowsHide:true,maxBuffer:10*1024*1024})}};function resolveSeedPath(root,seedPath){if(seedPath.length===0||seedPath==="."||seedPath.includes("\\")||seedPath.includes("\0")||isAbsolute4(seedPath)){throw new Error(`Invalid autonomous seed path: ${seedPath}`)}const candidate=resolve8(root,seedPath);assertWithin(root,candidate,"seed path");return candidate}function branchName(executionId,taskId){const slug2=`${executionId}-${taskId}`.toLowerCase().replace(/[^a-z0-9-]+/g,"-").replace(/^-|-$/g,"").slice(0,72);const hash2=createHash12("sha256").update(`${executionId}:${taskId}`).digest("hex").slice(0,10);return`codex/zaip-auto-${slug2}-${hash2}`}function handoffBranchName(executionId){const slug2=executionId.toLowerCase().replace(/[^a-z0-9-]+/g,"-").replace(/^-|-$/g,"").slice(0,72);const hash2=createHash12("sha256").update(executionId).digest("hex").slice(0,10);return`codex/zaip-auto-handoff-${slug2}-${hash2}`}function safeSegment2(value){const result2=value.replace(/[^A-Za-z0-9._-]/g,"-");if(result2.length===0||result2==="."||result2==="..")throw new Error("Invalid id");return result2}function workspaceScopeMatches(scope,path){const normalizedScope=scope.replaceAll("\\","/").replace(/\/+$/,"");const normalizedPath=path.replaceAll("\\","/");if(!normalizedScope.includes("*")){return normalizedPath===normalizedScope||normalizedPath.startsWith(`${normalizedScope}/`)}const pattern=normalizedScope.split("**").map(part=>part.replace(/[.+^${}()|[\]\\]/g,"\\$&").replace(/\*/g,"[^/]*")).join(".*");return new RegExp(`^${pattern}$`).test(normalizedPath)}function assertWithin(root,candidate,label){const path=relative5(root,candidate);if(path===""||!isAbsolute4(path)&&path!==".."&&!path.startsWith(`..\\`)&&!path.startsWith("../"))return;throw new Error(`Autonomous ${label} escapes its allowed root`)}function splitZero2(value){return value.split("\0").filter(Boolean).map(path=>path.replaceAll("\\","/")).sort()}async function exists2(path){try{await stat2(path);return true}catch(error51){if(error51 instanceof Error&&"code"in error51&&error51.code==="ENOENT")return false;throw error51}}function createAutonomousProductionDriver(filesystem,config2){const resolved=resolveExecutionRuntime(config2);if(resolved.runtime!=="autonomous"){throw new Error("Production autonomous driver requires execution.runtime autonomous")}const runtime=providerRuntime(filesystem.root,resolved.provider,config2.model_orchestration?.mode==="auto"?[...config2.model_orchestration.allowed_models]:[resolved.model],safeRuntimeEnvironment(process.env));const coordinator=new AutonomousExecutionCoordinator({state:new FileAutonomousStatePort(filesystem),checkpoints:new FileAutonomousCheckpointPort(filesystem),runtime,worktrees:new GitAutonomousWorktreePort(filesystem.root),lifecycle:new AutonomousRunLifecyclePort(resolved.provider),validation:new LifecycleAutonomousValidationPort});return new ProductionDriver(runtime,coordinator)}var ProductionDriver=class{constructor(runtime,coordinator){this.runtime=runtime;this.coordinator=coordinator}runtime;coordinator;capabilities(){return this.runtime.capabilities()}execute(input){return this.coordinator.execute(input)}};function providerRuntime(root,provider,models,environment){const command=provider;const factory=new NodeRuntimeProcessFactory({allowedCommands:[command],allowedWorkingRoots:[root],allowedEnvironmentKeys:[],baseEnvironment:environment,maxLineBytes:2*1024*1024,maxStderrBytes:128*1024});const processOptions={environment:{},workingDirectory:invocation=>{const path=invocation.metadata.worktree_path;if(path===void 0||path.length===0){throw new Error("Autonomous invocation is missing its worktree path")}return path}};return provider==="codex"?codexRuntime(factory,command,models,processOptions):claudeRuntime(factory,command,models,processOptions)}function safeRuntimeEnvironment(source){const allowed=["PATH","Path","SystemRoot","WINDIR","HOME","USERPROFILE","TEMP","TMP"];return Object.fromEntries(allowed.flatMap(key=>source[key]===void 0?[]:[[key,source[key]]]))}async function runExecutionV2Command(action,parsed,composition,lifecycle,runAutonomous){if(action==="list"){const executions=(await composition.executions.list()).filter(execution=>(parsed.options.prd===void 0||execution.origin.type==="prd"&&execution.origin.prd_id===parsed.options.prd)&&(parsed.options.spec===void 0||execution.origin.type==="spec"&&execution.origin.spec_id===parsed.options.spec)&&(parsed.options.task===void 0||execution.dag.nodes.some(node=>node.task_id===parsed.options.task)));return listLifecyclePage(executions,parsed).map(execution=>({execution,artifact_path:composition.executions.path(execution.id)}))}const id=requiredEntityId(parsed,2,"Execution id");if(action==="show"){return{...await composition.executions.read(id),artifact_path:composition.executions.path(id)}}if(action==="run")return runAutonomous(id,parsed);if(action==="verify"){const execution=await lifecycle.verifyExecution(id);return{execution,artifact_path:composition.executions.path(id)}}if(action==="complete"){requireOptions(parsed.options,["result"]);const execution=await lifecycle.completeExecution(id,parsed.options.result);return{execution,artifact_path:composition.executions.path(id)}}if(["start","resume","pause","block","fail","cancel"].includes(action??"")){if(action==="fail"||action==="cancel")requireOptions(parsed.options,["result"]);const statuses={start:"running",resume:"running",pause:"paused",block:"blocked",fail:"failed",cancel:"cancelled"};const execution=await composition.executions.transition(id,statuses[action],action==="fail"||action==="cancel"?parsed.options.result:null);return{execution,artifact_path:composition.executions.path(id)}}throw new UsageError(`Unknown V2 Execution action: ${action??""}`)}async function runChangeV2Command(action,parsed,composition,lifecycle){if(action==="list"){const changes=(await composition.changes.list()).filter(change=>(parsed.options.prd===void 0||change.source.type==="prd"&&change.source.prd_id===parsed.options.prd)&&(parsed.options.spec===void 0||change.source.type==="spec"&&change.source.spec_id===parsed.options.spec||change.source.type==="prd"&&change.source.spec_id===parsed.options.spec));return listLifecyclePage(changes,parsed).map(change=>({change,artifact_path:composition.changes.path(change.id)}))}const id=requiredEntityId(parsed,2,"Change id");if(action==="show"){return{...await composition.changes.read(id),artifact_path:composition.changes.path(id)}}if(action==="verify"){const change=await lifecycle.verifyChange(id);return{change,artifact_path:composition.changes.path(id)}}if(action==="complete"){requireOptions(parsed.options,["result"]);const change=await lifecycle.completeChange(id,parsed.options.result);return{change,artifact_path:composition.changes.path(id)}}if(["start","resume","block","fail","cancel"].includes(action??"")){if(action==="fail"||action==="cancel")requireOptions(parsed.options,["result"]);const statuses={start:"executing",resume:"executing",block:"blocked",fail:"failed",cancel:"cancelled"};const change=await composition.changes.transition(id,statuses[action],action==="fail"||action==="cancel"?parsed.options.result:null);return{change,artifact_path:composition.changes.path(id)}}throw new UsageError(`Unknown V2 Change action: ${action??""}`)}async function runDecisionV2Command(action,parsed,filesystem,composition){const scope=decisionV2ScopeOption(parsed);if(action==="list"){const decisions=await composition.decisions.list(scope);return decisions.map(decision=>({decision,artifact_path:composition.decisions.path(decision.scope_type,decision.scope_id,decision.id)}))}if(action==="show"){if(scope===void 0)throw new UsageError("decision show requires --change or --execution");const id=requiredEntityId(parsed,2,"Decision id");return{decision:await composition.decisions.read(scope.type,scope.id,id),artifact_path:composition.decisions.path(scope.type,scope.id,id)}}if(action==="record"){if(scope===void 0)throw new UsageError("decision record requires --change or --execution");if(!await filesystem.exists(composition.layout.activePath(scope.type,scope.id))){throw new UsageError(`Decision owner does not resolve: ${scope.type} ${scope.id}`)}requireOptions(parsed.options,["origin","title","short-name","category","context","decision","reason"]);const origin=originOption(parsed.options.origin);const decision=await composition.decisions.record({...parsed.options.id===void 0?{}:{id:parsed.options.id},shortName:parsed.options["short-name"],title:parsed.options.title,scopeType:scope.type,scopeId:scope.id,origin,category:categoryV2Option(parsed.options.category),context:parsed.options.context,decision:parsed.options.decision,reason:parsed.options.reason,alternatives:csvOption(parsed.options.alternatives),consequences:csvOption(parsed.options.consequences),reversible:parsed.flags.has("reversible"),rollback:parsed.options.rollback??"Not applicable.",confidence:origin==="agent"?confidenceOption(parsed.options.confidence):null,confirmed:origin==="human"&&parsed.flags.has("confirmed"),timeZone:composition.layout.project.timezone});return{decision,artifact_path:composition.decisions.path(scope.type,scope.id,decision.id)}}throw new UsageError(`Unknown V2 Decision action: ${action??""}`)}import{posix as posix4}from"node:path";function changedFilesOutsideTaskScopes(writeScopes,changedFiles){if(writeScopes.length===0)return[];return changedFiles.filter(path=>!writeScopes.some(scope=>workspaceScopeMatches2(scope,path)))}function containsIdentifier(content,identifier){const escaped=identifier.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return new RegExp(`(?:^|[^A-Z0-9-])${escaped}(?:$|[^A-Z0-9-])`,"m").test(content)}function containsIsoTimestamp(content){return/\b\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})\b/.test(content)}function assertRiskScaledArtifactCounts(taskId,risk2,verificationCount,evidenceCount){if(risk2!=="lite")return;if(verificationCount!==1)throw new LifecycleGateError(`Lite Task ${taskId} requires exactly one verification artifact; found ${verificationCount}`);if(evidenceCount!==1)throw new LifecycleGateError(`Lite Task ${taskId} requires exactly one Evidence; found ${evidenceCount}`)}function workspaceScopeMatches2(scope,path){const normalizedScope=scope.replaceAll("\\","/").replace(/\/+$/,"");const normalizedPath=path.replaceAll("\\","/");if(!normalizedScope.includes("*"))return normalizedPath===normalizedScope||normalizedPath.startsWith(`${normalizedScope}/`);const pattern=normalizedScope.split("**").map(segment=>segment.replace(/[.+^${}()|[\]\\]/g,"\\$&").replace(/\*/g,"[^/]*")).join(".*");return new RegExp(`^${pattern}$`).test(normalizedPath)}function formatLifecycleState(entity){return`${entity.id} (${entity.status})`}function isTerminalLifecycleStatus(status){return new Set(["completed","failed","cancelled"]).has(status)}async function activateTaskMacroParents(change,repositories){const specId=change.source.type==="task"?null:change.source.spec_id;const prdId=change.source.type==="prd"?change.source.prd_id:null;if(specId!==null){const{spec}=await repositories.specs.read(specId);if(spec.status==="ready"||spec.status==="blocked"){await repositories.specs.transition(spec.id,"active")}else if(spec.status!=="active"){throw new LifecycleGateError(`SPEC ${spec.id} must be ready, active, or blocked before Task start`)}}if(prdId!==null){const{prd}=await repositories.prds.read(prdId);if(prd.status==="ready"||prd.status==="blocked"){await repositories.prds.transition(prd.id,"active")}else if(prd.status!=="active"){throw new LifecycleGateError(`PRD ${prd.id} must be ready, active, or blocked before Task start`)}}}var LifecycleV2Gate=class{constructor(filesystem,layout,repositories){this.filesystem=filesystem;this.layout=layout;this.repositories=repositories;if(layout.version===1)throw new TypeError("LifecycleV2Gate requires a modern layout")}filesystem;layout;repositories;async completeTask(id,result2){const{task}=await this.repositories.tasks.read(id);if(task.status!=="verifying"){throw new LifecycleGateError(`Task ${id} must be verifying before completion`)}try{return await this.completeVerifyingTask(task,result2)}catch(error51){if(error51 instanceof LifecycleGateError){await this.repositories.tasks.transition(id,"executing")}throw error51}}async verifyTask(id,evidenceIds){const{task}=await this.repositories.tasks.read(id);if(task.status!=="executing"&&task.status!=="verifying"){throw new LifecycleGateError(`Task ${id} must be executing or verifying before verification`)}const execution=await this.executionForTask(task.id,task.change_id);const result2=taskAssurancePreflightResult(evidenceIds);await this.assertEvidenceCoverage(task,result2);const assurance=this.assuranceConfig();await this.assertSixStageCoverage(task,result2,execution.id,assurance===null);if(assurance!==null){await assertTaskAssurancePreflightV1({filesystem:this.filesystem,layout:this.layout,task,evidence_ids:result2.evidence_ids,config:assurance})}return task.status==="verifying"?task:this.repositories.tasks.transition(id,"verifying")}async completeVerifyingTask(task,result2){for(const dependencyId of task.depends_on){const{task:dependency}=await this.repositories.tasks.read(dependencyId).catch(()=>{throw new LifecycleGateError(`Task dependency does not resolve: ${dependencyId}`)});if(dependency.status!=="completed"){throw new LifecycleGateError(`Task dependency must be completed: ${dependencyId} is ${dependency.status}`)}}const{change}=await this.repositories.changes.read(task.change_id);if(!change.task_ids.includes(task.id)){throw new LifecycleGateError(`Change ${change.id} does not own Task ${task.id}`)}if(!new Set(["executing","verifying"]).has(change.status)){throw new LifecycleGateError(`Change ${change.id} is not executing or verifying`)}const execution=await this.executionForTask(task.id,task.change_id);if(!new Set(["running","verifying"]).has(execution.status)){throw new LifecycleGateError(`Execution ${execution.id} is not running or verifying`)}if(result2.completed_run_id===null){throw new LifecycleGateError(`Completed Task ${task.id} requires a completed Run`)}const run=await this.readRequiredRun(result2.completed_run_id);this.assertCompletedRunAttribution(run,task,execution.id);await this.assertEvidenceCoverage(task,result2);const assurance=this.assuranceConfig();await this.assertSixStageCoverage(task,result2,execution.id,assurance===null);if(assurance!==null){const bundle=await readAssuranceBundle(this.filesystem,this.layout,[task],result2.evidence_ids);const expectedCommit=assurance.require_final_commit?await resolveFinalProductCandidate(this.filesystem.root,bundle.validations,bundle.evidences):null;assertTaskAssuranceV1({config:assurance,risk:task.risk,write_scopes:task.write_scopes,acceptance_ids:task.acceptance_ids,validations:bundle.validations,evidences:bundle.evidences,verifier:verifierFrom(bundle.validations,run.run.agent,run.run.run_id),mutation:mutationFrom(bundle.metadata,task.id),rollback_evidence_id:bundle.evidences.find(evidence=>evidence.id.includes("ROLLBACK"))?.id??null,expected_commit_sha:expectedCommit})}this.assertChangedFilesInScope(task,result2.changed_files);return this.repositories.tasks.transition(task.id,"completed",result2)}async startTask(id,mode="start"){const{task}=await this.repositories.tasks.read(id);const expected=mode==="resume"?"blocked":mode==="rework"?"failed":"planned";if(task.status!==expected){throw new LifecycleGateError(`Task ${id} must be ${expected} before ${mode}`)}for(const dependencyId of task.depends_on){const dependency=await this.repositories.tasks.read(dependencyId).catch(()=>null);if(dependency===null||dependency.task.status!=="completed"){throw new LifecycleGateError(`Task dependency is not completed: ${dependencyId}`)}}let{change}=await this.repositories.changes.read(task.change_id);const execution=await this.executionForTask(task.id,task.change_id);let latestExecution=execution;if(mode!=="start"){if(change.status==="blocked"||change.status==="failed"){change=await this.repositories.changes.transition(change.id,"executing")}if(latestExecution.status==="blocked"||latestExecution.status==="failed"){latestExecution=await this.repositories.executions.transition(latestExecution.id,"running")}}if(change.status!=="executing"){throw new LifecycleGateError(`Change ${change.id} must be executing before Task start`)}if(latestExecution.status!=="running"){throw new LifecycleGateError(`Execution ${latestExecution.id} must be running before Task start`)}await activateTaskMacroParents(change,this.repositories);return this.repositories.tasks.transition(id,"executing")}async failTask(id,result2){const{task}=await this.repositories.tasks.read(id);if(!new Set(["executing","verifying"]).has(task.status)){throw new LifecycleGateError(`Task ${id} must be executing or verifying before failure`)}if(result2.completed_run_id===null){throw new LifecycleGateError(`Failed Task ${id} requires a failed Run`)}const execution=await this.executionForTask(task.id,task.change_id);const run=await this.readRequiredRun(result2.completed_run_id);if(run.finished?.status!=="failed"){throw new LifecycleGateError(`Run ${result2.completed_run_id} must be failed`)}this.assertRunAttribution(run,task,execution.id);this.assertChangedFilesInScope(task,result2.changed_files);return this.repositories.tasks.transition(id,"failed",result2)}async verifyChange(id){const{change}=await this.repositories.changes.read(id);if(change.status!=="executing"){throw new LifecycleGateError(`Change ${id} must be executing before verification`)}const tasks=await this.tasksForChange(change.id,change.task_ids);const incomplete=tasks.filter(task=>task.status!=="completed");if(incomplete.length>0){throw new LifecycleGateError(`Change ${id} has incomplete Tasks: ${incomplete.map(formatLifecycleState).join(", ")}`)}return this.repositories.changes.transition(id,"verifying")}async completeChange(id,result2){const{change}=await this.repositories.changes.read(id);if(change.status!=="verifying"){throw new LifecycleGateError(`Change ${id} must be verifying before completion`)}const tasks=await this.tasksForChange(change.id,change.task_ids);const incomplete=tasks.filter(task=>task.status!=="completed");if(incomplete.length>0){throw new LifecycleGateError(`Change ${id} has incomplete Tasks: ${incomplete.map(formatLifecycleState).join(", ")}`)}const covered=new Set(tasks.flatMap(task=>task.acceptance_ids));const missing=change.acceptance_ids.filter(acceptanceId=>!covered.has(acceptanceId));if(missing.length>0){throw new LifecycleGateError(`Change ${id} has uncovered Acceptance Criteria: ${missing.join(", ")}`)}for(const task of tasks){if(task.result===null)throw new LifecycleGateError(`Task ${task.id} has no terminal result`);await this.assertEvidenceCoverage(task,task.result)}return this.repositories.changes.transition(id,"completed",result2)}async verifyExecution(id){const{execution}=await this.repositories.executions.read(id);if(execution.status!=="running"){throw new LifecycleGateError(`Execution ${id} must be running before verification`)}await this.assertExecutionDescendantsComplete(execution.id,execution.dag.nodes);return this.repositories.executions.transition(id,"verifying")}async completeExecution(id,result2){const{execution}=await this.repositories.executions.read(id);let completedExecution;if(execution.status==="verifying"){await this.assertExecutionDescendantsComplete(execution.id,execution.dag.nodes);const changeIds=[...new Set(execution.dag.nodes.map(node=>node.change_id))];for(const changeId of changeIds){const{change}=await this.repositories.changes.read(changeId);if(change.status!=="completed"){throw new LifecycleGateError(`Execution Change must be completed: ${formatLifecycleState(change)}`)}}completedExecution=await this.repositories.executions.transition(id,"completed",result2)}else if(execution.status==="completed"){completedExecution=execution}else{throw new LifecycleGateError(`Execution ${id} must be verifying before completion`)}await this.reconcileCompletedExecutionOrigin(completedExecution);return completedExecution}async reconcileCompletedExecutionOrigin(execution){if(execution.origin.type==="prd"){const{prd}=await this.repositories.prds.read(execution.origin.prd_id);if(prd.status==="active")await this.deliverPrd(prd.id);else if(prd.status!=="delivered"){throw new LifecycleGateError(`Completed Execution ${execution.id} has non-deliverable PRD ${prd.id}: ${prd.status}`)}}else if(execution.origin.type==="spec"){const{spec}=await this.repositories.specs.read(execution.origin.spec_id);if(spec.status==="active")await this.deliverSpec(spec.id);else if(spec.status!=="delivered"){throw new LifecycleGateError(`Completed Execution ${execution.id} has non-deliverable SPEC ${spec.id}: ${spec.status}`)}}}async deliverSpec(id){const{spec}=await this.repositories.specs.read(id);if(spec.status!=="active"){throw new LifecycleGateError(`SPEC ${id} must be active before delivery`)}const[changes,executions]=await Promise.all([this.repositories.changes.list(),this.repositories.executions.list()]);const descendants=changes.filter(change=>change.source.type==="spec"&&change.source.spec_id===id||change.source.type==="prd"&&change.source.spec_id===id);const descendantChangeIds=new Set(descendants.map(change=>change.id));const relatedExecutions=executions.filter(execution=>execution.origin.type==="spec"&&execution.origin.spec_id===id||execution.dag.nodes.some(node=>descendantChangeIds.has(node.change_id)));if(descendants.length===0||relatedExecutions.length===0){throw new LifecycleGateError(`SPEC ${id} has no materialized Change and Execution`)}this.assertAllTerminal(descendants,"SPEC Change");this.assertAllTerminal(relatedExecutions,"SPEC Execution");const assurance=this.assuranceConfig();if(assurance!==null){const tasks=await this.readTasks(relatedExecutions.flatMap(item=>item.dag.nodes.map(node=>node.task_id)));await this.assertDeliveryAssurance("spec",spec.acceptance_ids,[],tasks,assurance)}return this.repositories.specs.transition(id,"delivered")}async deliverPrd(id){const{prd}=await this.repositories.prds.read(id);if(prd.status!=="active"){throw new LifecycleGateError(`PRD ${id} must be active before delivery`)}const[specs,changes,executions]=await Promise.all([this.repositories.specs.list(),this.repositories.changes.list(),this.repositories.executions.list()]);const executionId=prd.prepared_plan?.execution_id??prd.plan_ref?.execution_id;if(executionId===void 0){throw new LifecycleGateError(`PRD ${id} has no prepared plan or plan reference`)}const selectedExecution=executions.find(execution=>execution.id===executionId&&execution.origin.type==="prd"&&execution.origin.prd_id===id);if(selectedExecution===void 0){throw new LifecycleGateError(`PRD ${id} plan Execution does not resolve: ${executionId}`)}const selectedChangeIds=new Set(selectedExecution.dag.nodes.map(node=>node.change_id));const directChanges=changes.filter(change=>selectedChangeIds.has(change.id));const selectedSpecIds=prd.prepared_plan===null?new Set(directChanges.flatMap(change=>change.source.type==="prd"&&change.source.prd_id===id?[change.source.spec_id]:[])):new Set(specIdsForPrdPlanV2(prd.prepared_plan,id));const childSpecs=specs.filter(spec=>spec.prd_id===id&&selectedSpecIds.has(spec.id));const directExecutions=[selectedExecution];if(childSpecs.length===0){throw new LifecycleGateError(`PRD ${id} requires at least one SPEC`)}for(const spec of childSpecs){if(spec.status==="active")await this.deliverSpec(spec.id)}const refreshedSpecs=(await this.repositories.specs.list()).filter(spec=>spec.prd_id===id&&selectedSpecIds.has(spec.id));this.assertAllTerminal(refreshedSpecs,"PRD SPEC","delivered");this.assertAllTerminal(directChanges,"PRD Change");this.assertAllTerminal(directExecutions,"PRD Execution");const assurance=this.assuranceConfig();if(assurance!==null){const tasks=await this.readTasks(selectedExecution.dag.nodes.map(node=>node.task_id));const metadata=prd;await this.assertDeliveryAssurance("prd",metadata.acceptance_ids??refreshedSpecs.flatMap(spec=>spec.acceptance_ids),prd.outcome_ids,tasks,assurance)}return this.repositories.prds.transition(id,"delivered")}async cancelPrd(id){const{prd}=await this.repositories.prds.read(id);if(prd.status==="delivered"){throw new LifecycleGateError(`Delivered PRD ${id} cannot be cancelled`)}const specs=(await this.repositories.specs.list()).filter(spec=>spec.prd_id===id);const specIds=new Set(specs.map(spec=>spec.id));const changes=(await this.repositories.changes.list()).filter(change=>change.source.type==="prd"&&change.source.prd_id===id||change.source.type==="spec"&&specIds.has(change.source.spec_id));const cascade=await this.cancelDescendants(specs,changes,(await this.repositories.executions.list()).filter(execution=>execution.origin.type==="prd"&&execution.origin.prd_id===id||execution.origin.type==="spec"&&specIds.has(execution.origin.spec_id)),`PRD ${id}`);const cancelledPrd=prd.status==="cancelled"?prd:await this.repositories.prds.transition(id,"cancelled");return{prd:cancelledPrd,cascade}}async cancelSpec(id){const{spec}=await this.repositories.specs.read(id);if(spec.status==="delivered"){throw new LifecycleGateError(`Delivered SPEC ${id} cannot be cancelled`)}const changes=(await this.repositories.changes.list()).filter(change=>change.source.type==="spec"&&change.source.spec_id===id||change.source.type==="prd"&&change.source.spec_id===id);const cascade=await this.cancelDescendants([],changes,(await this.repositories.executions.list()).filter(execution=>execution.origin.type==="spec"&&execution.origin.spec_id===id),`SPEC ${id}`);const cancelledSpec=spec.status==="cancelled"?spec:await this.repositories.specs.transition(id,"cancelled");return{spec:cancelledSpec,cascade}}async cancelDescendants(specs,changes,originExecutions,parent){const changeIds=new Set(changes.map(change=>change.id));const allExecutions=await this.repositories.executions.list();const executions=[...new Map([...originExecutions,...allExecutions.filter(execution=>execution.dag.nodes.some(node=>changeIds.has(node.change_id)))].map(execution=>[execution.id,execution])).values()];const taskIds=new Set([...changes.flatMap(change=>change.task_ids),...executions.flatMap(execution=>execution.dag.nodes.map(node=>node.task_id))]);const tasks=(await this.repositories.tasks.list()).filter(task=>taskIds.has(task.id));const reason=`Cancelled automatically because ${parent} was cancelled.`;const cancelledTasks=await Promise.all(tasks.filter(task=>!isTerminalLifecycleStatus(task.status)).map(task=>this.repositories.tasks.transition(task.id,"cancelled",{summary:reason,changed_files:[],evidence_ids:[],completed_run_id:null})));const cancelledChanges=await Promise.all(changes.filter(change=>!isTerminalLifecycleStatus(change.status)).map(change=>this.repositories.changes.transition(change.id,"cancelled",reason)));const cancelledExecutions=await Promise.all(executions.filter(execution=>!isTerminalLifecycleStatus(execution.status)).map(execution=>this.repositories.executions.transition(execution.id,"cancelled",reason)));const cancelledSpecs=await Promise.all(specs.filter(spec=>!new Set(["delivered","cancelled"]).has(spec.status)).map(spec=>this.repositories.specs.transition(spec.id,"cancelled")));return{specs:cancelledSpecs,tasks:cancelledTasks,changes:cancelledChanges,executions:cancelledExecutions}}assuranceConfig(){const config2=this.layout.projectConfig?.assurance;return config2?.version===1?config2:null}async readTasks(ids){return Promise.all([...new Set(ids)].map(async id=>(await this.repositories.tasks.read(id)).task))}async assertDeliveryAssurance(origin,acceptanceIds,outcomeIds,tasks,config2){const bundle=await readAssuranceBundle(this.filesystem,this.layout,tasks);const expected=config2.require_final_commit?await resolveFinalProductCandidate(this.filesystem.root,bundle.validations,bundle.evidences):null;const validations=expected===null?bundle.validations:bundle.validations.filter(item=>item.commit_sha===expected);const evidences=expected===null?bundle.evidences:bundle.evidences.filter(item=>item.commit_sha===expected);const verifier=await this.deliveryVerifier(validations,tasks);assertDeliveryAssuranceV1({origin,config:config2,acceptance_ids:acceptanceIds,outcome_ids:outcomeIds,validations,evidences,verifier,mutation:deliveryMutationFrom(bundle.metadata,tasks.map(task=>task.id)),rollback_evidence_id:evidences.find(evidence=>evidence.id.includes("ROLLBACK"))?.id??null,expected_commit_sha:expected})}async deliveryVerifier(validations,tasks){for(const review of validations.filter(item=>isReviewKind(item.kind))){const task=tasks.find(item=>item.id===review.task_id);if(task?.result?.completed_run_id==null)continue;const run=await this.readRequiredRun(task.result.completed_run_id);const approval=verifierFrom([review],run.run.agent,run.run.run_id);if(approval!==null)return approval}return null}async tasksForChange(changeId,expectedIds){const tasks=await Promise.all(expectedIds.map(taskId=>this.repositories.tasks.read(taskId)));for(const{task}of tasks){if(task.change_id!==changeId){throw new LifecycleGateError(`Task ${task.id} does not belong to Change ${changeId}`)}}return tasks.map(({task})=>task)}async executionForTask(taskId,changeId){const executions=(await this.repositories.executions.list()).filter(execution=>execution.dag.nodes.some(node=>node.task_id===taskId&&node.change_id===changeId));if(executions.length!==1){throw new LifecycleGateError(`Task ${taskId} must resolve to exactly one Execution; found ${executions.length}`)}return executions[0]}async readRequiredRun(id){try{return await this.repositories.runs.read(id)}catch(error51){throw new LifecycleGateError(`Run ${id} does not resolve: ${error51 instanceof Error?error51.message:String(error51)}`)}}assertCompletedRunAttribution(run,task,executionId){if(run.finished?.status!=="completed"){throw new LifecycleGateError(`Run ${run.run.run_id} must be completed`)}this.assertRunAttribution(run,task,executionId)}assertRunAttribution(run,task,executionId){const mismatches=[run.run.phase==="execution"?null:"phase",run.run.execution_id===executionId?null:"execution_id",run.run.task_id===task.id?null:"task_id",run.run.change_id===task.change_id?null:"change_id"].filter(value=>value!==null);if(mismatches.length>0){throw new LifecycleGateError(`Run ${run.run.run_id} attribution mismatch: ${mismatches.join(", ")}`)}}async assertEvidenceCoverage(task,result2){if(result2.evidence_ids.length===0){throw new LifecycleGateError(`Task ${task.id} requires at least one Evidence`)}const changeDirectory=posix4.dirname(this.layout.activePath("change",task.change_id));const mainDocuments=[await this.filesystem.readText(this.layout.activePath("change",task.change_id))];const executions=(await this.repositories.executions.list()).filter(execution=>execution.dag.nodes.some(node=>node.task_id===task.id));for(const execution of executions){mainDocuments.push(await this.filesystem.readText(this.layout.activePath("execution",execution.id)))}const documents=[];for(const evidenceId of result2.evidence_ids){const path=`${changeDirectory}/artifacts/evidence/${evidenceId}.md`;const candidates=mainDocuments.filter(document=>containsIdentifier(document,evidenceId)&&containsIdentifier(document,task.id));if(await this.filesystem.exists(path)){candidates.push(`${evidenceId}
|
|
1255
1256
|
${await this.filesystem.readText(path)}`)}const resolved=candidates.find(document=>containsIdentifier(document,task.id));if(resolved===void 0){throw new LifecycleGateError(`Evidence does not resolve for Task ${task.id}: ${evidenceId}`)}documents.push(resolved)}const evidence=documents.join("\n");if(!containsIdentifier(evidence,task.id)){throw new LifecycleGateError(`Evidence does not identify Task ${task.id}`)}const missing=task.acceptance_ids.filter(id=>!containsIdentifier(evidence,id));if(missing.length>0){throw new LifecycleGateError(`Task ${task.id} Evidence does not cover Acceptance Criteria: ${missing.join(", ")}`)}}async assertSixStageCoverage(task,result2,executionId,enforceLegacyRiskCounts=true){const decisions=[...await this.repositories.decisions.list({type:"change",id:task.change_id}),...await this.repositories.decisions.list({type:"execution",id:executionId})];if(decisions.length===0){throw new LifecycleGateError(`Task ${task.id} requires at least one Decision for six-stage coverage`)}const changeDirectory=posix4.dirname(this.layout.activePath("change",task.change_id));const verificationPaths=(await Promise.all(["tests","evals","checks"].map(kind=>this.filesystem.listFiles(`${changeDirectory}/artifacts/${kind}`)))).flat();const relatedVerificationPaths=[];for(const path of verificationPaths){const content=await this.filesystem.readText(path);if(containsIdentifier(content,task.id)&&containsIsoTimestamp(content)){relatedVerificationPaths.push(path)}}if(relatedVerificationPaths.length===0){throw new LifecycleGateError(`Task ${task.id} requires at least one Test, Eval, or Check for six-stage coverage`)}const timestampedEvidence=[];for(const evidenceId of result2.evidence_ids){const path=`${changeDirectory}/artifacts/evidence/${evidenceId}.md`;if(!await this.filesystem.exists(path))continue;const content=await this.filesystem.readText(path);if(containsIdentifier(content,task.id)&&containsIsoTimestamp(content)){timestampedEvidence.push(path)}}if(timestampedEvidence.length===0){throw new LifecycleGateError(`Task ${task.id} requires an Evidence file with the Task id and an ISO date-time for six-stage coverage`)}if(enforceLegacyRiskCounts){assertRiskScaledArtifactCounts(task.id,task.risk,relatedVerificationPaths.length,result2.evidence_ids.length)}}assertChangedFilesInScope(task,changedFiles){const outside=changedFilesOutsideTaskScopes(task.write_scopes,changedFiles);if(outside.length>0){throw new LifecycleGateError(`Task ${task.id} changed files outside write scopes: ${outside.join(", ")}`)}}async assertExecutionDescendantsComplete(executionId,nodes){for(const node of nodes){const{task}=await this.repositories.tasks.read(node.task_id);if(task.change_id!==node.change_id){throw new LifecycleGateError(`Execution ${executionId} DAG ownership mismatch for ${task.id}`)}if(task.status!=="completed"){throw new LifecycleGateError(`Execution Task must be completed: ${formatLifecycleState(task)}`)}}}assertAllTerminal(entities,label,terminal="completed"){const incomplete=entities.filter(entity=>entity.status!==terminal);if(incomplete.length>0){throw new LifecycleGateError(`${label} is not ${terminal}: ${incomplete.map(formatLifecycleState).join(", ")}`)}}};function createTaskFirstPreparedPlan(input){const{task}=input;return createPreparedPlanV2({revision:1,source:{type:"task",task_id:task.id},execution_id:input.executionId,prepared_at:input.preparedAt,policy:input.policy,blueprints:{changes:[{key:"task-first-change",id:task.change_id,title:task.title,short_name:task.short_name,risk:task.risk,source:{type:"task",task_id:task.id},requirement_ids:task.requirement_ids,acceptance_ids:task.acceptance_ids,requirement_impact:{type:"none",reason:input.requirementImpactReason??"Implements existing Requirements."}}],tasks:[{key:"task-first",id:task.id,change_id:task.change_id,title:task.title,short_name:task.short_name,objective:task.objective,risk:task.risk,priority:task.priority,owner:task.owner,requirement_ids:task.requirement_ids,acceptance_ids:task.acceptance_ids,write_scopes:task.write_scopes}]},dag:{nodes:[{task_id:task.id,depends_on:task.depends_on}]}})}async function runPlanV2Command(action,parsed,filesystem,layout){if(action==="build"){requireOptions(parsed.options,["draft"]);const input=JSON.parse(await filesystem.readText(parsed.options.draft));const plan=createPreparedPlanV2(input);await assertPreparedPlanReferences(filesystem,plan);const outputPath=parsed.options.output;if(outputPath!==void 0){await filesystem.writeTextAtomic(outputPath,`${JSON.stringify(plan,null,2)}
|
|
1256
1257
|
`);return{valid:true,plan:preparedPlanSummary(plan),artifact_path:outputPath}}return plan}if(action==="validate"){const plan=await readPreparedPlan(filesystem,parsed);await assertPreparedPlanReferences(filesystem,plan);return{valid:true,plan:preparedPlanSummary(plan)}}if(action==="normalize"){if(layout===void 0)throw new UsageError("plan normalize requires a modern workspace");const scopes=["task","spec","prd"].filter(scope2=>parsed.options[scope2]!==void 0);if(scopes.length!==1){throw new UsageError("plan normalize requires exactly one of --task, --spec, or --prd")}const scope=scopes[0];const id=parsed.options[scope];if(scope==="task"){const repository2=new TaskV2Repository(filesystem,layout);const current2=(await repository2.read(id)).task;if(current2.plan_ref!==void 0)return{plan_ref:current2.plan_ref};if(current2.prepared_plan===void 0)throw new UsageError(`Task has no plan: ${id}`);const task=await repository2.normalizePreparedPlan(id,current2.prepared_plan);return{plan_ref:task.plan_ref}}if(scope==="spec"){const repository2=new DeliverySpecV2Repository(filesystem,layout);const current2=(await repository2.read(id)).spec;if(current2.plan_ref!==null)return{plan_ref:current2.plan_ref};if(current2.prepared_plan===null)throw new UsageError(`SPEC has no plan: ${id}`);const spec=await repository2.normalizePreparedPlan(id,current2.prepared_plan);return{plan_ref:spec.plan_ref}}const repository=new PrdV2Repository(filesystem,layout);const current=(await repository.read(id)).prd;if(current.plan_ref!==null)return{plan_ref:current.plan_ref};if(current.prepared_plan===null)throw new UsageError(`PRD has no plan: ${id}`);const prd=await repository.normalizePreparedPlan(id,current.prepared_plan);return{plan_ref:prd.plan_ref}}throw new UsageError(`Unknown V2 Plan action: ${action??""}`)}async function readPreparedPlan(filesystem,parsed){requireOptions(parsed.options,["plan"]);return preparedPlanV2Schema.parse(JSON.parse(await filesystem.readText(parsed.options.plan)))}async function assertPreparedPlanReferences(filesystem,plan){const paths=await filesystem.listFiles(".agents/requirements",".md");if(paths.length===0){throw new UsageError("PreparedPlan requires a non-empty .agents/requirements catalog")}const catalog=buildRequirementReferenceCatalog(await Promise.all(paths.map(path=>filesystem.readText(path))));const requirementIds=[...plan.blueprints.changes.flatMap(change=>[...change.requirement_ids,...change.requirement_impact.type==="update"?change.requirement_impact.requirement_ids:[]]),...plan.blueprints.tasks.flatMap(task=>task.requirement_ids)];const acceptanceIds=[...plan.blueprints.changes.flatMap(change=>change.acceptance_ids),...plan.blueprints.tasks.flatMap(task=>task.acceptance_ids)];const findings=validateRequirementReferences(catalog,requirementIds,acceptanceIds);if(findings.length>0){throw new UsageError(`PreparedPlan contains unresolved governance references: ${findings.map(finding2=>finding2.id).join(", ")}`)}}async function preparedTaskPlan(tasks,id){const{task}=await tasks.read(id);if(task.status!=="planned"||task.prepared_plan===void 0){throw new UsageError(`Task is not prepared: ${id}`)}return task.prepared_plan}function preparedPlanSummary(plan){return{schema_version:plan.schema_version,revision:plan.revision,source:plan.source,execution_id:plan.execution_id,prepared_at:plan.prepared_at,hash:plan.hash,change_count:plan.blueprints.changes.length,task_count:plan.blueprints.tasks.length,topological_order:plan.dag.topological_order}}var PROJECTION_ROOT=".agents/projections/runtime";var MANIFEST_PATH=`${PROJECTION_ROOT}/manifest.json`;var STATE_PATH=`${PROJECTION_ROOT}/entity-state.json`;var STATE_ROOT=`${PROJECTION_ROOT}/state`;var STATE_SHARDS=16;var SNAPSHOT_PATH=`${PROJECTION_ROOT}/snapshot.json`;var ACTIVE_WORK_PATH=`${PROJECTION_ROOT}/active-work.json`;var LOCK_PATH=`${PROJECTION_ROOT}/projection.lock`;var entityKindSchema=external_exports.enum(["prd","spec","change","task","execution","run","decision"]);var ENTITY_KINDS=entityKindSchema.options;var usageSchema=external_exports.object({input_tokens:external_exports.number().int().nonnegative().nullable().default(null),output_tokens:external_exports.number().int().nonnegative().nullable().default(null),cached_input_tokens:external_exports.number().int().nonnegative().nullable().default(null),total_tokens:external_exports.number().int().nonnegative().nullable().default(null),cost:external_exports.number().nonnegative().nullable().default(null),currency:external_exports.string().min(1).nullable().default(null)}).strict();var compactEntitySchema=external_exports.object({kind:entityKindSchema,id:external_exports.string().min(1),title:external_exports.string().min(1).nullable().default(null),status:external_exports.string().min(1).nullable().default(null),risk:external_exports.string().min(1).nullable().default(null),priority:external_exports.string().min(1).nullable().default(null),updated_at:external_exports.string().datetime({offset:true}),relations:external_exports.array(external_exports.string().min(1)).default([]),usage:usageSchema.nullable().default(null),data:external_exports.record(external_exports.string(),external_exports.unknown()).nullable().default(null)}).strict();var projectionEventSchema=external_exports.object({schema_version:external_exports.literal(1),event_id:external_exports.string().min(1),occurred_at:external_exports.string().datetime({offset:true}),operation:external_exports.enum(["upsert","remove"]),entity:compactEntitySchema}).strict();var ProjectionStore=class{constructor(filesystem){this.filesystem=filesystem}filesystem;async append(event){return this.appendMany([event])}async appendMany(events){const parsed=events.map(event=>projectionEventSchema.parse(event));return this.withLock(async()=>{const byMonth=new Map;for(const event of parsed){const month=event.occurred_at.slice(0,7);byMonth.set(month,[...byMonth.get(month)??[],event])}await Promise.all([...byMonth].map(([month,monthEvents])=>this.filesystem.appendText(`${PROJECTION_ROOT}/journal/${month}.jsonl`,`${monthEvents.map(event=>JSON.stringify(event)).join("\n")}
|
|
1257
1258
|
`)));return this.refreshUnlocked()})}async refresh(){return this.withLock(()=>this.refreshUnlocked())}async refreshUnlocked(){const manifest=await this.readJson(MANIFEST_PATH,{schema_version:1,updated_at:new Date(0).toISOString(),offsets:{}});const states=await this.readStates();const dirtyShards=new Set;const legacyState=await this.filesystem.exists(STATE_PATH)||(await Promise.all(ENTITY_KINDS.map(kind=>this.filesystem.exists(this.aggregateStatePath(kind))))).some(Boolean);if(legacyState){for(const kind of ENTITY_KINDS){for(let shard=0;shard<STATE_SHARDS;shard+=1){dirtyShards.add(`${kind}:${shard}`)}}}const journals=await this.filesystem.listFiles(`${PROJECTION_ROOT}/journal`,".jsonl");for(const journal of journals){const offset=manifest.offsets[journal]??0;const delta=await this.filesystem.readTextFrom(journal,offset);for(const line of delta.content.split(/\r?\n/).filter(Boolean)){const event=projectionEventSchema.parse(JSON.parse(line));const state=states[event.entity.kind];if(event.operation==="remove")delete state.entities[event.entity.id];else state.entities[event.entity.id]=event.entity;dirtyShards.add(`${event.entity.kind}:${stateShard(event.entity.id)}`)}manifest.offsets[journal]=delta.nextOffset}const updatedAt=new Date().toISOString();manifest.updated_at=updatedAt;const entities=ENTITY_KINDS.flatMap(kind=>Object.values(states[kind].entities));const snapshot=buildSnapshot(entities,updatedAt);const active=buildActiveWork(entities,updatedAt);await Promise.all([this.filesystem.writeTextAtomic(MANIFEST_PATH,pretty(manifest)),...[...dirtyShards].map(key=>{const[kind,rawShard]=key.split(":");const shard=Number(rawShard);const entities2=Object.fromEntries(Object.entries(states[kind].entities).filter(([id])=>stateShard(id)===shard));return this.filesystem.writeTextAtomic(this.statePath(kind,shard),pretty({schema_version:1,entities:entities2}))}),this.filesystem.writeTextAtomic(SNAPSHOT_PATH,pretty(snapshot)),this.filesystem.writeTextAtomic(ACTIVE_WORK_PATH,pretty(active))]);if(await this.filesystem.exists(STATE_PATH))await this.filesystem.removeFile(STATE_PATH);await Promise.all(ENTITY_KINDS.map(async kind=>{const path=this.aggregateStatePath(kind);if(await this.filesystem.exists(path))await this.filesystem.removeFile(path)}));return snapshot}async replace(events){return this.withLock(async()=>{const now=new Date().toISOString();const path=`${PROJECTION_ROOT}/journal/${now.slice(0,7)}.jsonl`;const content=events.map(event=>JSON.stringify(projectionEventSchema.parse(event))).join("\n");const existingJournals=await this.filesystem.listFiles(`${PROJECTION_ROOT}/journal`,".jsonl");const existingShards=await this.filesystem.listFiles(STATE_ROOT,".json");await Promise.all(existingJournals.filter(journal=>journal!==path).map(journal=>this.filesystem.removeFile(journal)));await Promise.all([this.filesystem.writeTextAtomic(path,content.length===0?"":`${content}
|
|
1258
1259
|
`),this.filesystem.writeTextAtomic(MANIFEST_PATH,pretty({schema_version:1,updated_at:new Date(0).toISOString(),offsets:{}})),this.filesystem.removeFile(STATE_PATH),...existingShards.map(shard=>this.filesystem.removeFile(shard))]);return this.refreshUnlocked()})}async readSnapshot(){if(!await this.filesystem.exists(SNAPSHOT_PATH))return null;return JSON.parse(await this.filesystem.readText(SNAPSHOT_PATH))}async readActiveWork(){if(!await this.filesystem.exists(ACTIVE_WORK_PATH))return null;return JSON.parse(await this.filesystem.readText(ACTIVE_WORK_PATH))}async readEntities(kind){if(kind!==void 0)return Object.values((await this.readKindState(kind)).entities);const states=await this.readStates();return ENTITY_KINDS.flatMap(candidate=>Object.values(states[candidate].entities))}statePath(kind,shard){return`${STATE_ROOT}/${kind}/${shard.toString(16).padStart(2,"0")}.json`}aggregateStatePath(kind){return`${STATE_ROOT}/${kind}.json`}async readStates(){const states=Object.fromEntries(await Promise.all(ENTITY_KINDS.map(async kind=>[kind,await this.readKindState(kind)])));const legacy=await this.readJson(STATE_PATH,null);for(const entity of Object.values(legacy?.entities??{})){states[entity.kind].entities[entity.id]=entity}return states}async readKindState(kind){const aggregate=await this.readJson(this.aggregateStatePath(kind),null);if(aggregate!==null)return aggregate;const shardPaths=await this.filesystem.listFiles(`${STATE_ROOT}/${kind}`,".json");const shards=await Promise.all(shardPaths.map(path=>this.readJson(path,null)));return{schema_version:1,entities:Object.assign({},...shards.map(shard=>shard?.entities??{}))}}async readJson(path,fallback){try{return JSON.parse(await this.filesystem.readText(path))}catch(error51){if(isNodeError5(error51)&&error51.code==="ENOENT")return fallback;throw error51}}async withLock(operation){for(let attempt=0;attempt<80;attempt+=1){try{await this.filesystem.writeTextExclusive(LOCK_PATH,`${JSON.stringify({pid:process.pid,acquired_at:new Date().toISOString()})}
|
|
1259
1260
|
`);try{return await operation()}finally{await this.filesystem.removeFile(LOCK_PATH)}}catch(error51){if(!isNodeError5(error51)||error51.code!=="EEXIST")throw error51;if(await this.removeStaleLock())continue;await delay3(Math.min(100,10+attempt*2))}}throw new Error("Projection is busy; retry the operation")}async removeStaleLock(){try{const lock=JSON.parse(await this.filesystem.readText(LOCK_PATH));if(typeof lock.pid!=="number"||!isProcessAlive(lock.pid)){await this.filesystem.removeFile(LOCK_PATH);return true}}catch(error51){if(isNodeError5(error51)&&error51.code==="ENOENT")return true;return false}return false}};function stateShard(id){let hash2=0;for(const character of id)hash2=hash2*31+character.charCodeAt(0)>>>0;return hash2%STATE_SHARDS}function buildSnapshot(entities,updatedAt){const byKind={};const byStatus={};for(const entity of entities){byKind[entity.kind]=(byKind[entity.kind]??0)+1;if(entity.status!==null)byStatus[entity.status]=(byStatus[entity.status]??0)+1}const runs=entities.filter(entity=>entity.kind==="run");const usage=buildUsage(runs);const periods={daily:buildPeriods(runs,10),monthly:buildPeriods(runs,7),annual:buildPeriods(runs,4)};const sourceLatestAt=entities.map(entity=>entity.updated_at).sort().at(-1)??null;return{schema_version:1,updated_at:updatedAt,freshness:{source_latest_at:sourceLatestAt,lag_ms:sourceLatestAt===null?null:Math.max(0,Date.parse(updatedAt)-Date.parse(sourceLatestAt))},counts:{total:entities.length,by_kind:byKind,by_status:byStatus},usage,periods}}function buildUsage(runs){const metric=field=>{const values2=runs.map(run=>run.usage?.[field]??null);const known=values2.filter(value=>value!==null);const unknown2=values2.length-known.length;return{known_sum:known.reduce((sum,value)=>sum+value,0),unknown:unknown2,complete:unknown2===0,coverage_ratio:values2.length===0?1:known.length/values2.length}};const currencies=new Set(runs.map(run=>run.usage?.currency).filter(value=>value!==null));return{input_tokens:metric("input_tokens"),output_tokens:metric("output_tokens"),total_tokens:metric("total_tokens"),cost:{...metric("cost"),currency:currencies.size===1?[...currencies][0]??null:null}}}function buildPeriods(runs,keyLength){const groups=new Map;for(const run of runs){const timestamp9=typeof run.data?.started_at==="string"?run.data.started_at:run.updated_at;const key=timestamp9.slice(0,keyLength);const group=groups.get(key)??[];group.push(run);groups.set(key,group)}return Object.fromEntries([...groups.entries()].sort(([left],[right])=>left.localeCompare(right)).map(([key,group])=>[key,{runs:group.length,usage:buildUsage(group)}]))}function buildActiveWork(entities,updatedAt){const terminal=new Set(["completed","delivered","cancelled","superseded","failed","rolled_back"]);return{schema_version:1,updated_at:updatedAt,items:entities.filter(entity=>entity.kind!=="decision"&&entity.status!==null&&!terminal.has(entity.status)).sort((left,right)=>right.updated_at.localeCompare(left.updated_at)).map(({usage:_usage,data:_data,...entity})=>entity)}}function pretty(value){return`${JSON.stringify(value,null,2)}
|
|
1260
|
-
`}function isProcessAlive(pid){try{process.kill(pid,0);return true}catch(error51){return isNodeError5(error51)&&error51.code==="EPERM"}}function isNodeError5(error51){return error51 instanceof Error&&"code"in error51}function delay3(milliseconds){return new Promise(resolve10=>setTimeout(resolve10,milliseconds))}async function runProjectionMaintenance(action,parsed,filesystem,composition){const store=new ProjectionStore(filesystem);if(action==="rebuild"){if(!parsed.flags.has("confirm-full-scan")){throw new UsageError("projection rebuild requires --confirm-full-scan")}const events=await projectionBootstrapEvents(composition);return{snapshot:await store.replace(events),indexed:events.length}}if(action==="refresh")return store.refresh();if(action==="reconcile"){const id=parsed.options.id??parsed.positionals[2];if(id===void 0)throw new UsageError("projection reconcile requires --id ID");const event=await projectionEventForId(id,composition);return{snapshot:await store.appendMany([event]),reconciled:[id]}}if(action==="show"){return parsed.flags.has("active")?store.readActiveWork():store.readSnapshot()}throw new UsageError("projection requires rebuild --confirm-full-scan, refresh, reconcile --id ID, or show [--active]")}async function projectedList(area,parsed,filesystem){if(!["prd","spec","change","task","execution","run","decision"].includes(area)){throw new UsageError(`Projection does not support list area: ${area}`)}const store=new ProjectionStore(filesystem);let entities=await store.readEntities(area);if(entities.length===0&&await store.readSnapshot()===null){throw new UsageError("Local projection is not initialized; run `zaip projection rebuild --confirm-full-scan` once")}const statuses=new Set(csvOption(parsed.options.status));const from=dateBoundary(parsed.options.from,false);const to=dateBoundary(parsed.options.to,true);entities=entities.filter(entity=>statuses.size===0||entity.status!==null&&statuses.has(entity.status)).filter(entity=>parsed.options.prd===void 0||entity.relations.includes(parsed.options.prd)).filter(entity=>parsed.options.spec===void 0||entity.relations.includes(parsed.options.spec)).filter(entity=>parsed.options.change===void 0||entity.relations.includes(parsed.options.change)).filter(entity=>parsed.options.task===void 0||entity.relations.includes(parsed.options.task)).filter(entity=>parsed.options.execution===void 0||entity.relations.includes(parsed.options.execution)).filter(entity=>from===null||Date.parse(entity.updated_at)>=from).filter(entity=>to===null||Date.parse(entity.updated_at)<=to).sort((left,right)=>right.updated_at.localeCompare(left.updated_at)||right.id.localeCompare(left.id));const after=parsed.options.after;const start=after===void 0?0:entities.findIndex(entity=>entity.id===after)+1;if(after!==void 0&&start===0)throw new UsageError(`--after id not found: ${after}`);const limit=parsed.flags.has("all")?entities.length:numberOption(parsed.options.limit,20);if(limit>200&&!parsed.flags.has("all")){throw new UsageError("--limit must be at most 200; use --all explicitly")}const view=parsed.options.view??"index";if(view!=="index"&&view!=="summary"&&view!=="full")throw new UsageError("--view must be index, summary, or full");const page=entities.slice(start,start+limit);if(view==="full")return page;if(view==="summary"){return page.map(({data:_data,...entity})=>entity)}return{schema:["id","title","status","risk","priority","updated_at","work_relations"],rows:page.map(entity=>[entity.id,entity.title,entity.status,entity.risk,entity.priority,entity.updated_at,entity.relations.filter(relation=>/^(?:PRD|SPEC|CHG|TASK|EXEC|RUN)-/.test(relation)).slice(0,2)]),next_after:page.length===limit?page.at(-1)?.id??null:null}}function isProjectionMutation(action){return![void 0,"list","show","next","validate","aggregate"].includes(action)}async function projectMutationResult(result2,area,parsed,composition,filesystem){const store=new ProjectionStore(filesystem);if(area==="decision"){const decision=findDecision(result2);if(decision!==void 0)await store.append(projectionEventFromDecision(decision));return}if(area==="run"){const candidate=findRunId(result2)??parsed.options.id??parsed.positionals[2];const events2=collectLifecycleEntities(result2).map(projectionEventFromEntity);const runIds=new Set(collectRunIds(result2));if(candidate!==void 0)runIds.add(candidate);for(const runId of runIds){events2.push(projectionEventFromRun(await composition.runs.read(runId)))}if(events2.length>0)await store.appendMany(events2);return}if(area==="conversation"){const events2=collectLifecycleEntities(result2).map(projectionEventFromEntity);for(const runId of collectRunIds(result2)){events2.push(projectionEventFromRun(await composition.runs.read(runId)))}if(events2.length>0)await store.appendMany(events2);return}const events=collectLifecycleEntities(result2).map(projectionEventFromEntity);if(events.length>0)await store.appendMany(events)}async function projectionEventForId(id,composition){if(id.startsWith("PRD-"))return projectionEventFromEntity((await composition.prds.read(id)).prd);if(id.startsWith("SPEC-"))return projectionEventFromEntity((await composition.specs.read(id)).spec);if(id.startsWith("CHG-"))return projectionEventFromEntity((await composition.changes.read(id)).change);if(id.startsWith("TASK-"))return projectionEventFromEntity((await composition.tasks.read(id)).task);if(id.startsWith("EXEC-"))return projectionEventFromEntity((await composition.executions.read(id)).execution);if(id.startsWith("RUN-"))return projectionEventFromRun(await composition.runs.read(id));throw new UsageError(`Unsupported projection reconciliation id: ${id}`)}function collectLifecycleEntities(value){const found=[];const seen=new Set;const visit=candidate=>{if(Array.isArray(candidate)){candidate.forEach(visit);return}if(typeof candidate!=="object"||candidate===null)return;const record2=candidate;if(typeof record2.id==="string"&&typeof record2.status==="string"&&typeof record2.updated_at==="string"&&/^(PRD|SPEC|CHG|TASK|EXEC)-/.test(record2.id)&&!seen.has(record2.id)){seen.add(record2.id);found.push(record2)}Object.values(record2).forEach(visit)};visit(value);return found}function projectionEventFromEntity(entity){const id=entity.id;const kind=id.startsWith("PRD-")?"prd":id.startsWith("SPEC-")?"spec":id.startsWith("CHG-")?"change":id.startsWith("TASK-")?"task":"execution";const relations=new Set;collectRelationIds(entity,relations,id);for(const[key,value]of Object.entries(entity)){if(key.endsWith("_id")&&typeof value==="string")relations.add(value);if(key.endsWith("_ids")&&Array.isArray(value))value.filter(item=>typeof item==="string").forEach(item=>{relations.add(item)})}return{schema_version:1,event_id:`${id}:${String(entity.updated_at)}:${String(entity.status)}`,occurred_at:entity.updated_at,operation:"upsert",entity:{kind,id,title:typeof entity.title==="string"?entity.title:null,status:entity.status,risk:typeof entity.risk==="string"?entity.risk:null,priority:typeof entity.priority==="string"?entity.priority:null,updated_at:entity.updated_at,relations:[...relations],usage:null,data:Object.fromEntries(Object.entries(entity).filter(([key])=>key!=="prepared_plan"))}}}function collectRelationIds(value,relations,ownId){if(typeof value==="string"){if(/^(?:PRD|SPEC|CHG|TASK|EXEC|RUN|REQ|AC)-/.test(value)&&value!==ownId){relations.add(value)}return}if(Array.isArray(value)){value.forEach(item=>{collectRelationIds(item,relations,ownId)});return}if(typeof value==="object"&&value!==null){Object.values(value).forEach(item=>{collectRelationIds(item,relations,ownId)})}}function projectionEventFromRun(fold){const costInput=runCostInput(fold);const aggregate=aggregateRunV2Usage([costInput],fold.run.run_id);const usage=aggregate.total;const runtime=fold.effective_usage_records.findLast(record2=>record2.runtime)?.runtime;const observedRuntime=fold.effective_usage_records.at(-1);return{schema_version:1,event_id:`${fold.run.run_id}:${fold.records.length}:${fold.status}`,occurred_at:fold.records.at(-1)?.occurred_at??fold.run.occurred_at,operation:"upsert",entity:{kind:"run",id:fold.run.run_id,title:null,status:fold.status,risk:null,priority:null,updated_at:fold.records.at(-1)?.occurred_at??fold.run.occurred_at,relations:[fold.run.parent_run_id,fold.run.prd_id,fold.run.spec_id,fold.run.change_id,fold.run.task_id,fold.run.execution_id].filter(item=>item!==null),usage:{input_tokens:usage.tokens.input,output_tokens:usage.tokens.output,cached_input_tokens:usage.tokens.cached_input,total_tokens:usage.tokens.total,cost:usage.cost.brl??usage.cost.usd,currency:usage.cost.brl!==null?"BRL":usage.cost.usd!==null?"USD":null},data:{phase:fold.records.findLast(record2=>"phase"in record2)?.phase??fold.run.phase,run_role:effectiveRunV2Role(fold.run),run_kind:effectiveRunV2Kind(fold.run),run_purpose:effectiveRunV2Purpose(fold.run),requires_finalizer:runV2RequiresFinalizer(fold.run),parent_run_id:fold.run.parent_run_id,entrypoint:fold.run.entrypoint,work_type:fold.run.work_type,client:fold.run.client,agent:fold.run.agent,agent_name:fold.run.agent==="codex"?"codex":fold.run.agent_name??canonicalAgentName(fold.run.agent),provider:observedRuntime?.provider??fold.run.provider,model:fold.run.model,reasoning_effort:fold.run.reasoning_effort??fold.model_selection_records[0]?.requested.reasoning_effort??null,...effectiveConfiguration(fold),...callSummary(fold),service_tier:runtime?.service_tier??null,client_thread_id:fold.run.client_thread_id??null,client_turn_id:fold.run.client_turn_id??null,conversation_id:fold.run.conversation_id,execution_id:fold.run.execution_id,task_id:fold.run.task_id,spec_id:fold.run.spec_id,prd_id:fold.run.prd_id,change_id:fold.run.change_id,intake:fold.run.intake??null,started_at:fold.run.occurred_at,finished_at:effectiveRunFinishedAt(fold),pricing_segments:fold.effective_usage_records.map(record2=>({phase:record2.phase,provider:record2.provider,model:record2.model,service_tier:record2.runtime?.service_tier??runtime?.service_tier??null,input_tokens:record2.tokens.input,cached_input_tokens:record2.tokens.cached_input,output_tokens:record2.tokens.output,reasoning_tokens:record2.tokens.reasoning,total_tokens:record2.tokens.total,recorded_usd:record2.cost.usd,recorded_brl:record2.cost.brl,recorded_fx_rate:record2.cost.fx_rate??null})),entrypoint_usage:{conversation:aggregate.conversation,planning:aggregate.planning,execution:aggregate.execution,total:usage}}}}}function canonicalAgentName(agent){return agent.startsWith("agent-")?`zaip-agent-${agent.slice("agent-".length)}`:agent}function effectiveConfiguration(fold){const models=new Set([...fold.provider_invocation_records.map(record2=>record2.effective.model),...fold.effective_usage_records.map(record2=>record2.model)].filter(value=>value!==null));const efforts=new Set([...fold.provider_invocation_records.map(record2=>record2.effective.reasoning_effort),...fold.effective_usage_records.map(record2=>record2.runtime?.reasoning_effort??null)].filter(value=>value!==null));return{effective_model:models.size===1?[...models][0]??null:null,effective_reasoning_effort:efforts.size===1?[...efforts][0]??null:null,effective_config_mixed:models.size>1||efforts.size>1}}function callSummary(fold){const ids=new Set([...fold.model_selection_records.map(record2=>record2.invocation_id),...fold.provider_invocation_records.map(record2=>record2.invocation_id)]);if(ids.size===0){return{call_count:null,terminal_call_count:null,failed_call_count:null,cancelled_call_count:null}}return{call_count:ids.size,terminal_call_count:fold.provider_invocation_records.length,failed_call_count:fold.provider_invocation_records.filter(record2=>record2.status==="failed").length,cancelled_call_count:fold.provider_invocation_records.filter(record2=>record2.status==="cancelled").length}}function effectiveRunFinishedAt(fold){const recordedFinish=fold.finished?.occurred_at??null;if(recordedFinish===null)return null;const startedAtMs=Date.parse(fold.run.occurred_at);const recordedFinishMs=Date.parse(recordedFinish);const reconciledFinishMs=fold.records.filter(record2=>"activity_kind"in record2&&record2.activity_kind==="retrospective_local_reconciliation").map(record2=>"source_occurred_at"in record2?record2.source_occurred_at??null:null).map(value=>value===null?Number.NaN:Date.parse(value)).filter(value=>Number.isFinite(value)&&value>=startedAtMs&&value<=recordedFinishMs);if(reconciledFinishMs.length===0)return recordedFinish;return new Date(Math.max(...reconciledFinishMs)).toISOString()}function projectionEventFromDecision(decision){return{schema_version:1,event_id:`${decision.id}:${decision.created_at}`,occurred_at:decision.created_at,operation:"upsert",entity:{kind:"decision",id:decision.id,title:decision.title,status:null,risk:null,priority:null,updated_at:decision.created_at,relations:[decision.scope_id],usage:null,data:{origin:decision.origin,scope_type:decision.scope_type,scope_id:decision.scope_id,category:decision.category,created_at:decision.created_at}}}}function runCostInput(fold){return{run:{run_id:fold.run.run_id,attribution_status:fold.run.attribution_status,conversation_id:fold.run.conversation_id,execution_id:fold.run.execution_id,task_id:fold.run.task_id,spec_id:fold.run.spec_id,prd_id:fold.run.prd_id,change_id:fold.run.change_id,work_type:fold.run.work_type},records:fold.records,effective_usage_records:fold.effective_usage_records}}function findRunId(value){if(typeof value!=="object"||value===null)return void 0;const record2=value;if(typeof record2.run_id==="string")return record2.run_id;for(const child of Object.values(record2)){const result2=findRunId(child);if(result2!==void 0)return result2}return void 0}function collectRunIds(value){const found=new Set;const visit=candidate=>{if(Array.isArray(candidate)){candidate.forEach(visit);return}if(typeof candidate!=="object"||candidate===null)return;const record2=candidate;if(typeof record2.run_id==="string"&&record2.run_id.startsWith("RUN-")){found.add(record2.run_id)}Object.values(record2).forEach(visit)};visit(value);return[...found]}function findDecision(value){if(typeof value!=="object"||value===null)return void 0;const record2=value;if(typeof record2.id==="string"&&record2.id.startsWith("DEC-")&&typeof record2.created_at==="string"){return record2}for(const child of Object.values(record2)){const result2=findDecision(child);if(result2!==void 0)return result2}return void 0}async function projectionBootstrapEvents(composition){const[prds,specs,changes,tasks,executions,runs,decisions]=await Promise.all([composition.prds.list(),composition.specs.list(),composition.changes.list(),composition.tasks.list(),composition.executions.list(),composition.runs.list(),composition.decisions.list()]);return[...[...prds,...specs,...changes,...tasks,...executions].map(entity=>projectionEventFromEntity(entity)),...runs.map(projectionEventFromRun),...decisions.map(projectionEventFromDecision)]}var AGENT_CATALOG_PATH2=".agents/config/agents/catalog.yaml";async function loadAgentCatalog(filesystem){if(!await filesystem.exists(AGENT_CATALOG_PATH2)){throw new UsageError(`Agent catalog not found at ${AGENT_CATALOG_PATH2}`)}const catalog=parseAgentCatalog(parseYaml(await filesystem.readText(AGENT_CATALOG_PATH2)));const findings=validateAgentCatalog(catalog);if(findings.length>0){throw new Error(`Invalid Agent catalog: ${findings[0]?.message??"unknown finding"}`)}return catalog}async function resolveRunAgentIdentity(filesystem,input){const client=input.client.trim();if(client.length===0)throw new UsageError("--client must not be empty");const fallback=client==="codex"||client.startsWith("codex-")?"codex":client;const requested=input.agent?.trim();if(requested===void 0||requested.length===0||requested===client||requested===fallback){return fallback}const catalog=await loadAgentCatalog(filesystem).catch(error51=>{if(error51 instanceof UsageError){throw new UsageError(`${error51.message}; omit --agent to use fallback "${fallback}"`)}throw error51});const selected=catalog.agents.find(agent=>agent.id===requested||agent.codex_name===requested);if(selected!==void 0)return selected.id;const available=catalog.agents.flatMap(agent=>[agent.id,agent.codex_name]).sort().join(", ");throw new UsageError(`Unknown Agent "${requested}". Use one of: ${available}; omit --agent to use fallback "${fallback}"`)}async function resolveRunAgentName(filesystem,agentId){if(agentId==="codex")return"codex";if(!agentId.startsWith("agent-"))return agentId;const catalog=await loadAgentCatalog(filesystem);return catalog.agents.find(agent=>agent.id===agentId)?.codex_name??null}var RunAttributionV2Error=class extends Error{name="RunAttributionV2Error"};async function validateRunV2Attribution(input,repositories){const entrypointId={conversation:input.conversationId,task:input.taskId,spec:input.specId,prd:input.prdId}[input.entrypoint];if(entrypointId===void 0||entrypointId===null){throw new RunAttributionV2Error(`${input.entrypoint} entrypoint requires its scope id`)}if(input.entrypoint==="conversation"&&[input.taskId,input.specId,input.prdId,input.changeId].some(value=>value!==void 0&&value!==null)){throw new RunAttributionV2Error("Conversation entrypoint cannot claim a delivery lifecycle ancestor")}const execution=await optionalRead(input.executionId,"Execution",id=>repositories.executions.read(id));const task=await optionalRead(input.taskId,"Task",id=>repositories.tasks.read(id));const change=await optionalRead(input.changeId,"Change",id=>repositories.changes.read(id));const spec=await optionalRead(input.specId,"SPEC",id=>repositories.specs.read(id));await optionalRead(input.prdId,"PRD",id=>repositories.prds.read(id));if(input.phase==="execution"&&execution===null){throw new RunAttributionV2Error("Execution phase requires an existing Execution")}if(input.phase==="execution"&&execution!==null&&!new Set(["running","verifying"]).has(execution.execution.status)){throw new RunAttributionV2Error(`Execution ${execution.execution.id} is not running or verifying`)}if(task!==null){if(change!==null&&task.task.change_id!==change.change.id){throw new RunAttributionV2Error(`Task ${task.task.id} does not resolve to the attributed Change`)}if(input.phase==="execution"&&change===null){throw new RunAttributionV2Error(`Execution Run for Task ${task.task.id} requires its materialized Change`)}if(input.phase==="execution"&&execution===null){throw new RunAttributionV2Error(`Task ${task.task.id} attribution requires an Execution`)}if(input.phase==="execution"&&!new Set(["executing","verifying"]).has(task.task.status)){throw new RunAttributionV2Error(`Task ${task.task.id} is not executing or verifying`)}if(execution!==null&&execution.execution.origin.type!=="interaction"&&execution.execution.plan_hash!==null){const node=execution.execution.dag.nodes.find(candidate=>candidate.task_id===task.task.id);if(node===void 0||node.change_id!==task.task.change_id){throw new RunAttributionV2Error(`Execution ${execution.execution.id} does not own Task ${task.task.id} and Change ${task.task.change_id}`)}}}if(change!==null&&task===null&&execution!==null&&execution.execution.origin.type!=="interaction"&&execution.execution.plan_hash!==null){const ownsChange=execution.execution.dag.nodes.some(candidate=>candidate.change_id===change.change.id);if(!ownsChange){throw new RunAttributionV2Error(`Execution ${execution.execution.id} does not contain Change ${change.change.id}`)}}if(spec!==null&&input.prdId!==void 0&&input.prdId!==null&&spec.spec.prd_id!==input.prdId){throw new RunAttributionV2Error(`SPEC ${spec.spec.id} does not belong to PRD ${input.prdId}`)}if(execution!==null){const origin=execution.execution.origin;if(origin.type==="interaction"&&origin.conversation_id!==input.conversationId){throw new RunAttributionV2Error(`Interaction Execution ${execution.execution.id} belongs to another Conversation`)}if(origin.type==="spec"&&origin.spec_id!==input.specId){throw new RunAttributionV2Error(`Execution ${execution.execution.id} requires SPEC ${origin.spec_id}, not ${input.specId??"none"}`)}if(origin.type==="prd"&&origin.prd_id!==input.prdId){throw new RunAttributionV2Error(`Execution ${execution.execution.id} requires PRD ${origin.prd_id}, not ${input.prdId??"none"}`)}if(origin.type==="task"&&origin.task_id!==input.taskId){throw new RunAttributionV2Error(`Task-first Execution ${execution.execution.id} requires Task ${origin.task_id}, not ${input.taskId??"none"}`)}}if(change!==null){if(input.phase==="execution"&&!new Set(["executing","verifying"]).has(change.change.status)){throw new RunAttributionV2Error(`Change ${change.change.id} is not executing or verifying`)}const source=change.change.source;if(source.type==="spec"&&input.specId!==source.spec_id){throw new RunAttributionV2Error(`Change ${change.change.id} belongs to SPEC ${source.spec_id}, not ${input.specId??"none"}`)}if(source.type==="prd"&&input.prdId!==source.prd_id){throw new RunAttributionV2Error(`Change ${change.change.id} belongs to PRD ${source.prd_id}, not ${input.prdId??"none"}`)}if(source.type==="task"&&task!==null&&source.task_id!==task.task.id){throw new RunAttributionV2Error(`Task-first Change ${change.change.id} belongs to ${source.task_id}, not ${task.task.id}`)}}for(const[relationship,relatedId]of[["parent",input.parentRunId],["continuation",input.continuationOfRunId],["retry",input.retryOfRunId]]){if(relatedId===void 0||relatedId===null)continue;const related=await requiredRead(relatedId,`${relationship} Run`,id=>repositories.runs.read(id));if(related.run.conversation_id!==input.conversationId){throw new RunAttributionV2Error(`${relationship} Run ${relatedId} belongs to another Conversation`)}if(relationship==="retry"&&related.run.task_id!==(input.taskId??null)){throw new RunAttributionV2Error(`Retry Run ${relatedId} belongs to another Task`)}}}async function optionalRead(id,label,read){return id===void 0||id===null?null:requiredRead(id,label,read)}async function requiredRead(id,label,read){try{return await read(id)}catch(error51){throw new RunAttributionV2Error(`${label} does not resolve: ${id} (${error51 instanceof Error?error51.message:String(error51)})`)}}function conversationRequestOptions(userMessage){const objective=conversationObjective(userMessage);return{objective,risk:inferredConversationRisk(objective)}}function resolveConversationIntent(parsed){const value=parsed.options.intent;if(value===void 0){return hasCompleteNewWorkMetadata(parsed)?"new_work":"conversation"}const normalized=value.toLocaleLowerCase().replaceAll("-","_");if(normalized==="conversation"||normalized==="continue"||normalized==="refine"||normalized==="rework"||normalized==="new_work"||normalized==="git_only"){return normalized}throw new UsageError("--intent must be conversation, continue, refine, rework, new-work, or git-only")}function intakeDecision(parsed,intent){const intentWasProvided=parsed.options.intent!==void 0;const explicitMetadata=!intentWasProvided&&hasCompleteNewWorkMetadata(parsed);const source=parsed.options["classification-source"];const classificationSource=source===void 0?intentWasProvided?"agent":explicitMetadata?"explicit":"fallback":source;if(!new Set(["agent","explicit","fallback"]).has(classificationSource)){throw new UsageError("--classification-source must be agent, explicit, or fallback")}const defaultConfidence=classificationSource==="fallback"?"0":"0.9";const reasonCodes=csvOption(parsed.options["reason-codes"]);return{intent,classification_source:classificationSource,confidence:confidenceOption(parsed.options.confidence??defaultConfidence),reason_codes:reasonCodes.length>0?reasonCodes:[classificationSource==="fallback"?"safe-conversation-fallback":explicitMetadata?"complete-task-metadata":"agent-classified"]}}function requireSemanticNewWorkMetadata(parsed){const title=parsed.options.title;const shortName=parsed.options["short-name"];const objective=parsed.options.objective;if(title===void 0||shortName===void 0||objective===void 0){throw new UsageError("new-work intake requires --title, --short-name, and --objective")}const wordCount=title.trim().split(/\s+/).filter(Boolean).length;if(wordCount<4||wordCount>10){throw new UsageError("new-work --title must contain 4 to 10 words")}return{title:title.trim(),shortName:shortName.trim(),objective:objective.trim()}}function describesEquivalentWork(requested,current){const requestedShortName=normalizeWorkKey(requested.shortName);if(requestedShortName.length>0&&requestedShortName===normalizeWorkKey(current.short_name)){return true}const requestedTerms=semanticTerms(`${requested.title} ${requested.objective}`);const currentTerms=semanticTerms(`${current.title} ${current.objective}`);if(requestedTerms.size<5||currentTerms.size<5)return false;let shared=0;for(const term of requestedTerms){if(currentTerms.has(term))shared+=1}return shared>=5&&shared/Math.min(requestedTerms.size,currentTerms.size)>=.7}async function findIntakeForExactTurn(composition,client,invocation){if(invocation.clientThreadId===null||invocation.clientTurnId===null)return null;const matches=(await composition.runs.list()).filter(fold=>fold.run.client===client&&(fold.run.intake!=null||fold.run.phase==="conversation"&&fold.run.execution_id===null)&&fold.run.client_thread_id===invocation.clientThreadId&&fold.run.client_turn_id===invocation.clientTurnId);if(matches.length>1){throw new UsageError(`Exact client turn already has multiple intake Runs: ${matches.map(fold=>fold.run.run_id).join(", ")}`)}return matches[0]??null}async function latestThreadContext(composition,client,clientThreadId){if(clientThreadId===null)return{conversationId:null,implicitTarget:null};const runs=(await composition.runs.list()).filter(fold=>fold.run.client===client&&fold.run.client_thread_id===clientThreadId);const targetRun=runs.find(fold=>fold.run.task_id!==null||fold.run.spec_id!==null||fold.run.prd_id!==null);return{conversationId:runs[0]?.run.conversation_id??null,implicitTarget:targetRun===void 0?null:targetFromRun(targetRun)}}function explicitIntakeTarget(parsed){const candidates=[parsed.options.task===void 0?null:{entrypoint:"task",taskId:parsed.options.task},parsed.options.spec===void 0?null:{entrypoint:"spec",specId:parsed.options.spec},parsed.options.prd===void 0?null:{entrypoint:"prd",prdId:parsed.options.prd}];const targets=candidates.filter(target=>target!==null);if(targets.length>1){throw new UsageError("continue/refine/rework intake accepts only one of --task, --spec, or --prd")}return targets[0]??null}function isImplicitConversationCapture(parsed){return["intent","title","short-name","objective","requirements","acceptance","task","spec","prd","change","run"].every(option=>parsed.options[option]===void 0)}function isGitOnlyPublicationRequest(userMessage){if(userMessage===null)return false;const normalized=userMessage.normalize("NFKD").replace(/[\u0300-\u036f]/g,"").toLocaleLowerCase().replace(/[^a-z0-9]+/g," ").trim();if(normalized.length===0||normalized.split(/\s+/).length>12)return false;if(/\b(corrig|consert|repar|fix|falh|erro|ci|teste|codigo|implement|alter|qual|quando|como|status|atual)\w*\b/.test(normalized)){return false}return/\b(deploy|push|publicar|publique|publica|publish)\b/.test(normalized)}function hasCompleteNewWorkMetadata(parsed){return["title","short-name","objective"].every(option=>parsed.options[option]!==void 0)}var semanticStopWords=new Set(["a","an","and","as","at","by","com","da","das","de","do","dos","e","em","for","from","in","into","na","nas","no","nos","of","on","or","para","per","por","que","that","the","this","to","um","uma","with"]);function semanticTerms(value){return new Set(normalizeWorkKey(value).split(" ").map(term=>singularizeSemanticTerm(term)).filter(term=>term.length>=3&&!semanticStopWords.has(term)))}function normalizeWorkKey(value){return value.normalize("NFKD").replace(/[\u0300-\u036f]/g,"").toLocaleLowerCase().replace(/[^a-z0-9]+/g," ").trim()}function singularizeSemanticTerm(term){if(term.length>4&&term.endsWith("s")&&!term.endsWith("ss"))return term.slice(0,-1);return term}function targetFromRun(fold){if(fold.run.task_id!==null)return{entrypoint:"task",taskId:fold.run.task_id};if(fold.run.spec_id!==null)return{entrypoint:"spec",specId:fold.run.spec_id};if(fold.run.prd_id!==null)return{entrypoint:"prd",prdId:fold.run.prd_id};return null}function conversationObjective(userMessage){const fallback="Capture the current client turn";if(userMessage===null)return fallback;const normalized=userMessage.replace(/\r\n?/g,"\n").trim();const requestHeading=/^##\s+My request for Codex:\s*$/im;const match=requestHeading.exec(normalized);const request=match===null?normalized:normalized.slice(match.index+match[0].length);return request.replace(/<image\b[\s\S]*$/i,"").replace(/\s+/g," ").trim()||fallback}function inferredConversationRisk(objective){const normalized=objective.normalize("NFKD").replace(/[\u0300-\u036f]/g,"").toLocaleLowerCase();const isSmallFrontendAdjustment=normalized.length<=280&&/\b(ajust|corrig|alter|troqu|mud)\w*\b/.test(normalized)&&/\b(front(?:end)?|interface|ui|visual|css|layout|tela|botao|modal|popup|coluna|aba|card)\w*\b/.test(normalized);const hasElevatedScope=/\b(api|backend|banco|database|schema|migr|auth|segur|deploy|infra|lifecycle|task-first|cli)\w*\b/.test(normalized);return isSmallFrontendAdjustment&&!hasElevatedScope?"lite":"standard"}async function recordCodexTelemetryIfAvailable(current,composition,filesystem){if(current.effective_usage_records.length>0||!isCodexTelemetryClient(current.run.client)||current.run.client_thread_id===null&¤t.run.client_turn_id===null){return current}return composition.runs.withUsageAttributionLock(async()=>{const freshCurrent=await composition.runs.read(current.run.run_id);if(freshCurrent.finished!==null||freshCurrent.effective_usage_records.length>0){return freshCurrent}const allRuns=await composition.runs.list();const exactTurn=freshCurrent.run.client_turn_id??null;const telemetryThreadId=telemetrySourceThreadId(freshCurrent,allRuns);const existingSegmentKeys=new Set(allRuns.flatMap(fold=>fold.effective_usage_records.flatMap(record2=>record2.source_segment_key?[record2.source_segment_key]:[])));const candidate=await findLatestCodexSegment(filesystem.root,exactTurn===null?existingSegmentKeys:new Set,{startedAfter:freshCurrent.run.occurred_at,threadId:telemetryThreadId,turnId:exactTurn});const timestamp9=Date.parse(candidate?.finishedAt??candidate?.startedAt??"");if(candidate===null||!Number.isFinite(timestamp9)||!(exactTurn!==null&&candidate.turnId===exactTurn||timestamp9>=Date.parse(freshCurrent.run.occurred_at))){return freshCurrent}const cumulative=aggregateSegmentUsage(candidate);const previous=allRuns.filter(fold=>fold.run.run_id!==freshCurrent.run.run_id&&exactTurn!==null&&fold.run.client_turn_id===exactTurn).flatMap(fold=>fold.effective_usage_records).filter(record2=>record2.source_segment_key===candidate.segmentKey||record2.source_segment_key?.startsWith(`${candidate.segmentKey}@`)===true).reduce((total,record2)=>({input:total.input+(record2.tokens.input??0),cached_input:total.cached_input+(record2.tokens.cached_input??0),output:total.output+(record2.tokens.output??0),reasoning:total.reasoning+(record2.tokens.reasoning??0)}),{input:0,cached_input:0,output:0,reasoning:0});const input=Math.max(0,(cumulative.input??0)-previous.input);const output2=Math.max(0,(cumulative.output??0)-previous.output);const tokens={input,cached_input:Math.max(0,(cumulative.cached_input??0)-previous.cached_input),output:output2,reasoning:Math.max(0,(cumulative.reasoning??0)-previous.reasoning),total:input+output2,source:"provider_reported"};if(tokens.input===0&&tokens.cached_input===0&&tokens.output===0&&tokens.reasoning===0){return freshCurrent}const model=candidate.model??freshCurrent.run.model;const provider=inferProvider(model,freshCurrent.run.provider??freshCurrent.run.client,freshCurrent.run.agent);const pricing=new PricingRepository(filesystem);const estimated=estimateUsageCost({provider,model,usage:tokens,catalog:await pricing.readCatalog(),fxRate:await pricing.readLatestFxRate()});const sequence=freshCurrent.records.length+1;const usage=usageRecordedV2Schema.parse({schema_version:2,event_id:`${freshCurrent.run.run_id}:${String(sequence).padStart(6,"0")}`,run_id:freshCurrent.run.run_id,sequence,occurred_at:new Date().toISOString(),type:"usage.recorded",phase:latestPhase(freshCurrent),activity_kind:"implementation",classification_source:"current_context",tokens,cost:{usd:estimated.estimated_usd,brl:estimated.estimated_brl,fx_rate:estimated.fx_rate},provider,model,source_segment_key:exactTurn===null?candidate.segmentKey:`${candidate.segmentKey}@${freshCurrent.run.run_id}`,runtime:{reasoning_effort:candidate.reasoningEffort??null,service_tier:candidate.serviceTier??null},supersedes_event_id:null,source_occurred_at:candidate.finishedAt??candidate.startedAt??void 0});await composition.runs.appendRecord(usage);return foldRunV2Records([...freshCurrent.records,usage])})}function isCodexTelemetryClient(client){return["codex","codex-desktop","codex-subagent"].includes(client)}function telemetrySourceThreadId(current,allRuns){const runsById=new Map(allRuns.map(fold=>[fold.run.run_id,fold]));let run=current.run;const visited=new Set;while(run.parent_run_id!==null&&!visited.has(run.run_id)){visited.add(run.run_id);const parent=runsById.get(run.parent_run_id);if(parent===void 0)break;run=parent.run}return run.client_thread_id??current.run.client_thread_id??null}function latestPhase(current){const latest=current.records.findLast(record2=>"phase"in record2);return latest?.phase??"conversation"}async function resolveRunClientInvocation(filesystem,client,options={}){if(!new Set(["codex","codex-desktop"]).has(client)){return{clientThreadId:null,clientTurnId:null,userMessage:null}}const threadId=normalizedId(options.threadId??process.env.CODEX_THREAD_ID);const turnId=normalizedId(options.turnId??process.env.CODEX_TURN_ID);if(threadId!==null&&turnId!==null){return{clientThreadId:threadId,clientTurnId:turnId,userMessage:null}}const active=await findActiveCodexInvocation(filesystem.root,{threadId,...options.sessionsRoot===void 0?{}:{sessionsRoot:options.sessionsRoot},...options.now===void 0?{}:{now:options.now}});return{clientThreadId:threadId??active?.sessionId??null,clientTurnId:turnId??active?.turnId??null,userMessage:active?.userMessage??null}}function normalizedId(value){const normalized=value?.trim();return normalized===void 0||normalized.length===0?null:normalized}function activeDescendantRuns(rootRunId,candidates){const descendants=[];const parentIds=new Set([rootRunId]);let discovered=true;while(discovered){discovered=false;for(const candidate of candidates){if(candidate.run.parent_run_id!==null&&parentIds.has(candidate.run.parent_run_id)&&!parentIds.has(candidate.run.run_id)){parentIds.add(candidate.run.run_id);descendants.push(candidate);discovered=true}}}return descendants.filter(candidate=>candidate.finished===null)}function assessRunFinalizationBarrier(parent,candidates){const required2=runV2RequiresFinalizer(parent.run);if(!required2){return{required:false,status:"not_required",finalizer_run_id:null,satisfied:true}}const finalizer=directFinalizers(parent.run.run_id,candidates).at(-1);if(finalizer===void 0){return{required:true,status:"missing",finalizer_run_id:null,satisfied:false}}const status=finalizer.status;return{required:true,status,finalizer_run_id:finalizer.run.run_id,satisfied:status==="completed"}}function assertChildRunMayStart(parent,purpose,agent,candidates,executionEligibility=[]){if(parent.finished!==null)throw new Error(`Parent Run is already finished: ${parent.run.run_id}`);const crossedBarrier=ancestorLineage(parent,candidates).find(ancestor=>directFinalizers(ancestor.run.run_id,candidates).length>0);if(crossedBarrier!==void 0){throw new Error(`Run ${crossedBarrier.run.run_id} crossed its finalization barrier; no new Sub-Run may start`)}const executionKind=parent.run.execution_kind;if(purpose==="execution"&&(executionKind===void 0||!executionEligibility.includes(executionKind))){throw new Error(`Agent ${agent} lacks an execution capability for Run ${parent.run.run_id}`)}if(purpose==="finalization"&&agent!=="agent-execution-finalizer"){throw new Error(`Finalizer for Run ${parent.run.run_id} requires agent-execution-finalizer`)}if(purpose!=="finalization")return;if(effectiveRunV2Role(parent.run)==="orchestrator"&&directExecutors(parent.run.run_id,executionKind,candidates).length===0){throw new Error(`Finalizer for Execution Run ${parent.run.run_id} requires a prior capable executor Sub-Run`)}const active=activeDescendantRuns(parent.run.run_id,candidates);if(active.length>0){throw new Error(`Finalizer for Run ${parent.run.run_id} must be the last Sub-Run; active descendants: ${active.map(run=>run.run.run_id).join(", ")}`)}}function directExecutors(parentRunId,executionKind,candidates){return candidates.filter(candidate=>candidate.run.parent_run_id===parentRunId&&effectiveRunV2Purpose(candidate.run)==="execution"&&(executionKind!==void 0&&candidate.run.execution_eligibility?.includes(executionKind)===true||executionKind===void 0&&candidate.run.execution_eligibility===void 0&&candidate.run.agent==="agent-task-executor")&&candidate.run.agent!=="agent-execution-finalizer")}function ancestorLineage(parent,candidates){const byId2=new Map(candidates.map(candidate=>[candidate.run.run_id,candidate]));const lineage=[];const visited=new Set;let current=parent;while(current!==void 0&&!visited.has(current.run.run_id)){lineage.push(current);visited.add(current.run.run_id);current=current.run.parent_run_id===null?void 0:byId2.get(current.run.parent_run_id)}return lineage}function directFinalizers(parentRunId,candidates){return candidates.filter(candidate=>candidate.run.parent_run_id===parentRunId&&effectiveRunV2Purpose(candidate.run)==="finalization"&&(candidate.run.agent==="agent-execution-finalizer"||candidate.run.agent==="agent-task-finalizer")).sort((left,right)=>left.run.occurred_at.localeCompare(right.run.occurred_at))}async function assessRunLifecycleClosure(current,composition,candidateRuns){const role=effectiveRunV2Role(current.run);if(role==="intake"||role==="subagent"){return emptyClosure(current.run.run_id)}const subjects=(await Promise.all(current.run.entrypoint==="task"?[subject("task",current.run.task_id,composition,role,current)]:[subject("spec",current.run.spec_id,composition,role,current),subject("prd",current.run.prd_id,composition,role,current)])).filter(item=>item!==null);void candidateRuns;const openSubjectIds=subjects.filter(item=>!item.settled).map(item=>item.id);const status=subjects.length===0?"not_applicable":openSubjectIds.length===0?"closed":"action_required";return{status,run_id:current.run.run_id,continuation_run_id:null,subjects,open_subject_ids:openSubjectIds,default_inconclusive_outcome:"blocked",allowed_terminal_outcomes:["completed","blocked","failed","cancelled"],guidance:status==="action_required"?"Start an attributed continuation Run or settle every related work item; use blocked by default, failed only for an execution-preventing error, and cancelled only after an explicit user cancellation.":"Run lifecycle closure is satisfied."}}async function subject(kind,id,composition,role,current){if(id===null)return null;try{const status=kind==="task"?(await composition.tasks.read(id)).task.status:kind==="spec"?(await composition.specs.read(id)).spec.status:(await composition.prds.read(id)).prd.status;return{kind,id,status,settled:isSettled(kind,status,role,current)}}catch{return{kind,id,status:"missing",settled:false}}}function isSettled(kind,status,role,current){if(kind==="task")return["completed","blocked","failed","cancelled"].includes(status);if(role==="orchestrator"&¤t.finished?.status==="completed")return status!=="missing";return["delivered","blocked","failed","cancelled"].includes(status)}function emptyClosure(runId){return{status:"not_applicable",run_id:runId,continuation_run_id:null,subjects:[],open_subject_ids:[],default_inconclusive_outcome:"blocked",allowed_terminal_outcomes:["completed","blocked","failed","cancelled"],guidance:"Run lifecycle closure is satisfied."}}function lifecycleReconciliationOutcome(value){if(value===void 0)return void 0;if(value==="completed"||value==="blocked"||value==="failed"||value==="cancelled"){return value}throw new Error("--task-outcome must be completed, blocked, failed, or cancelled")}function lifecycleOutcomeOption(options){if(options["owner-outcome"]!==void 0){throw new Error("Legacy lifecycle outcome option is no longer supported; use --task-outcome")}return lifecycleReconciliationOutcome(options["task-outcome"])}var SETTLEABLE_TASK=new Set(["draft","planned","executing","verifying"]);var SETTLEABLE_CHANGE=new Set(["planned","executing","verifying"]);var SETTLEABLE_EXECUTION=new Set(["planned","running","paused","verifying"]);function isTaskAttemptRun(current){return effectiveRunV2Role(current.run)==="orchestrator"&¤t.run.parent_run_id===null&¤t.run.entrypoint==="task"}async function reconcileFinishedRunLifecycle(current,composition,lifecycle,options={}){if(current.finished===null)throw new Error(`Run is still running: ${current.run.run_id}`);const role=effectiveRunV2Role(current.run);if(role==="intake"||role==="subagent"){return emptyResult(current.run.run_id,"not_applicable")}if(current.run.execution_id!==null){const execution=await composition.executions.read(current.run.execution_id).catch(()=>null);if(execution?.execution.kind==="interaction"){return emptyResult(current.run.run_id,"not_applicable")}}if(options.defer===true){throw new Error(`Orchestrator Run closure cannot be deferred for Run ${current.run.run_id}`)}const closure=await assessRunLifecycleClosure(current,composition,options.candidateRuns);if(closure.status==="not_applicable")return emptyResult(current.run.run_id,"not_applicable");const catalog=options.catalog??await loadCatalog(composition);const graph=relatedGraph(current,catalog);const requested=resolveOutcome(current,graph.tasks,options.requestedOutcome);if(requested==="completed"){try{const completed=await completeGraph(current,graph,composition,lifecycle,options);return{...completed,status:"closed",outcome:"completed"}}catch(error51){const message=error51 instanceof Error?error51.message:String(error51);const blocked=await settleGraph(current,await refreshGraph(graph,composition),composition,lifecycle,"blocked",`Completion gates did not close Run ${current.run.run_id}: ${message}`);return{...blocked,status:"closed",outcome:"blocked",fallback_from:"completed",error:message}}}const settled=await settleGraph(current,graph,composition,lifecycle,requested,options.summary===void 0?defaultReason(current.run.run_id,requested):`${options.summary} (Run ${current.run.run_id}).`);return{...settled,status:"closed",outcome:requested}}async function snapshotRunLifecycle(current,composition,catalog){const role=effectiveRunV2Role(current.run);if(role==="intake"||role==="subagent"){return emptyResult(current.run.run_id,"not_applicable")}const graph=relatedGraph(current,catalog??await loadCatalog(composition));return currentGraphResult(current.run.run_id,await refreshGraph(graph,composition))}function resolveOutcome(current,tasks,requested){if(current.finished?.status==="failed")return"failed";if(current.finished?.status==="cancelled")return"cancelled";if(requested!==void 0)return requested;if(!isTaskAttemptRun(current))return"completed";const terminal=tasks.find(task=>["completed","blocked","failed","cancelled"].includes(task.status))?.status;return terminal==="completed"||terminal==="blocked"||terminal==="failed"||terminal==="cancelled"?terminal:"blocked"}async function completeGraph(current,graph,composition,lifecycle,options){const summary=options.summary??`Run ${current.run.run_id} completed.`;const result2={summary,changed_files:[...options.changedFiles??[]],evidence_ids:[...options.evidenceIds??[]],completed_run_id:current.run.run_id};const taskAttempt=isTaskAttemptRun(current);if(taskAttempt){for(const task of graph.tasks){let latest=(await composition.tasks.read(task.id)).task;if(latest.status==="executing")latest=await composition.tasks.transition(task.id,"verifying");if(latest.status==="verifying")await lifecycle.completeTask(task.id,result2)}}else{const unfinished=graph.tasks.filter(task=>task.status!=="completed");if(unfinished.some(task=>["draft","planned","executing","verifying"].includes(task.status))){await keepMacroParentsActive(graph,composition);return currentGraphResult(current.run.run_id,await refreshGraph(graph,composition))}if(unfinished.length>0){throw new Error(`Macro Tasks did not complete: ${unfinished.map(task=>task.id).join(", ")}`)}}for(const change of graph.changes){let latest=(await composition.changes.read(change.id)).change;const relatedTasks=await Promise.all(latest.task_ids.map(async id=>(await composition.tasks.read(id)).task));if(relatedTasks.some(task=>task.status!=="completed"))continue;if(latest.status==="executing"){await lifecycle.verifyChange(change.id);latest=(await composition.changes.read(change.id)).change}if(latest.status==="verifying")await lifecycle.completeChange(change.id,summary)}for(const execution of graph.executions){let latest=(await composition.executions.read(execution.id)).execution;const relatedTasks=await Promise.all(latest.dag.nodes.map(async node=>(await composition.tasks.read(node.task_id)).task));if(relatedTasks.some(task=>task.status!=="completed"))continue;if(latest.status==="running"){await lifecycle.verifyExecution(execution.id);latest=(await composition.executions.read(execution.id)).execution}if(latest.status==="verifying")await lifecycle.completeExecution(execution.id,summary)}if(!taskAttempt){for(const spec of graph.specs.filter(item=>graph.directSpecIds.has(item.id))){if((await composition.specs.read(spec.id)).spec.status==="active")await lifecycle.deliverSpec(spec.id)}for(const prd of graph.prds.filter(item=>graph.directPrdIds.has(item.id))){if((await composition.prds.read(prd.id)).prd.status==="active")await lifecycle.deliverPrd(prd.id)}}else{await aggregateMacroAncestors(graph,composition)}const refreshed=await refreshGraph(graph,composition);assertGraphCompleted(refreshed,taskAttempt);return currentGraphResult(current.run.run_id,refreshed)}function assertGraphCompleted(graph,taskAttempt){const incomplete=[...graph.tasks.filter(item=>item.status!=="completed").map(item=>item.id),...!taskAttempt?graph.changes.filter(item=>item.status!=="completed").map(item=>item.id):[],...!taskAttempt?graph.executions.filter(item=>item.status!=="completed").map(item=>item.id):[],...graph.specs.filter(item=>!taskAttempt&&graph.directSpecIds.has(item.id)&&item.status!=="delivered").map(item=>item.id),...graph.prds.filter(item=>!taskAttempt&&graph.directPrdIds.has(item.id)&&item.status!=="delivered").map(item=>item.id)];if(incomplete.length>0){throw new Error(`Completion left related work non-terminal: ${incomplete.join(", ")}`)}}async function settleGraph(current,graph,composition,lifecycle,outcome,reason){const clock=new SystemClock;const taskAttempt=isTaskAttemptRun(current);const taskResult=outcome==="blocked"?null:{summary:reason,changed_files:[],evidence_ids:[],completed_run_id:current.run.run_id};for(const task of graph.tasks){if(SETTLEABLE_TASK.has((await composition.tasks.read(task.id)).task.status)){await composition.tasks.transition(task.id,outcome,taskResult,clock,reason)}}const standalone=graph.executions.some(execution=>execution.origin.type==="task");for(const change of taskAttempt&&!standalone?[]:graph.changes){if(SETTLEABLE_CHANGE.has((await composition.changes.read(change.id)).change.status)){await composition.changes.transition(change.id,outcome,outcome==="blocked"?null:reason,clock,reason)}}for(const execution of taskAttempt&&!standalone?[]:graph.executions){if(SETTLEABLE_EXECUTION.has((await composition.executions.read(execution.id)).execution.status)){await composition.executions.transition(execution.id,outcome,outcome==="blocked"?null:reason,clock,reason)}}const specIdsToSettle=new Set(taskAttempt?[]:specIdsForLifecycleSettlement(graph.specs.map(item=>item.id),graph.directSpecIds,graph.directPrdIds));const specsToSettle=graph.specs.filter(item=>specIdsToSettle.has(item.id));for(const spec of specsToSettle){if(outcome==="cancelled"&&graph.directPrdIds.size>0)break;if((await composition.specs.read(spec.id)).spec.status==="active"){if(outcome==="cancelled")await lifecycle.cancelSpec(spec.id);else await composition.specs.transition(spec.id,outcome,reason)}}for(const prd of graph.prds.filter(item=>!taskAttempt&&graph.directPrdIds.has(item.id))){if((await composition.prds.read(prd.id)).prd.status==="active"){if(outcome==="cancelled")await lifecycle.cancelPrd(prd.id);else await composition.prds.transition(prd.id,outcome,reason)}}if(taskAttempt&&!standalone)await aggregateMacroAncestors(graph,composition);return currentGraphResult(current.run.run_id,await refreshGraph(graph,composition))}function relatedGraph(current,catalog){const{tasks,changes,executions,specs,prds}=catalog;const taskIds=new Set(current.run.task_id===null?[]:[current.run.task_id]);const changeIds=new Set(current.run.change_id===null?[]:[current.run.change_id]);const executionIds=new Set(current.run.execution_id===null?[]:[current.run.execution_id]);const specIds=new Set(current.run.spec_id===null?[]:[current.run.spec_id]);const prdIds=new Set(current.run.prd_id===null?[]:[current.run.prd_id]);const taskAttempt=isTaskAttemptRun(current);if(!taskAttempt){for(const spec of specs)if(spec.prd_id!==null&&prdIds.has(spec.prd_id))specIds.add(spec.id)}for(const change of changes){const source=change.source;if(changeIds.has(change.id)||source.type==="task"&&taskIds.has(source.task_id)||!taskAttempt&&source.type==="spec"&&specIds.has(source.spec_id)||!taskAttempt&&source.type==="prd"&&prdIds.has(source.prd_id))changeIds.add(change.id)}for(const task of tasks){if(taskIds.has(task.id)||!taskAttempt&&changeIds.has(task.change_id)){taskIds.add(task.id)}}for(const execution of executions){if(executionIds.has(execution.id)||execution.dag.nodes.some(node=>taskIds.has(node.task_id))){executionIds.add(execution.id)}}return{tasks:tasks.filter(item=>taskIds.has(item.id)),changes:changes.filter(item=>changeIds.has(item.id)),executions:executions.filter(item=>executionIds.has(item.id)),specs:specs.filter(item=>specIds.has(item.id)),prds:prds.filter(item=>prdIds.has(item.id)),directSpecIds:new Set(current.run.spec_id===null?[]:[current.run.spec_id]),directPrdIds:new Set(current.run.prd_id===null?[]:[current.run.prd_id])}}async function keepMacroParentsActive(graph,composition){for(const spec of graph.specs){const latest=(await composition.specs.read(spec.id)).spec;if(latest.status==="ready"||latest.status==="blocked"){await composition.specs.transition(latest.id,"active")}}for(const prd of graph.prds){const latest=(await composition.prds.read(prd.id)).prd;if(latest.status==="ready"||latest.status==="blocked"){await composition.prds.transition(latest.id,"active")}}}async function aggregateMacroAncestors(graph,composition){await keepMacroParentsActive(graph,composition)}async function loadCatalog(composition){const[tasks,changes,executions,specs,prds]=await Promise.all([composition.tasks.list(),composition.changes.list(),composition.executions.list(),composition.specs.list(),composition.prds.list()]);return{tasks,changes,executions,specs,prds}}async function refreshGraph(graph,composition){const[tasks,changes,executions,specs,prds]=await Promise.all([Promise.all(graph.tasks.map(async item=>(await composition.tasks.read(item.id)).task)),Promise.all(graph.changes.map(async item=>(await composition.changes.read(item.id)).change)),Promise.all(graph.executions.map(async item=>(await composition.executions.read(item.id)).execution)),Promise.all(graph.specs.map(async item=>(await composition.specs.read(item.id)).spec)),Promise.all(graph.prds.map(async item=>(await composition.prds.read(item.id)).prd))]);return{...graph,tasks,changes,executions,specs,prds}}function currentGraphResult(runId,graph){return{run_id:runId,status:"closed",outcome:null,fallback_from:null,error:null,tasks:graph.tasks,changes:graph.changes,executions:graph.executions,specs:graph.specs,prds:graph.prds}}function emptyResult(runId,status){return{run_id:runId,status,outcome:null,fallback_from:null,error:null,tasks:[],changes:[],executions:[],specs:[],prds:[]}}function specIdsForLifecycleSettlement(specIds,directSpecIds,directPrdIds){return directPrdIds.size>0?[...specIds]:specIds.filter(id=>directSpecIds.has(id))}function defaultReason(runId,outcome){if(outcome==="failed")return`Run ${runId} failed and closed its operational lifecycle.`;if(outcome==="cancelled")return`Run ${runId} was explicitly cancelled.`;return`Run ${runId} completed without sufficient closure gates and has no concrete continuation.`}async function runConversationV2Command(action,parsed,composition,filesystem,lifecycle){if(action==="start"){const client=parsed.options.client??"codex";const clientInvocation=await resolveRunClientInvocation(filesystem,client);const requestedIntent=resolveConversationIntent(parsed);if(requestedIntent==="git_only"||isImplicitConversationCapture(parsed)&&isGitOnlyPublicationRequest(clientInvocation.userMessage)){return{skipped:true,reason:"git-only-publication",message:"Explicit deploy, push, and publication requests do not create ZAIP lifecycle records"}}const existing=await findIntakeForExactTurn(composition,client,clientInvocation);if(existing!==null){const task2=existing.run.task_id===null?null:(await composition.tasks.read(existing.run.task_id)).task;return{task:task2,run:existing.run,task_path:task2===null?null:composition.tasks.path(task2.id),run_path:composition.runs.path(existing.run.run_id),reused:true}}const request=conversationRequestOptions(clientInvocation.userMessage);const threadContext=await latestThreadContext(composition,client,clientInvocation.clientThreadId);let intent=requestedIntent;const newWorkMetadata=intent==="new_work"?requireSemanticNewWorkMetadata(parsed):null;let target=intent==="continue"||intent==="refine"||intent==="rework"?explicitIntakeTarget(parsed)??threadContext.implicitTarget:null;let decision=intakeDecision(parsed,intent);if(intent==="new_work"&&newWorkMetadata!==null&&decision.classification_source!=="explicit"&&threadContext.implicitTarget?.taskId!==void 0){const focusedTask=(await composition.tasks.read(threadContext.implicitTarget.taskId)).task;if((focusedTask.status==="draft"||focusedTask.status==="planned")&&focusedTask.started_at===null&&describesEquivalentWork(newWorkMetadata,focusedTask)){intent="continue";target=threadContext.implicitTarget;decision={intent:"continue",classification_source:"fallback",confidence:1,reason_codes:["equivalent-thread-work-reused"]}}}if((intent==="continue"||intent==="refine"||intent==="rework")&&target===null){intent="conversation";target=null;decision={intent:"conversation",classification_source:"fallback",confidence:0,reason_codes:["target-not-resolved"]}}const model=resolveConversationModel(parsed.options.model);const timeZone=composition.layout.project.timezone;const conversationId=parsed.options.conversation??threadContext.conversationId??createConversationId(intent==="new_work"?"new-work":"conversation");const clientTurnId=clientInvocation.clientTurnId??`local-${Date.now()}-${createCollisionCode(16)}`;const executionPolicy={failure_policy:"stop_on_terminal_failure",max_parallelism:1,max_operational_retries:1,max_repair_cycles_per_task:0,verification_mode:"scoped"};const commonInput=(executionId,executionKind)=>({...parsed.options.run===void 0?{}:{id:parsed.options.run},phase:conversationCapturePhase(intent),workType:runV2WorkTypeOption(intent==="rework"?"rework":parsed.options["work-type"]??"new"),client,runRole:"orchestrator",runPurpose:"orchestration",requiresFinalizer:true,executionKind,executionEligibility:[],agent:"agent-orchestrator",agentName:"zaip-agent-orchestrator",provider:parsed.options.provider??null,model,reasoningEffort:parsed.options["reasoning-effort"]===void 0?null:runV2ReasoningEffortSchema.parse(parsed.options["reasoning-effort"]),...clientInvocation,clientTurnId,conversationId,executionId,intake:decision});const openIntakes=await openThreadIntakes(composition,client,clientInvocation.clientThreadId,clientInvocation.clientTurnId);const continuationOfRunId=target===null?null:openIntakes.find(fold=>runMatchesTarget(fold,target))?.run.run_id??null;if(intent!=="new_work"){const execution=target===null?await composition.executions.createInteraction({id:parsed.options.execution??createId("EXEC",`interaction-${intent}`,{timeZone}),clientTurnId,conversationId,policy:executionPolicy}):await composition.executions.createDeliveryIntake({id:parsed.options.execution??createId("EXEC",`delivery-${intent}`,{timeZone}),clientTurnId,origin:target.taskId!==void 0?{type:"task",task_id:target.taskId}:target.specId!==void 0?{type:"spec",spec_id:target.specId}:{type:"prd",prd_id:target.prdId},policy:executionPolicy});const input={...commonInput(execution.id,execution.kind??"delivery"),shortName:parsed.options["short-name"]??intent.replaceAll("_","-"),entrypoint:target?.entrypoint??"conversation",...target?.taskId===void 0?{}:{taskId:target.taskId},...target?.specId===void 0?{}:{specId:target.specId},...target?.prdId===void 0?{}:{prdId:target.prdId},continuationOfRunId};await validateRunV2Attribution(input,composition);const writer=await composition.runs.start(input);const settledIntakes=await finishOpenThreadIntakes(openIntakes,composition,filesystem,parsed,lifecycle);const task2=input.taskId==null?null:(await composition.tasks.read(input.taskId)).task;return{task:task2,run:writer.started,settled_intakes:settledIntakes,task_path:task2===null?null:composition.tasks.path(task2.id),run_path:composition.runs.path(writer.started.run_id)}}const metadata=newWorkMetadata??requireSemanticNewWorkMetadata(parsed);const taskId=parsed.options.task??createId("TASK",metadata.shortName,{timeZone});const changeId=parsed.options.change??createId("CHG",metadata.shortName,{timeZone});const task=await composition.tasks.createDraft({id:taskId,changeId,title:metadata.title,shortName:metadata.shortName,objective:metadata.objective,risk:riskOption(parsed.options.risk??request.risk),priority:priorityOption(parsed.options.priority),owner:parsed.options.owner??null,requirementIds:csvOption(parsed.options.requirements??"REQ-WORK-001"),acceptanceIds:csvOption(parsed.options.acceptance??"AC-WORK-001-09"),dependsOn:[],writeScopes:csvOption(parsed.options["write-scopes"])});await composition.changes.createDraft({id:changeId,title:task.title,risk:task.risk,taskId:task.id,requirementIds:task.requirement_ids,acceptanceIds:task.acceptance_ids});const deliveryExecution=await composition.executions.createDeliveryIntake({id:parsed.options.execution??createId("EXEC",`delivery-${intent}`,{timeZone}),clientTurnId,origin:{type:"task",task_id:task.id},policy:executionPolicy});try{const input={...commonInput(deliveryExecution.id,"delivery"),shortName:metadata.shortName,entrypoint:"task",taskId};await validateRunV2Attribution(input,composition);const writer=await composition.runs.start(input);const settledIntakes=await finishOpenThreadIntakes(openIntakes,composition,filesystem,parsed,lifecycle);return{task,run:writer.started,settled_intakes:settledIntakes,task_path:composition.tasks.path(task.id),run_path:composition.runs.path(writer.started.run_id)}}catch(error51){const message=error51 instanceof Error?error51.message:String(error51);await composition.tasks.transition(taskId,"cancelled",{summary:`Conversation Run was not created: ${message}`,changed_files:[],evidence_ids:[],completed_run_id:null});await composition.changes.transition(changeId,"cancelled",`Conversation Run was not created: ${message}`);throw error51}}if(action==="finish"){requireOptions(parsed.options,["run","summary"]);const runId=parsed.options.run;let current=await composition.runs.read(runId);if(parsed.options.task!==void 0&¤t.run.task_id!==parsed.options.task){throw new UsageError(`Run ${runId} is not attributed to Task ${parsed.options.task}`)}const candidateRuns=await composition.runs.list();const finalizationBarrier=assessRunFinalizationBarrier(current,candidateRuns);const activeChildren=activeDescendantRuns(runId,candidateRuns);if(activeChildren.length>0){throw new UsageError(`Run ${runId} cannot finish while descendant Runs are active: ${activeChildren.map(child=>child.run.run_id).join(", ")}`)}if(finalizationBarrier.required&&!finalizationBarrier.satisfied){throw new UsageError(`Run ${runId} cannot finish before its finalization barrier is satisfied: ${finalizationBarrier.status}`)}if(current.finished===null){current=await recordCodexTelemetryIfAvailable(current,composition,filesystem)}if(current.finished===null&¤t.effective_usage_records.length===0){const usage=unavailableUsageRecord(current,parsed,current.records.length+1);await composition.runs.appendRecord(usage);current=foldRunV2Records([...current.records,usage])}if(current.finished===null){await composition.runs.appendRecord(runFinishedV2Schema.parse({schema_version:2,event_id:runV2EventId(runId,current.records.length+1),run_id:runId,sequence:current.records.length+1,occurred_at:new Date().toISOString(),type:"run.finished",phase:latestRunV2Phase(current.records),status:runV2FinishStatusOption(parsed.options.status)}))}let task=current.run.task_id===null?null:(await composition.tasks.read(current.run.task_id)).task;if(parsed.flags.has("cancel-task")){if(task===null)throw new UsageError("--cancel-task requires a Run attributed to a Task");if(task.status==="draft"){task=await composition.tasks.transition(task.id,"cancelled",{summary:parsed.options.summary,changed_files:[],evidence_ids:[],completed_run_id:runId})}else if(task.status!=="cancelled"){throw new UsageError(`--cancel-task requires a draft Task, received ${task.status}`)}}const run=await composition.runs.read(runId);let interactionExecution=null;if(run.run.execution_id!==null){const currentExecution=await composition.executions.read(run.run.execution_id);if(currentExecution.execution.kind==="interaction"){interactionExecution=await completeInteractionExecution(currentExecution.execution.id,composition)}}const reconciliation=await reconcileFinishedRunLifecycle(run,composition,lifecycle,{requestedOutcome:lifecycleOutcomeOption(parsed.options),summary:parsed.options.summary,changedFiles:csvOption(parsed.options["changed-files"]),evidenceIds:csvOption(parsed.options.evidence),defer:parsed.flags.has("defer-orchestrator-closure"),candidateRuns});task=current.run.task_id===null?null:(await composition.tasks.read(current.run.task_id)).task;return{task,summary:parsed.options.summary,run:runV2Summary(run,composition),reconciliation,execution:interactionExecution,finalization_barrier:finalizationBarrier,task_path:task===null?null:composition.tasks.path(task.id),run_path:composition.runs.path(runId)}}throw new UsageError(`Unknown Conversation action: ${action??""}`)}async function completeInteractionExecution(executionId,composition){let execution=(await composition.executions.read(executionId)).execution;if(execution.status==="running"){execution=await composition.executions.transition(executionId,"verifying")}return execution.status==="verifying"?composition.executions.transition(executionId,"completed","Interaction finalized"):execution}function conversationCapturePhase(intent){return intent==="new_work"||intent==="refine"||intent==="rework"?"planning":"conversation"}function resolveConversationModel(explicitModel){return explicitModel??"unknown"}async function openThreadIntakes(composition,client,clientThreadId,currentTurnId){if(clientThreadId===null)return[];return(await composition.runs.list()).filter(fold=>fold.finished===null&&fold.run.client===client&&fold.run.client_thread_id===clientThreadId&&fold.run.parent_run_id===null&&fold.run.intake!=null&&!runV2RequiresFinalizer(fold.run)&&fold.run.client_turn_id!==currentTurnId)}async function finishOpenThreadIntakes(openIntakes,composition,filesystem,parsed,lifecycle){const settled=[];const candidateRuns=await composition.runs.list();for(const intake of openIntakes){let current=intake;current=await recordCodexTelemetryIfAvailable(current,composition,filesystem);if(current.effective_usage_records.length===0){await composition.runs.appendRecord(unavailableUsageRecord(current,parsed,current.records.length+1));current=await composition.runs.read(current.run.run_id)}await composition.runs.appendRecord(runFinishedV2Schema.parse({schema_version:2,event_id:runV2EventId(current.run.run_id,current.records.length+1),run_id:current.run.run_id,sequence:current.records.length+1,occurred_at:new Date().toISOString(),type:"run.finished",phase:latestRunV2Phase(current.records),status:"completed"}));const run=await composition.runs.read(current.run.run_id);settled.push({run,reconciliation:await reconcileFinishedRunLifecycle(run,composition,lifecycle,{candidateRuns})})}return settled}function runMatchesTarget(fold,target){return target.taskId!==void 0&&fold.run.task_id===target.taskId||target.specId!==void 0&&fold.run.spec_id===target.specId||target.prdId!==void 0&&fold.run.prd_id===target.prdId}async function recordContextPackUsage(runId,initialPackTokens,composition){const current=await composition.runs.read(runId);if(current.finished!==null)throw new UsageError(`Run V2 is already finished: ${runId}`);const sequence=current.records.length+1;await composition.runs.appendRecord(usageRecordedV2Schema.parse({schema_version:2,event_id:runV2EventId(runId,sequence),run_id:runId,sequence,occurred_at:new Date().toISOString(),type:"usage.recorded",phase:latestRunV2Phase(current.records),activity_kind:"context_build",classification_source:"current_context",tokens:{input:null,cached_input:null,output:null,reasoning:null,total:null,source:"unavailable"},cost:{usd:null,brl:null},provider:current.run.provider,model:current.run.model,source_segment_key:`context-pack:${runId}:${sequence}`,supersedes_event_id:null,source_occurred_at:new Date().toISOString(),context_stats:{initial_pack_tokens:initialPackTokens,tool_output_tokens:null,files_opened:null,snippets_opened:null}}))}function unavailableUsageRecord(current,parsed,sequence){const occurredAt=new Date().toISOString();return usageRecordedV2Schema.parse({schema_version:2,event_id:runV2EventId(current.run.run_id,sequence),run_id:current.run.run_id,sequence,occurred_at:occurredAt,type:"usage.recorded",phase:latestRunV2Phase(current.records),activity_kind:"run_finalize",classification_source:"current_context",tokens:{input:null,cached_input:null,output:null,reasoning:null,total:null,source:"unavailable"},cost:{usd:null,brl:null},provider:current.run.provider,model:current.run.model,source_segment_key:null,supersedes_event_id:null,...runUsageMetadataOptions(parsed.options,occurredAt)})}function latestRunV2Phase(records){const latest=records.findLast(record2=>"phase"in record2);return latest?.phase??"conversation"}function runV2EventId(runId,sequence){return`${runId}:${String(sequence).padStart(6,"0")}`}function runV2CostInput(fold){return{run:{run_id:fold.run.run_id,attribution_status:fold.run.attribution_status,conversation_id:fold.run.conversation_id,execution_id:fold.run.execution_id,task_id:fold.run.task_id,spec_id:fold.run.spec_id,prd_id:fold.run.prd_id,change_id:fold.run.change_id,work_type:fold.run.work_type},records:fold.records,effective_usage_records:fold.effective_usage_records}}function runV2Summary(fold,composition){const usage=aggregateRunV2Usage([runV2CostInput(fold)],fold.run.run_id).total;const callIds=new Set([...fold.model_selection_records.map(record2=>record2.invocation_id),...fold.provider_invocation_records.map(record2=>record2.invocation_id)]);return{id:fold.run.run_id,status:fold.status,created_at:fold.run.occurred_at,finished_at:fold.finished?.occurred_at??null,phase:latestRunV2Phase(fold.records),run_role:effectiveRunV2Role(fold.run),parent_run_id:fold.run.parent_run_id,entrypoint:fold.run.entrypoint,work_type:fold.run.work_type,intake:fold.run.intake??null,agent:fold.run.agent,agent_name:fold.run.agent_name??(fold.run.agent.startsWith("agent-")?`zaip-agent-${fold.run.agent.slice("agent-".length)}`:fold.run.agent),model:fold.run.model,reasoning_effort:fold.run.reasoning_effort??fold.model_selection_records[0]?.requested.reasoning_effort??null,call_count:callIds.size===0?null:callIds.size,client_thread_id:fold.run.client_thread_id??null,client_turn_id:fold.run.client_turn_id??null,conversation_id:fold.run.conversation_id,execution_id:fold.run.execution_id,task_id:fold.run.task_id,spec_id:fold.run.spec_id,prd_id:fold.run.prd_id,change_id:fold.run.change_id,usage:{event_count:usage.usage_event_count,tokens:usage.tokens,cost:usage.cost,coverage:usage.coverage},artifact_path:composition.runs.path(fold.run.run_id)}}function compactRunAggregate(aggregate){const bucket=value=>({usage_event_count:value.usage_event_count,tokens:value.tokens,cost:value.cost,coverage:value.coverage});return{scope_id:aggregate.scope_id,run_count:aggregate.run_count,run_coverage:aggregate.run_coverage,attribution:aggregate.attribution,conversation:bucket(aggregate.conversation),planning:bucket(aggregate.planning),execution:bucket(aggregate.execution),total:bucket(aggregate.total),work_types:{new:bucket(aggregate.work_types.new),rework:bucket(aggregate.work_types.rework)}}}async function runSubagentV2Command(action,parsed,composition,filesystem){if(action!=="capture")throw new UsageError(`Unknown subagent action: ${action??""}`);requireOptions(parsed.options,["event","session","turn","agent-id","agent-type","model"]);const event=parsed.options.event;if(event!=="start"&&event!=="stop"){throw new UsageError("--event must be start or stop")}const identity=await subagentIdentity(filesystem,parsed.options["agent-type"]??"");return event==="start"?captureStart(parsed,composition,identity):captureStop(parsed,composition,filesystem,identity)}async function captureStart(parsed,composition,identity){const[sessionId,turnId,agentId,,model]=values(parsed);const runs=await composition.runs.list();const existing=runs.find(fold=>fold.run.client_thread_id===agentId&&fold.run.client_turn_id===turnId&&fold.run.agent===identity.agent);if(existing!==void 0)return captureResult(existing,true);const parent=selectParent(runs,sessionId,turnId,parsed.options["parent-agent-id"]);if(parent===void 0){return{captured:false,reason:"parent-run-not-found",agent_id:agentId}}const source=parent.run;const executionKind=source.execution_kind??(source.entrypoint!=="conversation"?"delivery":source.execution_id===null?void 0:await composition.executions.read(source.execution_id).then(({execution})=>execution.kind??"delivery").catch(()=>void 0));const effectiveParent=executionKind===void 0?parent:{...parent,run:{...parent.run,execution_kind:executionKind}};const runPurpose=identity.role==="execution-finalizer"?"finalization":identity.role==="reviewer"?"review":identity.role==="auditor"?"audit":"execution";assertChildRunMayStart(effectiveParent,runPurpose,identity.agent,runs,identity.executionEligibility);const input={shortName:`subagent-${slug(identity.agent)}`,phase:latestRunV2Phase(parent.records),runRole:"subagent",runPurpose,...executionKind===void 0?{}:{executionKind},executionEligibility:identity.executionEligibility,entrypoint:source.entrypoint,workType:source.work_type,client:"codex-subagent",agent:identity.agent,agentName:identity.agentName,provider:source.provider??"openai",model,reasoningEffort:parsed.options["reasoning-effort"]===void 0?null:runV2ReasoningEffortSchema.parse(parsed.options["reasoning-effort"]),clientThreadId:agentId,clientTurnId:turnId,conversationId:source.conversation_id,executionId:source.execution_id,taskId:source.task_id,specId:source.spec_id,prdId:source.prd_id,changeId:source.change_id,parentRunId:source.run_id};await validateRunV2Attribution(input,composition);const writer=await composition.runs.start(input);return{captured:true,reused:false,run:writer.started,artifact_path:composition.runs.path(writer.started.run_id),cataloged:identity.cataloged}}async function captureStop(parsed,composition,filesystem,identity){const[,turnId,agentId]=values(parsed);const child=(await composition.runs.list()).find(fold=>fold.run.client_thread_id===agentId&&fold.run.client_turn_id===turnId&&fold.run.agent===identity.agent);if(child===void 0){return{captured:false,reason:"subagent-run-not-found",agent_id:agentId}}if(child.finished!==null)return captureResult(child,true);let current=await recordCodexTelemetryIfAvailable(child,composition,filesystem);if(current.effective_usage_records.length===0){const usage=unavailableUsageRecord(current,parsed,current.records.length+1);await composition.runs.appendRecord(usage);current=foldRunV2Records([...current.records,usage])}const sequence=current.records.length+1;const status=parsed.options.status??"completed";if(status!=="completed"&&status!=="failed"&&status!=="cancelled"){throw new UsageError("--status must be completed, failed, or cancelled")}await composition.runs.appendRecord(runFinishedV2Schema.parse({schema_version:2,event_id:runV2EventId(current.run.run_id,sequence),run_id:current.run.run_id,sequence,occurred_at:new Date().toISOString(),type:"run.finished",phase:latestRunV2Phase(current.records),status}));return captureResult(await composition.runs.read(current.run.run_id),false)}async function subagentIdentity(filesystem,rawAgentType){const agentType=rawAgentType.trim();const catalog=await loadAgentCatalog(filesystem);const agent=catalog.agents.find(candidate=>candidate.codex_name===agentType||candidate.id===agentType);return agent===void 0?{agent:`unrecognized-subagent:${slug(agentType)}`,agentName:agentType,role:null,capabilities:[],executionEligibility:[],cataloged:false}:{agent:agent.id,agentName:agent.codex_name,role:agent.role,capabilities:agent.capabilities,executionEligibility:agent.execution_eligibility,cataloged:true}}function selectParent(runs,sessionId,turnId,parentAgentId){const explicitParent=parentAgentId?.trim();if(explicitParent!==void 0&&explicitParent.length>0){return runs.filter(fold=>fold.status==="running"&&fold.run.client_thread_id===explicitParent).sort((left,right)=>right.run.occurred_at.localeCompare(left.run.occurred_at))[0]}return runs.filter(fold=>fold.status==="running"&&fold.run.parent_run_id===null&&fold.run.client_thread_id===sessionId&&fold.run.client_turn_id===turnId).sort((left,right)=>right.run.occurred_at.localeCompare(left.run.occurred_at))[0]}function values(parsed){return["session","turn","agent-id","agent-type","model"].map(name=>{const value=parsed.options[name]?.trim();if(value===void 0||value.length===0||value.length>200){throw new UsageError(`--${name} must contain 1 to 200 characters`)}return value})}function captureResult(fold,reused){return{captured:true,reused,run:fold.run,status:fold.status}}function slug(value){return value.normalize("NFKD").replace(/[\u0300-\u036f]/g,"").toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,60)||"worker"}function defaultExecutionPolicy(risk2){return{failure_policy:"stop_on_terminal_failure",max_parallelism:1,max_operational_retries:risk2==="lite"?0:1,max_repair_cycles_per_task:risk2==="lite"?0:2,soft_model_cycle_budget:risk2==="lite"?4:risk2==="standard"?24:40,soft_input_token_budget:risk2==="lite"?25e4:risk2==="standard"?4e6:8e6,context_refresh_after_cycles:risk2==="lite"?4:8,verification_mode:risk2==="critical"?"full":"scoped"}}async function evaluateRunBudget(run,composition,filesystem){if(run.run.execution_id===null)return null;const execution=(await composition.executions.read(run.run.execution_id)).execution;const cycles=run.effective_usage_records.length;const providerInputTokens=run.effective_usage_records.reduce((sum,event)=>sum+Math.max(0,(event.tokens.input??0)-(event.tokens.cached_input??0)),0);const observedContextTokens=run.effective_usage_records.reduce((sum,event)=>sum+(event.context_stats?.initial_pack_tokens??0)+(event.context_stats?.tool_output_tokens??0),0);const measuredInputTokens=providerInputTokens>0?providerInputTokens:observedContextTokens;const cycleBudget=execution.policy.soft_model_cycle_budget??null;const inputBudget=execution.policy.soft_input_token_budget??null;const refreshAfter=execution.policy.context_refresh_after_cycles??null;const checkpointRequired=cycleBudget!==null&&cycles>=cycleBudget||inputBudget!==null&&measuredInputTokens>=inputBudget;const contextRefreshRequired=refreshAfter!==null&&cycles>0&&cycles%refreshAfter===0;const budget={schema_version:1,run_id:run.run.run_id,execution_id:execution.id,measured_at:new Date().toISOString(),cycles,provider_uncached_input_tokens:providerInputTokens,observed_context_tokens:observedContextTokens,measured_input_tokens:measuredInputTokens,measurement_source:providerInputTokens>0?"provider_uncached":"context_stats",soft_model_cycle_budget:cycleBudget,soft_input_token_budget:inputBudget,context_refresh_after_cycles:refreshAfter,checkpoint_required:checkpointRequired,context_refresh_required:contextRefreshRequired};if(checkpointRequired||contextRefreshRequired){await filesystem.writeTextAtomic(`.agents/projections/runtime/checkpoints/${run.run.run_id}.json`,`${JSON.stringify(budget,null,2)}
|
|
1261
|
-
`)}return budget}async function runLifecycleV2Command(area,action,parsed,filesystem,composition,lifecycle){if(area==="prd")return runPrdV2Command(action,parsed,filesystem,composition,lifecycle);if(area==="spec")return runSpecV2Command(action,parsed,filesystem,composition,lifecycle);return runTaskV2Command(action,parsed,filesystem,composition,lifecycle)}async function runPrdV2Command(action,parsed,filesystem,composition,lifecycle){if(action==="create"){requireOptions(parsed.options,["title","short-name","problem"]);const creationRunId=await creationRunIdForCurrentTurn(parsed,filesystem,composition);const prd=await composition.prds.create({...parsed.options.id===void 0?{}:{id:parsed.options.id},title:parsed.options.title,shortName:parsed.options["short-name"],problem:parsed.options.problem,audiences:csvOption(parsed.options.audiences),outcomes:csvOption(parsed.options.outcomes),constraints:csvOption(parsed.options.constraints),nonGoals:csvOption(parsed.options["non-goals"]),creationRunId});return{prd,artifact_path:composition.prds.path(prd.id)}}if(action==="list"){return listLifecyclePage(await composition.prds.list(),parsed).map(prd=>({prd:compactPreparedEntity(prd),artifact_path:composition.prds.path(prd.id)}))}const id=requiredEntityId(parsed,2,"PRD id");if(action==="show"){return{...await composition.prds.read(id),artifact_path:composition.prds.path(id)}}if(action==="prepare"){const plan=await readPreparedPlan(filesystem,parsed);await assertPreparedPlanReferences(filesystem,plan);const prd=await composition.prds.setPreparedPlan(id,plan);const specs=await Promise.all(specIdsForPrdPlanV2(plan,id).map(async specId=>(await composition.specs.read(specId)).spec));return{prd,specs,artifact_path:composition.prds.path(id),plan_hash:plan.hash}}if(action==="ready"){const current=await composition.prds.read(id);if(current.prd.prepared_plan===null)throw new UsageError(`PRD is not prepared: ${id}`);await assertPreparedPlanReferences(filesystem,current.prd.prepared_plan);if(!new Set(["draft","ready"]).has(current.prd.status)){throw new UsageError(`PRD cannot move to ready from status ${current.prd.status}: ${id}`)}const selectedSpecs=await Promise.all(specIdsForPrdPlanV2(current.prd.prepared_plan,id).map(async specId=>(await composition.specs.read(specId)).spec));for(const spec of selectedSpecs){if(!new Set(["draft","ready"]).has(spec.status)){throw new UsageError(`SPEC cannot move to ready from status ${spec.status}: ${spec.id}`)}}const prd=current.prd.status==="draft"?await composition.prds.transition(id,"ready"):current.prd;const specs=await Promise.all(selectedSpecs.map(spec=>spec.status==="draft"?composition.specs.transition(spec.id,"ready"):spec));return{prd,specs,artifact_path:composition.prds.path(id)}}if(action==="execute"){const current=await composition.prds.read(id);if(current.prd.prepared_plan===null)throw new UsageError(`PRD is not prepared: ${id}`);await assertPreparedPlanReferences(filesystem,current.prd.prepared_plan);if(!new Set(["draft","ready"]).has(current.prd.status)){throw new UsageError(`PRD cannot execute from status ${current.prd.status}: ${id}`)}const selectedSpecs=await Promise.all(specIdsForPrdPlanV2(current.prd.prepared_plan,id).map(async specId=>(await composition.specs.read(specId)).spec));for(const spec of selectedSpecs){if(!new Set(["draft","ready"]).has(spec.status)){throw new UsageError(`SPEC cannot execute from status ${spec.status}: ${spec.id}`)}}const output2=materializationOutput(await composition.materializer.execute(current.prd.prepared_plan),composition);const specs=await Promise.all(selectedSpecs.map(async selectedSpec=>{let spec=selectedSpec;if(spec.status==="draft")spec=await composition.specs.transition(spec.id,"ready");return spec.status==="ready"?composition.specs.transition(spec.id,"active"):spec}));if(current.prd.status==="draft")await composition.prds.transition(id,"ready");const preparedPrd=(await composition.prds.read(id)).prd;if(preparedPrd.status==="ready")await composition.prds.transition(id,"active");return{...output2,specs}}if(action==="deliver"){const prd=await lifecycle.deliverPrd(id);return{prd,artifact_path:composition.prds.path(id)}}if(action==="block"||action==="fail"){requireOptions(parsed.options,["reason"]);const prd=await composition.prds.transition(id,action==="block"?"blocked":"failed",parsed.options.reason);return{prd,artifact_path:composition.prds.path(id)}}if(action==="cancel"){const result2=await lifecycle.cancelPrd(id);return{...result2,artifact_path:composition.prds.path(id)}}if(action==="activate"){const prd=await composition.prds.transition(id,"active");return{prd,artifact_path:composition.prds.path(id)}}throw new UsageError(`Unknown V2 PRD action: ${action??""}`)}async function runSpecV2Command(action,parsed,filesystem,composition,lifecycle){if(action==="create"){requireOptions(parsed.options,["title","short-name","objective"]);const creationRunId=await creationRunIdForCurrentTurn(parsed,filesystem,composition);const spec=await composition.specs.create({...parsed.options.id===void 0?{}:{id:parsed.options.id},...parsed.options.prd===void 0?{}:{prdId:parsed.options.prd},title:parsed.options.title,shortName:parsed.options["short-name"],objective:parsed.options.objective,includedScope:csvOption(parsed.options.scope),excludedScope:csvOption(parsed.options["out-of-scope"]),requirementIds:csvOption(parsed.options.requirements),acceptanceIds:csvOption(parsed.options.acceptance),creationRunId});return{spec,artifact_path:composition.specs.path(spec.id)}}if(action==="list"){const specs=(await composition.specs.list()).filter(spec=>parsed.options.prd===void 0||spec.prd_id===parsed.options.prd);return listLifecyclePage(specs,parsed).map(spec=>({spec:compactPreparedEntity(spec),artifact_path:composition.specs.path(spec.id)}))}const id=requiredEntityId(parsed,2,"SPEC id");if(action==="show"){return{...await composition.specs.read(id),artifact_path:composition.specs.path(id)}}if(action==="prepare"){const plan=await readPreparedPlan(filesystem,parsed);await assertPreparedPlanReferences(filesystem,plan);const spec=await composition.specs.setPreparedPlan(id,plan);return{spec,artifact_path:composition.specs.path(id),plan_hash:plan.hash}}if(action==="ready"){const current=await composition.specs.read(id);if(current.spec.prepared_plan===null)throw new UsageError(`SPEC is not prepared: ${id}`);await assertPreparedPlanReferences(filesystem,current.spec.prepared_plan);const spec=current.spec.status==="draft"?await composition.specs.transition(id,"ready"):current.spec;if(spec.status!=="ready"){throw new UsageError(`SPEC cannot move to ready from status ${spec.status}: ${id}`)}return{spec,artifact_path:composition.specs.path(id)}}if(action==="execute"){const current=await composition.specs.read(id);if(current.spec.prepared_plan===null)throw new UsageError(`SPEC is not prepared: ${id}`);await assertPreparedPlanReferences(filesystem,current.spec.prepared_plan);if(!new Set(["draft","ready"]).has(current.spec.status)){throw new UsageError(`SPEC cannot execute from status ${current.spec.status}: ${id}`)}const output2=materializationOutput(await composition.materializer.execute(current.spec.prepared_plan),composition);if(current.spec.status==="draft")await composition.specs.transition(id,"ready");const preparedSpec=(await composition.specs.read(id)).spec;if(preparedSpec.status==="ready")await composition.specs.transition(id,"active");return output2}if(action==="deliver"){const spec=await lifecycle.deliverSpec(id);return{spec,artifact_path:composition.specs.path(id)}}if(action==="block"||action==="fail"){requireOptions(parsed.options,["reason"]);const spec=await composition.specs.transition(id,action==="block"?"blocked":"failed",parsed.options.reason);return{spec,artifact_path:composition.specs.path(id)}}if(action==="cancel"){const result2=await lifecycle.cancelSpec(id);return{...result2,artifact_path:composition.specs.path(id)}}if(action==="activate"){const spec=await composition.specs.transition(id,"active");return{spec,artifact_path:composition.specs.path(id)}}throw new UsageError(`Unknown V2 SPEC action: ${action??""}`)}async function creationRunIdForCurrentTurn(parsed,filesystem,composition){if(parsed.options.run!==void 0){return(await composition.runs.read(parsed.options.run)).run.run_id}const invocation=await resolveRunClientInvocation(filesystem,"codex");const intake=await findIntakeForExactTurn(composition,"codex",invocation);return intake?.run.run_id??null}async function runTaskV2Command(action,parsed,filesystem,composition,lifecycle){if(action==="create"){requireOptions(parsed.options,["title","short-name","objective","requirements","acceptance"]);const timeZone=composition.layout.project.timezone;const taskId=parsed.options.id??createId("TASK",parsed.options["short-name"],{timeZone});const changeId=parsed.options.change??createId("CHG",parsed.options["short-name"],{timeZone});const requirementIds=csvOption(parsed.options.requirements);const acceptanceIds=csvOption(parsed.options.acceptance);const risk2=riskOption(parsed.options.risk);const shortName=parsed.options["short-name"];const task=await composition.tasks.createDraft({id:taskId,changeId,title:parsed.options.title,shortName,objective:parsed.options.objective,risk:risk2,priority:priorityOption(parsed.options.priority),owner:parsed.options.owner??null,requirementIds,acceptanceIds,dependsOn:csvOption(parsed.options["depends-on"]),writeScopes:csvOption(parsed.options["write-scopes"])});const change=await composition.changes.createDraft({id:changeId,title:task.title,risk:task.risk,taskId:task.id,requirementIds,acceptanceIds});return{task,change,artifact_path:composition.tasks.path(task.id),change_path:composition.changes.path(change.id)}}if(action==="prepare"){const id2=requiredEntityId(parsed,2,"Task id");const current=await composition.tasks.read(id2);if(current.task.status==="planned"&¤t.task.prepared_plan!==void 0){await assertPreparedPlanReferences(filesystem,current.task.prepared_plan);return{task:current.task,artifact_path:composition.tasks.path(id2),plan_hash:current.task.prepared_plan.hash}}if(parsed.options.plan===void 0&¤t.task.depends_on.length>0){throw new UsageError("task prepare with dependencies requires --plan containing the complete DAG")}const timeZone=composition.layout.project.timezone;const deliveryIntake=(await composition.executions.list()).find(execution=>execution.kind==="delivery"&&execution.plan_hash===null&&execution.origin.type==="task"&&execution.origin.task_id===current.task.id);const plan=parsed.options.plan===void 0?createTaskFirstPreparedPlan({task:current.task,executionId:parsed.options.execution??deliveryIntake?.id??createId("RUN",current.task.short_name,{timeZone}).replace(/^RUN-/,"EXEC-"),preparedAt:new Date().toISOString(),policy:defaultExecutionPolicy(current.task.risk),...parsed.options["requirement-impact"]===void 0?{}:{requirementImpactReason:parsed.options["requirement-impact"]}}):await readPreparedPlan(filesystem,parsed);await assertPreparedPlanReferences(filesystem,plan);const task=await composition.tasks.setPreparedPlan(id2,plan);const change=plan.blueprints.changes.find(candidate=>candidate.id===task.change_id);if(change===void 0)throw new UsageError(`Prepared plan does not contain Change ${task.change_id}`);await ensureTaskDraftChange(composition,task);await composition.changes.promoteDraft(task.change_id,plannedChangeFromBlueprint(change,plan,task.id));return{task,artifact_path:composition.tasks.path(id2),plan_hash:plan.hash}}if(action==="execute"){const plan=parsed.options.plan!==void 0?await readPreparedPlan(filesystem,parsed):await preparedTaskPlan(composition.tasks,requiredEntityId(parsed,2,"Task id"));await assertPreparedPlanReferences(filesystem,plan);if(plan.source.type!=="task"){throw new UsageError("task execute requires a task-first prepared plan")}const materialized=await existingTaskFirstMaterialization(plan,composition)??await composition.materializer.execute(plan);const taskId=plan.source.task_id;const task=materialized.tasks.find(candidate=>candidate.id===taskId);if(task===void 0){throw new UsageError(`Task-first plan did not materialize its source Task ${taskId}`)}const change=materialized.changes.find(candidate=>candidate.id===task.change_id);if(change===void 0){throw new UsageError(`Task-first plan did not materialize Change ${task.change_id}`)}assertTaskFirstExecutable(task.status,"Task",task.id);assertTaskFirstExecutable(materialized.execution.status,"Execution",materialized.execution.id);assertTaskFirstExecutable(change.status,"Change",change.id);const run=await ensureTaskOrchestratorRun(task,change.id,materialized.execution.id,parsed,filesystem,composition);let execution=(await composition.executions.read(materialized.execution.id)).execution;if(execution.status==="planned"){execution=await composition.executions.transition(execution.id,"running")}let activeChange=(await composition.changes.read(change.id)).change;if(activeChange.status==="planned"){activeChange=await composition.changes.transition(activeChange.id,"executing")}let activeTask=(await composition.tasks.read(task.id)).task;if(activeTask.status==="planned"){activeTask=await lifecycle.startTask(activeTask.id)}return{...materializationOutput(materialized,composition),execution,changes:[activeChange],tasks:[activeTask],run,run_path:composition.runs.path(run.run_id)}}if(action==="list"){const[tasks,changes]=await Promise.all([composition.tasks.list(),parsed.options.prd===void 0&&parsed.options.spec===void 0?Promise.resolve([]):composition.changes.list()]);const relatedChangeIds=new Set(changes.filter(change=>(parsed.options.prd===void 0||change.source.type==="prd"&&change.source.prd_id===parsed.options.prd)&&(parsed.options.spec===void 0||change.source.type==="spec"&&change.source.spec_id===parsed.options.spec||change.source.type==="prd"&&change.source.spec_id===parsed.options.spec)).map(change=>change.id));const filtered=tasks.filter(task=>parsed.options.prd===void 0&&parsed.options.spec===void 0||relatedChangeIds.has(task.change_id));return listLifecyclePage(filtered,parsed).map(task=>({task:compactPreparedEntity(task),artifact_path:composition.tasks.path(task.id)}))}if(action==="next"){const[tasks,executions]=await Promise.all([composition.tasks.list(),composition.executions.list()]);const completed=new Set(tasks.filter(task=>task.status==="completed").map(task=>task.id));const materialized=new Set(executions.flatMap(execution=>execution.dag.nodes.map(node=>node.task_id)));return tasks.filter(task=>task.status==="planned"&&materialized.has(task.id)&&task.depends_on.every(dependency=>completed.has(dependency))).map(task=>({task,artifact_path:composition.tasks.path(task.id)}))}const id=requiredEntityId(parsed,2,"Task id");if(action==="show"){return{...await composition.tasks.read(id),artifact_path:composition.tasks.path(id)}}if(action==="start"||action==="resume"||action==="rework"){const task=await lifecycle.startTask(id,action);return{task,artifact_path:composition.tasks.path(id)}}if(action==="verify"){const task=await lifecycle.verifyTask(id,csvOption(parsed.options.evidence));return{task,artifact_path:composition.tasks.path(id)}}if(action==="block"){const task=await composition.tasks.transition(id,"blocked");return{task,artifact_path:composition.tasks.path(id)}}if(action==="complete"){const result2=await readTaskResultV2(filesystem,parsed);const task=await lifecycle.completeTask(id,result2);return{task,artifact_path:composition.tasks.path(id)}}if(action==="fail"){const result2=await readTaskResultV2(filesystem,parsed);const task=await lifecycle.failTask(id,result2);return{task,artifact_path:composition.tasks.path(id)}}if(action==="cancel"){requireOptions(parsed.options,["summary"]);const task=await composition.tasks.transition(id,"cancelled",{summary:parsed.options.summary,changed_files:csvOption(parsed.options["changed-files"]),evidence_ids:csvOption(parsed.options.evidence),completed_run_id:parsed.options.run??null});const{change}=await composition.changes.read(task.change_id).catch(()=>({change:null}));if(change!==null&&change.source.type==="task"&&change.source.task_id===task.id&&change.status!=="cancelled"){await composition.changes.transition(change.id,"cancelled",task.result?.summary??"Task cancelled.")}return{task,artifact_path:composition.tasks.path(id)}}throw new UsageError(`Unknown V2 Task action: ${action??""}`)}function assertTaskFirstExecutable(status,kind,id){if(status==="planned"||status==="executing"||status==="running")return;const guidance=status==="blocked"?"resume the Task before starting a new orchestrator agent call":status==="failed"?"rework the Task before starting a new orchestrator agent call":"terminal work is immutable";throw new UsageError(`${kind} ${id} cannot execute from status ${status}; ${guidance}`)}async function existingTaskFirstMaterialization(plan,composition){if(plan.source.type!=="task")return null;const existing=await Promise.all([composition.tasks.read(plan.source.task_id).catch(()=>null),composition.executions.read(plan.execution_id).catch(()=>null)]);const task=existing[0]?.task;const execution=existing[1]?.execution;if(task===void 0||execution===void 0||task.plan_hash!==plan.hash||execution.plan_hash!==plan.hash||!execution.dag.nodes.some(node=>node.task_id===task.id&&node.change_id===task.change_id)){return null}const change=await composition.changes.read(task.change_id).catch(()=>null);if(change===null||change.change.plan_hash!==plan.hash)return null;const reusedPaths=[composition.executions.path(execution.id),composition.changes.path(change.change.id),composition.tasks.path(task.id)];return{execution,changes:[change.change],tasks:[task],created_paths:[],reused_paths:reusedPaths}}async function ensureTaskOrchestratorRun(task,changeId,executionId,parsed,filesystem,composition){const runs=await composition.runs.list();const existing=runs.filter(candidate=>candidate.finished===null&&effectiveRunV2Role(candidate.run)==="orchestrator"&&candidate.run.parent_run_id===null&&candidate.run.task_id===task.id&&candidate.run.execution_id===executionId).sort((left,right)=>right.run.occurred_at.localeCompare(left.run.occurred_at))[0];if(existing!==void 0)return existing.run;const invocation=await resolveRunClientInvocation(filesystem,"codex");if(invocation.clientTurnId!==null){await composition.executions.claimClientTurn(executionId,invocation.clientTurnId)}const intake=await findIntakeForExactTurn(composition,"codex",invocation);const source=intake?.run;const writer=await composition.runs.start({...parsed.options.run===void 0?{}:{id:parsed.options.run},shortName:task.short_name,phase:"execution",runRole:"orchestrator",runPurpose:"orchestration",requiresFinalizer:true,executionKind:"delivery",executionEligibility:[],entrypoint:"task",workType:source?.work_type??"new",client:"codex",agent:"agent-orchestrator",agentName:"zaip-agent-orchestrator",provider:source?.provider??null,model:parsed.options.model??source?.model??"unknown",reasoningEffort:source?.reasoning_effort??null,...invocation,conversationId:source?.conversation_id??createConversationId(task.short_name),executionId,taskId:task.id,changeId});return writer.started}async function ensureTaskDraftChange(composition,task){const existing=await composition.changes.read(task.change_id).catch(()=>null);if(existing!==null)return existing.change;return composition.changes.createDraft({id:task.change_id,title:task.title,risk:task.risk,taskId:task.id,requirementIds:task.requirement_ids,acceptanceIds:task.acceptance_ids})}function plannedChangeFromBlueprint(blueprint,plan,taskId){return{schema_version:2,id:blueprint.id,revision:1,title:blueprint.title,status:"planned",risk:blueprint.risk,source:blueprint.source,requirement_ids:[...blueprint.requirement_ids],acceptance_ids:[...blueprint.acceptance_ids],requirement_impact:blueprint.requirement_impact,task_ids:[taskId],plan_revision:plan.revision,plan_hash:plan.hash,created_at:plan.prepared_at,updated_at:plan.prepared_at,started_at:null,finished_at:null,result:null}}async function readTaskResultV2(filesystem,parsed){if(parsed.options.result!==void 0){return taskResultV2Schema.parse(JSON.parse(await filesystem.readText(parsed.options.result)))}requireOptions(parsed.options,["summary","run"]);return taskResultV2Schema.parse({summary:parsed.options.summary,changed_files:csvOption(parsed.options["changed-files"]),evidence_ids:csvOption(parsed.options.evidence),completed_run_id:parsed.options.run})}function materializationOutput(result2,composition){return{execution:result2.execution,changes:result2.changes,tasks:result2.tasks,artifact_path:composition.executions.path(result2.execution.id),change_paths:result2.changes.map(change=>composition.changes.path(change.id)),task_paths:result2.tasks.map(task=>composition.tasks.path(task.id)),created_paths:result2.created_paths,reused_paths:result2.reused_paths}}var ORPHANED_RUN_GRACE_MS=10*60*1e3;var ORPHANED_EXECUTION_GRACE_MS=10*60*1e3;var ACTIVE_INVOCATION_START_TOLERANCE_MS=2*60*1e3;async function reconcileOpenWork(parsed,composition,lifecycle,filesystem){let runs=await composition.runs.list();const runningCodex=runs.filter(fold=>fold.finished===null&&isCodexTelemetryClient(fold.run.client)&&fold.run.client_thread_id!==null);const threadIds=runningCodex.flatMap(fold=>typeof fold.run.client_thread_id==="string"?[fold.run.client_thread_id]:[]);const invocations=runningCodex.flatMap(fold=>typeof fold.run.client_thread_id==="string"&&typeof fold.run.client_turn_id==="string"?[{threadId:fold.run.client_thread_id,turnId:fold.run.client_turn_id}]:[]);const[localLifecycles,activeInvocations]=await Promise.all([listCodexInvocationLifecycles(filesystem.root,{threadIds,invocations}),listActiveCodexInvocations(filesystem.root,{threadIds})]);const localByInvocation=new Map(localLifecycles.map(item=>[`${item.sessionId}:${item.turnId}`,item]));const closedRuns=[];const reconciliationStartedAt=new Date;for(const fold of runningCodex){const local=localByInvocation.get(`${fold.run.client_thread_id??""}:${fold.run.client_turn_id??""}`);const completedLocally=local?.status==="completed"&&local.finishedAt!==null;const orphaned=isOrphanedCodexRun(fold,activeInvocations,reconciliationStartedAt);if(!completedLocally&&!orphaned)continue;const role=effectiveRunV2Role(fold.run);if(role==="orchestrator"&&activeDescendantRuns(fold.run.run_id,runs).length>0){continue}let current=completedLocally?await recordCodexTelemetryIfAvailable(fold,composition,filesystem):fold;if(current.effective_usage_records.length===0){await composition.runs.appendRecord(unavailableUsageRecord(current,parsed,current.records.length+1));current=await composition.runs.read(current.run.run_id)}const finished=runFinishedV2Schema.parse({schema_version:2,event_id:`${current.run.run_id}:${String(current.records.length+1).padStart(6,"0")}`,run_id:current.run.run_id,sequence:current.records.length+1,occurred_at:completedLocally?local.finishedAt:new Date().toISOString(),type:"run.finished",phase:latestRunV2Phase(current.records),status:completedLocally?"completed":"failed"});foldRunV2Records([...current.records,finished]);await composition.runs.appendRecord(finished);closedRuns.push(await composition.runs.read(current.run.run_id))}if(closedRuns.length>0)runs=await composition.runs.list();const[tasks,changes,executions,specs,prds]=await Promise.all([composition.tasks.list(),composition.changes.list(),composition.executions.list(),composition.specs.list(),composition.prds.list()]);const catalog={tasks,changes,executions,specs,prds};const orphanedExecutions=await blockOrphanedStandaloneExecutions(catalog,runs,composition,reconciliationStartedAt);const activeSubjectIds=activeLifecycleSubjectIds(runs.filter(item=>item.finished===null),catalog);const operationalSubjectIds=terminalReconciliationSubjectIds(catalog);const reconciliations=[];const reconciliationErrors=[];const reconciledSubjectIds=new Set;const terminal=runs.filter(fold=>fold.finished!==null&&terminalSubjectIds(fold).some(id=>operationalSubjectIds.has(id))).sort((left,right)=>(right.finished?.occurred_at??right.run.occurred_at).localeCompare(left.finished?.occurred_at??left.run.occurred_at));for(const fold of terminal){const subjects=terminalSubjectIds(fold);if(subjects.length===0||subjects.some(id=>activeSubjectIds.has(id))||subjects.every(id=>reconciledSubjectIds.has(id))){continue}try{reconciliations.push(await reconcileFinishedRunLifecycle(fold,composition,lifecycle,{catalog,candidateRuns:runs}))}catch(error51){const message=error51 instanceof Error?error51.message:String(error51);reconciliations.push({...await snapshotRunLifecycle(fold,composition,catalog),status:"deferred",error:message});reconciliationErrors.push({run_id:fold.run.run_id,error:message})}subjects.forEach(id=>{reconciledSubjectIds.add(id)})}return{runs:closedRuns,orphaned_executions:orphanedExecutions,reconciliations,reconciliation_errors:reconciliationErrors,unresolved_running_run_ids:runs.filter(fold=>fold.finished===null).map(fold=>fold.run.run_id)}}async function blockOrphanedStandaloneExecutions(catalog,runs,composition,now){const ids=orphanedStandaloneExecutionIds(catalog,runs,now);if(ids.length===0)return[];const clock=new SystemClock;const taskById=new Map(catalog.tasks.map(task=>[task.id,task]));const changeById=new Map(catalog.changes.map(change=>[change.id,change]));for(const id of ids){const execution=catalog.executions.find(item=>item.id===id);if(execution===void 0)continue;const reason=`Execution ${id} has no active orchestrator agent call after the reconciliation grace period.`;for(const node of execution.dag.nodes){const task=taskById.get(node.task_id);if(task!==void 0&&["executing","verifying"].includes(task.status)){await composition.tasks.transition(task.id,"blocked",null,clock,reason)}const change=changeById.get(node.change_id);if(change!==void 0&&["executing","verifying"].includes(change.status)){await composition.changes.transition(change.id,"blocked",null,clock,reason)}}await composition.executions.transition(id,"blocked",null,clock,reason)}return ids}function orphanedStandaloneExecutionIds(catalog,runs,now=new Date){return catalog.executions.flatMap(execution=>{if(execution.origin.type!=="task"||!["running","verifying"].includes(execution.status)){return[]}const startedAt=Date.parse(execution.started_at??execution.updated_at??execution.created_at);if(!Number.isFinite(startedAt)||now.getTime()-startedAt<ORPHANED_EXECUTION_GRACE_MS){return[]}const taskIds=new Set(execution.dag.nodes.map(node=>node.task_id));const hasActiveOrchestratorRun=runs.some(run=>run.finished===null&&effectiveRunV2Role(run.run)==="orchestrator"&&run.run.parent_run_id===null&&run.run.entrypoint==="task"&&(run.run.execution_id===execution.id||run.run.task_id!==null&&taskIds.has(run.run.task_id)));return hasActiveOrchestratorRun?[]:[execution.id]})}function terminalReconciliationSubjectIds(catalog){const ids=new Set;const unsettledTaskIds=new Set(catalog.tasks.filter(task=>["executing","verifying"].includes(task.status)).map(task=>task.id));unsettledTaskIds.forEach(id=>{ids.add(id)});for(const change of catalog.changes){const unsettled=["planned","executing","verifying"].includes(change.status);const hasUnsettledTask=change.task_ids.some(id=>unsettledTaskIds.has(id));if(!unsettled&&!hasUnsettledTask)continue;change.task_ids.forEach(id=>{ids.add(id)});if(change.source.type==="spec")ids.add(change.source.spec_id);if(change.source.type==="prd"){ids.add(change.source.prd_id);if(change.source.spec_id!==null)ids.add(change.source.spec_id)}}for(const execution of catalog.executions){if(!["planned","running","paused","verifying"].includes(execution.status))continue;execution.dag.nodes.forEach(node=>{ids.add(node.task_id)})}catalog.specs.filter(spec=>spec.status==="active").forEach(spec=>{ids.add(spec.id)});catalog.prds.filter(prd=>prd.status==="active").forEach(prd=>{ids.add(prd.id)});return ids}function isOrphanedCodexRun(fold,activeInvocations,now=new Date){if(fold.finished!==null||fold.run.client!=="codex")return false;const startedAt=Date.parse(fold.run.occurred_at);if(!Number.isFinite(startedAt)||now.getTime()-startedAt<ORPHANED_RUN_GRACE_MS){return false}return!activeInvocations.some(active=>{if(active.sessionId!==fold.run.client_thread_id)return false;if(active.turnId===fold.run.client_turn_id)return true;const activeStartedAt=active.startedAt===null?Number.NaN:Date.parse(active.startedAt);return Number.isFinite(activeStartedAt)&&Math.abs(activeStartedAt-startedAt)<=ACTIVE_INVOCATION_START_TOLERANCE_MS})}function activeLifecycleSubjectIds(activeRuns,catalog){const ids=new Set;const taskById=new Map(catalog.tasks.map(task=>[task.id,task]));const changeById=new Map(catalog.changes.map(change=>[change.id,change]));const specById=new Map(catalog.specs.map(spec=>[spec.id,spec]));for(const fold of activeRuns){relatedWorkIds(fold).forEach(id=>{ids.add(id)});const task=fold.run.task_id===null?void 0:taskById.get(fold.run.task_id);const change=task===void 0?void 0:changeById.get(task.change_id);const specId=fold.run.spec_id??(change?.source.type==="spec"||change?.source.type==="prd"?change.source.spec_id:null);const prdId=fold.run.prd_id??(change?.source.type==="prd"?change.source.prd_id:null)??(specId===null?null:specById.get(specId)?.prd_id??null);if(change!==void 0)ids.add(change.id);if(specId!==null)ids.add(specId);if(prdId!==null)ids.add(prdId);for(const candidate of catalog.changes){const belongsToSpec=specId!==null&&candidate.source.type!=="task"&&candidate.source.spec_id===specId;const belongsToPrd=candidate.source.type==="prd"&&candidate.source.prd_id===prdId;if(!belongsToSpec&&!belongsToPrd)continue;ids.add(candidate.id);candidate.task_ids.forEach(id=>{ids.add(id)})}for(const execution of catalog.executions){if(execution.origin.type==="prd"&&execution.origin.prd_id===prdId||execution.origin.type==="spec"&&execution.origin.spec_id===specId){ids.add(execution.id);execution.dag.nodes.forEach(node=>{ids.add(node.task_id)})}}}return ids}function relatedWorkIds(fold){return[fold.run.task_id,fold.run.spec_id,fold.run.prd_id].filter(id=>id!==null)}function terminalSubjectIds(fold){const role=effectiveRunV2Role(fold.run);if(role==="orchestrator"&&fold.run.entrypoint==="task"){return fold.run.task_id===null?[]:[fold.run.task_id]}if(role==="orchestrator"){return[fold.run.spec_id,fold.run.prd_id].filter(id=>id!==null)}return[]}async function runRunV2Command(action,parsed,composition,filesystem,lifecycle){if(action==="start"){requireOptions(parsed.options,["short-name","phase","entrypoint","work-type","client","model"]);const client=parsed.options.client;const phase=runV2PhaseOption(parsed.options.phase);const parentRunId=parsed.options.parent??null;const clientInvocation=await resolveRunClientInvocation(filesystem,client);const agent=await resolveRunAgentIdentity(filesystem,{agent:parsed.options.agent,client});const runPurpose=parsed.options["run-purpose"]===void 0?phase!=="execution"?"intake":agent==="agent-execution-finalizer"?"finalization":agent==="agent-reviewer"?"review":agent==="agent-auditor"?"audit":parentRunId===null?"orchestration":"execution":runV2PurposeSchema.parse(parsed.options["run-purpose"]);const catalog=await loadAgentCatalog(filesystem).catch(()=>null);const catalogAgent=catalog?.agents.find(candidate=>candidate.id===agent);const parent=parentRunId===null?null:await composition.runs.read(parentRunId);const execution=parent===null&&parsed.options.execution!==void 0?await composition.executions.read(parsed.options.execution).catch(()=>null):null;const executionKind=parent?.run.execution_kind??execution?.execution.kind??void 0;const input={...parsed.options.id===void 0?{}:{id:parsed.options.id},shortName:parsed.options["short-name"],phase,...parsed.options["run-role"]===void 0?{}:{runRole:runV2RoleSchema.parse(parsed.options["run-role"])},runPurpose,...executionKind===void 0?{}:{executionKind},executionEligibility:catalogAgent?.execution_eligibility??[],entrypoint:runV2EntrypointOption(parsed.options.entrypoint),workType:runV2WorkTypeOption(parsed.options["work-type"]),client,agent,agentName:await resolveRunAgentName(filesystem,agent),provider:parsed.options.provider??null,model:parsed.options.model,reasoningEffort:parsed.options["reasoning-effort"]===void 0?null:runV2ReasoningEffortSchema.parse(parsed.options["reasoning-effort"]),...clientInvocation,conversationId:parsed.options.conversation??createConversationId(parsed.options["short-name"]),executionId:parsed.options.execution??null,taskId:parsed.options.task??null,specId:parsed.options.spec??null,prdId:parsed.options.prd??null,changeId:parsed.options.change??null,parentRunId,continuationOfRunId:parsed.options.continuation??null,retryOfRunId:parsed.options.retry??null};await validateRunV2Attribution(input,composition);if(parentRunId!==null){const candidates=await composition.runs.list();if(parent===null)throw new UsageError(`Parent Run not found: ${parentRunId}`);assertChildRunMayStart(parent,runPurpose,agent,candidates,catalogAgent?.execution_eligibility??[])}const writer=await composition.runs.start(input);return{run:writer.started,artifact_path:composition.runs.path(writer.started.run_id)}}if(action==="list"||action==="aggregate"){const runs=filterRunV2Folds(await composition.runs.list(),parsed);if(action==="aggregate"){const aggregate=aggregateRunV2Usage(runs.map(runV2CostInput2),runV2ScopeOption(parsed));return parsed.options.view==="full"?aggregate:compactRunAggregate(aggregate)}const summaries=runs.map(run=>runV2Summary(run,composition));return listLifecyclePage(summaries,parsed)}if(action==="reconcile"){if(!parsed.flags.has("open"))throw new UsageError("run reconcile requires --open");return reconcileOpenWork(parsed,composition,lifecycle,filesystem)}const id=requiredEntityId(parsed,2,"Run V2 id");if(action==="show"){const run=await composition.runs.read(id);const includeEvents=parsed.flags.has("events")||parsed.options["event-id"]!==void 0||parsed.options["from-sequence"]!==void 0;return includeEvents?{run:{...run,records:run.records.filter(record2=>(parsed.options["event-id"]===void 0||record2.event_id===parsed.options["event-id"])&&(parsed.options["from-sequence"]===void 0||record2.sequence>=numberOption(parsed.options["from-sequence"],1)))},artifact_path:composition.runs.path(id)}:runV2Summary(run,composition)}if(action==="closure"){const current=await composition.runs.read(id);if(current.finished===null)throw new UsageError(`Run V2 is still running: ${id}`);const closure=await assessRunLifecycleClosure(current,composition);if(closure.status==="action_required"){throw new UsageError(`Run ${id} left related work open: ${closure.open_subject_ids.join(", ")}. ${closure.guidance}`)}return{closure,artifact_path:composition.runs.path(id)}}if(action==="usage"){const current=await composition.runs.read(id);if(current.finished!==null)throw new UsageError(`Run V2 is already finished: ${id}`);const sequence=current.records.length+1;const input=nullableNumberOption(parsed.options["input-tokens"]);const cachedInput=nullableNumberOption(parsed.options["cached-input-tokens"]);const outputTokens=nullableNumberOption(parsed.options["output-tokens"]);const reasoning=nullableNumberOption(parsed.options["reasoning-tokens"]);const explicitTotal=nullableNumberOption(parsed.options["total-tokens"]);const occurredAt=new Date().toISOString();const tokens={input,cached_input:cachedInput,output:outputTokens,reasoning,total:explicitTotal??(input===null||outputTokens===null?null:input+outputTokens),source:tokenSourceOption(parsed.options["token-source"])};const provider=inferProvider(parsed.options.model??current.run.model,parsed.options.provider??current.run.provider??current.run.client,current.run.agent);const pricing=new PricingRepository(filesystem);const estimated=estimateUsageCost({provider,model:parsed.options.model??current.run.model,usage:tokens,catalog:await pricing.readCatalog(),fxRate:await pricing.readLatestFxRate()});const record2=usageRecordedV2Schema.parse({schema_version:2,event_id:parsed.options["event-id"]??runV2EventId(id,sequence),run_id:id,sequence,occurred_at:occurredAt,type:"usage.recorded",phase:runV2PhaseOption(parsed.options.phase??latestRunV2Phase(current.records)),activity_kind:parsed.options.activity??"implementation",classification_source:runV2ClassificationOption(parsed.options.classification),tokens,cost:{usd:nullableCurrencyOption(parsed.options["cost-usd"])??estimated.estimated_usd,brl:nullableCurrencyOption(parsed.options["cost-brl"])??estimated.estimated_brl,fx_rate:parsed.options["cost-brl"]===void 0?estimated.fx_rate:null},provider,model:parsed.options.model??current.run.model,source_segment_key:parsed.options["source-segment"]??null,supersedes_event_id:parsed.options.supersedes??null,...runUsageMetadataOptions(parsed.options,occurredAt)});const folded=foldRunV2Records([...current.records,record2]);await composition.runs.appendRecord(record2);const budget=await evaluateRunBudget(folded,composition,filesystem);return{usage:record2,budget,artifact_path:composition.runs.path(id)}}if(action==="finish"){let current=await composition.runs.read(id);const status=runV2FinishStatusOption(parsed.options.status);const candidateRuns=await composition.runs.list();const role=effectiveRunV2Role(current.run);const finalizationBarrier=assessRunFinalizationBarrier(current,candidateRuns);const requestedOutcome=finalizationBarrier.required&&!finalizationBarrier.satisfied?"blocked":lifecycleOutcomeOption(parsed.options);const reconciliationSummary=finalizationBarrier.required&&!finalizationBarrier.satisfied?`Finalization barrier ${finalizationBarrier.status}; required execution-finalizer did not complete`:parsed.options.summary;if(parsed.flags.has("defer-orchestrator-closure")&&role==="orchestrator"){throw new UsageError(`Orchestrator Run closure cannot be deferred for Run ${id}`)}if(current.finished===null&&role==="orchestrator"){const activeChildren=activeDescendantRuns(id,candidateRuns);if(activeChildren.length>0){throw new UsageError(`Run ${id} cannot finish while descendant Runs are active: ${activeChildren.map(child=>child.run.run_id).join(", ")}`)}}if(current.finished!==null){if(current.finished.status!==status){throw new UsageError(`Run V2 is already ${current.finished.status}: ${id}`)}const reconciliation2=await reconcileFinishedRunLifecycle(current,composition,lifecycle,{requestedOutcome,summary:reconciliationSummary,changedFiles:csvOption(parsed.options["changed-files"]),evidenceIds:csvOption(parsed.options.evidence),defer:parsed.flags.has("defer-orchestrator-closure"),candidateRuns});return{run:parsed.flags.has("events")||parsed.options.view==="full"?current:runV2Summary(current,composition),reconciliation:reconciliation2,finalization_barrier:finalizationBarrier,closure:await assessRunLifecycleClosure(current,composition,candidateRuns),artifact_path:composition.runs.path(id)}}current=await recordCodexTelemetryIfAvailable(current,composition,filesystem);if(current.effective_usage_records.length===0){const usage=unavailableUsageRecord(current,parsed,current.records.length+1);await composition.runs.appendRecord(usage);current=foldRunV2Records([...current.records,usage])}const sequence=current.records.length+1;const record2=runFinishedV2Schema.parse({schema_version:2,event_id:runV2EventId(id,sequence),run_id:id,sequence,occurred_at:new Date().toISOString(),type:"run.finished",phase:latestRunV2Phase(current.records),status});foldRunV2Records([...current.records,record2]);await composition.runs.appendRecord(record2);const run=await composition.runs.read(id);const reconciliation=await reconcileFinishedRunLifecycle(run,composition,lifecycle,{requestedOutcome,summary:reconciliationSummary,changedFiles:csvOption(parsed.options["changed-files"]),evidenceIds:csvOption(parsed.options.evidence),defer:parsed.flags.has("defer-orchestrator-closure"),candidateRuns});const closure=await assessRunLifecycleClosure(run,composition,candidateRuns);return{run:parsed.flags.has("events")||parsed.options.view==="full"?run:runV2Summary(run,composition),reconciliation,finalization_barrier:finalizationBarrier,closure,artifact_path:composition.runs.path(id)}}throw new UsageError(`Unknown Run V2 action: ${action??""}`)}function filterRunV2Folds(runs,parsed){const statuses=new Set(csvOption(parsed.options.status));const from=dateBoundary(parsed.options.from,false);const to=dateBoundary(parsed.options.to,true);const positionalRunId=parsed.positionals[2];const phase=parsed.options.phase===void 0?void 0:runV2PhaseOption(parsed.options.phase);const entrypoint=parsed.options.entrypoint===void 0?void 0:runV2EntrypointOption(parsed.options.entrypoint);const workType=parsed.options["work-type"]===void 0?void 0:runV2WorkTypeOption(parsed.options["work-type"]);return runs.filter(fold=>{const run=fold.run;return(statuses.size===0||statuses.has(fold.status))&&(from===null||Date.parse(run.occurred_at)>=from)&&(to===null||Date.parse(run.occurred_at)<=to)&&(positionalRunId===void 0||run.run_id===positionalRunId)&&(parsed.options.id===void 0||run.run_id===parsed.options.id)&&(phase===void 0||latestRunV2Phase(fold.records)===phase)&&(entrypoint===void 0||run.entrypoint===entrypoint)&&(workType===void 0||run.work_type===workType)&&(parsed.options.conversation===void 0||run.conversation_id===parsed.options.conversation)&&(parsed.options.execution===void 0||run.execution_id===parsed.options.execution)&&(parsed.options.task===void 0||run.task_id===parsed.options.task)&&(parsed.options.spec===void 0||run.spec_id===parsed.options.spec)&&(parsed.options.prd===void 0||run.prd_id===parsed.options.prd)&&(parsed.options.change===void 0||run.change_id===parsed.options.change)})}function runV2CostInput2(fold){return{run:{run_id:fold.run.run_id,attribution_status:fold.run.attribution_status,conversation_id:fold.run.conversation_id,execution_id:fold.run.execution_id,task_id:fold.run.task_id,spec_id:fold.run.spec_id,prd_id:fold.run.prd_id,change_id:fold.run.change_id,work_type:fold.run.work_type},records:fold.records,effective_usage_records:fold.effective_usage_records}}function runV2ScopeOption(parsed){return parsed.positionals[2]??parsed.options.id??parsed.options.conversation??parsed.options.execution??parsed.options.task??parsed.options.spec??parsed.options.prd??parsed.options.change??null}var V2_COMMAND_AREAS=new Set(["plan","prd","spec","change","task","execution","decision","run","run-v2","conversation","subagent"]);function createV2Composition(filesystem,layout){const storageMode=layout.projectConfig?.tracking.storage_mode??"tracked_sanitized";return{layout,prds:new PrdV2Repository(filesystem,layout),specs:new DeliverySpecV2Repository(filesystem,layout),changes:new ChangeV2Repository(filesystem,layout),tasks:new TaskV2Repository(filesystem,layout),executions:new ExecutionV2Repository(filesystem,layout),materializer:new PreparedPlanV2Materializer(filesystem,layout),decisions:new DecisionV2Repository(filesystem,layout),runs:new RunV2Repository(filesystem,storageMode==="local_only"?{storageMode:"local_only",localBasePath:".zaip-aios/local-data/runs"}:{storageMode:"tracked_sanitized",layout})}}async function runV2Command(area,action,parsed,filesystem,layout){const composition=createV2Composition(filesystem,layout);if(action==="list"&&parsed.options.view!=="full"){return projectedList(area==="run-v2"?"run":area,parsed,filesystem)}const lifecycle=new LifecycleV2Gate(filesystem,layout,composition);let result2;if(area==="plan")return runPlanV2Command(action,parsed,filesystem,layout);if(area==="prd")result2=await runLifecycleV2Command(area,action,parsed,filesystem,composition,lifecycle);else if(area==="spec")result2=await runLifecycleV2Command(area,action,parsed,filesystem,composition,lifecycle);else if(area==="change")result2=await runChangeV2Command(action,parsed,composition,lifecycle);if(area==="conversation"){result2=await runConversationV2Command(action,parsed,composition,filesystem,lifecycle)}else if(area==="subagent"){result2=await runSubagentV2Command(action,parsed,composition,filesystem)}else if(area==="task"){result2=await runLifecycleV2Command(area,action,parsed,filesystem,composition,lifecycle)}else if(area==="execution")result2=await runExecutionV2Command(action,parsed,composition,lifecycle,async(id,options)=>runAutonomousExecutionCommand(id,options,composition,layout.projectConfig?.execution?.runtime==="autonomous"&&layout.projectConfig!==null?createAutonomousProductionDriver(filesystem,layout.projectConfig):void 0,await loadAgentCatalog(filesystem)));else if(area==="decision")result2=await runDecisionV2Command(action,parsed,filesystem,composition);else if(area==="run"||area==="run-v2"){result2=await runRunV2Command(action,parsed,composition,filesystem,lifecycle)}else if(!["prd","spec","change","task","conversation","subagent"].includes(area)){throw new UsageError(`Unknown V2 command: ${area} ${action??""}`.trim())}if(isProjectionMutation(action)){await projectMutationResult(result2,area==="run-v2"?"run":area,parsed,composition,filesystem)}return result2}function helpText(version2){return`ZAIP-AIOS ${version2}
|
|
1261
|
+
`}function isProcessAlive(pid){try{process.kill(pid,0);return true}catch(error51){return isNodeError5(error51)&&error51.code==="EPERM"}}function isNodeError5(error51){return error51 instanceof Error&&"code"in error51}function delay3(milliseconds){return new Promise(resolve10=>setTimeout(resolve10,milliseconds))}async function runProjectionMaintenance(action,parsed,filesystem,composition){const store=new ProjectionStore(filesystem);if(action==="rebuild"){if(!parsed.flags.has("confirm-full-scan")){throw new UsageError("projection rebuild requires --confirm-full-scan")}const events=await projectionBootstrapEvents(composition);return{snapshot:await store.replace(events),indexed:events.length}}if(action==="refresh")return store.refresh();if(action==="reconcile"){const id=parsed.options.id??parsed.positionals[2];if(id===void 0)throw new UsageError("projection reconcile requires --id ID");const event=await projectionEventForId(id,composition);return{snapshot:await store.appendMany([event]),reconciled:[id]}}if(action==="show"){return parsed.flags.has("active")?store.readActiveWork():store.readSnapshot()}throw new UsageError("projection requires rebuild --confirm-full-scan, refresh, reconcile --id ID, or show [--active]")}async function projectedList(area,parsed,filesystem){if(!["prd","spec","change","task","execution","run","decision"].includes(area)){throw new UsageError(`Projection does not support list area: ${area}`)}const store=new ProjectionStore(filesystem);let entities=await store.readEntities(area);if(entities.length===0&&await store.readSnapshot()===null){throw new UsageError("Local projection is not initialized; run `zaip projection rebuild --confirm-full-scan` once")}const statuses=new Set(csvOption(parsed.options.status));const from=dateBoundary(parsed.options.from,false);const to=dateBoundary(parsed.options.to,true);entities=entities.filter(entity=>statuses.size===0||entity.status!==null&&statuses.has(entity.status)).filter(entity=>parsed.options.prd===void 0||entity.relations.includes(parsed.options.prd)).filter(entity=>parsed.options.spec===void 0||entity.relations.includes(parsed.options.spec)).filter(entity=>parsed.options.change===void 0||entity.relations.includes(parsed.options.change)).filter(entity=>parsed.options.task===void 0||entity.relations.includes(parsed.options.task)).filter(entity=>parsed.options.execution===void 0||entity.relations.includes(parsed.options.execution)).filter(entity=>from===null||Date.parse(entity.updated_at)>=from).filter(entity=>to===null||Date.parse(entity.updated_at)<=to).sort((left,right)=>right.updated_at.localeCompare(left.updated_at)||right.id.localeCompare(left.id));const after=parsed.options.after;const start=after===void 0?0:entities.findIndex(entity=>entity.id===after)+1;if(after!==void 0&&start===0)throw new UsageError(`--after id not found: ${after}`);const limit=parsed.flags.has("all")?entities.length:numberOption(parsed.options.limit,20);if(limit>200&&!parsed.flags.has("all")){throw new UsageError("--limit must be at most 200; use --all explicitly")}const view=parsed.options.view??"index";if(view!=="index"&&view!=="summary"&&view!=="full")throw new UsageError("--view must be index, summary, or full");const page=entities.slice(start,start+limit);if(view==="full")return page;if(view==="summary"){return page.map(({data:_data,...entity})=>entity)}return{schema:["id","title","status","risk","priority","updated_at","work_relations"],rows:page.map(entity=>[entity.id,entity.title,entity.status,entity.risk,entity.priority,entity.updated_at,entity.relations.filter(relation=>/^(?:PRD|SPEC|CHG|TASK|EXEC|RUN)-/.test(relation)).slice(0,2)]),next_after:page.length===limit?page.at(-1)?.id??null:null}}function isProjectionMutation(action){return![void 0,"list","show","next","validate","aggregate"].includes(action)}async function projectMutationResult(result2,area,parsed,composition,filesystem){const store=new ProjectionStore(filesystem);if(area==="decision"){const decision=findDecision(result2);if(decision!==void 0)await store.append(projectionEventFromDecision(decision));return}if(area==="run"){const candidate=findRunId(result2)??parsed.options.id??parsed.positionals[2];const events2=collectLifecycleEntities(result2).map(projectionEventFromEntity);const runIds=new Set(collectRunIds(result2));if(candidate!==void 0)runIds.add(candidate);for(const runId of runIds){events2.push(projectionEventFromRun(await composition.runs.read(runId)))}if(events2.length>0)await store.appendMany(events2);return}if(area==="conversation"){const events2=collectLifecycleEntities(result2).map(projectionEventFromEntity);for(const runId of collectRunIds(result2)){events2.push(projectionEventFromRun(await composition.runs.read(runId)))}if(events2.length>0)await store.appendMany(events2);return}const events=collectLifecycleEntities(result2).map(projectionEventFromEntity);if(events.length>0)await store.appendMany(events)}async function projectionEventForId(id,composition){if(id.startsWith("PRD-"))return projectionEventFromEntity((await composition.prds.read(id)).prd);if(id.startsWith("SPEC-"))return projectionEventFromEntity((await composition.specs.read(id)).spec);if(id.startsWith("CHG-"))return projectionEventFromEntity((await composition.changes.read(id)).change);if(id.startsWith("TASK-"))return projectionEventFromEntity((await composition.tasks.read(id)).task);if(id.startsWith("EXEC-"))return projectionEventFromEntity((await composition.executions.read(id)).execution);if(id.startsWith("RUN-"))return projectionEventFromRun(await composition.runs.read(id));throw new UsageError(`Unsupported projection reconciliation id: ${id}`)}function collectLifecycleEntities(value){const found=[];const seen=new Set;const visit=candidate=>{if(Array.isArray(candidate)){candidate.forEach(visit);return}if(typeof candidate!=="object"||candidate===null)return;const record2=candidate;if(typeof record2.id==="string"&&typeof record2.status==="string"&&typeof record2.updated_at==="string"&&/^(PRD|SPEC|CHG|TASK|EXEC)-/.test(record2.id)&&!seen.has(record2.id)){seen.add(record2.id);found.push(record2)}Object.values(record2).forEach(visit)};visit(value);return found}function projectionEventFromEntity(entity){const id=entity.id;const kind=id.startsWith("PRD-")?"prd":id.startsWith("SPEC-")?"spec":id.startsWith("CHG-")?"change":id.startsWith("TASK-")?"task":"execution";const relations=new Set;collectRelationIds(entity,relations,id);for(const[key,value]of Object.entries(entity)){if(key.endsWith("_id")&&typeof value==="string")relations.add(value);if(key.endsWith("_ids")&&Array.isArray(value))value.filter(item=>typeof item==="string").forEach(item=>{relations.add(item)})}return{schema_version:1,event_id:`${id}:${String(entity.updated_at)}:${String(entity.status)}`,occurred_at:entity.updated_at,operation:"upsert",entity:{kind,id,title:typeof entity.title==="string"?entity.title:null,status:entity.status,risk:typeof entity.risk==="string"?entity.risk:null,priority:typeof entity.priority==="string"?entity.priority:null,updated_at:entity.updated_at,relations:[...relations],usage:null,data:Object.fromEntries(Object.entries(entity).filter(([key])=>key!=="prepared_plan"))}}}function collectRelationIds(value,relations,ownId){if(typeof value==="string"){if(/^(?:PRD|SPEC|CHG|TASK|EXEC|RUN|REQ|AC)-/.test(value)&&value!==ownId){relations.add(value)}return}if(Array.isArray(value)){value.forEach(item=>{collectRelationIds(item,relations,ownId)});return}if(typeof value==="object"&&value!==null){Object.values(value).forEach(item=>{collectRelationIds(item,relations,ownId)})}}function projectionEventFromRun(fold){const costInput=runCostInput(fold);const aggregate=aggregateRunV2Usage([costInput],fold.run.run_id);const usage=aggregate.total;const runtime=fold.effective_usage_records.findLast(record2=>record2.runtime)?.runtime;const observedRuntime=fold.effective_usage_records.at(-1);return{schema_version:1,event_id:`${fold.run.run_id}:${fold.records.length}:${fold.status}`,occurred_at:fold.records.at(-1)?.occurred_at??fold.run.occurred_at,operation:"upsert",entity:{kind:"run",id:fold.run.run_id,title:null,status:fold.status,risk:null,priority:null,updated_at:fold.records.at(-1)?.occurred_at??fold.run.occurred_at,relations:[fold.run.parent_run_id,fold.run.prd_id,fold.run.spec_id,fold.run.change_id,fold.run.task_id,fold.run.execution_id].filter(item=>item!==null),usage:{input_tokens:usage.tokens.input,output_tokens:usage.tokens.output,cached_input_tokens:usage.tokens.cached_input,total_tokens:usage.tokens.total,cost:usage.cost.brl??usage.cost.usd,currency:usage.cost.brl!==null?"BRL":usage.cost.usd!==null?"USD":null},data:{phase:fold.records.findLast(record2=>"phase"in record2)?.phase??fold.run.phase,run_role:effectiveRunV2Role(fold.run),run_kind:effectiveRunV2Kind(fold.run),run_purpose:effectiveRunV2Purpose(fold.run),requires_finalizer:runV2RequiresFinalizer(fold.run),parent_run_id:fold.run.parent_run_id,entrypoint:fold.run.entrypoint,work_type:fold.run.work_type,client:fold.run.client,agent:fold.run.agent,agent_name:fold.run.agent==="codex"?"codex":fold.run.agent_name??canonicalAgentName(fold.run.agent),provider:observedRuntime?.provider??fold.run.provider,model:fold.run.model,reasoning_effort:fold.run.reasoning_effort??fold.model_selection_records[0]?.requested.reasoning_effort??null,...effectiveConfiguration(fold),...callSummary(fold),service_tier:runtime?.service_tier??null,client_thread_id:fold.run.client_thread_id??null,client_turn_id:fold.run.client_turn_id??null,conversation_id:fold.run.conversation_id,execution_id:fold.run.execution_id,task_id:fold.run.task_id,spec_id:fold.run.spec_id,prd_id:fold.run.prd_id,change_id:fold.run.change_id,intake:fold.run.intake??null,started_at:fold.run.occurred_at,finished_at:effectiveRunFinishedAt(fold),pricing_segments:fold.effective_usage_records.map(record2=>({phase:record2.phase,provider:record2.provider,model:record2.model,service_tier:record2.runtime?.service_tier??runtime?.service_tier??null,input_tokens:record2.tokens.input,cached_input_tokens:record2.tokens.cached_input,output_tokens:record2.tokens.output,reasoning_tokens:record2.tokens.reasoning,total_tokens:record2.tokens.total,recorded_usd:record2.cost.usd,recorded_brl:record2.cost.brl,recorded_fx_rate:record2.cost.fx_rate??null})),entrypoint_usage:{conversation:aggregate.conversation,planning:aggregate.planning,execution:aggregate.execution,total:usage}}}}}function canonicalAgentName(agent){return agent.startsWith("agent-")?`zaip-agent-${agent.slice("agent-".length)}`:agent}function effectiveConfiguration(fold){const models=new Set([...fold.provider_invocation_records.map(record2=>record2.effective.model),...fold.effective_usage_records.map(record2=>record2.model)].filter(value=>value!==null));const efforts=new Set([...fold.provider_invocation_records.map(record2=>record2.effective.reasoning_effort),...fold.effective_usage_records.map(record2=>record2.runtime?.reasoning_effort??null)].filter(value=>value!==null));return{effective_model:models.size===1?[...models][0]??null:null,effective_reasoning_effort:efforts.size===1?[...efforts][0]??null:null,effective_config_mixed:models.size>1||efforts.size>1}}function callSummary(fold){const ids=new Set([...fold.model_selection_records.map(record2=>record2.invocation_id),...fold.provider_invocation_records.map(record2=>record2.invocation_id)]);if(ids.size===0){return{call_count:null,terminal_call_count:null,failed_call_count:null,cancelled_call_count:null}}return{call_count:ids.size,terminal_call_count:fold.provider_invocation_records.length,failed_call_count:fold.provider_invocation_records.filter(record2=>record2.status==="failed").length,cancelled_call_count:fold.provider_invocation_records.filter(record2=>record2.status==="cancelled").length}}function effectiveRunFinishedAt(fold){const recordedFinish=fold.finished?.occurred_at??null;if(recordedFinish===null)return null;const startedAtMs=Date.parse(fold.run.occurred_at);const recordedFinishMs=Date.parse(recordedFinish);const reconciledFinishMs=fold.records.filter(record2=>"activity_kind"in record2&&record2.activity_kind==="retrospective_local_reconciliation").map(record2=>"source_occurred_at"in record2?record2.source_occurred_at??null:null).map(value=>value===null?Number.NaN:Date.parse(value)).filter(value=>Number.isFinite(value)&&value>=startedAtMs&&value<=recordedFinishMs);if(reconciledFinishMs.length===0)return recordedFinish;return new Date(Math.max(...reconciledFinishMs)).toISOString()}function projectionEventFromDecision(decision){return{schema_version:1,event_id:`${decision.id}:${decision.created_at}`,occurred_at:decision.created_at,operation:"upsert",entity:{kind:"decision",id:decision.id,title:decision.title,status:null,risk:null,priority:null,updated_at:decision.created_at,relations:[decision.scope_id],usage:null,data:{origin:decision.origin,scope_type:decision.scope_type,scope_id:decision.scope_id,category:decision.category,created_at:decision.created_at}}}}function runCostInput(fold){return{run:{run_id:fold.run.run_id,attribution_status:fold.run.attribution_status,conversation_id:fold.run.conversation_id,execution_id:fold.run.execution_id,task_id:fold.run.task_id,spec_id:fold.run.spec_id,prd_id:fold.run.prd_id,change_id:fold.run.change_id,work_type:fold.run.work_type},records:fold.records,effective_usage_records:fold.effective_usage_records}}function findRunId(value){if(typeof value!=="object"||value===null)return void 0;const record2=value;if(typeof record2.run_id==="string")return record2.run_id;for(const child of Object.values(record2)){const result2=findRunId(child);if(result2!==void 0)return result2}return void 0}function collectRunIds(value){const found=new Set;const visit=candidate=>{if(Array.isArray(candidate)){candidate.forEach(visit);return}if(typeof candidate!=="object"||candidate===null)return;const record2=candidate;if(typeof record2.run_id==="string"&&record2.run_id.startsWith("RUN-")){found.add(record2.run_id)}Object.values(record2).forEach(visit)};visit(value);return[...found]}function findDecision(value){if(typeof value!=="object"||value===null)return void 0;const record2=value;if(typeof record2.id==="string"&&record2.id.startsWith("DEC-")&&typeof record2.created_at==="string"){return record2}for(const child of Object.values(record2)){const result2=findDecision(child);if(result2!==void 0)return result2}return void 0}async function projectionBootstrapEvents(composition){const[prds,specs,changes,tasks,executions,runs,decisions]=await Promise.all([composition.prds.list(),composition.specs.list(),composition.changes.list(),composition.tasks.list(),composition.executions.list(),composition.runs.list(),composition.decisions.list()]);return[...[...prds,...specs,...changes,...tasks,...executions].map(entity=>projectionEventFromEntity(entity)),...runs.map(projectionEventFromRun),...decisions.map(projectionEventFromDecision)]}var AGENT_CATALOG_PATH2=".agents/config/agents/catalog.yaml";async function loadAgentCatalog(filesystem){if(!await filesystem.exists(AGENT_CATALOG_PATH2)){throw new UsageError(`Agent catalog not found at ${AGENT_CATALOG_PATH2}`)}const catalog=parseAgentCatalog(parseYaml(await filesystem.readText(AGENT_CATALOG_PATH2)));const findings=validateAgentCatalog(catalog);if(findings.length>0){throw new Error(`Invalid Agent catalog: ${findings[0]?.message??"unknown finding"}`)}return catalog}async function resolveRunAgentIdentity(filesystem,input){const client=input.client.trim();if(client.length===0)throw new UsageError("--client must not be empty");const fallback=client==="codex"||client.startsWith("codex-")?"codex":client;const requested=input.agent?.trim();if(requested===void 0||requested.length===0||requested===client||requested===fallback){return fallback}const catalog=await loadAgentCatalog(filesystem).catch(error51=>{if(error51 instanceof UsageError){throw new UsageError(`${error51.message}; omit --agent to use fallback "${fallback}"`)}throw error51});const selected=catalog.agents.find(agent=>agent.id===requested||agent.codex_name===requested);if(selected!==void 0)return selected.id;const available=catalog.agents.flatMap(agent=>[agent.id,agent.codex_name]).sort().join(", ");throw new UsageError(`Unknown Agent "${requested}". Use one of: ${available}; omit --agent to use fallback "${fallback}"`)}async function resolveRunAgentName(filesystem,agentId2){if(agentId2==="codex")return"codex";if(!agentId2.startsWith("agent-"))return agentId2;const catalog=await loadAgentCatalog(filesystem);return catalog.agents.find(agent=>agent.id===agentId2)?.codex_name??null}var RunAttributionV2Error=class extends Error{name="RunAttributionV2Error"};async function validateRunV2Attribution(input,repositories){const entrypointId={conversation:input.conversationId,task:input.taskId,spec:input.specId,prd:input.prdId}[input.entrypoint];if(entrypointId===void 0||entrypointId===null){throw new RunAttributionV2Error(`${input.entrypoint} entrypoint requires its scope id`)}if(input.entrypoint==="conversation"&&[input.taskId,input.specId,input.prdId,input.changeId].some(value=>value!==void 0&&value!==null)){throw new RunAttributionV2Error("Conversation entrypoint cannot claim a delivery lifecycle ancestor")}const execution=await optionalRead(input.executionId,"Execution",id=>repositories.executions.read(id));const task=await optionalRead(input.taskId,"Task",id=>repositories.tasks.read(id));const change=await optionalRead(input.changeId,"Change",id=>repositories.changes.read(id));const spec=await optionalRead(input.specId,"SPEC",id=>repositories.specs.read(id));await optionalRead(input.prdId,"PRD",id=>repositories.prds.read(id));if(input.phase==="execution"&&execution===null){throw new RunAttributionV2Error("Execution phase requires an existing Execution")}if(input.phase==="execution"&&execution!==null&&!new Set(["running","verifying"]).has(execution.execution.status)){throw new RunAttributionV2Error(`Execution ${execution.execution.id} is not running or verifying`)}if(task!==null){if(change!==null&&task.task.change_id!==change.change.id){throw new RunAttributionV2Error(`Task ${task.task.id} does not resolve to the attributed Change`)}if(input.phase==="execution"&&change===null){throw new RunAttributionV2Error(`Execution Run for Task ${task.task.id} requires its materialized Change`)}if(input.phase==="execution"&&execution===null){throw new RunAttributionV2Error(`Task ${task.task.id} attribution requires an Execution`)}if(input.phase==="execution"&&!new Set(["executing","verifying"]).has(task.task.status)){throw new RunAttributionV2Error(`Task ${task.task.id} is not executing or verifying`)}if(execution!==null&&execution.execution.origin.type!=="interaction"&&execution.execution.plan_hash!==null){const node=execution.execution.dag.nodes.find(candidate=>candidate.task_id===task.task.id);if(node===void 0||node.change_id!==task.task.change_id){throw new RunAttributionV2Error(`Execution ${execution.execution.id} does not own Task ${task.task.id} and Change ${task.task.change_id}`)}}}if(change!==null&&task===null&&execution!==null&&execution.execution.origin.type!=="interaction"&&execution.execution.plan_hash!==null){const ownsChange=execution.execution.dag.nodes.some(candidate=>candidate.change_id===change.change.id);if(!ownsChange){throw new RunAttributionV2Error(`Execution ${execution.execution.id} does not contain Change ${change.change.id}`)}}if(spec!==null&&input.prdId!==void 0&&input.prdId!==null&&spec.spec.prd_id!==input.prdId){throw new RunAttributionV2Error(`SPEC ${spec.spec.id} does not belong to PRD ${input.prdId}`)}if(execution!==null){const origin=execution.execution.origin;if(origin.type==="interaction"&&origin.conversation_id!==input.conversationId){throw new RunAttributionV2Error(`Interaction Execution ${execution.execution.id} belongs to another Conversation`)}if(origin.type==="spec"&&origin.spec_id!==input.specId){throw new RunAttributionV2Error(`Execution ${execution.execution.id} requires SPEC ${origin.spec_id}, not ${input.specId??"none"}`)}if(origin.type==="prd"&&origin.prd_id!==input.prdId){throw new RunAttributionV2Error(`Execution ${execution.execution.id} requires PRD ${origin.prd_id}, not ${input.prdId??"none"}`)}if(origin.type==="task"&&origin.task_id!==input.taskId){throw new RunAttributionV2Error(`Task-first Execution ${execution.execution.id} requires Task ${origin.task_id}, not ${input.taskId??"none"}`)}}if(change!==null){if(input.phase==="execution"&&!new Set(["executing","verifying"]).has(change.change.status)){throw new RunAttributionV2Error(`Change ${change.change.id} is not executing or verifying`)}const source=change.change.source;if(source.type==="spec"&&input.specId!==source.spec_id){throw new RunAttributionV2Error(`Change ${change.change.id} belongs to SPEC ${source.spec_id}, not ${input.specId??"none"}`)}if(source.type==="prd"&&input.prdId!==source.prd_id){throw new RunAttributionV2Error(`Change ${change.change.id} belongs to PRD ${source.prd_id}, not ${input.prdId??"none"}`)}if(source.type==="task"&&task!==null&&source.task_id!==task.task.id){throw new RunAttributionV2Error(`Task-first Change ${change.change.id} belongs to ${source.task_id}, not ${task.task.id}`)}}for(const[relationship,relatedId]of[["parent",input.parentRunId],["continuation",input.continuationOfRunId],["retry",input.retryOfRunId]]){if(relatedId===void 0||relatedId===null)continue;const related=await requiredRead(relatedId,`${relationship} Run`,id=>repositories.runs.read(id));if(related.run.conversation_id!==input.conversationId){throw new RunAttributionV2Error(`${relationship} Run ${relatedId} belongs to another Conversation`)}if(relationship==="retry"&&related.run.task_id!==(input.taskId??null)){throw new RunAttributionV2Error(`Retry Run ${relatedId} belongs to another Task`)}}}async function optionalRead(id,label,read){return id===void 0||id===null?null:requiredRead(id,label,read)}async function requiredRead(id,label,read){try{return await read(id)}catch(error51){throw new RunAttributionV2Error(`${label} does not resolve: ${id} (${error51 instanceof Error?error51.message:String(error51)})`)}}function conversationRequestOptions(userMessage){const objective=conversationObjective(userMessage);return{objective,risk:inferredConversationRisk(objective)}}function resolveConversationIntent(parsed){const value=parsed.options.intent;if(value===void 0){return hasCompleteNewWorkMetadata(parsed)?"new_work":"conversation"}const normalized=value.toLocaleLowerCase().replaceAll("-","_");if(normalized==="conversation"||normalized==="continue"||normalized==="refine"||normalized==="rework"||normalized==="new_work"||normalized==="git_only"){return normalized}throw new UsageError("--intent must be conversation, continue, refine, rework, new-work, or git-only")}function intakeDecision(parsed,intent){const intentWasProvided=parsed.options.intent!==void 0;const explicitMetadata=!intentWasProvided&&hasCompleteNewWorkMetadata(parsed);const source=parsed.options["classification-source"];const classificationSource=source===void 0?intentWasProvided?"agent":explicitMetadata?"explicit":"fallback":source;if(!new Set(["agent","explicit","fallback"]).has(classificationSource)){throw new UsageError("--classification-source must be agent, explicit, or fallback")}const defaultConfidence=classificationSource==="fallback"?"0":"0.9";const reasonCodes=csvOption(parsed.options["reason-codes"]);return{intent,classification_source:classificationSource,confidence:confidenceOption(parsed.options.confidence??defaultConfidence),reason_codes:reasonCodes.length>0?reasonCodes:[classificationSource==="fallback"?"safe-conversation-fallback":explicitMetadata?"complete-task-metadata":"agent-classified"]}}function requireSemanticNewWorkMetadata(parsed){const title=parsed.options.title;const shortName=parsed.options["short-name"];const objective=parsed.options.objective;if(title===void 0||shortName===void 0||objective===void 0){throw new UsageError("new-work intake requires --title, --short-name, and --objective")}const wordCount=title.trim().split(/\s+/).filter(Boolean).length;if(wordCount<4||wordCount>10){throw new UsageError("new-work --title must contain 4 to 10 words")}return{title:title.trim(),shortName:shortName.trim(),objective:objective.trim()}}function describesEquivalentWork(requested,current){const requestedShortName=normalizeWorkKey(requested.shortName);if(requestedShortName.length>0&&requestedShortName===normalizeWorkKey(current.short_name)){return true}const requestedTerms=semanticTerms(`${requested.title} ${requested.objective}`);const currentTerms=semanticTerms(`${current.title} ${current.objective}`);if(requestedTerms.size<5||currentTerms.size<5)return false;let shared=0;for(const term of requestedTerms){if(currentTerms.has(term))shared+=1}return shared>=5&&shared/Math.min(requestedTerms.size,currentTerms.size)>=.7}async function findIntakeForExactTurn(composition,client,invocation){if(invocation.clientThreadId===null||invocation.clientTurnId===null)return null;const matches=(await composition.runs.list()).filter(fold=>fold.run.client===client&&(fold.run.intake!=null||fold.run.phase==="conversation"&&fold.run.execution_id===null)&&fold.run.client_thread_id===invocation.clientThreadId&&fold.run.client_turn_id===invocation.clientTurnId);if(matches.length>1){throw new UsageError(`Exact client turn already has multiple intake Runs: ${matches.map(fold=>fold.run.run_id).join(", ")}`)}return matches[0]??null}async function latestThreadContext(composition,client,clientThreadId){if(clientThreadId===null)return{conversationId:null,implicitTarget:null};const runs=(await composition.runs.list()).filter(fold=>fold.run.client===client&&fold.run.client_thread_id===clientThreadId);const targetRun=runs.find(fold=>fold.run.task_id!==null||fold.run.spec_id!==null||fold.run.prd_id!==null);return{conversationId:runs[0]?.run.conversation_id??null,implicitTarget:targetRun===void 0?null:targetFromRun(targetRun)}}function explicitIntakeTarget(parsed){const candidates=[parsed.options.task===void 0?null:{entrypoint:"task",taskId:parsed.options.task},parsed.options.spec===void 0?null:{entrypoint:"spec",specId:parsed.options.spec},parsed.options.prd===void 0?null:{entrypoint:"prd",prdId:parsed.options.prd}];const targets=candidates.filter(target=>target!==null);if(targets.length>1){throw new UsageError("continue/refine/rework intake accepts only one of --task, --spec, or --prd")}return targets[0]??null}function isImplicitConversationCapture(parsed){return["intent","title","short-name","objective","requirements","acceptance","task","spec","prd","change","run"].every(option=>parsed.options[option]===void 0)}function isGitOnlyPublicationRequest(userMessage){if(userMessage===null)return false;const normalized=userMessage.normalize("NFKD").replace(/[\u0300-\u036f]/g,"").toLocaleLowerCase().replace(/[^a-z0-9]+/g," ").trim();if(normalized.length===0||normalized.split(/\s+/).length>12)return false;if(/\b(corrig|consert|repar|fix|falh|erro|ci|teste|codigo|implement|alter|qual|quando|como|status|atual)\w*\b/.test(normalized)){return false}return/\b(deploy|push|publicar|publique|publica|publish)\b/.test(normalized)}function hasCompleteNewWorkMetadata(parsed){return["title","short-name","objective"].every(option=>parsed.options[option]!==void 0)}var semanticStopWords=new Set(["a","an","and","as","at","by","com","da","das","de","do","dos","e","em","for","from","in","into","na","nas","no","nos","of","on","or","para","per","por","que","that","the","this","to","um","uma","with"]);function semanticTerms(value){return new Set(normalizeWorkKey(value).split(" ").map(term=>singularizeSemanticTerm(term)).filter(term=>term.length>=3&&!semanticStopWords.has(term)))}function normalizeWorkKey(value){return value.normalize("NFKD").replace(/[\u0300-\u036f]/g,"").toLocaleLowerCase().replace(/[^a-z0-9]+/g," ").trim()}function singularizeSemanticTerm(term){if(term.length>4&&term.endsWith("s")&&!term.endsWith("ss"))return term.slice(0,-1);return term}function targetFromRun(fold){if(fold.run.task_id!==null)return{entrypoint:"task",taskId:fold.run.task_id};if(fold.run.spec_id!==null)return{entrypoint:"spec",specId:fold.run.spec_id};if(fold.run.prd_id!==null)return{entrypoint:"prd",prdId:fold.run.prd_id};return null}function conversationObjective(userMessage){const fallback="Capture the current client turn";if(userMessage===null)return fallback;const normalized=userMessage.replace(/\r\n?/g,"\n").trim();const requestHeading=/^##\s+My request for Codex:\s*$/im;const match=requestHeading.exec(normalized);const request=match===null?normalized:normalized.slice(match.index+match[0].length);return request.replace(/<image\b[\s\S]*$/i,"").replace(/\s+/g," ").trim()||fallback}function inferredConversationRisk(objective){const normalized=objective.normalize("NFKD").replace(/[\u0300-\u036f]/g,"").toLocaleLowerCase();const isSmallFrontendAdjustment=normalized.length<=280&&/\b(ajust|corrig|alter|troqu|mud)\w*\b/.test(normalized)&&/\b(front(?:end)?|interface|ui|visual|css|layout|tela|botao|modal|popup|coluna|aba|card)\w*\b/.test(normalized);const hasElevatedScope=/\b(api|backend|banco|database|schema|migr|auth|segur|deploy|infra|lifecycle|task-first|cli)\w*\b/.test(normalized);return isSmallFrontendAdjustment&&!hasElevatedScope?"lite":"standard"}async function recordCodexTelemetryIfAvailable(current,composition,filesystem){if(current.effective_usage_records.length>0||!isCodexTelemetryClient(current.run.client)||current.run.client_thread_id===null&¤t.run.client_turn_id===null){return current}return composition.runs.withUsageAttributionLock(async()=>{const freshCurrent=await composition.runs.read(current.run.run_id);if(freshCurrent.finished!==null||freshCurrent.effective_usage_records.length>0){return freshCurrent}const allRuns=await composition.runs.list();const exactTurn=freshCurrent.run.client_turn_id??null;const telemetryThreadId=telemetrySourceThreadId(freshCurrent,allRuns);const existingSegmentKeys=new Set(allRuns.flatMap(fold=>fold.effective_usage_records.flatMap(record2=>record2.source_segment_key?[record2.source_segment_key]:[])));const candidate=await findLatestCodexSegment(filesystem.root,exactTurn===null?existingSegmentKeys:new Set,{startedAfter:freshCurrent.run.occurred_at,threadId:telemetryThreadId,turnId:exactTurn});const timestamp9=Date.parse(candidate?.finishedAt??candidate?.startedAt??"");if(candidate===null||!Number.isFinite(timestamp9)||!(exactTurn!==null&&candidate.turnId===exactTurn||timestamp9>=Date.parse(freshCurrent.run.occurred_at))){return freshCurrent}const cumulative=aggregateSegmentUsage(candidate);const previous=allRuns.filter(fold=>fold.run.run_id!==freshCurrent.run.run_id&&exactTurn!==null&&fold.run.client_turn_id===exactTurn).flatMap(fold=>fold.effective_usage_records).filter(record2=>record2.source_segment_key===candidate.segmentKey||record2.source_segment_key?.startsWith(`${candidate.segmentKey}@`)===true).reduce((total,record2)=>({input:total.input+(record2.tokens.input??0),cached_input:total.cached_input+(record2.tokens.cached_input??0),output:total.output+(record2.tokens.output??0),reasoning:total.reasoning+(record2.tokens.reasoning??0)}),{input:0,cached_input:0,output:0,reasoning:0});const input=Math.max(0,(cumulative.input??0)-previous.input);const output2=Math.max(0,(cumulative.output??0)-previous.output);const tokens={input,cached_input:Math.max(0,(cumulative.cached_input??0)-previous.cached_input),output:output2,reasoning:Math.max(0,(cumulative.reasoning??0)-previous.reasoning),total:input+output2,source:"provider_reported"};if(tokens.input===0&&tokens.cached_input===0&&tokens.output===0&&tokens.reasoning===0){return freshCurrent}const model=candidate.model??freshCurrent.run.model;const provider=inferProvider(model,freshCurrent.run.provider??freshCurrent.run.client,freshCurrent.run.agent);const pricing=new PricingRepository(filesystem);const estimated=estimateUsageCost({provider,model,usage:tokens,catalog:await pricing.readCatalog(),fxRate:await pricing.readLatestFxRate()});const sequence=freshCurrent.records.length+1;const usage=usageRecordedV2Schema.parse({schema_version:2,event_id:`${freshCurrent.run.run_id}:${String(sequence).padStart(6,"0")}`,run_id:freshCurrent.run.run_id,sequence,occurred_at:new Date().toISOString(),type:"usage.recorded",phase:latestPhase(freshCurrent),activity_kind:"implementation",classification_source:"current_context",tokens,cost:{usd:estimated.estimated_usd,brl:estimated.estimated_brl,fx_rate:estimated.fx_rate},provider,model,source_segment_key:exactTurn===null?candidate.segmentKey:`${candidate.segmentKey}@${freshCurrent.run.run_id}`,runtime:{reasoning_effort:candidate.reasoningEffort??null,service_tier:candidate.serviceTier??null},supersedes_event_id:null,source_occurred_at:candidate.finishedAt??candidate.startedAt??void 0});await composition.runs.appendRecord(usage);return foldRunV2Records([...freshCurrent.records,usage])})}function isCodexTelemetryClient(client){return["codex","codex-desktop","codex-subagent"].includes(client)}function telemetrySourceThreadId(current,allRuns){const runsById=new Map(allRuns.map(fold=>[fold.run.run_id,fold]));let run=current.run;const visited=new Set;while(run.parent_run_id!==null&&!visited.has(run.run_id)){visited.add(run.run_id);const parent=runsById.get(run.parent_run_id);if(parent===void 0)break;run=parent.run}return run.client_thread_id??current.run.client_thread_id??null}function latestPhase(current){const latest=current.records.findLast(record2=>"phase"in record2);return latest?.phase??"conversation"}async function resolveRunClientInvocation(filesystem,client,options={}){if(!new Set(["codex","codex-desktop"]).has(client)){return{clientThreadId:null,clientTurnId:null,userMessage:null}}const threadId=normalizedId(options.threadId??process.env.CODEX_THREAD_ID);const turnId=normalizedId(options.turnId??process.env.CODEX_TURN_ID);if(threadId!==null&&turnId!==null){return{clientThreadId:threadId,clientTurnId:turnId,userMessage:null}}const active=await findActiveCodexInvocation(filesystem.root,{threadId,...options.sessionsRoot===void 0?{}:{sessionsRoot:options.sessionsRoot},...options.now===void 0?{}:{now:options.now}});return{clientThreadId:threadId??active?.sessionId??null,clientTurnId:turnId??active?.turnId??null,userMessage:active?.userMessage??null}}function normalizedId(value){const normalized=value?.trim();return normalized===void 0||normalized.length===0?null:normalized}function activeDescendantRuns(rootRunId,candidates){const descendants=[];const parentIds=new Set([rootRunId]);let discovered=true;while(discovered){discovered=false;for(const candidate of candidates){if(candidate.run.parent_run_id!==null&&parentIds.has(candidate.run.parent_run_id)&&!parentIds.has(candidate.run.run_id)){parentIds.add(candidate.run.run_id);descendants.push(candidate);discovered=true}}}return descendants.filter(candidate=>candidate.finished===null)}function assessRunFinalizationBarrier(parent,candidates){const required2=runV2RequiresFinalizer(parent.run);if(!required2){return{required:false,status:"not_required",finalizer_run_id:null,satisfied:true}}const finalizer=directFinalizers(parent.run.run_id,candidates).at(-1);if(finalizer===void 0){return{required:true,status:"missing",finalizer_run_id:null,satisfied:false}}const status=finalizer.status;return{required:true,status,finalizer_run_id:finalizer.run.run_id,satisfied:status==="completed"}}function assertChildRunMayStart(parent,purpose,agent,candidates,executionEligibility=[]){if(parent.finished!==null)throw new Error(`Parent Run is already finished: ${parent.run.run_id}`);const crossedBarrier=ancestorLineage(parent,candidates).find(ancestor=>directFinalizers(ancestor.run.run_id,candidates).length>0);if(crossedBarrier!==void 0){throw new Error(`Run ${crossedBarrier.run.run_id} crossed its finalization barrier; no new Sub-Run may start`)}const executionKind=parent.run.execution_kind;if(purpose==="execution"&&(executionKind===void 0||!executionEligibility.includes(executionKind))){throw new Error(`Agent ${agent} lacks an execution capability for Run ${parent.run.run_id}`)}if(purpose==="finalization"&&agent!=="agent-finalizer"){throw new Error(`Finalizer for Run ${parent.run.run_id} requires agent-finalizer`)}if(purpose!=="finalization")return;if(effectiveRunV2Role(parent.run)==="orchestrator"&&directExecutors(parent.run.run_id,executionKind,candidates).length===0){throw new Error(`Finalizer for Execution Run ${parent.run.run_id} requires a prior capable executor Sub-Run`)}const active=activeDescendantRuns(parent.run.run_id,candidates);if(active.length>0){throw new Error(`Finalizer for Run ${parent.run.run_id} must be the last Sub-Run; active descendants: ${active.map(run=>run.run.run_id).join(", ")}`)}}function directExecutors(parentRunId,executionKind,candidates){return candidates.filter(candidate=>candidate.run.parent_run_id===parentRunId&&effectiveRunV2Purpose(candidate.run)==="execution"&&(executionKind!==void 0&&candidate.run.execution_eligibility?.includes(executionKind)===true||executionKind===void 0&&candidate.run.execution_eligibility===void 0&&candidate.run.agent==="agent-task-executor")&&candidate.run.agent!=="agent-finalizer")}function ancestorLineage(parent,candidates){const byId2=new Map(candidates.map(candidate=>[candidate.run.run_id,candidate]));const lineage=[];const visited=new Set;let current=parent;while(current!==void 0&&!visited.has(current.run.run_id)){lineage.push(current);visited.add(current.run.run_id);current=current.run.parent_run_id===null?void 0:byId2.get(current.run.parent_run_id)}return lineage}function directFinalizers(parentRunId,candidates){return candidates.filter(candidate=>candidate.run.parent_run_id===parentRunId&&effectiveRunV2Purpose(candidate.run)==="finalization"&&(candidate.run.agent==="agent-finalizer"||candidate.run.agent==="agent-task-finalizer")).sort((left,right)=>left.run.occurred_at.localeCompare(right.run.occurred_at))}async function assessRunLifecycleClosure(current,composition,candidateRuns){const role=effectiveRunV2Role(current.run);if(role==="intake"||role==="subagent"){return emptyClosure(current.run.run_id)}const subjects=(await Promise.all(current.run.entrypoint==="task"?[subject("task",current.run.task_id,composition,role,current)]:[subject("spec",current.run.spec_id,composition,role,current),subject("prd",current.run.prd_id,composition,role,current)])).filter(item=>item!==null);void candidateRuns;const openSubjectIds=subjects.filter(item=>!item.settled).map(item=>item.id);const status=subjects.length===0?"not_applicable":openSubjectIds.length===0?"closed":"action_required";return{status,run_id:current.run.run_id,continuation_run_id:null,subjects,open_subject_ids:openSubjectIds,default_inconclusive_outcome:"blocked",allowed_terminal_outcomes:["completed","blocked","failed","cancelled"],guidance:status==="action_required"?"Start an attributed continuation Run or settle every related work item; use blocked by default, failed only for an execution-preventing error, and cancelled only after an explicit user cancellation.":"Run lifecycle closure is satisfied."}}async function subject(kind,id,composition,role,current){if(id===null)return null;try{const status=kind==="task"?(await composition.tasks.read(id)).task.status:kind==="spec"?(await composition.specs.read(id)).spec.status:(await composition.prds.read(id)).prd.status;return{kind,id,status,settled:isSettled(kind,status,role,current)}}catch{return{kind,id,status:"missing",settled:false}}}function isSettled(kind,status,role,current){if(kind==="task")return["completed","blocked","failed","cancelled"].includes(status);if(role==="orchestrator"&¤t.finished?.status==="completed")return status!=="missing";return["delivered","blocked","failed","cancelled"].includes(status)}function emptyClosure(runId){return{status:"not_applicable",run_id:runId,continuation_run_id:null,subjects:[],open_subject_ids:[],default_inconclusive_outcome:"blocked",allowed_terminal_outcomes:["completed","blocked","failed","cancelled"],guidance:"Run lifecycle closure is satisfied."}}function lifecycleReconciliationOutcome(value){if(value===void 0)return void 0;if(value==="completed"||value==="blocked"||value==="failed"||value==="cancelled"){return value}throw new Error("--task-outcome must be completed, blocked, failed, or cancelled")}function lifecycleOutcomeOption(options){if(options["owner-outcome"]!==void 0){throw new Error("Legacy lifecycle outcome option is no longer supported; use --task-outcome")}return lifecycleReconciliationOutcome(options["task-outcome"])}var SETTLEABLE_TASK=new Set(["draft","planned","executing","verifying"]);var SETTLEABLE_CHANGE=new Set(["planned","executing","verifying"]);var SETTLEABLE_EXECUTION=new Set(["planned","running","paused","verifying"]);function isTaskAttemptRun(current){return effectiveRunV2Role(current.run)==="orchestrator"&¤t.run.parent_run_id===null&¤t.run.entrypoint==="task"}async function reconcileFinishedRunLifecycle(current,composition,lifecycle,options={}){if(current.finished===null)throw new Error(`Run is still running: ${current.run.run_id}`);const role=effectiveRunV2Role(current.run);if(role==="intake"||role==="subagent"){return emptyResult(current.run.run_id,"not_applicable")}if(current.run.execution_id!==null){const execution=await composition.executions.read(current.run.execution_id).catch(()=>null);if(execution?.execution.kind==="interaction"){return emptyResult(current.run.run_id,"not_applicable")}}if(options.defer===true){throw new Error(`Orchestrator Run closure cannot be deferred for Run ${current.run.run_id}`)}const closure=await assessRunLifecycleClosure(current,composition,options.candidateRuns);if(closure.status==="not_applicable")return emptyResult(current.run.run_id,"not_applicable");const catalog=options.catalog??await loadCatalog(composition);const graph=relatedGraph(current,catalog);const requested=resolveOutcome(current,graph.tasks,options.requestedOutcome);if(requested==="completed"){try{const completed=await completeGraph(current,graph,composition,lifecycle,options);return{...completed,status:"closed",outcome:"completed"}}catch(error51){const message=error51 instanceof Error?error51.message:String(error51);const blocked=await settleGraph(current,await refreshGraph(graph,composition),composition,lifecycle,"blocked",`Completion gates did not close Run ${current.run.run_id}: ${message}`);return{...blocked,status:"closed",outcome:"blocked",fallback_from:"completed",error:message}}}const settled=await settleGraph(current,graph,composition,lifecycle,requested,options.summary===void 0?defaultReason(current.run.run_id,requested):`${options.summary} (Run ${current.run.run_id}).`);return{...settled,status:"closed",outcome:requested}}async function snapshotRunLifecycle(current,composition,catalog){const role=effectiveRunV2Role(current.run);if(role==="intake"||role==="subagent"){return emptyResult(current.run.run_id,"not_applicable")}const graph=relatedGraph(current,catalog??await loadCatalog(composition));return currentGraphResult(current.run.run_id,await refreshGraph(graph,composition))}function resolveOutcome(current,tasks,requested){if(current.finished?.status==="failed")return"failed";if(current.finished?.status==="cancelled")return"cancelled";if(requested!==void 0)return requested;if(!isTaskAttemptRun(current))return"completed";const terminal=tasks.find(task=>["completed","blocked","failed","cancelled"].includes(task.status))?.status;return terminal==="completed"||terminal==="blocked"||terminal==="failed"||terminal==="cancelled"?terminal:"blocked"}async function completeGraph(current,graph,composition,lifecycle,options){const summary=options.summary??`Run ${current.run.run_id} completed.`;const result2={summary,changed_files:[...options.changedFiles??[]],evidence_ids:[...options.evidenceIds??[]],completed_run_id:current.run.run_id};const taskAttempt=isTaskAttemptRun(current);if(taskAttempt){for(const task of graph.tasks){let latest=(await composition.tasks.read(task.id)).task;if(latest.status==="executing")latest=await composition.tasks.transition(task.id,"verifying");if(latest.status==="verifying")await lifecycle.completeTask(task.id,result2)}}else{const unfinished=graph.tasks.filter(task=>task.status!=="completed");if(unfinished.some(task=>["draft","planned","executing","verifying"].includes(task.status))){await keepMacroParentsActive(graph,composition);return currentGraphResult(current.run.run_id,await refreshGraph(graph,composition))}if(unfinished.length>0){throw new Error(`Macro Tasks did not complete: ${unfinished.map(task=>task.id).join(", ")}`)}}for(const change of graph.changes){let latest=(await composition.changes.read(change.id)).change;const relatedTasks=await Promise.all(latest.task_ids.map(async id=>(await composition.tasks.read(id)).task));if(relatedTasks.some(task=>task.status!=="completed"))continue;if(latest.status==="executing"){await lifecycle.verifyChange(change.id);latest=(await composition.changes.read(change.id)).change}if(latest.status==="verifying")await lifecycle.completeChange(change.id,summary)}for(const execution of graph.executions){let latest=(await composition.executions.read(execution.id)).execution;const relatedTasks=await Promise.all(latest.dag.nodes.map(async node=>(await composition.tasks.read(node.task_id)).task));if(relatedTasks.some(task=>task.status!=="completed"))continue;if(latest.status==="running"){await lifecycle.verifyExecution(execution.id);latest=(await composition.executions.read(execution.id)).execution}if(latest.status==="verifying")await lifecycle.completeExecution(execution.id,summary)}if(!taskAttempt){for(const spec of graph.specs.filter(item=>graph.directSpecIds.has(item.id))){if((await composition.specs.read(spec.id)).spec.status==="active")await lifecycle.deliverSpec(spec.id)}for(const prd of graph.prds.filter(item=>graph.directPrdIds.has(item.id))){if((await composition.prds.read(prd.id)).prd.status==="active")await lifecycle.deliverPrd(prd.id)}}else{await aggregateMacroAncestors(graph,composition)}const refreshed=await refreshGraph(graph,composition);assertGraphCompleted(refreshed,taskAttempt);return currentGraphResult(current.run.run_id,refreshed)}function assertGraphCompleted(graph,taskAttempt){const incomplete=[...graph.tasks.filter(item=>item.status!=="completed").map(item=>item.id),...!taskAttempt?graph.changes.filter(item=>item.status!=="completed").map(item=>item.id):[],...!taskAttempt?graph.executions.filter(item=>item.status!=="completed").map(item=>item.id):[],...graph.specs.filter(item=>!taskAttempt&&graph.directSpecIds.has(item.id)&&item.status!=="delivered").map(item=>item.id),...graph.prds.filter(item=>!taskAttempt&&graph.directPrdIds.has(item.id)&&item.status!=="delivered").map(item=>item.id)];if(incomplete.length>0){throw new Error(`Completion left related work non-terminal: ${incomplete.join(", ")}`)}}async function settleGraph(current,graph,composition,lifecycle,outcome,reason){const clock=new SystemClock;const taskAttempt=isTaskAttemptRun(current);const taskResult=outcome==="blocked"?null:{summary:reason,changed_files:[],evidence_ids:[],completed_run_id:current.run.run_id};for(const task of graph.tasks){if(SETTLEABLE_TASK.has((await composition.tasks.read(task.id)).task.status)){await composition.tasks.transition(task.id,outcome,taskResult,clock,reason)}}const standalone=graph.executions.some(execution=>execution.origin.type==="task");for(const change of taskAttempt&&!standalone?[]:graph.changes){if(SETTLEABLE_CHANGE.has((await composition.changes.read(change.id)).change.status)){await composition.changes.transition(change.id,outcome,outcome==="blocked"?null:reason,clock,reason)}}for(const execution of taskAttempt&&!standalone?[]:graph.executions){if(SETTLEABLE_EXECUTION.has((await composition.executions.read(execution.id)).execution.status)){await composition.executions.transition(execution.id,outcome,outcome==="blocked"?null:reason,clock,reason)}}const specIdsToSettle=new Set(taskAttempt?[]:specIdsForLifecycleSettlement(graph.specs.map(item=>item.id),graph.directSpecIds,graph.directPrdIds));const specsToSettle=graph.specs.filter(item=>specIdsToSettle.has(item.id));for(const spec of specsToSettle){if(outcome==="cancelled"&&graph.directPrdIds.size>0)break;if((await composition.specs.read(spec.id)).spec.status==="active"){if(outcome==="cancelled")await lifecycle.cancelSpec(spec.id);else await composition.specs.transition(spec.id,outcome,reason)}}for(const prd of graph.prds.filter(item=>!taskAttempt&&graph.directPrdIds.has(item.id))){if((await composition.prds.read(prd.id)).prd.status==="active"){if(outcome==="cancelled")await lifecycle.cancelPrd(prd.id);else await composition.prds.transition(prd.id,outcome,reason)}}if(taskAttempt&&!standalone)await aggregateMacroAncestors(graph,composition);return currentGraphResult(current.run.run_id,await refreshGraph(graph,composition))}function relatedGraph(current,catalog){const{tasks,changes,executions,specs,prds}=catalog;const taskIds=new Set(current.run.task_id===null?[]:[current.run.task_id]);const changeIds=new Set(current.run.change_id===null?[]:[current.run.change_id]);const executionIds=new Set(current.run.execution_id===null?[]:[current.run.execution_id]);const specIds=new Set(current.run.spec_id===null?[]:[current.run.spec_id]);const prdIds=new Set(current.run.prd_id===null?[]:[current.run.prd_id]);const taskAttempt=isTaskAttemptRun(current);if(!taskAttempt){for(const spec of specs)if(spec.prd_id!==null&&prdIds.has(spec.prd_id))specIds.add(spec.id)}for(const change of changes){const source=change.source;if(changeIds.has(change.id)||source.type==="task"&&taskIds.has(source.task_id)||!taskAttempt&&source.type==="spec"&&specIds.has(source.spec_id)||!taskAttempt&&source.type==="prd"&&prdIds.has(source.prd_id))changeIds.add(change.id)}for(const task of tasks){if(taskIds.has(task.id)||!taskAttempt&&changeIds.has(task.change_id)){taskIds.add(task.id)}}for(const execution of executions){if(executionIds.has(execution.id)||execution.dag.nodes.some(node=>taskIds.has(node.task_id))){executionIds.add(execution.id)}}return{tasks:tasks.filter(item=>taskIds.has(item.id)),changes:changes.filter(item=>changeIds.has(item.id)),executions:executions.filter(item=>executionIds.has(item.id)),specs:specs.filter(item=>specIds.has(item.id)),prds:prds.filter(item=>prdIds.has(item.id)),directSpecIds:new Set(current.run.spec_id===null?[]:[current.run.spec_id]),directPrdIds:new Set(current.run.prd_id===null?[]:[current.run.prd_id])}}async function keepMacroParentsActive(graph,composition){for(const spec of graph.specs){const latest=(await composition.specs.read(spec.id)).spec;if(latest.status==="ready"||latest.status==="blocked"){await composition.specs.transition(latest.id,"active")}}for(const prd of graph.prds){const latest=(await composition.prds.read(prd.id)).prd;if(latest.status==="ready"||latest.status==="blocked"){await composition.prds.transition(latest.id,"active")}}}async function aggregateMacroAncestors(graph,composition){await keepMacroParentsActive(graph,composition)}async function loadCatalog(composition){const[tasks,changes,executions,specs,prds]=await Promise.all([composition.tasks.list(),composition.changes.list(),composition.executions.list(),composition.specs.list(),composition.prds.list()]);return{tasks,changes,executions,specs,prds}}async function refreshGraph(graph,composition){const[tasks,changes,executions,specs,prds]=await Promise.all([Promise.all(graph.tasks.map(async item=>(await composition.tasks.read(item.id)).task)),Promise.all(graph.changes.map(async item=>(await composition.changes.read(item.id)).change)),Promise.all(graph.executions.map(async item=>(await composition.executions.read(item.id)).execution)),Promise.all(graph.specs.map(async item=>(await composition.specs.read(item.id)).spec)),Promise.all(graph.prds.map(async item=>(await composition.prds.read(item.id)).prd))]);return{...graph,tasks,changes,executions,specs,prds}}function currentGraphResult(runId,graph){return{run_id:runId,status:"closed",outcome:null,fallback_from:null,error:null,tasks:graph.tasks,changes:graph.changes,executions:graph.executions,specs:graph.specs,prds:graph.prds}}function emptyResult(runId,status){return{run_id:runId,status,outcome:null,fallback_from:null,error:null,tasks:[],changes:[],executions:[],specs:[],prds:[]}}function specIdsForLifecycleSettlement(specIds,directSpecIds,directPrdIds){return directPrdIds.size>0?[...specIds]:specIds.filter(id=>directSpecIds.has(id))}function defaultReason(runId,outcome){if(outcome==="failed")return`Run ${runId} failed and closed its operational lifecycle.`;if(outcome==="cancelled")return`Run ${runId} was explicitly cancelled.`;return`Run ${runId} completed without sufficient closure gates and has no concrete continuation.`}async function runConversationV2Command(action,parsed,composition,filesystem,lifecycle){if(action==="start"){const client=parsed.options.client??"codex";const clientInvocation=await resolveRunClientInvocation(filesystem,client);const requestedIntent=resolveConversationIntent(parsed);if(requestedIntent==="git_only"||isImplicitConversationCapture(parsed)&&isGitOnlyPublicationRequest(clientInvocation.userMessage)){return{skipped:true,reason:"git-only-publication",message:"Explicit deploy, push, and publication requests do not create ZAIP lifecycle records"}}const existing=await findIntakeForExactTurn(composition,client,clientInvocation);if(existing!==null){const task2=existing.run.task_id===null?null:(await composition.tasks.read(existing.run.task_id)).task;return{task:task2,run:existing.run,task_path:task2===null?null:composition.tasks.path(task2.id),run_path:composition.runs.path(existing.run.run_id),reused:true}}const request=conversationRequestOptions(clientInvocation.userMessage);const threadContext=await latestThreadContext(composition,client,clientInvocation.clientThreadId);let intent=requestedIntent;const newWorkMetadata=intent==="new_work"?requireSemanticNewWorkMetadata(parsed):null;let target=intent==="continue"||intent==="refine"||intent==="rework"?explicitIntakeTarget(parsed)??threadContext.implicitTarget:null;let decision=intakeDecision(parsed,intent);if(intent==="new_work"&&newWorkMetadata!==null&&decision.classification_source!=="explicit"&&threadContext.implicitTarget?.taskId!==void 0){const focusedTask=(await composition.tasks.read(threadContext.implicitTarget.taskId)).task;if((focusedTask.status==="draft"||focusedTask.status==="planned")&&focusedTask.started_at===null&&describesEquivalentWork(newWorkMetadata,focusedTask)){intent="continue";target=threadContext.implicitTarget;decision={intent:"continue",classification_source:"fallback",confidence:1,reason_codes:["equivalent-thread-work-reused"]}}}if((intent==="continue"||intent==="refine"||intent==="rework")&&target===null){intent="conversation";target=null;decision={intent:"conversation",classification_source:"fallback",confidence:0,reason_codes:["target-not-resolved"]}}const model=resolveConversationModel(parsed.options.model);const timeZone=composition.layout.project.timezone;const conversationId2=parsed.options.conversation??threadContext.conversationId??createConversationId(intent==="new_work"?"new-work":"conversation");const clientTurnId=clientInvocation.clientTurnId??`local-${Date.now()}-${createCollisionCode(16)}`;const executionPolicy={failure_policy:"stop_on_terminal_failure",max_parallelism:1,max_operational_retries:1,max_repair_cycles_per_task:0,verification_mode:"scoped"};const commonInput=(executionId,executionKind)=>({...parsed.options.run===void 0?{}:{id:parsed.options.run},phase:conversationCapturePhase(intent),workType:runV2WorkTypeOption(intent==="rework"?"rework":parsed.options["work-type"]??"new"),client,runRole:"orchestrator",runPurpose:"orchestration",requiresFinalizer:true,executionKind,executionEligibility:[],agent:"agent-orchestrator",agentName:"zaip-agent-orchestrator",provider:parsed.options.provider??null,model,reasoningEffort:parsed.options["reasoning-effort"]===void 0?null:runV2ReasoningEffortSchema.parse(parsed.options["reasoning-effort"]),...clientInvocation,clientTurnId,conversationId:conversationId2,executionId,intake:decision});const openIntakes=await openThreadIntakes(composition,client,clientInvocation.clientThreadId,clientInvocation.clientTurnId);const continuationOfRunId=target===null?null:openIntakes.find(fold=>runMatchesTarget(fold,target))?.run.run_id??null;if(intent!=="new_work"){const execution=target===null?await composition.executions.createInteraction({id:parsed.options.execution??createId("EXEC",`interaction-${intent}`,{timeZone}),clientTurnId,conversationId:conversationId2,policy:executionPolicy}):await composition.executions.createDeliveryIntake({id:parsed.options.execution??createId("EXEC",`delivery-${intent}`,{timeZone}),clientTurnId,origin:target.taskId!==void 0?{type:"task",task_id:target.taskId}:target.specId!==void 0?{type:"spec",spec_id:target.specId}:{type:"prd",prd_id:target.prdId},policy:executionPolicy});const input={...commonInput(execution.id,execution.kind??"delivery"),shortName:parsed.options["short-name"]??intent.replaceAll("_","-"),entrypoint:target?.entrypoint??"conversation",...target?.taskId===void 0?{}:{taskId:target.taskId},...target?.specId===void 0?{}:{specId:target.specId},...target?.prdId===void 0?{}:{prdId:target.prdId},continuationOfRunId};await validateRunV2Attribution(input,composition);const writer=await composition.runs.start(input);const settledIntakes=await finishOpenThreadIntakes(openIntakes,composition,filesystem,parsed,lifecycle);const task2=input.taskId==null?null:(await composition.tasks.read(input.taskId)).task;return{task:task2,run:writer.started,settled_intakes:settledIntakes,task_path:task2===null?null:composition.tasks.path(task2.id),run_path:composition.runs.path(writer.started.run_id)}}const metadata=newWorkMetadata??requireSemanticNewWorkMetadata(parsed);const taskId=parsed.options.task??createId("TASK",metadata.shortName,{timeZone});const changeId=parsed.options.change??createId("CHG",metadata.shortName,{timeZone});const task=await composition.tasks.createDraft({id:taskId,changeId,title:metadata.title,shortName:metadata.shortName,objective:metadata.objective,risk:riskOption(parsed.options.risk??request.risk),priority:priorityOption(parsed.options.priority),owner:parsed.options.owner??null,requirementIds:csvOption(parsed.options.requirements??"REQ-WORK-001"),acceptanceIds:csvOption(parsed.options.acceptance??"AC-WORK-001-09"),dependsOn:[],writeScopes:csvOption(parsed.options["write-scopes"])});await composition.changes.createDraft({id:changeId,title:task.title,risk:task.risk,taskId:task.id,requirementIds:task.requirement_ids,acceptanceIds:task.acceptance_ids});const deliveryExecution=await composition.executions.createDeliveryIntake({id:parsed.options.execution??createId("EXEC",`delivery-${intent}`,{timeZone}),clientTurnId,origin:{type:"task",task_id:task.id},policy:executionPolicy});try{const input={...commonInput(deliveryExecution.id,"delivery"),shortName:metadata.shortName,entrypoint:"task",taskId};await validateRunV2Attribution(input,composition);const writer=await composition.runs.start(input);const settledIntakes=await finishOpenThreadIntakes(openIntakes,composition,filesystem,parsed,lifecycle);return{task,run:writer.started,settled_intakes:settledIntakes,task_path:composition.tasks.path(task.id),run_path:composition.runs.path(writer.started.run_id)}}catch(error51){const message=error51 instanceof Error?error51.message:String(error51);await composition.tasks.transition(taskId,"cancelled",{summary:`Conversation Run was not created: ${message}`,changed_files:[],evidence_ids:[],completed_run_id:null});await composition.changes.transition(changeId,"cancelled",`Conversation Run was not created: ${message}`);throw error51}}if(action==="finish"){requireOptions(parsed.options,["run","summary"]);const runId=parsed.options.run;let current=await composition.runs.read(runId);if(parsed.options.task!==void 0&¤t.run.task_id!==parsed.options.task){throw new UsageError(`Run ${runId} is not attributed to Task ${parsed.options.task}`)}const candidateRuns=await composition.runs.list();const finalizationBarrier=assessRunFinalizationBarrier(current,candidateRuns);const activeChildren=activeDescendantRuns(runId,candidateRuns);if(activeChildren.length>0){throw new UsageError(`Run ${runId} cannot finish while descendant Runs are active: ${activeChildren.map(child=>child.run.run_id).join(", ")}`)}if(finalizationBarrier.required&&!finalizationBarrier.satisfied){throw new UsageError(`Run ${runId} cannot finish before its finalization barrier is satisfied: ${finalizationBarrier.status}`)}if(current.finished===null){current=await recordCodexTelemetryIfAvailable(current,composition,filesystem)}if(current.finished===null&¤t.effective_usage_records.length===0){const usage=unavailableUsageRecord(current,parsed,current.records.length+1);await composition.runs.appendRecord(usage);current=foldRunV2Records([...current.records,usage])}if(current.finished===null){await composition.runs.appendRecord(runFinishedV2Schema.parse({schema_version:2,event_id:runV2EventId(runId,current.records.length+1),run_id:runId,sequence:current.records.length+1,occurred_at:new Date().toISOString(),type:"run.finished",phase:latestRunV2Phase(current.records),status:runV2FinishStatusOption(parsed.options.status)}))}let task=current.run.task_id===null?null:(await composition.tasks.read(current.run.task_id)).task;if(parsed.flags.has("cancel-task")){if(task===null)throw new UsageError("--cancel-task requires a Run attributed to a Task");if(task.status==="draft"){task=await composition.tasks.transition(task.id,"cancelled",{summary:parsed.options.summary,changed_files:[],evidence_ids:[],completed_run_id:runId})}else if(task.status!=="cancelled"){throw new UsageError(`--cancel-task requires a draft Task, received ${task.status}`)}}const run=await composition.runs.read(runId);let interactionExecution=null;if(run.run.execution_id!==null){const currentExecution=await composition.executions.read(run.run.execution_id);if(currentExecution.execution.kind==="interaction"){interactionExecution=await completeInteractionExecution(currentExecution.execution.id,composition)}}const reconciliation=await reconcileFinishedRunLifecycle(run,composition,lifecycle,{requestedOutcome:lifecycleOutcomeOption(parsed.options),summary:parsed.options.summary,changedFiles:csvOption(parsed.options["changed-files"]),evidenceIds:csvOption(parsed.options.evidence),defer:parsed.flags.has("defer-orchestrator-closure"),candidateRuns});task=current.run.task_id===null?null:(await composition.tasks.read(current.run.task_id)).task;return{task,summary:parsed.options.summary,run:runV2Summary(run,composition),reconciliation,execution:interactionExecution,finalization_barrier:finalizationBarrier,task_path:task===null?null:composition.tasks.path(task.id),run_path:composition.runs.path(runId)}}throw new UsageError(`Unknown Conversation action: ${action??""}`)}async function completeInteractionExecution(executionId,composition){let execution=(await composition.executions.read(executionId)).execution;if(execution.status==="running"){execution=await composition.executions.transition(executionId,"verifying")}return execution.status==="verifying"?composition.executions.transition(executionId,"completed","Interaction finalized"):execution}function conversationCapturePhase(intent){return intent==="new_work"||intent==="refine"||intent==="rework"?"planning":"conversation"}function resolveConversationModel(explicitModel){return explicitModel??"unknown"}async function openThreadIntakes(composition,client,clientThreadId,currentTurnId){if(clientThreadId===null)return[];return(await composition.runs.list()).filter(fold=>fold.finished===null&&fold.run.client===client&&fold.run.client_thread_id===clientThreadId&&fold.run.parent_run_id===null&&fold.run.intake!=null&&!runV2RequiresFinalizer(fold.run)&&fold.run.client_turn_id!==currentTurnId)}async function finishOpenThreadIntakes(openIntakes,composition,filesystem,parsed,lifecycle){const settled=[];const candidateRuns=await composition.runs.list();for(const intake of openIntakes){let current=intake;current=await recordCodexTelemetryIfAvailable(current,composition,filesystem);if(current.effective_usage_records.length===0){await composition.runs.appendRecord(unavailableUsageRecord(current,parsed,current.records.length+1));current=await composition.runs.read(current.run.run_id)}await composition.runs.appendRecord(runFinishedV2Schema.parse({schema_version:2,event_id:runV2EventId(current.run.run_id,current.records.length+1),run_id:current.run.run_id,sequence:current.records.length+1,occurred_at:new Date().toISOString(),type:"run.finished",phase:latestRunV2Phase(current.records),status:"completed"}));const run=await composition.runs.read(current.run.run_id);settled.push({run,reconciliation:await reconcileFinishedRunLifecycle(run,composition,lifecycle,{candidateRuns})})}return settled}function runMatchesTarget(fold,target){return target.taskId!==void 0&&fold.run.task_id===target.taskId||target.specId!==void 0&&fold.run.spec_id===target.specId||target.prdId!==void 0&&fold.run.prd_id===target.prdId}async function recordContextPackUsage(runId,initialPackTokens,composition){const current=await composition.runs.read(runId);if(current.finished!==null)throw new UsageError(`Run V2 is already finished: ${runId}`);const sequence=current.records.length+1;await composition.runs.appendRecord(usageRecordedV2Schema.parse({schema_version:2,event_id:runV2EventId(runId,sequence),run_id:runId,sequence,occurred_at:new Date().toISOString(),type:"usage.recorded",phase:latestRunV2Phase(current.records),activity_kind:"context_build",classification_source:"current_context",tokens:{input:null,cached_input:null,output:null,reasoning:null,total:null,source:"unavailable"},cost:{usd:null,brl:null},provider:current.run.provider,model:current.run.model,source_segment_key:`context-pack:${runId}:${sequence}`,supersedes_event_id:null,source_occurred_at:new Date().toISOString(),context_stats:{initial_pack_tokens:initialPackTokens,tool_output_tokens:null,files_opened:null,snippets_opened:null}}))}function unavailableUsageRecord(current,parsed,sequence){const occurredAt=new Date().toISOString();return usageRecordedV2Schema.parse({schema_version:2,event_id:runV2EventId(current.run.run_id,sequence),run_id:current.run.run_id,sequence,occurred_at:occurredAt,type:"usage.recorded",phase:latestRunV2Phase(current.records),activity_kind:"run_finalize",classification_source:"current_context",tokens:{input:null,cached_input:null,output:null,reasoning:null,total:null,source:"unavailable"},cost:{usd:null,brl:null},provider:current.run.provider,model:current.run.model,source_segment_key:null,supersedes_event_id:null,...runUsageMetadataOptions(parsed.options,occurredAt)})}function latestRunV2Phase(records){const latest=records.findLast(record2=>"phase"in record2);return latest?.phase??"conversation"}function runV2EventId(runId,sequence){return`${runId}:${String(sequence).padStart(6,"0")}`}function runV2CostInput(fold){return{run:{run_id:fold.run.run_id,attribution_status:fold.run.attribution_status,conversation_id:fold.run.conversation_id,execution_id:fold.run.execution_id,task_id:fold.run.task_id,spec_id:fold.run.spec_id,prd_id:fold.run.prd_id,change_id:fold.run.change_id,work_type:fold.run.work_type},records:fold.records,effective_usage_records:fold.effective_usage_records}}function runV2Summary(fold,composition){const usage=aggregateRunV2Usage([runV2CostInput(fold)],fold.run.run_id).total;const callIds=new Set([...fold.model_selection_records.map(record2=>record2.invocation_id),...fold.provider_invocation_records.map(record2=>record2.invocation_id)]);return{id:fold.run.run_id,status:fold.status,created_at:fold.run.occurred_at,finished_at:fold.finished?.occurred_at??null,phase:latestRunV2Phase(fold.records),run_role:effectiveRunV2Role(fold.run),parent_run_id:fold.run.parent_run_id,entrypoint:fold.run.entrypoint,work_type:fold.run.work_type,intake:fold.run.intake??null,agent:fold.run.agent,agent_name:fold.run.agent_name??(fold.run.agent.startsWith("agent-")?`zaip-agent-${fold.run.agent.slice("agent-".length)}`:fold.run.agent),model:fold.run.model,reasoning_effort:fold.run.reasoning_effort??fold.model_selection_records[0]?.requested.reasoning_effort??null,call_count:callIds.size===0?null:callIds.size,client_thread_id:fold.run.client_thread_id??null,client_turn_id:fold.run.client_turn_id??null,conversation_id:fold.run.conversation_id,execution_id:fold.run.execution_id,task_id:fold.run.task_id,spec_id:fold.run.spec_id,prd_id:fold.run.prd_id,change_id:fold.run.change_id,usage:{event_count:usage.usage_event_count,tokens:usage.tokens,cost:usage.cost,coverage:usage.coverage},artifact_path:composition.runs.path(fold.run.run_id)}}function compactRunAggregate(aggregate){const bucket=value=>({usage_event_count:value.usage_event_count,tokens:value.tokens,cost:value.cost,coverage:value.coverage});return{scope_id:aggregate.scope_id,run_count:aggregate.run_count,run_coverage:aggregate.run_coverage,attribution:aggregate.attribution,conversation:bucket(aggregate.conversation),planning:bucket(aggregate.planning),execution:bucket(aggregate.execution),total:bucket(aggregate.total),work_types:{new:bucket(aggregate.work_types.new),rework:bucket(aggregate.work_types.rework)}}}async function runSubagentV2Command(action,parsed,composition,filesystem){if(action!=="capture")throw new UsageError(`Unknown subagent action: ${action??""}`);requireOptions(parsed.options,["event","session","turn","agent-id","agent-type","model"]);const event=parsed.options.event;if(event!=="start"&&event!=="stop"){throw new UsageError("--event must be start or stop")}const identity=await subagentIdentity(filesystem,parsed.options["agent-type"]??"");return event==="start"?captureStart(parsed,composition,identity):captureStop(parsed,composition,filesystem,identity)}async function captureStart(parsed,composition,identity){const[sessionId,turnId,agentId2,,model]=values(parsed);const runs=await composition.runs.list();const existing=runs.find(fold=>fold.run.client_thread_id===agentId2&&fold.run.client_turn_id===turnId&&fold.run.agent===identity.agent);if(existing!==void 0)return captureResult(existing,true);const parent=selectParent(runs,sessionId,turnId,parsed.options["parent-agent-id"]);if(parent===void 0){return{captured:false,reason:"parent-run-not-found",agent_id:agentId2}}const source=parent.run;const executionKind=source.execution_kind??(source.entrypoint!=="conversation"?"delivery":source.execution_id===null?void 0:await composition.executions.read(source.execution_id).then(({execution})=>execution.kind??"delivery").catch(()=>void 0));const effectiveParent=executionKind===void 0?parent:{...parent,run:{...parent.run,execution_kind:executionKind}};const runPurpose=identity.role==="execution-finalizer"?"finalization":identity.role==="reviewer"?"review":identity.role==="auditor"?"audit":"execution";assertChildRunMayStart(effectiveParent,runPurpose,identity.agent,runs,identity.executionEligibility);const input={shortName:`subagent-${slug(identity.agent)}`,phase:latestRunV2Phase(parent.records),runRole:"subagent",runPurpose,...executionKind===void 0?{}:{executionKind},executionEligibility:identity.executionEligibility,entrypoint:source.entrypoint,workType:source.work_type,client:"codex-subagent",agent:identity.agent,agentName:identity.agentName,provider:source.provider??"openai",model,reasoningEffort:parsed.options["reasoning-effort"]===void 0?null:runV2ReasoningEffortSchema.parse(parsed.options["reasoning-effort"]),clientThreadId:agentId2,clientTurnId:turnId,conversationId:source.conversation_id,executionId:source.execution_id,taskId:source.task_id,specId:source.spec_id,prdId:source.prd_id,changeId:source.change_id,parentRunId:source.run_id};await validateRunV2Attribution(input,composition);const writer=await composition.runs.start(input);return{captured:true,reused:false,run:writer.started,artifact_path:composition.runs.path(writer.started.run_id),cataloged:identity.cataloged}}async function captureStop(parsed,composition,filesystem,identity){const[,turnId,agentId2]=values(parsed);const child=(await composition.runs.list()).find(fold=>fold.run.client_thread_id===agentId2&&fold.run.client_turn_id===turnId&&fold.run.agent===identity.agent);if(child===void 0){return{captured:false,reason:"subagent-run-not-found",agent_id:agentId2}}if(child.finished!==null)return captureResult(child,true);let current=await recordCodexTelemetryIfAvailable(child,composition,filesystem);if(current.effective_usage_records.length===0){const usage=unavailableUsageRecord(current,parsed,current.records.length+1);await composition.runs.appendRecord(usage);current=foldRunV2Records([...current.records,usage])}const sequence=current.records.length+1;const status=parsed.options.status??"completed";if(status!=="completed"&&status!=="failed"&&status!=="cancelled"){throw new UsageError("--status must be completed, failed, or cancelled")}await composition.runs.appendRecord(runFinishedV2Schema.parse({schema_version:2,event_id:runV2EventId(current.run.run_id,sequence),run_id:current.run.run_id,sequence,occurred_at:new Date().toISOString(),type:"run.finished",phase:latestRunV2Phase(current.records),status}));return captureResult(await composition.runs.read(current.run.run_id),false)}async function subagentIdentity(filesystem,rawAgentType){const agentType=rawAgentType.trim();const catalog=await loadAgentCatalog(filesystem);const agent=catalog.agents.find(candidate=>candidate.codex_name===agentType||candidate.id===agentType);return agent===void 0?{agent:`unrecognized-subagent:${slug(agentType)}`,agentName:agentType,role:null,capabilities:[],executionEligibility:[],cataloged:false}:{agent:agent.id,agentName:agent.codex_name,role:agent.role,capabilities:agent.capabilities,executionEligibility:agent.execution_eligibility,cataloged:true}}function selectParent(runs,sessionId,turnId,parentAgentId){const explicitParent=parentAgentId?.trim();if(explicitParent!==void 0&&explicitParent.length>0){return runs.filter(fold=>fold.status==="running"&&fold.run.client_thread_id===explicitParent).sort((left,right)=>right.run.occurred_at.localeCompare(left.run.occurred_at))[0]}return runs.filter(fold=>fold.status==="running"&&fold.run.parent_run_id===null&&fold.run.client_thread_id===sessionId&&fold.run.client_turn_id===turnId).sort((left,right)=>right.run.occurred_at.localeCompare(left.run.occurred_at))[0]}function values(parsed){return["session","turn","agent-id","agent-type","model"].map(name=>{const value=parsed.options[name]?.trim();if(value===void 0||value.length===0||value.length>200){throw new UsageError(`--${name} must contain 1 to 200 characters`)}return value})}function captureResult(fold,reused){return{captured:true,reused,run:fold.run,status:fold.status}}function slug(value){return value.normalize("NFKD").replace(/[\u0300-\u036f]/g,"").toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,60)||"worker"}function defaultExecutionPolicy(risk2){return{failure_policy:"stop_on_terminal_failure",max_parallelism:1,max_operational_retries:risk2==="lite"?0:1,max_repair_cycles_per_task:risk2==="lite"?0:2,soft_model_cycle_budget:risk2==="lite"?4:risk2==="standard"?24:40,soft_input_token_budget:risk2==="lite"?25e4:risk2==="standard"?4e6:8e6,context_refresh_after_cycles:risk2==="lite"?4:8,verification_mode:risk2==="critical"?"full":"scoped"}}async function evaluateRunBudget(run,composition,filesystem){if(run.run.execution_id===null)return null;const execution=(await composition.executions.read(run.run.execution_id)).execution;const cycles=run.effective_usage_records.length;const providerInputTokens=run.effective_usage_records.reduce((sum,event)=>sum+Math.max(0,(event.tokens.input??0)-(event.tokens.cached_input??0)),0);const observedContextTokens=run.effective_usage_records.reduce((sum,event)=>sum+(event.context_stats?.initial_pack_tokens??0)+(event.context_stats?.tool_output_tokens??0),0);const measuredInputTokens=providerInputTokens>0?providerInputTokens:observedContextTokens;const cycleBudget=execution.policy.soft_model_cycle_budget??null;const inputBudget=execution.policy.soft_input_token_budget??null;const refreshAfter=execution.policy.context_refresh_after_cycles??null;const checkpointRequired=cycleBudget!==null&&cycles>=cycleBudget||inputBudget!==null&&measuredInputTokens>=inputBudget;const contextRefreshRequired=refreshAfter!==null&&cycles>0&&cycles%refreshAfter===0;const budget={schema_version:1,run_id:run.run.run_id,execution_id:execution.id,measured_at:new Date().toISOString(),cycles,provider_uncached_input_tokens:providerInputTokens,observed_context_tokens:observedContextTokens,measured_input_tokens:measuredInputTokens,measurement_source:providerInputTokens>0?"provider_uncached":"context_stats",soft_model_cycle_budget:cycleBudget,soft_input_token_budget:inputBudget,context_refresh_after_cycles:refreshAfter,checkpoint_required:checkpointRequired,context_refresh_required:contextRefreshRequired};if(checkpointRequired||contextRefreshRequired){await filesystem.writeTextAtomic(`.agents/projections/runtime/checkpoints/${run.run.run_id}.json`,`${JSON.stringify(budget,null,2)}
|
|
1262
|
+
`)}return budget}async function runLifecycleV2Command(area,action,parsed,filesystem,composition,lifecycle){if(area==="prd")return runPrdV2Command(action,parsed,filesystem,composition,lifecycle);if(area==="spec")return runSpecV2Command(action,parsed,filesystem,composition,lifecycle);return runTaskV2Command(action,parsed,filesystem,composition,lifecycle)}async function runPrdV2Command(action,parsed,filesystem,composition,lifecycle){if(action==="create"){requireOptions(parsed.options,["title","short-name","problem"]);const creationRunId=await creationRunIdForCurrentTurn(parsed,filesystem,composition);const prd=await composition.prds.create({...parsed.options.id===void 0?{}:{id:parsed.options.id},title:parsed.options.title,shortName:parsed.options["short-name"],problem:parsed.options.problem,audiences:csvOption(parsed.options.audiences),outcomes:csvOption(parsed.options.outcomes),constraints:csvOption(parsed.options.constraints),nonGoals:csvOption(parsed.options["non-goals"]),creationRunId});return{prd,artifact_path:composition.prds.path(prd.id)}}if(action==="list"){return listLifecyclePage(await composition.prds.list(),parsed).map(prd=>({prd:compactPreparedEntity(prd),artifact_path:composition.prds.path(prd.id)}))}const id=requiredEntityId(parsed,2,"PRD id");if(action==="show"){return{...await composition.prds.read(id),artifact_path:composition.prds.path(id)}}if(action==="prepare"){const plan=await readPreparedPlan(filesystem,parsed);await assertPreparedPlanReferences(filesystem,plan);const prd=await composition.prds.setPreparedPlan(id,plan);const specs=await Promise.all(specIdsForPrdPlanV2(plan,id).map(async specId=>(await composition.specs.read(specId)).spec));return{prd,specs,artifact_path:composition.prds.path(id),plan_hash:plan.hash}}if(action==="ready"){const current=await composition.prds.read(id);if(current.prd.prepared_plan===null)throw new UsageError(`PRD is not prepared: ${id}`);await assertPreparedPlanReferences(filesystem,current.prd.prepared_plan);if(!new Set(["draft","ready"]).has(current.prd.status)){throw new UsageError(`PRD cannot move to ready from status ${current.prd.status}: ${id}`)}const selectedSpecs=await Promise.all(specIdsForPrdPlanV2(current.prd.prepared_plan,id).map(async specId=>(await composition.specs.read(specId)).spec));for(const spec of selectedSpecs){if(!new Set(["draft","ready"]).has(spec.status)){throw new UsageError(`SPEC cannot move to ready from status ${spec.status}: ${spec.id}`)}}const prd=current.prd.status==="draft"?await composition.prds.transition(id,"ready"):current.prd;const specs=await Promise.all(selectedSpecs.map(spec=>spec.status==="draft"?composition.specs.transition(spec.id,"ready"):spec));return{prd,specs,artifact_path:composition.prds.path(id)}}if(action==="execute"){const current=await composition.prds.read(id);if(current.prd.prepared_plan===null)throw new UsageError(`PRD is not prepared: ${id}`);await assertPreparedPlanReferences(filesystem,current.prd.prepared_plan);if(!new Set(["draft","ready"]).has(current.prd.status)){throw new UsageError(`PRD cannot execute from status ${current.prd.status}: ${id}`)}const selectedSpecs=await Promise.all(specIdsForPrdPlanV2(current.prd.prepared_plan,id).map(async specId=>(await composition.specs.read(specId)).spec));for(const spec of selectedSpecs){if(!new Set(["draft","ready"]).has(spec.status)){throw new UsageError(`SPEC cannot execute from status ${spec.status}: ${spec.id}`)}}const output2=materializationOutput(await composition.materializer.execute(current.prd.prepared_plan),composition);const specs=await Promise.all(selectedSpecs.map(async selectedSpec=>{let spec=selectedSpec;if(spec.status==="draft")spec=await composition.specs.transition(spec.id,"ready");return spec.status==="ready"?composition.specs.transition(spec.id,"active"):spec}));if(current.prd.status==="draft")await composition.prds.transition(id,"ready");const preparedPrd=(await composition.prds.read(id)).prd;if(preparedPrd.status==="ready")await composition.prds.transition(id,"active");return{...output2,specs}}if(action==="deliver"){const prd=await lifecycle.deliverPrd(id);return{prd,artifact_path:composition.prds.path(id)}}if(action==="block"||action==="fail"){requireOptions(parsed.options,["reason"]);const prd=await composition.prds.transition(id,action==="block"?"blocked":"failed",parsed.options.reason);return{prd,artifact_path:composition.prds.path(id)}}if(action==="cancel"){const result2=await lifecycle.cancelPrd(id);return{...result2,artifact_path:composition.prds.path(id)}}if(action==="activate"){const prd=await composition.prds.transition(id,"active");return{prd,artifact_path:composition.prds.path(id)}}throw new UsageError(`Unknown V2 PRD action: ${action??""}`)}async function runSpecV2Command(action,parsed,filesystem,composition,lifecycle){if(action==="create"){requireOptions(parsed.options,["title","short-name","objective"]);const creationRunId=await creationRunIdForCurrentTurn(parsed,filesystem,composition);const spec=await composition.specs.create({...parsed.options.id===void 0?{}:{id:parsed.options.id},...parsed.options.prd===void 0?{}:{prdId:parsed.options.prd},title:parsed.options.title,shortName:parsed.options["short-name"],objective:parsed.options.objective,includedScope:csvOption(parsed.options.scope),excludedScope:csvOption(parsed.options["out-of-scope"]),requirementIds:csvOption(parsed.options.requirements),acceptanceIds:csvOption(parsed.options.acceptance),creationRunId});return{spec,artifact_path:composition.specs.path(spec.id)}}if(action==="list"){const specs=(await composition.specs.list()).filter(spec=>parsed.options.prd===void 0||spec.prd_id===parsed.options.prd);return listLifecyclePage(specs,parsed).map(spec=>({spec:compactPreparedEntity(spec),artifact_path:composition.specs.path(spec.id)}))}const id=requiredEntityId(parsed,2,"SPEC id");if(action==="show"){return{...await composition.specs.read(id),artifact_path:composition.specs.path(id)}}if(action==="prepare"){const plan=await readPreparedPlan(filesystem,parsed);await assertPreparedPlanReferences(filesystem,plan);const spec=await composition.specs.setPreparedPlan(id,plan);return{spec,artifact_path:composition.specs.path(id),plan_hash:plan.hash}}if(action==="ready"){const current=await composition.specs.read(id);if(current.spec.prepared_plan===null)throw new UsageError(`SPEC is not prepared: ${id}`);await assertPreparedPlanReferences(filesystem,current.spec.prepared_plan);const spec=current.spec.status==="draft"?await composition.specs.transition(id,"ready"):current.spec;if(spec.status!=="ready"){throw new UsageError(`SPEC cannot move to ready from status ${spec.status}: ${id}`)}return{spec,artifact_path:composition.specs.path(id)}}if(action==="execute"){const current=await composition.specs.read(id);if(current.spec.prepared_plan===null)throw new UsageError(`SPEC is not prepared: ${id}`);await assertPreparedPlanReferences(filesystem,current.spec.prepared_plan);if(!new Set(["draft","ready"]).has(current.spec.status)){throw new UsageError(`SPEC cannot execute from status ${current.spec.status}: ${id}`)}const output2=materializationOutput(await composition.materializer.execute(current.spec.prepared_plan),composition);if(current.spec.status==="draft")await composition.specs.transition(id,"ready");const preparedSpec=(await composition.specs.read(id)).spec;if(preparedSpec.status==="ready")await composition.specs.transition(id,"active");return output2}if(action==="deliver"){const spec=await lifecycle.deliverSpec(id);return{spec,artifact_path:composition.specs.path(id)}}if(action==="block"||action==="fail"){requireOptions(parsed.options,["reason"]);const spec=await composition.specs.transition(id,action==="block"?"blocked":"failed",parsed.options.reason);return{spec,artifact_path:composition.specs.path(id)}}if(action==="cancel"){const result2=await lifecycle.cancelSpec(id);return{...result2,artifact_path:composition.specs.path(id)}}if(action==="activate"){const spec=await composition.specs.transition(id,"active");return{spec,artifact_path:composition.specs.path(id)}}throw new UsageError(`Unknown V2 SPEC action: ${action??""}`)}async function creationRunIdForCurrentTurn(parsed,filesystem,composition){if(parsed.options.run!==void 0){return(await composition.runs.read(parsed.options.run)).run.run_id}const invocation=await resolveRunClientInvocation(filesystem,"codex");const intake=await findIntakeForExactTurn(composition,"codex",invocation);return intake?.run.run_id??null}async function runTaskV2Command(action,parsed,filesystem,composition,lifecycle){if(action==="create"){requireOptions(parsed.options,["title","short-name","objective","requirements","acceptance"]);const timeZone=composition.layout.project.timezone;const taskId=parsed.options.id??createId("TASK",parsed.options["short-name"],{timeZone});const changeId=parsed.options.change??createId("CHG",parsed.options["short-name"],{timeZone});const requirementIds=csvOption(parsed.options.requirements);const acceptanceIds=csvOption(parsed.options.acceptance);const risk2=riskOption(parsed.options.risk);const shortName=parsed.options["short-name"];const task=await composition.tasks.createDraft({id:taskId,changeId,title:parsed.options.title,shortName,objective:parsed.options.objective,risk:risk2,priority:priorityOption(parsed.options.priority),owner:parsed.options.owner??null,requirementIds,acceptanceIds,dependsOn:csvOption(parsed.options["depends-on"]),writeScopes:csvOption(parsed.options["write-scopes"])});const change=await composition.changes.createDraft({id:changeId,title:task.title,risk:task.risk,taskId:task.id,requirementIds,acceptanceIds});return{task,change,artifact_path:composition.tasks.path(task.id),change_path:composition.changes.path(change.id)}}if(action==="prepare"){const id2=requiredEntityId(parsed,2,"Task id");const current=await composition.tasks.read(id2);if(current.task.status==="planned"&¤t.task.prepared_plan!==void 0){await assertPreparedPlanReferences(filesystem,current.task.prepared_plan);return{task:current.task,artifact_path:composition.tasks.path(id2),plan_hash:current.task.prepared_plan.hash}}if(parsed.options.plan===void 0&¤t.task.depends_on.length>0){throw new UsageError("task prepare with dependencies requires --plan containing the complete DAG")}const timeZone=composition.layout.project.timezone;const deliveryIntake=(await composition.executions.list()).find(execution=>execution.kind==="delivery"&&execution.plan_hash===null&&execution.origin.type==="task"&&execution.origin.task_id===current.task.id);const plan=parsed.options.plan===void 0?createTaskFirstPreparedPlan({task:current.task,executionId:parsed.options.execution??deliveryIntake?.id??createId("RUN",current.task.short_name,{timeZone}).replace(/^RUN-/,"EXEC-"),preparedAt:new Date().toISOString(),policy:defaultExecutionPolicy(current.task.risk),...parsed.options["requirement-impact"]===void 0?{}:{requirementImpactReason:parsed.options["requirement-impact"]}}):await readPreparedPlan(filesystem,parsed);await assertPreparedPlanReferences(filesystem,plan);const task=await composition.tasks.setPreparedPlan(id2,plan);const change=plan.blueprints.changes.find(candidate=>candidate.id===task.change_id);if(change===void 0)throw new UsageError(`Prepared plan does not contain Change ${task.change_id}`);await ensureTaskDraftChange(composition,task);await composition.changes.promoteDraft(task.change_id,plannedChangeFromBlueprint(change,plan,task.id));return{task,artifact_path:composition.tasks.path(id2),plan_hash:plan.hash}}if(action==="execute"){const plan=parsed.options.plan!==void 0?await readPreparedPlan(filesystem,parsed):await preparedTaskPlan(composition.tasks,requiredEntityId(parsed,2,"Task id"));await assertPreparedPlanReferences(filesystem,plan);if(plan.source.type!=="task"){throw new UsageError("task execute requires a task-first prepared plan")}const materialized=await existingTaskFirstMaterialization(plan,composition)??await composition.materializer.execute(plan);const taskId=plan.source.task_id;const task=materialized.tasks.find(candidate=>candidate.id===taskId);if(task===void 0){throw new UsageError(`Task-first plan did not materialize its source Task ${taskId}`)}const change=materialized.changes.find(candidate=>candidate.id===task.change_id);if(change===void 0){throw new UsageError(`Task-first plan did not materialize Change ${task.change_id}`)}assertTaskFirstExecutable(task.status,"Task",task.id);assertTaskFirstExecutable(materialized.execution.status,"Execution",materialized.execution.id);assertTaskFirstExecutable(change.status,"Change",change.id);const run=await ensureTaskOrchestratorRun(task,change.id,materialized.execution.id,parsed,filesystem,composition);let execution=(await composition.executions.read(materialized.execution.id)).execution;if(execution.status==="planned"){execution=await composition.executions.transition(execution.id,"running")}let activeChange=(await composition.changes.read(change.id)).change;if(activeChange.status==="planned"){activeChange=await composition.changes.transition(activeChange.id,"executing")}let activeTask=(await composition.tasks.read(task.id)).task;if(activeTask.status==="planned"){activeTask=await lifecycle.startTask(activeTask.id)}return{...materializationOutput(materialized,composition),execution,changes:[activeChange],tasks:[activeTask],run,run_path:composition.runs.path(run.run_id)}}if(action==="list"){const[tasks,changes]=await Promise.all([composition.tasks.list(),parsed.options.prd===void 0&&parsed.options.spec===void 0?Promise.resolve([]):composition.changes.list()]);const relatedChangeIds=new Set(changes.filter(change=>(parsed.options.prd===void 0||change.source.type==="prd"&&change.source.prd_id===parsed.options.prd)&&(parsed.options.spec===void 0||change.source.type==="spec"&&change.source.spec_id===parsed.options.spec||change.source.type==="prd"&&change.source.spec_id===parsed.options.spec)).map(change=>change.id));const filtered=tasks.filter(task=>parsed.options.prd===void 0&&parsed.options.spec===void 0||relatedChangeIds.has(task.change_id));return listLifecyclePage(filtered,parsed).map(task=>({task:compactPreparedEntity(task),artifact_path:composition.tasks.path(task.id)}))}if(action==="next"){const[tasks,executions]=await Promise.all([composition.tasks.list(),composition.executions.list()]);const completed=new Set(tasks.filter(task=>task.status==="completed").map(task=>task.id));const materialized=new Set(executions.flatMap(execution=>execution.dag.nodes.map(node=>node.task_id)));return tasks.filter(task=>task.status==="planned"&&materialized.has(task.id)&&task.depends_on.every(dependency=>completed.has(dependency))).map(task=>({task,artifact_path:composition.tasks.path(task.id)}))}const id=requiredEntityId(parsed,2,"Task id");if(action==="show"){return{...await composition.tasks.read(id),artifact_path:composition.tasks.path(id)}}if(action==="start"||action==="resume"||action==="rework"){const task=await lifecycle.startTask(id,action);return{task,artifact_path:composition.tasks.path(id)}}if(action==="verify"){const task=await lifecycle.verifyTask(id,csvOption(parsed.options.evidence));return{task,artifact_path:composition.tasks.path(id)}}if(action==="block"){const task=await composition.tasks.transition(id,"blocked");return{task,artifact_path:composition.tasks.path(id)}}if(action==="complete"){const result2=await readTaskResultV2(filesystem,parsed);const task=await lifecycle.completeTask(id,result2);return{task,artifact_path:composition.tasks.path(id)}}if(action==="fail"){const result2=await readTaskResultV2(filesystem,parsed);const task=await lifecycle.failTask(id,result2);return{task,artifact_path:composition.tasks.path(id)}}if(action==="cancel"){requireOptions(parsed.options,["summary"]);const task=await composition.tasks.transition(id,"cancelled",{summary:parsed.options.summary,changed_files:csvOption(parsed.options["changed-files"]),evidence_ids:csvOption(parsed.options.evidence),completed_run_id:parsed.options.run??null});const{change}=await composition.changes.read(task.change_id).catch(()=>({change:null}));if(change!==null&&change.source.type==="task"&&change.source.task_id===task.id&&change.status!=="cancelled"){await composition.changes.transition(change.id,"cancelled",task.result?.summary??"Task cancelled.")}return{task,artifact_path:composition.tasks.path(id)}}throw new UsageError(`Unknown V2 Task action: ${action??""}`)}function assertTaskFirstExecutable(status,kind,id){if(status==="planned"||status==="executing"||status==="running")return;const guidance=status==="blocked"?"resume the Task before starting a new orchestrator agent call":status==="failed"?"rework the Task before starting a new orchestrator agent call":"terminal work is immutable";throw new UsageError(`${kind} ${id} cannot execute from status ${status}; ${guidance}`)}async function existingTaskFirstMaterialization(plan,composition){if(plan.source.type!=="task")return null;const existing=await Promise.all([composition.tasks.read(plan.source.task_id).catch(()=>null),composition.executions.read(plan.execution_id).catch(()=>null)]);const task=existing[0]?.task;const execution=existing[1]?.execution;if(task===void 0||execution===void 0||task.plan_hash!==plan.hash||execution.plan_hash!==plan.hash||!execution.dag.nodes.some(node=>node.task_id===task.id&&node.change_id===task.change_id)){return null}const change=await composition.changes.read(task.change_id).catch(()=>null);if(change===null||change.change.plan_hash!==plan.hash)return null;const reusedPaths=[composition.executions.path(execution.id),composition.changes.path(change.change.id),composition.tasks.path(task.id)];return{execution,changes:[change.change],tasks:[task],created_paths:[],reused_paths:reusedPaths}}async function ensureTaskOrchestratorRun(task,changeId,executionId,parsed,filesystem,composition){const runs=await composition.runs.list();const existing=runs.filter(candidate=>candidate.finished===null&&effectiveRunV2Role(candidate.run)==="orchestrator"&&candidate.run.parent_run_id===null&&candidate.run.task_id===task.id&&candidate.run.execution_id===executionId).sort((left,right)=>right.run.occurred_at.localeCompare(left.run.occurred_at))[0];if(existing!==void 0)return existing.run;const invocation=await resolveRunClientInvocation(filesystem,"codex");if(invocation.clientTurnId!==null){await composition.executions.claimClientTurn(executionId,invocation.clientTurnId)}const intake=await findIntakeForExactTurn(composition,"codex",invocation);const source=intake?.run;const writer=await composition.runs.start({...parsed.options.run===void 0?{}:{id:parsed.options.run},shortName:task.short_name,phase:"execution",runRole:"orchestrator",runPurpose:"orchestration",requiresFinalizer:true,executionKind:"delivery",executionEligibility:[],entrypoint:"task",workType:source?.work_type??"new",client:"codex",agent:"agent-orchestrator",agentName:"zaip-agent-orchestrator",provider:source?.provider??null,model:parsed.options.model??source?.model??"unknown",reasoningEffort:source?.reasoning_effort??null,...invocation,conversationId:source?.conversation_id??createConversationId(task.short_name),executionId,taskId:task.id,changeId});return writer.started}async function ensureTaskDraftChange(composition,task){const existing=await composition.changes.read(task.change_id).catch(()=>null);if(existing!==null)return existing.change;return composition.changes.createDraft({id:task.change_id,title:task.title,risk:task.risk,taskId:task.id,requirementIds:task.requirement_ids,acceptanceIds:task.acceptance_ids})}function plannedChangeFromBlueprint(blueprint,plan,taskId){return{schema_version:2,id:blueprint.id,revision:1,title:blueprint.title,status:"planned",risk:blueprint.risk,source:blueprint.source,requirement_ids:[...blueprint.requirement_ids],acceptance_ids:[...blueprint.acceptance_ids],requirement_impact:blueprint.requirement_impact,task_ids:[taskId],plan_revision:plan.revision,plan_hash:plan.hash,created_at:plan.prepared_at,updated_at:plan.prepared_at,started_at:null,finished_at:null,result:null}}async function readTaskResultV2(filesystem,parsed){if(parsed.options.result!==void 0){return taskResultV2Schema.parse(JSON.parse(await filesystem.readText(parsed.options.result)))}requireOptions(parsed.options,["summary","run"]);return taskResultV2Schema.parse({summary:parsed.options.summary,changed_files:csvOption(parsed.options["changed-files"]),evidence_ids:csvOption(parsed.options.evidence),completed_run_id:parsed.options.run})}function materializationOutput(result2,composition){return{execution:result2.execution,changes:result2.changes,tasks:result2.tasks,artifact_path:composition.executions.path(result2.execution.id),change_paths:result2.changes.map(change=>composition.changes.path(change.id)),task_paths:result2.tasks.map(task=>composition.tasks.path(task.id)),created_paths:result2.created_paths,reused_paths:result2.reused_paths}}var ORPHANED_RUN_GRACE_MS=10*60*1e3;var ORPHANED_EXECUTION_GRACE_MS=10*60*1e3;var ACTIVE_INVOCATION_START_TOLERANCE_MS=2*60*1e3;async function reconcileOpenWork(parsed,composition,lifecycle,filesystem){let runs=await composition.runs.list();const runningCodex=runs.filter(fold=>fold.finished===null&&isCodexTelemetryClient(fold.run.client)&&fold.run.client_thread_id!==null);const threadIds=runningCodex.flatMap(fold=>typeof fold.run.client_thread_id==="string"?[fold.run.client_thread_id]:[]);const invocations=runningCodex.flatMap(fold=>typeof fold.run.client_thread_id==="string"&&typeof fold.run.client_turn_id==="string"?[{threadId:fold.run.client_thread_id,turnId:fold.run.client_turn_id}]:[]);const[localLifecycles,activeInvocations]=await Promise.all([listCodexInvocationLifecycles(filesystem.root,{threadIds,invocations}),listActiveCodexInvocations(filesystem.root,{threadIds})]);const localByInvocation=new Map(localLifecycles.map(item=>[`${item.sessionId}:${item.turnId}`,item]));const closedRuns=[];const reconciliationStartedAt=new Date;for(const fold of runningCodex){const local=localByInvocation.get(`${fold.run.client_thread_id??""}:${fold.run.client_turn_id??""}`);const completedLocally=local?.status==="completed"&&local.finishedAt!==null;const orphaned=isOrphanedCodexRun(fold,activeInvocations,reconciliationStartedAt);if(!completedLocally&&!orphaned)continue;const role=effectiveRunV2Role(fold.run);if(role==="orchestrator"&&activeDescendantRuns(fold.run.run_id,runs).length>0){continue}let current=completedLocally?await recordCodexTelemetryIfAvailable(fold,composition,filesystem):fold;if(current.effective_usage_records.length===0){await composition.runs.appendRecord(unavailableUsageRecord(current,parsed,current.records.length+1));current=await composition.runs.read(current.run.run_id)}const finished=runFinishedV2Schema.parse({schema_version:2,event_id:`${current.run.run_id}:${String(current.records.length+1).padStart(6,"0")}`,run_id:current.run.run_id,sequence:current.records.length+1,occurred_at:completedLocally?local.finishedAt:new Date().toISOString(),type:"run.finished",phase:latestRunV2Phase(current.records),status:completedLocally?"completed":"failed"});foldRunV2Records([...current.records,finished]);await composition.runs.appendRecord(finished);closedRuns.push(await composition.runs.read(current.run.run_id))}if(closedRuns.length>0)runs=await composition.runs.list();const[tasks,changes,executions,specs,prds]=await Promise.all([composition.tasks.list(),composition.changes.list(),composition.executions.list(),composition.specs.list(),composition.prds.list()]);const catalog={tasks,changes,executions,specs,prds};const orphanedExecutions=await blockOrphanedStandaloneExecutions(catalog,runs,composition,reconciliationStartedAt);const activeSubjectIds=activeLifecycleSubjectIds(runs.filter(item=>item.finished===null),catalog);const operationalSubjectIds=terminalReconciliationSubjectIds(catalog);const reconciliations=[];const reconciliationErrors=[];const reconciledSubjectIds=new Set;const terminal=runs.filter(fold=>fold.finished!==null&&terminalSubjectIds(fold).some(id=>operationalSubjectIds.has(id))).sort((left,right)=>(right.finished?.occurred_at??right.run.occurred_at).localeCompare(left.finished?.occurred_at??left.run.occurred_at));for(const fold of terminal){const subjects=terminalSubjectIds(fold);if(subjects.length===0||subjects.some(id=>activeSubjectIds.has(id))||subjects.every(id=>reconciledSubjectIds.has(id))){continue}try{reconciliations.push(await reconcileFinishedRunLifecycle(fold,composition,lifecycle,{catalog,candidateRuns:runs}))}catch(error51){const message=error51 instanceof Error?error51.message:String(error51);reconciliations.push({...await snapshotRunLifecycle(fold,composition,catalog),status:"deferred",error:message});reconciliationErrors.push({run_id:fold.run.run_id,error:message})}subjects.forEach(id=>{reconciledSubjectIds.add(id)})}return{runs:closedRuns,orphaned_executions:orphanedExecutions,reconciliations,reconciliation_errors:reconciliationErrors,unresolved_running_run_ids:runs.filter(fold=>fold.finished===null).map(fold=>fold.run.run_id)}}async function blockOrphanedStandaloneExecutions(catalog,runs,composition,now){const ids=orphanedStandaloneExecutionIds(catalog,runs,now);if(ids.length===0)return[];const clock=new SystemClock;const taskById=new Map(catalog.tasks.map(task=>[task.id,task]));const changeById=new Map(catalog.changes.map(change=>[change.id,change]));for(const id of ids){const execution=catalog.executions.find(item=>item.id===id);if(execution===void 0)continue;const reason=`Execution ${id} has no active orchestrator agent call after the reconciliation grace period.`;for(const node of execution.dag.nodes){const task=taskById.get(node.task_id);if(task!==void 0&&["executing","verifying"].includes(task.status)){await composition.tasks.transition(task.id,"blocked",null,clock,reason)}const change=changeById.get(node.change_id);if(change!==void 0&&["executing","verifying"].includes(change.status)){await composition.changes.transition(change.id,"blocked",null,clock,reason)}}await composition.executions.transition(id,"blocked",null,clock,reason)}return ids}function orphanedStandaloneExecutionIds(catalog,runs,now=new Date){return catalog.executions.flatMap(execution=>{if(execution.origin.type!=="task"||!["running","verifying"].includes(execution.status)){return[]}const startedAt=Date.parse(execution.started_at??execution.updated_at??execution.created_at);if(!Number.isFinite(startedAt)||now.getTime()-startedAt<ORPHANED_EXECUTION_GRACE_MS){return[]}const taskIds=new Set(execution.dag.nodes.map(node=>node.task_id));const hasActiveOrchestratorRun=runs.some(run=>run.finished===null&&effectiveRunV2Role(run.run)==="orchestrator"&&run.run.parent_run_id===null&&run.run.entrypoint==="task"&&(run.run.execution_id===execution.id||run.run.task_id!==null&&taskIds.has(run.run.task_id)));return hasActiveOrchestratorRun?[]:[execution.id]})}function terminalReconciliationSubjectIds(catalog){const ids=new Set;const unsettledTaskIds=new Set(catalog.tasks.filter(task=>["executing","verifying"].includes(task.status)).map(task=>task.id));unsettledTaskIds.forEach(id=>{ids.add(id)});for(const change of catalog.changes){const unsettled=["planned","executing","verifying"].includes(change.status);const hasUnsettledTask=change.task_ids.some(id=>unsettledTaskIds.has(id));if(!unsettled&&!hasUnsettledTask)continue;change.task_ids.forEach(id=>{ids.add(id)});if(change.source.type==="spec")ids.add(change.source.spec_id);if(change.source.type==="prd"){ids.add(change.source.prd_id);if(change.source.spec_id!==null)ids.add(change.source.spec_id)}}for(const execution of catalog.executions){if(!["planned","running","paused","verifying"].includes(execution.status))continue;execution.dag.nodes.forEach(node=>{ids.add(node.task_id)})}catalog.specs.filter(spec=>spec.status==="active").forEach(spec=>{ids.add(spec.id)});catalog.prds.filter(prd=>prd.status==="active").forEach(prd=>{ids.add(prd.id)});return ids}function isOrphanedCodexRun(fold,activeInvocations,now=new Date){if(fold.finished!==null||fold.run.client!=="codex")return false;const startedAt=Date.parse(fold.run.occurred_at);if(!Number.isFinite(startedAt)||now.getTime()-startedAt<ORPHANED_RUN_GRACE_MS){return false}return!activeInvocations.some(active=>{if(active.sessionId!==fold.run.client_thread_id)return false;if(active.turnId===fold.run.client_turn_id)return true;const activeStartedAt=active.startedAt===null?Number.NaN:Date.parse(active.startedAt);return Number.isFinite(activeStartedAt)&&Math.abs(activeStartedAt-startedAt)<=ACTIVE_INVOCATION_START_TOLERANCE_MS})}function activeLifecycleSubjectIds(activeRuns,catalog){const ids=new Set;const taskById=new Map(catalog.tasks.map(task=>[task.id,task]));const changeById=new Map(catalog.changes.map(change=>[change.id,change]));const specById=new Map(catalog.specs.map(spec=>[spec.id,spec]));for(const fold of activeRuns){relatedWorkIds(fold).forEach(id=>{ids.add(id)});const task=fold.run.task_id===null?void 0:taskById.get(fold.run.task_id);const change=task===void 0?void 0:changeById.get(task.change_id);const specId=fold.run.spec_id??(change?.source.type==="spec"||change?.source.type==="prd"?change.source.spec_id:null);const prdId=fold.run.prd_id??(change?.source.type==="prd"?change.source.prd_id:null)??(specId===null?null:specById.get(specId)?.prd_id??null);if(change!==void 0)ids.add(change.id);if(specId!==null)ids.add(specId);if(prdId!==null)ids.add(prdId);for(const candidate of catalog.changes){const belongsToSpec=specId!==null&&candidate.source.type!=="task"&&candidate.source.spec_id===specId;const belongsToPrd=candidate.source.type==="prd"&&candidate.source.prd_id===prdId;if(!belongsToSpec&&!belongsToPrd)continue;ids.add(candidate.id);candidate.task_ids.forEach(id=>{ids.add(id)})}for(const execution of catalog.executions){if(execution.origin.type==="prd"&&execution.origin.prd_id===prdId||execution.origin.type==="spec"&&execution.origin.spec_id===specId){ids.add(execution.id);execution.dag.nodes.forEach(node=>{ids.add(node.task_id)})}}}return ids}function relatedWorkIds(fold){return[fold.run.task_id,fold.run.spec_id,fold.run.prd_id].filter(id=>id!==null)}function terminalSubjectIds(fold){const role=effectiveRunV2Role(fold.run);if(role==="orchestrator"&&fold.run.entrypoint==="task"){return fold.run.task_id===null?[]:[fold.run.task_id]}if(role==="orchestrator"){return[fold.run.spec_id,fold.run.prd_id].filter(id=>id!==null)}return[]}async function runRunV2Command(action,parsed,composition,filesystem,lifecycle){if(action==="start"){requireOptions(parsed.options,["short-name","phase","entrypoint","work-type","client","model"]);const client=parsed.options.client;const phase=runV2PhaseOption(parsed.options.phase);const parentRunId=parsed.options.parent??null;const clientInvocation=await resolveRunClientInvocation(filesystem,client);const agent=await resolveRunAgentIdentity(filesystem,{agent:parsed.options.agent,client});const runPurpose=parsed.options["run-purpose"]===void 0?phase!=="execution"?"intake":agent==="agent-finalizer"?"finalization":agent==="agent-reviewer"?"review":agent==="agent-auditor"?"audit":parentRunId===null?"orchestration":"execution":runV2PurposeSchema.parse(parsed.options["run-purpose"]);const catalog=await loadAgentCatalog(filesystem).catch(()=>null);const catalogAgent=catalog?.agents.find(candidate=>candidate.id===agent);const parent=parentRunId===null?null:await composition.runs.read(parentRunId);const execution=parent===null&&parsed.options.execution!==void 0?await composition.executions.read(parsed.options.execution).catch(()=>null):null;const executionKind=parent?.run.execution_kind??execution?.execution.kind??void 0;const input={...parsed.options.id===void 0?{}:{id:parsed.options.id},shortName:parsed.options["short-name"],phase,...parsed.options["run-role"]===void 0?{}:{runRole:runV2RoleSchema.parse(parsed.options["run-role"])},runPurpose,...executionKind===void 0?{}:{executionKind},executionEligibility:catalogAgent?.execution_eligibility??[],entrypoint:runV2EntrypointOption(parsed.options.entrypoint),workType:runV2WorkTypeOption(parsed.options["work-type"]),client,agent,agentName:await resolveRunAgentName(filesystem,agent),provider:parsed.options.provider??null,model:parsed.options.model,reasoningEffort:parsed.options["reasoning-effort"]===void 0?null:runV2ReasoningEffortSchema.parse(parsed.options["reasoning-effort"]),...clientInvocation,conversationId:parsed.options.conversation??createConversationId(parsed.options["short-name"]),executionId:parsed.options.execution??null,taskId:parsed.options.task??null,specId:parsed.options.spec??null,prdId:parsed.options.prd??null,changeId:parsed.options.change??null,parentRunId,continuationOfRunId:parsed.options.continuation??null,retryOfRunId:parsed.options.retry??null};await validateRunV2Attribution(input,composition);if(parentRunId!==null){const candidates=await composition.runs.list();if(parent===null)throw new UsageError(`Parent Run not found: ${parentRunId}`);assertChildRunMayStart(parent,runPurpose,agent,candidates,catalogAgent?.execution_eligibility??[])}const writer=await composition.runs.start(input);return{run:writer.started,artifact_path:composition.runs.path(writer.started.run_id)}}if(action==="list"||action==="aggregate"){const runs=filterRunV2Folds(await composition.runs.list(),parsed);if(action==="aggregate"){const aggregate=aggregateRunV2Usage(runs.map(runV2CostInput2),runV2ScopeOption(parsed));return parsed.options.view==="full"?aggregate:compactRunAggregate(aggregate)}const summaries=runs.map(run=>runV2Summary(run,composition));return listLifecyclePage(summaries,parsed)}if(action==="reconcile"){if(!parsed.flags.has("open"))throw new UsageError("run reconcile requires --open");return reconcileOpenWork(parsed,composition,lifecycle,filesystem)}const id=requiredEntityId(parsed,2,"Run V2 id");if(action==="show"){const run=await composition.runs.read(id);const includeEvents=parsed.flags.has("events")||parsed.options["event-id"]!==void 0||parsed.options["from-sequence"]!==void 0;return includeEvents?{run:{...run,records:run.records.filter(record2=>(parsed.options["event-id"]===void 0||record2.event_id===parsed.options["event-id"])&&(parsed.options["from-sequence"]===void 0||record2.sequence>=numberOption(parsed.options["from-sequence"],1)))},artifact_path:composition.runs.path(id)}:runV2Summary(run,composition)}if(action==="closure"){const current=await composition.runs.read(id);if(current.finished===null)throw new UsageError(`Run V2 is still running: ${id}`);const closure=await assessRunLifecycleClosure(current,composition);if(closure.status==="action_required"){throw new UsageError(`Run ${id} left related work open: ${closure.open_subject_ids.join(", ")}. ${closure.guidance}`)}return{closure,artifact_path:composition.runs.path(id)}}if(action==="usage"){const current=await composition.runs.read(id);if(current.finished!==null)throw new UsageError(`Run V2 is already finished: ${id}`);const sequence=current.records.length+1;const input=nullableNumberOption(parsed.options["input-tokens"]);const cachedInput=nullableNumberOption(parsed.options["cached-input-tokens"]);const outputTokens=nullableNumberOption(parsed.options["output-tokens"]);const reasoning=nullableNumberOption(parsed.options["reasoning-tokens"]);const explicitTotal=nullableNumberOption(parsed.options["total-tokens"]);const occurredAt=new Date().toISOString();const tokens={input,cached_input:cachedInput,output:outputTokens,reasoning,total:explicitTotal??(input===null||outputTokens===null?null:input+outputTokens),source:tokenSourceOption(parsed.options["token-source"])};const provider=inferProvider(parsed.options.model??current.run.model,parsed.options.provider??current.run.provider??current.run.client,current.run.agent);const pricing=new PricingRepository(filesystem);const estimated=estimateUsageCost({provider,model:parsed.options.model??current.run.model,usage:tokens,catalog:await pricing.readCatalog(),fxRate:await pricing.readLatestFxRate()});const record2=usageRecordedV2Schema.parse({schema_version:2,event_id:parsed.options["event-id"]??runV2EventId(id,sequence),run_id:id,sequence,occurred_at:occurredAt,type:"usage.recorded",phase:runV2PhaseOption(parsed.options.phase??latestRunV2Phase(current.records)),activity_kind:parsed.options.activity??"implementation",classification_source:runV2ClassificationOption(parsed.options.classification),tokens,cost:{usd:nullableCurrencyOption(parsed.options["cost-usd"])??estimated.estimated_usd,brl:nullableCurrencyOption(parsed.options["cost-brl"])??estimated.estimated_brl,fx_rate:parsed.options["cost-brl"]===void 0?estimated.fx_rate:null},provider,model:parsed.options.model??current.run.model,source_segment_key:parsed.options["source-segment"]??null,supersedes_event_id:parsed.options.supersedes??null,...runUsageMetadataOptions(parsed.options,occurredAt)});const folded=foldRunV2Records([...current.records,record2]);await composition.runs.appendRecord(record2);const budget=await evaluateRunBudget(folded,composition,filesystem);return{usage:record2,budget,artifact_path:composition.runs.path(id)}}if(action==="finish"){let current=await composition.runs.read(id);const status=runV2FinishStatusOption(parsed.options.status);const candidateRuns=await composition.runs.list();const role=effectiveRunV2Role(current.run);const finalizationBarrier=assessRunFinalizationBarrier(current,candidateRuns);const requestedOutcome=finalizationBarrier.required&&!finalizationBarrier.satisfied?"blocked":lifecycleOutcomeOption(parsed.options);const reconciliationSummary=finalizationBarrier.required&&!finalizationBarrier.satisfied?`Finalization barrier ${finalizationBarrier.status}; required execution-finalizer did not complete`:parsed.options.summary;if(parsed.flags.has("defer-orchestrator-closure")&&role==="orchestrator"){throw new UsageError(`Orchestrator Run closure cannot be deferred for Run ${id}`)}if(current.finished===null&&role==="orchestrator"){const activeChildren=activeDescendantRuns(id,candidateRuns);if(activeChildren.length>0){throw new UsageError(`Run ${id} cannot finish while descendant Runs are active: ${activeChildren.map(child=>child.run.run_id).join(", ")}`)}}if(current.finished!==null){if(current.finished.status!==status){throw new UsageError(`Run V2 is already ${current.finished.status}: ${id}`)}const reconciliation2=await reconcileFinishedRunLifecycle(current,composition,lifecycle,{requestedOutcome,summary:reconciliationSummary,changedFiles:csvOption(parsed.options["changed-files"]),evidenceIds:csvOption(parsed.options.evidence),defer:parsed.flags.has("defer-orchestrator-closure"),candidateRuns});return{run:parsed.flags.has("events")||parsed.options.view==="full"?current:runV2Summary(current,composition),reconciliation:reconciliation2,finalization_barrier:finalizationBarrier,closure:await assessRunLifecycleClosure(current,composition,candidateRuns),artifact_path:composition.runs.path(id)}}current=await recordCodexTelemetryIfAvailable(current,composition,filesystem);if(current.effective_usage_records.length===0){const usage=unavailableUsageRecord(current,parsed,current.records.length+1);await composition.runs.appendRecord(usage);current=foldRunV2Records([...current.records,usage])}const sequence=current.records.length+1;const record2=runFinishedV2Schema.parse({schema_version:2,event_id:runV2EventId(id,sequence),run_id:id,sequence,occurred_at:new Date().toISOString(),type:"run.finished",phase:latestRunV2Phase(current.records),status});foldRunV2Records([...current.records,record2]);await composition.runs.appendRecord(record2);const run=await composition.runs.read(id);const reconciliation=await reconcileFinishedRunLifecycle(run,composition,lifecycle,{requestedOutcome,summary:reconciliationSummary,changedFiles:csvOption(parsed.options["changed-files"]),evidenceIds:csvOption(parsed.options.evidence),defer:parsed.flags.has("defer-orchestrator-closure"),candidateRuns});const closure=await assessRunLifecycleClosure(run,composition,candidateRuns);return{run:parsed.flags.has("events")||parsed.options.view==="full"?run:runV2Summary(run,composition),reconciliation,finalization_barrier:finalizationBarrier,closure,artifact_path:composition.runs.path(id)}}throw new UsageError(`Unknown Run V2 action: ${action??""}`)}function filterRunV2Folds(runs,parsed){const statuses=new Set(csvOption(parsed.options.status));const from=dateBoundary(parsed.options.from,false);const to=dateBoundary(parsed.options.to,true);const positionalRunId=parsed.positionals[2];const phase=parsed.options.phase===void 0?void 0:runV2PhaseOption(parsed.options.phase);const entrypoint=parsed.options.entrypoint===void 0?void 0:runV2EntrypointOption(parsed.options.entrypoint);const workType=parsed.options["work-type"]===void 0?void 0:runV2WorkTypeOption(parsed.options["work-type"]);return runs.filter(fold=>{const run=fold.run;return(statuses.size===0||statuses.has(fold.status))&&(from===null||Date.parse(run.occurred_at)>=from)&&(to===null||Date.parse(run.occurred_at)<=to)&&(positionalRunId===void 0||run.run_id===positionalRunId)&&(parsed.options.id===void 0||run.run_id===parsed.options.id)&&(phase===void 0||latestRunV2Phase(fold.records)===phase)&&(entrypoint===void 0||run.entrypoint===entrypoint)&&(workType===void 0||run.work_type===workType)&&(parsed.options.conversation===void 0||run.conversation_id===parsed.options.conversation)&&(parsed.options.execution===void 0||run.execution_id===parsed.options.execution)&&(parsed.options.task===void 0||run.task_id===parsed.options.task)&&(parsed.options.spec===void 0||run.spec_id===parsed.options.spec)&&(parsed.options.prd===void 0||run.prd_id===parsed.options.prd)&&(parsed.options.change===void 0||run.change_id===parsed.options.change)})}function runV2CostInput2(fold){return{run:{run_id:fold.run.run_id,attribution_status:fold.run.attribution_status,conversation_id:fold.run.conversation_id,execution_id:fold.run.execution_id,task_id:fold.run.task_id,spec_id:fold.run.spec_id,prd_id:fold.run.prd_id,change_id:fold.run.change_id,work_type:fold.run.work_type},records:fold.records,effective_usage_records:fold.effective_usage_records}}function runV2ScopeOption(parsed){return parsed.positionals[2]??parsed.options.id??parsed.options.conversation??parsed.options.execution??parsed.options.task??parsed.options.spec??parsed.options.prd??parsed.options.change??null}var V2_COMMAND_AREAS=new Set(["plan","prd","spec","change","task","execution","decision","run","run-v2","conversation","subagent"]);function createV2Composition(filesystem,layout){const storageMode=layout.projectConfig?.tracking.storage_mode??"tracked_sanitized";return{layout,prds:new PrdV2Repository(filesystem,layout),specs:new DeliverySpecV2Repository(filesystem,layout),changes:new ChangeV2Repository(filesystem,layout),tasks:new TaskV2Repository(filesystem,layout),executions:new ExecutionV2Repository(filesystem,layout),materializer:new PreparedPlanV2Materializer(filesystem,layout),decisions:new DecisionV2Repository(filesystem,layout),runs:new RunV2Repository(filesystem,storageMode==="local_only"?{storageMode:"local_only",localBasePath:".zaip-aios/local-data/runs"}:{storageMode:"tracked_sanitized",layout})}}async function runV2Command(area,action,parsed,filesystem,layout){const composition=createV2Composition(filesystem,layout);if(action==="list"&&parsed.options.view!=="full"){return projectedList(area==="run-v2"?"run":area,parsed,filesystem)}const lifecycle=new LifecycleV2Gate(filesystem,layout,composition);let result2;if(area==="plan")return runPlanV2Command(action,parsed,filesystem,layout);if(area==="prd")result2=await runLifecycleV2Command(area,action,parsed,filesystem,composition,lifecycle);else if(area==="spec")result2=await runLifecycleV2Command(area,action,parsed,filesystem,composition,lifecycle);else if(area==="change")result2=await runChangeV2Command(action,parsed,composition,lifecycle);if(area==="conversation"){result2=await runConversationV2Command(action,parsed,composition,filesystem,lifecycle)}else if(area==="subagent"){result2=await runSubagentV2Command(action,parsed,composition,filesystem)}else if(area==="task"){result2=await runLifecycleV2Command(area,action,parsed,filesystem,composition,lifecycle)}else if(area==="execution")result2=await runExecutionV2Command(action,parsed,composition,lifecycle,async(id,options)=>runAutonomousExecutionCommand(id,options,composition,layout.projectConfig?.execution?.runtime==="autonomous"&&layout.projectConfig!==null?createAutonomousProductionDriver(filesystem,layout.projectConfig):void 0,await loadAgentCatalog(filesystem)));else if(area==="decision")result2=await runDecisionV2Command(action,parsed,filesystem,composition);else if(area==="run"||area==="run-v2"){result2=await runRunV2Command(action,parsed,composition,filesystem,lifecycle)}else if(!["prd","spec","change","task","conversation","subagent"].includes(area)){throw new UsageError(`Unknown V2 command: ${area} ${action??""}`.trim())}if(isProjectionMutation(action)){await projectMutationResult(result2,area==="run-v2"?"run":area,parsed,composition,filesystem)}return result2}function helpText(version2){return`ZAIP-AIOS ${version2}
|
|
1262
1263
|
|
|
1263
1264
|
Usage: zaip <command> [action] [--json] [--workspace PATH]
|
|
1264
1265
|
|