@devflow-tools/claude-code-plugin 0.18.48 → 0.18.49

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.
@@ -3,6 +3,6 @@ import {existsSync,readFileSync,rmSync,mkdirSync,writeFileSync,linkSync,readdirS
3
3
 
4
4
  `)}function W(n,t=0){if(t>6||n==null)return [];if(typeof n=="string")try{return W(JSON.parse(n),t+1)}catch{return []}if(Array.isArray(n)){for(let o of n){let r=W(o,t+1);if(r.length>0)return r}return []}if(typeof n!="object")return [];let e=n;if(Array.isArray(e.detectorCoverage))return e.detectorCoverage.filter(o=>typeof o=="string").slice(0,32);for(let o of Object.values(e)){let r=W(o,t+1);if(r.length>0)return r}return []}function L(n,t,e){if(t>gn||n===null||n===void 0)return null;if(typeof n=="string"){if(Buffer.byteLength(n,"utf8")>fn)return null;try{return L(JSON.parse(n),t+1,e)}catch{return null}}if(typeof n!="object"||e.has(n))return null;if(e.add(n),Array.isArray(n)){for(let r of n.slice(0,16)){let i=L(r,t+1,e);if(i)return i}return null}let o=n;if("evidenceContract"in o)return {contract:o.evidenceContract,canonicalReport:o.canonicalReport};for(let r of ["structuredContent","data","result"])if(r in o){let i=L(o[r],t+1,e);if(i)return i}if(Array.isArray(o.content))for(let r of o.content.slice(0,16)){let i=r&&typeof r=="object"&&"text"in r?r.text:r,s=L(i,t+1,e);if(s)return s}return null}function vn(n,t){if(!n||typeof n!="object"||Array.isArray(n))return null;let e=n;if(e.version!=="1.0"||typeof e.id!="string"||!/^[a-zA-Z0-9][a-zA-Z0-9:._-]{0,127}$/.test(e.id)||typeof e.runtimeProfilingOccurred!="boolean"||typeof e.samplingEvidenceOccurred!="boolean"||!Array.isArray(e.requiredSections)||e.requiredSections.length!==J.length)return null;let o=e.requiredSections.filter(c=>typeof c=="string");if(o.length!==J.length||J.some((c,l)=>o[l]!==c)||!Array.isArray(e.prohibitedClaims)||e.prohibitedClaims.length>16)return null;let r=e.prohibitedClaims.filter(c=>typeof c=="string"&&c.length<=128);if(r.length!==e.prohibitedClaims.length)return null;let i=e.correctionPolicy;if(!i||typeof i!="object"||Array.isArray(i))return null;let s=i;if(s.maxAttempts!==1||s.repeatedViolation!=="fail_open")return null;let a=typeof e.canonicalReport=="string"?e.canonicalReport:t;return typeof a!="string"||Buffer.byteLength(a,"utf8")>pn||J.some(c=>!a.includes(c))?null:{version:"1.0",id:e.id,runtimeProfilingOccurred:e.runtimeProfilingOccurred,samplingEvidenceOccurred:e.samplingEvidenceOccurred,requiredSections:o,prohibitedClaims:r,correctionPolicy:{maxAttempts:1,repeatedViolation:"fail_open"},canonicalReport:a}}function Ve(n){let t;try{if(En(n.toolResponse))return null;t=openGlobalDevFlowDatabase(void 0,{busyTimeoutMs:50});let e=t.getActiveContextReceipt(n.projectRoot,n.sessionId,n.executionId);if(!e)return null;let o=Rn(n.toolInput);if(o.length===0)return null;let r=n.toolName==="Read"?xn(n.toolInput):void 0,i=r?e.selectedFiles?.find(d=>kn(n.projectRoot,d,r)):void 0,s=Sn(n.toolName),a=i?"code":e.canonicalNextAction===s?"action":null,c=i&&o.includes(i)?i:a==="action"&&o.includes(s)?s:void 0;if(a&&c){let d=[e.contextHash,e.requestId??"",a,c,n.toolUseId??`${n.sessionId}:${n.executionId??e.executionId}`].join("\0");t.recordContextSelectionEvent({id:`ctxsel:${createHash$1("sha256").update(d).digest("hex").slice(0,32)}`,projectRoot:n.projectRoot,sessionId:n.sessionId,executionId:e.executionId,requestId:e.requestId,selectionType:a,candidateId:c,toolName:n.toolName,toolUseId:n.toolUseId,selectedAt:Date.now()});}let l=t.listRetrievalLedgerEvents({projectRoot:n.projectRoot,sessionId:n.sessionId,executionId:e.executionId,requestId:e.requestId}).filter(d=>d.stage==="selected"&&o.includes(d.sourceId));for(let d of l)t.appendRetrievalLedgerEvent({...d,id:retrievalLedgerTransitionId(d.id,"consumed",n.toolUseId??n.toolName),stage:"consumed",toolEvidence:[n.toolUseId??n.toolName],evidenceIds:o,actor:n.toolName,reasonCode:"structural_evidence_ref",payload:{...d.payload,consumedByTool:n.toolName},createdAt:Date.now()});return l.length>0&&He({event:"retrieval.attribution.transitioned",identity:{projectRoot:n.projectRoot,sessionId:n.sessionId,executionId:e.executionId,requestId:e.requestId,contextReceipt:e.contextHash},level:"info",timestamp:Date.now(),data:{stage:"consumed",actor:n.toolName,consumedCount:l.length,evidenceRefCount:o.length}}),a}catch(e){throw He({event:"hook.runtime.degraded",identity:{projectRoot:n.projectRoot,sessionId:n.sessionId,executionId:n.executionId,requestId:n.requestId},level:"warn",timestamp:Date.now(),data:{stage:"retrieval_attribution",actor:n.toolName,reason:e instanceof Error?e.message:String(e)}}),e}finally{try{t?.close();}catch{}}}function Rn(...n){let t=new Set,e=(o,r=0)=>{if(!(r>6||o==null)){if(typeof o=="string"){try{e(JSON.parse(o),r+1);}catch{}return}if(Array.isArray(o)){for(let i of o)e(i,r+1);return}if(typeof o=="object")for(let[i,s]of Object.entries(o))if((i==="evidenceRefs"||i==="_devflow_evidence_refs")&&Array.isArray(s))for(let a of s)typeof a=="string"&&a.trim()&&t.add(a.trim());else e(s,r+1);}};for(let o of n)e(o);return [...t]}function xn(n){for(let t of ["file_path","path"]){let e=n[t];if(typeof e=="string"&&e.trim())return e.trim()}}function kn(n,t,e){let o=resolve(n,t),r=isAbsolute(e)?resolve(e):resolve(n,e);return o===r}function Sn(n){return n.startsWith("mcp__")?n.split("__").at(-1)??n:n}function En(n){if(!n||typeof n!="object"||Array.isArray(n))return false;let t=n;return t.ok===false||t.success===false||t.isError===true||!!t.error||["failed","rejected","unavailable"].includes(String(t.status??""))}function He(n){try{h(n);}catch{}}var Cn=new Set(["Write","Edit","NotebookEdit"]);function ze(n){if(!Cn.has(n.toolName)||Pn(n.toolResponse))return null;let t=Fn(n.projectRoot,n.toolInput);if(!t)return null;let e=openGlobalDevFlowDatabase(void 0,{busyTimeoutMs:250});try{let o=e.getActiveContextReceipt(n.projectRoot,n.sessionId,n.executionId),r=o?.canonicalAction?.verificationPlan??[];if(!o||r.length===0)return null;let i=[],s=[];for(let c of r){let l=jn({projectRoot:n.projectRoot,targetFile:t,kind:c.kind,mode:c.mode==="write"?"write":"check",required:c.required===!0,contextReceipt:o.contextHash}),d=`${o.contextHash}\0${n.toolUseId??t}\0${c.kind}\0${t}`,u=`policy-verification:${createHash$1("sha256").update(d).digest("hex")}`,p=Date.now();if(!l){let k=`verification_unavailable:${c.kind}`;e.upsertSessionObligation({obligationId:u,projectRoot:n.projectRoot,sessionId:n.sessionId,executionId:n.executionId,kind:"evidence_contract",state:"degraded",payload:{subtype:"policy_verification",status:"unknown",verificationKind:c.kind,targetFile:t,contextReceipt:o.contextHash},reason:k,createdAt:p,updatedAt:p,resolvedAt:p}),s.push(c.kind),c.required===!0&&F({projectRoot:n.projectRoot,sessionId:n.sessionId,requestId:o.requestId,executionId:n.executionId,kind:"verification.failed",payload:{receiptId:u,reasonCode:k},dedupeKey:`${u}:unavailable`,producer:"devflow-verification-scheduler"});continue}let y={...l,obligationId:u,sessionId:n.sessionId,executionId:n.executionId,requestId:o.requestId};e.upsertSessionObligation({obligationId:u,projectRoot:n.projectRoot,sessionId:n.sessionId,executionId:n.executionId,kind:"evidence_contract",state:"open",payload:{subtype:"policy_verification",status:"scheduled",verificationKind:c.kind,command:l.display,targetFile:t,contextReceipt:o.contextHash,required:c.required===!0},createdAt:p,updatedAt:p});let b=e.enqueueWork({idempotencyKey:u,kind:"verification.policy",projectRoot:n.projectRoot,sessionId:n.sessionId,payload:y,maxAttempts:2,nextAttemptAt:p});F({projectRoot:n.projectRoot,sessionId:n.sessionId,requestId:o.requestId,executionId:n.executionId,kind:"durable_work.owned",payload:{workId:b.id,obligation:"verification"},dedupeKey:`${b.id}:owned`,producer:"devflow-verification-scheduler"}),i.push(l.display);}return [i.length>0?`DevFlow scheduled policy verification: ${i.join(" && ")}`:"",s.length>0?`Verification unavailable and recorded as unknown: ${s.join(", ")}`:""].filter(Boolean).join(`
5
5
  `)||null}finally{e.close();}}function jn(n){let t=qn(n.projectRoot),e=Ln(n.projectRoot),o=t?.scripts??{},r={...t?.dependencies,...t?.devDependencies},i=null;if(n.kind==="formatter"&&(r.prettier||Mn(n.projectRoot)))i=G(e,"prettier",[n.mode==="write"?"--write":"--check",n.targetFile],6e4);else if(n.kind==="typecheck"){let s=ue(o,["typecheck","type-check","check:types"]);s?i=le(e,s,12e4):r.typescript&&existsSync$1(join(n.projectRoot,"tsconfig.json"))&&(i=G(e,"tsc",["--noEmit","--pretty","false"],12e4));}else if(n.kind==="lint"){let s=ue(o,["lint"]);s&&(i=le(e,s,12e4));}else if(n.kind==="test"){let s=Nn(n.projectRoot,n.targetFile);s&&r.vitest?i=G(e,"vitest",["run",s],12e4):s&&(r.jest||r["@jest/core"])&&(i=G(e,"jest",["--runTestsByPath",s],12e4));}else if(n.kind==="build"){let s=ue(o,["build"]);s&&(i=le(e,s,18e4));}else n.kind==="generated_files"&&(i={command:"git",args:["diff","--check","--",n.targetFile],timeoutMs:3e4});return i?{kind:n.kind,...i,display:[i.command,...i.args].map(Un).join(" "),required:n.required,targetFile:n.targetFile,contextReceipt:n.contextReceipt}:null}function le(n,t,e){return n==="yarn"?{command:"yarn",args:["run",t],timeoutMs:e}:n==="pnpm"?{command:"pnpm",args:["run",t],timeoutMs:e}:n==="bun"?{command:"bun",args:["run",t],timeoutMs:e}:{command:"npm",args:["run",t],timeoutMs:e}}function G(n,t,e,o){return n==="pnpm"?{command:"pnpm",args:["exec",t,...e],timeoutMs:o}:n==="yarn"?{command:"yarn",args:[t,...e],timeoutMs:o}:n==="bun"?{command:"bunx",args:[t,...e],timeoutMs:o}:{command:"npx",args:["--no-install",t,...e],timeoutMs:o}}function Fn(n,t){let e=t.file_path??t.notebook_path;if(typeof e!="string"||!e.trim())return null;let o=isAbsolute(e)?resolve(e):resolve(n,e);return $n(n,o)?relative(n,o).split(sep).join("/"):null}function $n(n,t){let e=isAbsolute(t)?resolve(t):resolve(n,t),o=relative(resolve(n),e);return o!==""&&o!==".."&&!o.startsWith(`..${sep}`)&&!isAbsolute(o)}function Pn(n){if(!n||typeof n!="object"||Array.isArray(n))return false;let t=n;return t.ok===false||t.success===false||t.isError===true||!!t.error}function qn(n){try{return JSON.parse(readFileSync$1(join(n,"package.json"),"utf8"))}catch{return null}}function Ln(n){return existsSync$1(join(n,"pnpm-lock.yaml"))?"pnpm":existsSync$1(join(n,"yarn.lock"))?"yarn":existsSync$1(join(n,"bun.lockb"))||existsSync$1(join(n,"bun.lock"))?"bun":"npm"}function Mn(n){return [".prettierrc",".prettierrc.json",".prettierrc.js",".prettierrc.cjs","prettier.config.js","prettier.config.cjs"].some(t=>existsSync$1(join(n,t)))}function ue(n,t){return t.find(e=>typeof n[e]=="string"&&n[e].trim())??null}function Nn(n,t){let e=t.replace(/\.[^.]+$/u,""),o=[".test.ts",".test.tsx",".spec.ts",".spec.tsx",".test.js",".spec.js"];for(let s of o){let a=`${e}${s}`;if(existsSync$1(join(n,a)))return a}let r=join(n,t.split("/").slice(0,-1).join("/")),i=t.split("/").at(-1)?.replace(/\.[^.]+$/u,"");if(!i||!existsSync$1(r))return null;try{return readdirSync$1(r).filter(s=>s.startsWith(`${i}.`)&&/\.(?:test|spec)\.[cm]?[jt]sx?$/u.test(s)).map(s=>relative(n,join(r,s)).split(sep).join("/"))[0]??null}catch{return null}}function Un(n){return /^[A-Za-z0-9_./:@=-]+$/u.test(n)?n:JSON.stringify(n)}function Je(n){if(!n.toolUseId)return null;let t=Xn(n.projectRoot,n.toolUseId);if(!t||t.sessionId!==n.sessionId)return null;let e=Date.now(),o={...t,id:createHash$1("sha256").update(`${t.sessionId}\0${t.toolUseId}\0${t.path}\0${e}`).digest("hex"),phase:"completed",success:n.success,after:Gn(t.path),completedAt:e,error:n.error?.slice(0,500)},r=Zn(n.projectRoot);return mkdirSync$1(dirname(r),{recursive:true}),appendFileSync(r,`${JSON.stringify(o)}
6
- `,{encoding:"utf8",mode:384}),h({event:"canonical.action.validated",identity:{projectRoot:n.projectRoot,sessionId:n.sessionId,executionId:t.executionId,contextReceipt:t.contextReceipt},level:n.success?"info":"warn",timestamp:e,data:{stage:"host_file_state_completed",valid:n.success,operation:t.operation,targetPath:relative(n.projectRoot,t.path),beforeHash:t.before.hash,afterHash:o.after.hash,beforeExists:t.before.exists,afterExists:o.after.exists,reason:o.error,toolUseId:t.toolUseId}}),o}function Gn(n){if(!existsSync$1(n))return {exists:false};try{return {exists:!0,hash:createHash$1("sha256").update(readFileSync$1(n)).digest("hex")}}catch{return {exists:true}}}function We(n){return join(D(n),"file-state")}function Ge(n){return join(We(n),"pending.json")}function Zn(n){return join(We(n),"observations.jsonl")}function Qn(n){try{return JSON.parse(readFileSync$1(Ge(n),"utf8"))}catch{return {}}}function Xn(n,t){let e=Ge(n),o=Qn(n),r=o[t];if(r)return delete o[t],Yn(e,JSON.stringify(o)),r}function Yn(n,t){let e=`${n}.${process.pid}.${Date.now()}.tmp`;writeFileSync$1(e,t,{encoding:"utf8",mode:384}),renameSync$1(e,n);}var to={open:["intent_bound"],intent_bound:["context_ready","context_degraded"],context_ready:["action_required","action_not_required"],context_degraded:["action_required","action_not_required"],action_required:["action_satisfied","action_degraded","action_failed"],action_not_required:["memory_decided","memory_quarantined"],action_satisfied:["memory_decided","memory_quarantined"],action_degraded:["memory_decided","memory_quarantined"],action_failed:["action_satisfied","action_degraded"],memory_decided:["closed","closed_with_degradation","closed_with_retry_work"],memory_quarantined:["closed_with_degradation","closed_with_retry_work"],closed:[],closed_with_degradation:[],closed_with_retry_work:[]};function no(n){return oo(n)}function oo(n){let t=openGlobalDevFlowDatabase(void 0,{busyTimeoutMs:250});try{let e=ao(t,n.artifact);if(co(e.toState))return e;let o=t.getContextReceiptForRequest(n.artifact.projectRoot,n.artifact.sessionId,n.artifact.requestId),r=t.getMemoryTurn(n.artifact.turnId),i=n.artifact.intent==="memory"||r?.source==="explicit_intent";if(!o&&!i)return e;let s=o?ro(n.artifact,o):"context_ready";e.toState==="intent_bound"&&(e=v(t,e,n,s,i?"task_context_not_required":s==="context_ready"?"canonical_context_receipt_ready":"canonical_context_receipt_degraded"));let a=o?io(n.artifact,o):"action_not_required";if((e.toState==="context_ready"||e.toState==="context_degraded")&&(a==="action_not_required"?e=v(t,e,n,"action_not_required","task_action_not_required"):e=v(t,e,n,"action_required","canonical_action_obligation_present")),e.toState==="action_required"){if(a==="action_required")return e;if(a==="action_failed")return v(t,e,n,"action_failed","canonical_action_attempt_failed");a==="action_degraded"?e=v(t,e,n,"action_degraded","canonical_action_unavailable_or_degraded"):a==="action_satisfied"&&(e=v(t,e,n,"action_satisfied","canonical_action_succeeded"));}if(e.toState==="action_failed")if(a==="action_satisfied")e=v(t,e,n,"action_satisfied","canonical_action_retry_succeeded");else if(a==="action_degraded")e=v(t,e,n,"action_degraded","canonical_action_retry_degraded");else return e;let c=s==="context_degraded"||a==="action_degraded";return ["action_not_required","action_satisfied","action_degraded"].includes(e.toState)&&(e=v(t,e,n,n.memoryStatus==="pending"?"memory_quarantined":"memory_decided",n.memoryStatus==="pending"?n.reason:`canonical_memory_${n.memoryStatus}`)),e.toState==="memory_decided"?v(t,e,n,c?"closed_with_degradation":"closed",n.reason):e.toState==="memory_quarantined"?v(t,e,n,n.retryOwned?"closed_with_retry_work":"closed_with_degradation",n.retryOwned?"durable_retry_owner_confirmed":"terminal_obligation_unowned"):e}finally{t.close();}}function Qe(n){let t=openGlobalDevFlowDatabase(void 0,{busyTimeoutMs:250});try{let e=t.getActiveContextReceipt(n.projectRoot,n.sessionId,n.executionId),o=typeof e?.canonicalAction?.binding.turnId=="string"?e.canonicalAction.binding.turnId:void 0;if(!o)return null;let r=t.listLatestTaskIntentArtifacts(n.projectRoot,n.sessionId).find(s=>s.turnId===o),i=t.getMemoryTurn(o);return !r||!i?null:no({artifact:r,memoryStatus:i.status,memoryReceiptId:i.receiptId,reason:n.reason})}finally{t.close();}}function ro(n,t){return n.intent==="memory"||n.intent==="knowledge"||(t.selectedFiles?.length??0)>0?"context_ready":"context_degraded"}function io(n,t){let e=t.canonicalAction,r=(e?(t.actionAttempts??[]).filter(i=>i.tool===e.tool):[]).at(-1);return t.actionSatisfiedAt||r?.status==="succeeded"?"action_satisfied":r&&["failed","timeout","unavailable"].includes(r.status)?"action_failed":t.actionDegradation||e?.status==="degraded"||e?.status==="unsupported"?"action_degraded":e?.required||so(n)?"action_required":"action_not_required"}function so(n){return ["create","modify","debug","test","format"].includes(n.action)||["feature","refactor","performance"].includes(n.intent)}function ao(n,t){let e=n.getLatestTerminalTransition(t.projectRoot,t.sessionId,t.turnId);if(!e)throw new Error(`TERMINAL_INTENT_STATE_MISSING:${t.turnId}`);return e}function v(n,t,e,o,r){if(!to[t.toState]?.includes(o))throw new Error(`TERMINAL_PATH_UNAVAILABLE:${t.toState}->${o}`);let i=t.sequence+1,s=`terminal:${createHash$1("sha256").update(`${e.artifact.artifactHash}\0${i}\0${o}`).digest("hex").slice(0,24)}`,a=n.appendTerminalTransition({projectRoot:e.artifact.projectRoot,projectId:e.artifact.projectId,hostId:e.artifact.hostId,sessionId:e.artifact.sessionId,turnId:e.artifact.turnId,requestId:e.artifact.requestId,executionId:e.artifact.executionId,sequence:i,fromState:t.toState,toState:o,receiptId:s,sourceReceiptId:e.memoryReceiptId??t.receiptId,reason:r,payload:{memoryStatus:e.memoryStatus,retryOwned:e.retryOwned??false,sourceIntentHash:e.artifact.artifactHash},createdAt:Date.now()});return h({event:"terminal.state.transitioned",identity:{projectRoot:e.artifact.projectRoot,projectId:e.artifact.projectId,hostId:e.artifact.hostId,sessionId:e.artifact.sessionId,turnId:e.artifact.turnId,requestId:e.artifact.requestId,...e.artifact.executionId?{executionId:e.artifact.executionId}:{}},level:o==="closed"?"info":o.includes("degradation")||o.includes("retry")||o==="action_failed"?"warn":"info",timestamp:Date.now(),data:{fromState:t.toState,nextState:o,receiptId:s,reason:r}}),a}function co(n){return n==="closed"||n==="closed_with_degradation"||n==="closed_with_retry_work"}function Xe(n){let t=n.hook==="post_tool_use_failure"||!!n.error?.trim()||lo(n.response),e=t?"not_consumed":n.hook==="post_tool_use"?"consumed":"unknown",o=t?uo(n.error,n.response):e==="consumed"?"host_reported_success":"host_outcome_unknown";return {schemaVersion:"host-tool-outcome.v1",toolName:n.toolName,...n.toolUseId?{toolUseId:n.toolUseId}:{},consumption:e,reasonCode:o,receiptId:n.toolUseId??`host-tool:${n.toolName}:${o}`}}function lo(n){if(!n||typeof n!="object"||Array.isArray(n))return false;let t=n;return t.isError===true||t.error?true:typeof t.status=="string"&&["failed","error","rejected","timeout","unavailable"].includes(t.status.toLowerCase())}function uo(n,t){let e=`${n??""} ${JSON.stringify(t??"")}`;return /timeout|timed out|deadline/iu.test(e)?"host_tool_timeout":/unavailable|not found|not registered|unsupported/iu.test(e)?"host_tool_unavailable":"host_tool_failed"}function et(){return generateKeyPairSync("ed25519")}function tt(n){let t=parseTrustedDecisionCommand(n.rawUserEvent,n.allowedOptionIds),e=n.now??Date.now(),o={schemaVersion:"delivery-user-attestation.v1",issuer:n.issuer,keyId:n.keyId,purpose:t.purpose,decisionId:t.decisionId,caseId:n.caseId,caseVersion:n.caseVersion,sessionId:n.sessionId,sourceTurnId:n.sourceTurnId,actorId:n.actorId,targetDecisionHash:n.targetDecisionHash,rawUserEvent:n.rawUserEvent,rawUserEventHash:domainHash("raw-user-event",n.rawUserEvent),selectedValueHash:domainHash("decision-value",{decisionId:t.decisionId,purpose:t.purpose,value:encodeDecisionValue(t.purpose,t.value)}),eventSequence:n.eventSequence,issuedAt:new Date(e).toISOString(),expiresAt:new Date(e+6e4).toISOString(),nonce:n.nonce};return {...o,attestation:sign(null,canonicalJsonBytes(o),n.privateKey).toString("base64url")}}var nt=new Map,ot=new Map;function rt(n){if(typeof n=="string")return /\bDevFlow decision ([A-Za-z0-9._:-]+)/u.exec(x(n))?.[1]}function x(n){return n.replace(/[\u0000-\u001f\u007f\ufffd]+/gu,"").replace(/\s+/gu," ").trim()}function Io(n){if(typeof n=="string")return n.trim()||void 0;if(!n||typeof n!="object"||Array.isArray(n))return;let t=n.answers;if(!t||typeof t!="object"||Array.isArray(t))return;let e=Object.values(t);if(e.length!==1)return;let o=e[0];if(!(Array.isArray(o)||typeof o!="string"))return o.trim()||void 0}async function it(n){if(n.toolName!=="AskUserQuestion")return {handled:false};let t=n.toolInput&&typeof n.toolInput=="object"&&!Array.isArray(n.toolInput)?n.toolInput:{};if(!Array.isArray(t.questions)||t.questions.length!==1)return {handled:false};let e=t.questions[0],o=rt(e.header)??rt(e.question);if(!o)return {handled:false};let r=o.split(/:(?:decision|question|approval):/u)[0],i=wo(n.projectRoot),s=await i.pendingDecision(r);if(!s||s.id!==o)return {handled:true,resolved:false,message:`DevFlow interactive decision rejected: no pending decision matches ${o}. Refresh delivery_status.`};let a=Array.isArray(e.options)?e.options.map(m=>({label:typeof m.label=="string"?x(m.label):"",description:typeof m.description=="string"?x(m.description):""})):[],c=createHash$1("sha256").update(JSON.stringify({decisionId:o,question:x(String(e.question??"")),options:a})).digest("hex"),l=`${n.sessionId}:${o}`,d=ot.get(l);if(d&&d.hash===c&&d.sourceTurnId===(n.sourceTurnId??n.toolUseId))return {handled:true,resolved:false,message:`DevFlow interactive decision ${o} was already presented in this host turn. Reuse the existing answer or refresh delivery_status after resolution.`};ot.set(l,{hash:c,sourceTurnId:n.sourceTurnId??n.toolUseId,count:(d?.count??0)+1});let u=Io(n.toolResponse),p=u?x(u):void 0;if(!p)return {handled:true,resolved:false,message:`DevFlow interactive decision rejected: AskUserQuestion returned no single answer for ${o}. Use /devflow:decide ${o} -- <answer> if this is a free-form clarification.`};if(e.multiSelect===true)return {handled:true,resolved:false,message:`DevFlow interactive decision rejected: ${o} must be a single selection.`};let y;if(s.options.length>0){let m=s.options.map(w=>({label:x(w.label),description:w.description?x(w.description):""}));if(a.length!==m.length||a.some((w,P)=>w.label!==m[P]?.label||w.description!==m[P]?.description))return {handled:true,resolved:false,message:`DevFlow interactive decision rejected: the displayed options do not match the pending decision ${o}. Refresh delivery_status and render its options verbatim.`};let S=s.options.find(w=>x(w.label)===p);if(!S)return {handled:true,resolved:false,message:`DevFlow interactive decision rejected: answer does not match a pending option for ${o}.`};s.kind==="artifact_approval"?y=S.id==="approve"?`/devflow:approve ${o}`:`/devflow:reject ${o} -- ${p}`:y=`/devflow:decide ${o} ${S.id}`;}else {if(a.length>0)return {handled:true,resolved:false,message:`DevFlow interactive decision rejected: ${o} is a free-form clarification and must not be rendered as a choice list.`};y=`/devflow:decide ${o} -- ${p}`;}let b=process.env.DEVFLOW_HOST_ACTOR_ID?.trim()||`user:${process.env.USER?.trim()||"local"}`,k=et(),$=tt({rawUserEvent:y,issuer:"claude-code",keyId:"session-ephemeral",caseId:r,caseVersion:s.caseVersion,sessionId:n.sessionId,sourceTurnId:n.sourceTurnId?.trim()||n.toolUseId?.trim()||`host-turn:${n.sessionId}:${Date.now()}`,actorId:b,targetDecisionHash:s.targetDecisionHash,eventSequence:Date.now(),nonce:randomUUID$1(),privateKey:k.privateKey,allowedOptionIds:s.options.map(m=>m.id)});try{return await i.resolveTrustedDecision({evidence:$,publicKey:k.publicKey,expectedIssuer:"claude-code",expectedKeyId:"session-ephemeral"}),{handled:!0,resolved:!0,message:`DevFlow interactive decision resolved for ${r}. Refresh delivery_status and follow nextActions.`}}catch(m){return {handled:true,resolved:false,message:`DevFlow interactive decision rejected: ${m instanceof Error?m.message:String(m)}`}}}function wo(n){let t=nt.get(n);if(t)return t;let e=createTrustedDeliveryFacade(n);return nt.set(n,e),e}function st(n){if(!n)return;let t=typeof n.status=="string"?n.status:void 0;if(!(n.ok===false||n.success===false||n.isError===true||t==="failed"||t==="rejected"||!!n.error))return;let o=n.error;if(typeof o=="string"&&o.trim())return o;if(o&&typeof o=="object"){let r=o;if(typeof r.message=="string"&&r.message.trim())return r.message;if(typeof r.code=="string"&&r.code.trim())return r.code}return t?`Tool response status: ${t}`:"Tool response reported failure"}function To(n,t,e,o){try{let r=join$1(D(n),"event-map.json");if(!existsSync(r))return null;let i=JSON.parse(readFileSync(r,"utf-8")),s=i.filter(l=>l.toolName===e&&(!l.sessionId||l.sessionId===t));if(s.length===0)return null;let a=o?s.find(l=>l.toolUseId===o):s.sort((l,d)=>l.timestamp-d.timestamp)[0];if(!a)return null;let c=i.findIndex(l=>l.eventId===a.eventId);return c!==-1&&i.splice(c,1),writeFileSync(r,JSON.stringify(i)),{eventId:a.eventId,timestamp:a.timestamp}}catch{return null}}function at(n){if(!n)return 0;let t=n;if(typeof n=="string")try{t=JSON.parse(n);}catch{return 1}let e=t,o=["files","results","data","result","memories","nodes","chunks","findings","symbols","keySymbols"],r=["reasoning","riskHints","nextActions"],i=Array.isArray(e.data)?e.data:e.structuredContent??e;if(Array.isArray(i))return i.length;if(typeof i=="object"&&i!==null){let s=i,a=0,c=false;for(let d of o)Array.isArray(s[d])&&(c=true,a+=s[d].length);for(let d of r)Array.isArray(s[d])&&(a+=s[d].length);for(let[,d]of Object.entries(s))d&&typeof d=="object"&&!Array.isArray(d)&&(a+=at(d));let l=!!(s._devflow||s._devflow_unique||s.taskType);return a===0&&l&&!c?1:a>0?a:c?0:Object.keys(s).length>0?1:0}return 0}async function Oo(n){if(!n)return null;let t;try{t=JSON.parse(n);}catch{return null}let e=t.tool_name||"",o=te(),r=t.tool_input||{},i=t.tool_response||{},s=t.session_id?.trim()||null,a=new T(o);if(s&&a.registerSession(s),s){let f=await it({projectRoot:o,sessionId:s,sourceTurnId:a.get(s)?.activeTurnId,toolName:e,toolInput:r,toolResponse:i,toolUseId:t.tool_use_id});if(f.handled)return f.message}let c=resolveClaudeToolName(e,r),l=c.status==="unsupported"?void 0:c.canonicalName;if(s&&l==="get_project_context"&&a.completeContextInitialization(s,t.tool_use_id),e==="Skill"){let f=typeof r=="object"&&r.skill?r.skill:"",g=Le(f);s&&g&&(a.startExecution(s,g,qe(g)),se(o,{lastMcpCall:Math.floor(Date.now()/1e3),bypassCount:0}));}let d=s?a.get(s):null;if(e.startsWith("mcp__")){let f=new H(o,s??void 0,d?.executionId??s??void 0);f.recordMcpCall();let g=st(typeof i=="object"&&i!==null?i:null),_=l??e,X=f.getContextReceipt?.()?.canonicalAction?.tool===_;if((f.recordDomainActionOutcome(_,g?Co(g):"succeeded",g,t.tool_use_id)||X)&&s){let O=Xe({hook:"post_tool_use",toolName:_,...t.tool_use_id?{toolUseId:t.tool_use_id}:{},response:i,...g?{error:g}:{}});F({projectRoot:o,sessionId:s,executionId:d?.executionId??s,kind:O.consumption==="consumed"?"action.succeeded":"action.failed",payload:{receiptId:O.receiptId,reasonCode:O.reasonCode,consumption:O.consumption,tool:_},dedupeKey:`${O.receiptId}:${O.consumption}`,producer:"devflow-post-tool-use"});try{Qe({projectRoot:o,sessionId:s,executionId:d?.executionId??s,reason:g?"post_tool_action_failed":"post_tool_action_succeeded"});}catch{}}}s&&Ve({projectRoot:o,sessionId:s,executionId:d?.executionId,toolName:e,toolInput:r,toolResponse:i,toolUseId:t.tool_use_id});let u=s?To(o,s,e,t.tool_use_id):null,p=s&&t.tool_use_id&&!u?(()=>{try{let f=openGlobalDevFlowDatabase();try{return f.getToolCallEventByToolUseId(s,t.tool_use_id)}finally{f.close();}}catch{return null}})():null,y=u??p,b=typeof i=="object"&&i!==null?i:null,k=JSON.stringify(i),$=Buffer.byteLength(k,"utf8"),m=at(i),S=st(b);if(s&&Je({projectRoot:o,sessionId:s,toolUseId:t.tool_use_id,success:!S,error:S}),d?.executionId!==void 0||l!==void 0||e==="Skill"){let f=getLogWriter(o),g=d?.executionId??`auto-${s??Date.now()}`;f.toolCall({tool:e,runId:g,stepId:`step-${g}`,input:r,output:i,duration:y?Math.max(0,Date.now()-y.timestamp):0,success:!b?.error,resultCount:m,resultSizeBytes:$,error:b?.error});}if(y&&s){let f=typeof i=="string"?i:JSON.stringify(i),g=f.length>5e3?{_truncated:true,_originalSize:f.length,text:f.slice(0,5e3)}:i,_=S,X=_?classifyWorkflowFailure({stepId:e,toolName:e,output:i,error:new Error(_),errorStack:_}).category:void 0;await new B().completeEvent({eventId:y.eventId,sessionId:s,output:g,error:_,failureCategory:X,duration:y?Math.max(0,Date.now()-y.timestamp):0,completedAt:Date.now()});}let P=typeof r=="object"&&r.command?r.command:"",Z=b?.exitCode,ct=b?.stderr,dt=/^\s*(ls|cat|pwd|cd|echo|head|tail|wc|which|whoami|date|env|printenv|id|hostname|uname)\b/,E,A,Q=true;if(e.startsWith("mcp__"))E="mcp_call",A={mcpTool:l??e,query:typeof r=="object"&&r.query?r.query:null,resultCount:m,resultSizeBytes:$};else if(e==="Read"||e==="Write"||e==="Edit")E=e==="Read"?"file_read":"file_write",A={filePath:typeof r=="object"&&r.file_path?r.file_path:null,fileContentSize:$};else if(e==="Bash"){let f=dt.test(P),g=Z!==void 0&&Z!==0;Q=!f||g,E=g?"bash_error":"bash_command",A={command:P||e,exitCode:Z??null,stderr:ct??null};}else e==="Agent"?(E="subagent",A={subagentType:typeof r=="object"&&r.subagent_type?r.subagent_type:null,description:typeof r=="object"&&r.description?String(r.description).slice(0,200):null}):e==="WebSearch"||e==="WebFetch"?(E=e==="WebSearch"?"web_search":"web_fetch",A={query:typeof r=="object"&&r.query?String(r.query).slice(0,200):null}):(Q=false,E="tool_use",A={});if(Q){let f={id:t.tool_use_id?`memory:${Me(s??"",t.tool_use_id)}`:`evt:${Date.now()}:${Math.random().toString(36).slice(2,7)}`,sessionId:s??"",tool:e,kind:E,payload:{...A,durationMs:y?Math.max(0,Date.now()-y.timestamp):0},createdAt:Date.now()};s&&N(`/api/memory/session-events?rootPath=${encodeURIComponent(o)}`,f);}let lt=Ue({toolName:e,toolResponse:i,sessionId:s,toolUseId:t.tool_use_id,runtimeStore:a}),ut=s?ze({projectRoot:o,sessionId:s,executionId:d?.executionId,toolName:e,toolInput:r,toolResponse:i,toolUseId:t.tool_use_id}):null;return [lt,ut].filter(f=>!!f).join(`
6
+ `,{encoding:"utf8",mode:384}),h({event:"canonical.action.validated",identity:{projectRoot:n.projectRoot,sessionId:n.sessionId,executionId:t.executionId,contextReceipt:t.contextReceipt},level:n.success?"info":"warn",timestamp:e,data:{stage:"host_file_state_completed",valid:n.success,operation:t.operation,targetPath:relative(n.projectRoot,t.path),beforeHash:t.before.hash,afterHash:o.after.hash,beforeExists:t.before.exists,afterExists:o.after.exists,reason:o.error,toolUseId:t.toolUseId}}),o}function Gn(n){if(!existsSync$1(n))return {exists:false};try{return {exists:!0,hash:createHash$1("sha256").update(readFileSync$1(n)).digest("hex")}}catch{return {exists:true}}}function We(n){return join(D(n),"file-state")}function Ge(n){return join(We(n),"pending.json")}function Zn(n){return join(We(n),"observations.jsonl")}function Qn(n){try{return JSON.parse(readFileSync$1(Ge(n),"utf8"))}catch{return {}}}function Xn(n,t){let e=Ge(n),o=Qn(n),r=o[t];if(r)return delete o[t],Yn(e,JSON.stringify(o)),r}function Yn(n,t){let e=`${n}.${process.pid}.${Date.now()}.tmp`;writeFileSync$1(e,t,{encoding:"utf8",mode:384}),renameSync$1(e,n);}var to={open:["intent_bound"],intent_bound:["context_ready","context_degraded"],context_ready:["action_required","action_not_required"],context_degraded:["action_required","action_not_required"],action_required:["action_satisfied","action_degraded","action_failed"],action_not_required:["memory_decided","memory_quarantined"],action_satisfied:["memory_decided","memory_quarantined"],action_degraded:["memory_decided","memory_quarantined"],action_failed:["action_satisfied","action_degraded"],memory_decided:["closed","closed_with_degradation","closed_with_retry_work"],memory_quarantined:["closed_with_degradation","closed_with_retry_work"],closed:[],closed_with_degradation:[],closed_with_retry_work:[]};function no(n){return oo(n)}function oo(n){let t=openGlobalDevFlowDatabase(void 0,{busyTimeoutMs:250});try{let e=ao(t,n.artifact);if(co(e.toState))return e;let o=t.getContextReceiptForRequest(n.artifact.projectRoot,n.artifact.sessionId,n.artifact.requestId),r=t.getMemoryTurn(n.artifact.turnId),i=n.artifact.intent==="memory"||r?.source==="explicit_intent";if(!o&&!i)return e;let s=o?ro(n.artifact,o):"context_ready";e.toState==="intent_bound"&&(e=v(t,e,n,s,i?"task_context_not_required":s==="context_ready"?"canonical_context_receipt_ready":"canonical_context_receipt_degraded"));let a=o?io(n.artifact,o):"action_not_required";if((e.toState==="context_ready"||e.toState==="context_degraded")&&(a==="action_not_required"?e=v(t,e,n,"action_not_required","task_action_not_required"):e=v(t,e,n,"action_required","canonical_action_obligation_present")),e.toState==="action_required"){if(a==="action_required")return e;if(a==="action_failed")return v(t,e,n,"action_failed","canonical_action_attempt_failed");a==="action_degraded"?e=v(t,e,n,"action_degraded","canonical_action_unavailable_or_degraded"):a==="action_satisfied"&&(e=v(t,e,n,"action_satisfied","canonical_action_succeeded"));}if(e.toState==="action_failed")if(a==="action_satisfied")e=v(t,e,n,"action_satisfied","canonical_action_retry_succeeded");else if(a==="action_degraded")e=v(t,e,n,"action_degraded","canonical_action_retry_degraded");else return e;let c=s==="context_degraded"||a==="action_degraded";return ["action_not_required","action_satisfied","action_degraded"].includes(e.toState)&&(e=v(t,e,n,n.memoryStatus==="pending"?"memory_quarantined":"memory_decided",n.memoryStatus==="pending"?n.reason:`canonical_memory_${n.memoryStatus}`)),e.toState==="memory_decided"?v(t,e,n,c?"closed_with_degradation":"closed",n.reason):e.toState==="memory_quarantined"?v(t,e,n,n.retryOwned?"closed_with_retry_work":"closed_with_degradation",n.retryOwned?"durable_retry_owner_confirmed":"terminal_obligation_unowned"):e}finally{t.close();}}function Qe(n){let t=openGlobalDevFlowDatabase(void 0,{busyTimeoutMs:250});try{let e=t.getActiveContextReceipt(n.projectRoot,n.sessionId,n.executionId),o=typeof e?.canonicalAction?.binding.turnId=="string"?e.canonicalAction.binding.turnId:void 0;if(!o)return null;let r=t.listLatestTaskIntentArtifacts(n.projectRoot,n.sessionId).find(s=>s.turnId===o),i=t.getMemoryTurn(o);return !r||!i?null:no({artifact:r,memoryStatus:i.status,memoryReceiptId:i.receiptId,reason:n.reason})}finally{t.close();}}function ro(n,t){return n.intent==="memory"||n.intent==="knowledge"||(t.selectedFiles?.length??0)>0?"context_ready":"context_degraded"}function io(n,t){let e=t.canonicalAction,r=(e?(t.actionAttempts??[]).filter(i=>i.tool===e.tool):[]).at(-1);return t.actionSatisfiedAt||r?.status==="succeeded"?"action_satisfied":r&&["failed","timeout","unavailable"].includes(r.status)?"action_failed":t.actionDegradation||e?.status==="degraded"||e?.status==="unsupported"?"action_degraded":e?.required||so(n)?"action_required":"action_not_required"}function so(n){return ["create","modify","debug","test","format"].includes(n.action)||["feature","refactor","performance"].includes(n.intent)}function ao(n,t){let e=n.getLatestTerminalTransition(t.projectRoot,t.sessionId,t.turnId);if(!e)throw new Error(`TERMINAL_INTENT_STATE_MISSING:${t.turnId}`);return e}function v(n,t,e,o,r){if(!to[t.toState]?.includes(o))throw new Error(`TERMINAL_PATH_UNAVAILABLE:${t.toState}->${o}`);let i=t.sequence+1,s=`terminal:${createHash$1("sha256").update(`${e.artifact.artifactHash}\0${i}\0${o}`).digest("hex").slice(0,24)}`,a=n.appendTerminalTransition({projectRoot:e.artifact.projectRoot,projectId:e.artifact.projectId,hostId:e.artifact.hostId,sessionId:e.artifact.sessionId,turnId:e.artifact.turnId,requestId:e.artifact.requestId,executionId:e.artifact.executionId,sequence:i,fromState:t.toState,toState:o,receiptId:s,sourceReceiptId:e.memoryReceiptId??t.receiptId,reason:r,payload:{memoryStatus:e.memoryStatus,retryOwned:e.retryOwned??false,sourceIntentHash:e.artifact.artifactHash},createdAt:Date.now()});return h({event:"terminal.state.transitioned",identity:{projectRoot:e.artifact.projectRoot,projectId:e.artifact.projectId,hostId:e.artifact.hostId,sessionId:e.artifact.sessionId,turnId:e.artifact.turnId,requestId:e.artifact.requestId,...e.artifact.executionId?{executionId:e.artifact.executionId}:{}},level:o==="closed"?"info":o.includes("degradation")||o.includes("retry")||o==="action_failed"?"warn":"info",timestamp:Date.now(),data:{fromState:t.toState,nextState:o,receiptId:s,reason:r}}),a}function co(n){return n==="closed"||n==="closed_with_degradation"||n==="closed_with_retry_work"}function Xe(n){let t=n.hook==="post_tool_use_failure"||!!n.error?.trim()||lo(n.response),e=t?"not_consumed":n.hook==="post_tool_use"?"consumed":"unknown",o=t?uo(n.error,n.response):e==="consumed"?"host_reported_success":"host_outcome_unknown";return {schemaVersion:"host-tool-outcome.v1",toolName:n.toolName,...n.toolUseId?{toolUseId:n.toolUseId}:{},consumption:e,reasonCode:o,receiptId:n.toolUseId??`host-tool:${n.toolName}:${o}`}}function lo(n){if(!n||typeof n!="object"||Array.isArray(n))return false;let t=n;return t.isError===true||t.error?true:typeof t.status=="string"&&["failed","error","rejected","timeout","unavailable"].includes(t.status.toLowerCase())}function uo(n,t){let e=`${n??""} ${JSON.stringify(t??"")}`;return /timeout|timed out|deadline/iu.test(e)?"host_tool_timeout":/unavailable|not found|not registered|unsupported/iu.test(e)?"host_tool_unavailable":"host_tool_failed"}function et(){return generateKeyPairSync("ed25519")}function tt(n){let t=parseTrustedDecisionCommand(n.rawUserEvent,n.allowedOptionIds),e=n.now??Date.now(),o={schemaVersion:"delivery-user-attestation.v1",issuer:n.issuer,keyId:n.keyId,purpose:t.purpose,decisionId:t.decisionId,caseId:n.caseId,caseVersion:n.caseVersion,sessionId:n.sessionId,sourceTurnId:n.sourceTurnId,actorId:n.actorId,targetDecisionHash:n.targetDecisionHash,rawUserEvent:n.rawUserEvent,rawUserEventHash:domainHash("raw-user-event",n.rawUserEvent),selectedValueHash:domainHash("decision-value",{decisionId:t.decisionId,purpose:t.purpose,value:encodeDecisionValue(t.purpose,t.value)}),eventSequence:n.eventSequence,issuedAt:new Date(e).toISOString(),expiresAt:new Date(e+6e4).toISOString(),nonce:n.nonce};return {...o,attestation:sign(null,canonicalJsonBytes(o),n.privateKey).toString("base64url")}}var nt=new Map,ot=new Map;function rt(n){if(typeof n=="string")return /\bDevFlow decision ([A-Za-z0-9._:-]+)/u.exec(x(n))?.[1]}function x(n){return n.replace(/[\u0000-\u001f\u007f\ufffd]+/gu,"").replace(/\s+/gu," ").trim()}function Io(n){if(typeof n=="string")return n.trim()||void 0;if(!n||typeof n!="object"||Array.isArray(n))return;let t=n.answers;if(!t||typeof t!="object"||Array.isArray(t))return;let e=Object.values(t);if(e.length!==1)return;let o=e[0];if(!(Array.isArray(o)||typeof o!="string"))return o.trim()||void 0}async function it(n){if(n.toolName!=="AskUserQuestion")return {handled:false};let t=n.toolInput&&typeof n.toolInput=="object"&&!Array.isArray(n.toolInput)?n.toolInput:{};if(!Array.isArray(t.questions)||t.questions.length!==1)return {handled:false};let e=t.questions[0],o=wo(n.projectRoot),r=rt(e.header)??rt(e.question);if(!r){let g=await o.pendingDecisionForSession(n.sessionId);if(!g||"ambiguous"in g||g.decision.kind!=="artifact_approval")return {handled:false};r=g.decision.id;}let i=r.split(/:(?:decision|question|approval):/u)[0],s=await o.pendingDecision(i);if(!s||s.id!==r)return {handled:true,resolved:false,message:`DevFlow interactive decision rejected: no pending decision matches ${r}. Refresh delivery_status.`};let a=Array.isArray(e.options)?e.options.map(g=>({label:typeof g.label=="string"?x(g.label):"",description:typeof g.description=="string"?x(g.description):""})):[],c=createHash$1("sha256").update(JSON.stringify({decisionId:r,question:x(String(e.question??"")),options:a})).digest("hex"),l=`${n.sessionId}:${r}`,d=ot.get(l);if(d&&d.hash===c&&d.sourceTurnId===(n.sourceTurnId??n.toolUseId))return {handled:true,resolved:false,message:`DevFlow interactive decision ${r} was already presented in this host turn. Reuse the existing answer or refresh delivery_status after resolution.`};ot.set(l,{hash:c,sourceTurnId:n.sourceTurnId??n.toolUseId,count:(d?.count??0)+1});let u=Io(n.toolResponse),p=u?x(u):void 0;if(!p)return {handled:true,resolved:false,message:`DevFlow interactive decision rejected: AskUserQuestion returned no single answer for ${r}. Use /devflow:decide ${r} -- <answer> if this is a free-form clarification.`};if(e.multiSelect===true)return {handled:true,resolved:false,message:`DevFlow interactive decision rejected: ${r} must be a single selection.`};let y;if(s.options.length>0){let g=s.options.map(w=>({label:x(w.label),description:w.description?x(w.description):""}));if(a.length!==g.length||a.some((w,P)=>w.label!==g[P]?.label||w.description!==g[P]?.description))return {handled:true,resolved:false,message:`DevFlow interactive decision rejected: the displayed options do not match the pending decision ${r}. Refresh delivery_status and render its options verbatim.`};let S=s.options.find(w=>x(w.label)===p);if(!S)return {handled:true,resolved:false,message:`DevFlow interactive decision rejected: answer does not match a pending option for ${r}.`};s.kind==="artifact_approval"?y=S.id==="approve"?`/devflow:approve ${r}`:`/devflow:reject ${r} -- ${p}`:y=`/devflow:decide ${r} ${S.id}`;}else {if(a.length>0)return {handled:true,resolved:false,message:`DevFlow interactive decision rejected: ${r} is a free-form clarification and must not be rendered as a choice list.`};y=`/devflow:decide ${r} -- ${p}`;}let b=process.env.DEVFLOW_HOST_ACTOR_ID?.trim()||`user:${process.env.USER?.trim()||"local"}`,k=et(),$=tt({rawUserEvent:y,issuer:"claude-code",keyId:"session-ephemeral",caseId:i,caseVersion:s.caseVersion,sessionId:n.sessionId,sourceTurnId:n.sourceTurnId?.trim()||n.toolUseId?.trim()||`host-turn:${n.sessionId}:${Date.now()}`,actorId:b,targetDecisionHash:s.targetDecisionHash,eventSequence:Date.now(),nonce:randomUUID$1(),privateKey:k.privateKey,allowedOptionIds:s.options.map(g=>g.id)});try{return await o.resolveTrustedDecision({evidence:$,publicKey:k.publicKey,expectedIssuer:"claude-code",expectedKeyId:"session-ephemeral"}),{handled:!0,resolved:!0,message:`DevFlow interactive decision resolved for ${i}. Refresh delivery_status and follow nextActions.`}}catch(g){return {handled:true,resolved:false,message:`DevFlow interactive decision rejected: ${g instanceof Error?g.message:String(g)}`}}}function wo(n){let t=nt.get(n);if(t)return t;let e=createTrustedDeliveryFacade(n);return nt.set(n,e),e}function st(n){if(!n)return;let t=typeof n.status=="string"?n.status:void 0;if(!(n.ok===false||n.success===false||n.isError===true||t==="failed"||t==="rejected"||!!n.error))return;let o=n.error;if(typeof o=="string"&&o.trim())return o;if(o&&typeof o=="object"){let r=o;if(typeof r.message=="string"&&r.message.trim())return r.message;if(typeof r.code=="string"&&r.code.trim())return r.code}return t?`Tool response status: ${t}`:"Tool response reported failure"}function To(n,t,e,o){try{let r=join$1(D(n),"event-map.json");if(!existsSync(r))return null;let i=JSON.parse(readFileSync(r,"utf-8")),s=i.filter(l=>l.toolName===e&&(!l.sessionId||l.sessionId===t));if(s.length===0)return null;let a=o?s.find(l=>l.toolUseId===o):s.sort((l,d)=>l.timestamp-d.timestamp)[0];if(!a)return null;let c=i.findIndex(l=>l.eventId===a.eventId);return c!==-1&&i.splice(c,1),writeFileSync(r,JSON.stringify(i)),{eventId:a.eventId,timestamp:a.timestamp}}catch{return null}}function at(n){if(!n)return 0;let t=n;if(typeof n=="string")try{t=JSON.parse(n);}catch{return 1}let e=t,o=["files","results","data","result","memories","nodes","chunks","findings","symbols","keySymbols"],r=["reasoning","riskHints","nextActions"],i=Array.isArray(e.data)?e.data:e.structuredContent??e;if(Array.isArray(i))return i.length;if(typeof i=="object"&&i!==null){let s=i,a=0,c=false;for(let d of o)Array.isArray(s[d])&&(c=true,a+=s[d].length);for(let d of r)Array.isArray(s[d])&&(a+=s[d].length);for(let[,d]of Object.entries(s))d&&typeof d=="object"&&!Array.isArray(d)&&(a+=at(d));let l=!!(s._devflow||s._devflow_unique||s.taskType);return a===0&&l&&!c?1:a>0?a:c?0:Object.keys(s).length>0?1:0}return 0}async function Oo(n){if(!n)return null;let t;try{t=JSON.parse(n);}catch{return null}let e=t.tool_name||"",o=te(),r=t.tool_input||{},i=t.tool_response||{},s=t.session_id?.trim()||null,a=new T(o);if(s&&a.registerSession(s),s){let f=await it({projectRoot:o,sessionId:s,sourceTurnId:a.get(s)?.activeTurnId,toolName:e,toolInput:r,toolResponse:i,toolUseId:t.tool_use_id});if(f.handled)return f.message}let c=resolveClaudeToolName(e,r),l=c.status==="unsupported"?void 0:c.canonicalName;if(s&&l==="get_project_context"&&a.completeContextInitialization(s,t.tool_use_id),e==="Skill"){let f=typeof r=="object"&&r.skill?r.skill:"",m=Le(f);s&&m&&(a.startExecution(s,m,qe(m)),se(o,{lastMcpCall:Math.floor(Date.now()/1e3),bypassCount:0}));}let d=s?a.get(s):null;if(e.startsWith("mcp__")){let f=new H(o,s??void 0,d?.executionId??s??void 0);f.recordMcpCall();let m=st(typeof i=="object"&&i!==null?i:null),_=l??e,X=f.getContextReceipt?.()?.canonicalAction?.tool===_;if((f.recordDomainActionOutcome(_,m?Co(m):"succeeded",m,t.tool_use_id)||X)&&s){let O=Xe({hook:"post_tool_use",toolName:_,...t.tool_use_id?{toolUseId:t.tool_use_id}:{},response:i,...m?{error:m}:{}});F({projectRoot:o,sessionId:s,executionId:d?.executionId??s,kind:O.consumption==="consumed"?"action.succeeded":"action.failed",payload:{receiptId:O.receiptId,reasonCode:O.reasonCode,consumption:O.consumption,tool:_},dedupeKey:`${O.receiptId}:${O.consumption}`,producer:"devflow-post-tool-use"});try{Qe({projectRoot:o,sessionId:s,executionId:d?.executionId??s,reason:m?"post_tool_action_failed":"post_tool_action_succeeded"});}catch{}}}s&&Ve({projectRoot:o,sessionId:s,executionId:d?.executionId,toolName:e,toolInput:r,toolResponse:i,toolUseId:t.tool_use_id});let u=s?To(o,s,e,t.tool_use_id):null,p=s&&t.tool_use_id&&!u?(()=>{try{let f=openGlobalDevFlowDatabase();try{return f.getToolCallEventByToolUseId(s,t.tool_use_id)}finally{f.close();}}catch{return null}})():null,y=u??p,b=typeof i=="object"&&i!==null?i:null,k=JSON.stringify(i),$=Buffer.byteLength(k,"utf8"),g=at(i),S=st(b);if(s&&Je({projectRoot:o,sessionId:s,toolUseId:t.tool_use_id,success:!S,error:S}),d?.executionId!==void 0||l!==void 0||e==="Skill"){let f=getLogWriter(o),m=d?.executionId??`auto-${s??Date.now()}`;f.toolCall({tool:e,runId:m,stepId:`step-${m}`,input:r,output:i,duration:y?Math.max(0,Date.now()-y.timestamp):0,success:!b?.error,resultCount:g,resultSizeBytes:$,error:b?.error});}if(y&&s){let f=typeof i=="string"?i:JSON.stringify(i),m=f.length>5e3?{_truncated:true,_originalSize:f.length,text:f.slice(0,5e3)}:i,_=S,X=_?classifyWorkflowFailure({stepId:e,toolName:e,output:i,error:new Error(_),errorStack:_}).category:void 0;await new B().completeEvent({eventId:y.eventId,sessionId:s,output:m,error:_,failureCategory:X,duration:y?Math.max(0,Date.now()-y.timestamp):0,completedAt:Date.now()});}let P=typeof r=="object"&&r.command?r.command:"",Z=b?.exitCode,ct=b?.stderr,dt=/^\s*(ls|cat|pwd|cd|echo|head|tail|wc|which|whoami|date|env|printenv|id|hostname|uname)\b/,E,A,Q=true;if(e.startsWith("mcp__"))E="mcp_call",A={mcpTool:l??e,query:typeof r=="object"&&r.query?r.query:null,resultCount:g,resultSizeBytes:$};else if(e==="Read"||e==="Write"||e==="Edit")E=e==="Read"?"file_read":"file_write",A={filePath:typeof r=="object"&&r.file_path?r.file_path:null,fileContentSize:$};else if(e==="Bash"){let f=dt.test(P),m=Z!==void 0&&Z!==0;Q=!f||m,E=m?"bash_error":"bash_command",A={command:P||e,exitCode:Z??null,stderr:ct??null};}else e==="Agent"?(E="subagent",A={subagentType:typeof r=="object"&&r.subagent_type?r.subagent_type:null,description:typeof r=="object"&&r.description?String(r.description).slice(0,200):null}):e==="WebSearch"||e==="WebFetch"?(E=e==="WebSearch"?"web_search":"web_fetch",A={query:typeof r=="object"&&r.query?String(r.query).slice(0,200):null}):(Q=false,E="tool_use",A={});if(Q){let f={id:t.tool_use_id?`memory:${Me(s??"",t.tool_use_id)}`:`evt:${Date.now()}:${Math.random().toString(36).slice(2,7)}`,sessionId:s??"",tool:e,kind:E,payload:{...A,durationMs:y?Math.max(0,Date.now()-y.timestamp):0},createdAt:Date.now()};s&&N(`/api/memory/session-events?rootPath=${encodeURIComponent(o)}`,f);}let lt=Ue({toolName:e,toolResponse:i,sessionId:s,toolUseId:t.tool_use_id,runtimeStore:a}),ut=s?ze({projectRoot:o,sessionId:s,executionId:d?.executionId,toolName:e,toolInput:r,toolResponse:i,toolUseId:t.tool_use_id}):null;return [lt,ut].filter(f=>!!f).join(`
7
7
 
8
8
  `)||null}function Co(n){return /timeout|timed out|deadline|warming/i.test(n)?"timeout":/unavailable|not active|unknown tool|not found|not registered|route not found/i.test(n)?"unavailable":"failed"}if(process.argv[1]?.endsWith("post-tool-use")||process.argv[1]?.endsWith("post-tool-use.js")){let n=console.log.bind(console);console.log=console.error.bind(console),console.info=console.error.bind(console);let t="";process.stdin.setEncoding("utf8"),process.stdin.on("data",e=>{t+=e;}),process.stdin.on("end",async()=>{let e=await Oo(t.trim()||process.argv[2]||"");n(JSON.stringify(e?{hookSpecificOutput:{hookEventName:"PostToolUse",additionalContext:e}}:{status:"ok"}));}),process.stdin.on("error",()=>process.exit(0)),setTimeout(()=>process.exit(0),5e3).unref();}export{Oo as handlePostToolUse};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@devflow-tools/claude-code-plugin",
3
- "version": "0.18.48",
3
+ "version": "0.18.49",
4
4
  "description": "Claude Code hooks and skills for the DevFlow development intelligence runtime.",
5
5
  "type": "module",
6
6
  "scripts": {
@@ -12,20 +12,20 @@
12
12
  "verify:runtime-dependencies": "node --import tsx scripts/verify-runtime-dependencies.ts"
13
13
  },
14
14
  "dependencies": {
15
- "@devflow-tools/benchmark": "0.18.48",
16
- "@devflow-tools/context-engine": "0.18.48",
17
- "@devflow-tools/database": "0.18.48",
18
- "@devflow-tools/mcp-server": "0.18.48",
19
- "@devflow-tools/memory-engine": "0.18.48",
20
- "@devflow-tools/sdk": "0.18.48",
21
- "@devflow-tools/semantic-engine": "0.18.48",
22
- "@devflow-tools/server": "0.18.48",
23
- "@devflow-tools/task-runtime": "0.18.48",
24
- "@devflow-tools/telemetry": "0.18.48",
25
- "@devflow-tools/workflow-engine": "0.18.48"
15
+ "@devflow-tools/benchmark": "0.18.49",
16
+ "@devflow-tools/context-engine": "0.18.49",
17
+ "@devflow-tools/database": "0.18.49",
18
+ "@devflow-tools/mcp-server": "0.18.49",
19
+ "@devflow-tools/memory-engine": "0.18.49",
20
+ "@devflow-tools/sdk": "0.18.49",
21
+ "@devflow-tools/semantic-engine": "0.18.49",
22
+ "@devflow-tools/server": "0.18.49",
23
+ "@devflow-tools/task-runtime": "0.18.49",
24
+ "@devflow-tools/telemetry": "0.18.49",
25
+ "@devflow-tools/workflow-engine": "0.18.49"
26
26
  },
27
27
  "devDependencies": {
28
- "@devflow-tools/devflow": "0.18.48"
28
+ "@devflow-tools/devflow": "0.18.49"
29
29
  },
30
30
  "allowScripts": {
31
31
  "better-sqlite3@12.11.1": true,
@@ -5,4 +5,8 @@ argument-hint: [optional decision-id]
5
5
  disable-model-invocation: true
6
6
  ---
7
7
 
8
- /devflow:approve $ARGUMENTS
8
+ This command is a compatibility fallback for an explicitly typed user command.
9
+ Do not invoke it to implement an approval flow and do not ask the user to type
10
+ it. The delivery workflow must render the current artifact approval options
11
+ with `AskUserQuestion`; the host PostToolUse hook consumes the selected option
12
+ and signs the approval automatically.
@@ -66,7 +66,7 @@ description: 通过可审计 Delivery Line 将需求推进到验证完成的 int
66
66
  `<projectRoot>/.devflow/delivery-line/artifacts/<caseId>/<artifact.path>`,只给出不重复的关键摘要和风险。必须调用 `AskUserQuestion` 让用户选择批准或退回;不要要求用户复制命令。
67
67
  宿主会将选择映射为精确审批事件。Slash command 仅是宿主原生交互不可用时的 fallback,不得把命令
68
68
  作为默认交互,也不得由 agent 调用 MCP mutation 模拟用户批准或拒绝。
69
- - 用户需要手动批准时,优先提示 `/devflow:approve`,系统会在当前 session 只有一个待审批 gate 时自动绑定当前案件;不要要求用户复制 decision UUID。仅在存在多个待审批案件或快捷命令无法解析时,才显示完整 decisionId 或回到原生 `AskUserQuestion`。
69
+ - 审批必须始终通过原生 `AskUserQuestion` 选项完成;宿主会按当前 session 唯一待审批 gate 自动绑定并签名消费选择。只有用户明确输入兼容命令时才处理 `/devflow:approve`,不得把命令作为提示或默认交互。
70
70
  - `/devflow:revise`、`/devflow:cancel` 和 `/devflow:exit` 尚未注册为可信命令;仅使用当前 `nextActions` 已实现的路径,不得向用户展示不存在的命令。
71
71
  - 审批返回后不要结束会话:立即调用 `delivery_status`,按返回的 `nextActions` 连续推进;只有出现新的
72
72
  人工 gate、明确 blocker、终态或用户明确暂停时才结束。