@gobing-ai/spur 0.4.6 → 0.4.7

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.
@@ -3062,7 +3062,7 @@ ${DURABLE_PLANE_EXCLUDE}
3062
3062
  `),{ok:!0,data:{value:row.value,decision:row}});if(!this.deps.enabled){let description=(await this.service())?.describe(options.decision);if(description===void 0)return{ok:!1,error:`${DECIDE_KIND}: catalog decision "${options.decision}" cannot run — the decision service is unavailable`};if(!isDecidableType(description.type))return{ok:!1,error:`${DECIDE_KIND}: decision "${options.decision}" has type "${description.type}"; workflow decide supports choice and noul`};return await writeRow(this.degradedCatalogRow({fallback:description.fallback,type:description.type},options.id,"disabled"))}let decisionService=await this.service();if(decisionService===void 0)return{ok:!1,error:`${DECIDE_KIND}: catalog decision "${options.decision}" cannot run — the decision service is unavailable`};let sink=this.deps.decisionLog,rejectedLog=(prelude)=>sink!==void 0?{sink,startedAt:Date.now(),phases:[],...prelude!==void 0?{prelude}:{}}:void 0,description;try{description=decisionService.describe(options.decision)}catch(error){return emitDecisionRejected(bus,callContext,error,void 0,rejectedLog()),{ok:!1,error:`${DECIDE_KIND}: ${error instanceof Error?error.message:String(error)}`}}if(!isDecidableType(description.type))return{ok:!1,error:`${DECIDE_KIND}: decision "${options.decision}" has type "${description.type}"; workflow decide supports choice and noul`};if(options.params?.instructions!==void 0)return{ok:!1,error:`${DECIDE_KIND}: params.instructions is reserved — pass implicit input through the instructions option or evidence`};let instructionsText,evidencePrelude;if(sink!==void 0)evidencePrelude={startedAt:Date.now(),phases:[]};try{if(options.evidence!==void 0&&options.evidence.length>0)instructionsText=(await readDecisionEvidence(options.evidence.map((path)=>resolveWorkdirPath(workdir,path)),async(path)=>await this.fileSystem.readFile(path))).join(`
3063
3063
 
