@zaip-ai/cli 1.0.2 → 1.0.6

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.
Files changed (68) hide show
  1. package/README.md +4 -2
  2. package/dist/commands/init.d.ts +1 -0
  3. package/dist/commands/init.d.ts.map +1 -1
  4. package/dist/commands/init.js +4 -1
  5. package/dist/commands/init.js.map +1 -1
  6. package/dist/index.js +1 -0
  7. package/dist/index.js.map +1 -1
  8. package/dist/services/adapters.d.ts +1 -7
  9. package/dist/services/adapters.d.ts.map +1 -1
  10. package/dist/services/adapters.js +4 -9
  11. package/dist/services/adapters.js.map +1 -1
  12. package/dist/services/agent-adapters.js +1 -1
  13. package/dist/services/agent-adapters.js.map +1 -1
  14. package/dist/services/global-codex-config.d.ts +6 -1
  15. package/dist/services/global-codex-config.d.ts.map +1 -1
  16. package/dist/services/global-codex-config.js +48 -2
  17. package/dist/services/global-codex-config.js.map +1 -1
  18. package/dist/services/global-codex-config.test.js +9 -0
  19. package/dist/services/global-codex-config.test.js.map +1 -1
  20. package/dist/services/install-agents-template.d.ts.map +1 -1
  21. package/dist/services/install-agents-template.js +10 -2
  22. package/dist/services/install-agents-template.js.map +1 -1
  23. package/dist/services/logger.test.js +1 -0
  24. package/dist/services/logger.test.js.map +1 -1
  25. package/dist/services/runtime-template.test.js +5 -5
  26. package/dist/types.d.ts +1 -0
  27. package/dist/types.d.ts.map +1 -1
  28. package/package.json +2 -2
  29. package/templates/.agents/config/agents/catalog.yaml +4 -4
  30. package/templates/.agents/dashboard/.zaip-managed.json +4 -4
  31. package/templates/.agents/dashboard/apps/frontend/dist/assets/{index-BOLwg8VW.js → index-ehU9Etwm.js} +214 -16
  32. package/templates/.agents/dashboard/apps/frontend/dist/index.html +1 -1
  33. package/templates/.agents/dashboard/packages/local-runtime/server.mjs +26 -6
  34. package/templates/.agents/requirements/autonomous-assurance.md +1 -1
  35. package/templates/.agents/requirements/context-engine.md +1 -1
  36. package/templates/.agents/requirements/cost-observability.md +1 -1
  37. package/templates/.agents/requirements/design-system.md +1 -1
  38. package/templates/.agents/requirements/execution-engine.md +1 -1
  39. package/templates/.agents/requirements/kanban-dashboard.md +1 -1
  40. package/templates/.agents/requirements/model-orchestration.md +2 -2
  41. package/templates/.agents/requirements/public-distribution.md +1 -1
  42. package/templates/.agents/requirements/software-architecture.md +1 -1
  43. package/templates/.agents/requirements/work-lifecycle.md +3 -3
  44. package/templates/.agents/rules/zaip/core.md +1 -1
  45. package/templates/.agents/rules/zaip/workflow.md +1 -1
  46. package/templates/.agents/skills/zaip-aios/SKILL.md +9 -0
  47. package/templates/.agents/skills/zaip-skill-execution/SKILL.md +1 -1
  48. package/templates/.agents/skills/zaip-skill-task/SKILL.md +1 -1
  49. package/templates/.agents/zaip-aios/guides/06-execucao.md +1 -1
  50. package/templates/.agents/zaip-aios/guides/16-lifecycle-e-reconciliacao.md +1 -1
  51. package/templates/.zaip-aios/bin/zaip.mjs +9 -8
  52. package/templates/.zaip-aios/checksums.sha256 +16 -15
  53. package/templates/.zaip-aios/dashboard/.zaip-managed.json +4 -4
  54. package/templates/.zaip-aios/dashboard/apps/frontend/dist/assets/{index-BOLwg8VW.js → index-ehU9Etwm.js} +214 -16
  55. package/templates/.zaip-aios/dashboard/apps/frontend/dist/index.html +1 -1
  56. package/templates/.zaip-aios/dashboard/packages/local-runtime/server.mjs +26 -6
  57. package/templates/.zaip-aios/manifest.json +2 -1
  58. package/templates/.zaip-aios/templates/config/agents/catalog.yaml +4 -4
  59. package/templates/.zaip-aios/templates/requirements/model-orchestration.md +1 -1
  60. package/templates/.zaip-aios/templates/requirements/work-lifecycle.md +2 -2
  61. package/templates/.zaip-aios/templates/rules/zaip/core.md +1 -1
  62. package/templates/.zaip-aios/templates/rules/zaip/workflow.md +1 -1
  63. package/templates/.zaip-aios/templates/skills/zaip-aios/SKILL.md +9 -0
  64. package/templates/.zaip-aios/templates/skills/zaip-skill-execution/SKILL.md +1 -1
  65. package/templates/.zaip-aios/templates/skills/zaip-skill-task/SKILL.md +1 -1
  66. package/templates/.zaip-aios/templates/zaip-aios/guides/06-execucao.md +1 -1
  67. package/templates/.zaip-aios/templates/zaip-aios/guides/16-lifecycle-e-reconciliacao.md +1 -1
  68. package/templates/template-manifest.json +52 -43
@@ -100,8 +100,8 @@ ${body}
100
100
  `)));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}
101
101
  `),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(isNodeError2(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()})}