3064
3064
  `);else if(options.instructions!==void 0)instructionsText=options.instructions;if(evidencePrelude!==void 0)evidencePrelude.phases.push({phase:"evidence",startedAt:evidencePrelude.startedAt,durationMs:Date.now()-evidencePrelude.startedAt})}catch(error){return emitDecisionRejected(bus,callContext,error,void 0,rejectedLog(evidencePrelude)),await writeRow(this.degradedCatalogRow({fallback:description.fallback,type:description.type},options.id,"error"))}let input={...options.params,...instructionsText!==void 0?{instructions:instructionsText}:{}},served=await decisionService.decide(options.decision,input,{context:{caller:"workflow",correlation:callContext.correlation},...bus!==void 0?{bus}:{},...sink!==void 0&&evidencePrelude!==void 0?{decisionLog:{sink,prelude:evidencePrelude}}:{}});if(served.type!=="choice"&&served.type!=="noul")return{ok:!1,error:`${DECIDE_KIND}: decision "${options.decision}" has type "${served.type}"; workflow decide supports choice and noul`};return await writeRow(this.catalogRow({...served,type:served.type},options.id))}}function isDecidableType(type){return type==="choice"||type==="noul"}import{dirname as dirname12,join as join17}from"node:path";async function readVerdictFrom(fs,path,wbs){let exists;try{exists=await fs.exists(path)}catch{exists=!0}if(!exists)return{artifact:void 0,path,missing:!0};let raw;try{raw=await fs.readFile(path)}catch(err){let message=err.message;if(message.includes("ENOENT"))return{artifact:void 0,path,missing:!0};return{artifact:void 0,path,readError:`unreadable artifact: ${message}`,missing:!1}}let parsed;try{parsed=JSON.parse(raw)}catch(err){return{artifact:void 0,path,readError:`malformed JSON: ${err.message}`,missing:!1}}if(typeof parsed!=="object"||parsed===null||!("verdict"in parsed))return{artifact:void 0,path,readError:"missing required `verdict` field",missing:!1};if("wbs"in parsed){let artifactWbs=parsed.wbs,actual=typeof artifactWbs==="string"?JSON.stringify(artifactWbs):String(artifactWbs);if(typeof artifactWbs!=="string"||artifactWbs!==wbs)return{artifact:void 0,path,readError:`artifact identity mismatch at ${path}: expected wbs '${wbs}', actual ${actual}`,missing:!1}}return{artifact:parsed,path,missing:!1}}async function readVerdictArtifact(fs,runDir,wbs){let evidenceDir=join17(dirname12(runDir),"memory","evidence"),evidence=await readVerdictFrom(fs,`${evidenceDir}/${wbs}-verdict.json`,wbs);if(!evidence.missing){let{missing:_missing,...result}=evidence;return result}let scratch=await readVerdictFrom(fs,`${runDir}/${wbs}-verdict.json`,wbs),{missing:_scratchMissing,...result}=scratch;return result}function computeAggregate(artifact){let reqs=artifact.requirements??[],acs=artifact.acceptanceCriteria??[];if(reqs.length===0&&acs.length===0)return artifact.verdict;let taskCheck=(artifact.checks??[]).find((c)=>/task[ _-]?check/i.test(checkRowName(c))),taskCheckPassed=taskCheck===void 0?!0:String(taskCheck.status).toLowerCase()!=="fail";return aggregateVerifyVerdict({requirements:reqs,acceptanceCriteria:acs,checks:artifact.checks??[],taskCheckPassed})}import{basename as basename4,isAbsolute as isAbsolute3,join as join18,resolve as resolve8}from"node:path";init_dist5();init_dist2();var EMBEDDED_SCHEMA_PREFIX="\x00embedded-spur",SPUR_SCHEMA_MANIFEST="@gobing-ai/spur/package.json";function normalizeLayerPath(cwd,path){return resolve8(cwd,path)}function workflowLayers(opts){let sharedRoot=opts.sharedRoot!==void 0?opts.sharedRoot:bundledConfigRoot(),sharedPath=sharedRoot!==null?normalizeLayerPath(opts.cwd,join18(sharedRoot,"workflows")):null,layers=[],seen=new Set,add=(id,path)=>{if(seen.has(path))return;seen.add(path),layers.push({id,path})};add("project",normalizeLayerPath(opts.cwd,join18(opts.cwd,".spur","workflows")));for(let entry of opts.registered){if(sharedPath!==null&&normalizeLayerPath(opts.cwd,entry)===sharedPath)continue;add("registered",normalizeLayerPath(opts.cwd,entry))}if(sharedPath!==null)add("shared",sharedPath);return layers}function createEmbeddedSchemaOptions(embedded){if(embedded===void 0||embedded.size===0)return;let nodeFs=createNodeFileSystem();return{resolve:(specifier)=>specifier===SPUR_SCHEMA_MANIFEST?`${EMBEDDED_SCHEMA_PREFIX}/package.json`:specifier,fileSystem:{readFile:async(path)=>{if(!path.startsWith(EMBEDDED_SCHEMA_PREFIX))return nodeFs.readFile(path);let subpath=path.slice(EMBEDDED_SCHEMA_PREFIX.length+1),text=embedded.get(subpath);if(text===void 0)throw Error(`No embedded schema registered for "${subpath}".`);return text}}}}async function readWorkflowNameFast(fs,filePath){try{let text=await fs.readFile(filePath),parsed=$parse(text);return typeof parsed?.name==="string"?parsed.name:null}catch{return null}}async function scanWorkflowByName(cwd,name,registered){let fs=createNodeFileSystem();for(let layer of workflowLayers({cwd,registered}))try{let files=(await fs.readDir(layer.path)).filter((f)=>f.endsWith(".yaml")||f.endsWith(".yml"));for(let f of files){let abs=join18(layer.path,f);if(await readWorkflowNameFast(fs,abs)===name)return{path:abs,source:layer.id}}}catch{}return null}function resolveWorkflowFile(cwd,file){let fs=createNodeFileSystem(),projectPath=resolve8(cwd,file);if(fs.exists(projectPath))return{path:projectPath,source:"project"};let isYaml=file.endsWith(".yaml")||file.endsWith(".yml"),base=basename4(file);if(!isAbsolute3(file)){let withYaml=isYaml?file:`${file}.yaml`,projectSpur=resolve8(cwd,".spur","workflows",withYaml);if(fs.exists(projectSpur))return{path:projectSpur,source:"project"};if(!isYaml){let projectDirect=resolve8(cwd,`${file}.yaml`);if(fs.exists(projectDirect))return{path:projectDirect,source:"project"};let projectSpurPipeline=resolve8(cwd,".spur","workflows",`${file}-pipeline.yaml`);if(fs.exists(projectSpurPipeline))return{path:projectSpurPipeline,source:"project"};let projectDirectPipeline=resolve8(cwd,`${file}-pipeline.yaml`);if(fs.exists(projectDirectPipeline))return{path:projectDirectPipeline,source:"project"}}}let bundledRoot=bundledConfigRoot();if(bundledRoot!==null){let sharedName=isYaml?base:`${base}.yaml`,sharedPath=join18(bundledRoot,"workflows",sharedName);if(fs.exists(sharedPath))return{path:sharedPath,source:"shared"};if(!isYaml){let sharedPipeline=join18(bundledRoot,"workflows",`${base}-pipeline.yaml`);if(fs.exists(sharedPipeline))return{path:sharedPipeline,source:"shared"};let sharedLiteral=join18(bundledRoot,"workflows",base);if(fs.exists(sharedLiteral))return{path:sharedLiteral,source:"shared"}}return{path:null,probed:[projectPath,sharedPath]}}return{path:null,probed:[projectPath,null]}}async function resolveWorkflowDefinition(cwd,fileOrName,options={}){let registered=options.registered??[],resolved=(basename4(fileOrName)===fileOrName&&!/\.ya?ml$/.test(fileOrName)&&!createNodeFileSystem().exists(resolve8(cwd,fileOrName))?await scanWorkflowByName(cwd,fileOrName,registered):null)??resolveWorkflowFile(cwd,fileOrName);if(resolved.path===null){let scanned=await scanWorkflowByName(cwd,fileOrName,registered);if(scanned!==null)resolved=scanned;else{let[probedProject,probedShared]=resolved.probed;throw Error(`Workflow not found: ${probedProject}${probedShared!==null?` (shared: ${probedShared})`:""}`)}}let embedded=createEmbeddedSchemaOptions(options.embeddedSchemas),workflow=await loadWorkflowDef(resolved.path,{validateSchema:options.validateSchema!==!1,...embedded!==void 0?embedded:{}});if(workflow.version==="")throw Error(`Invalid workflow definition ${resolved.path}: root "version" is an empty string. Omit the field for an unversioned definition, or give it a non-empty literal.`);let digest=computeDefinitionDigest(workflow);return{path:resolved.path,workflow,digest,layer:resolved.source}}var REQUIRED_REFERENCE_CODES=new Set([FINDING_CODES.L4_FEATURE_NOT_FOUND,FINDING_CODES.L4_PARENT_NOT_FOUND,FINDING_CODES.L4_DEPENDENCY_NOT_FOUND,FINDING_CODES.L4_LINKED_TASK_PARSE_FAILED]),COMPLETION_FINDING_CODES=new Set([FINDING_CODES.L4_ORPHAN_SCENARIOS,FINDING_CODES.L4_UNCOVERED_FEATURE_SCENARIO,FINDING_CODES.L4_SCENARIO_UNVERIFIED,FINDING_CODES.L4_VERIFYING_INCOMPLETE_TASKS,FINDING_CODES.L4_VERDICT_ROWS_MATCH_NO_SCENARIO,FINDING_CODES.L4_MALFORMED_VERDICT_ARTIFACT,FINDING_CODES.L4_EVIDENCE_NOT_RECOVERABLE,FINDING_CODES.L4_DOGFOOD_MISSING,FINDING_CODES.L4_TESTING_VERDICT_STUB,FINDING_CODES.L4_UNCOVERED_TASK_SCENARIO,FINDING_CODES.L4_FEATURE_RECEIPT_MISSING,FINDING_CODES.L4_FEATURE_RECEIPT_MALFORMED,FINDING_CODES.L4_FEATURE_RECEIPT_CROSS_FEATURE,FINDING_CODES.L4_FEATURE_RECEIPT_DIVERGENT,FINDING_CODES.L4_FEATURE_RECEIPT_FAILED,FINDING_CODES.L4_FEATURE_RECEIPT_RUN,FINDING_CODES.L4_FEATURE_RECEIPT_STALE,FINDING_CODES.L4_FEATURE_RECEIPT_CONTRACT,FINDING_CODES.L4_FEATURE_RECEIPT_CONFIDENCE,FINDING_CODES.L3_REVIEW_TESTING_CONTRADICTION,FINDING_CODES.L4_ROLLUP_SUBTASKS_OPEN,FINDING_CODES.L4_ROLLUP_MISSING_ROSTER,FINDING_CODES.L4_ROLLUP_ROSTER_NOT_DECLARED_DEPENDENCY]),REQUIRED_FINDING_CODES=new Set([FINDING_CODES.L1_MARKDOWN_PARSE,FINDING_CODES.L1_SCHEMA_VALIDATION,FINDING_CODES.L2_MISSING_REQUIRED_SECTION,FINDING_CODES.L2_UNCLOSED_CODE_FENCE,FINDING_CODES.L3_AC_BDD_ERROR,FINDING_CODES.L3_AC_BDD_INVALID,FINDING_CODES.L3_REQUIREMENTS_EMPTY,FINDING_CODES.L3_AC_EMPTY,FINDING_CODES.L3_REQUIRED_SECTION_PLACEHOLDER,...REQUIRED_REFERENCE_CODES,FINDING_CODES.L4_PREREQUISITE_CYCLE,...COMPLETION_FINDING_CODES,FINDING_CODES.PRECHECK_SIZE,FINDING_CODES.PRECHECK_EVIDENCE,FINDING_CODES.INVENTORY_COVERAGE]);function parseVerdictLine(lines){for(let line of lines){let m=/^(?:-\s*|\*\*)?Verdict:\s*(PASS|PARTIAL|FAIL|UNKNOWN)\b/i.exec(line.trim());if(m){let v=m[1]?.toUpperCase();if(v==="PASS"||v==="PARTIAL"||v==="FAIL"||v==="UNKNOWN")return v}}return null}var SOLUTION_EXCLUDED_LOCKFILES=new Set(["bun.lock","bun.lockb","package-lock.json","yarn.lock","pnpm-lock.yaml"]),SOLUTION_EXCLUDED_PATHSPECS=[".spur/**",...SOLUTION_EXCLUDED_LOCKFILES],SOLUTION_EXCLUDE_PATHSPECS=SOLUTION_EXCLUDED_PATHSPECS.map((p)=>`:(exclude)${p}`);import{isAbsolute as isAbsolute4,resolve as resolve9,sep as sep4}from"node:path";var DISTRIBUTION_SEGMENTS=[`${sep4}plugins${sep4}sp${sep4}`,`${sep4}node_modules${sep4}@gobing-ai${sep4}spur${sep4}`];var TASK_LIFECYCLE_PROFILE={linkKind:"lifecycle",workflowName:"task-lifecycle",entityPrefix:"task",varKey:"wbs"};async function reconcileExistingLifecycleRow(getDb,profile,entityId,toStatus){if(toStatus!=="done"&&toStatus!=="cancelled")return!1;let persistence=new DbWorkflowPersistenceAdapter(await getDb()),run=await persistence.findRunByKey(profile.workflowName,`${profile.entityPrefix}:${entityId}`);if(run===void 0)return!1;let engineStatus=toStatus==="cancelled"?"failed":"done";if(run.status===engineStatus&&run.terminal_reason===toStatus)return!1;return await persistence.finalizeRun(run.id,engineStatus,new Date().toISOString(),void 0,toStatus),!0}function readProvenance(resultJson){if(resultJson===null)return{provenance:"unknown",estimated:!1};try{let parsed=JSON.parse(resultJson);if(parsed?.provenance!=="host-reported")return{provenance:"unknown",estimated:!1};return{provenance:"host-reported",estimated:parsed.estimated===!0}}catch{return{provenance:"unknown",estimated:!1}}}function deriveInlineStateVisits(defStates,rows){let declaredStateIds=new Set(defStates.map((state)=>state.id)),visits=[],visitCounts={};for(let row of rows){if(!declaredStateIds.has(row.node))continue;let open=visits[visits.length-1];if(open&&open.state===row.node){open.rows.push(row);continue}let visit=(visitCounts[row.node]??0)+1;visitCounts[row.node]=visit,visits.push({state:row.node,visit,rows:[row]})}return visits}async function projectWorkflowProgress(runId,options){let projectRoot=options.projectRoot??process.cwd(),projectedAt=new Date().toISOString(),diagnostics=[],runDao=new RunDao(options.db),actionRunDao=new ActionRunDao(options.db),transitionRunDao=new TransitionRunDao(options.db),artifactDao=new ArtifactDao(options.db),runRow=await runDao.traceRowById(runId);if(!runRow)return diagnostics.push({code:"orphan-row",message:`No workflow run found with id "${runId}"`}),{schemaVersion:1,runId,workflow:"unknown",status:"unknown",definitionDigest:null,currentState:null,states:[],transitions:[],artifacts:[],nextTransitions:[],diagnostics,projectedAt};let rawMeta={};try{if(runRow.metadata_json)rawMeta=JSON.parse(runRow.metadata_json)}catch{}let recordedDigest=typeof rawMeta.definitionDigest==="string"?rawMeta.definitionDigest:null,recordedVersion="workflowVersion"in rawMeta&&(typeof rawMeta.workflowVersion==="string"||rawMeta.workflowVersion===null)?rawMeta.workflowVersion:void 0,normalizedStatus="unknown",statusLower=(runRow.status??"").toLowerCase();if(statusLower==="done"||statusLower==="completed")normalizedStatus="completed";else if(statusLower==="running")normalizedStatus="running";else if(statusLower==="pending")normalizedStatus="pending";else if(statusLower==="failed")normalizedStatus="failed";else if(statusLower==="cancelled")normalizedStatus="cancelled";let transitionRows=await transitionRunDao.transitionRowsByRunId(runId),actionRows=await actionRunDao.actionRowsByRunId(runId),artifactRows=await artifactDao.artifactsByRunId(runId),transitions=transitionRows.map((t)=>({from:t.from_state,to:t.to_state,trigger:t.trigger??null,at:new Date(t.created_at).toISOString()})),currentState=null;if(transitions.length>0)currentState=transitions[transitions.length-1]?.to??null;let workflowDef=options.workflowDef,workflowName=runRow.workflow_name||"unknown";if(!workflowDef&&workflowName!=="unknown")try{workflowDef=(await resolveWorkflowDefinition(projectRoot,workflowName,{validateSchema:!0})).workflow}catch{}if(!workflowDef){if(diagnostics.push({code:"definition-unavailable",message:`Definition unavailable for workflow "${workflowName}"`}),recordedDigest===null)diagnostics.push({code:"definition-digest-missing",message:`Run ${runId} metadata has no recorded definitionDigest`});return{schemaVersion:1,runId,workflow:workflowName,status:normalizedStatus,definitionDigest:recordedDigest,...recordedVersion!==void 0?{version:recordedVersion}:{},currentState,states:[],transitions,artifacts:artifactRows.map((a)=>({kind:a.kind,path:a.path})),nextTransitions:[],diagnostics,projectedAt}}let currentComputedDigest=computeDefinitionDigest(workflowDef);if(recordedDigest===null)diagnostics.push({code:"definition-digest-missing",message:`Run ${runId} metadata has no recorded definitionDigest`});else if(recordedDigest!==currentComputedDigest)diagnostics.push({code:"definition-drift",message:`Recorded definition digest ${recordedDigest} differs from current definition digest ${currentComputedDigest}`});let smDef=workflowDef,defStates=Array.isArray(smDef.states)?smDef.states:[],initialState=smDef.initialState??(defStates[0]?.id||"start"),inlineVisits=transitions.length===0?deriveInlineStateVisits(defStates,actionRows):[];if(!currentState){if(normalizedStatus==="pending"||normalizedStatus==="running")currentState=inlineVisits[inlineVisits.length-1]?.state??initialState;else if(normalizedStatus==="failed"&&inlineVisits.length>0)currentState=inlineVisits[inlineVisits.length-1]?.state??null}let stateVisits=[],visitCounter={},recordVisit=(stateId)=>{let count=(visitCounter[stateId]??0)+1;return visitCounter[stateId]=count,stateVisits.push({state:stateId,visit:count}),count};if(transitions.length===0)if(inlineVisits.length===0){if(initialState)recordVisit(initialState)}else for(let derived of inlineVisits)stateVisits.push(derived);else{let firstFrom=transitions[0]?.from;if(firstFrom)recordVisit(firstFrom);for(let tr of transitions)recordVisit(tr.to)}let visitedStateIds=new Set(stateVisits.map((v)=>v.state));for(let defState of defStates)if(!visitedStateIds.has(defState.id))stateVisits.push({state:defState.id,visit:1});let statesProgress=[],actionsByNode={};for(let row of actionRows){let group=actionsByNode[row.node]??[];group.push(row),actionsByNode[row.node]=group}let matchedActionRowIds=new Set,lastVisitByState=new Map;for(let entry of stateVisits)lastVisitByState.set(entry.state,Math.max(lastVisitByState.get(entry.state)??0,entry.visit));for(let{state:stateId,visit,rows:visitRows}of stateVisits){let defState=defStates.find((s)=>s.id===stateId),onEnterActions=Array.isArray(defState?.onEnter)?defState.onEnter:[],onExitActions=Array.isArray(defState?.onExit)?defState.onExit:[],defActionList=[...onEnterActions.map((a,i)=>({action:a,type:"onEnter",idx:i})),...onExitActions.map((a,i)=>({action:a,type:"onExit",idx:i}))],isVisited=visitedStateIds.has(stateId),isCurrent=currentState===stateId&&visit===lastVisitByState.get(stateId),stateStatus="pending";if(isVisited)if(isCurrent)if(normalizedStatus==="running"||normalizedStatus==="pending")stateStatus="running";else if(normalizedStatus==="completed")stateStatus="passed";else if(normalizedStatus==="failed")stateStatus="failed";else stateStatus="passed";else stateStatus="passed";let stateActionRows=visitRows??actionsByNode[stateId]??[],actionsProgress=[],usedActionRowIds=new Set;for(let item of defActionList){let actionKey=`${stateId}:${item.type}:${item.idx}`,kind=item.action.kind,stateEffect="may-write",evidenceEffect="none",candidateRows=stateActionRows.filter((r)=>r.kind===kind&&!usedActionRowIds.has(r.id));if(isVisited)for(let r of candidateRows)matchedActionRowIds.add(r.id);let actionStatus="pending",attempts=[];if(!isVisited)actionStatus="pending";else if(candidateRows.length===0)actionStatus=stateStatus==="passed"?"skipped":"pending";else{let sameKindDefCount=defActionList.filter((a)=>a.action.kind===kind).length;if(sameKindDefCount>1&&candidateRows.length>1&&candidateRows.length!==sameKindDefCount)diagnostics.push({code:"ambiguous-action",message:`Ambiguous mapping for action ${actionKey} (kind ${kind}) in state ${stateId}`}),actionStatus="ambiguous";else{let matchingRow=candidateRows[0];if(matchingRow){let rowsToMap=sameKindDefCount===1?candidateRows:[matchingRow];for(let row of rowsToMap)usedActionRowIds.add(row.id),attempts.push({actionRunId:row.id,status:row.status,ok:row.ok!==null?row.ok===1:null,startedAt:row.started_at,completedAt:row.completed_at,durationMs:row.duration_ms,...readProvenance(row.result_json)});if(matchingRow.status==="running")actionStatus="running";else if(matchingRow.status==="passed")actionStatus="passed";else if(matchingRow.status==="failed")actionStatus="failed";else if(matchingRow.status==="skipped")actionStatus="skipped";else actionStatus="passed"}}}actionsProgress.push({actionKey,kind,stateEffect:"may-write",evidenceEffect:"none",status:actionStatus,attempts})}statesProgress.push({state:stateId,visit,status:stateStatus,actions:actionsProgress})}let nextTransitions=[];if(currentState&&Array.isArray(smDef.transitions)){let outgoing=smDef.transitions.filter((t)=>t.from===currentState);for(let tr of outgoing){let eligibility="unknown";if(normalizedStatus==="running")eligibility="blocked";else if(normalizedStatus==="completed")eligibility="eligible";else eligibility="unknown";nextTransitions.push({from:tr.from,to:tr.to,trigger:tr.description??null,eligibility})}}let declaredStateIds=new Set(defStates.map((state)=>state.id));for(let row of actionRows){if(matchedActionRowIds.has(row.id))continue;if(declaredStateIds.has(row.node)&&!visitedStateIds.has(row.node)){diagnostics.push({code:"unvisited-state-row",message:`Action row ${row.id} (node ${row.node}, kind ${row.kind}) belongs to state ${row.node}, which run ${runId} did not visit`});continue}diagnostics.push({code:"orphan-action-row",message:`Action row ${row.id} (node ${row.node}, kind ${row.kind}) matches no declared state action`})}return{schemaVersion:1,runId,workflow:smDef.name||workflowName,status:normalizedStatus,definitionDigest:recordedDigest,...recordedVersion!==void 0?{version:recordedVersion}:{},currentState,states:statesProgress,transitions,artifacts:artifactRows.map((a)=>({kind:a.kind,path:a.path})),nextTransitions,diagnostics,projectedAt}}var SAFE_RUN_ID_RE=/^[A-Za-z0-9][A-Za-z0-9._-]*$/,RUN_CITATION_RE=/(?<![\w~:-]|[\w~:-]\/)\.spur\/run\/([A-Za-z0-9][A-Za-z0-9._*?<>{}|,\u2026-]*)(\/[^\s`]*)?/g;function asLiteralRunFileName(citation){let name=citation.replace(/[.,]+$/,"");if(!SAFE_RUN_ID_RE.test(name)||name.includes(".."))return;return name}var SHELL_METACHARACTERS=/[;&|<>$`(){}[\]!*?~#\n\r"']/;function splitLaunchCommand(value,label){if(SHELL_METACHARACTERS.test(value))return{error:`${label} must not contain shell metacharacters (got ${value})`};let tokens=value.trim().split(/\s+/).filter((t)=>t.length>0),command=tokens[0];if(command===void 0)return{error:`Action option ${label.slice(label.indexOf('"'))} must be a non-empty string`};return{command,leadingArgs:tokens.slice(1)}}function parseWorkflowInventory(json){if(typeof json!=="object"||json===null)return{ok:!1,error:"workflow inventory: projection is not an object"};let obj=json,name=typeof obj.name==="string"?obj.name:"",kind=typeof obj.kind==="string"?obj.kind:"",format=typeof obj.format==="string"?obj.format:"",version=typeof obj.version==="string"||typeof obj.version==="number"?String(obj.version):"",definitionDigest=typeof obj.definitionDigest==="string"?obj.definitionDigest:"",source;if(obj.source!==void 0){if(typeof obj.source!=="object"||obj.source===null)return{ok:!1,error:"workflow inventory: invalid definition source"};let value=obj.source;if(typeof value.path!=="string"||value.path===""||typeof value.layer!=="string"||!["project","registered","shared"].includes(value.layer))return{ok:!1,error:"workflow inventory: invalid definition source path/layer"};source={path:value.path,layer:value.layer}}if(name==="")return{ok:!1,error:"workflow inventory: missing name"};if(kind==="")return{ok:!1,error:"workflow inventory: missing kind"};if(definitionDigest==="")return{ok:!1,error:"workflow inventory: missing definitionDigest"};if(!Array.isArray(obj.steps)||obj.steps.length===0)return{ok:!1,error:"workflow inventory: no declared steps"};let steps=[];for(let raw of obj.steps){if(typeof raw!=="object"||raw===null)return{ok:!1,error:"workflow inventory: a step is not an object"};let s=raw;if(typeof s.id!=="string"||s.id==="")return{ok:!1,error:"workflow inventory: a step is missing its id"};steps.push({id:s.id,initial:s.initial===!0,terminal:s.terminal===!0,failure:s.failure===!0,pause:s.pause===!0,loopBack:s.loopBack===!0,conditional:s.conditional===!0,...typeof s.nodeType==="string"?{nodeType:s.nodeType}:{},...typeof s.description==="string"?{description:s.description}:{}})}return{ok:!0,inventory:{name,kind,format,version,definitionDigest,steps,...source?{source}:{}}}}function assertInventoryIdentity(inventory,expectedDigest){if(expectedDigest==="")return{ok:!1,error:"workflow inventory: no expected definition digest to bind against"};if(inventory.definitionDigest!==expectedDigest)return{ok:!1,error:`workflow inventory: identity drift — projected ${inventory.definitionDigest} ≠ execution ${expectedDigest}`};return{ok:!0}}init_zod();var quotaAttributionSchema=object2({projectId:string2().min(1).optional(),executor:string2().min(1).optional(),agent:string2().min(1).optional(),model:string2().min(1).optional()}).strict(),agentRunCorrelationSchema=object2({runId:string2().min(1).optional(),executionId:string2().min(1).optional(),actionId:string2().min(1).optional()}).strict(),agentQuotaObservationSchema=object2({observationId:string2().min(1),observedAt:string2().min(1),evidenceSource:_enum2(["buffered-error","streaming-error","health-probe"]),reason:_enum2(["insufficient_quota","insufficient_credit_balance","quota_exceeded","usage_limit_reached","credits_exhausted","billing_hard_limit_reached","provider_quota_exhausted"]),detail:string2().optional(),attribution:quotaAttributionSchema.optional(),correlation:agentRunCorrelationSchema.optional()}).strict(),agentQuotaRecoverySchema=object2({observationId:string2().min(1),recoveredAt:string2().min(1),attribution:quotaAttributionSchema.optional(),correlation:agentRunCorrelationSchema.optional()}).strict();function resolveQuotaExecutorBinding(executors,name){return executors?.find((candidate)=>candidate.name===name)}function normalizeQuotaTimestamp(value){let parsed=new Date(value);if(Number.isNaN(parsed.getTime()))return;return parsed.toISOString()}var MAX_QUOTA_DRAIN_ATTEMPTS_PER_ACTIVATION=3;function normalizeRootPath(root){return root.replace(/[\\/]+$/,"")}async function recordAgentQuotaEvent(context,event,desiredDisabled){let parsed=desiredDisabled?agentQuotaObservationSchema.safeParse(event):agentQuotaRecoverySchema.safeParse(event);if(!parsed.success)return{rejected:`malformed ${desiredDisabled?"exhaustion":"recovery"} payload`};let payload=parsed.data,attribution=payload.attribution;if(attribution?.projectId===void 0||attribution.executor===void 0)return{rejected:"missing project/executor attribution — observable only, not recorded"};if(normalizeRootPath(attribution.projectId)!==normalizeRootPath(context.projectRoot))return{rejected:`foreign project attribution "${attribution.projectId}"`};let observedAt=normalizeQuotaTimestamp("observedAt"in payload?payload.observedAt:payload.recoveredAt);if(observedAt===void 0)return{rejected:`unparsable timestamp on observation ${payload.observationId}`};let entry;try{let config=await context.loadAgentConfig(context.projectRoot);if(config===null)throw Error("config load failed");entry=config.agent?.executors}catch(error){return{rejected:`effective agent config unavailable: ${errorText(error)}`}}let profile=resolveQuotaExecutorBinding(entry,attribution.executor);if(profile===void 0)return{rejected:`unknown executor "${attribution.executor}" for this project`};if(attribution.agent!==void 0&&attribution.agent!==profile.agent)return{rejected:`profile binding replaced: executor "${attribution.executor}" now serves agent "${profile.agent}", event claimed "${attribution.agent}"`};if(attribution.model!==void 0&&profile.model!==void 0&&attribution.model!==profile.model)return{rejected:`model binding replaced: executor "${attribution.executor}" now pins "${profile.model}", event claimed "${attribution.model}"`};let db=await context.getDb();return new AgentExecutorUpdateDao(db).recordObservation({project_id:normalizeRootPath(context.projectRoot),executor_name:attribution.executor,observation_id:payload.observationId,observed_at:observedAt,agent:attribution.agent??null,model:attribution.model??null,disabled:desiredDisabled,owner:"quota",layer:"project"})}async function drainPendingAgentQuotaUpdates(context,options={}){let summary={applied:0,skippedBindingReplaced:0,skippedUnknownExecutor:0,skippedOperatorOwned:0,failed:0,deferred:0},db=await context.getDb(),dao=new AgentExecutorUpdateDao(db),projectId=normalizeRootPath(context.projectRoot),rows=await dao.pendingUpdates(projectId);if(rows.length===0)return summary;for(let row of rows){let config,lastError;for(let attempt=0;attempt<MAX_QUOTA_DRAIN_ATTEMPTS_PER_ACTIVATION;attempt+=1){let effectiveConfig;try{effectiveConfig=config??await requireAgentConfig(context)}catch(error){lastError=`effective agent config unavailable: ${errorText(error)}`,await recordDrainFailure(dao,row,lastError);continue}config=effectiveConfig;let profile=resolveQuotaExecutorBinding(effectiveConfig.agent?.executors,row.executor_name);if(profile===void 0){await dao.ackApplied(projectId,row.executor_name,row.observation_id,appliedAtNow(options)),summary.skippedUnknownExecutor+=1,context.warn(`quota update for unknown executor "${row.executor_name}" acknowledged as a no-op (entry no longer configured)`),lastError=void 0;break}if(row.agent!==null&&row.agent!==profile.agent){await dao.ackApplied(projectId,row.executor_name,row.observation_id,appliedAtNow(options)),summary.skippedBindingReplaced+=1,context.warn(`quota update for "${row.executor_name}" acknowledged as a no-op: profile now serves agent "${profile.agent}", observation recorded "${row.agent}"`),lastError=void 0;break}if(row.model!==null&&profile.model!==void 0&&row.model!==profile.model){await dao.ackApplied(projectId,row.executor_name,row.observation_id,appliedAtNow(options)),summary.skippedBindingReplaced+=1,context.warn(`quota update for "${row.executor_name}" acknowledged as a no-op: profile now pins model "${profile.model}", observation recorded "${row.model}"`),lastError=void 0;break}let executorEntry=effectiveConfig.agent?.executors?.find((entry)=>entry.name===row.executor_name),availability=normalizeExecutorAvailability(executorEntry?.disabled??!1);if(availability.disabled&&availability.owner==="operator"){await dao.ackSkipped(projectId,row.executor_name,row.observation_id,"operator-owned",appliedAtNow(options)),summary.skippedOperatorOwned+=1,context.warn(`quota update for "${row.executor_name}" acknowledged as a classified no-op: availability is operator-owned${availability.since!==void 0?` since ${availability.since}`:""}`),lastError=void 0;break}try{let rowOwner=row.owner==="probe"?"probe":"quota",eventName=row.disabled===1?"agent.quota.exhausted":"agent.quota.recovered",desired=row.disabled===1?{owner:rowOwner,since:row.observed_at,reason:`${eventName} ${row.executor_name}`}:!1;await setExecutorAvailability({layer:"global",projectRoot:context.projectRoot,executor:row.executor_name,disabled:desired}),await dao.ackApplied(projectId,row.executor_name,row.observation_id,appliedAtNow(options)),summary.applied+=1,lastError=void 0;break}catch(error){lastError=errorText(error),await recordDrainFailure(dao,row,lastError)}}if(lastError!==void 0&&await attemptBoundReached(dao,row,context))summary.failed+=1,summary.deferred+=1;else if(lastError!==void 0)summary.failed+=1}return summary}async function requireAgentConfig(context){let config=await context.loadAgentConfig(context.projectRoot);if(config===null)throw Error("config unavailable");return config}async function recordDrainFailure(dao,row,error){try{await dao.recordFailure(row.project_id,row.executor_name,row.observation_id,error.slice(0,500),null)}catch{}}async function attemptBoundReached(dao,row,context){try{return((await dao.getUpdate(row.project_id,row.executor_name))?.attempts??0)>=MAX_QUOTA_DRAIN_ATTEMPTS_PER_ACTIVATION}catch(error){return context.warn(`agent quota update retry state unreadable: ${errorText(error)}`),!1}}function appliedAtNow(options){return options.appliedAt?.()??new Date().toISOString()}function errorText(error){return error instanceof Error?error.message:String(error)}import{join as join19}from"node:path";var{appendFileSync:appendFileSync4,existsSync:existsSync9,mkdirSync:mkdirSync4}=process.getBuiltinModule("node:fs");function inlineRunRecordLogPath(runDir,runId){let markdownPath=join19(runDir,`${runId}.md`),legacyLogPath=join19(runDir,`${runId}.log`);if(existsSync9(legacyLogPath)&&!existsSync9(markdownPath))return legacyLogPath;return markdownPath}function appendInlineRunLogLine(runId,detail,workdir){try{let runDir=runStoragePaths(workdir??process.cwd()).recordsDir;if(!existsSync9(runDir))mkdirSync4(runDir,{recursive:!0});let safeRunId=runId.replace(/[^A-Za-z0-9._-]/g,"_"),stamp=new Date().toISOString().replace(/\.\d{3}Z$/,"Z");appendFileSync4(inlineRunRecordLogPath(runDir,safeRunId),`[${stamp}] ${detail}
3065
- `)}catch{}}var field=(path,label)=>({path,label}),SOURCE_PROFILES={planning:{producerPackage:"spur",subsystem:"planning",remediationKind:"prefix-filter"},queue:{producerPackage:"@gobing-ai/ts-infra",subsystem:"job-queue",remediationKind:"prefix-filter"},scheduler:{producerPackage:"@gobing-ai/ts-infra",subsystem:"scheduler",remediationKind:"prefix-filter"},message:{producerPackage:"spur",subsystem:"coordination-messaging",remediationKind:"prefix-filter"},process:{producerPackage:"@gobing-ai/ts-runtime",subsystem:"process-executor",remediationKind:"prefix-filter"},workflow:{producerPackage:"@gobing-ai/ts-dual-workflow-engine",subsystem:"workflow",remediationKind:"workflow-trace"},rule:{producerPackage:"@gobing-ai/ts-rule-engine",subsystem:"rule-engine",remediationKind:"rule-trace"},agent:{producerPackage:"@gobing-ai/ts-ai-runner",subsystem:"agent-runner",remediationKind:"prefix-filter"},history:{producerPackage:"spur",subsystem:"history",remediationKind:"prefix-filter"},bus:{producerPackage:"@gobing-ai/ts-infra",subsystem:"event-bus",remediationKind:"prefix-filter"},api:{producerPackage:"spur",subsystem:"http-api",remediationKind:"prefix-filter"},decision:{producerPackage:"spur",subsystem:"decision",remediationKind:"prefix-filter"}};function at(data,path){if(data===null)return;let current=data;for(let segment of path.split(".")){if(current===null||typeof current!=="object"||Array.isArray(current))return;current=current[segment]}return current}function s2(data,...paths){for(let path of paths){let value=at(data,path);if(typeof value==="string"&&value.length>0)return value}return}function n2(data,...paths){for(let path of paths){let value=at(data,path);if(typeof value==="number"&&Number.isFinite(value))return String(value);if(typeof value==="boolean")return String(value)}return}function entityId(input){return s2(input.data,"entity.id")??input.correlation.entityId??""}function looksLikeOpaqueId(value){if(typeof value!=="string")return!1;let v=value.trim();if(v==="")return!1;if(/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(v))return!0;if(/^live[-_][a-z0-9._-]+$/i.test(v))return!0;if(/^(?:eventId|rowId|runId|executionId|actionId)$/i.test(v))return!0;return!1}function humanWorkflowTitle(input){let raw=s2(input.data,"workflowName")??s2(input.data,"workflow");if(raw!==void 0&&!looksLikeOpaqueId(raw))return(raw.split("/").pop()?.replace(/\.(?:ya?ml|json)$/i,"")??raw).replace(/[._-]+$/,"");return""}function humanStepLabel(data){let label=s2(data,"nodeLabel")??s2(data,"stepName")??s2(data,"step");if(label!==void 0&&!looksLikeOpaqueId(label))return label;let node=s2(data,"node");if(node!==void 0&&!looksLikeOpaqueId(node))return node;return}function derivedFrom(...paths){return{support:"derived",derive:({data})=>s2(data,...paths)}}function derivedFromValue(...paths){return{support:"derived",derive:({data})=>n2(data,...paths)??s2(data,...paths)}}var unsupported={support:"unsupported"};function baseEvent(name,source,renderer,payloadPolicy="metadata-only",tier="default",producer){return{name,source,tier,payloadPolicy,renderer,...producer!==void 0?{producer}:{}}}var BASE_CATALOG=[baseEvent("task.created","planning","planning"),baseEvent("task.updated","planning","planning"),baseEvent("task.transitioned","planning","planning"),baseEvent("feature.created","planning","planning"),baseEvent("feature.updated","planning","planning"),baseEvent("feature.transitioned","planning","planning"),baseEvent("queue.consumer.started","queue","queue"),baseEvent("queue.consumer.stopped","queue","queue"),baseEvent("queue.job.enqueued","queue","queue"),baseEvent("queue.job.started","queue","queue"),baseEvent("queue.job.completed","queue","queue"),baseEvent("queue.job.failed","queue","queue"),baseEvent("queue.job.retrying","queue","queue"),baseEvent("queue.stats","queue","queue"),baseEvent("scheduler.job.executed","scheduler","scheduler"),baseEvent("message.sent","message","message"),baseEvent("message.replied","message","message"),baseEvent("message.read","message","message"),baseEvent("process.spawned","process","process"),baseEvent("process.exited","process","process"),baseEvent("process.stopped","process","process"),baseEvent("process.started","process","process"),baseEvent("agent.invoke.start","agent","agent"),baseEvent("agent.invoke.exit","agent","agent"),baseEvent("agent.invoke.escalated","agent","agent","metadata-only","default",{package:"spur",subsystem:"agent-runner"}),baseEvent("agent.invoke.exhausted","agent","agent","metadata-only","default",{package:"spur",subsystem:"agent-runner"}),baseEvent("agent.started","agent","agent"),baseEvent("agent.stopped","agent","agent"),baseEvent("agent.message.sent","agent","agent"),baseEvent("agent.lifecycle.changed","agent","agent"),baseEvent("strategy.changed","agent","agent","metadata-only","default",{package:"spur",subsystem:"fleet-strategy"}),baseEvent("fleet.capacity.changed","agent","agent","metadata-only","default",{package:"spur",subsystem:"write-slot"}),baseEvent("task.assigned","planning","planning"),baseEvent("history.import.completed","history","history-import"),baseEvent("history.analyze.completed","history","history-analyze"),baseEvent("history.daily.failed","history","history-daily"),baseEvent("history.refresh.enqueued","history","history-refresh"),baseEvent("rule.run.start","rule","rule"),baseEvent("rule.eval.start","rule","rule"),baseEvent("rule.eval.done","rule","rule"),baseEvent("rule.eval.error","rule","rule"),baseEvent("rule.run.done","rule","rule"),baseEvent("workflow.run.started","workflow","workflow-run"),baseEvent("workflow.run.done","workflow","workflow-run"),baseEvent("workflow.run.failed","workflow","workflow-run"),baseEvent("workflow.run.finalized","workflow","workflow-run"),baseEvent("workflow.escalation.created","workflow","workflow-run","redacted"),baseEvent("workflow.escalation.projection_failed","workflow","workflow-run","metadata-only"),baseEvent("workflow.run.paused","workflow","workflow-run"),baseEvent("workflow.run.resumed","workflow","workflow-run"),baseEvent("workflow.run.reseeded","workflow","workflow-run"),baseEvent("workflow.node.enter","workflow","workflow-phase"),baseEvent("workflow.phase","workflow","workflow-phase"),baseEvent("workflow.node.transition","workflow","workflow-transition"),baseEvent("workflow.transition","workflow","workflow-transition"),baseEvent("workflow.transition.requested","workflow","workflow-transition","metadata-only","diagnostic"),baseEvent("workflow.transition.denied","workflow","workflow-transition","metadata-only","diagnostic"),baseEvent("workflow.action.started","workflow","workflow-action"),baseEvent("workflow.action.finished","workflow","workflow-action"),baseEvent("workflow.action.failed_continue","workflow","workflow-action"),baseEvent("workflow.guard.evaluated","workflow","workflow-guard","metadata-only","diagnostic"),baseEvent("workflow.hitl.ask","workflow","workflow-hitl","redacted"),baseEvent("workflow.hitl.response","workflow","workflow-hitl","redacted"),baseEvent("workflow.hitl.note","workflow","workflow-hitl","redacted"),baseEvent("workflow.custom","workflow","workflow-custom"),baseEvent("workflow.agent","workflow","workflow-agent","redacted","diagnostic"),baseEvent("workflow.steering","workflow","workflow-steering","redacted"),baseEvent("api.request.error","api","api"),baseEvent("bus.emit.done","bus","bus","metadata-only","diagnostic"),baseEvent("bus.emit.noop","bus","bus","metadata-only","diagnostic"),baseEvent("bus.handler.error","bus","bus","metadata-only","diagnostic"),baseEvent("bus.handler.async.enqueued","bus","bus","metadata-only","diagnostic"),baseEvent("decision.start","decision","decision"),baseEvent("decision.success","decision","decision"),baseEvent("decision.failure","decision","decision"),baseEvent("decision.end","decision","decision"),baseEvent("decision.rejected","decision","decision")],SYSTEM_EVENT_PRESENTERS={"task.created":{description:"A task file was created with a new WBS id.",fields:[field("entity.kind","Entity kind"),field("entity.id","Entity")],summary:({data,correlation})=>`[task] ${entityId({data,correlation})} created`,outcome:unsupported},"task.updated":{description:"An existing task file was updated in place, naming the section that changed.",fields:[field("entity.kind","Entity kind"),field("entity.id","Entity"),field("field","Field"),field("data.mutation.name","Section"),field("data.after","After"),field("data.diff","Diff")],summary:({data,correlation})=>{let section=s2(data,"data.mutation.name"),id=entityId({data,correlation});return section!==void 0?`[task] ${section}`:`[task] ${id||"updated"}`},outcome:unsupported},"task.transitioned":{description:"A task moved between lifecycle states, naming both the previous and new status.",fields:[field("entity.kind","Entity kind"),field("entity.id","Entity"),field("from","From"),field("to","To")],summary:({data,correlation})=>{let id=entityId({data,correlation}),from=s2(data,"from"),to=s2(data,"to");return from!==void 0&&to!==void 0?`[task] ${id} : ${from} -> ${to}`:`[task] ${id} transitioned`},outcome:{support:"derived",derive:({data})=>s2(data,"to")}},"feature.created":{description:"A feature file was created with a new feature id.",fields:[field("entity.kind","Entity kind"),field("entity.id","Entity")],summary:({data,correlation})=>`[feature] ${entityId({data,correlation})} created`,outcome:unsupported},"feature.updated":{description:"An existing feature file was updated in place, naming the section that changed.",fields:[field("entity.kind","Entity kind"),field("entity.id","Entity"),field("field","Field"),field("data.mutation.name","Section"),field("data.after","After"),field("data.diff","Diff")],summary:({data,correlation})=>{let section=s2(data,"data.mutation.name"),id=entityId({data,correlation});return section!==void 0?`[feature] ${section}`:`[feature] ${id||"updated"}`},outcome:unsupported},"feature.transitioned":{description:"A feature moved between lifecycle states, naming both the previous and new status.",fields:[field("entity.kind","Entity kind"),field("entity.id","Entity"),field("from","From"),field("to","To")],summary:({data,correlation})=>{let id=entityId({data,correlation}),from=s2(data,"from"),to=s2(data,"to");return from!==void 0&&to!==void 0?`[feature] ${id} : ${from} -> ${to}`:`[feature] ${id} transitioned`},outcome:{support:"derived",derive:({data})=>s2(data,"to")}},"queue.consumer.started":{description:"The configured queue consumer began polling its named queue.",fields:[field("queueName","Queue"),field("startedAt","Started"),field("pollInterval","Poll interval"),field("batchSize","Batch size"),field("maxConcurrency","Max concurrency"),field("visibilityTimeout","Visibility timeout")],summary:({data})=>{let name=s2(data,"queueName");return name!==void 0?`[queue] ${name} : consumer started`:"[queue] consumer started"},outcome:{support:"derived",derive:({data})=>at(data,"startedAt")!==void 0?"running":void 0}},"queue.consumer.stopped":{description:"The queue consumer stopped, reporting whether it drained in-flight work.",fields:[field("queueName","Queue"),field("stoppedAt","Stopped"),field("drainTimeoutMs","Drain timeout"),field("inFlightAtStop","In flight"),field("drained","Drained")],summary:({data})=>{let name=s2(data,"queueName");return name!==void 0?`[queue] ${name} : consumer stopped`:"[queue] consumer stopped"},outcome:{support:"derived",derive:({data})=>{let drained=at(data,"drained");if(drained===!0)return"drained";if(drained===!1)return"timeout";return}}},"queue.job.enqueued":{description:"A job was enqueued onto the job queue for later processing.",fields:[field("jobId","Job"),field("type","Type"),field("nextRetryAt","Next retry")],summary:({data})=>{let type=s2(data,"type"),jobId=s2(data,"jobId");return type!==void 0&&jobId!==void 0?`[queue] ${type} · job ${jobId} enqueued`:"[queue] job enqueued"},outcome:unsupported},"queue.job.started":{description:"A queued job handler began executing (job identity and phase anchor).",fields:[field("jobId","Job"),field("type","Type"),field("name","Name")],summary:({data})=>{let type=s2(data,"type"),jobId=s2(data,"jobId");return type!==void 0&&jobId!==void 0?`[queue] ${type} · job ${jobId} started`:"[queue] job started"},outcome:unsupported},"queue.job.completed":{description:"A queued job finished successfully with its attempt and duration.",fields:[field("jobId","Job"),field("type","Type"),field("attempt","Attempt"),field("durationMs","Duration (ms)")],summary:({data})=>{let type=s2(data,"type"),jobId=s2(data,"jobId");return type!==void 0&&jobId!==void 0?`[queue] ${type} · job ${jobId} completed`:"[queue] job completed"},outcome:unsupported},"queue.job.failed":{description:"A queued job exhausted its attempts and failed with an error.",fields:[field("jobId","Job"),field("type","Type"),field("attempt","Attempt"),field("maxRetries","Max retries"),field("durationMs","Duration (ms)"),field("error","Error")],summary:({data})=>{let type=s2(data,"type"),jobId=s2(data,"jobId");return type!==void 0&&jobId!==void 0?`[queue] ${type} · job ${jobId} failed`:"[queue] job failed"},outcome:derivedFrom("error")},"queue.job.retrying":{description:"A queued job failed once and is scheduled for another attempt.",fields:[field("jobId","Job"),field("type","Type"),field("attempt","Attempt"),field("maxRetries","Max retries"),field("nextRetryAt","Next retry"),field("error","Error")],summary:({data})=>{let type=s2(data,"type"),jobId=s2(data,"jobId");return type!==void 0&&jobId!==void 0?`[queue] ${type} · job ${jobId} retrying`:"[queue] job retrying"},outcome:{support:"derived",derive:({data})=>{let attempt=at(data,"attempt"),max=at(data,"maxRetries");if(typeof attempt==="number"&&typeof max==="number"&&Number.isFinite(attempt)&&Number.isFinite(max))return`retrying ${attempt}/${max}`;return s2(data,"error")}}},"queue.stats":{description:"Periodic job-queue statistics across ready, running, completed, and failed counts.",fields:[field("ready","Ready"),field("running","Running"),field("completed","Completed"),field("failed","Failed")],summary:()=>"[queue] stats",outcome:unsupported},"scheduler.job.executed":{description:"A scheduler job ran to completion or failed, with its duration.",fields:[field("name","Job"),field("action","Action"),field("durationMs","Duration (ms)"),field("error","Error")],summary:({data})=>{let name=s2(data,"name");return name!==void 0?`[scheduler] ${name}`:"[scheduler] job executed"},outcome:{support:"derived",derive:({data})=>s2(data,"error")??(at(data,"error")===null?"completed":void 0)}},"message.sent":{description:"A team message was sent from one member to another.",fields:[field("msgId","Message"),field("fromId","From"),field("toId","To"),field("threadId","Thread")],summary:({data})=>{let from=s2(data,"fromId"),to=s2(data,"toId");return from!==void 0&&to!==void 0?`[message] ${from} -> ${to}`:"[message] sent"},outcome:unsupported},"message.replied":{description:"A member replied to an existing message thread.",fields:[field("msgId","Message"),field("fromId","From"),field("toId","To"),field("threadId","Thread")],summary:({data})=>{let from=s2(data,"fromId"),thread=s2(data,"threadId");return from!==void 0&&thread!==void 0?`[message] ${from} replied in ${thread}`:"[message] replied"},outcome:unsupported},"message.read":{description:"The recipient marked a message read (first read only).",fields:[field("msgId","Message"),field("fromId","From"),field("toId","Reader"),field("threadId","Thread")],summary:({data})=>{let reader=s2(data,"toId"),msg=s2(data,"msgId");return reader!==void 0&&msg!==void 0?`[message] ${reader} read ${msg}`:"[message] read"},outcome:unsupported},"process.spawned":{description:"A supervised process was spawned with a new pid.",fields:[field("label","Label"),field("pid","PID"),field("agentId","Agent")],summary:({data})=>{let label=s2(data,"label")??n2(data,"pid");return label!==void 0?`[process] ${label} spawned`:"[process] spawned"},outcome:unsupported},"process.exited":{description:"A supervised process exited, carrying its exit code, signal, or failure reason.",fields:[field("label","Label"),field("pid","PID"),field("exitCode","Exit code"),field("signal","Signal"),field("durationMs","Duration (ms)"),field("reason","Reason")],summary:({data})=>{let label=s2(data,"label")??n2(data,"pid");return label!==void 0?`[process] ${label} exited`:"[process] exited"},outcome:{support:"derived",derive:({data})=>{let reason=s2(data,"reason");if(reason!==void 0)return reason;let signal=s2(data,"signal");if(signal!==void 0)return`signal ${signal}`;let code=at(data,"exitCode");if(typeof code==="number"&&Number.isFinite(code))return code===0?"ok":`exit ${code}`;return}}},"process.stopped":{description:"A supervised process was stopped, naming the stopping reason.",fields:[field("label","Label"),field("pid","PID"),field("signal","Signal"),field("reason","Reason")],summary:({data})=>{let label=s2(data,"label")??n2(data,"pid");return label!==void 0?`[process] ${label} stopped`:"[process] stopped"},outcome:derivedFrom("reason")},"process.started":{description:"A process executor started a process with a new pid.",fields:[field("label","Label"),field("pid","PID")],summary:({data})=>{let label=s2(data,"label")??n2(data,"pid");return label!==void 0?`[process] ${label} started`:"[process] started"},outcome:unsupported},"agent.invoke.start":{description:"An agent invocation began, naming the agent and its operation.",fields:[field("agent","Agent"),field("operation","Operation"),field("routing.role","Role"),field("routing.tier","Tier"),field("routing.executor","Executor"),field("routing.source","Selection source")],summary:({data})=>{let agent=s2(data,"agent"),operation=s2(data,"operation");return agent!==void 0&&operation!==void 0?`[agent] ${agent} · ${operation}`:"[agent] invocation started"},outcome:unsupported},"agent.invoke.exit":{description:"An agent invocation exited, reporting its exit code or signal.",fields:[field("agent","Agent"),field("operation","Operation"),field("exitCode","Exit code"),field("signal","Signal"),field("routing.role","Role"),field("routing.tier","Tier"),field("routing.executor","Executor"),field("routing.source","Selection source")],summary:({data})=>{let agent=s2(data,"agent"),operation=s2(data,"operation");return agent!==void 0&&operation!==void 0?`[agent] ${agent} · ${operation} exited`:"[agent] invocation exited"},outcome:{support:"derived",derive:({data})=>{let signal=s2(data,"signal");if(signal!==void 0)return`signal ${signal}`;let code=at(data,"exitCode");if(typeof code==="number"&&Number.isFinite(code))return code===0?"ok":`exit ${code}`;return}}},"agent.invoke.escalated":{description:"An agent invocation escalated from one executor tier to another.",fields:[field("fromExecutor","From executor"),field("fromTier","From tier"),field("toExecutor","To executor"),field("toTier","To tier"),field("trigger","Trigger")],summary:({data})=>{let from=s2(data,"fromExecutor"),to=s2(data,"toExecutor");return from!==void 0&&to!==void 0?`[agent] ${from} -> ${to}`:"[agent] escalation"},outcome:{support:"derived",derive:({data})=>s2(data,"toTier")??s2(data,"trigger")}},"agent.invoke.exhausted":{description:"An agent invocation exhausted every eligible executor tier without success.",fields:[field("stage","Stage"),field("attempts","Attempts"),field("fromTier","From tier"),field("toTier","To tier"),field("fromExecutor","From executor"),field("toExecutor","To executor")],summary:({data})=>{let stage=s2(data,"stage");return stage!==void 0?`[agent] ${stage} escalation exhausted`:"[agent] escalation exhausted"},outcome:derivedFromValue("attempts")},"agent.started":{description:"An agent started, carrying its id and type.",fields:[field("agentId","Agent"),field("agentType","Agent type"),field("pid","PID")],summary:({data})=>{let id=s2(data,"agentId");return id!==void 0?`[agent] ${id} started`:"[agent] started"},outcome:unsupported},"agent.stopped":{description:"An agent stopped, reporting its exit code.",fields:[field("agentId","Agent"),field("exitCode","Exit code")],summary:({data})=>{let id=s2(data,"agentId");return id!==void 0?`[agent] ${id} stopped`:"[agent] stopped"},outcome:derivedFromValue("exitCode")},"strategy.changed":{description:"A project strategy changed (0838), minting a new strategy version for dispatch fencing.",fields:[field("data.projectPath","Project"),field("data.strategy","Strategy"),field("data.version","Version")],summary:({data})=>{let strategy=s2(data,"data.strategy"),version=s2(data,"data.version");return strategy!==void 0?`[strategy] ${strategy}${version!==void 0?` (v${version})`:""}`:"[strategy] changed"},outcome:unsupported},"fleet.capacity.changed":{description:"The project write slot was claimed or released (0837), changing dispatch capacity.",fields:[field("data.projectPath","Project"),field("data.change","Change"),field("data.holderId","Holder")],summary:({data})=>{let change=s2(data,"data.change"),holder=s2(data,"data.holderId");return`[fleet] write slot ${change??"changed"}${holder!==void 0?` — ${holder}`:""}`},outcome:unsupported},"agent.lifecycle.changed":{description:"A fleet member reported its lifecycle state through a host hook (G73): working, idle, or blocked on a human (a permission prompt).",fields:[field("member","Member"),field("state","State"),field("seq","Sequence")],summary:({data})=>{let member=s2(data,"member"),state=s2(data,"state");return member!==void 0?`[agent] ${member} · ${state??"state"}`:"[agent] lifecycle changed"},outcome:{support:"derived",derive:({data})=>s2(data,"state")}},"agent.message.sent":{description:"A message was sent to an agent, reporting delivery success.",fields:[field("agentId","Agent"),field("ok","Delivered")],summary:({data})=>{let id=s2(data,"agentId");return id!==void 0?`[agent] message -> ${id}`:"[agent] message sent"},outcome:derivedFromValue("ok")},"task.assigned":{description:"A task was assigned to an agent, naming the agent when resolved.",fields:[field("memberId","Member"),field("agentType","Agent type"),field("taskId","Task"),field("outcome","Outcome")],summary:({data})=>{let member=s2(data,"memberId"),task=s2(data,"taskId");return task!==void 0&&member!==void 0?`[task] ${task} assigned to ${member}`:"[task] assignment recorded"},outcome:derivedFrom("outcome")},"history.import.completed":{description:"A history import finished, reporting files, messages, and exit code.",fields:[field("source","Source"),field("sources","Sources"),field("files","Files"),field("messages","Messages"),field("durationMs","Duration (ms)"),field("exitCode","Exit code"),field("artifactPath","Artifact"),field("cwd","Project root")],retain:[field("trigger","Refresh trigger"),field("windowStart","Refresh window start"),field("windowEnd","Refresh window end"),field("importMode","Import mode"),field("coverage","Refresh coverage")],summary:({data})=>{let source=s2(data,"source")??s2(data,"sources");return source!==void 0?`[history] import · ${source}`:"[history] import completed"},outcome:derivedFromValue("exitCode")},"history.analyze.completed":{description:"A history analyze pass finished, reporting sources, duration, and exit code.",fields:[field("source","Source"),field("sources","Sources"),field("durationMs","Duration (ms)"),field("exitCode","Exit code"),field("artifactPath","Artifact")],retain:[field("trigger","Refresh trigger"),field("windowStart","Refresh window start"),field("windowEnd","Refresh window end"),field("importMode","Import mode")],summary:({data})=>{let source=s2(data,"source")??s2(data,"sources");return source!==void 0?`[history] analyze · ${source}`:"[history] analyze completed"},outcome:derivedFromValue("exitCode")},"history.daily.failed":{description:"The daily history refresh failed, carrying the detail, reason, and exit code.",fields:[field("source","Source"),field("sources","Sources"),field("detail","Detail"),field("reason","Reason"),field("exitCode","Exit code")],retain:[field("trigger","Refresh trigger"),field("windowStart","Refresh window start"),field("windowEnd","Refresh window end"),field("importMode","Import mode")],summary:()=>"[history] daily failed",outcome:{support:"derived",derive:({data})=>s2(data,"reason")??s2(data,"detail")??n2(data,"exitCode")}},"history.refresh.enqueued":{description:"A completion-triggered history refresh was enqueued, naming its window.",fields:[field("trigger","Trigger"),field("triggerId","Trigger id"),field("jobId","Queue job"),field("windowStart","Window start"),field("windowEnd","Window end"),field("coalesced","Coalesced"),field("outcome","Outcome")],summary:({data})=>{let start=s2(data,"windowStart"),end=s2(data,"windowEnd");return start!==void 0&&end!==void 0?`[history] refresh · ${start} -> ${end}`:"[history] refresh enqueued"},outcome:{support:"derived",derive:({data})=>{let status=s2(data,"outcome");return status!==void 0&&status!=="enqueued"?status:void 0}}},"rule.run.start":{description:"A rule run began with the rule count it will evaluate.",fields:[field("runId","Run"),field("ruleCount","Rules"),field("evaluator","Evaluator")],summary:({data,correlation})=>{let run=s2(data,"runId")??correlation.runId;return run!==void 0?`[rule] run ${run} started`:"[rule] run started"},outcome:unsupported},"rule.eval.start":{description:"A single rule began evaluating.",fields:[field("runId","Run"),field("ruleId","Rule"),field("evaluator","Evaluator"),field("index","Index"),field("total","Total")],summary:({data})=>{let id=s2(data,"ruleId");return id!==void 0?`[rule] ${id} evaluating`:"[rule] evaluating"},outcome:unsupported},"rule.eval.done":{description:"A rule finished evaluating, reporting its findings count and severity.",fields:[field("runId","Run"),field("ruleId","Rule"),field("evaluator","Evaluator"),field("findings","Findings"),field("durationMs","Duration (ms)"),field("severity","Severity")],summary:({data})=>{let id=s2(data,"ruleId");return id!==void 0?`[rule] ${id} evaluated`:"[rule] evaluated"},outcome:derivedFromValue("findings")},"rule.eval.error":{description:"A rule evaluation failed with an error.",fields:[field("runId","Run"),field("ruleId","Rule"),field("evaluator","Evaluator"),field("error","Error")],summary:({data})=>{let id=s2(data,"ruleId");return id!==void 0?`[rule] ${id} error`:"[rule] error"},outcome:derivedFrom("error")},"rule.run.done":{description:"A rule run finished, reporting findings and whether it stopped early.",fields:[field("runId","Run"),field("findings","Findings"),field("durationMs","Duration (ms)"),field("stoppedEarly","Stopped early"),field("severity","Severity")],summary:({data,correlation})=>{let run=s2(data,"runId")??correlation.runId;return run!==void 0?`[rule] run ${run} done`:"[rule] run done"},outcome:{support:"derived",derive:({data})=>n2(data,"findings")??s2(data,"stoppedEarly")}},"workflow.run.started":{description:"A workflow run started, naming the workflow definition.",fields:[field("runId","Run"),field("workflowName","Workflow"),field("mode","Mode"),field("dryRun","Dry run")],summary:(input)=>{let name=humanWorkflowTitle(input);return name!==""?`[workflow] ${name} started`:"[workflow] started"},outcome:unsupported},"workflow.run.done":{description:"A workflow run reached a done terminal state.",fields:[field("runId","Run"),field("workflowName","Workflow"),field("finalState","Final state"),field("transitionsTaken","Transitions")],summary:(input)=>{let name=humanWorkflowTitle(input);return name!==""?`[workflow] ${name} done`:"[workflow] done"},outcome:derivedFrom("finalState")},"workflow.run.failed":{description:"A workflow run failed with a terminal failure reason.",fields:[field("runId","Run"),field("workflowName","Workflow"),field("finalState","Final state"),field("reason","Reason")],summary:(input)=>{let name=humanWorkflowTitle(input);return name!==""?`[workflow] ${name} failed`:"[workflow] failed"},outcome:derivedFrom("reason")},"workflow.run.finalized":{description:"A workflow run settled on a terminal status.",fields:[field("runId","Run"),field("workflowName","Workflow"),field("status","Status")],summary:(input)=>{let name=humanWorkflowTitle(input);return name!==""?`[workflow] ${name} finalized`:"[workflow] finalized"},outcome:derivedFrom("status")},"workflow.escalation.created":{description:"A canonical escalation packet was projected from existing run evidence.",fields:[field("runId","Run"),field("workflowName","Workflow"),field("fingerprint","Fingerprint"),field("artifactPath","Artifact"),field("decision","Decision")],summary:(input)=>{let name=humanWorkflowTitle(input),decision=typeof at(input.data,"decision")==="string"?` — ${String(at(input.data,"decision"))}`:"";return name!==""?`[workflow] escalation packet created (${name}${decision})`:`[workflow] escalation packet created${decision}`},outcome:derivedFrom("decision")},"workflow.escalation.projection_failed":{description:"Escalation packet projection failed; the original failure is preserved untouched.",fields:[field("runId","Run"),field("workflowName","Workflow"),field("error","Error")],summary:()=>"[workflow] escalation packet projection failed",outcome:derivedFrom("error")},"workflow.run.paused":{description:"A workflow run paused at a step, naming the step when available.",fields:[field("runId","Run"),field("workflowName","Workflow"),field("nodeLabel","Step"),field("node","Node"),field("transitionsTaken","Transitions")],summary:(input)=>{let name=humanWorkflowTitle(input),step=humanStepLabel(input.data),parts=[name,step].filter((part)=>typeof part==="string"&&part!=="");return parts.length>0?`[workflow] ${parts.join(" · ")} paused`:"[workflow] paused"},outcome:unsupported},"workflow.run.resumed":{description:"A paused workflow run resumed at a step, naming the step when available.",fields:[field("runId","Run"),field("workflowName","Workflow"),field("nodeLabel","Step"),field("node","Node")],summary:(input)=>{let name=humanWorkflowTitle(input),step=humanStepLabel(input.data),parts=[name,step].filter((part)=>typeof part==="string"&&part!=="");return parts.length>0?`[workflow] ${parts.join(" · ")} resumed`:"[workflow] resumed"},outcome:unsupported},"workflow.run.reseeded":{description:"A workflow run was reseeded to a new state, naming the transition.",fields:[field("runId","Run"),field("workflowName","Workflow"),field("fromState","From"),field("toState","To")],summary:(input)=>{let name=humanWorkflowTitle(input),from=s2(input.data,"fromState"),to=s2(input.data,"toState");if(from!==void 0&&to!==void 0)return name!==""?`[workflow] ${name} : ${from} -> ${to}`:`[workflow] : ${from} -> ${to}`;return name!==""?`[workflow] ${name} reseeded`:"[workflow] reseeded"},outcome:derivedFrom("toState")},"workflow.node.enter":{description:"The engine entered a workflow node, naming the step when available.",fields:[field("runId","Run"),field("workflowName","Workflow"),field("nodeLabel","Step"),field("node","Node"),field("transitionsTaken","Transitions")],summary:(input)=>{let name=humanWorkflowTitle(input),step=humanStepLabel(input.data),parts=[name,step].filter((part)=>typeof part==="string"&&part!=="");return parts.length>0?`[workflow] ${parts.join(" · ")}`:"[workflow] node entered"},outcome:unsupported},"workflow.phase":{description:"A workflow phase changed status, naming the phase.",fields:[field("runId","Run"),field("workflowName","Workflow"),field("phase","Phase"),field("status","Status")],summary:(input)=>{let name=humanWorkflowTitle(input),phase=s2(input.data,"phase"),parts=[name,phase].filter((part)=>typeof part==="string"&&part!=="");return parts.length>0?`[workflow] ${parts.join(" · ")}`:"[workflow] phase"},outcome:derivedFrom("status")},"workflow.node.transition":{description:"A workflow transitioned between nodes, naming the from and to states.",fields:[field("runId","Run"),field("workflowName","Workflow"),field("from","From"),field("to","To"),field("trigger","Trigger")],summary:(input)=>{let name=humanWorkflowTitle(input),from=s2(input.data,"from"),to=s2(input.data,"to");if(from!==void 0&&to!==void 0)return name!==""?`[workflow] ${name} : ${from} -> ${to}`:`[workflow] : ${from} -> ${to}`;return name!==""?`[workflow] ${name} transitioned`:"[workflow] transitioned"},outcome:derivedFrom("to")},"workflow.transition":{description:"A workflow state transition was committed.",fields:[field("runId","Run"),field("workflowName","Workflow"),field("from","From"),field("to","To"),field("trigger","Trigger")],summary:(input)=>{let name=humanWorkflowTitle(input),from=s2(input.data,"from"),to=s2(input.data,"to");if(from!==void 0&&to!==void 0)return name!==""?`[workflow] ${name} : ${from} -> ${to}`:`[workflow] : ${from} -> ${to}`;return name!==""?`[workflow] ${name} transitioned`:"[workflow] transitioned"},outcome:derivedFrom("to")},"workflow.transition.requested":{description:"A workflow transition was requested and accepted for evaluation.",fields:[field("runId","Run"),field("workflowName","Workflow"),field("from","From"),field("to","To"),field("trigger","Trigger")],summary:(input)=>{let name=humanWorkflowTitle(input),from=s2(input.data,"from"),to=s2(input.data,"to");if(from!==void 0&&to!==void 0)return name!==""?`[workflow] ${name} requested ${from} -> ${to}`:`[workflow] requested ${from} -> ${to}`;return name!==""?`[workflow] ${name} transition requested`:"[workflow] transition requested"},outcome:unsupported},"workflow.transition.denied":{description:"A workflow transition was denied with a reason.",fields:[field("runId","Run"),field("workflowName","Workflow"),field("from","From"),field("to","To"),field("reason","Reason")],summary:(input)=>{let name=humanWorkflowTitle(input),from=s2(input.data,"from"),to=s2(input.data,"to");if(from!==void 0&&to!==void 0)return name!==""?`[workflow] ${name} denied ${from} -> ${to}`:`[workflow] denied ${from} -> ${to}`;return name!==""?`[workflow] ${name} transition denied`:"[workflow] transition denied"},outcome:derivedFrom("reason")},"workflow.action.started":{description:"A workflow action began executing, naming the step and kind.",fields:[field("runId","Run"),field("workflowName","Workflow"),field("nodeLabel","Step"),field("node","Node"),field("actionId","Action"),field("kind","Kind")],retain:[field("metadata.agent","Agent"),field("metadata.role","Role"),field("routing.executor","Executor")],summary:(input)=>{let name=humanWorkflowTitle(input),step=humanStepLabel(input.data),parts=[name,step].filter((part)=>typeof part==="string"&&part!=="");return parts.length>0?`[workflow] ${parts.join(" · ")} started`:"[workflow] action started"},outcome:unsupported},"workflow.action.finished":{description:"A workflow action finished, reporting its status and success.",fields:[field("runId","Run"),field("workflowName","Workflow"),field("nodeLabel","Step"),field("node","Node"),field("actionId","Action"),field("kind","Kind"),field("durationMs","Duration (ms)"),field("status","Status")],retain:[field("metadata.agent","Agent"),field("metadata.role","Role"),field("routing.executor","Executor")],summary:(input)=>{let name=humanWorkflowTitle(input),step=humanStepLabel(input.data),parts=[name,step].filter((part)=>typeof part==="string"&&part!=="");return parts.length>0?`[workflow] ${parts.join(" · ")} finished`:"[workflow] action finished"},outcome:{support:"derived",derive:({data})=>s2(data,"status")??n2(data,"ok")}},"workflow.action.failed_continue":{description:"A workflow action failed but the workflow continued, carrying the error.",fields:[field("runId","Run"),field("workflowName","Workflow"),field("nodeLabel","Step"),field("node","Node"),field("transitionsTaken","Transitions"),field("error","Error")],retain:[field("metadata.agent","Agent"),field("metadata.role","Role"),field("routing.executor","Executor")],summary:(input)=>{let name=humanWorkflowTitle(input),step=humanStepLabel(input.data),parts=[name,step].filter((part)=>typeof part==="string"&&part!=="");return parts.length>0?`[workflow] ${parts.join(" · ")} failed; continuing`:"[workflow] action failed; continuing"},outcome:derivedFrom("error")},"workflow.guard.evaluated":{description:"A workflow guard was evaluated for a transition, reporting whether it passed.",fields:[field("runId","Run"),field("workflowName","Workflow"),field("from","From"),field("to","To"),field("kind","Kind"),field("passed","Passed")],summary:(input)=>{let name=humanWorkflowTitle(input),from=s2(input.data,"from"),to=s2(input.data,"to");if(from!==void 0&&to!==void 0)return name!==""?`[workflow] ${name} guard ${from} -> ${to}`:`[workflow] guard ${from} -> ${to}`;return name!==""?`[workflow] ${name} guard evaluated`:"[workflow] guard evaluated"},outcome:derivedFromValue("passed")},"workflow.hitl.ask":{description:"A workflow paused for human input, naming the step and kind.",fields:[field("runId","Run"),field("workflowName","Workflow"),field("nodeLabel","Step"),field("node","Node"),field("kind","Kind")],summary:(input)=>{let name=humanWorkflowTitle(input),step=humanStepLabel(input.data),parts=[name,step].filter((part)=>typeof part==="string"&&part!=="");return parts.length>0?`[workflow] ${parts.join(" · ")} awaiting input`:"[workflow] awaiting input"},outcome:unsupported},"workflow.hitl.response":{description:"Human input was received for a paused workflow step.",fields:[field("runId","Run"),field("workflowName","Workflow"),field("nodeLabel","Step"),field("node","Node"),field("ok","Accepted")],summary:(input)=>{let name=humanWorkflowTitle(input),step=humanStepLabel(input.data),parts=[name,step].filter((part)=>typeof part==="string"&&part!=="");return parts.length>0?`[workflow] ${parts.join(" · ")} input received`:"[workflow] input received"},outcome:derivedFromValue("ok")},"workflow.hitl.note":{description:"A note was recorded on a paused workflow step.",fields:[field("runId","Run"),field("workflowName","Workflow"),field("nodeLabel","Step"),field("node","Node")],summary:(input)=>{let name=humanWorkflowTitle(input),step=humanStepLabel(input.data),parts=[name,step].filter((part)=>typeof part==="string"&&part!=="");return parts.length>0?`[workflow] ${parts.join(" · ")} note`:"[workflow] note"},outcome:unsupported},"workflow.custom":{description:"A custom workflow event was emitted, naming the custom event.",fields:[field("runId","Run"),field("workflowName","Workflow"),field("name","Event")],summary:(input)=>{let name=humanWorkflowTitle(input),custom=s2(input.data,"name"),parts=[name,custom].filter((part)=>typeof part==="string"&&part!=="");return parts.length>0?`[workflow] ${parts.join(" · ")}`:"[workflow] custom"},outcome:unsupported},"workflow.agent":{description:"A workflow-dispatched agent execution lifecycle event, discriminated by kind.",fields:[field("runId","Run"),field("executionId","Execution"),field("actionId","Action"),field("kind","Kind"),field("agent","Agent"),field("model","Model")],retain:[field("metadata.agent","Agent"),field("metadata.role","Role"),field("routing.executor","Executor")],summary:(input)=>{let name=humanWorkflowTitle(input),kind=s2(input.data,"kind"),parts=[name,kind!==void 0?`agent ${kind}`:"agent"].filter((part)=>typeof part==="string"&&part!=="");return parts.length>0?`[workflow] ${parts.join(" · ")}`:"[workflow] agent"},outcome:{support:"derived",derive:({data})=>s2(data,"kind")==="finished"?s2(data,"outcome"):void 0}},"workflow.steering":{description:"A steering command was acknowledged for a workflow action boundary.",fields:[field("runId","Run"),field("actionId","Action"),field("operation","Operation"),field("actor","Actor"),field("accepted","Accepted"),field("state","State"),field("reason","Reason")],summary:(input)=>{let name=humanWorkflowTitle(input),operation=s2(input.data,"operation"),parts=[name,operation!==void 0?`steering ${operation}`:"steering"].filter((part)=>typeof part==="string"&&part!=="");return parts.length>0?`[workflow] ${parts.join(" · ")}`:"[workflow] steering"},outcome:{support:"derived",derive:({data})=>{let reason=s2(data,"reason");if(reason!==void 0)return reason;let accepted=at(data,"accepted");if(accepted===!0)return"accepted";if(accepted===!1)return"rejected";return s2(data,"state")}}},"api.request.error":{description:"An API request failed, naming the method, path, and status or error code.",fields:[field("method","Method"),field("path","Path"),field("status","Status"),field("code","Code"),field("requestId","Request"),field("error","Error")],summary:({data})=>{let method=s2(data,"method"),path=s2(data,"path");return method!==void 0&&path!==void 0?`[api] ${method} ${path}`:"[api] request error"},outcome:{support:"derived",derive:({data})=>s2(data,"error")??s2(data,"code")??n2(data,"status")}},"bus.emit.done":{description:"An event was emitted to its handlers on the event bus.",fields:[field("event","Event"),field("handlers","Handlers"),field("durationMs","Duration (ms)")],summary:({data})=>{let event=s2(data,"event");return event!==void 0?`[bus] ${event} emitted`:"[bus] event emitted"},outcome:derivedFromValue("handlers")},"bus.emit.noop":{description:"An event was emitted but had no registered handlers.",fields:[field("event","Event"),field("handlers","Handlers"),field("durationMs","Duration (ms)")],summary:({data})=>{let event=s2(data,"event");return event!==void 0?`[bus] ${event} had no handlers`:"[bus] event had no handlers"},outcome:derivedFromValue("handlers")},"bus.handler.error":{description:"An event-bus handler threw an error while processing an event.",fields:[field("event","Event"),field("handlers","Handlers"),field("durationMs","Duration (ms)"),field("error","Error")],summary:({data})=>{let event=s2(data,"event");return event!==void 0?`[bus] ${event} handler error`:"[bus] handler error"},outcome:derivedFrom("error")},"bus.handler.async.enqueued":{description:"An event-bus handler was enqueued for asynchronous processing.",fields:[field("event","Event"),field("handlers","Handlers")],summary:({data})=>{let event=s2(data,"event");return event!==void 0?`[bus] ${event} handlers enqueued`:"[bus] handlers enqueued"},outcome:derivedFromValue("handlers")},"decision.start":{description:"A decision invocation began — a maker is about to be asked.",fields:[field("decisionId","Decision"),field("type","Type"),field("maker","Maker"),field("makerSource","Maker source"),field("catalogLayer","Catalog layer"),field("minConfidence","Min confidence")],retain:[field("invocationId","Invocation"),field("caller","Caller"),field("inputKeys","Input keys"),field("evidenceDigest","Evidence digest"),field("correlation.runId","Run"),field("correlation.workflowName","Workflow"),field("correlation.nodeId","Node"),field("correlation.wbs","WBS")],summary:({data})=>{let id=s2(data,"decisionId"),maker=s2(data,"maker");return maker!==void 0?`[decision] ${id??"decision"} asking ${maker}`:`[decision] ${id??"decision"} asking maker`},outcome:unsupported},"decision.success":{description:"A decision invocation returned an accepted model answer (no fallback).",fields:[field("decisionId","Decision"),field("value","Answer"),field("confidence","Confidence"),field("maker","Maker")],retain:[field("invocationId","Invocation"),field("caller","Caller"),field("correlation.runId","Run"),field("correlation.workflowName","Workflow"),field("correlation.nodeId","Node"),field("correlation.wbs","WBS")],summary:({data})=>{let id=s2(data,"decisionId"),value=s2(data,"value");return value!==void 0?`[decision] ${id??"decision"} answered ${value}`:`[decision] ${id??"decision"} answered`},outcome:derivedFromValue("value")},"decision.failure":{description:"A decision invocation served the declared fallback instead of a model answer.",fields:[field("decisionId","Decision"),field("reason","Reason"),field("fallbackValue","Fallback"),field("confidence","Confidence"),field("maker","Maker"),field("error","Error")],retain:[field("invocationId","Invocation"),field("caller","Caller"),field("correlation.runId","Run"),field("correlation.workflowName","Workflow"),field("correlation.nodeId","Node"),field("correlation.wbs","WBS")],summary:({data})=>{let id=s2(data,"decisionId"),reason=s2(data,"reason");return reason!==void 0?`[decision] ${id??"decision"} fell back (${reason})`:`[decision] ${id??"decision"} fell back`},outcome:derivedFromValue("reason")},"decision.end":{description:"A decision invocation finished, with the outcome source and wall-clock duration.",fields:[field("decisionId","Decision"),field("durationMs","Duration ms"),field("value","Answer"),field("source","Source"),field("reason","Reason"),field("maker","Maker"),field("confidence","Confidence")],retain:[field("invocationId","Invocation"),field("caller","Caller"),field("correlation.runId","Run"),field("correlation.workflowName","Workflow"),field("correlation.nodeId","Node"),field("correlation.wbs","WBS")],summary:({data})=>{let id=s2(data,"decisionId"),source=s2(data,"source");return source!==void 0?`[decision] ${id??"decision"} finished via ${source}`:`[decision] ${id??"decision"} finished`},outcome:derivedFromValue("reason")},"decision.rejected":{description:"A caller mistake refused a decision before any maker call (unknown id, maker, or parse).",fields:[field("decisionId","Decision"),field("errorKind","Error kind"),field("message","Message"),field("maker","Maker")],retain:[field("invocationId","Invocation"),field("caller","Caller"),field("correlation.runId","Run"),field("correlation.workflowName","Workflow"),field("correlation.nodeId","Node"),field("correlation.wbs","WBS")],summary:({data})=>{let id=s2(data,"decisionId"),kind=s2(data,"errorKind");return kind!==void 0?`[decision] ${id??"decision"} rejected (${kind})`:`[decision] ${id??"decision"} rejected`},outcome:derivedFromValue("errorKind")}};function inferSeverity(name){if(/(?:failed|error|denied)$/.test(name))return"error";if(/(?:retrying|paused|dropped)$/.test(name))return"warning";return"info"}function resolveCatalogEntry(base){let profile=SOURCE_PROFILES[base.source],presenter=SYSTEM_EVENT_PRESENTERS[base.name];return{name:base.name,prefix:base.name.split(".")[0]??base.name,source:base.source,tier:base.tier,persisted:!0,streamed:!0,payloadPolicy:base.payloadPolicy,renderer:base.renderer,...profile,...base.producer!==void 0?{producerPackage:base.producer.package,subsystem:base.producer.subsystem}:{},severity:inferSeverity(base.name),description:presenter.description,metadataFields:presenter.retain?[...presenter.fields,...presenter.retain.filter((r)=>!presenter.fields.some((f)=>f.path===r.path))]:presenter.fields,remediationKind:profile.remediationKind}}var SYSTEM_EVENT_CATALOG=BASE_CATALOG.map(resolveCatalogEntry),SYSTEM_EVENT_NAMES=SYSTEM_EVENT_CATALOG.map((entry)=>entry.name),SYSTEM_EVENT_PERSISTED_NAMES=SYSTEM_EVENT_CATALOG.filter((entry)=>entry.tier==="default").map((entry)=>entry.name),SYSTEM_EVENT_STREAMED_NAMES=SYSTEM_EVENT_CATALOG.filter((entry)=>entry.tier==="default").map((entry)=>entry.name),SYSTEM_EVENT_PREFIXES=Array.from(new Set(SYSTEM_EVENT_CATALOG.map((entry)=>entry.prefix))),SYSTEM_EVENT_DEFAULT_NAMES=SYSTEM_EVENT_CATALOG.filter((entry)=>entry.tier==="default").map((entry)=>entry.name),SYSTEM_EVENT_DIAGNOSTIC_NAMES=SYSTEM_EVENT_CATALOG.filter((entry)=>entry.tier==="diagnostic").map((entry)=>entry.name);var SYSTEM_EVENT_CATALOG_METADATA=SYSTEM_EVENT_CATALOG.map(({name,prefix,source,tier,renderer,producerPackage,subsystem,severity,description,metadataFields,remediationKind})=>({name,prefix,source,tier,renderer,producerPackage,subsystem,severity,description,metadataFields,remediationKind}));var SYSTEM_EVENT_ENVELOPE_SCHEMA_VERSION=2,MAX_STRING_LENGTH=256,MAX_DEPTH=4,MAX_ARRAY_ITEMS=16,MAX_OBJECT_FIELDS=32,MAX_TOTAL_NODES=128,MAX_FIELD_KEY_LENGTH=64,CORE_METADATA_PATHS=["schemaVersion","eventId","event","at","timestamp","actor","runId","executionId","actionId","commandId","sequence","correlation.runId","correlation.executionId","correlation.actionId","entity.kind","entity.id","entityKind","entityId","jobId","kind","status","outcome","severity","reason","durationMs","usage","metadata.correlationId"],OMITTED_KEY=/^(?:args?|argv|body|command|commandline|content|details|env|environment|message|output|payload|prompt|query|response|stderr|stdin|stdout)$/,SECRET_KEY2=/(?:api[-_]?key|authorization|cookie|credential|password|secret|token)/i,PRODUCER_PACKAGES=new Set(["spur","@gobing-ai/ts-infra","@gobing-ai/ts-runtime","@gobing-ai/ts-ai-runner","@gobing-ai/ts-rule-engine","@gobing-ai/ts-dual-workflow-engine"]);var SAFE_IDENTIFIER=/^[A-Za-z0-9._:-]+$/;function systemEventProjectContext(root,name){let safeRoot=typeof root==="string"?root:"",inferredName=safeRoot.replace(/[\\/]+$/,"").split(/[\\/]/).at(-1)||"unknown";return{name:name&&name.length>0?name:inferredName,root:safeRoot}}function buildSystemEventEnvelope(entry,eventPayload,project,secretValues=[],actor){try{let data=projectSystemEventData(entry,eventPayload,secretValues),correlation=extractEnvelopeCorrelation(eventPayload,secretValues),severity=extractSeverity(eventPayload)??entry?.severity??"warning",presentation=buildPresentation(entry,data,correlation,severity,actor);return{schemaVersion:SYSTEM_EVENT_ENVELOPE_SCHEMA_VERSION,data,context:{project:boundedProjectContext(project,secretValues),producer:{package:entry?.producerPackage??"spur",subsystem:entry?.subsystem??"unknown"},correlation},presentation}}catch{return genericEnvelope(project,secretValues)}}function projectSystemEventData(entry,eventPayload,secretValues=[]){if(eventPayload===null||eventPayload===void 0)return null;let state={nodes:0,seen:new WeakSet,secretValues};if(!isRecord5(eventPayload)){let value=projectValue(eventPayload,state,0);return value===void 0?null:{value}}if(!entry)return null;if(entry.payloadPolicy!=="raw-safe")return projectAllowedMetadata(entry,eventPayload,state);let result={};for(let[key,value]of safeEntries(eventPayload).slice(0,MAX_OBJECT_FIELDS)){let projected=projectKeyValue(key,value,state,0);if(projected!==void 0)result[boundedKey(key)]=projected}return result}function projectAllowedMetadata(entry,eventPayload,state){let result={},paths=new Set([...CORE_METADATA_PATHS,...entry.metadataFields.map((field)=>field.path)]);for(let path of paths){let value=getPath(eventPayload,path);if(value===void 0)continue;let key=path.split(".").at(-1)??path,projected=projectKeyValue(key,value,state,path.split(".").length-1);if(projected!==void 0)setPath(result,path,projected)}return result}function projectKeyValue(key,value,state,depth){if(isOmittedKey(key))return;if((key==="findings"||key==="finding")&&typeof value==="object")return;if(SECRET_KEY2.test(key))return"[REDACTED]";return projectValue(value,state,depth)}function projectValue(value,state,depth){if(state.nodes>=MAX_TOTAL_NODES||depth>MAX_DEPTH)return"[truncated]";if(state.nodes+=1,value===null||typeof value==="boolean")return value;if(typeof value==="number")return Number.isFinite(value)?value:void 0;if(typeof value==="string")return redactAndBound(value,state.secretValues,MAX_STRING_LENGTH);if(typeof value==="bigint")return redactAndBound(String(value),state.secretValues,MAX_STRING_LENGTH);if(typeof value!=="object")return;if(state.seen.has(value))return"[circular]";if(state.seen.add(value),Array.isArray(value)){let result=[];for(let item of value.slice(0,MAX_ARRAY_ITEMS)){let projected=projectValue(item,state,depth+1);if(projected!==void 0)result.push(projected)}if(value.length>MAX_ARRAY_ITEMS)result.push("[truncated]");return result}let result={};for(let[key,item]of safeEntries(value).slice(0,MAX_OBJECT_FIELDS)){let projected=projectKeyValue(key,item,state,depth+1);if(projected!==void 0)result[boundedKey(key)]=projected}return result}function extractEnvelopeCorrelation(eventPayload,secretValues){if(!isRecord5(eventPayload))return{};let nested=isRecord5(eventPayload.correlation)?eventPayload.correlation:{},entity=isRecord5(eventPayload.entity)?eventPayload.entity:{},result={};assignString(result,"runId",eventPayload.runId??eventPayload.run_id??nested.runId,secretValues),assignString(result,"executionId",eventPayload.executionId??nested.executionId,secretValues),assignString(result,"actionId",eventPayload.actionId??nested.actionId,secretValues),assignString(result,"entityKind",eventPayload.entityKind??entity.kind,secretValues),assignString(result,"entityId",eventPayload.entityId??entity.id,secretValues),assignString(result,"jobId",eventPayload.jobId,secretValues);let sequence=eventPayload.sequence;if(typeof sequence==="number"&&Number.isFinite(sequence))result.sequence=sequence;return result}function assignString(target,key,value,secretValues){if(typeof value!=="string"||value.length===0)return;target[key]=redactAndBound(value,secretValues,128)}function projectTablePresentation(input){let{entry,data,correlation,presentation,actor}=input,name=entry?.name??"",isPureEngineRow=name==="workflow.node.enter"||name==="workflow.transition"||name==="workflow.node.transition"||name==="workflow.transition.requested"||name==="workflow.transition.denied"||name==="workflow.run.started"||name==="workflow.run.done"||name==="workflow.run.failed"||name==="workflow.run.finalized"||name==="workflow.run.paused"||name==="workflow.run.resumed"||name==="workflow.run.reseeded",agent;if(!isPureEngineRow&&data!==null){let executor=getPath(data,"routing.executor"),agentField=getPath(data,"agent"),metadataAgent=getPath(data,"metadata.agent");if(typeof executor==="string"&&executor.length>0&&!looksLikeOpaqueId(executor))agent=executor;else if(typeof agentField==="string"&&agentField.length>0&&!looksLikeOpaqueId(agentField))agent=agentField;else if(typeof metadataAgent==="string"&&metadataAgent.length>0&&!looksLikeOpaqueId(metadataAgent))agent=metadataAgent}if(!isPureEngineRow&&agent===void 0&&typeof actor==="string"&&actor.length>0){if(/^[A-Za-z][A-Za-z0-9._:-]*$/.test(actor)&&!PRODUCER_PACKAGES.has(actor)&&!looksLikeOpaqueId(actor))agent=actor}let corrParts=[];if(data!==null){let wfName=getPath(data,"workflowName");if(typeof wfName==="string"&&wfName.length>0&&!looksLikeOpaqueId(wfName))corrParts.push(wfName);let nodeLabel=getPath(data,"nodeLabel");if(typeof nodeLabel==="string"&&nodeLabel.length>0&&!looksLikeOpaqueId(nodeLabel))corrParts.push(nodeLabel);let kind=getPath(data,"kind");if(typeof kind==="string"&&kind.length>0&&!looksLikeOpaqueId(kind)&&kind!==wfName&&kind!==nodeLabel)corrParts.push(kind);let entityKind=getPath(data,"entity.kind")??getPath(data,"entityKind")??correlation.entityKind,entityId=getPath(data,"entity.id")??getPath(data,"entityId")??correlation.entityId;if(typeof entityId==="string"&&entityId.length>0&&!looksLikeOpaqueId(entityId))if(typeof entityKind==="string"&&entityKind.length>0&&!looksLikeOpaqueId(entityKind))corrParts.push(`${entityKind}:${entityId}`);else corrParts.push(entityId)}else{let{entityKind,entityId}=correlation;if(typeof entityId==="string"&&entityId.length>0&&!looksLikeOpaqueId(entityId))if(typeof entityKind==="string"&&entityKind.length>0&&!looksLikeOpaqueId(entityKind))corrParts.push(`${entityKind}:${entityId}`);else corrParts.push(entityId)}if(typeof correlation.sequence==="number"&&Number.isFinite(correlation.sequence))corrParts.push(`#${correlation.sequence}`);let correlators=corrParts.length>0?corrParts.join(" · "):void 0,actionLabel;if(data!==null){let kind=getPath(data,"kind"),op=getPath(data,"operation")??getPath(data,"action");if(typeof kind==="string"&&kind.length>0&&!looksLikeOpaqueId(kind))actionLabel=kind;else if(typeof op==="string"&&op.length>0&&!looksLikeOpaqueId(op))actionLabel=op}if(actionLabel===void 0&&presentation.action?.kind==="filter"&&presentation.action.label)actionLabel=presentation.action.label;return{...correlators!==void 0?{correlators:boundPresentationString(correlators,512)}:{},...actionLabel!==void 0?{actionLabel:boundPresentationString(actionLabel,128)}:{},...agent!==void 0?{agent:boundPresentationString(agent,128)}:{}}}function buildPresentation(entry,data,correlation,severity,actor){let presenter=entry===void 0?void 0:SYSTEM_EVENT_PRESENTERS[entry.name];if(entry===void 0||presenter===void 0)return genericPresentation(severity);let input={data,correlation},summary,description,outcome,fields;try{if(summary=presenter.summary(input),description=presenter.description,fields=buildPresenterFields(presenter,data),presenter.outcome.support==="derived")outcome=presenter.outcome.derive(input)}catch{return genericPresentation(severity)}let basePresentation={severity,summary:boundPresentationString(summary,512)??"System event",description:boundPresentationString(description,512)??"System event.",fields,...outcome!==void 0?{outcome:boundPresentationString(outcome,128)}:{},...buildAction(entry,correlation)},tablePresentation=projectTablePresentation({entry,data,correlation,presentation:basePresentation,actor});return{...basePresentation,...tablePresentation}}function buildPresenterFields(presenter,data){if(!data)return[];let fields=[];for(let field of presenter.fields.slice(0,8)){let value=getPath(data,field.path),rendered=renderFieldValue(value);if(rendered!==void 0)fields.push({label:field.label,value:rendered})}return fields}function boundPresentationString(value,maxLength){if(typeof value!=="string"||value.length===0)return;return value.length<=maxLength?value:`${value.slice(0,maxLength-1)}…`}function genericPresentation(severity){return{severity,summary:"Unknown system event",description:"Unknown system event with bounded metadata.",fields:[]}}function buildAction(entry,correlation){if(!entry)return{};if(entry.remediationKind==="workflow-trace"&&isSafeIdentifier(correlation.runId))return{action:{label:"Trace workflow run",kind:"command",value:`spur workflow trace ${correlation.runId}`}};if(entry.remediationKind==="rule-trace"&&isSafeIdentifier(correlation.runId))return{action:{label:"Trace rule run",kind:"command",value:`spur rule trace ${correlation.runId}`}};if(entry.remediationKind==="prefix-filter")return{action:{label:`Filter ${entry.prefix} events`,kind:"filter",value:`prefix=${entry.prefix}`}};return{}}function extractSeverity(eventPayload){if(!isRecord5(eventPayload))return;return eventPayload.severity==="info"||eventPayload.severity==="warning"||eventPayload.severity==="error"?eventPayload.severity:void 0}function boundedProjectContext(project,secretValues){return{name:redactAndBound(project.name||"unknown",secretValues,128),root:redactAndBound(project.root||"",secretValues,MAX_STRING_LENGTH)}}function genericEnvelope(project,secretValues){return{schemaVersion:SYSTEM_EVENT_ENVELOPE_SCHEMA_VERSION,data:null,context:{project:boundedProjectContext(project,secretValues),producer:{package:"spur",subsystem:"unknown"},correlation:{}},presentation:{severity:"warning",summary:"Unknown system event",description:"Unknown system event with bounded metadata.",fields:[]}}}function getPath(value,path){let current=value;for(let segment of path.split(".")){if(!isRecord5(current))return;current=current[segment]}return current}function renderFieldValue(value){if(typeof value==="string")return value;if(typeof value==="number"&&Number.isFinite(value))return String(value);if(typeof value==="boolean")return String(value);return}function isSafeIdentifier(value){return typeof value==="string"&&SAFE_IDENTIFIER.test(value)}function isOmittedKey(key){let normalized=key.replaceAll(/[^A-Za-z0-9]/g,"").toLowerCase();return OMITTED_KEY.test(normalized)}function setPath(target,path,value){let segments=path.split("."),current=target;for(let segment of segments.slice(0,-1)){let existing=current[segment];if(isRecord5(existing)){current=existing;continue}let nested={};current[segment]=nested,current=nested}let finalSegment=segments.at(-1);if(finalSegment)current[finalSegment]=value}function boundedKey(key){return key.length<=MAX_FIELD_KEY_LENGTH?key:`${key.slice(0,MAX_FIELD_KEY_LENGTH-1)}…`}function isRecord5(value){return value!==null&&typeof value==="object"&&!Array.isArray(value)}function safeEntries(value){try{return Object.entries(value)}catch{return[]}}var DEFAULT_SYSTEM_EVENT_RETENTION_QUOTA=1e4;function resolveRetentionQuotas(config={},prefixes=SYSTEM_EVENT_PREFIXES){let defaultQuota=config.default??DEFAULT_SYSTEM_EVENT_RETENTION_QUOTA,overrides=config.prefixes??{};return prefixes.map((prefix)=>({prefix,quota:overrides[prefix]??defaultQuota}))}function registerSystemEventTap(bus,dao,logger,options={}){let handlers=new Map,inFlight=new Set,diagnosticEnabled=options.diagnosticEnabled===!0,quotas=resolveRetentionQuotas(options.retention);for(let entry of SYSTEM_EVENT_CATALOG){if(entry.tier==="diagnostic"&&!diagnosticEnabled)continue;let handler=(event)=>{let actor=extractSystemEventActor(event),p=persist(dao,entry.prefix,{id:createId("sev"),event_name:entry.name,occurred_at:new Date().toISOString(),actor,payload_json:safeStringify(buildSystemEventEnvelope(entry,event,options.projectContext??systemEventProjectContext(""),options.secretValues,actor)),...extractSystemEventCorrelation(event)},quotas,logger);inFlight.add(p),p.finally(()=>inFlight.delete(p))};handlers.set(entry.name,handler),bus.on(entry.name,handler)}return{unsubscribe:()=>{for(let[name,handler]of handlers)bus.off(name,handler);handlers.clear()},flush:async()=>{while(inFlight.size>0)await Promise.allSettled(inFlight)}}}async function persist(dao,prefix,input,quotas,logger){try{await dao.insert(input),await dao.pruneQuotas(quotas,prefix)}catch(error){logger.warn("system_events tap: persist failed",{name:input.event_name,error:stringifyError(error)})}}function safeStringify(event){try{return JSON.stringify(event??null)}catch{return null}}function extractSystemEventActor(event){if(event&&typeof event==="object"){let obj=event;if(typeof obj.actor==="string"&&obj.actor.length>0)return obj.actor;if(typeof obj.agentId==="string"&&obj.agentId.length>0)return obj.agentId;if(typeof obj.memberId==="string"&&obj.memberId.length>0)return obj.memberId}return null}function extractSystemEventCorrelation(event){let correlation={run_id:null,entity_kind:null,entity_id:null,sequence:null};if(!event||typeof event!=="object")return correlation;let obj=event,nested=obj.correlation&&typeof obj.correlation==="object"?obj.correlation:{},runId=obj.runId??obj.run_id??nested.runId;if(typeof runId==="string"&&runId.length>0)correlation.run_id=runId;if(typeof obj.sequence==="number"&&Number.isFinite(obj.sequence))correlation.sequence=obj.sequence;let entity=obj.entity;if(entity&&typeof entity==="object"){let{kind,id}=entity;if(typeof kind==="string"&&kind.length>0)correlation.entity_kind=kind;if(typeof id==="string"&&id.length>0)correlation.entity_id=id}if(typeof obj.entityKind==="string"&&obj.entityKind.length>0)correlation.entity_kind=obj.entityKind;if(typeof obj.entityId==="string"&&obj.entityId.length>0)correlation.entity_id=obj.entityId;return correlation}function stringifyError(error){if(error instanceof Error)return`${error.name}: ${error.message}`;return String(error)}var TRIPWIRE_CATALOG=Object.freeze({"retry-exhausted":{id:"retry-exhausted",version:1,response:"fail",nextDecision:"Retries are exhausted; an operator must decide to escalate, extend the retry policy, or fail the stage. No further automatic retry is permitted."},"hard-budget":{id:"hard-budget",version:1,response:"fail",nextDecision:"An operator must raise the declared budget or trim the stage scope, then re-run the action; the run stays failed until then."},"capability-denied":{id:"capability-denied",version:1,response:"fail",nextDecision:"An operator must attest the executor capabilities in agent config or lower the stage requiresCapabilities, then re-run the action."},"proof-invalidated":{id:"proof-invalidated",version:1,response:"fail",nextDecision:"An operator must restore the proof inputs or re-establish the verdict (re-verify) before record; recording against a changed tree is blocked."},"output-drop":{id:"output-drop",version:1,response:"continue",nextDecision:"The dispatch completed but its captured evidence is incomplete (bounded relay dropped chunks). Inspect the session/trace for full output if the result is contested."}});var{copyFile:copyFile2,link,mkdir:mkdir2,readFile:readFile5,unlink:unlink2,writeFile:writeFile3}=process.getBuiltinModule("node:fs/promises");var SENSITIVE_PREFIXES=["drizzle/","packages/config/",".github/","plugins/sp/hooks/"],SENSITIVE_GLOBS=["apps/server/src/**/auth*","**/*secret*","**/*.sql"];function globToRegex(glob){let escaped=glob.replace(/[.+^${}()|[\]\\]/g,"\\$&").replaceAll("**/","\x00").replaceAll("**","\x01").replaceAll("*","[^/]*").replaceAll("\x00","(?:.*/)?").replaceAll("\x01",".*");return new RegExp(`^${escaped}$`,"s")}var SENSITIVE_MATCHERS=[...SENSITIVE_PREFIXES.map((prefix)=>({label:prefix,test:(path)=>path.startsWith(prefix)})),...SENSITIVE_GLOBS.map((glob)=>{let regex=globToRegex(glob);return{label:glob,test:(path)=>regex.test(path)}})];function getExecutorTier(executor){if(executor.tier){let declared=executor.tier;return declared==="capable"?"capable-1":declared}let combined=`${executor.name} ${executor.model??""} ${executor.agent}`.toLowerCase();if(/\b(cheap|haiku|flash|lite|mini|fast)\b/.test(combined))return"cheap";if(/\b(capable|opus|pro|sonnet|r1|o1|o3|expert)\b/.test(combined))return"capable-1";return"standard"}init_project_process();init_project_process();function workflowVersionLiteral(workflow){return typeof workflow.version==="string"&&workflow.version!==""?workflow.version:null}var{appendFileSync:appendFileSync5,closeSync,existsSync:existsSync10,lstatSync:lstatSync2,mkdirSync:mkdirSync5,openSync,readdirSync:readdirSync5,readFileSync:readFileSync6,renameSync:renameSync3,unlinkSync:unlinkSync2,writeFileSync:writeFileSync4,writeSync}=process.getBuiltinModule("node:fs"),{lstat:lstat2,mkdir:mkdir3,readdir:readdir2,readFile:readFile6}=process.getBuiltinModule("node:fs/promises");function parseIdentityMetadata(raw){if(raw.trim()==="")return{};try{let parsed=JSON.parse(raw);if(parsed===null||typeof parsed!=="object"||Array.isArray(parsed))return null;return parsed}catch{return null}}async function openInlineRunProjectDb(workdir){let url=join20(resolve10(workdir),".spur","spur.db");mkdirSync5(join20(url,".."),{recursive:!0});let adapter=await createMigratedDb({url});return{adapter,close:()=>adapter.close()}}async function readInstalledInventory(input){let launch=input.spurBin?splitLaunchCommand(input.spurBin,'inline-run-setup "spurBin"'):existsSync10(input.localCli)?{command:"bun",leadingArgs:[input.localCli]}:{command:"spur",leadingArgs:[]};if("error"in launch)throw Error(launch.error);let res=await new NodeProcessExecutor().run({command:launch.command,args:[...launch.leadingArgs,"workflow","show",input.file,"--format","todo","--json"],cwd:input.workdir??process.cwd(),forceBuffered:!0,rejectOnError:!1,timeout:30000});if(res.exitCode!==0){let detail=res.stderr.trim()!==""?res.stderr.trim():`exit ${res.exitCode??-1}`;throw Error(`could not resolve the workflow definition with the installed CLI: ${detail}`)}let value=JSON.parse(res.stdout);if(value&&typeof value==="object"&&"ok"in value&&"data"in value&&value.ok===!0)return value.data;return value}var MAX_CITED_RUN_FILES=64;async function readExistingRunFile(path){let stat=await lstat2(path).catch((error)=>{if(error.code==="ENOENT")return;throw error});if(stat===void 0)return;if(!stat.isFile())throw Error(`persist-out: destination ${path} is not a regular file — refusing to follow it`);return readFile6(path)}async function persistWorktreeRuns(input){let fromDir=resolve10(input.fromWorkdir),toDir=resolve10(input.toWorkdir),fromStat=await lstat2(fromDir).catch(()=>{return});if(fromStat===void 0||!fromStat.isDirectory())throw Error(`persist-out: source worktree does not exist or is not a directory: ${input.fromWorkdir}`);let fromRunDir=join20(fromDir,".spur","run"),toRunDir=join20(toDir,".spur","run"),fromRecordsDir=runStoragePaths(fromDir).recordsDir,toRecordsDir=runStoragePaths(toDir).recordsDir,fs=createNodeFileSystem(),fromEvidence=runStoragePaths(fromDir).evidenceDir,toEvidence=runStoragePaths(toDir).evidenceDir,evidenceCopies=[],evidenceSkipped=[],forwardedWbs=new Set;for(let taskFile of input.taskFiles??[]){let wbs=/^(\d{4})_/.exec(basename5(taskFile))?.[1];if(wbs!==void 0)forwardedWbs.add(wbs)}let hasTaskFilter=input.taskFiles!==void 0,worktreeRunIds=new Set,ownerDb=await openInlineRunProjectDb(fromDir);try{for(let row of await listRunIdRows(ownerDb.adapter)){if(!SAFE_RUN_ID_RE.test(row.id))throw new InvalidWorkflowRunIdError(row.id);worktreeRunIds.add(row.id)}}finally{ownerDb.close()}await resolveDurableArtifactPath(fs,fromDir,join20(fromEvidence,"probe.json"),"evidence");let evidenceNames=await readdir2(fromEvidence).catch((error)=>{if(error.code==="ENOENT")return[];throw error});for(let name of evidenceNames.sort()){let source=await resolveDurableArtifactPath(fs,fromDir,join20(fromEvidence,name),"evidence"),target=await resolveDurableArtifactPath(fs,toDir,join20(toEvidence,name),"evidence"),stat=await lstat2(source);if(!stat.isFile())throw Error(`persist-out: durable evidence is not a regular file: ${name}`);let bytes=await readFile6(source),verdictWbs=/^(\d{4})-verdict\.json$/.exec(name)?.[1],isOwned=!1;if(verdictWbs!==void 0){let parsed=parseVerifyVerdict(bytes.toString(),verdictWbs),raw=JSON.parse(bytes.toString());if(!parsed||parsed.wbs!==verdictWbs||raw.wbs!==void 0&&raw.wbs!==verdictWbs)throw Error(`persist-out: malformed durable verdict identity: ${name}`);isOwned=hasTaskFilter?forwardedWbs.has(verdictWbs):!0}else if(name.endsWith("-feature-verification.json")){let receipt=parseFeatureVerificationReceipt(bytes.toString()),owner=name.slice(0,-26);if(owner!==receipt.runId&&owner!==receipt.featureId)throw Error(`persist-out: malformed durable receipt identity: ${name}`);isOwned=worktreeRunIds.has(receipt.runId)}else throw Error(`persist-out: unclassified durable evidence: ${name}`);let existing=await readExistingRunFile(target);if(existing!==void 0&&!existing.equals(bytes)){if(isOwned)throw Error(`persist-out: durable evidence conflicts: ${name}`);let newer=(await lstat2(target)).mtimeMs>=stat.mtimeMs?"invoking":"worktree";evidenceSkipped.push({name,reason:"foreign-divergent",newer});continue}evidenceCopies.push({source,target,bytes})}let citedNames=new Set,citedDirSkips=new Set;for(let taskFile of input.taskFiles??[]){let content;try{content=await readFile6(resolve10(toDir,taskFile),"utf8")}catch(error){throw Error(`persist-out: merged task file ${taskFile} is unreadable: ${String(error)}`)}for(let match of content.matchAll(RUN_CITATION_RE)){let name=asLiteralRunFileName(match[1]??"");if(name===void 0)continue;if(match[2]!==void 0){citedDirSkips.add(name);continue}if(citedNames.has(name))continue;if(citedNames.size>=MAX_CITED_RUN_FILES)throw Error(`persist-out: merged task files cite more than ${MAX_CITED_RUN_FILES} distinct `+".spur/run/ files — over the fixed citation cap (0984 R3); split the batch or prune the citations");citedNames.add(name)}}if((input.taskFiles??[]).length>0){let prefixes=[...forwardedWbs].map((wbs)=>`${wbs}-`),recordNames=new Set;for(let runId of worktreeRunIds)prefixes.push(`${runId}-`),recordNames.add(`${runId}.md`).add(`${runId}.state.json`);let entries=await readdir2(fromRunDir).catch((error)=>{if(error.code==="ENOENT")return[];throw error}),ownedCounts=new Map;for(let name of entries.sort()){if(recordNames.has(name))continue;let owner=prefixes.find((prefix)=>name.startsWith(prefix));if(owner===void 0)continue;let count=(ownedCounts.get(owner)??0)+1;if(count>MAX_CITED_RUN_FILES)throw Error(`persist-out: owner ${owner} owns more than ${MAX_CITED_RUN_FILES} .spur/run/ files `+"— over the per-owner evidence cap (1012 R1, 1034 R1); split the batch or prune the evidence");ownedCounts.set(owner,count),citedNames.add(name)}}let citedCopies=[],citedSkips=[];for(let name of citedDirSkips)citedSkips.push({id:name,reason:`cited-directory:${name}`});for(let name of citedNames){let scratchPath=join20(fromRunDir,name),durablePath=join20(fromRecordsDir,name),scratchStat=await lstat2(scratchPath).catch(()=>{return}),sourceIsDurable=scratchStat===void 0,sourcePath=sourceIsDurable?durablePath:scratchPath,targetPath=sourceIsDurable?join20(toRecordsDir,name):join20(toRunDir,name),sourceStat=sourceIsDurable?await lstat2(durablePath).catch(()=>{return}):scratchStat,targetBytes=await readExistingRunFile(targetPath);if(sourceStat===void 0){let otherTarget=sourceIsDurable?join20(toRunDir,name):join20(toRecordsDir,name);if(targetBytes===void 0&&await readExistingRunFile(otherTarget)===void 0)throw Error(`persist-out: cited run evidence .spur/run/${name} is missing in both the worktree and `+"the invoking tree — resolve or drop the citation before teardown (0984 R1)");continue}if(!sourceStat.isFile()){let kind=sourceStat.isDirectory()?"directory":sourceStat.isSymbolicLink()?"symlink":"non-file";citedSkips.push({id:name,reason:`cited-${kind}:${name}`});continue}if(targetBytes!==void 0){let sourceBytes=await readFile6(sourcePath);if(!targetBytes.equals(sourceBytes))throw Error(`persist-out: cited run evidence .spur/run/${name} diverges from the invoking tree's `+"existing file — refusing to overwrite; reconcile the two copies by hand (0984 R4)");continue}citedCopies.push({name,sourcePath,targetPath})}let source=await openInlineRunProjectDb(fromDir);try{let runRows=await listRunIdRows(source.adapter);for(let row of runRows)if(!SAFE_RUN_ID_RE.test(row.id))throw new InvalidWorkflowRunIdError(row.id);let recordBytes=new Map;for(let row of runRows){let bookkeeping=row.workflowName!==null&&row.workflowName!==void 0&&isBookkeepingWorkflow(row.workflowName);for(let fileName of[`${row.id}.md`,`${row.id}.state.json`])try{recordBytes.set(fileName,await readFile6(join20(fromRecordsDir,fileName)))}catch(error){if(error.code==="ENOENT"){if(bookkeeping)continue;throw Error(`persist-out: ${row.workflowName??"unknown"} run ${row.id} is missing its run record \`${fileName}\` in the worktree — failing closed before any row transfer `+"(green-run evidence guarantee, 0984 R5 / 1043 R1)")}throw error}}let target=await openInlineRunProjectDb(toDir);try{let{persistedIds,skipped}=await transferRunTables(source.adapter,target.adapter),recordIds=[...persistedIds,...skipped.filter((s)=>s.reason==="id-exists").map((s)=>s.id)],recordSkips=[],referenceMoves=[];if(evidenceCopies.length>0){ensureDurablePlaneIgnored(toDir);for(let copy of evidenceCopies){await mkdir3(join20(copy.target,".."),{recursive:!0});let existing=await readExistingRunFile(copy.target);if(existing!==void 0&&!existing.equals(copy.bytes))throw Error(`persist-out: durable evidence conflicts: ${copy.target}`);if(existing===void 0)writeFileSync4(copy.target,copy.bytes,{flag:"wx"});referenceMoves.push({source:copy.source,target:fs.realPath?.(copy.target)??copy.target})}}if(recordIds.length>0||citedCopies.length>0){mkdirSync5(toRunDir,{recursive:!0}),mkdirSync5(toRecordsDir,{recursive:!0}),ensureDurablePlaneIgnored(toDir);for(let id of recordIds)for(let fileName of[`${id}.md`,`${id}.state.json`]){let sourceBytes=recordBytes.get(fileName);if(sourceBytes===void 0){recordSkips.push({id,reason:`record-missing:${fileName}`});continue}let targetPath=join20(toRecordsDir,fileName),existing=await readExistingRunFile(targetPath);if(existing!==void 0){if(existing.equals(sourceBytes))continue;recordSkips.push({id,reason:`record-conflict:${fileName}`});continue}writeFileSync4(targetPath,sourceBytes,{flag:"wx"})}for(let cited of citedCopies){let sourceBytes=await readFile6(cited.sourcePath),existing=await readExistingRunFile(cited.targetPath);if(existing!==void 0){if(!existing.equals(sourceBytes))throw Error(`persist-out: cited run evidence .spur/run/${cited.name} diverges from the invoking `+"tree's existing file — refusing to overwrite; reconcile the two copies by hand (0984 R4)");continue}writeFileSync4(cited.targetPath,sourceBytes,{flag:"wx"})}for(let id of recordIds)await carryRunRecordDir(fromRecordsDir,toRecordsDir,"",id,recordSkips,referenceMoves)}return await redirectRunStorageReferences(target.adapter,referenceMoves),{ok:!0,persisted:persistedIds.length,skipped:[...skipped,...recordSkips,...citedSkips],...evidenceSkipped.length>0?{evidenceSkipped}:{}}}finally{target.close()}}finally{source.close()}}async function createOrAttachInlineRun(input){let runId=input.runId.trim();if(runId==="")return{ok:!1,error:"inline run setup requires a non-empty runId (driver Run setup step 2)"};let workdir=resolve10(input.workdir),resolved;try{let projection=input.inventory===void 0?void 0:parseWorkflowInventory(input.inventory);if(projection&&!projection.ok)return projection;let inventory=projection?.ok?projection.inventory:void 0;if(inventory&&(!inventory.source||inventory.kind!=="state-machine"))return{ok:!1,error:"inline run setup requires a state-machine inventory with definition source"};if(resolved=await resolveWorkflowDefinition(workdir,inventory?.source?.path??input.file,{validateSchema:!0,...input.embeddedSchemas!==void 0?{embeddedSchemas:input.embeddedSchemas}:{},...!inventory?{registered:input.registered}:{}}),(resolved.workflow.kind??"state-machine")!=="state-machine")return{ok:!1,error:"inline run setup requires a state-machine definition"};if(inventory?.source){let identity=assertInventoryIdentity(inventory,resolved.digest);if(!identity.ok)return identity;if(inventory.name!==resolved.workflow.name)return{ok:!1,error:"inline run setup: inventory workflow name does not match its definition"};resolved={...resolved,layer:inventory.source.layer}}}catch(error){return{ok:!1,error:`inline run setup could not resolve the workflow definition: ${error.message}`}}let digest=resolved.digest,version=workflowVersionLiteral(resolved.workflow),source={path:resolved.path,layer:resolved.layer,workdir},db=await input.getDb(),existing=await new RunDao(db).traceRowById(runId);if(existing!==void 0){let metadata=parseIdentityMetadata(existing.metadata_json);if(metadata===null)return{ok:!1,error:`inline run setup refuses run ${runId}: its existing row has malformed metadata_json, `+"so its identity cannot be verified — delete the stale run row or allocate a new run id"};let resumeDigest=typeof metadata.resumeDefinitionDigest==="string"?metadata.resumeDefinitionDigest:void 0,launchDigest=typeof metadata.definitionDigest==="string"?metadata.definitionDigest:void 0,effectiveDigest=resumeDigest??launchDigest;if(effectiveDigest===void 0)return{ok:!1,error:`inline run setup refuses run ${runId}: its existing row carries no definition digest `+"(pre-identity legacy row) — allocate a new run id instead of attaching an unverifiable identity"};if(effectiveDigest!==digest)return{ok:!1,error:`inline run setup refuses run ${runId}: the resolved definition digest (${digest}) does not match the run's recorded ${resumeDigest!==void 0?"resume":""} digest (${effectiveDigest}) — `+"a changed definition must resume through the explicit resume rules, not silently re-attach"};if(existing.workflow_name!==resolved.workflow.name)return{ok:!1,error:`inline run setup refuses run ${runId}: the run row records workflow "${existing.workflow_name}" but the resolved definition is "${resolved.workflow.name}" — conflicting run identity`};if(typeof metadata.definitionSource!=="object"||metadata.definitionSource===null||Array.isArray(metadata.definitionSource))return{ok:!1,error:`inline run setup refuses run ${runId}: its existing row carries no definition source `+"(path/layer/workdir) — allocate a new run id instead of attaching an unverifiable launch source"};let existingSource=metadata.definitionSource;if(!(typeof existingSource.path==="string"&&resolve10(existingSource.path)===resolved.path&&normalizePersistedWorkflowLayer(existingSource.layer)===resolved.layer&&typeof existingSource.workdir==="string"&&resolve10(existingSource.workdir)===workdir))return{ok:!1,error:`inline run setup refuses run ${runId}: the recorded definition source (${JSON.stringify(existingSource)}) does not match the resolved launch source (${JSON.stringify(source)}) — conflicting project/workdir identity`};return{ok:!0,attached:!0,runId,workflowName:resolved.workflow.name,definitionDigest:digest,workflowVersion:version,resolvedPath:resolved.path,layer:resolved.layer,workdir,status:existing.status}}return await new WorkflowService(createDefaultWorkflowEngineHost(),new DbWorkflowPersistenceAdapter(db)).createOrAttachRun({id:runId,workflow_name:resolved.workflow.name,mode:"state-machine",status:"running",started_at:new Date().toISOString(),completed_at:null,metadata_json:JSON.stringify({definitionDigest:digest,workflowVersion:version,definitionSource:source})}),{ok:!0,attached:!1,runId,workflowName:resolved.workflow.name,definitionDigest:digest,workflowVersion:version,resolvedPath:resolved.path,layer:resolved.layer,workdir,status:"running"}}async function runDecideForInlineRun(input){let optionsFile=join20(resolve10(input.workdir),input.optionsFile),raw;try{raw=JSON.parse(await readFile6(optionsFile,"utf8"))}catch(error){return{ok:!1,error:`decide: unreadable options file ${input.optionsFile}: ${String(error)}`}}let parsed=DecideOptionsSchema.safeParse(raw);if(!parsed.success)return{ok:!1,error:`decide: invalid options — ${parsed.error.issues.map((i)=>i.message).join("; ")}`};let spurConfig=input.spurConfig,result=await new DecideActionRunner(createNodeFileSystem(),{enabled:input.enabled,...spurConfig!==void 0?{decisionService:()=>getDecisionService(spurConfig,resolve10(input.workdir))}:{},...input.observabilityBus!==void 0?{observabilityBus:input.observabilityBus}:{},...input.decisionLog!==void 0?{decisionLog:input.decisionLog}:{}}).execute(raw,{runId:input.runId??"inline-decide",stateOrNodeId:input.node??"decide",workdir:resolve10(input.workdir),vars:input.correlationVars??{},env:{}});if(!result.ok||result.data===void 0)return{ok:!1,error:result.error??"decide: action failed without an error message"};let decision=result.data.decision;return{ok:!0,value:decision.value,degraded:decision.degraded,reason:decision.reason,source:decision.source,backend:decision.backend,confidence:decision.confidence,resultFile:join20(resolve10(input.workdir),parsed.data.resultFile),durationMs:decision.durationMs}}async function carryRunRecordDir(srcRoot,destRoot,rel,runId,skips,moves){let fs=createNodeFileSystem();await resolveDurableArtifactPath(fs,resolve10(srcRoot,"../../.."),join20(srcRoot,rel,"probe"),"runs"),await resolveDurableArtifactPath(fs,resolve10(destRoot,"../../.."),join20(destRoot,rel,"probe"),"runs");let entries;try{entries=await readdir2(join20(srcRoot,rel),{withFileTypes:!0})}catch(error){if(error.code==="ENOENT"){if(rel==="")skips.push({id:runId,reason:"source-missing"});return}throw error}for(let entry of entries){if(rel===""&&![runId,`${runId}.md`,`${runId}.state.json`,`${runId}.log`].includes(entry.name))continue;let relNext=rel===""?entry.name:`${rel}/${entry.name}`;if(entry.isDirectory()){await carryRunRecordDir(srcRoot,destRoot,relNext,runId,skips,moves);let target=join20(destRoot,relNext);if(existsSync10(target))moves.push({source:join20(srcRoot,relNext),target:fs.realPath?.(target)??target});continue}let source=await resolveDurableArtifactPath(fs,resolve10(srcRoot,"../../.."),join20(srcRoot,relNext),"runs"),dest=await resolveDurableArtifactPath(fs,resolve10(destRoot,"../../.."),join20(destRoot,relNext),"runs");if(!(await lstat2(source)).isFile())throw Error(`persist-out: retained item is not a regular file: ${source}`);let sourceBytes=await readFile6(source),existing=await readExistingRunFile(dest);if(existing!==void 0){if(!existing.equals(sourceBytes)){if(rel!=="")throw Error(`persist-out: retained data conflicts: ${relNext}`);skips.push({id:`${runId}/${relNext}`,reason:`record-conflict:${relNext}`});continue}}else await mkdir3(join20(dest,".."),{recursive:!0}),writeFileSync4(dest,sourceBytes,{flag:"wx"});if(moves.push({source,target:fs.realPath?.(dest)??dest}),moves.push({source:join20(srcRoot,relNext),target:fs.realPath?.(dest)??dest}),rel!=="")moves.push({source:join20(srcRoot,rel),target:fs.realPath?.(join20(destRoot,rel))??join20(destRoot,rel)})}}function writeInlineRunOutcome(runId,outcome){let runDir=runStoragePaths(process.cwd()).recordsDir;if(!existsSync10(runDir))mkdirSync5(runDir,{recursive:!0});let statePath=join20(runDir,`${runId}.state.json`),markdownPath=join20(runDir,`${runId}.md`),prior={};try{let parsed=JSON.parse(readFileSync6(statePath,"utf8"));if(parsed!==null&&typeof parsed==="object"&&!Array.isArray(parsed))prior=parsed}catch{}let at=new Date().toISOString(),state={schemaVersion:1,runId,...outcome.workflowName!==void 0?{workflowName:outcome.workflowName}:{},...outcome.status!==void 0?{status:outcome.status}:{},startedAt:typeof prior.startedAt==="string"?prior.startedAt:at,updatedAt:at,...outcome.attached!==void 0?{attached:outcome.attached}:{},...outcome.definitionDigest!==void 0?{definitionDigest:outcome.definitionDigest}:{},...outcome.workflowVersion!==void 0?{workflowVersion:outcome.workflowVersion}:{},...outcome.resolvedPath!==void 0?{resolvedPath:outcome.resolvedPath}:{},...outcome.layer!==void 0?{layer:outcome.layer}:{},...outcome.workdir!==void 0?{workdir:outcome.workdir}:{},ok:outcome.ok,...outcome.ok===!1&&outcome.error!==void 0?{error:outcome.error}:{}},temp=`${statePath}.tmp`;try{writeFileSync4(temp,`${JSON.stringify(state,null,4)}
3065
+ `)}catch{}}var field=(path,label)=>({path,label}),SOURCE_PROFILES={planning:{producerPackage:"spur",subsystem:"planning",remediationKind:"prefix-filter"},queue:{producerPackage:"@gobing-ai/ts-infra",subsystem:"job-queue",remediationKind:"prefix-filter"},scheduler:{producerPackage:"@gobing-ai/ts-infra",subsystem:"scheduler",remediationKind:"prefix-filter"},message:{producerPackage:"spur",subsystem:"coordination-messaging",remediationKind:"prefix-filter"},process:{producerPackage:"@gobing-ai/ts-runtime",subsystem:"process-executor",remediationKind:"prefix-filter"},workflow:{producerPackage:"@gobing-ai/ts-dual-workflow-engine",subsystem:"workflow",remediationKind:"workflow-trace"},rule:{producerPackage:"@gobing-ai/ts-rule-engine",subsystem:"rule-engine",remediationKind:"rule-trace"},agent:{producerPackage:"@gobing-ai/ts-ai-runner",subsystem:"agent-runner",remediationKind:"prefix-filter"},history:{producerPackage:"spur",subsystem:"history",remediationKind:"prefix-filter"},bus:{producerPackage:"@gobing-ai/ts-infra",subsystem:"event-bus",remediationKind:"prefix-filter"},api:{producerPackage:"spur",subsystem:"http-api",remediationKind:"prefix-filter"},decision:{producerPackage:"spur",subsystem:"decision",remediationKind:"prefix-filter"}};function at(data,path){if(data===null)return;let current=data;for(let segment of path.split(".")){if(current===null||typeof current!=="object"||Array.isArray(current))return;current=current[segment]}return current}function s2(data,...paths){for(let path of paths){let value=at(data,path);if(typeof value==="string"&&value.length>0)return value}return}function n2(data,...paths){for(let path of paths){let value=at(data,path);if(typeof value==="number"&&Number.isFinite(value))return String(value);if(typeof value==="boolean")return String(value)}return}function entityId(input){return s2(input.data,"entity.id")??input.correlation.entityId??""}function looksLikeOpaqueId(value){if(typeof value!=="string")return!1;let v=value.trim();if(v==="")return!1;if(/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(v))return!0;if(/^live[-_][a-z0-9._-]+$/i.test(v))return!0;if(/^(?:eventId|rowId|runId|executionId|actionId)$/i.test(v))return!0;return!1}function humanWorkflowTitle(input){let raw=s2(input.data,"workflowName")??s2(input.data,"workflow");if(raw!==void 0&&!looksLikeOpaqueId(raw))return(raw.split("/").pop()?.replace(/\.(?:ya?ml|json)$/i,"")??raw).replace(/[._-]+$/,"");return""}function humanStepLabel(data){let label=s2(data,"nodeLabel")??s2(data,"stepName")??s2(data,"step");if(label!==void 0&&!looksLikeOpaqueId(label))return label;let node=s2(data,"node");if(node!==void 0&&!looksLikeOpaqueId(node))return node;return}function derivedFrom(...paths){return{support:"derived",derive:({data})=>s2(data,...paths)}}function derivedFromValue(...paths){return{support:"derived",derive:({data})=>n2(data,...paths)??s2(data,...paths)}}var unsupported={support:"unsupported"};function baseEvent(name,source,renderer,payloadPolicy="metadata-only",tier="default",producer){return{name,source,tier,payloadPolicy,renderer,...producer!==void 0?{producer}:{}}}var BASE_CATALOG=[baseEvent("task.created","planning","planning"),baseEvent("task.updated","planning","planning"),baseEvent("task.transitioned","planning","planning"),baseEvent("feature.created","planning","planning"),baseEvent("feature.updated","planning","planning"),baseEvent("feature.transitioned","planning","planning"),baseEvent("queue.consumer.started","queue","queue"),baseEvent("queue.consumer.stopped","queue","queue"),baseEvent("queue.job.enqueued","queue","queue"),baseEvent("queue.job.started","queue","queue"),baseEvent("queue.job.completed","queue","queue"),baseEvent("queue.job.failed","queue","queue"),baseEvent("queue.job.retrying","queue","queue"),baseEvent("queue.stats","queue","queue"),baseEvent("scheduler.job.executed","scheduler","scheduler"),baseEvent("message.sent","message","message"),baseEvent("message.replied","message","message"),baseEvent("message.read","message","message"),baseEvent("process.spawned","process","process"),baseEvent("process.exited","process","process"),baseEvent("process.stopped","process","process"),baseEvent("process.started","process","process"),baseEvent("agent.invoke.start","agent","agent"),baseEvent("agent.invoke.exit","agent","agent"),baseEvent("agent.invoke.escalated","agent","agent","metadata-only","default",{package:"spur",subsystem:"agent-runner"}),baseEvent("agent.invoke.exhausted","agent","agent","metadata-only","default",{package:"spur",subsystem:"agent-runner"}),baseEvent("agent.started","agent","agent"),baseEvent("agent.stopped","agent","agent"),baseEvent("agent.message.sent","agent","agent"),baseEvent("agent.lifecycle.changed","agent","agent"),baseEvent("strategy.changed","agent","agent","metadata-only","default",{package:"spur",subsystem:"fleet-strategy"}),baseEvent("fleet.capacity.changed","agent","agent","metadata-only","default",{package:"spur",subsystem:"write-slot"}),baseEvent("task.assigned","planning","planning"),baseEvent("history.import.completed","history","history-import"),baseEvent("history.analyze.completed","history","history-analyze"),baseEvent("history.daily.failed","history","history-daily"),baseEvent("history.refresh.enqueued","history","history-refresh"),baseEvent("rule.run.start","rule","rule"),baseEvent("rule.eval.start","rule","rule"),baseEvent("rule.eval.done","rule","rule"),baseEvent("rule.eval.error","rule","rule"),baseEvent("rule.run.done","rule","rule"),baseEvent("workflow.run.started","workflow","workflow-run"),baseEvent("workflow.run.done","workflow","workflow-run"),baseEvent("workflow.run.failed","workflow","workflow-run"),baseEvent("workflow.run.finalized","workflow","workflow-run"),baseEvent("workflow.escalation.created","workflow","workflow-run","redacted"),baseEvent("workflow.escalation.projection_failed","workflow","workflow-run","metadata-only"),baseEvent("workflow.run.paused","workflow","workflow-run"),baseEvent("workflow.run.resumed","workflow","workflow-run"),baseEvent("workflow.run.reseeded","workflow","workflow-run"),baseEvent("workflow.node.enter","workflow","workflow-phase"),baseEvent("workflow.phase","workflow","workflow-phase"),baseEvent("workflow.node.transition","workflow","workflow-transition"),baseEvent("workflow.transition","workflow","workflow-transition"),baseEvent("workflow.transition.requested","workflow","workflow-transition","metadata-only","diagnostic"),baseEvent("workflow.transition.denied","workflow","workflow-transition","metadata-only","diagnostic"),baseEvent("workflow.action.started","workflow","workflow-action"),baseEvent("workflow.action.finished","workflow","workflow-action"),baseEvent("workflow.action.failed_continue","workflow","workflow-action"),baseEvent("workflow.guard.evaluated","workflow","workflow-guard","metadata-only","diagnostic"),baseEvent("workflow.hitl.ask","workflow","workflow-hitl","redacted"),baseEvent("workflow.hitl.response","workflow","workflow-hitl","redacted"),baseEvent("workflow.hitl.note","workflow","workflow-hitl","redacted"),baseEvent("workflow.custom","workflow","workflow-custom"),baseEvent("workflow.agent","workflow","workflow-agent","redacted","diagnostic"),baseEvent("workflow.steering","workflow","workflow-steering","redacted"),baseEvent("api.request.error","api","api"),baseEvent("bus.emit.done","bus","bus","metadata-only","diagnostic"),baseEvent("bus.emit.noop","bus","bus","metadata-only","diagnostic"),baseEvent("bus.handler.error","bus","bus","metadata-only","diagnostic"),baseEvent("bus.handler.async.enqueued","bus","bus","metadata-only","diagnostic"),baseEvent("decision.start","decision","decision"),baseEvent("decision.success","decision","decision"),baseEvent("decision.failure","decision","decision"),baseEvent("decision.end","decision","decision"),baseEvent("decision.rejected","decision","decision")],SYSTEM_EVENT_PRESENTERS={"task.created":{description:"A task file was created with a new WBS id.",fields:[field("entity.kind","Entity kind"),field("entity.id","Entity")],summary:({data,correlation})=>`[task] ${entityId({data,correlation})} created`,outcome:unsupported},"task.updated":{description:"An existing task file was updated in place, naming the section that changed.",fields:[field("entity.kind","Entity kind"),field("entity.id","Entity"),field("field","Field"),field("data.mutation.name","Section"),field("data.after","After"),field("data.diff","Diff")],summary:({data,correlation})=>{let section=s2(data,"data.mutation.name"),id=entityId({data,correlation});return section!==void 0?`[task] ${section}`:`[task] ${id||"updated"}`},outcome:unsupported},"task.transitioned":{description:"A task moved between lifecycle states, naming both the previous and new status.",fields:[field("entity.kind","Entity kind"),field("entity.id","Entity"),field("from","From"),field("to","To")],summary:({data,correlation})=>{let id=entityId({data,correlation}),from=s2(data,"from"),to=s2(data,"to");return from!==void 0&&to!==void 0?`[task] ${id} : ${from} -> ${to}`:`[task] ${id} transitioned`},outcome:{support:"derived",derive:({data})=>s2(data,"to")}},"feature.created":{description:"A feature file was created with a new feature id.",fields:[field("entity.kind","Entity kind"),field("entity.id","Entity")],summary:({data,correlation})=>`[feature] ${entityId({data,correlation})} created`,outcome:unsupported},"feature.updated":{description:"An existing feature file was updated in place, naming the section that changed.",fields:[field("entity.kind","Entity kind"),field("entity.id","Entity"),field("field","Field"),field("data.mutation.name","Section"),field("data.after","After"),field("data.diff","Diff")],summary:({data,correlation})=>{let section=s2(data,"data.mutation.name"),id=entityId({data,correlation});return section!==void 0?`[feature] ${section}`:`[feature] ${id||"updated"}`},outcome:unsupported},"feature.transitioned":{description:"A feature moved between lifecycle states, naming both the previous and new status.",fields:[field("entity.kind","Entity kind"),field("entity.id","Entity"),field("from","From"),field("to","To")],summary:({data,correlation})=>{let id=entityId({data,correlation}),from=s2(data,"from"),to=s2(data,"to");return from!==void 0&&to!==void 0?`[feature] ${id} : ${from} -> ${to}`:`[feature] ${id} transitioned`},outcome:{support:"derived",derive:({data})=>s2(data,"to")}},"queue.consumer.started":{description:"The configured queue consumer began polling its named queue.",fields:[field("queueName","Queue"),field("startedAt","Started"),field("pollInterval","Poll interval"),field("batchSize","Batch size"),field("maxConcurrency","Max concurrency"),field("visibilityTimeout","Visibility timeout")],summary:({data})=>{let name=s2(data,"queueName");return name!==void 0?`[queue] ${name} : consumer started`:"[queue] consumer started"},outcome:{support:"derived",derive:({data})=>at(data,"startedAt")!==void 0?"running":void 0}},"queue.consumer.stopped":{description:"The queue consumer stopped, reporting whether it drained in-flight work.",fields:[field("queueName","Queue"),field("stoppedAt","Stopped"),field("drainTimeoutMs","Drain timeout"),field("inFlightAtStop","In flight"),field("drained","Drained")],summary:({data})=>{let name=s2(data,"queueName");return name!==void 0?`[queue] ${name} : consumer stopped`:"[queue] consumer stopped"},outcome:{support:"derived",derive:({data})=>{let drained=at(data,"drained");if(drained===!0)return"drained";if(drained===!1)return"timeout";return}}},"queue.job.enqueued":{description:"A job was enqueued onto the job queue for later processing.",fields:[field("jobId","Job"),field("type","Type"),field("nextRetryAt","Next retry")],summary:({data})=>{let type=s2(data,"type"),jobId=s2(data,"jobId");return type!==void 0&&jobId!==void 0?`[queue] ${type} · job ${jobId} enqueued`:"[queue] job enqueued"},outcome:unsupported},"queue.job.started":{description:"A queued job handler began executing (job identity and phase anchor).",fields:[field("jobId","Job"),field("type","Type"),field("name","Name")],summary:({data})=>{let type=s2(data,"type"),jobId=s2(data,"jobId");return type!==void 0&&jobId!==void 0?`[queue] ${type} · job ${jobId} started`:"[queue] job started"},outcome:unsupported},"queue.job.completed":{description:"A queued job finished successfully with its attempt and duration.",fields:[field("jobId","Job"),field("type","Type"),field("attempt","Attempt"),field("durationMs","Duration (ms)")],summary:({data})=>{let type=s2(data,"type"),jobId=s2(data,"jobId");return type!==void 0&&jobId!==void 0?`[queue] ${type} · job ${jobId} completed`:"[queue] job completed"},outcome:unsupported},"queue.job.failed":{description:"A queued job exhausted its attempts and failed with an error.",fields:[field("jobId","Job"),field("type","Type"),field("attempt","Attempt"),field("maxRetries","Max retries"),field("durationMs","Duration (ms)"),field("error","Error")],summary:({data})=>{let type=s2(data,"type"),jobId=s2(data,"jobId");return type!==void 0&&jobId!==void 0?`[queue] ${type} · job ${jobId} failed`:"[queue] job failed"},outcome:derivedFrom("error")},"queue.job.retrying":{description:"A queued job failed once and is scheduled for another attempt.",fields:[field("jobId","Job"),field("type","Type"),field("attempt","Attempt"),field("maxRetries","Max retries"),field("nextRetryAt","Next retry"),field("error","Error")],summary:({data})=>{let type=s2(data,"type"),jobId=s2(data,"jobId");return type!==void 0&&jobId!==void 0?`[queue] ${type} · job ${jobId} retrying`:"[queue] job retrying"},outcome:{support:"derived",derive:({data})=>{let attempt=at(data,"attempt"),max=at(data,"maxRetries");if(typeof attempt==="number"&&typeof max==="number"&&Number.isFinite(attempt)&&Number.isFinite(max))return`retrying ${attempt}/${max}`;return s2(data,"error")}}},"queue.stats":{description:"Periodic job-queue statistics across ready, running, completed, and failed counts.",fields:[field("ready","Ready"),field("running","Running"),field("completed","Completed"),field("failed","Failed")],summary:()=>"[queue] stats",outcome:unsupported},"scheduler.job.executed":{description:"A scheduler job ran to completion or failed, with its duration.",fields:[field("name","Job"),field("action","Action"),field("durationMs","Duration (ms)"),field("error","Error")],summary:({data})=>{let name=s2(data,"name");return name!==void 0?`[scheduler] ${name}`:"[scheduler] job executed"},outcome:{support:"derived",derive:({data})=>s2(data,"error")??(at(data,"error")===null?"completed":void 0)}},"message.sent":{description:"A team message was sent from one member to another.",fields:[field("msgId","Message"),field("fromId","From"),field("toId","To"),field("threadId","Thread")],summary:({data})=>{let from=s2(data,"fromId"),to=s2(data,"toId");return from!==void 0&&to!==void 0?`[message] ${from} -> ${to}`:"[message] sent"},outcome:unsupported},"message.replied":{description:"A member replied to an existing message thread.",fields:[field("msgId","Message"),field("fromId","From"),field("toId","To"),field("threadId","Thread")],summary:({data})=>{let from=s2(data,"fromId"),thread=s2(data,"threadId");return from!==void 0&&thread!==void 0?`[message] ${from} replied in ${thread}`:"[message] replied"},outcome:unsupported},"message.read":{description:"The recipient marked a message read (first read only).",fields:[field("msgId","Message"),field("fromId","From"),field("toId","Reader"),field("threadId","Thread")],summary:({data})=>{let reader=s2(data,"toId"),msg=s2(data,"msgId");return reader!==void 0&&msg!==void 0?`[message] ${reader} read ${msg}`:"[message] read"},outcome:unsupported},"process.spawned":{description:"A supervised process was spawned with a new pid.",fields:[field("label","Label"),field("pid","PID"),field("agentId","Agent")],summary:({data})=>{let label=s2(data,"label")??n2(data,"pid");return label!==void 0?`[process] ${label} spawned`:"[process] spawned"},outcome:unsupported},"process.exited":{description:"A supervised process exited, carrying its exit code, signal, or failure reason.",fields:[field("label","Label"),field("pid","PID"),field("exitCode","Exit code"),field("signal","Signal"),field("durationMs","Duration (ms)"),field("reason","Reason")],summary:({data})=>{let label=s2(data,"label")??n2(data,"pid");return label!==void 0?`[process] ${label} exited`:"[process] exited"},outcome:{support:"derived",derive:({data})=>{let reason=s2(data,"reason");if(reason!==void 0)return reason;let signal=s2(data,"signal");if(signal!==void 0)return`signal ${signal}`;let code=at(data,"exitCode");if(typeof code==="number"&&Number.isFinite(code))return code===0?"ok":`exit ${code}`;return}}},"process.stopped":{description:"A supervised process was stopped, naming the stopping reason.",fields:[field("label","Label"),field("pid","PID"),field("signal","Signal"),field("reason","Reason")],summary:({data})=>{let label=s2(data,"label")??n2(data,"pid");return label!==void 0?`[process] ${label} stopped`:"[process] stopped"},outcome:derivedFrom("reason")},"process.started":{description:"A process executor started a process with a new pid.",fields:[field("label","Label"),field("pid","PID")],summary:({data})=>{let label=s2(data,"label")??n2(data,"pid");return label!==void 0?`[process] ${label} started`:"[process] started"},outcome:unsupported},"agent.invoke.start":{description:"An agent invocation began, naming the agent and its operation.",fields:[field("agent","Agent"),field("operation","Operation"),field("routing.role","Role"),field("routing.tier","Tier"),field("routing.executor","Executor"),field("routing.source","Selection source")],summary:({data})=>{let agent=s2(data,"agent"),operation=s2(data,"operation");return agent!==void 0&&operation!==void 0?`[agent] ${agent} · ${operation}`:"[agent] invocation started"},outcome:unsupported},"agent.invoke.exit":{description:"An agent invocation exited, reporting its exit code or signal.",fields:[field("agent","Agent"),field("operation","Operation"),field("exitCode","Exit code"),field("signal","Signal"),field("routing.role","Role"),field("routing.tier","Tier"),field("routing.executor","Executor"),field("routing.source","Selection source")],summary:({data})=>{let agent=s2(data,"agent"),operation=s2(data,"operation");return agent!==void 0&&operation!==void 0?`[agent] ${agent} · ${operation} exited`:"[agent] invocation exited"},outcome:{support:"derived",derive:({data})=>{let signal=s2(data,"signal");if(signal!==void 0)return`signal ${signal}`;let code=at(data,"exitCode");if(typeof code==="number"&&Number.isFinite(code))return code===0?"ok":`exit ${code}`;return}}},"agent.invoke.escalated":{description:"An agent invocation escalated from one executor tier to another.",fields:[field("fromExecutor","From executor"),field("fromTier","From tier"),field("toExecutor","To executor"),field("toTier","To tier"),field("trigger","Trigger")],summary:({data})=>{let from=s2(data,"fromExecutor"),to=s2(data,"toExecutor");return from!==void 0&&to!==void 0?`[agent] ${from} -> ${to}`:"[agent] escalation"},outcome:{support:"derived",derive:({data})=>s2(data,"toTier")??s2(data,"trigger")}},"agent.invoke.exhausted":{description:"An agent invocation exhausted every eligible executor tier without success.",fields:[field("stage","Stage"),field("attempts","Attempts"),field("fromTier","From tier"),field("toTier","To tier"),field("fromExecutor","From executor"),field("toExecutor","To executor")],summary:({data})=>{let stage=s2(data,"stage");return stage!==void 0?`[agent] ${stage} escalation exhausted`:"[agent] escalation exhausted"},outcome:derivedFromValue("attempts")},"agent.started":{description:"An agent started, carrying its id and type.",fields:[field("agentId","Agent"),field("agentType","Agent type"),field("pid","PID")],summary:({data})=>{let id=s2(data,"agentId");return id!==void 0?`[agent] ${id} started`:"[agent] started"},outcome:unsupported},"agent.stopped":{description:"An agent stopped, reporting its exit code.",fields:[field("agentId","Agent"),field("exitCode","Exit code")],summary:({data})=>{let id=s2(data,"agentId");return id!==void 0?`[agent] ${id} stopped`:"[agent] stopped"},outcome:derivedFromValue("exitCode")},"strategy.changed":{description:"A project strategy changed (0838), minting a new strategy version for dispatch fencing.",fields:[field("data.projectPath","Project"),field("data.strategy","Strategy"),field("data.version","Version")],summary:({data})=>{let strategy=s2(data,"data.strategy"),version=s2(data,"data.version");return strategy!==void 0?`[strategy] ${strategy}${version!==void 0?` (v${version})`:""}`:"[strategy] changed"},outcome:unsupported},"fleet.capacity.changed":{description:"The project write slot was claimed or released (0837), changing dispatch capacity.",fields:[field("data.projectPath","Project"),field("data.change","Change"),field("data.holderId","Holder")],summary:({data})=>{let change=s2(data,"data.change"),holder=s2(data,"data.holderId");return`[fleet] write slot ${change??"changed"}${holder!==void 0?` — ${holder}`:""}`},outcome:unsupported},"agent.lifecycle.changed":{description:"A fleet member reported its lifecycle state through a host hook (G73): working, idle, or blocked on a human (a permission prompt).",fields:[field("member","Member"),field("state","State"),field("seq","Sequence")],summary:({data})=>{let member=s2(data,"member"),state=s2(data,"state");return member!==void 0?`[agent] ${member} · ${state??"state"}`:"[agent] lifecycle changed"},outcome:{support:"derived",derive:({data})=>s2(data,"state")}},"agent.message.sent":{description:"A message was sent to an agent, reporting delivery success.",fields:[field("agentId","Agent"),field("ok","Delivered")],summary:({data})=>{let id=s2(data,"agentId");return id!==void 0?`[agent] message -> ${id}`:"[agent] message sent"},outcome:derivedFromValue("ok")},"task.assigned":{description:"A task was assigned to an agent, naming the agent when resolved.",fields:[field("memberId","Member"),field("agentType","Agent type"),field("taskId","Task"),field("outcome","Outcome")],summary:({data})=>{let member=s2(data,"memberId"),task=s2(data,"taskId");return task!==void 0&&member!==void 0?`[task] ${task} assigned to ${member}`:"[task] assignment recorded"},outcome:derivedFrom("outcome")},"history.import.completed":{description:"A history import finished, reporting files, messages, and exit code.",fields:[field("source","Source"),field("sources","Sources"),field("files","Files"),field("messages","Messages"),field("durationMs","Duration (ms)"),field("exitCode","Exit code"),field("artifactPath","Artifact"),field("cwd","Project root")],retain:[field("trigger","Refresh trigger"),field("windowStart","Refresh window start"),field("windowEnd","Refresh window end"),field("importMode","Import mode"),field("coverage","Refresh coverage")],summary:({data})=>{let source=s2(data,"source")??s2(data,"sources");return source!==void 0?`[history] import · ${source}`:"[history] import completed"},outcome:derivedFromValue("exitCode")},"history.analyze.completed":{description:"A history analyze pass finished, reporting sources, duration, and exit code.",fields:[field("source","Source"),field("sources","Sources"),field("durationMs","Duration (ms)"),field("exitCode","Exit code"),field("artifactPath","Artifact")],retain:[field("trigger","Refresh trigger"),field("windowStart","Refresh window start"),field("windowEnd","Refresh window end"),field("importMode","Import mode")],summary:({data})=>{let source=s2(data,"source")??s2(data,"sources");return source!==void 0?`[history] analyze · ${source}`:"[history] analyze completed"},outcome:derivedFromValue("exitCode")},"history.daily.failed":{description:"The daily history refresh failed, carrying the detail, reason, and exit code.",fields:[field("source","Source"),field("sources","Sources"),field("detail","Detail"),field("reason","Reason"),field("exitCode","Exit code")],retain:[field("trigger","Refresh trigger"),field("windowStart","Refresh window start"),field("windowEnd","Refresh window end"),field("importMode","Import mode")],summary:()=>"[history] daily failed",outcome:{support:"derived",derive:({data})=>s2(data,"reason")??s2(data,"detail")??n2(data,"exitCode")}},"history.refresh.enqueued":{description:"A completion-triggered history refresh was enqueued, naming its window.",fields:[field("trigger","Trigger"),field("triggerId","Trigger id"),field("jobId","Queue job"),field("windowStart","Window start"),field("windowEnd","Window end"),field("coalesced","Coalesced"),field("outcome","Outcome")],summary:({data})=>{let start=s2(data,"windowStart"),end=s2(data,"windowEnd");return start!==void 0&&end!==void 0?`[history] refresh · ${start} -> ${end}`:"[history] refresh enqueued"},outcome:{support:"derived",derive:({data})=>{let status=s2(data,"outcome");return status!==void 0&&status!=="enqueued"?status:void 0}}},"rule.run.start":{description:"A rule run began with the rule count it will evaluate.",fields:[field("runId","Run"),field("ruleCount","Rules"),field("evaluator","Evaluator")],summary:({data,correlation})=>{let run=s2(data,"runId")??correlation.runId;return run!==void 0?`[rule] run ${run} started`:"[rule] run started"},outcome:unsupported},"rule.eval.start":{description:"A single rule began evaluating.",fields:[field("runId","Run"),field("ruleId","Rule"),field("evaluator","Evaluator"),field("index","Index"),field("total","Total")],summary:({data})=>{let id=s2(data,"ruleId");return id!==void 0?`[rule] ${id} evaluating`:"[rule] evaluating"},outcome:unsupported},"rule.eval.done":{description:"A rule finished evaluating, reporting its findings count and severity.",fields:[field("runId","Run"),field("ruleId","Rule"),field("evaluator","Evaluator"),field("findings","Findings"),field("durationMs","Duration (ms)"),field("severity","Severity")],summary:({data})=>{let id=s2(data,"ruleId");return id!==void 0?`[rule] ${id} evaluated`:"[rule] evaluated"},outcome:derivedFromValue("findings")},"rule.eval.error":{description:"A rule evaluation failed with an error.",fields:[field("runId","Run"),field("ruleId","Rule"),field("evaluator","Evaluator"),field("error","Error")],summary:({data})=>{let id=s2(data,"ruleId");return id!==void 0?`[rule] ${id} error`:"[rule] error"},outcome:derivedFrom("error")},"rule.run.done":{description:"A rule run finished, reporting findings and whether it stopped early.",fields:[field("runId","Run"),field("findings","Findings"),field("durationMs","Duration (ms)"),field("stoppedEarly","Stopped early"),field("severity","Severity")],summary:({data,correlation})=>{let run=s2(data,"runId")??correlation.runId;return run!==void 0?`[rule] run ${run} done`:"[rule] run done"},outcome:{support:"derived",derive:({data})=>n2(data,"findings")??s2(data,"stoppedEarly")}},"workflow.run.started":{description:"A workflow run started, naming the workflow definition.",fields:[field("runId","Run"),field("workflowName","Workflow"),field("mode","Mode"),field("dryRun","Dry run")],summary:(input)=>{let name=humanWorkflowTitle(input);return name!==""?`[workflow] ${name} started`:"[workflow] started"},outcome:unsupported},"workflow.run.done":{description:"A workflow run reached a done terminal state.",fields:[field("runId","Run"),field("workflowName","Workflow"),field("finalState","Final state"),field("transitionsTaken","Transitions")],summary:(input)=>{let name=humanWorkflowTitle(input);return name!==""?`[workflow] ${name} done`:"[workflow] done"},outcome:derivedFrom("finalState")},"workflow.run.failed":{description:"A workflow run failed with a terminal failure reason.",fields:[field("runId","Run"),field("workflowName","Workflow"),field("finalState","Final state"),field("reason","Reason")],summary:(input)=>{let name=humanWorkflowTitle(input);return name!==""?`[workflow] ${name} failed`:"[workflow] failed"},outcome:derivedFrom("reason")},"workflow.run.finalized":{description:"A workflow run settled on a terminal status.",fields:[field("runId","Run"),field("workflowName","Workflow"),field("status","Status")],summary:(input)=>{let name=humanWorkflowTitle(input);return name!==""?`[workflow] ${name} finalized`:"[workflow] finalized"},outcome:derivedFrom("status")},"workflow.escalation.created":{description:"A canonical escalation packet was projected from existing run evidence.",fields:[field("runId","Run"),field("workflowName","Workflow"),field("fingerprint","Fingerprint"),field("artifactPath","Artifact"),field("decision","Decision")],summary:(input)=>{let name=humanWorkflowTitle(input),decision=typeof at(input.data,"decision")==="string"?` — ${String(at(input.data,"decision"))}`:"";return name!==""?`[workflow] escalation packet created (${name}${decision})`:`[workflow] escalation packet created${decision}`},outcome:derivedFrom("decision")},"workflow.escalation.projection_failed":{description:"Escalation packet projection failed; the original failure is preserved untouched.",fields:[field("runId","Run"),field("workflowName","Workflow"),field("error","Error")],summary:()=>"[workflow] escalation packet projection failed",outcome:derivedFrom("error")},"workflow.run.paused":{description:"A workflow run paused at a step, naming the step when available.",fields:[field("runId","Run"),field("workflowName","Workflow"),field("nodeLabel","Step"),field("node","Node"),field("transitionsTaken","Transitions")],summary:(input)=>{let name=humanWorkflowTitle(input),step=humanStepLabel(input.data),parts=[name,step].filter((part)=>typeof part==="string"&&part!=="");return parts.length>0?`[workflow] ${parts.join(" · ")} paused`:"[workflow] paused"},outcome:unsupported},"workflow.run.resumed":{description:"A paused workflow run resumed at a step, naming the step when available.",fields:[field("runId","Run"),field("workflowName","Workflow"),field("nodeLabel","Step"),field("node","Node")],summary:(input)=>{let name=humanWorkflowTitle(input),step=humanStepLabel(input.data),parts=[name,step].filter((part)=>typeof part==="string"&&part!=="");return parts.length>0?`[workflow] ${parts.join(" · ")} resumed`:"[workflow] resumed"},outcome:unsupported},"workflow.run.reseeded":{description:"A workflow run was reseeded to a new state, naming the transition.",fields:[field("runId","Run"),field("workflowName","Workflow"),field("fromState","From"),field("toState","To")],summary:(input)=>{let name=humanWorkflowTitle(input),from=s2(input.data,"fromState"),to=s2(input.data,"toState");if(from!==void 0&&to!==void 0)return name!==""?`[workflow] ${name} : ${from} -> ${to}`:`[workflow] : ${from} -> ${to}`;return name!==""?`[workflow] ${name} reseeded`:"[workflow] reseeded"},outcome:derivedFrom("toState")},"workflow.node.enter":{description:"The engine entered a workflow node, naming the step when available.",fields:[field("runId","Run"),field("workflowName","Workflow"),field("nodeLabel","Step"),field("node","Node"),field("transitionsTaken","Transitions")],summary:(input)=>{let name=humanWorkflowTitle(input),step=humanStepLabel(input.data),parts=[name,step].filter((part)=>typeof part==="string"&&part!=="");return parts.length>0?`[workflow] ${parts.join(" · ")}`:"[workflow] node entered"},outcome:unsupported},"workflow.phase":{description:"A workflow phase changed status, naming the phase.",fields:[field("runId","Run"),field("workflowName","Workflow"),field("phase","Phase"),field("status","Status")],summary:(input)=>{let name=humanWorkflowTitle(input),phase=s2(input.data,"phase"),parts=[name,phase].filter((part)=>typeof part==="string"&&part!=="");return parts.length>0?`[workflow] ${parts.join(" · ")}`:"[workflow] phase"},outcome:derivedFrom("status")},"workflow.node.transition":{description:"A workflow transitioned between nodes, naming the from and to states.",fields:[field("runId","Run"),field("workflowName","Workflow"),field("from","From"),field("to","To"),field("trigger","Trigger")],summary:(input)=>{let name=humanWorkflowTitle(input),from=s2(input.data,"from"),to=s2(input.data,"to");if(from!==void 0&&to!==void 0)return name!==""?`[workflow] ${name} : ${from} -> ${to}`:`[workflow] : ${from} -> ${to}`;return name!==""?`[workflow] ${name} transitioned`:"[workflow] transitioned"},outcome:derivedFrom("to")},"workflow.transition":{description:"A workflow state transition was committed.",fields:[field("runId","Run"),field("workflowName","Workflow"),field("from","From"),field("to","To"),field("trigger","Trigger")],summary:(input)=>{let name=humanWorkflowTitle(input),from=s2(input.data,"from"),to=s2(input.data,"to");if(from!==void 0&&to!==void 0)return name!==""?`[workflow] ${name} : ${from} -> ${to}`:`[workflow] : ${from} -> ${to}`;return name!==""?`[workflow] ${name} transitioned`:"[workflow] transitioned"},outcome:derivedFrom("to")},"workflow.transition.requested":{description:"A workflow transition was requested and accepted for evaluation.",fields:[field("runId","Run"),field("workflowName","Workflow"),field("from","From"),field("to","To"),field("trigger","Trigger")],summary:(input)=>{let name=humanWorkflowTitle(input),from=s2(input.data,"from"),to=s2(input.data,"to");if(from!==void 0&&to!==void 0)return name!==""?`[workflow] ${name} requested ${from} -> ${to}`:`[workflow] requested ${from} -> ${to}`;return name!==""?`[workflow] ${name} transition requested`:"[workflow] transition requested"},outcome:unsupported},"workflow.transition.denied":{description:"A workflow transition was denied with a reason.",fields:[field("runId","Run"),field("workflowName","Workflow"),field("from","From"),field("to","To"),field("reason","Reason")],summary:(input)=>{let name=humanWorkflowTitle(input),from=s2(input.data,"from"),to=s2(input.data,"to");if(from!==void 0&&to!==void 0)return name!==""?`[workflow] ${name} denied ${from} -> ${to}`:`[workflow] denied ${from} -> ${to}`;return name!==""?`[workflow] ${name} transition denied`:"[workflow] transition denied"},outcome:derivedFrom("reason")},"workflow.action.started":{description:"A workflow action began executing, naming the step and kind.",fields:[field("runId","Run"),field("workflowName","Workflow"),field("nodeLabel","Step"),field("node","Node"),field("actionId","Action"),field("kind","Kind")],retain:[field("metadata.agent","Agent"),field("metadata.role","Role"),field("routing.executor","Executor")],summary:(input)=>{let name=humanWorkflowTitle(input),step=humanStepLabel(input.data),parts=[name,step].filter((part)=>typeof part==="string"&&part!=="");return parts.length>0?`[workflow] ${parts.join(" · ")} started`:"[workflow] action started"},outcome:unsupported},"workflow.action.finished":{description:"A workflow action finished, reporting its status and success.",fields:[field("runId","Run"),field("workflowName","Workflow"),field("nodeLabel","Step"),field("node","Node"),field("actionId","Action"),field("kind","Kind"),field("durationMs","Duration (ms)"),field("status","Status")],retain:[field("metadata.agent","Agent"),field("metadata.role","Role"),field("routing.executor","Executor")],summary:(input)=>{let name=humanWorkflowTitle(input),step=humanStepLabel(input.data),parts=[name,step].filter((part)=>typeof part==="string"&&part!=="");return parts.length>0?`[workflow] ${parts.join(" · ")} finished`:"[workflow] action finished"},outcome:{support:"derived",derive:({data})=>s2(data,"status")??n2(data,"ok")}},"workflow.action.failed_continue":{description:"A workflow action failed but the workflow continued, carrying the error.",fields:[field("runId","Run"),field("workflowName","Workflow"),field("nodeLabel","Step"),field("node","Node"),field("transitionsTaken","Transitions"),field("error","Error")],retain:[field("metadata.agent","Agent"),field("metadata.role","Role"),field("routing.executor","Executor")],summary:(input)=>{let name=humanWorkflowTitle(input),step=humanStepLabel(input.data),parts=[name,step].filter((part)=>typeof part==="string"&&part!=="");return parts.length>0?`[workflow] ${parts.join(" · ")} failed; continuing`:"[workflow] action failed; continuing"},outcome:derivedFrom("error")},"workflow.guard.evaluated":{description:"A workflow guard was evaluated for a transition, reporting whether it passed.",fields:[field("runId","Run"),field("workflowName","Workflow"),field("from","From"),field("to","To"),field("kind","Kind"),field("passed","Passed")],summary:(input)=>{let name=humanWorkflowTitle(input),from=s2(input.data,"from"),to=s2(input.data,"to");if(from!==void 0&&to!==void 0)return name!==""?`[workflow] ${name} guard ${from} -> ${to}`:`[workflow] guard ${from} -> ${to}`;return name!==""?`[workflow] ${name} guard evaluated`:"[workflow] guard evaluated"},outcome:derivedFromValue("passed")},"workflow.hitl.ask":{description:"A workflow paused for human input, naming the step and kind.",fields:[field("runId","Run"),field("workflowName","Workflow"),field("nodeLabel","Step"),field("node","Node"),field("kind","Kind")],summary:(input)=>{let name=humanWorkflowTitle(input),step=humanStepLabel(input.data),parts=[name,step].filter((part)=>typeof part==="string"&&part!=="");return parts.length>0?`[workflow] ${parts.join(" · ")} awaiting input`:"[workflow] awaiting input"},outcome:unsupported},"workflow.hitl.response":{description:"Human input was received for a paused workflow step.",fields:[field("runId","Run"),field("workflowName","Workflow"),field("nodeLabel","Step"),field("node","Node"),field("ok","Accepted")],summary:(input)=>{let name=humanWorkflowTitle(input),step=humanStepLabel(input.data),parts=[name,step].filter((part)=>typeof part==="string"&&part!=="");return parts.length>0?`[workflow] ${parts.join(" · ")} input received`:"[workflow] input received"},outcome:derivedFromValue("ok")},"workflow.hitl.note":{description:"A note was recorded on a paused workflow step.",fields:[field("runId","Run"),field("workflowName","Workflow"),field("nodeLabel","Step"),field("node","Node")],summary:(input)=>{let name=humanWorkflowTitle(input),step=humanStepLabel(input.data),parts=[name,step].filter((part)=>typeof part==="string"&&part!=="");return parts.length>0?`[workflow] ${parts.join(" · ")} note`:"[workflow] note"},outcome:unsupported},"workflow.custom":{description:"A custom workflow event was emitted, naming the custom event.",fields:[field("runId","Run"),field("workflowName","Workflow"),field("name","Event")],summary:(input)=>{let name=humanWorkflowTitle(input),custom=s2(input.data,"name"),parts=[name,custom].filter((part)=>typeof part==="string"&&part!=="");return parts.length>0?`[workflow] ${parts.join(" · ")}`:"[workflow] custom"},outcome:unsupported},"workflow.agent":{description:"A workflow-dispatched agent execution lifecycle event, discriminated by kind.",fields:[field("runId","Run"),field("executionId","Execution"),field("actionId","Action"),field("kind","Kind"),field("agent","Agent"),field("model","Model")],retain:[field("metadata.agent","Agent"),field("metadata.role","Role"),field("routing.executor","Executor")],summary:(input)=>{let name=humanWorkflowTitle(input),kind=s2(input.data,"kind"),parts=[name,kind!==void 0?`agent ${kind}`:"agent"].filter((part)=>typeof part==="string"&&part!=="");return parts.length>0?`[workflow] ${parts.join(" · ")}`:"[workflow] agent"},outcome:{support:"derived",derive:({data})=>s2(data,"kind")==="finished"?s2(data,"outcome"):void 0}},"workflow.steering":{description:"A steering command was acknowledged for a workflow action boundary.",fields:[field("runId","Run"),field("actionId","Action"),field("operation","Operation"),field("actor","Actor"),field("accepted","Accepted"),field("state","State"),field("reason","Reason")],summary:(input)=>{let name=humanWorkflowTitle(input),operation=s2(input.data,"operation"),parts=[name,operation!==void 0?`steering ${operation}`:"steering"].filter((part)=>typeof part==="string"&&part!=="");return parts.length>0?`[workflow] ${parts.join(" · ")}`:"[workflow] steering"},outcome:{support:"derived",derive:({data})=>{let reason=s2(data,"reason");if(reason!==void 0)return reason;let accepted=at(data,"accepted");if(accepted===!0)return"accepted";if(accepted===!1)return"rejected";return s2(data,"state")}}},"api.request.error":{description:"An API request failed, naming the method, path, and status or error code.",fields:[field("method","Method"),field("path","Path"),field("status","Status"),field("code","Code"),field("requestId","Request"),field("error","Error")],summary:({data})=>{let method=s2(data,"method"),path=s2(data,"path");return method!==void 0&&path!==void 0?`[api] ${method} ${path}`:"[api] request error"},outcome:{support:"derived",derive:({data})=>s2(data,"error")??s2(data,"code")??n2(data,"status")}},"bus.emit.done":{description:"An event was emitted to its handlers on the event bus.",fields:[field("event","Event"),field("handlers","Handlers"),field("durationMs","Duration (ms)")],summary:({data})=>{let event=s2(data,"event");return event!==void 0?`[bus] ${event} emitted`:"[bus] event emitted"},outcome:derivedFromValue("handlers")},"bus.emit.noop":{description:"An event was emitted but had no registered handlers.",fields:[field("event","Event"),field("handlers","Handlers"),field("durationMs","Duration (ms)")],summary:({data})=>{let event=s2(data,"event");return event!==void 0?`[bus] ${event} had no handlers`:"[bus] event had no handlers"},outcome:derivedFromValue("handlers")},"bus.handler.error":{description:"An event-bus handler threw an error while processing an event.",fields:[field("event","Event"),field("handlers","Handlers"),field("durationMs","Duration (ms)"),field("error","Error")],summary:({data})=>{let event=s2(data,"event");return event!==void 0?`[bus] ${event} handler error`:"[bus] handler error"},outcome:derivedFrom("error")},"bus.handler.async.enqueued":{description:"An event-bus handler was enqueued for asynchronous processing.",fields:[field("event","Event"),field("handlers","Handlers")],summary:({data})=>{let event=s2(data,"event");return event!==void 0?`[bus] ${event} handlers enqueued`:"[bus] handlers enqueued"},outcome:derivedFromValue("handlers")},"decision.start":{description:"A decision invocation began — a maker is about to be asked.",fields:[field("decisionId","Decision"),field("type","Type"),field("maker","Maker"),field("makerSource","Maker source"),field("catalogLayer","Catalog layer"),field("minConfidence","Min confidence")],retain:[field("invocationId","Invocation"),field("caller","Caller"),field("inputKeys","Input keys"),field("evidenceDigest","Evidence digest"),field("correlation.runId","Run"),field("correlation.workflowName","Workflow"),field("correlation.nodeId","Node"),field("correlation.wbs","WBS")],summary:({data})=>{let id=s2(data,"decisionId"),maker=s2(data,"maker");return maker!==void 0?`[decision] ${id??"decision"} asking ${maker}`:`[decision] ${id??"decision"} asking maker`},outcome:unsupported},"decision.success":{description:"A decision invocation returned an accepted model answer (no fallback).",fields:[field("decisionId","Decision"),field("value","Answer"),field("confidence","Confidence"),field("maker","Maker")],retain:[field("invocationId","Invocation"),field("caller","Caller"),field("correlation.runId","Run"),field("correlation.workflowName","Workflow"),field("correlation.nodeId","Node"),field("correlation.wbs","WBS")],summary:({data})=>{let id=s2(data,"decisionId"),value=s2(data,"value");return value!==void 0?`[decision] ${id??"decision"} answered ${value}`:`[decision] ${id??"decision"} answered`},outcome:derivedFromValue("value")},"decision.failure":{description:"A decision invocation served the declared fallback instead of a model answer.",fields:[field("decisionId","Decision"),field("reason","Reason"),field("fallbackValue","Fallback"),field("confidence","Confidence"),field("maker","Maker"),field("error","Error")],retain:[field("invocationId","Invocation"),field("caller","Caller"),field("correlation.runId","Run"),field("correlation.workflowName","Workflow"),field("correlation.nodeId","Node"),field("correlation.wbs","WBS")],summary:({data})=>{let id=s2(data,"decisionId"),reason=s2(data,"reason");return reason!==void 0?`[decision] ${id??"decision"} fell back (${reason})`:`[decision] ${id??"decision"} fell back`},outcome:derivedFromValue("reason")},"decision.end":{description:"A decision invocation finished, with the outcome source and wall-clock duration.",fields:[field("decisionId","Decision"),field("durationMs","Duration ms"),field("value","Answer"),field("source","Source"),field("reason","Reason"),field("maker","Maker"),field("confidence","Confidence")],retain:[field("invocationId","Invocation"),field("caller","Caller"),field("correlation.runId","Run"),field("correlation.workflowName","Workflow"),field("correlation.nodeId","Node"),field("correlation.wbs","WBS")],summary:({data})=>{let id=s2(data,"decisionId"),source=s2(data,"source");return source!==void 0?`[decision] ${id??"decision"} finished via ${source}`:`[decision] ${id??"decision"} finished`},outcome:derivedFromValue("reason")},"decision.rejected":{description:"A caller mistake refused a decision before any maker call (unknown id, maker, or parse).",fields:[field("decisionId","Decision"),field("errorKind","Error kind"),field("message","Message"),field("maker","Maker")],retain:[field("invocationId","Invocation"),field("caller","Caller"),field("correlation.runId","Run"),field("correlation.workflowName","Workflow"),field("correlation.nodeId","Node"),field("correlation.wbs","WBS")],summary:({data})=>{let id=s2(data,"decisionId"),kind=s2(data,"errorKind");return kind!==void 0?`[decision] ${id??"decision"} rejected (${kind})`:`[decision] ${id??"decision"} rejected`},outcome:derivedFromValue("errorKind")}};function inferSeverity(name){if(/(?:failed|error|denied)$/.test(name))return"error";if(/(?:retrying|paused|dropped)$/.test(name))return"warning";return"info"}function resolveCatalogEntry(base){let profile=SOURCE_PROFILES[base.source],presenter=SYSTEM_EVENT_PRESENTERS[base.name];return{name:base.name,prefix:base.name.split(".")[0]??base.name,source:base.source,tier:base.tier,persisted:!0,streamed:!0,payloadPolicy:base.payloadPolicy,renderer:base.renderer,...profile,...base.producer!==void 0?{producerPackage:base.producer.package,subsystem:base.producer.subsystem}:{},severity:inferSeverity(base.name),description:presenter.description,metadataFields:presenter.retain?[...presenter.fields,...presenter.retain.filter((r)=>!presenter.fields.some((f)=>f.path===r.path))]:presenter.fields,remediationKind:profile.remediationKind}}var SYSTEM_EVENT_CATALOG=BASE_CATALOG.map(resolveCatalogEntry),SYSTEM_EVENT_NAMES=SYSTEM_EVENT_CATALOG.map((entry)=>entry.name),SYSTEM_EVENT_PERSISTED_NAMES=SYSTEM_EVENT_CATALOG.filter((entry)=>entry.tier==="default").map((entry)=>entry.name),SYSTEM_EVENT_STREAMED_NAMES=SYSTEM_EVENT_CATALOG.filter((entry)=>entry.tier==="default").map((entry)=>entry.name),SYSTEM_EVENT_PREFIXES=Array.from(new Set(SYSTEM_EVENT_CATALOG.map((entry)=>entry.prefix))),SYSTEM_EVENT_DEFAULT_NAMES=SYSTEM_EVENT_CATALOG.filter((entry)=>entry.tier==="default").map((entry)=>entry.name),SYSTEM_EVENT_DIAGNOSTIC_NAMES=SYSTEM_EVENT_CATALOG.filter((entry)=>entry.tier==="diagnostic").map((entry)=>entry.name);var SYSTEM_EVENT_CATALOG_METADATA=SYSTEM_EVENT_CATALOG.map(({name,prefix,source,tier,renderer,producerPackage,subsystem,severity,description,metadataFields,remediationKind})=>({name,prefix,source,tier,renderer,producerPackage,subsystem,severity,description,metadataFields,remediationKind}));var SYSTEM_EVENT_ENVELOPE_SCHEMA_VERSION=2,MAX_STRING_LENGTH=256,MAX_DEPTH=4,MAX_ARRAY_ITEMS=16,MAX_OBJECT_FIELDS=32,MAX_TOTAL_NODES=128,MAX_FIELD_KEY_LENGTH=64,CORE_METADATA_PATHS=["schemaVersion","eventId","event","at","timestamp","actor","runId","executionId","actionId","commandId","sequence","correlation.runId","correlation.executionId","correlation.actionId","entity.kind","entity.id","entityKind","entityId","jobId","kind","status","outcome","severity","reason","durationMs","usage","metadata.correlationId"],OMITTED_KEY=/^(?:args?|argv|body|command|commandline|content|details|env|environment|message|output|payload|prompt|query|response|stderr|stdin|stdout)$/,SECRET_KEY2=/(?:api[-_]?key|authorization|cookie|credential|password|secret|token)/i,PRODUCER_PACKAGES=new Set(["spur","@gobing-ai/ts-infra","@gobing-ai/ts-runtime","@gobing-ai/ts-ai-runner","@gobing-ai/ts-rule-engine","@gobing-ai/ts-dual-workflow-engine"]);var SAFE_IDENTIFIER=/^[A-Za-z0-9._:-]+$/;function systemEventProjectContext(root,name){let safeRoot=typeof root==="string"?root:"",inferredName=safeRoot.replace(/[\\/]+$/,"").split(/[\\/]/).at(-1)||"unknown";return{name:name&&name.length>0?name:inferredName,root:safeRoot}}function buildSystemEventEnvelope(entry,eventPayload,project,secretValues=[],actor){try{let data=projectSystemEventData(entry,eventPayload,secretValues),correlation=extractEnvelopeCorrelation(eventPayload,secretValues),severity=extractSeverity(eventPayload)??entry?.severity??"warning",presentation=buildPresentation(entry,data,correlation,severity,actor);return{schemaVersion:SYSTEM_EVENT_ENVELOPE_SCHEMA_VERSION,data,context:{project:boundedProjectContext(project,secretValues),producer:{package:entry?.producerPackage??"spur",subsystem:entry?.subsystem??"unknown"},correlation},presentation}}catch{return genericEnvelope(project,secretValues)}}function projectSystemEventData(entry,eventPayload,secretValues=[]){if(eventPayload===null||eventPayload===void 0)return null;let state={nodes:0,seen:new WeakSet,secretValues};if(!isRecord5(eventPayload)){let value=projectValue(eventPayload,state,0);return value===void 0?null:{value}}if(!entry)return null;if(entry.payloadPolicy!=="raw-safe")return projectAllowedMetadata(entry,eventPayload,state);let result={};for(let[key,value]of safeEntries(eventPayload).slice(0,MAX_OBJECT_FIELDS)){let projected=projectKeyValue(key,value,state,0);if(projected!==void 0)result[boundedKey(key)]=projected}return result}function projectAllowedMetadata(entry,eventPayload,state){let result={},paths=new Set([...CORE_METADATA_PATHS,...entry.metadataFields.map((field)=>field.path)]);for(let path of paths){let value=getPath(eventPayload,path);if(value===void 0)continue;let key=path.split(".").at(-1)??path,projected=projectKeyValue(key,value,state,path.split(".").length-1);if(projected!==void 0)setPath(result,path,projected)}return result}function projectKeyValue(key,value,state,depth){if(isOmittedKey(key))return;if((key==="findings"||key==="finding")&&typeof value==="object")return;if(SECRET_KEY2.test(key))return"[REDACTED]";return projectValue(value,state,depth)}function projectValue(value,state,depth){if(state.nodes>=MAX_TOTAL_NODES||depth>MAX_DEPTH)return"[truncated]";if(state.nodes+=1,value===null||typeof value==="boolean")return value;if(typeof value==="number")return Number.isFinite(value)?value:void 0;if(typeof value==="string")return redactAndBound(value,state.secretValues,MAX_STRING_LENGTH);if(typeof value==="bigint")return redactAndBound(String(value),state.secretValues,MAX_STRING_LENGTH);if(typeof value!=="object")return;if(state.seen.has(value))return"[circular]";if(state.seen.add(value),Array.isArray(value)){let result=[];for(let item of value.slice(0,MAX_ARRAY_ITEMS)){let projected=projectValue(item,state,depth+1);if(projected!==void 0)result.push(projected)}if(value.length>MAX_ARRAY_ITEMS)result.push("[truncated]");return result}let result={};for(let[key,item]of safeEntries(value).slice(0,MAX_OBJECT_FIELDS)){let projected=projectKeyValue(key,item,state,depth+1);if(projected!==void 0)result[boundedKey(key)]=projected}return result}function extractEnvelopeCorrelation(eventPayload,secretValues){if(!isRecord5(eventPayload))return{};let nested=isRecord5(eventPayload.correlation)?eventPayload.correlation:{},entity=isRecord5(eventPayload.entity)?eventPayload.entity:{},result={};assignString(result,"runId",eventPayload.runId??eventPayload.run_id??nested.runId,secretValues),assignString(result,"executionId",eventPayload.executionId??nested.executionId,secretValues),assignString(result,"actionId",eventPayload.actionId??nested.actionId,secretValues),assignString(result,"entityKind",eventPayload.entityKind??entity.kind,secretValues),assignString(result,"entityId",eventPayload.entityId??entity.id,secretValues),assignString(result,"jobId",eventPayload.jobId,secretValues);let sequence=eventPayload.sequence;if(typeof sequence==="number"&&Number.isFinite(sequence))result.sequence=sequence;return result}function assignString(target,key,value,secretValues){if(typeof value!=="string"||value.length===0)return;target[key]=redactAndBound(value,secretValues,128)}function projectTablePresentation(input){let{entry,data,correlation,presentation,actor}=input,name=entry?.name??"",isPureEngineRow=name==="workflow.node.enter"||name==="workflow.transition"||name==="workflow.node.transition"||name==="workflow.transition.requested"||name==="workflow.transition.denied"||name==="workflow.run.started"||name==="workflow.run.done"||name==="workflow.run.failed"||name==="workflow.run.finalized"||name==="workflow.run.paused"||name==="workflow.run.resumed"||name==="workflow.run.reseeded",agent;if(!isPureEngineRow&&data!==null){let executor=getPath(data,"routing.executor"),agentField=getPath(data,"agent"),metadataAgent=getPath(data,"metadata.agent");if(typeof executor==="string"&&executor.length>0&&!looksLikeOpaqueId(executor))agent=executor;else if(typeof agentField==="string"&&agentField.length>0&&!looksLikeOpaqueId(agentField))agent=agentField;else if(typeof metadataAgent==="string"&&metadataAgent.length>0&&!looksLikeOpaqueId(metadataAgent))agent=metadataAgent}if(!isPureEngineRow&&agent===void 0&&typeof actor==="string"&&actor.length>0){if(/^[A-Za-z][A-Za-z0-9._:-]*$/.test(actor)&&!PRODUCER_PACKAGES.has(actor)&&!looksLikeOpaqueId(actor))agent=actor}let corrParts=[];if(data!==null){let wfName=getPath(data,"workflowName");if(typeof wfName==="string"&&wfName.length>0&&!looksLikeOpaqueId(wfName))corrParts.push(wfName);let nodeLabel=getPath(data,"nodeLabel");if(typeof nodeLabel==="string"&&nodeLabel.length>0&&!looksLikeOpaqueId(nodeLabel))corrParts.push(nodeLabel);let kind=getPath(data,"kind");if(typeof kind==="string"&&kind.length>0&&!looksLikeOpaqueId(kind)&&kind!==wfName&&kind!==nodeLabel)corrParts.push(kind);let entityKind=getPath(data,"entity.kind")??getPath(data,"entityKind")??correlation.entityKind,entityId=getPath(data,"entity.id")??getPath(data,"entityId")??correlation.entityId;if(typeof entityId==="string"&&entityId.length>0&&!looksLikeOpaqueId(entityId))if(typeof entityKind==="string"&&entityKind.length>0&&!looksLikeOpaqueId(entityKind))corrParts.push(`${entityKind}:${entityId}`);else corrParts.push(entityId)}else{let{entityKind,entityId}=correlation;if(typeof entityId==="string"&&entityId.length>0&&!looksLikeOpaqueId(entityId))if(typeof entityKind==="string"&&entityKind.length>0&&!looksLikeOpaqueId(entityKind))corrParts.push(`${entityKind}:${entityId}`);else corrParts.push(entityId)}if(typeof correlation.sequence==="number"&&Number.isFinite(correlation.sequence))corrParts.push(`#${correlation.sequence}`);let correlators=corrParts.length>0?corrParts.join(" · "):void 0,actionLabel;if(data!==null){let kind=getPath(data,"kind"),op=getPath(data,"operation")??getPath(data,"action");if(typeof kind==="string"&&kind.length>0&&!looksLikeOpaqueId(kind))actionLabel=kind;else if(typeof op==="string"&&op.length>0&&!looksLikeOpaqueId(op))actionLabel=op}if(actionLabel===void 0&&presentation.action?.kind==="filter"&&presentation.action.label)actionLabel=presentation.action.label;return{...correlators!==void 0?{correlators:boundPresentationString(correlators,512)}:{},...actionLabel!==void 0?{actionLabel:boundPresentationString(actionLabel,128)}:{},...agent!==void 0?{agent:boundPresentationString(agent,128)}:{}}}function buildPresentation(entry,data,correlation,severity,actor){let presenter=entry===void 0?void 0:SYSTEM_EVENT_PRESENTERS[entry.name];if(entry===void 0||presenter===void 0)return genericPresentation(severity);let input={data,correlation},summary,description,outcome,fields;try{if(summary=presenter.summary(input),description=presenter.description,fields=buildPresenterFields(presenter,data),presenter.outcome.support==="derived")outcome=presenter.outcome.derive(input)}catch{return genericPresentation(severity)}let basePresentation={severity,summary:boundPresentationString(summary,512)??"System event",description:boundPresentationString(description,512)??"System event.",fields,...outcome!==void 0?{outcome:boundPresentationString(outcome,128)}:{},...buildAction(entry,correlation)},tablePresentation=projectTablePresentation({entry,data,correlation,presentation:basePresentation,actor});return{...basePresentation,...tablePresentation}}function buildPresenterFields(presenter,data){if(!data)return[];let fields=[];for(let field of presenter.fields.slice(0,8)){let value=getPath(data,field.path),rendered=renderFieldValue(value);if(rendered!==void 0)fields.push({label:field.label,value:rendered})}return fields}function boundPresentationString(value,maxLength){if(typeof value!=="string"||value.length===0)return;return value.length<=maxLength?value:`${value.slice(0,maxLength-1)}…`}function genericPresentation(severity){return{severity,summary:"Unknown system event",description:"Unknown system event with bounded metadata.",fields:[]}}function buildAction(entry,correlation){if(!entry)return{};if(entry.remediationKind==="workflow-trace"&&isSafeIdentifier(correlation.runId))return{action:{label:"Trace workflow run",kind:"command",value:`spur workflow trace ${correlation.runId}`}};if(entry.remediationKind==="rule-trace"&&isSafeIdentifier(correlation.runId))return{action:{label:"Trace rule run",kind:"command",value:`spur rule trace ${correlation.runId}`}};if(entry.remediationKind==="prefix-filter")return{action:{label:`Filter ${entry.prefix} events`,kind:"filter",value:`prefix=${entry.prefix}`}};return{}}function extractSeverity(eventPayload){if(!isRecord5(eventPayload))return;return eventPayload.severity==="info"||eventPayload.severity==="warning"||eventPayload.severity==="error"?eventPayload.severity:void 0}function boundedProjectContext(project,secretValues){return{name:redactAndBound(project.name||"unknown",secretValues,128),root:redactAndBound(project.root||"",secretValues,MAX_STRING_LENGTH)}}function genericEnvelope(project,secretValues){return{schemaVersion:SYSTEM_EVENT_ENVELOPE_SCHEMA_VERSION,data:null,context:{project:boundedProjectContext(project,secretValues),producer:{package:"spur",subsystem:"unknown"},correlation:{}},presentation:{severity:"warning",summary:"Unknown system event",description:"Unknown system event with bounded metadata.",fields:[]}}}function getPath(value,path){let current=value;for(let segment of path.split(".")){if(!isRecord5(current))return;current=current[segment]}return current}function renderFieldValue(value){if(typeof value==="string")return value;if(typeof value==="number"&&Number.isFinite(value))return String(value);if(typeof value==="boolean")return String(value);return}function isSafeIdentifier(value){return typeof value==="string"&&SAFE_IDENTIFIER.test(value)}function isOmittedKey(key){let normalized=key.replaceAll(/[^A-Za-z0-9]/g,"").toLowerCase();return OMITTED_KEY.test(normalized)}function setPath(target,path,value){let segments=path.split("."),current=target;for(let segment of segments.slice(0,-1)){let existing=current[segment];if(isRecord5(existing)){current=existing;continue}let nested={};current[segment]=nested,current=nested}let finalSegment=segments.at(-1);if(finalSegment)current[finalSegment]=value}function boundedKey(key){return key.length<=MAX_FIELD_KEY_LENGTH?key:`${key.slice(0,MAX_FIELD_KEY_LENGTH-1)}…`}function isRecord5(value){return value!==null&&typeof value==="object"&&!Array.isArray(value)}function safeEntries(value){try{return Object.entries(value)}catch{return[]}}var DEFAULT_SYSTEM_EVENT_RETENTION_QUOTA=1e4;function resolveRetentionQuotas(config={},prefixes=SYSTEM_EVENT_PREFIXES){let defaultQuota=config.default??DEFAULT_SYSTEM_EVENT_RETENTION_QUOTA,overrides=config.prefixes??{};return prefixes.map((prefix)=>({prefix,quota:overrides[prefix]??defaultQuota}))}function registerSystemEventTap(bus,dao,logger,options={}){let handlers=new Map,inFlight=new Set,diagnosticEnabled=options.diagnosticEnabled===!0,quotas=resolveRetentionQuotas(options.retention);for(let entry of SYSTEM_EVENT_CATALOG){if(entry.tier==="diagnostic"&&!diagnosticEnabled)continue;let handler=(event)=>{let actor=extractSystemEventActor(event),p=persist(dao,entry.prefix,{id:createId("sev"),event_name:entry.name,occurred_at:new Date().toISOString(),actor,payload_json:safeStringify(buildSystemEventEnvelope(entry,event,options.projectContext??systemEventProjectContext(""),options.secretValues,actor)),...extractSystemEventCorrelation(event)},quotas,logger);inFlight.add(p),p.finally(()=>inFlight.delete(p))};handlers.set(entry.name,handler),bus.on(entry.name,handler)}return{unsubscribe:()=>{for(let[name,handler]of handlers)bus.off(name,handler);handlers.clear()},flush:async()=>{while(inFlight.size>0)await Promise.allSettled(inFlight)}}}async function persist(dao,prefix,input,quotas,logger){try{await dao.insert(input),await dao.pruneQuotas(quotas,prefix)}catch(error){logger.warn("system_events tap: persist failed",{name:input.event_name,error:stringifyError(error)})}}function safeStringify(event){try{return JSON.stringify(event??null)}catch{return null}}function extractSystemEventActor(event){if(event&&typeof event==="object"){let obj=event;if(typeof obj.actor==="string"&&obj.actor.length>0)return obj.actor;if(typeof obj.agentId==="string"&&obj.agentId.length>0)return obj.agentId;if(typeof obj.memberId==="string"&&obj.memberId.length>0)return obj.memberId}return null}function extractSystemEventCorrelation(event){let correlation={run_id:null,entity_kind:null,entity_id:null,sequence:null};if(!event||typeof event!=="object")return correlation;let obj=event,nested=obj.correlation&&typeof obj.correlation==="object"?obj.correlation:{},runId=obj.runId??obj.run_id??nested.runId;if(typeof runId==="string"&&runId.length>0)correlation.run_id=runId;if(typeof obj.sequence==="number"&&Number.isFinite(obj.sequence))correlation.sequence=obj.sequence;let entity=obj.entity;if(entity&&typeof entity==="object"){let{kind,id}=entity;if(typeof kind==="string"&&kind.length>0)correlation.entity_kind=kind;if(typeof id==="string"&&id.length>0)correlation.entity_id=id}if(typeof obj.entityKind==="string"&&obj.entityKind.length>0)correlation.entity_kind=obj.entityKind;if(typeof obj.entityId==="string"&&obj.entityId.length>0)correlation.entity_id=obj.entityId;return correlation}function stringifyError(error){if(error instanceof Error)return`${error.name}: ${error.message}`;return String(error)}var TRIPWIRE_CATALOG=Object.freeze({"retry-exhausted":{id:"retry-exhausted",version:1,response:"fail",nextDecision:"Retries are exhausted; an operator must decide to escalate, extend the retry policy, or fail the stage. No further automatic retry is permitted."},"hard-budget":{id:"hard-budget",version:1,response:"fail",nextDecision:"An operator must raise the declared budget or trim the stage scope, then re-run the action; the run stays failed until then."},"capability-denied":{id:"capability-denied",version:1,response:"fail",nextDecision:"An operator must attest the executor capabilities in agent config or lower the stage requiresCapabilities, then re-run the action."},"proof-invalidated":{id:"proof-invalidated",version:1,response:"fail",nextDecision:"An operator must restore the proof inputs or re-establish the verdict (re-verify) before record; recording against a changed tree is blocked."},"output-drop":{id:"output-drop",version:1,response:"continue",nextDecision:"The dispatch completed but its captured evidence is incomplete (bounded relay dropped chunks). Inspect the session/trace for full output if the result is contested."}});var{copyFile:copyFile2,link,mkdir:mkdir2,readFile:readFile5,unlink:unlink2,writeFile:writeFile3}=process.getBuiltinModule("node:fs/promises");function getExecutorTier(executor){if(executor.tier){let declared=executor.tier;return declared==="capable"?"capable-1":declared}let combined=`${executor.name} ${executor.model??""} ${executor.agent}`.toLowerCase();if(/\b(cheap|haiku|flash|lite|mini|fast)\b/.test(combined))return"cheap";if(/\b(capable|opus|pro|sonnet|r1|o1|o3|expert)\b/.test(combined))return"capable-1";return"standard"}init_project_process();init_project_process();function workflowVersionLiteral(workflow){return typeof workflow.version==="string"&&workflow.version!==""?workflow.version:null}var SENSITIVE_PREFIXES=["drizzle/","packages/config/",".github/","plugins/sp/hooks/"],SENSITIVE_GLOBS=["apps/server/src/**/auth*","**/*secret*","**/*.sql"];function globToRegex(glob){let escaped=glob.replace(/[.+^${}()|[\]\\]/g,"\\$&").replaceAll("**/","\x00").replaceAll("**","\x01").replaceAll("*","[^/]*").replaceAll("\x00","(?:.*/)?").replaceAll("\x01",".*");return new RegExp(`^${escaped}$`,"s")}var SENSITIVE_MATCHERS=[...SENSITIVE_PREFIXES.map((prefix)=>({label:prefix,test:(path)=>path.startsWith(prefix)})),...SENSITIVE_GLOBS.map((glob)=>{let regex=globToRegex(glob);return{label:glob,test:(path)=>regex.test(path)}})];var{appendFileSync:appendFileSync5,closeSync,existsSync:existsSync10,lstatSync:lstatSync2,mkdirSync:mkdirSync5,openSync,readdirSync:readdirSync5,readFileSync:readFileSync6,renameSync:renameSync3,unlinkSync:unlinkSync2,writeFileSync:writeFileSync4,writeSync}=process.getBuiltinModule("node:fs"),{lstat:lstat2,mkdir:mkdir3,readdir:readdir2,readFile:readFile6}=process.getBuiltinModule("node:fs/promises");function parseIdentityMetadata(raw){if(raw.trim()==="")return{};try{let parsed=JSON.parse(raw);if(parsed===null||typeof parsed!=="object"||Array.isArray(parsed))return null;return parsed}catch{return null}}async function openInlineRunProjectDb(workdir){let url=join20(resolve10(workdir),".spur","spur.db");mkdirSync5(join20(url,".."),{recursive:!0});let adapter=await createMigratedDb({url});return{adapter,close:()=>adapter.close()}}async function readInstalledInventory(input){let launch=input.spurBin?splitLaunchCommand(input.spurBin,'inline-run-setup "spurBin"'):existsSync10(input.localCli)?{command:"bun",leadingArgs:[input.localCli]}:{command:"spur",leadingArgs:[]};if("error"in launch)throw Error(launch.error);let res=await new NodeProcessExecutor().run({command:launch.command,args:[...launch.leadingArgs,"workflow","show",input.file,"--format","todo","--json"],cwd:input.workdir??process.cwd(),forceBuffered:!0,rejectOnError:!1,timeout:30000});if(res.exitCode!==0){let detail=res.stderr.trim()!==""?res.stderr.trim():`exit ${res.exitCode??-1}`;throw Error(`could not resolve the workflow definition with the installed CLI: ${detail}`)}let value=JSON.parse(res.stdout);if(value&&typeof value==="object"&&"ok"in value&&"data"in value&&value.ok===!0)return value.data;return value}var MAX_CITED_RUN_FILES=64;async function readExistingRunFile(path){let stat=await lstat2(path).catch((error)=>{if(error.code==="ENOENT")return;throw error});if(stat===void 0)return;if(!stat.isFile())throw Error(`persist-out: destination ${path} is not a regular file — refusing to follow it`);return readFile6(path)}async function persistWorktreeRuns(input){let fromDir=resolve10(input.fromWorkdir),toDir=resolve10(input.toWorkdir),fromStat=await lstat2(fromDir).catch(()=>{return});if(fromStat===void 0||!fromStat.isDirectory())throw Error(`persist-out: source worktree does not exist or is not a directory: ${input.fromWorkdir}`);let fromRunDir=join20(fromDir,".spur","run"),toRunDir=join20(toDir,".spur","run"),fromRecordsDir=runStoragePaths(fromDir).recordsDir,toRecordsDir=runStoragePaths(toDir).recordsDir,fs=createNodeFileSystem(),fromEvidence=runStoragePaths(fromDir).evidenceDir,toEvidence=runStoragePaths(toDir).evidenceDir,evidenceCopies=[],evidenceSkipped=[],forwardedWbs=new Set;for(let taskFile of input.taskFiles??[]){let wbs=/^(\d{4})_/.exec(basename5(taskFile))?.[1];if(wbs!==void 0)forwardedWbs.add(wbs)}let hasTaskFilter=input.taskFiles!==void 0,worktreeRunIds=new Set,ownerDb=await openInlineRunProjectDb(fromDir);try{for(let row of await listRunIdRows(ownerDb.adapter)){if(!SAFE_RUN_ID_RE.test(row.id))throw new InvalidWorkflowRunIdError(row.id);worktreeRunIds.add(row.id)}}finally{ownerDb.close()}await resolveDurableArtifactPath(fs,fromDir,join20(fromEvidence,"probe.json"),"evidence");let evidenceNames=await readdir2(fromEvidence).catch((error)=>{if(error.code==="ENOENT")return[];throw error});for(let name of evidenceNames.sort()){let source=await resolveDurableArtifactPath(fs,fromDir,join20(fromEvidence,name),"evidence"),target=await resolveDurableArtifactPath(fs,toDir,join20(toEvidence,name),"evidence"),stat=await lstat2(source);if(!stat.isFile())throw Error(`persist-out: durable evidence is not a regular file: ${name}`);let bytes=await readFile6(source),verdictWbs=/^(\d{4})-verdict\.json$/.exec(name)?.[1],isOwned=!1;if(verdictWbs!==void 0){let parsed=parseVerifyVerdict(bytes.toString(),verdictWbs),raw=JSON.parse(bytes.toString());if(!parsed||parsed.wbs!==verdictWbs||raw.wbs!==void 0&&raw.wbs!==verdictWbs)throw Error(`persist-out: malformed durable verdict identity: ${name}`);isOwned=hasTaskFilter?forwardedWbs.has(verdictWbs):!0}else if(name.endsWith("-feature-verification.json")){let receipt=parseFeatureVerificationReceipt(bytes.toString()),owner=name.slice(0,-26);if(owner!==receipt.runId&&owner!==receipt.featureId)throw Error(`persist-out: malformed durable receipt identity: ${name}`);isOwned=worktreeRunIds.has(receipt.runId)}else throw Error(`persist-out: unclassified durable evidence: ${name}`);let existing=await readExistingRunFile(target);if(existing!==void 0&&!existing.equals(bytes)){if(isOwned)throw Error(`persist-out: durable evidence conflicts: ${name}`);let newer=(await lstat2(target)).mtimeMs>=stat.mtimeMs?"invoking":"worktree";evidenceSkipped.push({name,reason:"foreign-divergent",newer});continue}evidenceCopies.push({source,target,bytes})}let citedNames=new Set,citedDirSkips=new Set;for(let taskFile of input.taskFiles??[]){let content;try{content=await readFile6(resolve10(toDir,taskFile),"utf8")}catch(error){throw Error(`persist-out: merged task file ${taskFile} is unreadable: ${String(error)}`)}for(let match of content.matchAll(RUN_CITATION_RE)){let name=asLiteralRunFileName(match[1]??"");if(name===void 0)continue;if(match[2]!==void 0){citedDirSkips.add(name);continue}if(citedNames.has(name))continue;if(citedNames.size>=MAX_CITED_RUN_FILES)throw Error(`persist-out: merged task files cite more than ${MAX_CITED_RUN_FILES} distinct `+".spur/run/ files — over the fixed citation cap (0984 R3); split the batch or prune the citations");citedNames.add(name)}}if((input.taskFiles??[]).length>0){let prefixes=[...forwardedWbs].map((wbs)=>`${wbs}-`),recordNames=new Set;for(let runId of worktreeRunIds)prefixes.push(`${runId}-`),recordNames.add(`${runId}.md`).add(`${runId}.state.json`);let entries=await readdir2(fromRunDir).catch((error)=>{if(error.code==="ENOENT")return[];throw error}),ownedCounts=new Map;for(let name of entries.sort()){if(recordNames.has(name))continue;let owner=prefixes.find((prefix)=>name.startsWith(prefix));if(owner===void 0)continue;let count=(ownedCounts.get(owner)??0)+1;if(count>MAX_CITED_RUN_FILES)throw Error(`persist-out: owner ${owner} owns more than ${MAX_CITED_RUN_FILES} .spur/run/ files `+"— over the per-owner evidence cap (1012 R1, 1034 R1); split the batch or prune the evidence");ownedCounts.set(owner,count),citedNames.add(name)}}let citedCopies=[],citedSkips=[];for(let name of citedDirSkips)citedSkips.push({id:name,reason:`cited-directory:${name}`});for(let name of citedNames){let scratchPath=join20(fromRunDir,name),durablePath=join20(fromRecordsDir,name),scratchStat=await lstat2(scratchPath).catch(()=>{return}),sourceIsDurable=scratchStat===void 0,sourcePath=sourceIsDurable?durablePath:scratchPath,targetPath=sourceIsDurable?join20(toRecordsDir,name):join20(toRunDir,name),sourceStat=sourceIsDurable?await lstat2(durablePath).catch(()=>{return}):scratchStat,targetBytes=await readExistingRunFile(targetPath);if(sourceStat===void 0){let otherTarget=sourceIsDurable?join20(toRunDir,name):join20(toRecordsDir,name);if(targetBytes===void 0&&await readExistingRunFile(otherTarget)===void 0)throw Error(`persist-out: cited run evidence .spur/run/${name} is missing in both the worktree and `+"the invoking tree — resolve or drop the citation before teardown (0984 R1)");continue}if(!sourceStat.isFile()){let kind=sourceStat.isDirectory()?"directory":sourceStat.isSymbolicLink()?"symlink":"non-file";citedSkips.push({id:name,reason:`cited-${kind}:${name}`});continue}if(targetBytes!==void 0){let sourceBytes=await readFile6(sourcePath);if(!targetBytes.equals(sourceBytes))throw Error(`persist-out: cited run evidence .spur/run/${name} diverges from the invoking tree's `+"existing file — refusing to overwrite; reconcile the two copies by hand (0984 R4)");continue}citedCopies.push({name,sourcePath,targetPath})}let source=await openInlineRunProjectDb(fromDir);try{let runRows=await listRunIdRows(source.adapter);for(let row of runRows)if(!SAFE_RUN_ID_RE.test(row.id))throw new InvalidWorkflowRunIdError(row.id);let recordBytes=new Map;for(let row of runRows){let bookkeeping=row.workflowName!==null&&row.workflowName!==void 0&&isBookkeepingWorkflow(row.workflowName);for(let fileName of[`${row.id}.md`,`${row.id}.state.json`])try{recordBytes.set(fileName,await readFile6(join20(fromRecordsDir,fileName)))}catch(error){if(error.code==="ENOENT"){if(bookkeeping)continue;throw Error(`persist-out: ${row.workflowName??"unknown"} run ${row.id} is missing its run record \`${fileName}\` in the worktree — failing closed before any row transfer `+"(green-run evidence guarantee, 0984 R5 / 1043 R1)")}throw error}}let target=await openInlineRunProjectDb(toDir);try{let{persistedIds,skipped}=await transferRunTables(source.adapter,target.adapter),recordIds=[...persistedIds,...skipped.filter((s)=>s.reason==="id-exists").map((s)=>s.id)],recordSkips=[],referenceMoves=[];if(evidenceCopies.length>0){ensureDurablePlaneIgnored(toDir);for(let copy of evidenceCopies){await mkdir3(join20(copy.target,".."),{recursive:!0});let existing=await readExistingRunFile(copy.target);if(existing!==void 0&&!existing.equals(copy.bytes))throw Error(`persist-out: durable evidence conflicts: ${copy.target}`);if(existing===void 0)writeFileSync4(copy.target,copy.bytes,{flag:"wx"});referenceMoves.push({source:copy.source,target:fs.realPath?.(copy.target)??copy.target})}}if(recordIds.length>0||citedCopies.length>0){mkdirSync5(toRunDir,{recursive:!0}),mkdirSync5(toRecordsDir,{recursive:!0}),ensureDurablePlaneIgnored(toDir);for(let id of recordIds)for(let fileName of[`${id}.md`,`${id}.state.json`]){let sourceBytes=recordBytes.get(fileName);if(sourceBytes===void 0){recordSkips.push({id,reason:`record-missing:${fileName}`});continue}let targetPath=join20(toRecordsDir,fileName),existing=await readExistingRunFile(targetPath);if(existing!==void 0){if(existing.equals(sourceBytes))continue;recordSkips.push({id,reason:`record-conflict:${fileName}`});continue}writeFileSync4(targetPath,sourceBytes,{flag:"wx"})}for(let cited of citedCopies){let sourceBytes=await readFile6(cited.sourcePath),existing=await readExistingRunFile(cited.targetPath);if(existing!==void 0){if(!existing.equals(sourceBytes))throw Error(`persist-out: cited run evidence .spur/run/${cited.name} diverges from the invoking `+"tree's existing file — refusing to overwrite; reconcile the two copies by hand (0984 R4)");continue}writeFileSync4(cited.targetPath,sourceBytes,{flag:"wx"})}for(let id of recordIds)await carryRunRecordDir(fromRecordsDir,toRecordsDir,"",id,recordSkips,referenceMoves)}return await redirectRunStorageReferences(target.adapter,referenceMoves),{ok:!0,persisted:persistedIds.length,skipped:[...skipped,...recordSkips,...citedSkips],...evidenceSkipped.length>0?{evidenceSkipped}:{}}}finally{target.close()}}finally{source.close()}}async function createOrAttachInlineRun(input){let runId=input.runId.trim();if(runId==="")return{ok:!1,error:"inline run setup requires a non-empty runId (driver Run setup step 2)"};let workdir=resolve10(input.workdir),resolved;try{let projection=input.inventory===void 0?void 0:parseWorkflowInventory(input.inventory);if(projection&&!projection.ok)return projection;let inventory=projection?.ok?projection.inventory:void 0;if(inventory&&(!inventory.source||inventory.kind!=="state-machine"))return{ok:!1,error:"inline run setup requires a state-machine inventory with definition source"};if(resolved=await resolveWorkflowDefinition(workdir,inventory?.source?.path??input.file,{validateSchema:!0,...input.embeddedSchemas!==void 0?{embeddedSchemas:input.embeddedSchemas}:{},...!inventory?{registered:input.registered}:{}}),(resolved.workflow.kind??"state-machine")!=="state-machine")return{ok:!1,error:"inline run setup requires a state-machine definition"};if(inventory?.source){let identity=assertInventoryIdentity(inventory,resolved.digest);if(!identity.ok)return identity;if(inventory.name!==resolved.workflow.name)return{ok:!1,error:"inline run setup: inventory workflow name does not match its definition"};resolved={...resolved,layer:inventory.source.layer}}}catch(error){return{ok:!1,error:`inline run setup could not resolve the workflow definition: ${error.message}`}}let digest=resolved.digest,version=workflowVersionLiteral(resolved.workflow),source={path:resolved.path,layer:resolved.layer,workdir},db=await input.getDb(),existing=await new RunDao(db).traceRowById(runId);if(existing!==void 0){let metadata=parseIdentityMetadata(existing.metadata_json);if(metadata===null)return{ok:!1,error:`inline run setup refuses run ${runId}: its existing row has malformed metadata_json, `+"so its identity cannot be verified — delete the stale run row or allocate a new run id"};let resumeDigest=typeof metadata.resumeDefinitionDigest==="string"?metadata.resumeDefinitionDigest:void 0,launchDigest=typeof metadata.definitionDigest==="string"?metadata.definitionDigest:void 0,effectiveDigest=resumeDigest??launchDigest;if(effectiveDigest===void 0)return{ok:!1,error:`inline run setup refuses run ${runId}: its existing row carries no definition digest `+"(pre-identity legacy row) — allocate a new run id instead of attaching an unverifiable identity"};if(effectiveDigest!==digest)return{ok:!1,error:`inline run setup refuses run ${runId}: the resolved definition digest (${digest}) does not match the run's recorded ${resumeDigest!==void 0?"resume":""} digest (${effectiveDigest}) — `+"a changed definition must resume through the explicit resume rules, not silently re-attach"};if(existing.workflow_name!==resolved.workflow.name)return{ok:!1,error:`inline run setup refuses run ${runId}: the run row records workflow "${existing.workflow_name}" but the resolved definition is "${resolved.workflow.name}" — conflicting run identity`};if(typeof metadata.definitionSource!=="object"||metadata.definitionSource===null||Array.isArray(metadata.definitionSource))return{ok:!1,error:`inline run setup refuses run ${runId}: its existing row carries no definition source `+"(path/layer/workdir) — allocate a new run id instead of attaching an unverifiable launch source"};let existingSource=metadata.definitionSource;if(!(typeof existingSource.path==="string"&&resolve10(existingSource.path)===resolved.path&&normalizePersistedWorkflowLayer(existingSource.layer)===resolved.layer&&typeof existingSource.workdir==="string"&&resolve10(existingSource.workdir)===workdir))return{ok:!1,error:`inline run setup refuses run ${runId}: the recorded definition source (${JSON.stringify(existingSource)}) does not match the resolved launch source (${JSON.stringify(source)}) — conflicting project/workdir identity`};return{ok:!0,attached:!0,runId,workflowName:resolved.workflow.name,definitionDigest:digest,workflowVersion:version,resolvedPath:resolved.path,layer:resolved.layer,workdir,status:existing.status}}return await new WorkflowService(createDefaultWorkflowEngineHost(),new DbWorkflowPersistenceAdapter(db)).createOrAttachRun({id:runId,workflow_name:resolved.workflow.name,mode:"state-machine",status:"running",started_at:new Date().toISOString(),completed_at:null,metadata_json:JSON.stringify({definitionDigest:digest,workflowVersion:version,definitionSource:source})}),{ok:!0,attached:!1,runId,workflowName:resolved.workflow.name,definitionDigest:digest,workflowVersion:version,resolvedPath:resolved.path,layer:resolved.layer,workdir,status:"running"}}async function runDecideForInlineRun(input){let optionsFile=join20(resolve10(input.workdir),input.optionsFile),raw;try{raw=JSON.parse(await readFile6(optionsFile,"utf8"))}catch(error){return{ok:!1,error:`decide: unreadable options file ${input.optionsFile}: ${String(error)}`}}let parsed=DecideOptionsSchema.safeParse(raw);if(!parsed.success)return{ok:!1,error:`decide: invalid options — ${parsed.error.issues.map((i)=>i.message).join("; ")}`};let spurConfig=input.spurConfig,result=await new DecideActionRunner(createNodeFileSystem(),{enabled:input.enabled,...spurConfig!==void 0?{decisionService:()=>getDecisionService(spurConfig,resolve10(input.workdir))}:{},...input.observabilityBus!==void 0?{observabilityBus:input.observabilityBus}:{},...input.decisionLog!==void 0?{decisionLog:input.decisionLog}:{}}).execute(raw,{runId:input.runId??"inline-decide",stateOrNodeId:input.node??"decide",workdir:resolve10(input.workdir),vars:input.correlationVars??{},env:{}});if(!result.ok||result.data===void 0)return{ok:!1,error:result.error??"decide: action failed without an error message"};let decision=result.data.decision;return{ok:!0,value:decision.value,degraded:decision.degraded,reason:decision.reason,source:decision.source,backend:decision.backend,confidence:decision.confidence,resultFile:join20(resolve10(input.workdir),parsed.data.resultFile),durationMs:decision.durationMs}}async function carryRunRecordDir(srcRoot,destRoot,rel,runId,skips,moves){let fs=createNodeFileSystem();await resolveDurableArtifactPath(fs,resolve10(srcRoot,"../../.."),join20(srcRoot,rel,"probe"),"runs"),await resolveDurableArtifactPath(fs,resolve10(destRoot,"../../.."),join20(destRoot,rel,"probe"),"runs");let entries;try{entries=await readdir2(join20(srcRoot,rel),{withFileTypes:!0})}catch(error){if(error.code==="ENOENT"){if(rel==="")skips.push({id:runId,reason:"source-missing"});return}throw error}for(let entry of entries){if(rel===""&&![runId,`${runId}.md`,`${runId}.state.json`,`${runId}.log`].includes(entry.name))continue;let relNext=rel===""?entry.name:`${rel}/${entry.name}`;if(entry.isDirectory()){await carryRunRecordDir(srcRoot,destRoot,relNext,runId,skips,moves);let target=join20(destRoot,relNext);if(existsSync10(target))moves.push({source:join20(srcRoot,relNext),target:fs.realPath?.(target)??target});continue}let source=await resolveDurableArtifactPath(fs,resolve10(srcRoot,"../../.."),join20(srcRoot,relNext),"runs"),dest=await resolveDurableArtifactPath(fs,resolve10(destRoot,"../../.."),join20(destRoot,relNext),"runs");if(!(await lstat2(source)).isFile())throw Error(`persist-out: retained item is not a regular file: ${source}`);let sourceBytes=await readFile6(source),existing=await readExistingRunFile(dest);if(existing!==void 0){if(!existing.equals(sourceBytes)){if(rel!=="")throw Error(`persist-out: retained data conflicts: ${relNext}`);skips.push({id:`${runId}/${relNext}`,reason:`record-conflict:${relNext}`});continue}}else await mkdir3(join20(dest,".."),{recursive:!0}),writeFileSync4(dest,sourceBytes,{flag:"wx"});if(moves.push({source,target:fs.realPath?.(dest)??dest}),moves.push({source:join20(srcRoot,relNext),target:fs.realPath?.(dest)??dest}),rel!=="")moves.push({source:join20(srcRoot,rel),target:fs.realPath?.(join20(destRoot,rel))??join20(destRoot,rel)})}}function writeInlineRunOutcome(runId,outcome){let runDir=runStoragePaths(process.cwd()).recordsDir;if(!existsSync10(runDir))mkdirSync5(runDir,{recursive:!0});let statePath=join20(runDir,`${runId}.state.json`),markdownPath=join20(runDir,`${runId}.md`),prior={};try{let parsed=JSON.parse(readFileSync6(statePath,"utf8"));if(parsed!==null&&typeof parsed==="object"&&!Array.isArray(parsed))prior=parsed}catch{}let at=new Date().toISOString(),state={schemaVersion:1,runId,...outcome.workflowName!==void 0?{workflowName:outcome.workflowName}:{},...outcome.status!==void 0?{status:outcome.status}:{},startedAt:typeof prior.startedAt==="string"?prior.startedAt:at,updatedAt:at,...outcome.attached!==void 0?{attached:outcome.attached}:{},...outcome.definitionDigest!==void 0?{definitionDigest:outcome.definitionDigest}:{},...outcome.workflowVersion!==void 0?{workflowVersion:outcome.workflowVersion}:{},...outcome.resolvedPath!==void 0?{resolvedPath:outcome.resolvedPath}:{},...outcome.layer!==void 0?{layer:outcome.layer}:{},...outcome.workdir!==void 0?{workdir:outcome.workdir}:{},ok:outcome.ok,...outcome.ok===!1&&outcome.error!==void 0?{error:outcome.error}:{}},temp=`${statePath}.tmp`;try{writeFileSync4(temp,`${JSON.stringify(state,null,4)}
3066
3066
  `),renameSync3(temp,statePath)}catch{try{unlinkSync2(temp)}catch{}}let headerFd;try{headerFd=openSync(markdownPath,"wx"),writeSync(headerFd,`# spur inline run ${runId} — ${outcome.workflowName??"unknown workflow"} — setup ${at}
3067
3067
  `)}catch{}finally{if(headerFd!==void 0)closeSync(headerFd)}}function projectInlineRunClose(runId,status,context){try{let runDir=runStoragePaths(context?.workdir??process.cwd()).recordsDir;if(!existsSync10(runDir))mkdirSync5(runDir,{recursive:!0});let statePath=join20(runDir,`${runId}.state.json`),prior={};try{let parsed=JSON.parse(readFileSync6(statePath,"utf8"));if(parsed!==null&&typeof parsed==="object"&&!Array.isArray(parsed))prior=parsed}catch{}let at=new Date().toISOString(),state={schemaVersion:1,...prior,runId,status,ok:!0,startedAt:typeof prior.startedAt==="string"?prior.startedAt:context?.startedAt??at,updatedAt:at};delete state.error;let temp=`${statePath}.tmp`;try{writeFileSync4(temp,`${JSON.stringify(state,null,4)}
3068
3068
  `),renameSync3(temp,statePath)}catch(error){try{unlinkSync2(temp)}catch{}throw error}return}catch(error){let detail=error instanceof Error?error.message:String(error);return`failed to project the committed ${status} status into the run-record state file for run ${runId}: ${detail} (the run row is committed; replay the same close to repair)`}}var CLOSE_STATUSES=new Set(["done","failed","paused"]);function isInlineRunCloseStatus(status){return CLOSE_STATUSES.has(status)}var ACTION_STATUSES=new Set(["done","failed"]);function isInlineRunActionStatus(status){return ACTION_STATUSES.has(status)}async function runInlineRunTraceMode(input){if(input.estimated&&input.mode!=="action")return 2;if(input.noSummary===!0&&input.mode!=="close")return 2;let projectRoot=input.projectRoot.trim()===""?{}:{projectRoot:input.projectRoot};if(input.mode==="node-enter"){if(input.node.trim()===""||input.status!==""||input.kind!=="")return 2;if(input.ok!==""||input.durationMs!=="")return 2;return runInlineRunNodeEnter({runId:input.runId,node:input.node,...projectRoot})}if(input.mode==="actions-file"){if(input.status!==""||input.node!==""||input.kind!=="")return 2;if(input.ok!==""||input.durationMs!==""||input.actionsFile.trim()==="")return 2;return runInlineRunTraceBatch({runId:input.runId,actionsFile:input.actionsFile,...projectRoot})}if(input.status.trim()==="")return 2;if(input.mode==="close"){if(!isInlineRunCloseStatus(input.status))return 2;if(input.reason.trim()===""?input.status==="failed":!isTerminalReason(input.reason))return 2;return runInlineRunTrace({runId:input.runId,close:!0,node:"",kind:"",status:input.status,ok:!0,durationMs:0,...input.reason.trim()===""?{}:{reason:input.reason},...input.noSummary===!0?{}:input.summarize===void 0?{}:{summarize:input.summarize},...projectRoot})}if(input.node.trim()===""||input.kind.trim()==="")return 2;if(!isInlineRunActionStatus(input.status))return 2;if(input.ok!=="true"&&input.ok!=="false")return 2;let durationMs;if(input.durationMs.trim()!==""){let parsed=Number(input.durationMs);if(!Number.isFinite(parsed)||parsed<0)return 2;durationMs=parsed}return runInlineRunTrace({runId:input.runId,close:!1,node:input.node,kind:input.kind,status:input.status,ok:input.ok==="true",...durationMs===void 0?{}:{durationMs},...input.estimated?{estimated:!0}:{},...projectRoot})}async function runInlineRunNodeEnter(input){let workdir=input.projectRoot!==void 0&&input.projectRoot.trim()!==""?resolve10(input.projectRoot):process.cwd(),projectDb;try{if(projectDb=await openInlineRunProjectDb(workdir),await new DbWorkflowPersistenceAdapter(projectDb.adapter).loadRun(input.runId)===void 0)throw new RunRowNotFoundError(input.runId);let runDir=runStoragePaths(workdir).recordsDir;if(!existsSync10(runDir))mkdirSync5(runDir,{recursive:!0});let statePath=join20(runDir,`${input.runId}.state.json`),prior={};try{let parsed=JSON.parse(readFileSync6(statePath,"utf8"));if(parsed!==null&&typeof parsed==="object"&&!Array.isArray(parsed))prior=parsed}catch{}let enteredAt=new Date().toISOString(),nodeEnters=prior.nodeEnters!==null&&typeof prior.nodeEnters==="object"&&!Array.isArray(prior.nodeEnters)?{...prior.nodeEnters}:{};nodeEnters[input.node]=enteredAt;let visitedNodes=Array.isArray(prior.visitedNodes)?[...prior.visitedNodes]:[];if(!visitedNodes.includes(input.node))visitedNodes.push(input.node);let state={schemaVersion:1,...prior,runId:input.runId,nodeEnters,visitedNodes,activeNode:input.node,enteredAt,updatedAt:enteredAt},temp=`${statePath}.tmp`;try{writeFileSync4(temp,`${JSON.stringify(state,null,4)}
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sp",
3
- "version": "0.4.6",
3
+ "version": "0.4.7",
4
4
  "description": "Spur — a local-first harness engineering toolkit that wraps mainstream coding agents with constraint checking, workflow orchestration, and history analytics.",
5
5
  "extensions": {
6
6
  "pi": ["./hooks/pi/guard-extension.ts"]