102
102
  `);try{return await operation()}finally{await this.filesystem.removeFile(LOCK_PATH)}}catch(error51){if(!isNodeError2(error51)||error51.code!=="EEXIST")throw error51;if(await this.removeStaleLock())continue;await delay2(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(isNodeError2(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 values=runs.map(run=>run.usage?.[field]??null);const known=values.filter(value=>value!==null);const unknown2=values.length-known.length;return{known_sum:known.reduce((sum,value)=>sum+value,0),unknown:unknown2,complete:unknown2===0,coverage_ratio:values.length===0?1:known.length/values.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 timestamp8=typeof run.data?.started_at==="string"?run.data.started_at:run.updated_at;const key=timestamp8.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)}
103
- `}function isProcessAlive(pid){try{process.kill(pid,0);return true}catch(error51){return isNodeError2(error51)&&error51.code==="EPERM"}}function isNodeError2(error51){return error51 instanceof Error&&"code"in error51}function delay2(milliseconds){return new Promise(resolve3=>setTimeout(resolve3,milliseconds))}function normalizeFilter(filter){const from=normalizeTimestamp(filter.from??null,"from");const to=normalizeTimestamp(filter.to??null,"to");if(from!==null&&to!==null&&from>to)throw new Error("from must not be after to");return{from,to}}function normalizeTimestamp(value,name){if(value===null||value.length===0)return null;const time3=Date.parse(value);if(Number.isNaN(time3))throw new Error(`${name} must be an ISO timestamp`);return new Date(time3).toISOString()}function executionRelationshipCounts(execution,input){const taskIds=new Set(execution.dag.nodes.map(node=>node.task_id));const changesById=new Map(input.changes.map(change=>[change.id,change]));const specsById=new Map(input.specs.map(spec=>[spec.id,spec]));const specIds=new Set;const prdIds=new Set;const includeSpec=specId=>{specIds.add(specId);const spec=specsById.get(specId);const prdId=spec?.prd_id??spec?.parent_id??null;if(prdId!==null)prdIds.add(prdId)};if(execution.origin.type==="spec")includeSpec(execution.origin.spec_id);if(execution.origin.type==="prd")prdIds.add(execution.origin.prd_id);for(const task of input.tasks){if(!taskIds.has(task.id))continue;const source=changesById.get(task.change_id)?.source;if(!source)continue;if((source.type==="spec"||source.type==="prd")&&source.spec_id){includeSpec(source.spec_id)}if(source.type==="prd"&&source.prd_id)prdIds.add(source.prd_id)}const relatedRuns=input.runs.filter(run=>run.execution_id===execution.id||run.task_id!==null&&taskIds.has(run.task_id));const knownCalls=relatedRuns.flatMap(run=>run.call_count===null?[]:[run.call_count]);const finalizerRuns=relatedRuns.filter(run=>run.run_purpose==="finalization"||run.agent==="agent-execution-finalizer"||run.agent==="agent-task-finalizer");const finalizedTaskIds=new Set(finalizerRuns.flatMap(run=>run.status==="completed"&&run.task_id!==null?[run.task_id]:[]));return{agent_call_count:relatedRuns.length,orchestrator_run_count:relatedRuns.filter(run=>run.parent_run_id===null).length,subagent_run_count:relatedRuns.filter(run=>run.parent_run_id!==null).length,finalizer_run_count:finalizerRuns.length,finalized_task_count:finalizedTaskIds.size,llm_call_count:knownCalls.reduce((sum,count)=>sum+count,0),llm_call_count_complete:knownCalls.length===relatedRuns.length,task_count:taskIds.size,spec_count:specIds.size,prd_count:prdIds.size,duration_ms:sumObservedDurations(relatedRuns)}}function sumObservedDurations(runs){const observed=runs.flatMap(run=>typeof run.duration_ms==="number"&&run.duration_ms>0?[run.duration_ms]:[]);return observed.length===0?null:observed.reduce((sum,duration3)=>sum+duration3,0)}function recentRunsFirst(runs){return[...runs].sort((left,right)=>right.started_at.localeCompare(left.started_at)||right.id.localeCompare(left.id))}async function countTaskTestArtifacts(filesystem,tasks,changePath){const counts=new Map(tasks.map(task=>[task.id,0]));const tasksByChange=new Map;for(const task of tasks){tasksByChange.set(task.change_id,[...tasksByChange.get(task.change_id)??[],task])}for(const[changeId,relatedTasks]of tasksByChange){const artifactPath=changePath(changeId).replace(/\\/g,"/");const changeDirectory=artifactPath.slice(0,artifactPath.lastIndexOf("/"));let paths;try{paths=await filesystem.listFiles(changeDirectory)}catch{continue}const testPaths=paths.filter(path=>path.replace(/\\/g,"/").includes("/artifacts/tests/")&&/\.(?:md|json|jsonl|txt|log)$/i.test(path));for(const path of testPaths){let content;try{content=await filesystem.readText(path)}catch{continue}for(const task of relatedTasks){if(content.includes(task.id))counts.set(task.id,(counts.get(task.id)??0)+1)}}}return counts}function decisionCounts(decisions){return{human:decisions.filter(decision=>decision.origin==="human").length,agent:decisions.filter(decision=>decision.origin==="agent").length}}function taskProgress(status){if(status==="completed")return 100;if(status==="verifying")return 80;if(status==="executing")return 50;if(["blocked","failed","cancelled"].includes(status))return 0;return 10}function executionWorkStatus(status){if(status==="planned")return"planning";if(["running","paused","verifying"].includes(status))return"executing";return status}function macroWorkStatus(lifecycleStatus,executions){if(lifecycleStatus==="delivered")return"completed";if(lifecycleStatus==="blocked")return"blocked";if(lifecycleStatus==="failed")return"failed";if(lifecycleStatus==="cancelled")return"cancelled";const statuses=executions.flatMap(execution=>execution===void 0?[]:[execution.status]);if(statuses.some(status=>["running","paused"].includes(status))){return"executing"}if(statuses.includes("verifying"))return"verifying";if(statuses.length>0&&statuses.every(status=>status==="completed")){return lifecycleStatus==="active"?"verifying":"completed"}if(lifecycleStatus==="active")return"executing";if(statuses.includes("blocked"))return"blocked";if(statuses.includes("failed"))return"failed";if(statuses.includes("planned")||["draft","ready"].includes(lifecycleStatus)){return"planning"}return"planning"}function taskIdsWithStartedExecution(executions){return new Set(executions.filter(execution=>execution.status!=="planned").flatMap(execution=>execution.dag.nodes.map(node=>node.task_id)))}async function buildLocalOperationsProjection(filesystem,layout,filter={}){if(layout.version===1)throw new Error("Local projections require a modern workspace");const normalized=normalizeFilter(filter);const all=await new ProjectionStore(filesystem).readEntities();if(all.length===0){throw new Error("Projection is not initialized; run zaip projection rebuild --confirm-full-scan")}const entities=all.filter(entity=>within(entity.updated_at,normalized));const byKind=kind=>entities.filter(entity=>entity.kind===kind);const projectedRuns=byKind("run").map(entity=>projectRun(entity,layout));const runThreadIds=projectedRuns.flatMap(run=>typeof run.client_thread_id==="string"?[run.client_thread_id]:[]);const activeThreadIds=await readActiveCodexThreadIds(filesystem.root,runThreadIds);const activeRunIds=latestActiveRunIds(projectedRuns,activeThreadIds);const runs=recentRunsFirst(projectedRuns.map(run=>({...run,is_active:activeRunIds.has(run.id)})));const changes=byKind("change").map(entity=>{const data=entity.data??{};return{...data,id:entity.id,title:entity.title??entity.id,created_at:typeof data.created_at==="string"?data.created_at:null,status:entity.status??"planned",risk:entity.risk??"standard",source:data.source??{type:"task",task_id:entity.relations[0]??entity.id},requirement_ids:data.requirement_ids??[],acceptance_ids:data.acceptance_ids??[],task_ids:data.task_ids??[],result:typeof data.result==="string"?data.result:null,artifact_path:layout.activePath("change",entity.id)}});const executionBases=byKind("execution").map(entity=>{const data=entity.data??{};return{...data,id:entity.id,created_at:typeof data.created_at==="string"?data.created_at:null,status:entity.status??"planned",work_status:executionWorkStatus(entity.status??"planned"),origin:data.origin??{type:"task",task_id:entity.relations[0]??entity.id},dag:data.dag??{nodes:[],topological_order:[]},result:typeof data.result==="string"?data.result:null,artifact_path:layout.activePath("execution",entity.id)}});const taskEntities=byKind("task");const taskTestCounts=await countTaskTestArtifacts(filesystem,taskEntities.map(entity=>({id:entity.id,change_id:taskChangeId(entity)})),changeId=>layout.activePath("change",changeId));const terminalTaskIds=new Set(taskEntities.filter(entity=>["completed","blocked","cancelled","failed"].includes(entity.status??"")).map(entity=>entity.id));const activeTaskIds=new Set(runs.flatMap(run=>run.is_active&&run.task_id!==null&&!terminalTaskIds.has(run.task_id)?[run.task_id]:[]));const startedExecutionTaskIds=taskIdsWithStartedExecution(executionBases);const tasks=taskEntities.map(entity=>({...projectTask(entity,layout,changes,activeTaskIds,startedExecutionTaskIds),test_count:taskTestCounts.get(entity.id)??0}));const specRelationships=byKind("spec").map(entity=>({id:entity.id,prd_id:nullableString(entity.data?.prd_id)??entity.relations.find(relation=>relation.startsWith("PRD-"))??null}));const executionRows=executionBases.map(execution=>({...execution,...executionRelationshipCounts(execution,{runs,tasks,changes,specs:specRelationships})}));const decisions=byKind("decision").map(entity=>{const data=entity.data??{};const scopeType=data.scope_type==="execution"?"execution":"change";const scopeId=String(data.scope_id??entity.relations[0]??"");return{id:entity.id,title:entity.title??entity.id,origin:data.origin==="agent"?"agent":"human",scope_type:scopeType,scope_id:scopeId,artifact_path:`${posix2.dirname(layout.activePath(scopeType,scopeId))}/decisions/${entity.id}.md`,created_at:String(data.created_at??entity.updated_at)}});const prds=byKind("prd").map(entity=>macro(entity,"prd",layout,tasks,runs,decisions,changes,executionRows));const specs=byKind("spec").map(entity=>macro(entity,"spec",layout,tasks,runs,decisions,changes,executionRows));const usage=usageForRuns2(runs);const origins={conversation:usageForRuns2(runs.filter(run=>run.entrypoint==="conversation")),task:usageForRuns2(runs.filter(run=>run.entrypoint==="task")),spec:usageForRuns2(runs.filter(run=>run.entrypoint==="spec")),prd:usageForRuns2(runs.filter(run=>run.entrypoint==="prd"))};const completed=tasks.filter(task=>task.status==="completed").length;const terminal=runs.filter(run=>run.status!=="running");return{schema_version:2,layout_version:layout.version,readonly:true,source:".agents/projections/runtime",filters:normalized,summary:{prd_count:prds.length,spec_count:specs.length,execution_count:executionRows.length,task_count:tasks.length,run_count:runs.length,decisions:decisionCounts(decisions),source_latest_at:entities.map(entity=>entity.updated_at).sort().at(-1)??null,quality:{completed_tasks:completed,task_completion_rate:tasks.length===0?0:completed/tasks.length,terminal_runs:terminal.length,successful_runs:terminal.filter(run=>run.status==="completed").length,terminal_success_rate:terminal.length===0?0:terminal.filter(run=>run.status==="completed").length/terminal.length,rework_rate:runs.length===0?0:runs.filter(run=>run.work_type==="rework").length/runs.length},reconciliation:{phase_tokens_match_total:true,phase_usd_match_total:true,phase_brl_match_total:true,origin_tokens_match_total:true},usage},origins,prds,specs,tasks,changes,executions:executionRows,runs,decisions}}function projectTask(entity,layout,changes,activeTaskIds,startedExecutionTaskIds){const data=entity.data??{};const changeId=String(data.change_id??entity.relations.find(id=>id.startsWith("CHG-"))??"");const change=changes.find(candidate=>candidate.id===changeId);const specIdFromChange=change?.source.type==="spec"||change?.source.type==="prd"?change.source.spec_id:null;return{...data,schema_version:2,id:entity.id,revision:Number(data.revision??1),change_id:changeId,title:entity.title??entity.id,short_name:String(data.short_name??entity.id),objective:String(data.objective??entity.title??entity.id),status:entity.status??"planned",attempt_count:typeof data.attempt_count==="number"&&Number.isInteger(data.attempt_count)?data.attempt_count:null,risk:entity.risk??"standard",priority:entity.priority??"medium",owner:typeof data.owner==="string"?data.owner:null,requirement_ids:data.requirement_ids??[],acceptance_ids:data.acceptance_ids??[],depends_on:data.depends_on??[],write_scopes:data.write_scopes??[],created_at:String(data.created_at??entity.updated_at),updated_at:entity.updated_at,started_at:typeof data.started_at==="string"?data.started_at:null,finished_at:typeof data.finished_at==="string"?data.finished_at:null,result:data.result??null,artifact_path:layout.activePath("task",entity.id),progress:taskProgress(entity.status??"planned"),spec_id:entity.relations.find(id=>id.startsWith("SPEC-"))??specIdFromChange??null,execution_started:startedExecutionTaskIds.has(entity.id),is_active:activeTaskIds.has(entity.id)}}function taskChangeId(entity){return String(entity.data?.change_id??entity.relations.find(id=>id.startsWith("CHG-"))??"")}function projectRun(entity,layout){const data=entity.data??{};const started=String(data.started_at??entity.updated_at);const finished=typeof data.finished_at==="string"?data.finished_at:null;const segments=pricingSegments(data.pricing_segments);return{id:entity.id,artifact_path:layout.activePath("run",entity.id),status:entity.status??"running",phase:String(data.phase??"execution"),entrypoint:data.entrypoint??"task",work_type:data.work_type??"new",run_role:runRole(data.run_role),run_kind:data.run_kind==="subrun"?"subrun":nullableString(data.parent_run_id)===null?"run":"subrun",run_purpose:runPurpose(data.run_purpose,String(data.agent??"unknown"),nullableString(data.parent_run_id)),requires_finalizer:data.requires_finalizer===true,parent_run_id:nullableString(data.parent_run_id),client:String(data.client??"unknown"),agent:String(data.agent??"unknown"),agent_name:canonicalAgentName(String(data.agent??"unknown"),String(data.agent_name??data.agent??"unknown")),provider:typeof data.provider==="string"?data.provider:null,model:String(data.model??"unknown"),reasoning_effort:typeof data.reasoning_effort==="string"?data.reasoning_effort:null,effective_model:nullableString(data.effective_model),effective_reasoning_effort:nullableString(data.effective_reasoning_effort),effective_config_mixed:data.effective_config_mixed===true,service_tier:typeof data.service_tier==="string"?data.service_tier:null,call_count:nullableNumber(data.call_count),terminal_call_count:nullableNumber(data.terminal_call_count),failed_call_count:nullableNumber(data.failed_call_count),cancelled_call_count:nullableNumber(data.cancelled_call_count),conversation_id:String(data.conversation_id??"unknown"),client_thread_id:nullableString(data.client_thread_id),client_turn_id:nullableString(data.client_turn_id),is_active:false,execution_id:nullableString(data.execution_id),task_id:nullableString(data.task_id),spec_id:nullableString(data.spec_id),prd_id:nullableString(data.prd_id),change_id:nullableString(data.change_id),started_at:started,finished_at:finished,duration_ms:finished===null?null:Math.max(0,Date.parse(finished)-Date.parse(started)),...segments===void 0?{}:{pricing_segments:segments},usage:usageFromEntity(entity)}}function runRole(value){if(value==="owner")return"orchestrator";if(value==="contributor")return"subagent";return value==="orchestrator"||value==="subagent"||value==="intake"?value:"intake"}function runPurpose(value,agent,parentRunId){if(value==="intake"||value==="orchestration"||value==="execution"||value==="review"||value==="audit"||value==="finalization"){return value}if(agent==="agent-execution-finalizer"||agent==="agent-task-finalizer"){return"finalization"}if(agent==="agent-reviewer")return"review";if(agent==="agent-auditor")return"audit";return parentRunId===null?"orchestration":"execution"}function canonicalAgentName(agent,agentName){if(agent==="codex")return"codex";return agentName.startsWith("agent-")?`zaip-agent-${agentName.slice("agent-".length)}`:agentName}function nullableNumber(value){return typeof value==="number"&&Number.isFinite(value)?value:null}function pricingSegments(value){if(!Array.isArray(value))return void 0;return value.flatMap(item=>{if(typeof item!=="object"||item===null)return[];const row=item;if(row.phase!=="conversation"&&row.phase!=="planning"&&row.phase!=="execution"){return[]}const nullableNumber2=entry=>typeof entry==="number"?entry:null;return[{phase:row.phase,provider:typeof row.provider==="string"?row.provider:null,model:typeof row.model==="string"?row.model:null,service_tier:typeof row.service_tier==="string"?row.service_tier:null,input_tokens:nullableNumber2(row.input_tokens),cached_input_tokens:nullableNumber2(row.cached_input_tokens),output_tokens:nullableNumber2(row.output_tokens),reasoning_tokens:nullableNumber2(row.reasoning_tokens),total_tokens:nullableNumber2(row.total_tokens),recorded_usd:nullableNumber2(row.recorded_usd),recorded_brl:nullableNumber2(row.recorded_brl),recorded_fx_rate:nullableNumber2(row.recorded_fx_rate)}]})}function macro(entity,kind,layout,tasks,runs,decisions,changes,executions){const creationRunId=nullableString(entity.data?.creation_run_id);const directlyRelatedRuns=runs.filter(run=>run.prd_id===entity.id||run.spec_id===entity.id||run.id===creationRunId);const directChanges=changes.filter(change=>kind==="spec"&&(change.source.type==="spec"||change.source.type==="prd")&&change.source.spec_id===entity.id||kind==="prd"&&change.source.type==="prd"&&change.source.prd_id===entity.id);const executionIds=new Set(kind==="prd"?entity.relations.filter(id=>id.startsWith("EXEC-")):[]);for(const run of directlyRelatedRuns){if(run.execution_id!==null)executionIds.add(run.execution_id)}const taskIds=new Set(entity.relations.filter(id=>id.startsWith("TASK-")));for(const run of directlyRelatedRuns){if(run.task_id!==null)taskIds.add(run.task_id)}for(const change of directChanges){for(const taskId of change.task_ids)taskIds.add(taskId)}for(const task of tasks){if(task.spec_id===entity.id)taskIds.add(task.id)}const relatedExecutions=executions.filter(execution=>executionIds.has(execution.id)||kind==="spec"&&(execution.origin.type==="spec"&&execution.origin.spec_id===entity.id||execution.dag.nodes.some(node=>taskIds.has(node.task_id)))||kind==="prd"&&execution.origin.type==="prd"&&execution.origin.prd_id===entity.id);for(const execution of relatedExecutions){executionIds.add(execution.id);if(kind==="prd"){for(const node of execution.dag.nodes)taskIds.add(node.task_id)}}const relatedTasks=tasks.filter(task=>taskIds.has(task.id)||task.spec_id===entity.id);for(const task of relatedTasks)taskIds.add(task.id);const relatedRuns=runs.filter(run=>{const directlyLinked=run.spec_id===entity.id||run.id===creationRunId||run.task_id!==null&&taskIds.has(run.task_id);if(kind==="spec")return directlyLinked;return directlyLinked||run.prd_id===entity.id||run.execution_id!==null&&executionIds.has(run.execution_id)});const relatedOwnerIds=new Set([entity.id,...relatedTasks.map(task=>task.change_id),...relatedRuns.flatMap(run=>[run.change_id,run.execution_id]).filter(id=>id!==null)]);const relatedDecisions=decisions.filter(decision=>relatedOwnerIds.has(decision.scope_id));return{id:entity.id,title:entity.title??entity.id,created_at:typeof entity.data?.created_at==="string"?entity.data.created_at:null,kind,parent_id:entity.relations.find(id=>id.startsWith("PRD-"))??null,artifact_path:layout.activePath(kind,entity.id),lifecycle_status:entity.status??"draft",work_status:macroWorkStatus(entity.status??"draft",relatedExecutions),is_active:relatedRuns.some(run=>run.is_active),execution_ids:[...executionIds],task_ids:relatedTasks.map(task=>task.id),run_ids:relatedRuns.map(run=>run.id),execution_count:executionIds.size,task_count:relatedTasks.length,run_count:relatedRuns.length,duration_ms:sumObserved(relatedRuns.map(run=>run.duration_ms)),decisions:decisionCounts(relatedDecisions),rework_run_count:relatedRuns.filter(run=>run.work_type==="rework").length,quality:{completed_tasks:relatedTasks.filter(task=>task.status==="completed").length,task_completion_rate:relatedTasks.length===0?0:relatedTasks.filter(task=>task.status==="completed").length/relatedTasks.length,terminal_runs:relatedRuns.filter(run=>run.status!=="running").length,successful_runs:relatedRuns.filter(run=>run.status==="completed").length,terminal_success_rate:0,rework_rate:relatedRuns.length===0?0:relatedRuns.filter(run=>run.work_type==="rework").length/relatedRuns.length},usage:usageForRuns2(relatedRuns)}}async function readActiveCodexThreadIds(workspaceRoot,threadIds){if(threadIds.length===0)return new Set;try{const invocations=await listActiveCodexInvocations(workspaceRoot,{threadIds});return new Set(invocations.map(invocation=>invocation.sessionId))}catch{return new Set}}function latestActiveRunIds(runs,activeThreadIds){const latestByThread=new Map;for(const run of runs){if(run.status!=="running"||typeof run.client_thread_id!=="string"||!activeThreadIds.has(run.client_thread_id)){continue}const current=latestByThread.get(run.client_thread_id);if(current===void 0||run.started_at>current.started_at){latestByThread.set(run.client_thread_id,run)}}return new Set([...latestByThread.values()].map(run=>run.id))}function sumObserved(values){const observed=values.filter(value=>value!==null);return observed.length===0?null:observed.reduce((total,value)=>total+value,0)}function usageFromEntity(entity){const aggregate=entity.data?.entrypoint_usage;if(typeof aggregate==="object"&&aggregate!==null){const buckets=aggregate;const total=metricFromBucket(buckets.total);const empty2=emptyMetric();const isRework=entity.data?.work_type==="rework";return{conversation:metricFromBucket(buckets.conversation),planning:metricFromBucket(buckets.planning),execution:metricFromBucket(buckets.execution),total,new_work:isRework?empty2:total,rework:isRework?total:empty2}}const metric=metricFromEntity(entity);const empty=emptyMetric();const phase=String(entity.data?.phase??"execution");return{conversation:phase==="conversation"?metric:empty,planning:phase==="planning"?metric:empty,execution:phase==="execution"?metric:empty,total:metric,new_work:entity.data?.work_type==="rework"?empty:metric,rework:entity.data?.work_type==="rework"?metric:empty}}function metricFromBucket(value){if(typeof value!=="object"||value===null)return emptyMetric();const bucket=value;const tokens=bucket.tokens??{};const cost=bucket.cost??{};const coverage=bucket.coverage??{};return{events:Number(bucket.usage_event_count??coverage.events??0),tokens:{input:tokens.input??null,cached_input:tokens.cached_input??null,output:tokens.output??null,reasoning:tokens.reasoning??null,total:tokens.total??null},cost:{usd:cost.usd??null,brl:cost.brl??null},coverage:{events:Number(coverage.events??0),tokens:Number(coverage.tokens??0),usd:Number(coverage.usd??0),brl:Number(coverage.brl??0)}}}function usageForRuns2(runs){const keys=["conversation","planning","execution","total","new_work","rework"];return Object.fromEntries(keys.map(key=>[key,sumMetrics2(runs.map(run=>run.usage[key]))]))}function metricFromEntity(entity){const usage=entity.usage;return{events:usage===null?0:1,tokens:{input:usage?.input_tokens??null,cached_input:usage?.cached_input_tokens??null,output:usage?.output_tokens??null,reasoning:null,total:usage?.total_tokens??null},cost:{usd:usage?.currency==="USD"?usage.cost:null,brl:usage?.currency==="BRL"?usage.cost:null},coverage:{events:usage===null?0:1,tokens:usage?.total_tokens===null||usage===null?0:1,usd:usage?.currency==="USD"&&usage.cost!==null?1:0,brl:usage?.currency==="BRL"&&usage.cost!==null?1:0}}}function emptyMetric(){return{events:0,tokens:{input:null,cached_input:null,output:null,reasoning:null,total:null},cost:{usd:null,brl:null},coverage:{events:0,tokens:0,usd:0,brl:0}}}function sumMetrics2(metrics){const sum=values=>{const known=values.filter(value=>value!==null);return known.length===0?null:known.reduce((total,value)=>total+value,0)};return{events:metrics.reduce((total,metric)=>total+metric.events,0),tokens:{input:sum(metrics.map(metric=>metric.tokens.input)),cached_input:sum(metrics.map(metric=>metric.tokens.cached_input)),output:sum(metrics.map(metric=>metric.tokens.output)),reasoning:sum(metrics.map(metric=>metric.tokens.reasoning)),total:sum(metrics.map(metric=>metric.tokens.total))},cost:{usd:sum(metrics.map(metric=>metric.cost.usd)),brl:sum(metrics.map(metric=>metric.cost.brl))},coverage:{events:metrics.reduce((total,metric)=>total+metric.coverage.events,0),tokens:metrics.reduce((total,metric)=>total+metric.coverage.tokens,0),usd:metrics.reduce((total,metric)=>total+metric.coverage.usd,0),brl:metrics.reduce((total,metric)=>total+metric.coverage.brl,0)}}}function nullableString(value){return typeof value==="string"?value:null}function within(timestamp8,filter){return(filter.from===null||timestamp8>=filter.from)&&(filter.to===null||timestamp8<=filter.to)}var timestamp2=external_exports.string().datetime({offset:true}).or(external_exports.string().datetime());var decisionV2IdSchema=external_exports.string().regex(/^DEC-(?:HUMAN|AI)-/);var decisionV2CategorySchema=external_exports.enum(["architecture","contract","database","security","dependency","network","infrastructure","cost","implementation","rollback"]);var decisionV2Schema=external_exports.object({schema_version:external_exports.literal(2),id:decisionV2IdSchema,title:external_exports.string().min(1),scope_type:external_exports.enum(["change","execution"]),scope_id:external_exports.string().min(1),origin:external_exports.enum(["human","agent"]),category:decisionV2CategorySchema,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().min(1)),consequences:external_exports.array(external_exports.string().min(1)),reversible:external_exports.boolean(),rollback:external_exports.string().min(1),confidence:external_exports.number().min(0).max(1).nullable(),created_at:timestamp2,confirmed_at:timestamp2.nullable()}).strict().superRefine((record2,context)=>{const expectedScopePrefix=record2.scope_type==="change"?"CHG-":"EXEC-";if(!record2.scope_id.startsWith(expectedScopePrefix)){context.addIssue({code:"custom",path:["scope_id"],message:`${record2.scope_type} decision requires ${expectedScopePrefix} scope_id`})}const expectedDecisionPrefix=record2.origin==="human"?"DEC-HUMAN-":"DEC-AI-";if(!record2.id.startsWith(expectedDecisionPrefix)){context.addIssue({code:"custom",path:["id"],message:`${record2.origin} decision requires ${expectedDecisionPrefix} id`})}if(record2.origin==="human"&&record2.confidence!==null){context.addIssue({code:"custom",path:["confidence"],message:"Human decisions do not use agent confidence"})}if(record2.origin==="agent"&&record2.confidence===null){context.addIssue({code:"custom",path:["confidence"],message:"Agent decisions require confidence"})}if(record2.origin==="human"&&record2.confirmed_at===null){context.addIssue({code:"custom",path:["confirmed_at"],message:"Human decisions require explicit confirmation provenance"})}});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 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]);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 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 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"})}});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();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((values,context)=>{const seen=new Set;for(const[index,value]of values.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"}import{createHash}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 finding of validatePreparedPlanV2(plan)){context.addIssue({code:"custom",path:[...finding.path],message:finding.message})}});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 result=new Map;const visit=(taskId,seen)=>{const cached2=result.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)}}result.set(taskId,dependencies);return dependencies};for(const taskId of direct.keys())visit(taskId,new Set);return result}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(values,rule,path,findings){const seen=new Set;for(const value of values){if(seen.has(value))findings.push({rule,path,message:`Duplicate value: ${value}`});seen.add(value)}}function addDuplicateIssues(values,field,context){const seen=new Set;for(const value of values){if(seen.has(value)){context.addIssue({code:"custom",path:[field],message:`Duplicate value: ${value}`})}seen.add(value)}}function hashCanonicalValue(value){return createHash("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 createHash2}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)}
104
- `);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 digest=createHash2("sha256").update(clientTurnId).digest("hex");return`${this.layout.entityRoot("execution")}/.client-turn-claims/${digest}.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 byId=new Map(specs.map(spec=>[spec.id,spec]));for(const specId of specIds){const spec=byId.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 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,result=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??result??`Change moved to ${status}.`:null,updated_at:now,started_at:status==="executing"&&current.change.started_at===null?now:current.change.started_at,finished_at:terminal?now:null,result:terminal?result: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,result=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??result??`Execution moved to ${status}.`:null,updated_at:now,started_at:status==="running"&&current.execution.started_at===null?now:current.execution.started_at,finished_at:terminal?now:null,result:terminal?result: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}
103
+ `}function isProcessAlive(pid){try{process.kill(pid,0);return true}catch(error51){return isNodeError2(error51)&&error51.code==="EPERM"}}function isNodeError2(error51){return error51 instanceof Error&&"code"in error51}function delay2(milliseconds){return new Promise(resolve3=>setTimeout(resolve3,milliseconds))}function normalizeFilter(filter){const from=normalizeTimestamp(filter.from??null,"from");const to=normalizeTimestamp(filter.to??null,"to");if(from!==null&&to!==null&&from>to)throw new Error("from must not be after to");return{from,to}}function normalizeTimestamp(value,name){if(value===null||value.length===0)return null;const time3=Date.parse(value);if(Number.isNaN(time3))throw new Error(`${name} must be an ISO timestamp`);return new Date(time3).toISOString()}function executionRelationshipCounts(execution,input){const taskIds=new Set(execution.dag.nodes.map(node=>node.task_id));const changesById=new Map(input.changes.map(change=>[change.id,change]));const specsById=new Map(input.specs.map(spec=>[spec.id,spec]));const specIds=new Set;const prdIds=new Set;const includeSpec=specId=>{specIds.add(specId);const spec=specsById.get(specId);const prdId=spec?.prd_id??spec?.parent_id??null;if(prdId!==null)prdIds.add(prdId)};if(execution.origin.type==="spec")includeSpec(execution.origin.spec_id);if(execution.origin.type==="prd")prdIds.add(execution.origin.prd_id);for(const task of input.tasks){if(!taskIds.has(task.id))continue;const source=changesById.get(task.change_id)?.source;if(!source)continue;if((source.type==="spec"||source.type==="prd")&&source.spec_id){includeSpec(source.spec_id)}if(source.type==="prd"&&source.prd_id)prdIds.add(source.prd_id)}const relatedRuns=input.runs.filter(run=>run.execution_id===execution.id||run.task_id!==null&&taskIds.has(run.task_id));const knownCalls=relatedRuns.flatMap(run=>run.call_count===null?[]:[run.call_count]);const finalizerRuns=relatedRuns.filter(run=>run.run_purpose==="finalization"||run.agent==="agent-finalizer"||run.agent==="agent-task-finalizer");const finalizedTaskIds=new Set(finalizerRuns.flatMap(run=>run.status==="completed"&&run.task_id!==null?[run.task_id]:[]));return{agent_call_count:relatedRuns.length,orchestrator_run_count:relatedRuns.filter(run=>run.parent_run_id===null).length,subagent_run_count:relatedRuns.filter(run=>run.parent_run_id!==null).length,finalizer_run_count:finalizerRuns.length,finalized_task_count:finalizedTaskIds.size,llm_call_count:knownCalls.reduce((sum,count)=>sum+count,0),llm_call_count_complete:knownCalls.length===relatedRuns.length,task_count:taskIds.size,spec_count:specIds.size,prd_count:prdIds.size,duration_ms:sumObservedDurations(relatedRuns)}}function sumObservedDurations(runs){const observed=runs.flatMap(run=>typeof run.duration_ms==="number"&&run.duration_ms>0?[run.duration_ms]:[]);return observed.length===0?null:observed.reduce((sum,duration3)=>sum+duration3,0)}function recentRunsFirst(runs){return[...runs].sort((left,right)=>right.started_at.localeCompare(left.started_at)||right.id.localeCompare(left.id))}async function countTaskTestArtifacts(filesystem,tasks,changePath){const counts=new Map(tasks.map(task=>[task.id,0]));const tasksByChange=new Map;for(const task of tasks){tasksByChange.set(task.change_id,[...tasksByChange.get(task.change_id)??[],task])}for(const[changeId,relatedTasks]of tasksByChange){const artifactPath=changePath(changeId).replace(/\\/g,"/");const changeDirectory=artifactPath.slice(0,artifactPath.lastIndexOf("/"));let paths;try{paths=await filesystem.listFiles(changeDirectory)}catch{continue}const testPaths=paths.filter(path=>path.replace(/\\/g,"/").includes("/artifacts/tests/")&&/\.(?:md|json|jsonl|txt|log)$/i.test(path));for(const path of testPaths){let content;try{content=await filesystem.readText(path)}catch{continue}for(const task of relatedTasks){if(content.includes(task.id))counts.set(task.id,(counts.get(task.id)??0)+1)}}}return counts}function decisionCounts(decisions){return{human:decisions.filter(decision=>decision.origin==="human").length,agent:decisions.filter(decision=>decision.origin==="agent").length}}function taskProgress(status){if(status==="completed")return 100;if(status==="verifying")return 80;if(status==="executing")return 50;if(["blocked","failed","cancelled"].includes(status))return 0;return 10}function executionWorkStatus(status){if(status==="planned")return"planning";if(["running","paused","verifying"].includes(status))return"executing";return status}function macroWorkStatus(lifecycleStatus,executions){if(lifecycleStatus==="delivered")return"completed";if(lifecycleStatus==="blocked")return"blocked";if(lifecycleStatus==="failed")return"failed";if(lifecycleStatus==="cancelled")return"cancelled";const statuses=executions.flatMap(execution=>execution===void 0?[]:[execution.status]);if(statuses.some(status=>["running","paused"].includes(status))){return"executing"}if(statuses.includes("verifying"))return"verifying";if(statuses.length>0&&statuses.every(status=>status==="completed")){return lifecycleStatus==="active"?"verifying":"completed"}if(lifecycleStatus==="active")return"executing";if(statuses.includes("blocked"))return"blocked";if(statuses.includes("failed"))return"failed";if(statuses.includes("planned")||["draft","ready"].includes(lifecycleStatus)){return"planning"}return"planning"}function taskIdsWithStartedExecution(executions){return new Set(executions.filter(execution=>execution.status!=="planned").flatMap(execution=>execution.dag.nodes.map(node=>node.task_id)))}async function buildLocalOperationsProjection(filesystem,layout,filter={}){if(layout.version===1)throw new Error("Local projections require a modern workspace");const normalized=normalizeFilter(filter);const all=await new ProjectionStore(filesystem).readEntities();if(all.length===0){throw new Error("Projection is not initialized; run zaip projection rebuild --confirm-full-scan")}const entities=all.filter(entity=>within(entity.updated_at,normalized));const byKind=kind=>entities.filter(entity=>entity.kind===kind);const projectedRuns=byKind("run").map(entity=>projectRun(entity,layout));const runThreadIds=projectedRuns.flatMap(run=>typeof run.client_thread_id==="string"?[run.client_thread_id]:[]);const activeThreadIds=await readActiveCodexThreadIds(filesystem.root,runThreadIds);const activeRunIds=latestActiveRunIds(projectedRuns,activeThreadIds);const runs=recentRunsFirst(projectedRuns.map(run=>({...run,is_active:activeRunIds.has(run.id)})));const changes=byKind("change").map(entity=>{const data=entity.data??{};return{...data,id:entity.id,title:entity.title??entity.id,created_at:typeof data.created_at==="string"?data.created_at:null,status:entity.status??"planned",risk:entity.risk??"standard",source:data.source??{type:"task",task_id:entity.relations[0]??entity.id},requirement_ids:data.requirement_ids??[],acceptance_ids:data.acceptance_ids??[],task_ids:data.task_ids??[],result:typeof data.result==="string"?data.result:null,artifact_path:layout.activePath("change",entity.id)}});const executionBases=byKind("execution").map(entity=>{const data=entity.data??{};return{...data,id:entity.id,created_at:typeof data.created_at==="string"?data.created_at:null,status:entity.status??"planned",work_status:executionWorkStatus(entity.status??"planned"),origin:data.origin??{type:"task",task_id:entity.relations[0]??entity.id},dag:data.dag??{nodes:[],topological_order:[]},result:typeof data.result==="string"?data.result:null,artifact_path:layout.activePath("execution",entity.id)}});const taskEntities=byKind("task");const taskTestCounts=await countTaskTestArtifacts(filesystem,taskEntities.map(entity=>({id:entity.id,change_id:taskChangeId(entity)})),changeId=>layout.activePath("change",changeId));const terminalTaskIds=new Set(taskEntities.filter(entity=>["completed","blocked","cancelled","failed"].includes(entity.status??"")).map(entity=>entity.id));const activeTaskIds=new Set(runs.flatMap(run=>run.is_active&&run.task_id!==null&&!terminalTaskIds.has(run.task_id)?[run.task_id]:[]));const startedExecutionTaskIds=taskIdsWithStartedExecution(executionBases);const tasks=taskEntities.map(entity=>({...projectTask(entity,layout,changes,activeTaskIds,startedExecutionTaskIds),test_count:taskTestCounts.get(entity.id)??0}));const specRelationships=byKind("spec").map(entity=>({id:entity.id,prd_id:nullableString(entity.data?.prd_id)??entity.relations.find(relation=>relation.startsWith("PRD-"))??null}));const executionRows=executionBases.map(execution=>({...execution,...executionRelationshipCounts(execution,{runs,tasks,changes,specs:specRelationships})}));const decisions=byKind("decision").map(entity=>{const data=entity.data??{};const scopeType=data.scope_type==="execution"?"execution":"change";const scopeId=String(data.scope_id??entity.relations[0]??"");return{id:entity.id,title:entity.title??entity.id,origin:data.origin==="agent"?"agent":"human",scope_type:scopeType,scope_id:scopeId,artifact_path:`${posix2.dirname(layout.activePath(scopeType,scopeId))}/decisions/${entity.id}.md`,created_at:String(data.created_at??entity.updated_at)}});const prds=byKind("prd").map(entity=>macro(entity,"prd",layout,tasks,runs,decisions,changes,executionRows));const specs=byKind("spec").map(entity=>macro(entity,"spec",layout,tasks,runs,decisions,changes,executionRows));const usage=usageForRuns2(runs);const origins={conversation:usageForRuns2(runs.filter(run=>run.entrypoint==="conversation")),task:usageForRuns2(runs.filter(run=>run.entrypoint==="task")),spec:usageForRuns2(runs.filter(run=>run.entrypoint==="spec")),prd:usageForRuns2(runs.filter(run=>run.entrypoint==="prd"))};const completed=tasks.filter(task=>task.status==="completed").length;const terminal=runs.filter(run=>run.status!=="running");return{schema_version:2,layout_version:layout.version,readonly:true,source:".agents/projections/runtime",filters:normalized,summary:{prd_count:prds.length,spec_count:specs.length,execution_count:executionRows.length,task_count:tasks.length,run_count:runs.length,decisions:decisionCounts(decisions),source_latest_at:entities.map(entity=>entity.updated_at).sort().at(-1)??null,quality:{completed_tasks:completed,task_completion_rate:tasks.length===0?0:completed/tasks.length,terminal_runs:terminal.length,successful_runs:terminal.filter(run=>run.status==="completed").length,terminal_success_rate:terminal.length===0?0:terminal.filter(run=>run.status==="completed").length/terminal.length,rework_rate:runs.length===0?0:runs.filter(run=>run.work_type==="rework").length/runs.length},reconciliation:{phase_tokens_match_total:true,phase_usd_match_total:true,phase_brl_match_total:true,origin_tokens_match_total:true},usage},origins,prds,specs,tasks,changes,executions:executionRows,runs,decisions}}function projectTask(entity,layout,changes,activeTaskIds,startedExecutionTaskIds){const data=entity.data??{};const changeId=String(data.change_id??entity.relations.find(id=>id.startsWith("CHG-"))??"");const change=changes.find(candidate=>candidate.id===changeId);const specIdFromChange=change?.source.type==="spec"||change?.source.type==="prd"?change.source.spec_id:null;return{...data,schema_version:2,id:entity.id,revision:Number(data.revision??1),change_id:changeId,title:entity.title??entity.id,short_name:String(data.short_name??entity.id),objective:String(data.objective??entity.title??entity.id),status:entity.status??"planned",attempt_count:typeof data.attempt_count==="number"&&Number.isInteger(data.attempt_count)?data.attempt_count:null,risk:entity.risk??"standard",priority:entity.priority??"medium",owner:typeof data.owner==="string"?data.owner:null,requirement_ids:data.requirement_ids??[],acceptance_ids:data.acceptance_ids??[],depends_on:data.depends_on??[],write_scopes:data.write_scopes??[],created_at:String(data.created_at??entity.updated_at),updated_at:entity.updated_at,started_at:typeof data.started_at==="string"?data.started_at:null,finished_at:typeof data.finished_at==="string"?data.finished_at:null,result:data.result??null,artifact_path:layout.activePath("task",entity.id),progress:taskProgress(entity.status??"planned"),spec_id:entity.relations.find(id=>id.startsWith("SPEC-"))??specIdFromChange??null,execution_started:startedExecutionTaskIds.has(entity.id),is_active:activeTaskIds.has(entity.id)}}function taskChangeId(entity){return String(entity.data?.change_id??entity.relations.find(id=>id.startsWith("CHG-"))??"")}function projectRun(entity,layout){const data=entity.data??{};const started=String(data.started_at??entity.updated_at);const finished=typeof data.finished_at==="string"?data.finished_at:null;const segments=pricingSegments(data.pricing_segments);return{id:entity.id,artifact_path:layout.activePath("run",entity.id),status:entity.status??"running",phase:String(data.phase??"execution"),entrypoint:data.entrypoint??"task",work_type:data.work_type??"new",run_role:runRole(data.run_role),run_kind:data.run_kind==="subrun"?"subrun":nullableString(data.parent_run_id)===null?"run":"subrun",run_purpose:runPurpose(data.run_purpose,String(data.agent??"unknown"),nullableString(data.parent_run_id)),requires_finalizer:data.requires_finalizer===true,parent_run_id:nullableString(data.parent_run_id),client:String(data.client??"unknown"),agent:String(data.agent??"unknown"),agent_name:canonicalAgentName(String(data.agent??"unknown"),String(data.agent_name??data.agent??"unknown")),provider:typeof data.provider==="string"?data.provider:null,model:String(data.model??"unknown"),reasoning_effort:typeof data.reasoning_effort==="string"?data.reasoning_effort:null,effective_model:nullableString(data.effective_model),effective_reasoning_effort:nullableString(data.effective_reasoning_effort),effective_config_mixed:data.effective_config_mixed===true,service_tier:typeof data.service_tier==="string"?data.service_tier:null,call_count:nullableNumber(data.call_count),terminal_call_count:nullableNumber(data.terminal_call_count),failed_call_count:nullableNumber(data.failed_call_count),cancelled_call_count:nullableNumber(data.cancelled_call_count),conversation_id:String(data.conversation_id??"unknown"),client_thread_id:nullableString(data.client_thread_id),client_turn_id:nullableString(data.client_turn_id),is_active:false,execution_id:nullableString(data.execution_id),task_id:nullableString(data.task_id),spec_id:nullableString(data.spec_id),prd_id:nullableString(data.prd_id),change_id:nullableString(data.change_id),started_at:started,finished_at:finished,duration_ms:finished===null?null:Math.max(0,Date.parse(finished)-Date.parse(started)),...segments===void 0?{}:{pricing_segments:segments},usage:usageFromEntity(entity)}}function runRole(value){if(value==="owner")return"orchestrator";if(value==="contributor")return"subagent";return value==="orchestrator"||value==="subagent"||value==="intake"?value:"intake"}function runPurpose(value,agent,parentRunId){if(value==="intake"||value==="orchestration"||value==="execution"||value==="review"||value==="audit"||value==="finalization"){return value}if(agent==="agent-finalizer"||agent==="agent-task-finalizer"){return"finalization"}if(agent==="agent-reviewer")return"review";if(agent==="agent-auditor")return"audit";return parentRunId===null?"orchestration":"execution"}function canonicalAgentName(agent,agentName){if(agent==="codex")return"codex";return agentName.startsWith("agent-")?`zaip-agent-${agentName.slice("agent-".length)}`:agentName}function nullableNumber(value){return typeof value==="number"&&Number.isFinite(value)?value:null}function pricingSegments(value){if(!Array.isArray(value))return void 0;return value.flatMap(item=>{if(typeof item!=="object"||item===null)return[];const row=item;if(row.phase!=="conversation"&&row.phase!=="planning"&&row.phase!=="execution"){return[]}const nullableNumber2=entry=>typeof entry==="number"?entry:null;return[{phase:row.phase,provider:typeof row.provider==="string"?row.provider:null,model:typeof row.model==="string"?row.model:null,service_tier:typeof row.service_tier==="string"?row.service_tier:null,input_tokens:nullableNumber2(row.input_tokens),cached_input_tokens:nullableNumber2(row.cached_input_tokens),output_tokens:nullableNumber2(row.output_tokens),reasoning_tokens:nullableNumber2(row.reasoning_tokens),total_tokens:nullableNumber2(row.total_tokens),recorded_usd:nullableNumber2(row.recorded_usd),recorded_brl:nullableNumber2(row.recorded_brl),recorded_fx_rate:nullableNumber2(row.recorded_fx_rate)}]})}function macro(entity,kind,layout,tasks,runs,decisions,changes,executions){const creationRunId=nullableString(entity.data?.creation_run_id);const directlyRelatedRuns=runs.filter(run=>run.prd_id===entity.id||run.spec_id===entity.id||run.id===creationRunId);const directChanges=changes.filter(change=>kind==="spec"&&(change.source.type==="spec"||change.source.type==="prd")&&change.source.spec_id===entity.id||kind==="prd"&&change.source.type==="prd"&&change.source.prd_id===entity.id);const executionIds=new Set(kind==="prd"?entity.relations.filter(id=>id.startsWith("EXEC-")):[]);for(const run of directlyRelatedRuns){if(run.execution_id!==null)executionIds.add(run.execution_id)}const taskIds=new Set(entity.relations.filter(id=>id.startsWith("TASK-")));for(const run of directlyRelatedRuns){if(run.task_id!==null)taskIds.add(run.task_id)}for(const change of directChanges){for(const taskId of change.task_ids)taskIds.add(taskId)}for(const task of tasks){if(task.spec_id===entity.id)taskIds.add(task.id)}const relatedExecutions=executions.filter(execution=>executionIds.has(execution.id)||kind==="spec"&&(execution.origin.type==="spec"&&execution.origin.spec_id===entity.id||execution.dag.nodes.some(node=>taskIds.has(node.task_id)))||kind==="prd"&&execution.origin.type==="prd"&&execution.origin.prd_id===entity.id);for(const execution of relatedExecutions){executionIds.add(execution.id);if(kind==="prd"){for(const node of execution.dag.nodes)taskIds.add(node.task_id)}}const relatedTasks=tasks.filter(task=>taskIds.has(task.id)||task.spec_id===entity.id);for(const task of relatedTasks)taskIds.add(task.id);const relatedRuns=runs.filter(run=>{const directlyLinked=run.spec_id===entity.id||run.id===creationRunId||run.task_id!==null&&taskIds.has(run.task_id);if(kind==="spec")return directlyLinked;return directlyLinked||run.prd_id===entity.id||run.execution_id!==null&&executionIds.has(run.execution_id)});const relatedOwnerIds=new Set([entity.id,...relatedTasks.map(task=>task.change_id),...relatedRuns.flatMap(run=>[run.change_id,run.execution_id]).filter(id=>id!==null)]);const relatedDecisions=decisions.filter(decision=>relatedOwnerIds.has(decision.scope_id));return{id:entity.id,title:entity.title??entity.id,created_at:typeof entity.data?.created_at==="string"?entity.data.created_at:null,kind,parent_id:entity.relations.find(id=>id.startsWith("PRD-"))??null,artifact_path:layout.activePath(kind,entity.id),lifecycle_status:entity.status??"draft",work_status:macroWorkStatus(entity.status??"draft",relatedExecutions),is_active:relatedRuns.some(run=>run.is_active),execution_ids:[...executionIds],task_ids:relatedTasks.map(task=>task.id),run_ids:relatedRuns.map(run=>run.id),execution_count:executionIds.size,task_count:relatedTasks.length,run_count:relatedRuns.length,duration_ms:sumObserved(relatedRuns.map(run=>run.duration_ms)),decisions:decisionCounts(relatedDecisions),rework_run_count:relatedRuns.filter(run=>run.work_type==="rework").length,quality:{completed_tasks:relatedTasks.filter(task=>task.status==="completed").length,task_completion_rate:relatedTasks.length===0?0:relatedTasks.filter(task=>task.status==="completed").length/relatedTasks.length,terminal_runs:relatedRuns.filter(run=>run.status!=="running").length,successful_runs:relatedRuns.filter(run=>run.status==="completed").length,terminal_success_rate:0,rework_rate:relatedRuns.length===0?0:relatedRuns.filter(run=>run.work_type==="rework").length/relatedRuns.length},usage:usageForRuns2(relatedRuns)}}async function readActiveCodexThreadIds(workspaceRoot,threadIds){if(threadIds.length===0)return new Set;try{const invocations=await listActiveCodexInvocations(workspaceRoot,{threadIds});return new Set(invocations.map(invocation=>invocation.sessionId))}catch{return new Set}}function latestActiveRunIds(runs,activeThreadIds){const latestByThread=new Map;for(const run of runs){if(run.status!=="running"||typeof run.client_thread_id!=="string"||!activeThreadIds.has(run.client_thread_id)){continue}const current=latestByThread.get(run.client_thread_id);if(current===void 0||run.started_at>current.started_at){latestByThread.set(run.client_thread_id,run)}}return new Set([...latestByThread.values()].map(run=>run.id))}function sumObserved(values){const observed=values.filter(value=>value!==null);return observed.length===0?null:observed.reduce((total,value)=>total+value,0)}function usageFromEntity(entity){const aggregate=entity.data?.entrypoint_usage;if(typeof aggregate==="object"&&aggregate!==null){const buckets=aggregate;const total=metricFromBucket(buckets.total);const empty2=emptyMetric();const isRework=entity.data?.work_type==="rework";return{conversation:metricFromBucket(buckets.conversation),planning:metricFromBucket(buckets.planning),execution:metricFromBucket(buckets.execution),total,new_work:isRework?empty2:total,rework:isRework?total:empty2}}const metric=metricFromEntity(entity);const empty=emptyMetric();const phase=String(entity.data?.phase??"execution");return{conversation:phase==="conversation"?metric:empty,planning:phase==="planning"?metric:empty,execution:phase==="execution"?metric:empty,total:metric,new_work:entity.data?.work_type==="rework"?empty:metric,rework:entity.data?.work_type==="rework"?metric:empty}}function metricFromBucket(value){if(typeof value!=="object"||value===null)return emptyMetric();const bucket=value;const tokens=bucket.tokens??{};const cost=bucket.cost??{};const coverage=bucket.coverage??{};return{events:Number(bucket.usage_event_count??coverage.events??0),tokens:{input:tokens.input??null,cached_input:tokens.cached_input??null,output:tokens.output??null,reasoning:tokens.reasoning??null,total:tokens.total??null},cost:{usd:cost.usd??null,brl:cost.brl??null},coverage:{events:Number(coverage.events??0),tokens:Number(coverage.tokens??0),usd:Number(coverage.usd??0),brl:Number(coverage.brl??0)}}}function usageForRuns2(runs){const keys=["conversation","planning","execution","total","new_work","rework"];return Object.fromEntries(keys.map(key=>[key,sumMetrics2(runs.map(run=>run.usage[key]))]))}function metricFromEntity(entity){const usage=entity.usage;return{events:usage===null?0:1,tokens:{input:usage?.input_tokens??null,cached_input:usage?.cached_input_tokens??null,output:usage?.output_tokens??null,reasoning:null,total:usage?.total_tokens??null},cost:{usd:usage?.currency==="USD"?usage.cost:null,brl:usage?.currency==="BRL"?usage.cost:null},coverage:{events:usage===null?0:1,tokens:usage?.total_tokens===null||usage===null?0:1,usd:usage?.currency==="USD"&&usage.cost!==null?1:0,brl:usage?.currency==="BRL"&&usage.cost!==null?1:0}}}function emptyMetric(){return{events:0,tokens:{input:null,cached_input:null,output:null,reasoning:null,total:null},cost:{usd:null,brl:null},coverage:{events:0,tokens:0,usd:0,brl:0}}}function sumMetrics2(metrics){const sum=values=>{const known=values.filter(value=>value!==null);return known.length===0?null:known.reduce((total,value)=>total+value,0)};return{events:metrics.reduce((total,metric)=>total+metric.events,0),tokens:{input:sum(metrics.map(metric=>metric.tokens.input)),cached_input:sum(metrics.map(metric=>metric.tokens.cached_input)),output:sum(metrics.map(metric=>metric.tokens.output)),reasoning:sum(metrics.map(metric=>metric.tokens.reasoning)),total:sum(metrics.map(metric=>metric.tokens.total))},cost:{usd:sum(metrics.map(metric=>metric.cost.usd)),brl:sum(metrics.map(metric=>metric.cost.brl))},coverage:{events:metrics.reduce((total,metric)=>total+metric.coverage.events,0),tokens:metrics.reduce((total,metric)=>total+metric.coverage.tokens,0),usd:metrics.reduce((total,metric)=>total+metric.coverage.usd,0),brl:metrics.reduce((total,metric)=>total+metric.coverage.brl,0)}}}function nullableString(value){return typeof value==="string"?value:null}function within(timestamp8,filter){return(filter.from===null||timestamp8>=filter.from)&&(filter.to===null||timestamp8<=filter.to)}var timestamp2=external_exports.string().datetime({offset:true}).or(external_exports.string().datetime());var decisionV2IdSchema=external_exports.string().regex(/^DEC-(?:HUMAN|AI)-/);var decisionV2CategorySchema=external_exports.enum(["architecture","contract","database","security","dependency","network","infrastructure","cost","implementation","rollback"]);var decisionV2Schema=external_exports.object({schema_version:external_exports.literal(2),id:decisionV2IdSchema,title:external_exports.string().min(1),scope_type:external_exports.enum(["change","execution"]),scope_id:external_exports.string().min(1),origin:external_exports.enum(["human","agent"]),category:decisionV2CategorySchema,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().min(1)),consequences:external_exports.array(external_exports.string().min(1)),reversible:external_exports.boolean(),rollback:external_exports.string().min(1),confidence:external_exports.number().min(0).max(1).nullable(),created_at:timestamp2,confirmed_at:timestamp2.nullable()}).strict().superRefine((record2,context)=>{const expectedScopePrefix=record2.scope_type==="change"?"CHG-":"EXEC-";if(!record2.scope_id.startsWith(expectedScopePrefix)){context.addIssue({code:"custom",path:["scope_id"],message:`${record2.scope_type} decision requires ${expectedScopePrefix} scope_id`})}const expectedDecisionPrefix=record2.origin==="human"?"DEC-HUMAN-":"DEC-AI-";if(!record2.id.startsWith(expectedDecisionPrefix)){context.addIssue({code:"custom",path:["id"],message:`${record2.origin} decision requires ${expectedDecisionPrefix} id`})}if(record2.origin==="human"&&record2.confidence!==null){context.addIssue({code:"custom",path:["confidence"],message:"Human decisions do not use agent confidence"})}if(record2.origin==="agent"&&record2.confidence===null){context.addIssue({code:"custom",path:["confidence"],message:"Agent decisions require confidence"})}if(record2.origin==="human"&&record2.confirmed_at===null){context.addIssue({code:"custom",path:["confirmed_at"],message:"Human decisions require explicit confirmation provenance"})}});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 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]);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 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 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"})}});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();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((values,context)=>{const seen=new Set;for(const[index,value]of values.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"}import{createHash}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 finding of validatePreparedPlanV2(plan)){context.addIssue({code:"custom",path:[...finding.path],message:finding.message})}});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 result=new Map;const visit=(taskId,seen)=>{const cached2=result.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)}}result.set(taskId,dependencies);return dependencies};for(const taskId of direct.keys())visit(taskId,new Set);return result}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(values,rule,path,findings){const seen=new Set;for(const value of values){if(seen.has(value))findings.push({rule,path,message:`Duplicate value: ${value}`});seen.add(value)}}function addDuplicateIssues(values,field,context){const seen=new Set;for(const value of values){if(seen.has(value)){context.addIssue({code:"custom",path:[field],message:`Duplicate value: ${value}`})}seen.add(value)}}function hashCanonicalValue(value){return createHash("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 createHash2}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)}
104
+ `);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 digest=createHash2("sha256").update(clientTurnId).digest("hex");return`${this.layout.entityRoot("execution")}/.client-turn-claims/${digest}.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 byId=new Map(specs.map(spec=>[spec.id,spec]));for(const specId of specIds){const spec=byId.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,result=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??result??`Change moved to ${status}.`:null,updated_at:now,started_at:status==="executing"&&current.change.started_at===null?now:current.change.started_at,finished_at:terminal?now:null,result:terminal?result: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,result=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??result??`Execution moved to ${status}.`:null,updated_at:now,started_at:status==="running"&&current.execution.started_at===null?now:current.execution.started_at,finished_at:terminal?now:null,result:terminal?result: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}
105
105
 
106
106
  ## Plano
107
107
 
@@ -141,7 +141,7 @@ Estado atual: ${execution.status}.
141
141
 
142
142
  ## Resultado
143
143
 
144
- ${execution.result??execution.status_reason??"Ainda n\xE3o conclu\xEDda."}`}var PRD_TRANSITIONS={draft:["ready","blocked","failed","cancelled"],ready:["active","blocked","failed","cancelled"],active:["delivered","blocked","failed","cancelled"],blocked:["active","failed","cancelled"],delivered:[],failed:[],cancelled:[]};var CHANGE_TRANSITIONS={draft:["planned","cancelled"],planned:["executing","blocked","failed","cancelled"],executing:["verifying","failed","blocked","cancelled"],verifying:["completed","failed","blocked","cancelled"],blocked:["executing","cancelled"],completed:[],failed:["executing"],cancelled:[]};var EXECUTION_TRANSITIONS={planned:["running","blocked","failed","cancelled"],running:["paused","verifying","failed","blocked","cancelled"],paused:["running","cancelled"],verifying:["completed","failed","blocked","cancelled"],blocked:["running","cancelled"],completed:[],failed:["running"],cancelled:[]};function prdBody(prd){return`# ${prd.title}
144
+ ${execution.result??execution.status_reason??"Ainda n\xE3o conclu\xEDda."}`}var PRD_TRANSITIONS={draft:["ready","blocked","failed","cancelled"],ready:["active","blocked","failed","cancelled"],active:["delivered","blocked","failed","cancelled"],blocked:["active","failed","cancelled"],delivered:[],failed:[],cancelled:[]};var SPEC_TRANSITIONS={draft:["ready","blocked","failed","cancelled"],ready:["active","blocked","failed","cancelled"],active:["delivered","blocked","failed","cancelled"],blocked:["active","failed","cancelled"],delivered:[],failed:[],cancelled:[]};var CHANGE_TRANSITIONS={draft:["planned","cancelled"],planned:["executing","blocked","failed","cancelled"],executing:["verifying","failed","blocked","cancelled"],verifying:["completed","failed","blocked","cancelled"],blocked:["executing","cancelled"],completed:[],failed:["executing"],cancelled:[]};var EXECUTION_TRANSITIONS={planned:["running","blocked","failed","cancelled"],running:["paused","verifying","failed","blocked","cancelled"],paused:["running","cancelled"],verifying:["completed","failed","blocked","cancelled"],blocked:["running","cancelled"],completed:[],failed:["running"],cancelled:[]};function prdBody(prd){return`# ${prd.title}
145
145
 
146
146
  ## Problema
147
147
 
@@ -157,7 +157,27 @@ ${listOrNone(prd.constraints)}
157
157
 
158
158
  ## Fora de escopo
159
159
 
160
- ${listOrNone(prd.non_goals)}`}function listOrNone(values){return values.length===0?"Nenhum.":values.map(value=>`- ${value}`).join("\n")}async function listV2Metadata(filesystem,root,suffix,schema){const paths=await filesystem.listFiles(root,suffix);return Promise.all(paths.map(async path=>parseMarkdown(await filesystem.readText(path),schema).metadata))}function assertStatusTransition(transitions,current,next,entity){if(!transitions[current].includes(next)){throw new Error(`Invalid ${entity} transition: ${current} -> ${next}`)}}function assertV2Layout(layout){if(layout.version===1)throw new TypeError("V2 repositories require a modern WorkspaceLayout")}async function requiredReadPath(filesystem,layout,kind,id){const path=await resolveArtifactReadPath(filesystem,layout,kind,id);if(path===null)throw new Error(`${kind} not found: ${id}`);return path}function createV2Id(prefix,shortName,clock,timeZone){const parts=new Intl.DateTimeFormat("en-CA",{timeZone,year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",hourCycle:"h23"}).formatToParts(clock.now());const part=type=>{const value=parts.find(candidate=>candidate.type===type)?.value;if(value===void 0)throw new Error(`Unable to format ID date part: ${type}`);return value};return[prefix,part("year"),part("month"),part("day"),part("hour"),part("minute"),normalizeShortName(shortName),createCollisionCode()].join("-")}var RISK_PROFILES=["lite","standard","critical"];var timestamp5=external_exports.string().datetime({offset:true});var legacyCapabilitySpecSchema=external_exports.object({id:external_exports.string().startsWith("SPEC-"),capability:external_exports.string().min(1),title:external_exports.string().min(1),status:external_exports.enum(["active","deprecated"]).default("active"),version:external_exports.number().int().positive().default(1),updated_at:timestamp5}).strict();var changeSchema=external_exports.object({id:external_exports.string().startsWith("CHG-"),title:external_exports.string().min(1),status:external_exports.enum(["draft","planned","executing","verifying","completed","failed","blocked","cancelled"]),risk:external_exports.enum(RISK_PROFILES),capabilities:external_exports.array(external_exports.string().startsWith("SPEC-")),requirements:external_exports.array(external_exports.string().startsWith("REQ-")),tasks:external_exports.array(external_exports.string().startsWith("TASK-")),human_decisions:external_exports.array(external_exports.string().startsWith("DEC-HUMAN-")),agent_decisions:external_exports.array(external_exports.string().startsWith("DEC-AI-")),created_at:timestamp5,updated_at:timestamp5,completed_at:timestamp5.nullable().default(null)}).strict();var SDC_PHASES=["validate","develop","review","fix","verify","close"];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();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"&&current.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,result=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??result?.summary??`Task moved to ${status}.`:null,updated_at:now,started_at:status==="executing"&&current.task.started_at===null?now:current.task.started_at,finished_at:terminal?now:null,result:terminal?result:null});await this.write(next);return next}path(id){return this.layout.activePath("task",id)}};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 result=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}
160
+ ${listOrNone(prd.non_goals)}`}function deliverySpecBody(spec){const implementation=spec.implementation;const stack=implementation===null?"N\xE3o resolvida. Consulte `stack.profile` e `stack.overrides` em `.agents/config/project.yaml` antes de preparar esta SPEC.":`Profile: ${implementation.stack_profile}
161
+
162
+ ${implementation.stack_description}
163
+
164
+ ${implementation.stack_components.map(component=>`- ${component.kind}: ${component.name} ${component.version} (${component.version_source})`).join("\n")}`;return`# ${spec.title}
165
+
166
+ ## Objetivo
167
+
168
+ ${spec.objective}
169
+
170
+ ## Escopo
171
+
172
+ ${listOrNone(spec.included_scope)}
173
+
174
+ ## Fora de escopo
175
+
176
+ ${listOrNone(spec.excluded_scope)}
177
+
178
+ ## Stack de implementa\xE7\xE3o
179
+
180
+ ${stack}`}function listOrNone(values){return values.length===0?"Nenhum.":values.map(value=>`- ${value}`).join("\n")}async function listV2Metadata(filesystem,root,suffix,schema){const paths=await filesystem.listFiles(root,suffix);return Promise.all(paths.map(async path=>parseMarkdown(await filesystem.readText(path),schema).metadata))}function assertStatusTransition(transitions,current,next,entity){if(!transitions[current].includes(next)){throw new Error(`Invalid ${entity} transition: ${current} -> ${next}`)}}function assertV2Layout(layout){if(layout.version===1)throw new TypeError("V2 repositories require a modern WorkspaceLayout")}async function requiredReadPath(filesystem,layout,kind,id){const path=await resolveArtifactReadPath(filesystem,layout,kind,id);if(path===null)throw new Error(`${kind} not found: ${id}`);return path}function createV2Id(prefix,shortName,clock,timeZone){const parts=new Intl.DateTimeFormat("en-CA",{timeZone,year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",hourCycle:"h23"}).formatToParts(clock.now());const part=type=>{const value=parts.find(candidate=>candidate.type===type)?.value;if(value===void 0)throw new Error(`Unable to format ID date part: ${type}`);return value};return[prefix,part("year"),part("month"),part("day"),part("hour"),part("minute"),normalizeShortName(shortName),createCollisionCode()].join("-")}var RISK_PROFILES=["lite","standard","critical"];var timestamp5=external_exports.string().datetime({offset:true});var legacyCapabilitySpecSchema=external_exports.object({id:external_exports.string().startsWith("SPEC-"),capability:external_exports.string().min(1),title:external_exports.string().min(1),status:external_exports.enum(["active","deprecated"]).default("active"),version:external_exports.number().int().positive().default(1),updated_at:timestamp5}).strict();var changeSchema=external_exports.object({id:external_exports.string().startsWith("CHG-"),title:external_exports.string().min(1),status:external_exports.enum(["draft","planned","executing","verifying","completed","failed","blocked","cancelled"]),risk:external_exports.enum(RISK_PROFILES),capabilities:external_exports.array(external_exports.string().startsWith("SPEC-")),requirements:external_exports.array(external_exports.string().startsWith("REQ-")),tasks:external_exports.array(external_exports.string().startsWith("TASK-")),human_decisions:external_exports.array(external_exports.string().startsWith("DEC-HUMAN-")),agent_decisions:external_exports.array(external_exports.string().startsWith("DEC-AI-")),created_at:timestamp5,updated_at:timestamp5,completed_at:timestamp5.nullable().default(null)}).strict();var SDC_PHASES=["validate","develop","review","fix","verify","close"];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();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"&&current.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,result=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??result?.summary??`Task moved to ${status}.`:null,updated_at:now,started_at:status==="executing"&&current.task.started_at===null?now:current.task.started_at,finished_at:terminal?now:null,result:terminal?result:null});await this.write(next);return next}path(id){return this.layout.activePath("task",id)}};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 result=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}
161
181
 
162
182
  ## Objetivo
163
183
 
@@ -173,7 +193,7 @@ ${evidence}
173
193
 
174
194
  ## Resultado
175
195
 
176
- ${result}`}function sameValues(left,right){return JSON.stringify(left)===JSON.stringify(right)}function addDuplicateIssues2(values,field,context){const seen=new Set;for(const value of values){if(seen.has(value)){context.addIssue({code:"custom",path:[field],message:`Duplicate value: ${value}`})}seen.add(value)}}var timestamp7=external_exports.string().datetime({offset:true});var taskSchema=external_exports.object({id:external_exports.string().startsWith("TASK-"),title:external_exports.string().min(1),short_name:external_exports.string().min(1),status:external_exports.enum(["draft","planned","executing","verifying","completed","failed","blocked","cancelled"]),risk:external_exports.enum(["lite","standard","critical"]),priority:external_exports.enum(["low","medium","high","urgent"]),owner:external_exports.string().min(1).nullable().default(null),progress:external_exports.number().int().min(0).max(100),spec:external_exports.string().startsWith("SPEC-"),change:external_exports.string().startsWith("CHG-"),requirements:external_exports.array(external_exports.string().startsWith("REQ-")),depends_on:external_exports.array(external_exports.string().startsWith("TASK-")),human_decisions:external_exports.array(external_exports.string().startsWith("DEC-HUMAN-")),agent_decisions:external_exports.array(external_exports.string().startsWith("DEC-AI-")),created_at:timestamp7,started_at:timestamp7.nullable(),finished_at:timestamp7.nullable()}).strict();async function readTaskDetail(filesystem,layout,taskId){if(layout.version!==2)throw new Error("Task detail requires WorkspaceLayout V2");const tasks=new TaskV2Repository(filesystem,layout);const changes=new ChangeV2Repository(filesystem,layout);const executions=new ExecutionV2Repository(filesystem,layout);const{task,body}=await tasks.read(taskId);const{change}=await changes.read(task.change_id);const specId=change.source.type==="spec"?change.source.spec_id:change.source.type==="prd"?change.source.spec_id:null;const testCounts=await countTaskTestArtifacts(filesystem,[task],changeId=>changes.path(changeId));const startedExecutionTaskIds=taskIdsWithStartedExecution(await executions.list());return{task:{...task,attempt_count:task.attempt_count??null,artifact_path:tasks.path(task.id),progress:taskProgress(task.status),spec_id:specId,execution_started:startedExecutionTaskIds.has(task.id),test_count:testCounts.get(task.id)??0},body,artifact_path:tasks.path(task.id)}}async function readPrdDetail(filesystem,layout,prdId){if(layout.version===1)throw new Error("PRD detail requires a modern WorkspaceLayout");const prds=new PrdV2Repository(filesystem,layout);const{prd,body}=await prds.read(prdId);return{id:prd.id,title:prd.title,body,artifact_path:prds.path(prd.id)}}import{createHash as createHash3}from"node:crypto";var MAX_DOCUMENT_BYTES=25e4;async function buildTaskTrace(filesystem,layout,taskId){if(layout.version===1)throw new Error("Task trace requires a modern WorkspaceLayout");const entities=await new ProjectionStore(filesystem).readEntities();const task=entities.find(entity=>entity.kind==="task"&&entity.id===taskId);if(task===void 0)throw new Error(`Task ${taskId} was not found in the runtime projection`);const changeId=stringData(task,"change_id")??relatedId(task,"CHG-")??task.id;const change=entities.find(entity=>entity.kind==="change"&&entity.id===changeId);const specId=sourceId(change,"spec_id")??relatedId(task,"SPEC-")??relatedId(change,"SPEC-");const prdId=sourceId(change,"prd_id")??relatedId(task,"PRD-")??relatedId(change,"PRD-");const lifecycleMarkers=new Set([task.id,changeId]);if(specId!==null)lifecycleMarkers.add(specId);if(prdId!==null)lifecycleMarkers.add(prdId);const requirementMarkers=new Set([...task.relations,...change?.relations??[]].filter(relation=>/^(?:REQ|AC)-/.test(relation)));const related=entities.filter(entity=>isLifecycleRelated(entity,lifecycleMarkers));const taskRuns=related.filter(entity=>entity.kind==="run"&&stringData(entity,"task_id")===task.id);const paths=new Set;for(const entity of related){if(entity.kind!=="decision")paths.add(layout.activePath(entity.kind,entity.id))}paths.add(layout.activePath("task",task.id));if(changeId.startsWith("CHG-"))paths.add(layout.activePath("change",changeId));if(specId!==null)paths.add(layout.activePath("spec",specId));if(prdId!==null)paths.add(layout.activePath("prd",prdId));const expandedPaths=new Set(paths);for(const path of paths){if(path.includes("/changes/")||path.includes("/executions/")){for(const child of await filesystem.listFiles(path.slice(0,path.lastIndexOf("/")))){expandedPaths.add(child)}}}for(const requirementsRoot of[".agents/requirements",".agents/records/requirements"]){try{for(const path of await filesystem.listFiles(requirementsRoot))expandedPaths.add(path)}catch{}}const documents=[];const taskFinishedAt=stringData(task,"finished_at");for(const path of expandedPaths){if(!/\.(?:md|json|jsonl|txt|log)$/i.test(path)||!await filesystem.exists(path))continue;const content=await filesystem.readText(path);if(content.length>MAX_DOCUMENT_BYTES)continue;const isRequirement=path.includes("/requirements/");const isRelated=!isRequirement||[...requirementMarkers].some(marker=>content.includes(marker));if(!isRelated)continue;const classification=classifyTraceDocument(path);const extractedTimestamps=timestampsFromContent(content);const isTaskSpecificArtifact=(classification.kind==="evidence"||classification.kind==="test"||classification.kind==="eval"||classification.kind==="check")&&content.includes(task.id);if((classification.kind==="evidence"||classification.kind==="test"||classification.kind==="eval"||classification.kind==="check")&&!isTaskSpecificArtifact){continue}const document={id:createHash3("sha256").update(path).digest("hex").slice(0,16),path,title:titleFrom(path,content),...classification,content,recorded_at:extractedTimestamps.recorded_at??(isTaskSpecificArtifact?taskFinishedAt:null),updated_at:extractedTimestamps.updated_at??(isTaskSpecificArtifact?taskFinishedAt:null)};documents.push(document);const inlineDecision=inlineDecisionDocument(document);if(inlineDecision!==null)documents.push(inlineDecision);const inlineVerification=inlineVerificationDocument(document,task.id);if(inlineVerification!==null)documents.push(inlineVerification)}for(const reference of evidenceReferenceDocuments(task,documents))documents.push(reference);documents.sort((left,right)=>stageOrder[left.stage]-stageOrder[right.stage]||left.path.localeCompare(right.path));const coveredStages=new Set(documents.map(document=>document.stage));const stages=buildTraceStageRecords(documents);return{schema_version:2,layout_version:layout.version,readonly:true,source:".agents/records",task_id:task.id,task_title:task.title??task.id,task_risk:task.risk==="lite"||task.risk==="standard"||task.risk==="critical"?task.risk:null,task_created_at:stringData(task,"created_at"),task_progress:progressFromStatus(task.status),spec_id:specId,prd_id:prdId,change_id:changeId,usage:buildTraceUsage(taskRuns),documents,stages,coverage:{stages_with_documents:coveredStages.size,stages_with_timestamps:stages.filter(stage=>stage.status==="recorded").length,total_stages:6,evidence_count:documents.filter(document=>document.kind==="evidence").length,test_count:documents.filter(document=>document.kind==="test").length}}}function buildTraceUsage(runs,nowMs=Date.now()){const durationValues=runs.map(run=>isRootExecutionRun(run)?runDurationMs(run,nowMs):null);const tokenValues=runs.map(run=>run.usage?.total_tokens??null);const costValues=runs.map(run=>run.usage?.cost??null);const currencies=new Set(runs.map(run=>run.usage?.currency).filter(currency2=>currency2==="BRL"||currency2==="USD"));const currency=currencies.size===1?[...currencies][0]??null:null;return{run_count:runs.length,duration_ms:observedMetric(durationValues),total_tokens:observedMetric(tokenValues),cost:currencies.size<=1?{...observedMetric(costValues),currency}:{...observedMetric(runs.map(()=>null)),currency:null}}}function isRootExecutionRun(run){return stringData(run,"phase")==="execution"&&stringData(run,"parent_run_id")===null}function observedMetric(values){const known=values.filter(value=>value!==null);return{value:known.length===0?null:known.reduce((sum,value)=>sum+value,0),known_runs:known.length,unknown_runs:values.length-known.length,coverage_ratio:values.length===0?1:known.length/values.length}}function runDurationMs(run,nowMs){const startedAt=stringData(run,"started_at");const finishedAt=stringData(run,"finished_at");if(startedAt===null)return null;const startedAtMs=Date.parse(startedAt);const finishedAtMs=finishedAt===null?null:Date.parse(finishedAt);const duration3=finishedAtMs===null&&run.status==="running"?nowMs-startedAtMs:(finishedAtMs??Number.NaN)-startedAtMs;return Number.isFinite(duration3)?Math.max(0,duration3):null}function buildTraceStageRecords(documents){return Object.keys(stageOrder).map(stage=>{const stageDocuments=documents.filter(document=>document.stage===stage);const timestamps=stageDocuments.flatMap(document=>[document.recorded_at,document.updated_at]).filter(value=>value!==null).sort(compareTimestamps);return{stage,status:stageDocuments.length===0?"pending":timestamps.length===0?"missing_timestamp":"recorded",first_recorded_at:timestamps.at(0)??null,last_recorded_at:timestamps.at(-1)??null,document_count:stageDocuments.length,test_count:stageDocuments.filter(document=>document.kind==="test").length}})}function isLifecycleRelated(entity,lifecycleMarkers){return lifecycleMarkers.has(entity.id)||entity.relations.some(relation=>lifecycleMarkers.has(relation))}function progressFromStatus(status){if(status==="completed")return 100;if(status==="verifying")return 80;if(status==="executing")return 50;if(status==="blocked"||status==="failed"||status==="cancelled")return 0;return 10}function stringData(entity,key){const value=entity.data?.[key];return typeof value==="string"&&value.length>0?value:null}function relatedId(entity,prefix){return entity?.relations.find(relation=>relation.startsWith(prefix))??null}function sourceId(entity,key){const source=entity?.data?.source;if(typeof source!=="object"||source===null)return null;const value=source[key];return typeof value==="string"&&value.length>0?value:null}var stageOrder={definition:0,planning:1,execution:2,decisions:3,verification:4,evidence:5};function classifyTraceDocument(path){if(path.includes("/prds/"))return{stage:"definition",kind:"prd"};if(path.includes("/requirements/"))return{stage:"definition",kind:"requirement"};if(path.includes("/specs/"))return{stage:"planning",kind:"spec"};if(path.includes("/decisions/"))return{stage:"decisions",kind:"decision"};if(path.includes("/artifacts/evidence/"))return{stage:"evidence",kind:"evidence"};if(path.includes("/artifacts/tests/"))return{stage:"verification",kind:"test"};if(path.includes("/artifacts/evals/"))return{stage:"verification",kind:"eval"};if(path.includes("/artifacts/checks/"))return{stage:"verification",kind:"check"};if(path.includes("/tasks/"))return{stage:"execution",kind:"task"};if(path.includes("/executions/"))return{stage:"execution",kind:"execution"};if(path.includes("/runs/"))return{stage:"execution",kind:"run"};if(path.includes("/changes/"))return{stage:"planning",kind:"change"};return{stage:"evidence",kind:"evidence"}}function timestampsFromContent(content){const timestamps=[...content.matchAll(/\b\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})\b/g)].map(match2=>match2[0]).filter(value=>Number.isFinite(Date.parse(value))).sort(compareTimestamps);return{recorded_at:timestamps.at(0)??null,updated_at:timestamps.at(-1)??null}}function compareTimestamps(left,right){return Date.parse(left)-Date.parse(right)}function inlineDecisionDocument(document){if(document.kind!=="change")return null;const section=document.content.match(/^## Decis(?:ões|oes)\s*\r?\n([\s\S]*?)(?=^##\s|\s*$)/m)?.[1]?.trim();if(section===void 0||section.length===0||/^Nenhuma decis(?:ão|ao) registrada\.?$/i.test(section)){return null}return{id:createHash3("sha256").update(`${document.path}#decisions`).digest("hex").slice(0,16),path:`${document.path}#decisions`,title:`Decis\xF5es \u2014 ${document.title}`,stage:"decisions",kind:"decision",content:section,...timestampsFromContent(section)}}function inlineVerificationDocument(document,taskId){if(document.kind!=="evidence"||!document.content.includes(taskId)||!/(?:test|vitest|typecheck|biome|build|lint|check|eval)/i.test(document.content)||!/(?:passed|passing|aprovad[oa]|exit\s*code\s*[:=]?\s*0|\bPASS\b)/i.test(document.content)){return null}return{...document,id:createHash3("sha256").update(`${document.path}#verification`).digest("hex").slice(0,16),path:`${document.path}#verification`,title:`Verifica\xE7\xE3o \u2014 ${document.title}`,stage:"verification",kind:"check"}}function evidenceReferenceDocuments(task,documents){const result=task.data?.result;if(typeof result!=="object"||result===null)return[];const evidenceIds=result.evidence_ids;if(!Array.isArray(evidenceIds))return[];const finishedAt=stringData(task,"finished_at");return evidenceIds.filter(id=>typeof id==="string"&&id.length>0).filter(id=>!documents.some(document=>document.kind==="evidence"&&document.content.includes(id))).map(id=>({id:createHash3("sha256").update(`${task.id}#evidence/${id}`).digest("hex").slice(0,16),path:`${layoutIndependentTaskPath(task.id)}#evidence/${id}`,title:id,stage:"evidence",kind:"evidence",content:`Task: ${task.id}
196
+ ${result}`}function sameValues(left,right){return JSON.stringify(left)===JSON.stringify(right)}function addDuplicateIssues2(values,field,context){const seen=new Set;for(const value of values){if(seen.has(value)){context.addIssue({code:"custom",path:[field],message:`Duplicate value: ${value}`})}seen.add(value)}}var timestamp7=external_exports.string().datetime({offset:true});var taskSchema=external_exports.object({id:external_exports.string().startsWith("TASK-"),title:external_exports.string().min(1),short_name:external_exports.string().min(1),status:external_exports.enum(["draft","planned","executing","verifying","completed","failed","blocked","cancelled"]),risk:external_exports.enum(["lite","standard","critical"]),priority:external_exports.enum(["low","medium","high","urgent"]),owner:external_exports.string().min(1).nullable().default(null),progress:external_exports.number().int().min(0).max(100),spec:external_exports.string().startsWith("SPEC-"),change:external_exports.string().startsWith("CHG-"),requirements:external_exports.array(external_exports.string().startsWith("REQ-")),depends_on:external_exports.array(external_exports.string().startsWith("TASK-")),human_decisions:external_exports.array(external_exports.string().startsWith("DEC-HUMAN-")),agent_decisions:external_exports.array(external_exports.string().startsWith("DEC-AI-")),created_at:timestamp7,started_at:timestamp7.nullable(),finished_at:timestamp7.nullable()}).strict();async function readTaskDetail(filesystem,layout,taskId){if(layout.version!==2)throw new Error("Task detail requires WorkspaceLayout V2");const tasks=new TaskV2Repository(filesystem,layout);const changes=new ChangeV2Repository(filesystem,layout);const executions=new ExecutionV2Repository(filesystem,layout);const{task,body}=await tasks.read(taskId);const{change}=await changes.read(task.change_id);const specId=change.source.type==="spec"?change.source.spec_id:change.source.type==="prd"?change.source.spec_id:null;const testCounts=await countTaskTestArtifacts(filesystem,[task],changeId=>changes.path(changeId));const startedExecutionTaskIds=taskIdsWithStartedExecution(await executions.list());return{task:{...task,attempt_count:task.attempt_count??null,artifact_path:tasks.path(task.id),progress:taskProgress(task.status),spec_id:specId,execution_started:startedExecutionTaskIds.has(task.id),test_count:testCounts.get(task.id)??0},body,artifact_path:tasks.path(task.id)}}async function readPrdDetail(filesystem,layout,prdId){if(layout.version===1)throw new Error("PRD detail requires a modern WorkspaceLayout");const prds=new PrdV2Repository(filesystem,layout);const{prd,body}=await prds.read(prdId);return{id:prd.id,title:prd.title,body,artifact_path:prds.path(prd.id)}}async function readSpecDetail(filesystem,layout,specId){if(layout.version===1)throw new Error("SPEC detail requires a modern WorkspaceLayout");const specs=new DeliverySpecV2Repository(filesystem,layout);const{spec,body}=await specs.read(specId);return{id:spec.id,title:spec.title,body,artifact_path:specs.path(spec.id)}}import{createHash as createHash3}from"node:crypto";var MAX_DOCUMENT_BYTES=25e4;async function buildTaskTrace(filesystem,layout,taskId){if(layout.version===1)throw new Error("Task trace requires a modern WorkspaceLayout");const entities=await new ProjectionStore(filesystem).readEntities();const task=entities.find(entity=>entity.kind==="task"&&entity.id===taskId);if(task===void 0)throw new Error(`Task ${taskId} was not found in the runtime projection`);const changeId=stringData(task,"change_id")??relatedId(task,"CHG-")??task.id;const change=entities.find(entity=>entity.kind==="change"&&entity.id===changeId);const specId=sourceId(change,"spec_id")??relatedId(task,"SPEC-")??relatedId(change,"SPEC-");const prdId=sourceId(change,"prd_id")??relatedId(task,"PRD-")??relatedId(change,"PRD-");const lifecycleMarkers=new Set([task.id,changeId]);if(specId!==null)lifecycleMarkers.add(specId);if(prdId!==null)lifecycleMarkers.add(prdId);const requirementMarkers=new Set([...task.relations,...change?.relations??[]].filter(relation=>/^(?:REQ|AC)-/.test(relation)));const related=entities.filter(entity=>isLifecycleRelated(entity,lifecycleMarkers));const taskRuns=related.filter(entity=>entity.kind==="run"&&stringData(entity,"task_id")===task.id);const paths=new Set;for(const entity of related){if(entity.kind!=="decision")paths.add(layout.activePath(entity.kind,entity.id))}paths.add(layout.activePath("task",task.id));if(changeId.startsWith("CHG-"))paths.add(layout.activePath("change",changeId));if(specId!==null)paths.add(layout.activePath("spec",specId));if(prdId!==null)paths.add(layout.activePath("prd",prdId));const expandedPaths=new Set(paths);for(const path of paths){if(path.includes("/changes/")||path.includes("/executions/")){for(const child of await filesystem.listFiles(path.slice(0,path.lastIndexOf("/")))){expandedPaths.add(child)}}}for(const requirementsRoot of[".agents/requirements",".agents/records/requirements"]){try{for(const path of await filesystem.listFiles(requirementsRoot))expandedPaths.add(path)}catch{}}const documents=[];const taskFinishedAt=stringData(task,"finished_at");for(const path of expandedPaths){if(!/\.(?:md|json|jsonl|txt|log)$/i.test(path)||!await filesystem.exists(path))continue;const content=await filesystem.readText(path);if(content.length>MAX_DOCUMENT_BYTES)continue;const isRequirement=path.includes("/requirements/");const isRelated=!isRequirement||[...requirementMarkers].some(marker=>content.includes(marker));if(!isRelated)continue;const classification=classifyTraceDocument(path);const extractedTimestamps=timestampsFromContent(content);const isTaskSpecificArtifact=(classification.kind==="evidence"||classification.kind==="test"||classification.kind==="eval"||classification.kind==="check")&&content.includes(task.id);if((classification.kind==="evidence"||classification.kind==="test"||classification.kind==="eval"||classification.kind==="check")&&!isTaskSpecificArtifact){continue}const document={id:createHash3("sha256").update(path).digest("hex").slice(0,16),path,title:titleFrom(path,content),...classification,content,recorded_at:extractedTimestamps.recorded_at??(isTaskSpecificArtifact?taskFinishedAt:null),updated_at:extractedTimestamps.updated_at??(isTaskSpecificArtifact?taskFinishedAt:null)};documents.push(document);const inlineDecision=inlineDecisionDocument(document);if(inlineDecision!==null)documents.push(inlineDecision);const inlineVerification=inlineVerificationDocument(document,task.id);if(inlineVerification!==null)documents.push(inlineVerification)}for(const reference of evidenceReferenceDocuments(task,documents))documents.push(reference);documents.sort((left,right)=>stageOrder[left.stage]-stageOrder[right.stage]||left.path.localeCompare(right.path));const coveredStages=new Set(documents.map(document=>document.stage));const stages=buildTraceStageRecords(documents);return{schema_version:2,layout_version:layout.version,readonly:true,source:".agents/records",task_id:task.id,task_title:task.title??task.id,task_risk:task.risk==="lite"||task.risk==="standard"||task.risk==="critical"?task.risk:null,task_created_at:stringData(task,"created_at"),task_progress:progressFromStatus(task.status),spec_id:specId,prd_id:prdId,change_id:changeId,usage:buildTraceUsage(taskRuns),documents,stages,coverage:{stages_with_documents:coveredStages.size,stages_with_timestamps:stages.filter(stage=>stage.status==="recorded").length,total_stages:6,evidence_count:documents.filter(document=>document.kind==="evidence").length,test_count:documents.filter(document=>document.kind==="test").length}}}function buildTraceUsage(runs,nowMs=Date.now()){const durationValues=runs.map(run=>isRootExecutionRun(run)?runDurationMs(run,nowMs):null);const tokenValues=runs.map(run=>run.usage?.total_tokens??null);const costValues=runs.map(run=>run.usage?.cost??null);const currencies=new Set(runs.map(run=>run.usage?.currency).filter(currency2=>currency2==="BRL"||currency2==="USD"));const currency=currencies.size===1?[...currencies][0]??null:null;return{run_count:runs.length,duration_ms:observedMetric(durationValues),total_tokens:observedMetric(tokenValues),cost:currencies.size<=1?{...observedMetric(costValues),currency}:{...observedMetric(runs.map(()=>null)),currency:null}}}function isRootExecutionRun(run){return stringData(run,"phase")==="execution"&&stringData(run,"parent_run_id")===null}function observedMetric(values){const known=values.filter(value=>value!==null);return{value:known.length===0?null:known.reduce((sum,value)=>sum+value,0),known_runs:known.length,unknown_runs:values.length-known.length,coverage_ratio:values.length===0?1:known.length/values.length}}function runDurationMs(run,nowMs){const startedAt=stringData(run,"started_at");const finishedAt=stringData(run,"finished_at");if(startedAt===null)return null;const startedAtMs=Date.parse(startedAt);const finishedAtMs=finishedAt===null?null:Date.parse(finishedAt);const duration3=finishedAtMs===null&&run.status==="running"?nowMs-startedAtMs:(finishedAtMs??Number.NaN)-startedAtMs;return Number.isFinite(duration3)?Math.max(0,duration3):null}function buildTraceStageRecords(documents){return Object.keys(stageOrder).map(stage=>{const stageDocuments=documents.filter(document=>document.stage===stage);const timestamps=stageDocuments.flatMap(document=>[document.recorded_at,document.updated_at]).filter(value=>value!==null).sort(compareTimestamps);return{stage,status:stageDocuments.length===0?"pending":timestamps.length===0?"missing_timestamp":"recorded",first_recorded_at:timestamps.at(0)??null,last_recorded_at:timestamps.at(-1)??null,document_count:stageDocuments.length,test_count:stageDocuments.filter(document=>document.kind==="test").length}})}function isLifecycleRelated(entity,lifecycleMarkers){return lifecycleMarkers.has(entity.id)||entity.relations.some(relation=>lifecycleMarkers.has(relation))}function progressFromStatus(status){if(status==="completed")return 100;if(status==="verifying")return 80;if(status==="executing")return 50;if(status==="blocked"||status==="failed"||status==="cancelled")return 0;return 10}function stringData(entity,key){const value=entity.data?.[key];return typeof value==="string"&&value.length>0?value:null}function relatedId(entity,prefix){return entity?.relations.find(relation=>relation.startsWith(prefix))??null}function sourceId(entity,key){const source=entity?.data?.source;if(typeof source!=="object"||source===null)return null;const value=source[key];return typeof value==="string"&&value.length>0?value:null}var stageOrder={definition:0,planning:1,execution:2,decisions:3,verification:4,evidence:5};function classifyTraceDocument(path){if(path.includes("/prds/"))return{stage:"definition",kind:"prd"};if(path.includes("/requirements/"))return{stage:"definition",kind:"requirement"};if(path.includes("/specs/"))return{stage:"planning",kind:"spec"};if(path.includes("/decisions/"))return{stage:"decisions",kind:"decision"};if(path.includes("/artifacts/evidence/"))return{stage:"evidence",kind:"evidence"};if(path.includes("/artifacts/tests/"))return{stage:"verification",kind:"test"};if(path.includes("/artifacts/evals/"))return{stage:"verification",kind:"eval"};if(path.includes("/artifacts/checks/"))return{stage:"verification",kind:"check"};if(path.includes("/tasks/"))return{stage:"execution",kind:"task"};if(path.includes("/executions/"))return{stage:"execution",kind:"execution"};if(path.includes("/runs/"))return{stage:"execution",kind:"run"};if(path.includes("/changes/"))return{stage:"planning",kind:"change"};return{stage:"evidence",kind:"evidence"}}function timestampsFromContent(content){const timestamps=[...content.matchAll(/\b\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})\b/g)].map(match2=>match2[0]).filter(value=>Number.isFinite(Date.parse(value))).sort(compareTimestamps);return{recorded_at:timestamps.at(0)??null,updated_at:timestamps.at(-1)??null}}function compareTimestamps(left,right){return Date.parse(left)-Date.parse(right)}function inlineDecisionDocument(document){if(document.kind!=="change")return null;const section=document.content.match(/^## Decis(?:ões|oes)\s*\r?\n([\s\S]*?)(?=^##\s|\s*$)/m)?.[1]?.trim();if(section===void 0||section.length===0||/^Nenhuma decis(?:ão|ao) registrada\.?$/i.test(section)){return null}return{id:createHash3("sha256").update(`${document.path}#decisions`).digest("hex").slice(0,16),path:`${document.path}#decisions`,title:`Decis\xF5es \u2014 ${document.title}`,stage:"decisions",kind:"decision",content:section,...timestampsFromContent(section)}}function inlineVerificationDocument(document,taskId){if(document.kind!=="evidence"||!document.content.includes(taskId)||!/(?:test|vitest|typecheck|biome|build|lint|check|eval)/i.test(document.content)||!/(?:passed|passing|aprovad[oa]|exit\s*code\s*[:=]?\s*0|\bPASS\b)/i.test(document.content)){return null}return{...document,id:createHash3("sha256").update(`${document.path}#verification`).digest("hex").slice(0,16),path:`${document.path}#verification`,title:`Verifica\xE7\xE3o \u2014 ${document.title}`,stage:"verification",kind:"check"}}function evidenceReferenceDocuments(task,documents){const result=task.data?.result;if(typeof result!=="object"||result===null)return[];const evidenceIds=result.evidence_ids;if(!Array.isArray(evidenceIds))return[];const finishedAt=stringData(task,"finished_at");return evidenceIds.filter(id=>typeof id==="string"&&id.length>0).filter(id=>!documents.some(document=>document.kind==="evidence"&&document.content.includes(id))).map(id=>({id:createHash3("sha256").update(`${task.id}#evidence/${id}`).digest("hex").slice(0,16),path:`${layoutIndependentTaskPath(task.id)}#evidence/${id}`,title:id,stage:"evidence",kind:"evidence",content:`Task: ${task.id}
177
197
  Evidence reference: ${id}`,recorded_at:finishedAt,updated_at:finishedAt}))}function layoutIndependentTaskPath(taskId){return`.agents/records/tasks/${taskId}.md`}function titleFrom(path,content){return content.match(/^#\s+(.+)$/m)?.[1]?.trim()??path.split("/").at(-1)??path}var compose=(middleware,onError,onNotFound)=>{return(context,next)=>{let index=-1;return dispatch(0);async function dispatch(i){if(i<=index){throw new Error("next() called multiple times")}index=i;let res;let isError=false;let handler;if(middleware[i]){handler=middleware[i][0][0];context.req.routeIndex=i}else{handler=i===middleware.length&&next||void 0}if(handler){try{res=await handler(context,()=>dispatch(i+1))}catch(err){if(err instanceof Error&&onError){context.error=err;res=await onError(err,context);isError=true}else{throw err}}}else{if(context.finalized===false&&onNotFound){res=await onNotFound(context)}}if(res&&(context.finalized===false||isError)){context.res=res}return context}}};var GET_MATCH_RESULT=Symbol();var bufferToFormData=(arrayBuffer,contentType2)=>{const response=new Response(arrayBuffer,{headers:{"Content-Type":contentType2.replace(/^[^;]+/,mediaType=>mediaType.toLowerCase())}});return response.formData()};var isRawRequest=request=>"headers"in request;var parseBody=async(request,options=Object.create(null))=>{const{all=false,dot=false}=options;const headers=isRawRequest(request)?request.headers:request.raw.headers;const contentType2=headers.get("Content-Type");const mediaType=contentType2?.split(";")[0].trim().toLowerCase();if(mediaType==="multipart/form-data"||mediaType==="application/x-www-form-urlencoded"){return parseFormData(request,{all,dot})}return{}};async function parseFormData(request,options){const headers=isRawRequest(request)?request.headers:request.raw.headers;const arrayBuffer=await request.arrayBuffer();const formDataPromise=bufferToFormData(arrayBuffer,headers.get("Content-Type")||"");if(!isRawRequest(request)){request.bodyCache.formData=formDataPromise}const formData=await formDataPromise;if(formData){return convertFormDataToBodyData(formData,options)}return{}}function convertFormDataToBodyData(formData,options){const form=Object.create(null);formData.forEach((value,key)=>{const shouldParseAllValues=options.all||key.endsWith("[]");if(!shouldParseAllValues){form[key]=value}else{handleParsingAllValues(form,key,value)}});if(options.dot){Object.entries(form).forEach(([key,value])=>{const shouldParseDotValues=key.includes(".");if(shouldParseDotValues){handleParsingNestedValues(form,key,value);delete form[key]}})}return form}var handleParsingAllValues=(form,key,value)=>{if(form[key]!==void 0){if(Array.isArray(form[key])){;form[key].push(value)}else{form[key]=[form[key],value]}}else{if(!key.endsWith("[]")){form[key]=value}else{form[key]=[value]}}};var handleParsingNestedValues=(form,key,value)=>{if(/(?:^|\.)__proto__\./.test(key)){return}let nestedForm=form;const keys=key.split(".");keys.forEach((key2,index)=>{if(index===keys.length-1){nestedForm[key2]=value}else{if(!nestedForm[key2]||typeof nestedForm[key2]!=="object"||Array.isArray(nestedForm[key2])||nestedForm[key2]instanceof File){nestedForm[key2]=Object.create(null)}nestedForm=nestedForm[key2]}})};var splitPath=path=>{const paths=path.split("/");if(paths[0]===""){paths.shift()}return paths};var splitRoutingPath=routePath=>{const{groups,path}=extractGroupsFromPath(routePath);const paths=splitPath(path);return replaceGroupMarks(paths,groups)};var extractGroupsFromPath=path=>{const groups=[];path=path.replace(/\{[^}]+\}/g,(match2,index)=>{const mark=`@${index}`;groups.push([mark,match2]);return mark});return{groups,path}};var replaceGroupMarks=(paths,groups)=>{for(let i=groups.length-1;i>=0;i--){const[mark]=groups[i];for(let j=paths.length-1;j>=0;j--){if(paths[j].includes(mark)){paths[j]=paths[j].replace(mark,groups[i][1]);break}}}return paths};var patternCache={};var getPattern=(label,next)=>{if(label==="*"){return"*"}const match2=label.match(/^\:([^\{\}]+)(?:\{(.+)\})?$/);if(match2){const cacheKey2=`${label}#${next}`;if(!patternCache[cacheKey2]){if(match2[2]){patternCache[cacheKey2]=next&&next[0]!==":"&&next[0]!=="*"?[cacheKey2,match2[1],new RegExp(`^${match2[2]}(?=/${next})`)]:[label,match2[1],new RegExp(`^${match2[2]}$`)]}else{patternCache[cacheKey2]=[label,match2[1],true]}}return patternCache[cacheKey2]}return null};var tryDecode2=(str,decoder)=>{try{return decoder(str)}catch{return str.replace(/(?:%[0-9A-Fa-f]{2})+/g,match2=>{try{return decoder(match2)}catch{return match2}})}};var tryDecodeURI2=str=>tryDecode2(str,decodeURI);var getPath=request=>{const url2=request.url;const start=url2.indexOf("/",url2.indexOf(":")+4);let i=start;for(;i<url2.length;i++){const charCode=url2.charCodeAt(i);if(charCode===37){const queryIndex=url2.indexOf("?",i);const hashIndex=url2.indexOf("#",i);const end=queryIndex===-1?hashIndex===-1?void 0:hashIndex:hashIndex===-1?queryIndex:Math.min(queryIndex,hashIndex);const path=url2.slice(start,end);return tryDecodeURI2(path.includes("%25")?path.replace(/%25/g,"%2525"):path)}else if(charCode===63||charCode===35){break}}return url2.slice(start,i)};var getPathNoStrict=request=>{const result=getPath(request);return result.length>1&&result.at(-1)==="/"?result.slice(0,-1):result};var mergePath=(base,sub,...rest)=>{if(rest.length){sub=mergePath(sub,...rest)}return`${base?.[0]==="/"?"":"/"}${base}${sub==="/"?"":`${base?.at(-1)==="/"?"":"/"}${sub?.[0]==="/"?sub.slice(1):sub}`}`};var checkOptionalParameter=path=>{if(path.charCodeAt(path.length-1)!==63||!path.includes(":")){return null}const segments=path.split("/");const results=[];let basePath="";segments.forEach(segment=>{if(segment!==""&&!/\:/.test(segment)){basePath+="/"+segment}else if(/\:/.test(segment)){if(/\?/.test(segment)){if(results.length===0&&basePath===""){results.push("/")}else{results.push(basePath)}const optionalSegment=segment.replace("?","");basePath+="/"+optionalSegment;results.push(basePath)}else{basePath+="/"+segment}}});return results.filter((v,i,a)=>a.indexOf(v)===i)};var _decodeURI=value=>{if(!/[%+]/.test(value)){return value}if(value.indexOf("+")!==-1){value=value.replace(/\+/g," ")}return value.indexOf("%")!==-1?tryDecode2(value,decodeURIComponent_):value};var _getQueryParam=(url2,key,multiple)=>{let encoded;if(!multiple&&key&&!/[%+]/.test(key)){let keyIndex2=url2.indexOf("?",8);if(keyIndex2===-1){return void 0}if(!url2.startsWith(key,keyIndex2+1)){keyIndex2=url2.indexOf(`&${key}`,keyIndex2+1)}while(keyIndex2!==-1){const trailingKeyCode=url2.charCodeAt(keyIndex2+key.length+1);if(trailingKeyCode===61){const valueIndex=keyIndex2+key.length+2;const endIndex=url2.indexOf("&",valueIndex);return _decodeURI(url2.slice(valueIndex,endIndex===-1?void 0:endIndex))}else if(trailingKeyCode==38||isNaN(trailingKeyCode)){return""}keyIndex2=url2.indexOf(`&${key}`,keyIndex2+1)}encoded=/[%+]/.test(url2);if(!encoded){return void 0}}const results={};encoded??=/[%+]/.test(url2);let keyIndex=url2.indexOf("?",8);while(keyIndex!==-1){const nextKeyIndex=url2.indexOf("&",keyIndex+1);let valueIndex=url2.indexOf("=",keyIndex);if(valueIndex>nextKeyIndex&&nextKeyIndex!==-1){valueIndex=-1}let name=url2.slice(keyIndex+1,valueIndex===-1?nextKeyIndex===-1?void 0:nextKeyIndex:valueIndex);if(encoded){name=_decodeURI(name)}keyIndex=nextKeyIndex;if(name===""){continue}let value;if(valueIndex===-1){value=""}else{value=url2.slice(valueIndex+1,nextKeyIndex===-1?void 0:nextKeyIndex);if(encoded){value=_decodeURI(value)}}if(multiple){if(!(results[name]&&Array.isArray(results[name]))){results[name]=[]};results[name].push(value)}else{results[name]??=value}}return key?results[key]:results};var getQueryParam=_getQueryParam;var getQueryParams=(url2,key)=>{return _getQueryParam(url2,key,true)};var decodeURIComponent_=decodeURIComponent;var tryDecodeURIComponent=str=>tryDecode2(str,decodeURIComponent_);var HonoRequest=class{raw;#validatedData;#matchResult;routeIndex=0;path;bodyCache={};constructor(request,path="/",matchResult=[[]]){this.raw=request;this.path=path;this.#matchResult=matchResult;this.#validatedData={}}param(key){return key?this.#getDecodedParam(key):this.#getAllDecodedParams()}#getDecodedParam(key){const paramKey=this.#matchResult[0][this.routeIndex][1][key];const param=this.#getParamValue(paramKey);return param&&/\%/.test(param)?tryDecodeURIComponent(param):param}#getAllDecodedParams(){const decoded={};const keys=Object.keys(this.#matchResult[0][this.routeIndex][1]);for(const key of keys){const value=this.#getParamValue(this.#matchResult[0][this.routeIndex][1][key]);if(value!==void 0){decoded[key]=/\%/.test(value)?tryDecodeURIComponent(value):value}}return decoded}#getParamValue(paramKey){return this.#matchResult[1]?this.#matchResult[1][paramKey]:paramKey}query(key){return getQueryParam(this.url,key)}queries(key){return getQueryParams(this.url,key)}header(name){if(name){return this.raw.headers.get(name)??void 0}const headerData={};this.raw.headers.forEach((value,key)=>{headerData[key]=value});return headerData}async parseBody(options){return parseBody(this,options)}#cachedBody=key=>{const{bodyCache,raw:raw2}=this;const cachedBody=bodyCache[key];if(cachedBody){return cachedBody}const anyCachedKey=Object.keys(bodyCache)[0];if(anyCachedKey){return bodyCache[anyCachedKey].then(body=>{if(anyCachedKey==="json"){body=JSON.stringify(body)}return new Response(body)[key]()})}return bodyCache[key]=raw2[key]()};json(){return this.#cachedBody("text").then(text=>JSON.parse(text))}text(){return this.#cachedBody("text")}arrayBuffer(){return this.#cachedBody("arrayBuffer")}bytes(){return this.#cachedBody("arrayBuffer").then(buffer=>new Uint8Array(buffer))}blob(){return this.#cachedBody("blob")}formData(){return this.#cachedBody("formData")}addValidatedData(target,data){this.#validatedData[target]=data}valid(target){return this.#validatedData[target]}get url(){return this.raw.url}get method(){return this.raw.method}get[GET_MATCH_RESULT](){return this.#matchResult}get matchedRoutes(){return this.#matchResult[0].map(([[,route]])=>route)}get routePath(){return this.#matchResult[0].map(([[,route]])=>route)[this.routeIndex].path}};var HtmlEscapedCallbackPhase={Stringify:1,BeforeStream:2,Stream:3};var raw=(value,callbacks)=>{const escapedString=new String(value);escapedString.isEscaped=true;escapedString.callbacks=callbacks;return escapedString};var resolveCallback=async(str,phase,preserveCallbacks,context,buffer)=>{if(typeof str==="object"&&!(str instanceof String)){if(!(str instanceof Promise)){str=str.toString()}if(str instanceof Promise){str=await str}}const callbacks=str.callbacks;if(!callbacks?.length){return Promise.resolve(str)}if(buffer){buffer[0]+=str}else{buffer=[str]}const resStr=Promise.all(callbacks.map(c=>c({phase,buffer,context}))).then(res=>Promise.all(res.filter(Boolean).map(str2=>resolveCallback(str2,phase,false,context,buffer))).then(()=>buffer[0]));if(preserveCallbacks){return raw(await resStr,callbacks)}else{return resStr}};var TEXT_PLAIN="text/plain; charset=UTF-8";var setDefaultContentType=(contentType2,headers)=>{return{"Content-Type":contentType2,...headers}};var createResponseInstance=(body,init)=>new Response(body,init);var Context=class{#rawRequest;#req;env={};#var;finalized=false;error;#status;#executionCtx;#res;#layout;#renderer;#notFoundHandler;#preparedHeaders;#matchResult;#path;constructor(req,options){this.#rawRequest=req;if(options){this.#executionCtx=options.executionCtx;this.env=options.env;this.#notFoundHandler=options.notFoundHandler;this.#path=options.path;this.#matchResult=options.matchResult}}get req(){this.#req??=new HonoRequest(this.#rawRequest,this.#path,this.#matchResult);return this.#req}get event(){if(this.#executionCtx&&"respondWith"in this.#executionCtx){return this.#executionCtx}else{throw Error("This context has no FetchEvent")}}get executionCtx(){if(this.#executionCtx){return this.#executionCtx}else{throw Error("This context has no ExecutionContext")}}get res(){return this.#res||=createResponseInstance(null,{headers:this.#preparedHeaders??=new Headers})}set res(_res){if(this.#res&&_res){_res=createResponseInstance(_res.body,_res);for(const[k,v]of this.#res.headers.entries()){if(k==="content-type"){continue}if(k==="set-cookie"){const cookies=this.#res.headers.getSetCookie();_res.headers.delete("set-cookie");for(const cookie of cookies){_res.headers.append("set-cookie",cookie)}}else{_res.headers.set(k,v)}}}this.#res=_res;this.finalized=true}render=(...args)=>{this.#renderer??=content=>this.html(content);return this.#renderer(...args)};setLayout=layout=>this.#layout=layout;getLayout=()=>this.#layout;setRenderer=renderer=>{this.#renderer=renderer};header=(name,value,options)=>{if(this.finalized){this.#res=createResponseInstance(this.#res.body,this.#res)}const headers=this.#res?this.#res.headers:this.#preparedHeaders??=new Headers;if(value===void 0){headers.delete(name)}else if(options?.append){headers.append(name,value)}else{headers.set(name,value)}};status=status=>{this.#status=status};set=(key,value)=>{this.#var??=new Map;this.#var.set(key,value)};get=key=>{return this.#var?this.#var.get(key):void 0};get var(){if(!this.#var){return{}}return Object.fromEntries(this.#var)}#newResponse(data,arg,headers){const responseHeaders=this.#res?new Headers(this.#res.headers):this.#preparedHeaders??new Headers;if(typeof arg==="object"&&"headers"in arg){const argHeaders=arg.headers instanceof Headers?arg.headers:new Headers(arg.headers);for(const[key,value]of argHeaders){if(key.toLowerCase()==="set-cookie"){responseHeaders.append(key,value)}else{responseHeaders.set(key,value)}}}if(headers){for(const[k,v]of Object.entries(headers)){if(typeof v==="string"){responseHeaders.set(k,v)}else{responseHeaders.delete(k);for(const v2 of v){responseHeaders.append(k,v2)}}}}const status=typeof arg==="number"?arg:arg?.status??this.#status;return createResponseInstance(data,{status,headers:responseHeaders})}newResponse=(...args)=>this.#newResponse(...args);body=(data,arg,headers)=>this.#newResponse(data,arg,headers);text=(text,arg,headers)=>{return!this.#preparedHeaders&&!this.#status&&!arg&&!headers&&!this.finalized?new Response(text):this.#newResponse(text,arg,setDefaultContentType(TEXT_PLAIN,headers))};json=(object2,arg,headers)=>{return this.#newResponse(JSON.stringify(object2),arg,setDefaultContentType("application/json",headers))};html=(html,arg,headers)=>{const res=html2=>this.#newResponse(html2,arg,setDefaultContentType("text/html; charset=UTF-8",headers));return typeof html==="object"?resolveCallback(html,HtmlEscapedCallbackPhase.Stringify,false,{}).then(res):res(html)};redirect=(location,status)=>{const locationString=String(location);this.header("Location",!/[^\x00-\xFF]/.test(locationString)?locationString:encodeURI(locationString));return this.newResponse(null,status??302)};notFound=()=>{this.#notFoundHandler??=()=>createResponseInstance();return this.#notFoundHandler(this)}};var METHOD_NAME_ALL="ALL";var METHOD_NAME_ALL_LOWERCASE="all";var METHODS=["get","post","put","delete","options","patch"];var MESSAGE_MATCHER_IS_ALREADY_BUILT="Can not add a route since the matcher is already built.";var UnsupportedPathError=class extends Error{};var COMPOSED_HANDLER="__COMPOSED_HANDLER";var notFoundHandler=c=>{return c.text("404 Not Found",404)};var errorHandler=(err,c)=>{if("getResponse"in err){const res=err.getResponse();return c.newResponse(res.body,res)}console.error(err);return c.text("Internal Server Error",500)};var Hono=class _Hono{get;post;put;delete;options;patch;all;on;use;router;getPath;_basePath="/";#path="/";routes=[];constructor(options={}){const allMethods=[...METHODS,METHOD_NAME_ALL_LOWERCASE];allMethods.forEach(method=>{this[method]=(args1,...args)=>{if(typeof args1==="string"){this.#path=args1}else{this.#addRoute(method,this.#path,args1)}args.forEach(handler=>{this.#addRoute(method,this.#path,handler)});return this}});this.on=(method,path,...handlers)=>{for(const p of[path].flat()){this.#path=p;for(const m of[method].flat()){handlers.map(handler=>{this.#addRoute(m.toUpperCase(),this.#path,handler)})}}return this};this.use=(arg1,...handlers)=>{if(typeof arg1==="string"){this.#path=arg1}else{this.#path="*";handlers.unshift(arg1)}handlers.forEach(handler=>{this.#addRoute(METHOD_NAME_ALL,this.#path,handler)});return this};const{strict,...optionsWithoutStrict}=options;Object.assign(this,optionsWithoutStrict);this.getPath=strict??true?options.getPath??getPath:getPathNoStrict}#clone(){const clone2=new _Hono({router:this.router,getPath:this.getPath});clone2.errorHandler=this.errorHandler;clone2.#notFoundHandler=this.#notFoundHandler;clone2.routes=this.routes;return clone2}#notFoundHandler=notFoundHandler;errorHandler=errorHandler;route(path,app2){const subApp=this.basePath(path);app2.routes.map(r=>{let handler;if(app2.errorHandler===errorHandler){handler=r.handler}else{handler=async(c,next)=>(await compose([],app2.errorHandler)(c,()=>r.handler(c,next))).res;handler[COMPOSED_HANDLER]=r.handler}subApp.#addRoute(r.method,r.path,handler,r.basePath)});return this}basePath(path){const subApp=this.#clone();subApp._basePath=mergePath(this._basePath,path);return subApp}onError=handler=>{this.errorHandler=handler;return this};notFound=handler=>{this.#notFoundHandler=handler;return this};mount(path,applicationHandler,options){let replaceRequest;let optionHandler;if(options){if(typeof options==="function"){optionHandler=options}else{optionHandler=options.optionHandler;if(options.replaceRequest===false){replaceRequest=request=>request}else{replaceRequest=options.replaceRequest}}}const getOptions=optionHandler?c=>{const options2=optionHandler(c);return Array.isArray(options2)?options2:[options2]}:c=>{let executionContext=void 0;try{executionContext=c.executionCtx}catch{}return[c.env,executionContext]};replaceRequest||=(()=>{const mergedPath=mergePath(this._basePath,path);const pathPrefixLength=mergedPath==="/"?0:mergedPath.length;return request=>{const url2=new URL(request.url);url2.pathname=this.getPath(request).slice(pathPrefixLength)||"/";return new Request(url2,request)}})();const handler=async(c,next)=>{const res=await applicationHandler(replaceRequest(c.req.raw),...getOptions(c));if(res){return res}await next()};this.#addRoute(METHOD_NAME_ALL,mergePath(path,"*"),handler);return this}#addRoute(method,path,handler,baseRoutePath){method=method.toUpperCase();path=mergePath(this._basePath,path);const r={basePath:baseRoutePath!==void 0?mergePath(this._basePath,baseRoutePath):this._basePath,path,method,handler};this.router.add(method,path,[handler,r]);this.routes.push(r)}#handleError(err,c){if(err instanceof Error){return this.errorHandler(err,c)}throw err}#dispatch(request,executionCtx,env,method){if(method==="HEAD"){return(async()=>new Response(null,await this.#dispatch(request,executionCtx,env,"GET")))()}const path=this.getPath(request,{env});const matchResult=this.router.match(method,path);const c=new Context(request,{path,matchResult,env,executionCtx,notFoundHandler:this.#notFoundHandler});if(matchResult[0].length===1){let res;try{res=matchResult[0][0][0][0](c,async()=>{c.res=await this.#notFoundHandler(c)})}catch(err){return this.#handleError(err,c)}return res instanceof Promise?res.then(resolved=>resolved||(c.finalized?c.res:this.#notFoundHandler(c))).catch(err=>this.#handleError(err,c)):res??this.#notFoundHandler(c)}const composed=compose(matchResult[0],this.errorHandler,this.#notFoundHandler);return(async()=>{try{const context=await composed(c);if(!context.finalized){throw new Error("Context is not finalized. Did you forget to return a Response object or `await next()`?")}return context.res}catch(err){return this.#handleError(err,c)}})()}fetch=(request,...rest)=>{return this.#dispatch(request,rest[1],rest[0],request.method)};request=(input,requestInit,Env,executionCtx)=>{if(input instanceof Request){return this.fetch(requestInit?new Request(input,requestInit):input,Env,executionCtx)}input=input.toString();return this.fetch(new Request(/^https?:\/\//.test(input)?input:`http://localhost${mergePath("/",input)}`,requestInit),Env,executionCtx)};fire=()=>{addEventListener("fetch",event=>{event.respondWith(this.#dispatch(event.request,event,void 0,event.request.method))})}};var emptyParam=[];function match(method,path){const matchers=this.buildAllMatchers();const match2=((method2,path2)=>{const matcher=matchers[method2]||matchers[METHOD_NAME_ALL];const staticMatch=matcher[2][path2];if(staticMatch){return staticMatch}const match3=path2.match(matcher[0]);if(!match3){return[[],emptyParam]}const index=match3.indexOf("",1);return[matcher[1][index],match3]});this.match=match2;return match2(method,path)}var LABEL_REG_EXP_STR="[^/]+";var ONLY_WILDCARD_REG_EXP_STR=".*";var TAIL_WILDCARD_REG_EXP_STR="(?:|/.*)";var PATH_ERROR=Symbol();var regExpMetaChars=new Set(".\\+*[^]$()");function compareKey(a,b){if(a.length===1){return b.length===1?a<b?-1:1:-1}if(b.length===1){return 1}if(a===ONLY_WILDCARD_REG_EXP_STR||a===TAIL_WILDCARD_REG_EXP_STR){return 1}else if(b===ONLY_WILDCARD_REG_EXP_STR||b===TAIL_WILDCARD_REG_EXP_STR){return-1}if(a===LABEL_REG_EXP_STR){return 1}else if(b===LABEL_REG_EXP_STR){return-1}return a.length===b.length?a<b?-1:1:b.length-a.length}var Node=class _Node{#index;#varIndex;#children=Object.create(null);insert(tokens,index,paramMap,context,pathErrorCheckOnly){if(tokens.length===0){if(this.#index!==void 0){throw PATH_ERROR}if(pathErrorCheckOnly){return}this.#index=index;return}const[token,...restTokens]=tokens;const pattern=token==="*"?restTokens.length===0?["","",ONLY_WILDCARD_REG_EXP_STR]:["","",LABEL_REG_EXP_STR]:token==="/*"?["","",TAIL_WILDCARD_REG_EXP_STR]:token.match(/^\:([^\{\}]+)(?:\{(.+)\})?$/);let node;if(pattern){const name=pattern[1];let regexpStr=pattern[2]||LABEL_REG_EXP_STR;if(name&&pattern[2]){if(regexpStr===".*"){throw PATH_ERROR}regexpStr=regexpStr.replace(/^\((?!\?:)(?=[^)]+\)$)/,"(?:");if(/\((?!\?:)/.test(regexpStr)){throw PATH_ERROR}}node=this.#children[regexpStr];if(!node){if(Object.keys(this.#children).some(k=>k!==ONLY_WILDCARD_REG_EXP_STR&&k!==TAIL_WILDCARD_REG_EXP_STR)){throw PATH_ERROR}if(pathErrorCheckOnly){return}node=this.#children[regexpStr]=new _Node;if(name!==""){node.#varIndex=context.varIndex++}}if(!pathErrorCheckOnly&&name!==""){paramMap.push([name,node.#varIndex])}}else{node=this.#children[token];if(!node){if(Object.keys(this.#children).some(k=>k.length>1&&k!==ONLY_WILDCARD_REG_EXP_STR&&k!==TAIL_WILDCARD_REG_EXP_STR)){throw PATH_ERROR}if(pathErrorCheckOnly){return}node=this.#children[token]=new _Node}}node.insert(restTokens,index,paramMap,context,pathErrorCheckOnly)}buildRegExpStr(){const childKeys=Object.keys(this.#children).sort(compareKey);const strList=childKeys.map(k=>{const c=this.#children[k];return(typeof c.#varIndex==="number"?`(${k})@${c.#varIndex}`:regExpMetaChars.has(k)?`\\${k}`:k)+c.buildRegExpStr()});if(typeof this.#index==="number"){strList.unshift(`#${this.#index}`)}if(strList.length===0){return""}if(strList.length===1){return strList[0]}return"(?:"+strList.join("|")+")"}};var Trie=class{#context={varIndex:0};#root=new Node;insert(path,index,pathErrorCheckOnly){const paramAssoc=[];const groups=[];for(let i=0;;){let replaced=false;path=path.replace(/\{[^}]+\}/g,m=>{const mark=`@\\${i}`;groups[i]=[mark,m];i++;replaced=true;return mark});if(!replaced){break}}const tokens=path.match(/(?::[^\/]+)|(?:\/\*$)|./g)||[];for(let i=groups.length-1;i>=0;i--){const[mark]=groups[i];for(let j=tokens.length-1;j>=0;j--){if(tokens[j].indexOf(mark)!==-1){tokens[j]=tokens[j].replace(mark,groups[i][1]);break}}}this.#root.insert(tokens,index,paramAssoc,this.#context,pathErrorCheckOnly);return paramAssoc}buildRegExp(){let regexp=this.#root.buildRegExpStr();if(regexp===""){return[/^$/,[],[]]}let captureIndex=0;const indexReplacementMap=[];const paramReplacementMap=[];regexp=regexp.replace(/#(\d+)|@(\d+)|\.\*\$/g,(_,handlerIndex,paramIndex)=>{if(handlerIndex!==void 0){indexReplacementMap[++captureIndex]=Number(handlerIndex);return"$()"}if(paramIndex!==void 0){paramReplacementMap[Number(paramIndex)]=++captureIndex;return""}return""});return[new RegExp(`^${regexp}`),indexReplacementMap,paramReplacementMap]}};var nullMatcher=[/^$/,[],Object.create(null)];var wildcardRegExpCache=Object.create(null);function buildWildcardRegExp(path){return wildcardRegExpCache[path]??=new RegExp(path==="*"?"":`^${path.replace(/\/\*$|([.\\+*[^\]$()])/g,(_,metaChar)=>metaChar?`\\${metaChar}`:"(?:|/.*)")}$`)}function clearWildcardRegExpCache(){wildcardRegExpCache=Object.create(null)}function buildMatcherFromPreprocessedRoutes(routes){const trie=new Trie;const handlerData=[];if(routes.length===0){return nullMatcher}const routesWithStaticPathFlag=routes.map(route=>[!/\*|\/:/.test(route[0]),...route]).sort(([isStaticA,pathA],[isStaticB,pathB])=>isStaticA?1:isStaticB?-1:pathA.length-pathB.length);const staticMap=Object.create(null);for(let i=0,j=-1,len=routesWithStaticPathFlag.length;i<len;i++){const[pathErrorCheckOnly,path,handlers]=routesWithStaticPathFlag[i];if(pathErrorCheckOnly){staticMap[path]=[handlers.map(([h])=>[h,Object.create(null)]),emptyParam]}else{j++}let paramAssoc;try{paramAssoc=trie.insert(path,j,pathErrorCheckOnly)}catch(e){throw e===PATH_ERROR?new UnsupportedPathError(path):e}if(pathErrorCheckOnly){continue}handlerData[j]=handlers.map(([h,paramCount])=>{const paramIndexMap=Object.create(null);paramCount-=1;for(;paramCount>=0;paramCount--){const[key,value]=paramAssoc[paramCount];paramIndexMap[key]=value}return[h,paramIndexMap]})}const[regexp,indexReplacementMap,paramReplacementMap]=trie.buildRegExp();for(let i=0,len=handlerData.length;i<len;i++){for(let j=0,len2=handlerData[i].length;j<len2;j++){const map2=handlerData[i][j]?.[1];if(!map2){continue}const keys=Object.keys(map2);for(let k=0,len3=keys.length;k<len3;k++){map2[keys[k]]=paramReplacementMap[map2[keys[k]]]}}}const handlerMap=[];for(const i in indexReplacementMap){handlerMap[i]=handlerData[indexReplacementMap[i]]}return[regexp,handlerMap,staticMap]}function findMiddleware(middleware,path){if(!middleware){return void 0}for(const k of Object.keys(middleware).sort((a,b)=>b.length-a.length)){if(buildWildcardRegExp(k).test(path)){return[...middleware[k]]}}return void 0}var RegExpRouter=class{name="RegExpRouter";#middleware;#routes;constructor(){this.#middleware={[METHOD_NAME_ALL]:Object.create(null)};this.#routes={[METHOD_NAME_ALL]:Object.create(null)}}add(method,path,handler){const middleware=this.#middleware;const routes=this.#routes;if(!middleware||!routes){throw new Error(MESSAGE_MATCHER_IS_ALREADY_BUILT)}if(!middleware[method]){;[middleware,routes].forEach(handlerMap=>{handlerMap[method]=Object.create(null);Object.keys(handlerMap[METHOD_NAME_ALL]).forEach(p=>{handlerMap[method][p]=[...handlerMap[METHOD_NAME_ALL][p]]})})}if(path==="/*"){path="*"}const paramCount=(path.match(/\/:/g)||[]).length;if(/\*$/.test(path)){const re=buildWildcardRegExp(path);if(method===METHOD_NAME_ALL){Object.keys(middleware).forEach(m=>{middleware[m][path]||=findMiddleware(middleware[m],path)||findMiddleware(middleware[METHOD_NAME_ALL],path)||[]})}else{middleware[method][path]||=findMiddleware(middleware[method],path)||findMiddleware(middleware[METHOD_NAME_ALL],path)||[]}Object.keys(middleware).forEach(m=>{if(method===METHOD_NAME_ALL||method===m){Object.keys(middleware[m]).forEach(p=>{re.test(p)&&middleware[m][p].push([handler,paramCount])})}});Object.keys(routes).forEach(m=>{if(method===METHOD_NAME_ALL||method===m){Object.keys(routes[m]).forEach(p=>re.test(p)&&routes[m][p].push([handler,paramCount]))}});return}const paths=checkOptionalParameter(path)||[path];for(let i=0,len=paths.length;i<len;i++){const path2=paths[i];Object.keys(routes).forEach(m=>{if(method===METHOD_NAME_ALL||method===m){routes[m][path2]||=[...findMiddleware(middleware[m],path2)||findMiddleware(middleware[METHOD_NAME_ALL],path2)||[]];routes[m][path2].push([handler,paramCount-len+i+1])}})}}match=match;buildAllMatchers(){const matchers=Object.create(null);Object.keys(this.#routes).concat(Object.keys(this.#middleware)).forEach(method=>{matchers[method]||=this.#buildMatcher(method)});this.#middleware=this.#routes=void 0;clearWildcardRegExpCache();return matchers}#buildMatcher(method){const routes=[];let hasOwnRoute=method===METHOD_NAME_ALL;[this.#middleware,this.#routes].forEach(r=>{const ownRoute=r[method]?Object.keys(r[method]).map(path=>[path,r[method][path]]):[];if(ownRoute.length!==0){hasOwnRoute||=true;routes.push(...ownRoute)}else if(method!==METHOD_NAME_ALL){routes.push(...Object.keys(r[METHOD_NAME_ALL]).map(path=>[path,r[METHOD_NAME_ALL][path]]))}});if(!hasOwnRoute){return null}else{return buildMatcherFromPreprocessedRoutes(routes)}}};var SmartRouter=class{name="SmartRouter";#routers=[];#routes=[];constructor(init){this.#routers=init.routers}add(method,path,handler){if(!this.#routes){throw new Error(MESSAGE_MATCHER_IS_ALREADY_BUILT)}this.#routes.push([method,path,handler])}match(method,path){if(!this.#routes){throw new Error("Fatal error")}const routers=this.#routers;const routes=this.#routes;const len=routers.length;let i=0;let res;for(;i<len;i++){const router=routers[i];try{for(let i2=0,len2=routes.length;i2<len2;i2++){router.add(...routes[i2])}res=router.match(method,path)}catch(e){if(e instanceof UnsupportedPathError){continue}throw e}this.match=router.match.bind(router);this.#routers=[router];this.#routes=void 0;break}if(i===len){throw new Error("Fatal error")}this.name=`SmartRouter + ${this.activeRouter.name}`;return res}get activeRouter(){if(this.#routes||this.#routers.length!==1){throw new Error("No active router has been determined yet.")}return this.#routers[0]}};var emptyParams=Object.create(null);var hasChildren=children=>{for(const _ in children){return true}return false};var Node2=class _Node2{#methods;#children;#patterns;#order=0;#params=emptyParams;constructor(method,handler,children){this.#children=children||Object.create(null);this.#methods=[];if(method&&handler){const m=Object.create(null);m[method]={handler,possibleKeys:[],score:0};this.#methods=[m]}this.#patterns=[]}insert(method,path,handler){this.#order=++this.#order;let curNode=this;const parts=splitRoutingPath(path);const possibleKeys=[];for(let i=0,len=parts.length;i<len;i++){const p=parts[i];const nextP=parts[i+1];const pattern=getPattern(p,nextP);const key=Array.isArray(pattern)?pattern[0]:p;if(key in curNode.#children){curNode=curNode.#children[key];if(pattern){possibleKeys.push(pattern[1])}continue}curNode.#children[key]=new _Node2;if(pattern){curNode.#patterns.push(pattern);possibleKeys.push(pattern[1])}curNode=curNode.#children[key]}curNode.#methods.push({[method]:{handler,possibleKeys:possibleKeys.filter((v,i,a)=>a.indexOf(v)===i),score:this.#order}});return curNode}#pushHandlerSets(handlerSets,node,method,nodeParams,params){for(let i=0,len=node.#methods.length;i<len;i++){const m=node.#methods[i];const handlerSet=m[method]||m[METHOD_NAME_ALL];const processedSet={};if(handlerSet!==void 0){handlerSet.params=Object.create(null);handlerSets.push(handlerSet);if(nodeParams!==emptyParams||params&&params!==emptyParams){for(let i2=0,len2=handlerSet.possibleKeys.length;i2<len2;i2++){const key=handlerSet.possibleKeys[i2];const processed=processedSet[handlerSet.score];handlerSet.params[key]=params?.[key]&&!processed?params[key]:nodeParams[key]??params?.[key];processedSet[handlerSet.score]=true}}}}}search(method,path){const handlerSets=[];this.#params=emptyParams;const curNode=this;let curNodes=[curNode];const parts=splitPath(path);const curNodesQueue=[];const len=parts.length;let partOffsets=null;for(let i=0;i<len;i++){const part=parts[i];const isLast=i===len-1;const tempNodes=[];for(let j=0,len2=curNodes.length;j<len2;j++){const node=curNodes[j];const nextNode=node.#children[part];if(nextNode){nextNode.#params=node.#params;if(isLast){if(nextNode.#children["*"]){this.#pushHandlerSets(handlerSets,nextNode.#children["*"],method,node.#params)}this.#pushHandlerSets(handlerSets,nextNode,method,node.#params)}else{tempNodes.push(nextNode)}}for(let k=0,len3=node.#patterns.length;k<len3;k++){const pattern=node.#patterns[k];const params=node.#params===emptyParams?{}:{...node.#params};if(pattern==="*"){const astNode=node.#children["*"];if(astNode){this.#pushHandlerSets(handlerSets,astNode,method,node.#params);astNode.#params=params;tempNodes.push(astNode)}continue}const[key,name,matcher]=pattern;if(!part&&!(matcher instanceof RegExp)){continue}const child=node.#children[key];if(matcher instanceof RegExp){if(partOffsets===null){partOffsets=new Array(len);let offset=path[0]==="/"?1:0;for(let p=0;p<len;p++){partOffsets[p]=offset;offset+=parts[p].length+1}}const restPathString=path.substring(partOffsets[i]);const m=matcher.exec(restPathString);if(m){params[name]=m[0];this.#pushHandlerSets(handlerSets,child,method,node.#params,params);if(m[0].length===restPathString.length&&child.#children["*"]){this.#pushHandlerSets(handlerSets,child.#children["*"],method,node.#params,params)}if(hasChildren(child.#children)){child.#params=params;const componentCount=m[0].match(/\//)?.length??0;const targetCurNodes=curNodesQueue[componentCount]||=[];targetCurNodes.push(child)}continue}}if(matcher===true||matcher.test(part)){params[name]=part;if(isLast){this.#pushHandlerSets(handlerSets,child,method,params,node.#params);if(child.#children["*"]){this.#pushHandlerSets(handlerSets,child.#children["*"],method,params,node.#params)}}else{child.#params=params;tempNodes.push(child)}}}}const shifted=curNodesQueue.shift();curNodes=shifted?tempNodes.concat(shifted):tempNodes}if(handlerSets.length>1){handlerSets.sort((a,b)=>{return a.score-b.score})}return[handlerSets.map(({handler,params})=>[handler,params])]}};var TrieRouter=class{name="TrieRouter";#node;constructor(){this.#node=new Node2}add(method,path,handler){const results=checkOptionalParameter(path);if(results){for(let i=0,len=results.length;i<len;i++){this.#node.insert(method,results[i],handler)}return}this.#node.insert(method,path,handler)}match(method,path){return this.#node.search(method,path)}};var Hono2=class extends Hono{constructor(options={}){super(options);this.router=options.router??new SmartRouter({routers:[new RegExpRouter,new TrieRouter]})}};var validCookieNameRegEx=/^[\w!#$%&'*.^`|~+-]+$/;var validCookieValueRegEx=/^[ !#-:<-[\]-~]*$/;var trimCookieWhitespace=value=>{let start=0;let end=value.length;while(start<end){const charCode=value.charCodeAt(start);if(charCode!==32&&charCode!==9){break}start++}while(end>start){const charCode=value.charCodeAt(end-1);if(charCode!==32&&charCode!==9){break}end--}return start===0&&end===value.length?value:value.slice(start,end)};var parse3=(cookie,name)=>{if(name&&cookie.indexOf(name)===-1){return{}}const pairs=cookie.split(";");const parsedCookie=Object.create(null);for(const pairStr of pairs){const valueStartPos=pairStr.indexOf("=");if(valueStartPos===-1){continue}const cookieName=trimCookieWhitespace(pairStr.substring(0,valueStartPos));if(name&&name!==cookieName||!validCookieNameRegEx.test(cookieName)||cookieName in parsedCookie){continue}let cookieValue=trimCookieWhitespace(pairStr.substring(valueStartPos+1));if(cookieValue.startsWith('"')&&cookieValue.endsWith('"')){cookieValue=cookieValue.slice(1,-1)}if(validCookieValueRegEx.test(cookieValue)){parsedCookie[cookieName]=cookieValue.indexOf("%")!==-1?tryDecode2(cookieValue,decodeURIComponent_):cookieValue;if(name){break}}}return parsedCookie};var _serialize=(name,value,opt={})=>{if(!validCookieNameRegEx.test(name)){throw new Error("Invalid cookie name")}let cookie=`${name}=${value}`;if(name.startsWith("__Secure-")&&!opt.secure){throw new Error("__Secure- Cookie must have Secure attributes")}if(name.startsWith("__Host-")){if(!opt.secure){throw new Error("__Host- Cookie must have Secure attributes")}if(opt.path!=="/"){throw new Error('__Host- Cookie must have Path attributes with "/"')}if(opt.domain){throw new Error("__Host- Cookie must not have Domain attributes")}}for(const key of["domain","path","sameSite","priority"]){if(opt[key]&&/[;\r\n]/.test(opt[key])){throw new Error(`${key} must not contain ";", "\\r", or "\\n"`)}}if(opt&&typeof opt.maxAge==="number"&&opt.maxAge>=0){if(opt.maxAge>3456e4){throw new Error("Cookies Max-Age SHOULD NOT be greater than 400 days (34560000 seconds) in duration.")}cookie+=`; Max-Age=${opt.maxAge|0}`}if(opt.domain&&opt.prefix!=="host"){cookie+=`; Domain=${opt.domain}`}if(opt.path){cookie+=`; Path=${opt.path}`}if(opt.expires){if(opt.expires.getTime()-Date.now()>3456e7){throw new Error("Cookies Expires SHOULD NOT be greater than 400 days (34560000 seconds) in the future.")}cookie+=`; Expires=${opt.expires.toUTCString()}`}if(opt.httpOnly){cookie+="; HttpOnly"}if(opt.secure){cookie+="; Secure"}if(opt.sameSite){cookie+=`; SameSite=${opt.sameSite.charAt(0).toUpperCase()+opt.sameSite.slice(1)}`}if(opt.priority){cookie+=`; Priority=${opt.priority.charAt(0).toUpperCase()+opt.priority.slice(1)}`}if(opt.partitioned){if(!opt.secure){throw new Error("Partitioned Cookie must have Secure attributes")}cookie+="; Partitioned"}return cookie};var serialize=(name,value,opt)=>{value=encodeURIComponent(value);return _serialize(name,value,opt)};var getCookie=(c,key,prefix)=>{const cookie=c.req.raw.headers.get("Cookie");if(typeof key==="string"){if(!cookie){return void 0}let finalKey=key;if(prefix==="secure"){finalKey="__Secure-"+key}else if(prefix==="host"){finalKey="__Host-"+key}const obj2=parse3(cookie,finalKey);return obj2[finalKey]}if(!cookie){return{}}const obj=parse3(cookie);return obj};var generateCookie=(name,value,opt)=>{let cookie;if(opt?.prefix==="secure"){cookie=serialize("__Secure-"+name,value,{path:"/",...opt,secure:true})}else if(opt?.prefix==="host"){cookie=serialize("__Host-"+name,value,{...opt,path:"/",secure:true,domain:void 0})}else{cookie=serialize(name,value,{path:"/",...opt})}return cookie};var setCookie=(c,name,value,opt)=>{const cookie=generateCookie(name,value,opt);c.header("Set-Cookie",cookie,{append:true})};var API_PREFIX="/api/v2";var HOST="127.0.0.1";var RUNTIME_KIND="zaip-dashboard-local-runtime";var SESSION_COOKIE="zaip-dashboard-session";var DASHBOARD_CONFIG_PATH=".agents/dashboard/dashboard.config.json";var ACTIVE_WORK_PATH2=".agents/projections/runtime/active-work.json";var OPEN_WORK_KINDS=new Set(["prd","spec","change","task","execution"]);var OPEN_WORK_STATUSES=new Set(["active","executing","verifying","running","paused"]);var execFileAsync2=promisify2(execFile2);var V2WorkspaceRequiredError=class extends Error{name="V2WorkspaceRequiredError"};function isAllowedOrigin(origin){try{const parsed=new URL(origin);return parsed.protocol==="http:"&&(parsed.hostname===HOST||parsed.hostname==="localhost")}catch{return false}}function isSafeUiPath(pathname){try{const decoded=decodeURIComponent(pathname).replaceAll("\\","/");return!decoded.includes("\0")&&!decoded.split("/").some(segment=>segment==="..")}catch{return false}}function defaultSessionToken(){return process.env.ZAIP_UI_TOKEN??randomBytes2(24).toString("base64url")}function shouldBootstrapBrowserSession(context){if(context.req.method!=="GET"&&context.req.method!=="HEAD")return false;if(context.req.path!=="/"&&context.req.path!=="/index.html")return false;const origin=context.req.header("origin");if(origin!==void 0&&!isAllowedOrigin(origin))return false;return context.req.header("sec-fetch-site")!=="cross-site"}async function dashboardIdentity(filesystem,workspaceRoot){let title=process.env.ZAIP_DASHBOARD_TITLE?.trim()||"Dashboard Zaip AIOS";let repositorySetting="auto";try{if(await filesystem.exists(DASHBOARD_CONFIG_PATH)){const config2=JSON.parse(await filesystem.readText(DASHBOARD_CONFIG_PATH));if(typeof config2.title==="string"&&config2.title.trim())title=config2.title.trim();if(typeof config2.github_repository==="string"){repositorySetting=config2.github_repository.trim()}}}catch{}if(repositorySetting.toLowerCase()!=="auto"){return{title,repository_name:githubRepositoryFromRemote(repositorySetting)??""}}try{const{stdout}=await execFileAsync2("git",["-C",workspaceRoot,"remote","get-url","origin"],{encoding:"utf8",windowsHide:true});return{title,repository_name:githubRepositoryFromRemote(stdout)??""}}catch{}return{title,repository_name:""}}function githubRepositoryFromRemote(remote){const trimmed=remote.trim();const match2=trimmed.match(/github\.com(?::|\/)([^/\s]+)\/([^/\s]+?)(?:\.git)?$/i)??trimmed.match(/^([^/:\s]+)\/([^/\s]+?)(?:\.git)?$/);return match2?`${match2[1]}/${match2[2]}`:null}function dashboardWorkspaceKey(workspaceRoot){return createHash4("sha256").update(resolve2(workspaceRoot)).digest("hex").slice(0,16)}function openWorkIds(items){return items.filter(item=>OPEN_WORK_KINDS.has(item.kind)&&(OPEN_WORK_STATUSES.has(item.status??"")||item.kind==="task"&&item.status==="planned")).map(item=>item.id).sort()}async function reconcileOpenWork(filesystem,workspaceRoot){if(!await filesystem.exists(ACTIVE_WORK_PATH2))return[];const activeWork=JSON.parse(await filesystem.readText(ACTIVE_WORK_PATH2));const ids=openWorkIds(activeWork.items??[]);if(ids.length===0)return[];const cliPath=resolve2(workspaceRoot,".zaip-aios","bin","zaip.mjs");const{stdout}=await execFileAsync2(process.execPath,[cliPath,"run","reconcile","--open","--json"],{cwd:workspaceRoot,windowsHide:true,timeout:12e4,maxBuffer:10*1024*1024});return reconciledLifecycleIds(JSON.parse(stdout))}function reconciledLifecycleIds(value){const ids=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"&&/^(?:PRD|SPEC|CHG|TASK|EXEC)-/.test(record2.id)){ids.add(record2.id)}if(typeof record2.run_id==="string"&&record2.run_id.startsWith("RUN-")){ids.add(record2.run_id)}Object.values(record2).forEach(visit)};visit(value);return[...ids].sort()}async function requireV2Layout(filesystem){const layout=await loadWorkspaceLayout(filesystem);if(layout.version===1){throw new V2WorkspaceRequiredError("Dashboard API requires a modern ZAIP-AIOS workspace")}return layout}function headOrJson(context,payload,status=200){if(context.req.method==="HEAD")return context.body(null,status);return context.json(payload,status)}function createDashboardApp(workspaceRoot=process.env.ZAIP_WORKSPACE??process.cwd(),sessionToken2=defaultSessionToken(),uiRoot=resolve2(process.env.ZAIP_UI_ROOT??"./dist")){const app2=new Hono2;const filesystem=new WorkspaceFileSystem(workspaceRoot);const workspaceKey=dashboardWorkspaceKey(workspaceRoot);app2.use("*",async(context,next)=>{context.header("Cache-Control","no-store");context.header("X-Content-Type-Options","nosniff");context.header("Referrer-Policy","no-referrer");context.header("Content-Security-Policy","default-src 'self'; script-src 'self'; style-src 'self'; connect-src 'self'; object-src 'none'; frame-ancestors 'none'");if(shouldBootstrapBrowserSession(context)){setCookie(context,SESSION_COOKIE,sessionToken2,{httpOnly:true,path:"/",sameSite:"Strict"})}return next()});app2.use(`${API_PREFIX}/*`,async(context,next)=>{const settingsWrite=context.req.method==="PUT"&&(context.req.path===`${API_PREFIX}/pricing`||context.req.path===`${API_PREFIX}/fx-rate`);const reconcileWrite=context.req.method==="POST"&&context.req.path===`${API_PREFIX}/reconcile-open-work`;if(context.req.method!=="GET"&&context.req.method!=="HEAD"&&!settingsWrite&&!reconcileWrite){context.header("Allow",context.req.path===`${API_PREFIX}/pricing`||context.req.path===`${API_PREFIX}/fx-rate`?"GET, HEAD, PUT":context.req.path===`${API_PREFIX}/reconcile-open-work`?"POST":"GET, HEAD");return context.json({error:"Dashboard API is read-only"},405)}if(context.req.path===`${API_PREFIX}/health`)return next();const origin=context.req.header("origin");if(origin!==void 0&&!isAllowedOrigin(origin)){return context.json({error:"Origin rejected"},403)}const headerSession=context.req.header("x-zaip-session");const cookieSession=getCookie(context,SESSION_COOKIE);if(headerSession!==sessionToken2&&cookieSession!==sessionToken2){return context.json({error:"Invalid local session"},401)}return next()});app2.on(["GET","HEAD"],`${API_PREFIX}/health`,async context=>{try{const layout=await requireV2Layout(filesystem);return headOrJson(context,{kind:RUNTIME_KIND,workspaceKey,service:"zaip-aios-dashboard",status:"ok",api_version:2,workspace_layout:layout.version,read_only:true})}catch(error51){return headOrJson(context,{kind:RUNTIME_KIND,workspaceKey,service:"zaip-aios-dashboard",status:"unavailable",api_version:2,read_only:true,error:error51 instanceof Error?error51.message:String(error51)},503)}});app2.on(["GET","HEAD"],`${API_PREFIX}/operations`,async context=>{try{const layout=await requireV2Layout(filesystem);const from=context.req.query("from")??null;const to=context.req.query("to")??null;const projection=await buildLocalOperationsProjection(filesystem,layout,{from,to});return headOrJson(context,projection)}catch(error51){if(error51 instanceof V2WorkspaceRequiredError)throw error51;return headOrJson(context,{error:error51 instanceof Error?error51.message:String(error51)},400)}});app2.on(["GET","HEAD"],`${API_PREFIX}/snapshot`,async context=>{try{return headOrJson(context,await dashboardSnapshot(filesystem,workspaceRoot,context))}catch(error51){if(error51 instanceof V2WorkspaceRequiredError)throw error51;return headOrJson(context,{error:error51 instanceof Error?error51.message:String(error51)},400)}});app2.post(`${API_PREFIX}/reconcile-open-work`,async context=>{try{await requireV2Layout(filesystem);const reconciledIds=await reconcileOpenWork(filesystem,workspaceRoot);return context.json({...await dashboardSnapshot(filesystem,workspaceRoot,context),reconciliation:{reconciled_ids:reconciledIds}})}catch(error51){if(error51 instanceof V2WorkspaceRequiredError)throw error51;return context.json({error:error51 instanceof Error?error51.message:String(error51)},400)}});app2.on(["GET","HEAD"],`${API_PREFIX}/cost-monitor`,async context=>{try{const layout=await requireV2Layout(filesystem);const from=context.req.query("from")??null;const to=context.req.query("to")??null;const operations=await buildLocalOperationsProjection(filesystem,layout,{from,to});return headOrJson(context,await buildCurrentCostProjection(filesystem,operations,selectedCurrency(context)))}catch(error51){if(error51 instanceof V2WorkspaceRequiredError)throw error51;return headOrJson(context,{error:error51 instanceof Error?error51.message:String(error51)},400)}});app2.on(["GET","HEAD"],`${API_PREFIX}/pricing`,async context=>headOrJson(context,pricingCatalogSchema.parse(JSON.parse(await filesystem.readText(".zaip-aios/pricing/models.json")))));app2.put(`${API_PREFIX}/pricing`,async context=>{const catalog=pricingCatalogSchema.parse({...await context.req.json(),updated_at:new Date().toISOString()});await filesystem.writeTextAtomic(".zaip-aios/pricing/models.json",`${JSON.stringify(catalog,null,2)}
178
- `);return context.json(catalog)});app2.on(["GET","HEAD"],`${API_PREFIX}/fx-rate`,async context=>{const rate=await new PricingRepository(filesystem).readLatestFxRate();return headOrJson(context,rate)});app2.put(`${API_PREFIX}/fx-rate`,async context=>{const input=fxRateSchema.pick({rate:true}).parse(await context.req.json());const rate=await new PricingRepository(filesystem).writeCurrentFxRate(input.rate);return context.json(rate)});app2.on(["GET","HEAD"],`${API_PREFIX}/tasks/:id`,async context=>{try{const layout=await requireV2Layout(filesystem);return headOrJson(context,await readTaskDetail(filesystem,layout,context.req.param("id")))}catch(error51){if(error51 instanceof V2WorkspaceRequiredError)throw error51;return headOrJson(context,{error:"Task not found"},404)}});app2.on(["GET","HEAD"],`${API_PREFIX}/prds/:id`,async context=>{try{const layout=await requireV2Layout(filesystem);return headOrJson(context,await readPrdDetail(filesystem,layout,context.req.param("id")))}catch(error51){if(error51 instanceof V2WorkspaceRequiredError)throw error51;return headOrJson(context,{error:"PRD not found"},404)}});app2.on(["GET","HEAD"],`${API_PREFIX}/tasks/:id/trace`,async context=>{try{const layout=await requireV2Layout(filesystem);return headOrJson(context,await buildTaskTrace(filesystem,layout,context.req.param("id")))}catch(error51){if(error51 instanceof V2WorkspaceRequiredError)throw error51;return headOrJson(context,{error:"Task trace not found"},404)}});app2.onError((error51,context)=>{const status=error51 instanceof V2WorkspaceRequiredError?409:500;return headOrJson(context,{error:status===409?error51.message:"Dashboard projection failed"},status)});app2.all(`${API_PREFIX}/*`,context=>headOrJson(context,{error:"Not found"},404));app2.use("/*",async(context,next)=>{if(!isSafeUiPath(context.req.path)){return context.json({error:"Invalid dashboard asset path"},400)}return next()});app2.use("/*",serveStatic({root:uiRoot}));app2.get("*",serveStatic({path:`${uiRoot}/index.html`}));return app2}function selectedCurrency(context){return context.req.query("currency")==="USD"?"USD":"BRL"}async function dashboardSnapshot(filesystem,workspaceRoot,context){const layout=await requireV2Layout(filesystem);const from=context.req.query("from")??null;const to=context.req.query("to")??null;const operations=await buildLocalOperationsProjection(filesystem,layout,{from,to});const costs=await buildCurrentCostProjection(filesystem,operations,selectedCurrency(context));return{operations,costs,dashboard:await dashboardIdentity(filesystem,workspaceRoot),projection:{source_latest_at:operations.summary.source_latest_at,served_at:new Date().toISOString()}}}async function buildCurrentCostProjection(filesystem,operations,currency){const pricing=new PricingRepository(filesystem);const[catalog,fxRate]=await Promise.all([pricing.readCatalog(),currency==="BRL"?pricing.readLatestFxRate():Promise.resolve(null)]);const agentNames=await configuredAgentNames(filesystem);return buildCostMonitorProjection(operations,{catalog,fxRate,currency},agentNames)}async function configuredAgentNames(filesystem){try{const source=await filesystem.readText(".agents/config/agents/catalog.yaml");const agents=parseAgentCatalog(parseYaml(source)).agents;return{agentNames:agents.map(agent=>agent.codex_name),agentNamesById:Object.fromEntries(agents.map(agent=>[agent.id,agent.codex_name])),agentNamesByRole:Object.fromEntries(agents.map(agent=>[agent.role,agent.codex_name]))}}catch{return{agentNames:[],agentNamesById:{},agentNamesByRole:{}}}}var sessionToken=defaultSessionToken();var app=createDashboardApp(process.env.ZAIP_WORKSPACE??process.cwd(),sessionToken);var isMain=process.argv[1]?resolve2(process.argv[1])===fileURLToPath(import.meta.url):false;if(isMain){const port=Number.parseInt(process.env.ZAIP_SERVER_PORT??"4317",10);serve({fetch:app.fetch,hostname:HOST,port},({port:boundPort})=>{process.stdout.write(`ZAIP-AIOS dashboard API: http://${HOST}:${boundPort}${API_PREFIX}/health
198
+ `);return context.json(catalog)});app2.on(["GET","HEAD"],`${API_PREFIX}/fx-rate`,async context=>{const rate=await new PricingRepository(filesystem).readLatestFxRate();return headOrJson(context,rate)});app2.put(`${API_PREFIX}/fx-rate`,async context=>{const input=fxRateSchema.pick({rate:true}).parse(await context.req.json());const rate=await new PricingRepository(filesystem).writeCurrentFxRate(input.rate);return context.json(rate)});app2.on(["GET","HEAD"],`${API_PREFIX}/tasks/:id`,async context=>{try{const layout=await requireV2Layout(filesystem);return headOrJson(context,await readTaskDetail(filesystem,layout,context.req.param("id")))}catch(error51){if(error51 instanceof V2WorkspaceRequiredError)throw error51;return headOrJson(context,{error:"Task not found"},404)}});app2.on(["GET","HEAD"],`${API_PREFIX}/prds/:id`,async context=>{try{const layout=await requireV2Layout(filesystem);return headOrJson(context,await readPrdDetail(filesystem,layout,context.req.param("id")))}catch(error51){if(error51 instanceof V2WorkspaceRequiredError)throw error51;return headOrJson(context,{error:"PRD not found"},404)}});app2.on(["GET","HEAD"],`${API_PREFIX}/specs/:id`,async context=>{try{const layout=await requireV2Layout(filesystem);return headOrJson(context,await readSpecDetail(filesystem,layout,context.req.param("id")))}catch(error51){if(error51 instanceof V2WorkspaceRequiredError)throw error51;return headOrJson(context,{error:"SPEC not found"},404)}});app2.on(["GET","HEAD"],`${API_PREFIX}/tasks/:id/trace`,async context=>{try{const layout=await requireV2Layout(filesystem);return headOrJson(context,await buildTaskTrace(filesystem,layout,context.req.param("id")))}catch(error51){if(error51 instanceof V2WorkspaceRequiredError)throw error51;return headOrJson(context,{error:"Task trace not found"},404)}});app2.onError((error51,context)=>{const status=error51 instanceof V2WorkspaceRequiredError?409:500;return headOrJson(context,{error:status===409?error51.message:"Dashboard projection failed"},status)});app2.all(`${API_PREFIX}/*`,context=>headOrJson(context,{error:"Not found"},404));app2.use("/*",async(context,next)=>{if(!isSafeUiPath(context.req.path)){return context.json({error:"Invalid dashboard asset path"},400)}return next()});app2.use("/*",serveStatic({root:uiRoot}));app2.get("*",serveStatic({path:`${uiRoot}/index.html`}));return app2}function selectedCurrency(context){return context.req.query("currency")==="USD"?"USD":"BRL"}async function dashboardSnapshot(filesystem,workspaceRoot,context){const layout=await requireV2Layout(filesystem);const from=context.req.query("from")??null;const to=context.req.query("to")??null;const operations=await buildLocalOperationsProjection(filesystem,layout,{from,to});const costs=await buildCurrentCostProjection(filesystem,operations,selectedCurrency(context));return{operations,costs,dashboard:await dashboardIdentity(filesystem,workspaceRoot),projection:{source_latest_at:operations.summary.source_latest_at,served_at:new Date().toISOString()}}}async function buildCurrentCostProjection(filesystem,operations,currency){const pricing=new PricingRepository(filesystem);const[catalog,fxRate]=await Promise.all([pricing.readCatalog(),currency==="BRL"?pricing.readLatestFxRate():Promise.resolve(null)]);const agentNames=await configuredAgentNames(filesystem);return buildCostMonitorProjection(operations,{catalog,fxRate,currency},agentNames)}async function configuredAgentNames(filesystem){try{const source=await filesystem.readText(".agents/config/agents/catalog.yaml");const agents=parseAgentCatalog(parseYaml(source)).agents;return{agentNames:agents.map(agent=>agent.codex_name),agentNamesById:Object.fromEntries(agents.map(agent=>[agent.id,agent.codex_name])),agentNamesByRole:Object.fromEntries(agents.map(agent=>[agent.role,agent.codex_name]))}}catch{return{agentNames:[],agentNamesById:{},agentNamesByRole:{}}}}var sessionToken=defaultSessionToken();var app=createDashboardApp(process.env.ZAIP_WORKSPACE??process.cwd(),sessionToken);var isMain=process.argv[1]?resolve2(process.argv[1])===fileURLToPath(import.meta.url):false;if(isMain){const port=Number.parseInt(process.env.ZAIP_SERVER_PORT??"4317",10);serve({fetch:app.fetch,hostname:HOST,port},({port:boundPort})=>{process.stdout.write(`ZAIP-AIOS dashboard API: http://${HOST}:${boundPort}${API_PREFIX}/health
179
199
  `)})}export{app,createDashboardApp,dashboardWorkspaceKey,githubRepositoryFromRemote,openWorkIds};