@devflow-tools/claude-code-plugin 0.19.13 → 0.19.15

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.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "devflow",
3
3
  "description": "DevFlow — Developer Intelligence Platform: project context, code graph, knowledge base, memory engine, and workflow automation with 14 domain plugins",
4
- "version": "0.19.13",
4
+ "version": "0.19.15",
5
5
  "author": {
6
6
  "name": "DevFlow"
7
7
  },
@@ -8,7 +8,7 @@
8
8
  ],
9
9
  "blockedNative": [],
10
10
  "source": "core",
11
- "sourceVersion": "0.19.13",
11
+ "sourceVersion": "0.19.15",
12
12
  "requiresContext": false,
13
13
  "evidenceMode": "runtime",
14
14
  "skillPath": "skills/devflow:doctor/SKILL.md",
@@ -35,7 +35,7 @@
35
35
  "WebFetch"
36
36
  ],
37
37
  "source": "core",
38
- "sourceVersion": "0.19.13",
38
+ "sourceVersion": "0.19.15",
39
39
  "requiresContext": true,
40
40
  "evidenceMode": "mixed",
41
41
  "skillPath": "skills/devflow:context/SKILL.md",
@@ -60,7 +60,7 @@
60
60
  "Explore"
61
61
  ],
62
62
  "source": "core",
63
- "sourceVersion": "0.19.13",
63
+ "sourceVersion": "0.19.15",
64
64
  "requiresContext": true,
65
65
  "evidenceMode": "mixed",
66
66
  "skillPath": "skills/devflow:graph/SKILL.md",
@@ -79,7 +79,7 @@
79
79
  "WebFetch"
80
80
  ],
81
81
  "source": "core",
82
- "sourceVersion": "0.19.13",
82
+ "sourceVersion": "0.19.15",
83
83
  "requiresContext": true,
84
84
  "evidenceMode": "mixed",
85
85
  "skillPath": "skills/devflow:knowledge/SKILL.md",
@@ -103,7 +103,7 @@
103
103
  "Explore"
104
104
  ],
105
105
  "source": "core",
106
- "sourceVersion": "0.19.13",
106
+ "sourceVersion": "0.19.15",
107
107
  "requiresContext": true,
108
108
  "evidenceMode": "mixed",
109
109
  "skillPath": "skills/devflow:memory/SKILL.md",
@@ -119,7 +119,7 @@
119
119
  ],
120
120
  "blockedNative": [],
121
121
  "source": "core",
122
- "sourceVersion": "0.19.13",
122
+ "sourceVersion": "0.19.15",
123
123
  "requiresContext": true,
124
124
  "evidenceMode": "mixed",
125
125
  "skillPath": "skills/devflow:workflow/SKILL.md",
@@ -154,7 +154,7 @@
154
154
  ],
155
155
  "blockedNative": [],
156
156
  "source": "core",
157
- "sourceVersion": "0.19.13",
157
+ "sourceVersion": "0.19.15",
158
158
  "requiresContext": true,
159
159
  "evidenceMode": "mixed",
160
160
  "skillPath": "skills/devflow:delivery/SKILL.md",
@@ -32,7 +32,7 @@ DevFlow memory snapshot=pending; source=${o.source}; reason=previous_snapshot_di
32
32
  `)}:a.length>0?{decision:"degrade",unresolved:a,additionalContext:"DevFlow terminal obligations remain unresolved after their one-shot correction budget."}:{decision:"allow",unresolved:[]}}finally{n.close();}}function Pl(e,t){return !!e.getWorkByIdempotencyKey(`memory-turn:commit_explicit:${t}`)}function jl(e){if(!e)return false;let t=e.normalize("NFKC").replace(/\s+/gu," ");return /(?:未|没有|无法|失败|暂未|尚未).{0,24}(?:记住|记下|记录|保存|持久化|回执)|(?:memory|receipt).{0,24}(?:failed|missing|pending|degraded|not saved)|status=(?:pending|degraded|rejected|failed)/iu.test(t)?false:/(?:已|已经|成功).{0,20}(?:记住|记下|记录|保存|持久化)|跨会话生效|(?:memory|preference).{0,20}(?:saved|remembered|persisted)|status=(?:accepted|committed)/iu.test(t)}function $l(e,t,n){let o=e.get(t);if(o){for(let r of o.evidenceObligations)n.upsertSessionObligation({obligationId:`evidence:${r.obligationId}`,projectRoot:o.projectRoot,sessionId:t,executionId:o.executionId,kind:"evidence_contract",state:"open",payload:{contract:r.contract,runtimeObligationId:r.obligationId},createdAt:r.promptedAt,updatedAt:o.lastActivityAt});for(let r of o.evidenceOutcomes){let i=`evidence:${r.obligationId}`,s=n.getSessionObligation(o.projectRoot,t,i);if(!s||s.state!=="open"&&!(s.state==="degraded"&&r.status==="resolved"))continue;let a=r.status==="resolved"?`evidence-receipt:${createHash("sha256").update(`${r.obligationId}\0${r.completedAt}\0${r.attempt}`).digest("hex").slice(0,24)}`:void 0;n.resolveSessionObligation({projectRoot:o.projectRoot,sessionId:t,obligationId:i,state:r.status==="resolved"?"satisfied":"degraded",receiptId:a,reason:r.reason,resolvedAt:r.completedAt});}}}var Fl=[/\b(?:rm\s+-rf|sudo|chmod|chown|force\s+push|reset\s+--hard|publish|release|deploy)\b/iu,/\b(?:secret|credential|token|password|security|authentication|authorization)\b/iu,/(?:删除|强制推送|发布|部署|凭据|密钥|安全|权限)/u],Hl=[/\b(?:migration|upgrade|dependency|dependencies|generated files?|write all|rewrite)\b/iu,/(?:迁移|升级|依赖|生成文件|批量写入)/u];function dn(e){let t=`${e.instruction}
33
33
  ${JSON.stringify(e.trigger)}`,n=[];Fl.some(r=>r.test(t))&&n.push("high_risk_operation"),Hl.some(r=>r.test(t))&&n.push("broad_or_migrating_change"),e.kind==="correction"&&n.push("user_correction_requires_observation");let o=n.includes("high_risk_operation")?"high":n.includes("broad_or_migrating_change")||e.scope==="global"?"medium":"low";return {risk:o,manualOnly:o==="high"||n.includes("broad_or_migrating_change"),reasons:n}}var Nl=new Set(["project_convention","user_preference","decision_made","config_discovery"]);function un(e){let t=e.payload.executionId?e.database.getSkillExecution(e.payload.executionId):e.database.getLatestSkillExecutionForSession(e.payload.sessionId),n=e.database.listHostActionsForSession(e.payload.projectRoot,e.payload.sessionId,e.payload.executionId),o=n.find(l=>l.state==="verified"),r=n.find(l=>["failed","cancelled","degraded"].includes(l.state)),i=r?"negative":o?"positive":"unknown",s=new Set,a=[],c=0,d=0;for(let l of e.evidence){if(!Ll(l)){d+=1;continue}let u=ri(l),m=ql(l,t?.skillName),f=ii(l),p=zl(e.payload.projectRoot,u,l.facetKey??l.semanticKey??l.id,m),h=e.database.getLearningCandidate(p),g=dn({scope:"project",kind:u,instruction:f,trigger:m});e.database.upsertLearningCandidate({id:p,projectRoot:e.payload.projectRoot,scope:"project",kind:u,trigger:m,instruction:f,confidence:Wl(l),manualOnly:g.manualOnly,risk:g.risk});h&&h.instruction!==f&&e.database.addLearningCandidateEvidence({id:ti(p,e.payload.sessionId,l.id,"contradicting"),candidateId:p,projectRoot:e.payload.projectRoot,sessionId:e.payload.sessionId,executionId:e.payload.executionId,memoryObservationId:l.id,sourceType:"correction",polarity:"contradicting",outcome:i,evidenceHash:ni(p,e.payload,l,"contradicting"),receipt:e.payload.closureReceipt,payload:{previousInstruction:h.instruction,replacementInstruction:f,projectRevision:e.payload.projectRevision},createdAt:l.createdAt});let S=e.database.addLearningCandidateEvidence({id:ti(p,e.payload.sessionId,l.id,"supporting"),candidateId:p,projectRoot:e.payload.projectRoot,sessionId:e.payload.sessionId,executionId:e.payload.executionId,memoryObservationId:l.id,outcomeId:o?.id??r?.id,sourceType:Ul(l),polarity:"supporting",outcome:i,evidenceHash:ni(p,e.payload,l,"supporting"),receipt:e.payload.closureReceipt,payload:{semanticKey:l.semanticKey,facetKey:l.facetKey,evidenceStatus:l.evidenceStatus,source:l.source,projectRevision:e.payload.projectRevision,executionStatus:t?.status,policyReasons:g.reasons},createdAt:l.createdAt});c+=1,s.add(p),e.rolloutMode!=="off"&&S.state==="candidate"&&S.supportingSessions>=3&&S.successfulOutcomes>=2&&e.database.transitionLearningCandidate(p,{target:"shadow",reason:"evidence_threshold_satisfied"}).state==="shadow"&&a.push(p);}return {considered:e.evidence.length,accepted:c,excluded:d,candidateIds:[...s],promotedToShadow:a}}function Ll(e){return !(!Nl.has(e.type)||e.source!=="explicit_intent"&&e.source!=="manual"&&e.evidenceStatus!=="verified"||!e.narrative.trim()&&!e.title.trim())}function ri(e){return e.type==="decision_made"?"workflow":e.type==="user_preference"&&(e.semanticValue.startsWith("--")||e.tools.length>0)?"tool_preference":"convention"}function ql(e,t){return {...t?{skills:[t]}:{},...e.entities.length>0?{entities:[...new Set(e.entities)].slice(0,8)}:{},...e.files.length>0?{files:[...new Set(e.files)].slice(0,8)}:{},...e.tools.length>0?{commands:[...new Set(e.tools)].slice(0,8)}:{},semantic:{subject:e.semanticSubject,predicate:e.semanticPredicate,value:e.semanticValue,polarity:e.semanticPolarity}}}function ii(e){return (e.narrative.trim()||e.title.trim()).replace(/\s+/gu," ").slice(0,1200)}function Wl(e){let t=e.source==="explicit_intent"?.08:0;return Math.max(0,Math.min(1,e.confidence+t))}function Ul(e){return e.semanticPolarity==="negative"?"correction":ri(e)==="tool_preference"?"tool_preference":e.source==="explicit_intent"?"memory":"convention"}function zl(e,t,n,o){let r={...o,semantic:void 0};return `learning:${createHash("sha256").update(`${e}\0project\0${t}\0${n}\0${stableLearningJson(r)}`).digest("hex").slice(0,24)}`}function ti(e,t,n,o){return `learning-evidence:${createHash("sha256").update(`${e}\0${t}\0${n}\0${o}`).digest("hex").slice(0,24)}`}function ni(e,t,n,o){return createHash("sha256").update(stableLearningJson({candidateId:e,sessionId:t.sessionId,executionId:t.executionId,closureReceipt:t.closureReceipt,projectRevision:t.projectRevision,observationId:n.id,instruction:ii(n),polarity:o})).digest("hex")}var ce=3e4,fn=1e3,su=new Set(["git","npm","pnpm","yarn"]);function si(e){return {"workflow.worker_start":async({item:t})=>au(e,t),"workflow.worker_monitor":async({item:t})=>cu(e,t),"workflow.worker_verify":async({item:t})=>du(e,t),"workflow.worker_merge":async({item:t})=>lu(e,t),"workflow.worker_cleanup":async({item:t})=>uu(e,t)}}async function au(e,t){await Ee(e,t,async(n,o)=>{if(o.state==="running"||o.state==="starting"){mn(n,o);return}if(o.state!=="planned")return;let r=`worker-plane:${process.pid}`;n.leaseWorkflowWorker(e,o.workerId,r,ce);let i=await createManagedWorktree({projectRoot:e,runId:o.runId,stepId:o.stepId,baseRevision:o.baseRevision,registered:!0});if(i.worktreePath!==o.worktreePath||i.branch!==o.branch){n.transitionWorkflowWorker({projectRoot:e,workerId:o.workerId,target:"hold",leaseOwner:r,reason:"managed_worktree_identity_mismatch"});return}n.transitionWorkflowWorker({projectRoot:e,workerId:o.workerId,target:"starting",leaseOwner:r});let s=di(o.workerId),a=mu(o);createWorkerArtifacts(s,a);let d=createDefaultHostAdapterRegistry().list().find(f=>f.id===o.host);if(!d)throw new x("unsupported_worker_host",`Unsupported worker host ${o.host}`);let l=de(o.handoff.actionId,"actionId"),u=n.getHostAction(e,l);if(!u)throw new x("worker_host_action_missing",`Host action ${l} was not found`);u.state==="waiting"&&n.startHostAction({actionId:l,projectRoot:e});let m=launchWorker(d,{workerId:o.workerId,runId:o.runId,stepId:o.stepId,host:o.host==="codex"?"codex":"claude-code",worktreePath:o.worktreePath,taskFile:s.taskFile,handoffFile:s.handoffFile,statusFile:s.statusFile,sessionId:o.sessionId??"worker",executionId:o.executionId??o.workerId,contextReceipt:o.contextReceipt,timeoutMs:30*6e4},s,{onHeartbeat:()=>{let f=openGlobalDevFlowDatabase();try{f.heartbeatWorkflowWorker(e,o.workerId,r,ce);}catch{}finally{f.close();}}});pu(s,{state:"running",pid:m.child.pid,owner:r,startedAt:Date.now()}),n.transitionWorkflowWorker({projectRoot:e,workerId:o.workerId,target:"running",leaseOwner:r,heartbeatAt:Date.now(),leaseExpiresAt:Date.now()+ce}),mn(n,o),m.completion.finally(()=>{let f=openGlobalDevFlowDatabase();try{mn(f,o,Date.now());}finally{f.close();}});});}async function cu(e,t){await Ee(e,t,async(n,o)=>{if(o.state!=="running"&&o.state!=="starting")return;let r=di(o.workerId);if(existsSync(r.handoffFile)){let c=readWorkerHandoff(r.handoffFile,{workerId:o.workerId,runId:o.runId,stepId:o.stepId,contextReceipt:o.contextReceipt,worktreePath:o.worktreePath}),d=de(o.handoff.actionId,"actionId");n.reportHostAction({actionId:d,projectRoot:e,report:{workerId:o.workerId,handoff:c},evidenceHash:ui(c)}),n.transitionWorkflowWorker({projectRoot:e,workerId:o.workerId,target:"reported",leaseOwner:o.leaseOwner,finalRevision:c.finalRevision,handoff:{...o.handoff,terminalHandoff:c}}),n.enqueueWork({idempotencyKey:`workflow-worker-verify:${o.workerId}:${c.finalRevision}`,kind:"workflow.worker_verify",projectRoot:e,payload:{workerId:o.workerId}});return}let i=fu(r),s=typeof i?.pid=="number"?i.pid:void 0;if(s&&hu(s)){let c=typeof i?.startedAt=="number"?i.startedAt:o.updatedAt;if(Date.now()-c>30*6e4){try{process.kill(s,"SIGTERM");}catch{}n.transitionWorkflowWorker({projectRoot:e,workerId:o.workerId,target:"failed",leaseOwner:o.leaseOwner,reason:"worker_process_timeout"});let l=de(o.handoff.actionId,"actionId");n.failHostAction({actionId:l,projectRoot:e,report:{reason:"worker_process_timeout"}});return}let d=o.leaseOwner??(typeof i?.owner=="string"?i.owner:void 0);throw d?(n.heartbeatWorkflowWorker(e,o.workerId,d,ce),li("worker_running",fn)):new x("worker_lease_owner_missing","Worker lease owner is missing")}n.transitionWorkflowWorker({projectRoot:e,workerId:o.workerId,target:"failed",leaseOwner:o.leaseOwner,reason:"worker_exited_without_handoff"});let a=de(o.handoff.actionId,"actionId");n.failHostAction({actionId:a,projectRoot:e,report:{reason:"worker_exited_without_handoff"}});});}async function du(e,t){await Ee(e,t,async(n,o)=>{if(o.state!=="reported")return;n.transitionWorkflowWorker({projectRoot:e,workerId:o.workerId,target:"verifying",leaseOwner:o.leaseOwner});let r=o.handoff.terminalHandoff;if(!r)throw new x("worker_handoff_missing","Persisted worker handoff is missing");let i=de(o.handoff.actionId,"actionId"),s=n.getHostAction(e,i);if(!s)throw new x("worker_host_action_missing",`Host action ${i} was not found`);let a=ci(o),c=new GraderRegistry,d=await ai(n,o,async()=>verifyWorkerOutput({workerId:o.workerId,projectRoot:e,worktreePath:o.worktreePath,baseRevision:o.baseRevision,parentRevision:await gu(e),contextReceipt:o.contextReceipt,allowedFiles:o.allowedFiles,handoff:r,hostAction:s,verificationCommands:a,graderIds:["receipt_validity","lifecycle_terminal_state","workflow_evidence"],graderRunner:{run:async l=>{let u=await c.run({taskId:o.stepId,taskKind:l.taskKind,projectRoot:l.projectRoot,acceptanceCriteria:[],evidence:l.evidence});return {...u,unavailableBlocking:u.unavailableRequired}}}}));if(!d.passed){n.transitionWorkflowWorker({projectRoot:e,workerId:o.workerId,target:d.state,leaseOwner:o.leaseOwner,reason:d.reason}),d.state==="failed"&&n.failHostAction({actionId:i,projectRoot:e,outcome:"failed",report:{...s.report,verification:d},evidenceHash:d.simulationHash});return}n.transitionWorkflowWorker({projectRoot:e,workerId:o.workerId,target:"merge_ready",leaseOwner:o.leaseOwner,finalRevision:d.finalRevision,handoff:{...o.handoff,terminalHandoff:r,verification:d}}),n.enqueueWork({idempotencyKey:`workflow-worker-merge:${o.workerId}:${d.finalRevision}`,kind:"workflow.worker_merge",projectRoot:e,payload:{workerId:o.workerId}});});}async function lu(e,t){await Ee(e,t,async(n,o)=>{if(o.state!=="merge_ready")return;let r=o.handoff.verification;if(!r?.passed)throw new x("worker_verification_missing","Verified merge evidence is missing");let i=de(o.handoff.actionId,"actionId"),s=new SerializedWorkerMergeQueue(n,{onMerged:async({mergeCommit:c})=>{n.transitionWorkflowWorker({projectRoot:e,workerId:o.workerId,target:"merged",leaseOwner:o.leaseOwner,finalRevision:o.finalRevision,reason:`merged:${c}`});let d=n.getHostAction(e,i);n.verifyHostAction({actionId:i,projectRoot:e,report:{...d?.report??{},mergeCommit:c,verification:r},evidenceHash:ui({mergeCommit:c,verification:r})});},scheduleCleanup:()=>{n.enqueueWork({idempotencyKey:`workflow-worker-cleanup:${o.workerId}:merged`,kind:"workflow.worker_cleanup",projectRoot:e,payload:{workerId:o.workerId}});}}),a=await ai(n,o,()=>s.enqueueAndMerge({workerId:o.workerId,projectRoot:e,baseRevision:o.baseRevision,verification:r,message:`merge(devflow-worker): ${o.runId}/${o.stepId}`}));a.state==="conflict"&&n.transitionWorkflowWorker({projectRoot:e,workerId:o.workerId,target:"hold",leaseOwner:o.leaseOwner,reason:a.reason??"merge_conflict"});});}async function uu(e,t){await Ee(e,t,async(n,o)=>{let r=t.payload,i=await cleanupManagedWorktree({repositoryRoot:e,worktreePath:o.worktreePath,branch:o.branch,registered:!0,handoffDurable:!!o.handoff.terminalHandoff||r.operatorApproved===!0});if(!i.cleaned)throw li(`cleanup_${i.reason??"refused"}`,3e4)});}async function ai(e,t,n){let o=t.leaseOwner;if(!o)return n();let r=setInterval(()=>{try{e.heartbeatWorkflowWorker(t.projectRoot,t.workerId,o,ce);}catch{}},Math.floor(ce/3));r.unref();try{return await n()}finally{clearInterval(r);}}async function Ee(e,t,n){let o=yu(t.payload),r=openGlobalDevFlowDatabase();try{let i=r.getWorkflowWorker(e,o);if(!i)throw new x("worker_not_found",`Worker ${o} was not found`);await n(r,i);}finally{r.close();}}function mu(e){let t=e.handoff.task;if(!t||typeof t!="object"||Array.isArray(t))throw new x("worker_task_missing","Worker task envelope is missing");let n=ci(e);return {workerId:e.workerId,runId:e.runId,stepId:e.stepId,projectRoot:e.projectRoot,worktreePath:e.worktreePath,baseRevision:e.baseRevision,contextReceipt:e.contextReceipt,retrievalSessionId:e.retrievalSessionId,allowedFiles:e.allowedFiles,requiredTools:[],task:t,verification:{commands:n,graders:["receipt_validity","lifecycle_terminal_state","workflow_evidence"]},constraints:{recursiveWorkers:false,maxContextCycles:3}}}function ci(e){let t=e.handoff.verificationCommands;if(!Array.isArray(t)||t.length===0)throw new x("verification_contract_missing","Worker verification commands are missing");return t.map(n=>{if(!n||typeof n!="object"||Array.isArray(n))throw new x("verification_contract_invalid","Worker verification command is malformed");let o=n;if(typeof o.command!="string"||!su.has(o.command)||!Array.isArray(o.args)||o.args.some(r=>typeof r!="string"))throw new x("verification_contract_invalid","Worker verification command is not allowlisted");return {command:o.command,args:o.args}})}function di(e){let t=workerCoordinationRoot(e,homedir());return {root:t,taskFile:join(t,"task.json"),handoffFile:join(t,"handoff.json"),statusFile:join(t,"status.json"),stdoutFile:join(t,"stdout.log"),stderrFile:join(t,"stderr.log")}}function pu(e,t){writeJsonAtomic(e.statusFile,t);}function fu(e){try{return JSON.parse(readFileSync$1(e.statusFile,"utf8"))}catch{return null}}function mn(e,t,n=Date.now()+fn){e.enqueueWork({idempotencyKey:`workflow-worker-monitor:${t.workerId}:${Math.floor(n/fn)}`,kind:"workflow.worker_monitor",projectRoot:t.projectRoot,payload:{workerId:t.workerId},nextAttemptAt:n,maxAttempts:1e3});}async function gu(e){let{gitRevision:t}=await import('@devflow-tools/workflow-engine');return t(e,"HEAD")}function hu(e){try{return process.kill(e,0),!0}catch{return false}}function li(e,t){return Object.assign(new Error(e),{category:e,retryAfterMs:t,retryWithoutAttempt:true})}function yu(e){if(!e||typeof e!="object"||typeof e.workerId!="string")throw new x("invalid_worker_payload","Worker work item requires workerId");return e.workerId}function de(e,t){if(typeof e!="string"||!e.trim())throw new x("worker_identity_missing",`Worker ${t} is missing`);return e}function ui(e){return createHash("sha256").update(JSON.stringify(e)).digest("hex")}var wu=new Set(["Write","Edit","NotebookEdit"]);function gi(e){if(!wu.has(e.toolName)||Ru(e.toolResponse))return null;let t=Su(e.projectRoot,e.toolInput);if(!t)return null;let n=openGlobalDevFlowDatabase(void 0,{busyTimeoutMs:250});try{let o=n.getActiveContextReceipt(e.projectRoot,e.sessionId,e.executionId),r=o?.canonicalAction?.verificationPlan??[];if(!o||r.length===0)return null;let i=[],s=[];for(let c of r){let d=_u({projectRoot:e.projectRoot,targetFile:t,kind:c.kind,mode:c.mode==="write"?"write":"check",required:c.required===!0,contextReceipt:o.contextHash}),l=`${o.contextHash}\0${e.toolUseId??t}\0${c.kind}\0${t}`,u=`policy-verification:${createHash("sha256").update(l).digest("hex")}`,m=Date.now();if(!d){let h=`verification_unavailable:${c.kind}`;n.upsertSessionObligation({obligationId:u,projectRoot:e.projectRoot,sessionId:e.sessionId,executionId:e.executionId,kind:"evidence_contract",state:"degraded",payload:{subtype:"policy_verification",status:"unknown",verificationKind:c.kind,targetFile:t,contextReceipt:o.contextHash},reason:h,createdAt:m,updatedAt:m,resolvedAt:m}),s.push(c.kind),c.required===!0&&O({projectRoot:e.projectRoot,sessionId:e.sessionId,requestId:o.requestId,executionId:e.executionId,kind:"verification.failed",payload:{receiptId:u,reasonCode:h},dedupeKey:`${u}:unavailable`,producer:"devflow-verification-scheduler"});continue}let f={...d,obligationId:u,sessionId:e.sessionId,executionId:e.executionId,requestId:o.requestId};n.upsertSessionObligation({obligationId:u,projectRoot:e.projectRoot,sessionId:e.sessionId,executionId:e.executionId,kind:"evidence_contract",state:"open",payload:{subtype:"policy_verification",status:"scheduled",verificationKind:c.kind,command:d.display,targetFile:t,contextReceipt:o.contextHash,required:c.required===!0},createdAt:m,updatedAt:m});let p=n.enqueueWork({idempotencyKey:u,kind:"verification.policy",projectRoot:e.projectRoot,sessionId:e.sessionId,payload:f,maxAttempts:2,nextAttemptAt:m});O({projectRoot:e.projectRoot,sessionId:e.sessionId,requestId:o.requestId,executionId:e.executionId,kind:"durable_work.owned",payload:{workId:p.id,obligation:"verification"},dedupeKey:`${p.id}:owned`,producer:"devflow-verification-scheduler"}),i.push(d.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(`
34
34
  `)||null}finally{n.close();}}async function hi(e,t){let n=bu(e,t.payload),o=await ku(n,e),r=n.kind==="typecheck"?Du(o.output,n.targetFile,e):[],i=pi({command:n.command,args:n.args}),s=openGlobalDevFlowDatabase();try{let a=Mu(e),c=n.kind==="typecheck"?s.getPolicyVerificationBaseline(e,n.kind,i):null,d=c&&c.sourceRevision===a?c:null,l=d?r.filter(b=>!d.diagnosticHashes.includes(b)):[],u;o.spawnError||/could not determine executable|command not found|not recognized as an internal|ERR_PNPM_RECURSIVE_EXEC_FIRST_FAIL/iu.test(o.output)?u="unavailable":o.timedOut?u="unknown":o.exitCode===0?u="passed":n.kind==="typecheck"&&!d?u="unknown":n.kind==="typecheck"&&l.length===0?u="passed":u="failed";let m=createHash("sha256").update(o.output).digest("hex"),f=`verification-receipt:${pi({obligationId:n.obligationId,commandHash:i,exitCode:o.exitCode,timedOut:o.timedOut,outputHash:m,diagnosticHashes:r,introduced:l,status:u})}`,p={status:u,kind:n.kind,command:n.display,exitCode:o.exitCode,timedOut:o.timedOut,outputHash:m,diagnosticHashes:r,introducedDiagnosticHashes:l,baselineAvailable:d!==null,receiptId:f},h=s.getWorkByIdempotencyKey(n.obligationId)?.id,g=s.getSessionObligation(e,n.sessionId,n.obligationId);if(g?.state==="open"&&(s.upsertSessionObligation({...g,payload:{...g.payload,status:u,outcome:p},updatedAt:Date.now()}),u!=="failed"&&s.resolveSessionObligation({projectRoot:e,sessionId:n.sessionId,obligationId:n.obligationId,state:u==="passed"?"satisfied":"degraded",receiptId:f,reason:u==="unknown"?"verification_result_unknown":u==="unavailable"?"verification_command_unavailable":void 0})),n.kind==="typecheck"&&o.exitCode===0&&s.upsertPolicyVerificationBaseline({projectRoot:e,kind:n.kind,commandHash:i,diagnosticHashes:[],sourceRevision:a,updatedAt:Date.now()}),Cu(s,n,p),O({projectRoot:e,sessionId:n.sessionId,requestId:n.requestId,executionId:n.executionId,kind:u==="passed"?"verification.succeeded":"verification.failed",payload:{receiptId:f,reasonCode:`verification_${u}`,verificationKind:n.kind},dedupeKey:f,producer:"devflow-verification-worker"}),h&&u!=="failed"&&O({projectRoot:e,sessionId:n.sessionId,requestId:n.requestId,executionId:n.executionId,kind:"durable_work.completed",payload:{workId:h,obligation:"verification"},dedupeKey:`${h}:completed`,producer:"devflow-verification-worker"}),u==="failed"){let b=new Error(`Policy verification failed: ${n.display}`);throw b.category="policy_verification_failed",b}return p}finally{s.close();}}function _u(e){let t=xu(e.projectRoot),n=Eu(e.projectRoot),o=t?.scripts??{},r={...t?.dependencies,...t?.devDependencies},i=null;if(e.kind==="formatter"&&(r.prettier||Tu(e.projectRoot)))i=it(n,"prettier",[e.mode==="write"?"--write":"--check",e.targetFile],6e4);else if(e.kind==="typecheck"){let s=yn(o,["typecheck","type-check","check:types"]);s?i=gn(n,s,12e4):r.typescript&&existsSync(join(e.projectRoot,"tsconfig.json"))&&(i=it(n,"tsc",["--noEmit","--pretty","false"],12e4));}else if(e.kind==="lint"){let s=yn(o,["lint"]);s&&(i=gn(n,s,12e4));}else if(e.kind==="test"){let s=Au(e.projectRoot,e.targetFile);s&&r.vitest?i=it(n,"vitest",["run",s],12e4):s&&(r.jest||r["@jest/core"])&&(i=it(n,"jest",["--runTestsByPath",s],12e4));}else if(e.kind==="build"){let s=yn(o,["build"]);s&&(i=gn(n,s,18e4));}else e.kind==="generated_files"&&(i={command:"git",args:["diff","--check","--",e.targetFile],timeoutMs:3e4});return i?{kind:e.kind,...i,display:[i.command,...i.args].map(Ou).join(" "),required:e.required,targetFile:e.targetFile,contextReceipt:e.contextReceipt}:null}function gn(e,t,n){return e==="yarn"?{command:"yarn",args:["run",t],timeoutMs:n}:e==="pnpm"?{command:"pnpm",args:["run",t],timeoutMs:n}:e==="bun"?{command:"bun",args:["run",t],timeoutMs:n}:{command:"npm",args:["run",t],timeoutMs:n}}function it(e,t,n,o){return e==="pnpm"?{command:"pnpm",args:["exec",t,...n],timeoutMs:o}:e==="yarn"?{command:"yarn",args:[t,...n],timeoutMs:o}:e==="bun"?{command:"bunx",args:[t,...n],timeoutMs:o}:{command:"npx",args:["--no-install",t,...n],timeoutMs:o}}function bu(e,t){if(!t||typeof t!="object"||Array.isArray(t))throw hn();let n=t,o=new Set(["npm","npx","pnpm","yarn","bun","bunx","git"]);if(!n.command||!o.has(n.command)||!Array.isArray(n.args)||!n.args.every(r=>typeof r=="string")||!n.obligationId||!n.sessionId||!n.kind||!n.targetFile||!n.contextReceipt||!n.display||!Number.isFinite(n.timeoutMs)||!yi(e,n.targetFile))throw hn();return n}function hn(){let e=new Error("Policy verification work payload is invalid");return e.category="invalid_payload",e}function ku(e,t){return new Promise(n=>{let o=spawn(e.command,e.args,{cwd:t,shell:false,stdio:["ignore","pipe","pipe"],env:{...process.env,CI:"1",FORCE_COLOR:"0"}}),r="",i=false,s=l=>{i||(i=true,n(l));},a=l=>{r=(r+String(l)).slice(-32768);};o.stdout.on("data",a),o.stderr.on("data",a);let c=false,d=setTimeout(()=>{c=true,o.kill("SIGTERM"),setTimeout(()=>o.kill("SIGKILL"),1e3).unref();},e.timeoutMs);o.on("error",l=>{clearTimeout(d),s({exitCode:null,timedOut:false,spawnError:true,output:`${r}
35
- ${l.message}`.slice(-32768)});}),o.on("close",l=>{clearTimeout(d),s({exitCode:l,timedOut:c,spawnError:false,output:r});});})}function Su(e,t){let n=t.file_path??t.notebook_path;if(typeof n!="string"||!n.trim())return null;let o=isAbsolute(n)?resolve(n):resolve(e,n);return yi(e,o)?relative(e,o).split(sep).join("/"):null}function yi(e,t){let n=isAbsolute(t)?resolve(t):resolve(e,t),o=relative(resolve(e),n);return o!==""&&o!==".."&&!o.startsWith(`..${sep}`)&&!isAbsolute(o)}function Ru(e){if(!e||typeof e!="object"||Array.isArray(e))return false;let t=e;return t.ok===false||t.success===false||t.isError===true||!!t.error}function xu(e){try{return JSON.parse(readFileSync$1(join(e,"package.json"),"utf8"))}catch{return null}}function Eu(e){return existsSync(join(e,"pnpm-lock.yaml"))?"pnpm":existsSync(join(e,"yarn.lock"))?"yarn":existsSync(join(e,"bun.lockb"))||existsSync(join(e,"bun.lock"))?"bun":"npm"}function Tu(e){return [".prettierrc",".prettierrc.json",".prettierrc.js",".prettierrc.cjs","prettier.config.js","prettier.config.cjs"].some(t=>existsSync(join(e,t)))}function yn(e,t){return t.find(n=>typeof e[n]=="string"&&e[n].trim())??null}function Au(e,t){let n=t.replace(/\.[^.]+$/u,""),o=[".test.ts",".test.tsx",".spec.ts",".spec.tsx",".test.js",".spec.js"];for(let s of o){let a=`${n}${s}`;if(existsSync(join(e,a)))return a}let r=join(e,t.split("/").slice(0,-1).join("/")),i=t.split("/").at(-1)?.replace(/\.[^.]+$/u,"");if(!i||!existsSync(r))return null;try{return readdirSync$1(r).filter(s=>s.startsWith(`${i}.`)&&/\.(?:test|spec)\.[cm]?[jt]sx?$/u.test(s)).map(s=>relative(e,join(r,s)).split(sep).join("/"))[0]??null}catch{return null}}function Du(e,t,n){let o=t.split(sep).join("/"),r=resolve(n,t).split(sep).join("/"),i=e.split(/\r?\n/u).map(s=>s.trim().split(sep).join("/")).filter(s=>s.includes(o)||s.includes(r)).map(s=>s.replace(/:\d+:\d+/gu,":#:#").replace(/\(\d+,\d+\)/gu,"(#,#)")).filter(s=>/\berror\s+TS\d+\b/iu.test(s));return [...new Set(i.map(s=>createHash("sha256").update(s).digest("hex")))]}function Cu(e,t,n){if(!t.executionId)return;let o=e.getSkillExecution(t.executionId);if(!o)return;let r=o.metadata&&typeof o.metadata=="object"?o.metadata:{},i=Array.isArray(r.policyVerificationOutcomes)?r.policyVerificationOutcomes:[];e.updateSkillExecution(t.executionId,{metadata:{...r,policyVerificationOutcomes:[...i,n]}});}function Mu(e){try{let t=readFileSync$1(join(e,".git","HEAD"),"utf8").trim();return t.startsWith("ref:")?readFileSync$1(join(e,".git",t.slice(5).trim()),"utf8").trim():t}catch{return}}function pi(e){return createHash("sha256").update(JSON.stringify(e)).digest("hex")}function Ou(e){return /^[A-Za-z0-9_./:@=-]+$/u.test(e)?e:JSON.stringify(e)}async function _i(e){let t=Date.now(),n=Vu(e.projectRoot),o=claudeCodeRuntimeAdapter.normalizePrompt(e.hostEvent??{session_id:e.sessionId,prompt:e.prompt},{projectRoot:n}),r=semanticTextHash(wi(o.rawPrompt)),i=openGlobalDevFlowDatabase(void 0,{busyTimeoutMs:100});try{let s=i.getTaskIntentArtifactBySource({projectRoot:n,sessionId:e.sessionId,sourceHash:r});if(s){let g=vi(s).identity,b=i.getRuntimeActivation(g.projectRoot,g.sessionId,g.turnId,s.version);if(!b)throw new Error(`RUNTIME_ACTIVATION_MISSING:${s.artifactHash}`);return {artifact:vi(s),memoryIdentity:Ii(s),activation:b,reused:!0}}let a=`turn:${at(`${e.sessionId}\0${r}`)}`,c=`request:${at(`${n}\0${e.sessionId}\0${a}`)}`,d={projectRoot:n,projectId:`project:${stableRuntimeHash(n).slice(0,20)}`,hostId:o.hostId,sessionId:e.sessionId,executionId:e.sessionId,turnId:a,requestId:c},l=1,u=resolveRuntimeActivationSnapshot({projectRoot:n,createdAt:o.timestamp}),m=zu(o.rawPrompt),f={identity:d,version:l,rawPrompt:o.rawPrompt,normalizedPrompt:wi(o.rawPrompt),...o.command?{command:o.command}:{},slashArgs:o.slashArgs,...o.activeSkill?{activeSkill:o.activeSkill}:{},intent:"unknown",action:"unknown",entities:[],targetAnchors:m,policyConstraints:[],classificationEvidence:[],sourceEventIds:[o.sourceEventId??`host-event:${r.slice(0,24)}`],sourceHash:r,createdAt:o.timestamp},p={...f,artifactHash:Ju(f)};i.appendTaskIntentArtifact(Wu(p)),i.bindRuntimeActivation({identity:d,revision:l,snapshot:u});let h=qu(i,p);return y({event:"host.prompt.normalized",identity:d,level:"info",timestamp:Date.now(),data:{sourceHash:r,command:p.command,activeSkill:p.activeSkill,rawPromptBytes:Buffer.byteLength(p.rawPrompt)}}),y({event:"intent.artifact.created",identity:d,level:"info",timestamp:Date.now(),data:{artifactHash:p.artifactHash,targetCount:m.length}}),y({event:"intent.artifact.persisted",identity:d,level:"info",timestamp:Date.now(),data:{artifactHash:p.artifactHash,version:p.version,sourceHash:p.sourceHash,authority:"immutable-intent",captureLatencyMs:Date.now()-t}}),y({event:"terminal.transition.persisted",identity:d,level:"info",timestamp:Date.now(),data:{state:"intent_bound",receiptId:h,sourceIntentHash:p.artifactHash}}),{artifact:p,memoryIdentity:Ii(p),activation:u,reused:!1}}finally{i.close();}}function qu(e,t){let n=e.getLatestTerminalTransition(t.identity.projectRoot,t.identity.sessionId,t.identity.turnId);if(n)return n.receiptId;let o=`terminal:${at(`${t.artifactHash}\0open`)}`;return e.appendTerminalTransition({...t.identity,sequence:1,toState:"open",receiptId:o,reason:"host_prompt_accepted",payload:{sourceHash:t.sourceHash},createdAt:t.createdAt}),e.appendTerminalTransition({...t.identity,sequence:2,fromState:"open",toState:"intent_bound",receiptId:`terminal:${at(`${t.artifactHash}\0intent_bound`)}`,sourceReceiptId:o,reason:"immutable_intent_persisted",payload:{intentArtifactHash:t.artifactHash},createdAt:Math.max(t.createdAt,Date.now())}).receiptId}function Wu(e){return {...e.identity,version:e.version,supersedesHash:e.supersedesHash,rawPrompt:e.rawPrompt,normalizedPrompt:e.normalizedPrompt,command:e.command,slashArgs:e.slashArgs,activeSkill:e.activeSkill,intent:e.intent,action:e.action,entities:e.entities,targetAnchors:e.targetAnchors,policyConstraints:e.policyConstraints,classificationEvidence:e.classificationEvidence.map(t=>({...t})),sourceEventIds:e.sourceEventIds,sourceHash:e.sourceHash,artifactHash:e.artifactHash,createdAt:e.createdAt}}function vi(e){return {identity:Uu(e),version:e.version,...e.supersedesHash?{supersedesHash:e.supersedesHash}:{},rawPrompt:e.rawPrompt,normalizedPrompt:e.normalizedPrompt,...e.command?{command:e.command}:{},slashArgs:e.slashArgs,...e.activeSkill?{activeSkill:e.activeSkill}:{},intent:e.intent,action:e.action,entities:e.entities,targetAnchors:e.targetAnchors,policyConstraints:e.policyConstraints,classificationEvidence:e.classificationEvidence,sourceEventIds:e.sourceEventIds,sourceHash:e.sourceHash,artifactHash:e.artifactHash,createdAt:e.createdAt}}function Uu(e){return {projectRoot:e.projectRoot,projectId:e.projectId,hostId:e.hostId,sessionId:e.sessionId,turnId:e.turnId,requestId:e.requestId,...e.executionId?{executionId:e.executionId}:{}}}function Ii(e){let t=e.rawPrompt.trim().slice(0,4e3),n="identity"in e?e.identity.turnId:e.turnId;return {turnId:n,eventId:`memory-turn:${n.replace(/^turn:/u,"")}`,promptHash:createHash("sha256").update(t).digest("hex"),createdAt:e.createdAt}}function zu(e){let t=e.match(/(?:^|[\s`'"(])((?:\.{0,2}\/)?(?:[A-Za-z0-9_@.-]+\/)+[A-Za-z0-9_@.-]+(?:\.[A-Za-z0-9]+)?)/gu)??[];return Bu(t.map(n=>n.trim().replace(/^[`'"(]+|[`'"),.;:,。;:]+$/gu,"")).filter(n=>!n.startsWith("/")||/\.[A-Za-z0-9]+$/u.test(n))).slice(0,16)}function wi(e){return e.normalize("NFKC").replace(/\s+/gu," ").trim().slice(0,4e3)}function Bu(e){return [...new Set(e.filter(Boolean))]}function Vu(e){let t=resolve(e);try{return realpathSync(t)}catch{return t}}function Ju(e){return createHash("sha256").update(_n(e)).digest("hex")}function at(e){return createHash("sha256").update(e).digest("hex").slice(0,24)}function _n(e){if(e===null||typeof e=="string"||typeof e=="boolean")return JSON.stringify(e);if(typeof e=="number")return Number.isFinite(e)?JSON.stringify(e):"null";if(Array.isArray(e))return `[${e.map(_n).join(",")}]`;if(!e||typeof e!="object")return JSON.stringify(String(e));let t=e;return `{${Object.keys(t).sort().map(n=>`${JSON.stringify(n)}:${_n(t[n])}`).join(",")}}`}function kn(){return generateKeyPairSync("ed25519")}function Sn(e){let t=parseTrustedDecisionCommand(e.rawUserEvent,e.allowedOptionIds),n=e.now??Date.now(),o={schemaVersion:"delivery-user-attestation.v1",issuer:e.issuer,keyId:e.keyId,purpose:t.purpose,decisionId:t.decisionId,caseId:e.caseId,caseVersion:e.caseVersion,sessionId:e.sessionId,sourceTurnId:e.sourceTurnId,actorId:e.actorId,targetDecisionHash:e.targetDecisionHash,rawUserEvent:e.rawUserEvent,rawUserEventHash:domainHash("raw-user-event",e.rawUserEvent),selectedValueHash:domainHash("decision-value",{decisionId:t.decisionId,purpose:t.purpose,value:encodeDecisionValue(t.purpose,t.value)}),eventSequence:e.eventSequence,issuedAt:new Date(n).toISOString(),expiresAt:new Date(n+6e4).toISOString(),nonce:e.nonce};return {...o,attestation:sign(null,canonicalJsonBytes(o),e.privateKey).toString("base64url")}}var ki=new Map;function Si(e){if(typeof e=="string")return /\bDevFlow decision ([A-Za-z0-9._:-]+)/u.exec(z(e))?.[1]}function z(e){return e.replace(/[\u0000-\u001f\u007f\ufffd]+/gu,"").replace(/\s+/gu," ").trim()}function nm(e){if(typeof e=="string")return e.trim()||void 0;if(!e||typeof e!="object"||Array.isArray(e))return;let t=e.answers;if(!t||typeof t!="object"||Array.isArray(t))return;let n=Object.values(t);if(n.length!==1)return;let o=n[0];if(!(Array.isArray(o)||typeof o!="string"))return o.trim()||void 0}async function xi(e){if(e.toolName!=="AskUserQuestion")return {handled:false};let t=e.toolInput&&typeof e.toolInput=="object"&&!Array.isArray(e.toolInput)?e.toolInput:{};if(!Array.isArray(t.questions)||t.questions.length!==1)return {handled:false};let n=t.questions[0],o=Ti(e.projectRoot),r=Si(n.header)??Si(n.question);if(!r){let g=await o.pendingDecisionForSession(e.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(n.options)?n.options.map(g=>({label:typeof g.label=="string"?z(g.label):"",description:typeof g.description=="string"?z(g.description):""})):[],c=createHash("sha256").update(JSON.stringify({decisionId:r,question:z(String(n.question??"")),options:a})).digest("hex"),d=nm(e.toolResponse),l=d?z(d):void 0;if(!l)return (typeof o.recordDecisionPresentation=="function"?await o.recordDecisionPresentation({caseId:i,decisionId:r,caseVersion:s.caseVersion,presentationHash:c,sourceTurnId:e.sourceTurnId??e.toolUseId}):true)?{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.`}:{handled:true,resolved:false,message:`DevFlow interactive decision ${r} was already presented. Reuse the existing answer or refresh delivery_status after resolution.`};if(n.multiSelect===true)return {handled:true,resolved:false,message:`DevFlow interactive decision rejected: ${r} must be a single selection.`};let u;if(s.options.length>0){let g=s.options.map(S=>({label:z(S.label),description:S.description?z(S.description):""}));if(a.length!==g.length||a.some((S,w)=>S.label!==g[w]?.label||S.description!==g[w]?.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 b=s.options.find(S=>z(S.label)===l);if(!b)return {handled:true,resolved:false,message:`DevFlow interactive decision rejected: answer does not match a pending option for ${r}.`};s.kind==="artifact_approval"?u=b.id==="approve"?`/devflow:approve ${r}`:`/devflow:reject ${r} -- ${l}`:u=`/devflow:decide ${r} ${b.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.`};u=`/devflow:decide ${r} -- ${l}`;}if(!(typeof o.recordDecisionPresentation=="function"?await o.recordDecisionPresentation({caseId:i,decisionId:r,caseVersion:s.caseVersion,presentationHash:c,sourceTurnId:e.sourceTurnId??e.toolUseId}):true))return {handled:true,resolved:false,message:`DevFlow interactive decision ${r} was already presented. Reuse the existing answer or refresh delivery_status after resolution.`};let f=process.env.DEVFLOW_HOST_ACTOR_ID?.trim()||`user:${process.env.USER?.trim()||"local"}`,p=kn(),h=Sn({rawUserEvent:u,issuer:"claude-code",keyId:"session-ephemeral",caseId:i,caseVersion:s.caseVersion,sessionId:e.sessionId,sourceTurnId:e.sourceTurnId?.trim()||e.toolUseId?.trim()||`host-turn:${e.sessionId}:${Date.now()}`,actorId:f,targetDecisionHash:s.targetDecisionHash,eventSequence:Date.now(),nonce:randomUUID$1(),privateKey:p.privateKey,allowedOptionIds:s.options.map(g=>g.id)});try{return await o.resolveTrustedDecision({evidence:h,publicKey:p.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)}`}}}async function Ei(e){let t=e.prompt.trim();if(!/^\/devflow:(?:decide|approve|reject|revise|cancel|exit)\b/u.test(t))return {handled:false};let n=Ti(e.projectRoot),o=t;if(t==="/devflow:approve"||t==="/devflow:approve current"){let l=await n.pendingDecisionForSession(e.sessionId);if(!l)return {handled:true,resolved:false,message:"DevFlow approval not found: there is no pending decision for this session."};if("ambiguous"in l)return {handled:true,resolved:false,message:`DevFlow approval is ambiguous: multiple pending cases exist (${l.caseIds.join(", ")}). Use the approval choices shown by the host.`};if(l.decision.kind!=="artifact_approval")return {handled:true,resolved:false,message:"DevFlow approval is not available yet: the current pending item is a clarification, not an artifact gate."};o=`/devflow:approve ${l.decision.id}`;}let r;try{r=parseTrustedDecisionCommand(o);}catch(l){return {handled:true,resolved:false,message:`DevFlow trusted decision rejected: ${l instanceof Error?l.message:String(l)}`}}let i=r.decisionId.split(/:(?:decision|question|approval):/u)[0],s=await n.pendingDecision(i);if(!s||s.id!==r.decisionId)return {handled:true,resolved:false,message:`DevFlow trusted decision rejected: no pending decision matches ${r.decisionId}. Refresh delivery_status.`};let a=process.env.DEVFLOW_HOST_ACTOR_ID?.trim()||`user:${process.env.USER?.trim()||"local"}`,c=kn(),d=Sn({rawUserEvent:o,issuer:"claude-code",keyId:"session-ephemeral",caseId:i,caseVersion:s.caseVersion,sessionId:e.sessionId,sourceTurnId:e.sourceTurnId?.trim()||`host-turn:${e.sessionId}:${Date.now()}`,actorId:a,targetDecisionHash:s.targetDecisionHash,eventSequence:Date.now(),nonce:randomUUID$1(),privateKey:c.privateKey,allowedOptionIds:s.options.map(l=>l.id)});try{return await n.resolveTrustedDecision({evidence:d,publicKey:c.publicKey,expectedIssuer:"claude-code",expectedKeyId:"session-ephemeral"}),{handled:!0,resolved:!0,message:`DevFlow trusted decision resolved for ${i}. Refresh delivery_status and follow nextActions.`}}catch(l){return {handled:true,resolved:false,message:`DevFlow trusted decision rejected: ${l instanceof Error?l.message:String(l)}`}}}function Ti(e){let t=ki.get(e);if(t)return t;let n=createTrustedDeliveryFacade(e);return ki.set(e,n),n}function Ai(e=process.env){if(e.DEVFLOW_DISABLED==="1")return true;try{return existsSync(join(getDevFlowStateRoot({env:e}),"disable"))}catch{return false}}function Di(e){y({event:"hook.enforcement.shadow",identity:{projectRoot:e.projectRoot,sessionId:e.sessionId},level:"warn",timestamp:Date.now(),data:{tool:e.toolName,code:e.code??"DEVFLOW_POLICY",reason:e.reason.slice(0,500)}});try{process.stderr.write(`[devflow][shadow] would deny ${e.toolName}: ${e.reason}
35
+ ${l.message}`.slice(-32768)});}),o.on("close",l=>{clearTimeout(d),s({exitCode:l,timedOut:c,spawnError:false,output:r});});})}function Su(e,t){let n=t.file_path??t.notebook_path;if(typeof n!="string"||!n.trim())return null;let o=isAbsolute(n)?resolve(n):resolve(e,n);return yi(e,o)?relative(e,o).split(sep).join("/"):null}function yi(e,t){let n=isAbsolute(t)?resolve(t):resolve(e,t),o=relative(resolve(e),n);return o!==""&&o!==".."&&!o.startsWith(`..${sep}`)&&!isAbsolute(o)}function Ru(e){if(!e||typeof e!="object"||Array.isArray(e))return false;let t=e;return t.ok===false||t.success===false||t.isError===true||!!t.error}function xu(e){try{return JSON.parse(readFileSync$1(join(e,"package.json"),"utf8"))}catch{return null}}function Eu(e){return existsSync(join(e,"pnpm-lock.yaml"))?"pnpm":existsSync(join(e,"yarn.lock"))?"yarn":existsSync(join(e,"bun.lockb"))||existsSync(join(e,"bun.lock"))?"bun":"npm"}function Tu(e){return [".prettierrc",".prettierrc.json",".prettierrc.js",".prettierrc.cjs","prettier.config.js","prettier.config.cjs"].some(t=>existsSync(join(e,t)))}function yn(e,t){return t.find(n=>typeof e[n]=="string"&&e[n].trim())??null}function Au(e,t){let n=t.replace(/\.[^.]+$/u,""),o=[".test.ts",".test.tsx",".spec.ts",".spec.tsx",".test.js",".spec.js"];for(let s of o){let a=`${n}${s}`;if(existsSync(join(e,a)))return a}let r=join(e,t.split("/").slice(0,-1).join("/")),i=t.split("/").at(-1)?.replace(/\.[^.]+$/u,"");if(!i||!existsSync(r))return null;try{return readdirSync$1(r).filter(s=>s.startsWith(`${i}.`)&&/\.(?:test|spec)\.[cm]?[jt]sx?$/u.test(s)).map(s=>relative(e,join(r,s)).split(sep).join("/"))[0]??null}catch{return null}}function Du(e,t,n){let o=t.split(sep).join("/"),r=resolve(n,t).split(sep).join("/"),i=e.split(/\r?\n/u).map(s=>s.trim().split(sep).join("/")).filter(s=>s.includes(o)||s.includes(r)).map(s=>s.replace(/:\d+:\d+/gu,":#:#").replace(/\(\d+,\d+\)/gu,"(#,#)")).filter(s=>/\berror\s+TS\d+\b/iu.test(s));return [...new Set(i.map(s=>createHash("sha256").update(s).digest("hex")))]}function Cu(e,t,n){if(!t.executionId)return;let o=e.getSkillExecution(t.executionId);if(!o)return;let r=o.metadata&&typeof o.metadata=="object"?o.metadata:{},i=Array.isArray(r.policyVerificationOutcomes)?r.policyVerificationOutcomes:[];e.updateSkillExecution(t.executionId,{metadata:{...r,policyVerificationOutcomes:[...i,n]}});}function Mu(e){try{let t=readFileSync$1(join(e,".git","HEAD"),"utf8").trim();return t.startsWith("ref:")?readFileSync$1(join(e,".git",t.slice(5).trim()),"utf8").trim():t}catch{return}}function pi(e){return createHash("sha256").update(JSON.stringify(e)).digest("hex")}function Ou(e){return /^[A-Za-z0-9_./:@=-]+$/u.test(e)?e:JSON.stringify(e)}async function _i(e){let t=Date.now(),n=Vu(e.projectRoot),o=claudeCodeRuntimeAdapter.normalizePrompt(e.hostEvent??{session_id:e.sessionId,prompt:e.prompt},{projectRoot:n}),r=semanticTextHash(wi(o.rawPrompt)),i=openGlobalDevFlowDatabase(void 0,{busyTimeoutMs:100});try{let s=i.getTaskIntentArtifactBySource({projectRoot:n,sessionId:e.sessionId,sourceHash:r});if(s){let g=vi(s).identity,b=i.getRuntimeActivation(g.projectRoot,g.sessionId,g.turnId,s.version);if(!b)throw new Error(`RUNTIME_ACTIVATION_MISSING:${s.artifactHash}`);return {artifact:vi(s),memoryIdentity:Ii(s),activation:b,reused:!0}}let a=`turn:${at(`${e.sessionId}\0${r}`)}`,c=`request:${at(`${n}\0${e.sessionId}\0${a}`)}`,d={projectRoot:n,projectId:`project:${stableRuntimeHash(n).slice(0,20)}`,hostId:o.hostId,sessionId:e.sessionId,executionId:e.sessionId,turnId:a,requestId:c},l=1,u=resolveRuntimeActivationSnapshot({projectRoot:n,createdAt:o.timestamp}),m=zu(o.rawPrompt),f={identity:d,version:l,rawPrompt:o.rawPrompt,normalizedPrompt:wi(o.rawPrompt),...o.command?{command:o.command}:{},slashArgs:o.slashArgs,...o.activeSkill?{activeSkill:o.activeSkill}:{},intent:"unknown",action:"unknown",entities:[],targetAnchors:m,policyConstraints:[],classificationEvidence:[],sourceEventIds:[o.sourceEventId??`host-event:${r.slice(0,24)}`],sourceHash:r,createdAt:o.timestamp},p={...f,artifactHash:Ju(f)};i.appendTaskIntentArtifact(Wu(p)),i.bindRuntimeActivation({identity:d,revision:l,snapshot:u});let h=qu(i,p);return y({event:"host.prompt.normalized",identity:d,level:"info",timestamp:Date.now(),data:{sourceHash:r,command:p.command,activeSkill:p.activeSkill,rawPromptBytes:Buffer.byteLength(p.rawPrompt)}}),y({event:"intent.artifact.created",identity:d,level:"info",timestamp:Date.now(),data:{artifactHash:p.artifactHash,targetCount:m.length}}),y({event:"intent.artifact.persisted",identity:d,level:"info",timestamp:Date.now(),data:{artifactHash:p.artifactHash,version:p.version,sourceHash:p.sourceHash,authority:"immutable-intent",captureLatencyMs:Date.now()-t}}),y({event:"terminal.transition.persisted",identity:d,level:"info",timestamp:Date.now(),data:{state:"intent_bound",receiptId:h,sourceIntentHash:p.artifactHash}}),{artifact:p,memoryIdentity:Ii(p),activation:u,reused:!1}}finally{i.close();}}function qu(e,t){let n=e.getLatestTerminalTransition(t.identity.projectRoot,t.identity.sessionId,t.identity.turnId);if(n)return n.receiptId;let o=`terminal:${at(`${t.artifactHash}\0open`)}`;return e.appendTerminalTransition({...t.identity,sequence:1,toState:"open",receiptId:o,reason:"host_prompt_accepted",payload:{sourceHash:t.sourceHash},createdAt:t.createdAt}),e.appendTerminalTransition({...t.identity,sequence:2,fromState:"open",toState:"intent_bound",receiptId:`terminal:${at(`${t.artifactHash}\0intent_bound`)}`,sourceReceiptId:o,reason:"immutable_intent_persisted",payload:{intentArtifactHash:t.artifactHash},createdAt:Math.max(t.createdAt,Date.now())}).receiptId}function Wu(e){return {...e.identity,version:e.version,supersedesHash:e.supersedesHash,rawPrompt:e.rawPrompt,normalizedPrompt:e.normalizedPrompt,command:e.command,slashArgs:e.slashArgs,activeSkill:e.activeSkill,intent:e.intent,action:e.action,entities:e.entities,targetAnchors:e.targetAnchors,policyConstraints:e.policyConstraints,classificationEvidence:e.classificationEvidence.map(t=>({...t})),sourceEventIds:e.sourceEventIds,sourceHash:e.sourceHash,artifactHash:e.artifactHash,createdAt:e.createdAt}}function vi(e){return {identity:Uu(e),version:e.version,...e.supersedesHash?{supersedesHash:e.supersedesHash}:{},rawPrompt:e.rawPrompt,normalizedPrompt:e.normalizedPrompt,...e.command?{command:e.command}:{},slashArgs:e.slashArgs,...e.activeSkill?{activeSkill:e.activeSkill}:{},intent:e.intent,action:e.action,entities:e.entities,targetAnchors:e.targetAnchors,policyConstraints:e.policyConstraints,classificationEvidence:e.classificationEvidence,sourceEventIds:e.sourceEventIds,sourceHash:e.sourceHash,artifactHash:e.artifactHash,createdAt:e.createdAt}}function Uu(e){return {projectRoot:e.projectRoot,projectId:e.projectId,hostId:e.hostId,sessionId:e.sessionId,turnId:e.turnId,requestId:e.requestId,...e.executionId?{executionId:e.executionId}:{}}}function Ii(e){let t=e.rawPrompt.trim().slice(0,4e3),n="identity"in e?e.identity.turnId:e.turnId;return {turnId:n,eventId:`memory-turn:${n.replace(/^turn:/u,"")}`,promptHash:createHash("sha256").update(t).digest("hex"),createdAt:e.createdAt}}function zu(e){let t=e.match(/(?:^|[\s`'"(])((?:\.{0,2}\/)?(?:[A-Za-z0-9_@.-]+\/)+[A-Za-z0-9_@.-]+(?:\.[A-Za-z0-9]+)?)/gu)??[];return Bu(t.map(n=>n.trim().replace(/^[`'"(]+|[`'"),.;:,。;:]+$/gu,"")).filter(n=>!n.startsWith("/")||/\.[A-Za-z0-9]+$/u.test(n))).slice(0,16)}function wi(e){return e.normalize("NFKC").replace(/\s+/gu," ").trim().slice(0,4e3)}function Bu(e){return [...new Set(e.filter(Boolean))]}function Vu(e){let t=resolve(e);try{return realpathSync(t)}catch{return t}}function Ju(e){return createHash("sha256").update(_n(e)).digest("hex")}function at(e){return createHash("sha256").update(e).digest("hex").slice(0,24)}function _n(e){if(e===null||typeof e=="string"||typeof e=="boolean")return JSON.stringify(e);if(typeof e=="number")return Number.isFinite(e)?JSON.stringify(e):"null";if(Array.isArray(e))return `[${e.map(_n).join(",")}]`;if(!e||typeof e!="object")return JSON.stringify(String(e));let t=e;return `{${Object.keys(t).sort().map(n=>`${JSON.stringify(n)}:${_n(t[n])}`).join(",")}}`}function kn(){return generateKeyPairSync("ed25519")}function Sn(e){let t=parseTrustedDecisionCommand(e.rawUserEvent,e.allowedOptionIds),n=e.now??Date.now(),o={schemaVersion:"delivery-user-attestation.v1",issuer:e.issuer,keyId:e.keyId,purpose:t.purpose,decisionId:t.decisionId,caseId:e.caseId,caseVersion:e.caseVersion,sessionId:e.sessionId,sourceTurnId:e.sourceTurnId,actorId:e.actorId,targetDecisionHash:e.targetDecisionHash,rawUserEvent:e.rawUserEvent,rawUserEventHash:domainHash("raw-user-event",e.rawUserEvent),selectedValueHash:domainHash("decision-value",{decisionId:t.decisionId,purpose:t.purpose,value:encodeDecisionValue(t.purpose,t.value)}),eventSequence:e.eventSequence,issuedAt:new Date(n).toISOString(),expiresAt:new Date(n+6e4).toISOString(),nonce:e.nonce};return {...o,attestation:sign(null,canonicalJsonBytes(o),e.privateKey).toString("base64url")}}var ki=new Map;function Si(e){if(typeof e=="string")return /\bDevFlow decision ([A-Za-z0-9._:-]+)/u.exec(z(e))?.[1]}function z(e){return e.replace(/[\u0000-\u001f\u007f\ufffd]+/gu,"").replace(/\s+/gu," ").trim()}function nm(e){if(typeof e=="string")return e.trim()||void 0;if(!e||typeof e!="object"||Array.isArray(e))return;let t=e.answers;if(!t||typeof t!="object"||Array.isArray(t))return;let n=Object.values(t);if(n.length!==1)return;let o=n[0];if(!(Array.isArray(o)||typeof o!="string"))return o.trim()||void 0}async function xi(e){if(e.toolName!=="AskUserQuestion")return {handled:false};let t=e.toolInput&&typeof e.toolInput=="object"&&!Array.isArray(e.toolInput)?e.toolInput:{};if(!Array.isArray(t.questions)||t.questions.length!==1)return {handled:false};let n=t.questions[0],o=Ti(e.projectRoot),r=Si(n.header)??Si(n.question);if(!r){let g=await o.pendingDecisionForSession(e.sessionId);if(!g||"ambiguous"in g||!["artifact_approval","trusted_action"].includes(g.decision.kind))return {handled:false};r=g.decision.id;}let i=r.split(":")[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(n.options)?n.options.map(g=>({label:typeof g.label=="string"?z(g.label):"",description:typeof g.description=="string"?z(g.description):""})):[],c=createHash("sha256").update(JSON.stringify({decisionId:r,question:z(String(n.question??"")),options:a})).digest("hex"),d=nm(e.toolResponse),l=d?z(d):void 0;if(!l)return (typeof o.recordDecisionPresentation=="function"?await o.recordDecisionPresentation({caseId:i,decisionId:r,caseVersion:s.caseVersion,presentationHash:c,sourceTurnId:e.sourceTurnId??e.toolUseId}):true)?{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.`}:{handled:true,resolved:false,message:`DevFlow interactive decision ${r} was already presented. Reuse the existing answer or refresh delivery_status after resolution.`};if(n.multiSelect===true)return {handled:true,resolved:false,message:`DevFlow interactive decision rejected: ${r} must be a single selection.`};let u;if(s.options.length>0){let g=s.options.map(S=>({label:z(S.label),description:S.description?z(S.description):""}));if(a.length!==g.length||a.some((S,w)=>S.label!==g[w]?.label||S.description!==g[w]?.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 b=s.options.find(S=>z(S.label)===l);if(!b)return {handled:true,resolved:false,message:`DevFlow interactive decision rejected: answer does not match a pending option for ${r}.`};s.kind==="artifact_approval"?u=b.id==="approve"?`/devflow:approve ${r}`:`/devflow:reject ${r} -- ${l}`:u=`/devflow:decide ${r} ${b.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.`};u=`/devflow:decide ${r} -- ${l}`;}if(!(typeof o.recordDecisionPresentation=="function"?await o.recordDecisionPresentation({caseId:i,decisionId:r,caseVersion:s.caseVersion,presentationHash:c,sourceTurnId:e.sourceTurnId??e.toolUseId}):true))return {handled:true,resolved:false,message:`DevFlow interactive decision ${r} was already presented. Reuse the existing answer or refresh delivery_status after resolution.`};let f=process.env.DEVFLOW_HOST_ACTOR_ID?.trim()||`user:${process.env.USER?.trim()||"local"}`,p=kn(),h=Sn({rawUserEvent:u,issuer:"claude-code",keyId:"session-ephemeral",caseId:i,caseVersion:s.caseVersion,sessionId:e.sessionId,sourceTurnId:e.sourceTurnId?.trim()||e.toolUseId?.trim()||`host-turn:${e.sessionId}:${Date.now()}`,actorId:f,targetDecisionHash:s.targetDecisionHash,eventSequence:Date.now(),nonce:randomUUID$1(),privateKey:p.privateKey,allowedOptionIds:s.options.map(g=>g.id)});try{return await o.resolveTrustedDecision({evidence:h,publicKey:p.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)}`}}}async function Ei(e){let t=e.prompt.trim();if(!/^\/devflow:(?:decide|approve|reject|revise|cancel|exit)\b/u.test(t))return {handled:false};let n=Ti(e.projectRoot),o=t;if(t==="/devflow:approve"||t==="/devflow:approve current"){let l=await n.pendingDecisionForSession(e.sessionId);if(!l)return {handled:true,resolved:false,message:"DevFlow approval not found: there is no pending decision for this session."};if("ambiguous"in l)return {handled:true,resolved:false,message:`DevFlow approval is ambiguous: multiple pending cases exist (${l.caseIds.join(", ")}). Use the approval choices shown by the host.`};if(l.decision.kind!=="artifact_approval")return {handled:true,resolved:false,message:"DevFlow approval is not available yet: the current pending item is a clarification, not an artifact gate."};o=`/devflow:approve ${l.decision.id}`;}let r;try{r=parseTrustedDecisionCommand(o);}catch(l){return {handled:true,resolved:false,message:`DevFlow trusted decision rejected: ${l instanceof Error?l.message:String(l)}`}}let i=r.decisionId.split(":")[0],s=await n.pendingDecision(i);if(!s||s.id!==r.decisionId)return {handled:true,resolved:false,message:`DevFlow trusted decision rejected: no pending decision matches ${r.decisionId}. Refresh delivery_status.`};let a=process.env.DEVFLOW_HOST_ACTOR_ID?.trim()||`user:${process.env.USER?.trim()||"local"}`,c=kn(),d=Sn({rawUserEvent:o,issuer:"claude-code",keyId:"session-ephemeral",caseId:i,caseVersion:s.caseVersion,sessionId:e.sessionId,sourceTurnId:e.sourceTurnId?.trim()||`host-turn:${e.sessionId}:${Date.now()}`,actorId:a,targetDecisionHash:s.targetDecisionHash,eventSequence:Date.now(),nonce:randomUUID$1(),privateKey:c.privateKey,allowedOptionIds:s.options.map(l=>l.id)});try{return await n.resolveTrustedDecision({evidence:d,publicKey:c.publicKey,expectedIssuer:"claude-code",expectedKeyId:"session-ephemeral"}),{handled:!0,resolved:!0,message:`DevFlow trusted decision resolved for ${i}. Refresh delivery_status and follow nextActions.`}}catch(l){return {handled:true,resolved:false,message:`DevFlow trusted decision rejected: ${l instanceof Error?l.message:String(l)}`}}}function Ti(e){let t=ki.get(e);if(t)return t;let n=createTrustedDeliveryFacade(e);return ki.set(e,n),n}function Ai(e=process.env){if(e.DEVFLOW_DISABLED==="1")return true;try{return existsSync(join(getDevFlowStateRoot({env:e}),"disable"))}catch{return false}}function Di(e){y({event:"hook.enforcement.shadow",identity:{projectRoot:e.projectRoot,sessionId:e.sessionId},level:"warn",timestamp:Date.now(),data:{tool:e.toolName,code:e.code??"DEVFLOW_POLICY",reason:e.reason.slice(0,500)}});try{process.stderr.write(`[devflow][shadow] would deny ${e.toolName}: ${e.reason}
36
36
  `);}catch{}return {hookSpecificOutput:{hookEventName:"PreToolUse",permissionDecision:"allow",additionalContext:`DevFlow shadow enforcement: this call would be denied under enforce mode (${e.code??"DEVFLOW_POLICY"}). Proceeding; the decision is recorded for graduation review.`}}}var Im=600*1e3,wm=2e3,_m=250,bm=2e3,km=1e3,ji=1024*1024,Sm=2*1024*1024,Rm=6e4,xm=100;function Em(e){if(!e||typeof e!="object"||Array.isArray(e))return;let t=e,n=typeof t.status=="string"?t.status:void 0;if(!(t.ok===false||t.success===false||t.isError===true||n==="failed"||n==="rejected"||n==="unavailable"||n==="warming"||!!t.error))return;let r=t.error;if(typeof r=="string"&&r.trim())return r;if(r&&typeof r=="object"){let i=r;if(typeof i.message=="string"&&i.message.trim())return i.message;if(typeof i.code=="string"&&i.code.trim())return i.code}return n?`Tool response status: ${n}`:"Tool response reported failure"}function $i(e){return /timeout|timed out|deadline|warming/i.test(e)?"timeout":/unavailable|not active|unknown tool|not found|not registered|route not found/i.test(e)?"unavailable":"failed"}function Fi(e,t,n,o,r){let i=e.recordDomainActionOutcome;typeof i=="function"&&i.call(e,t,n,o,r);}function Tm(e){switch(e){case "Read":case "Glob":return "file_read";case "Write":case "Edit":case "NotebookEdit":return "file_write";case "Bash":return "bash_command";case "Agent":return "subagent";case "Skill":return "skill_invoke";default:return "tool_use"}}function xn(e){return typeof e=="string"&&e.trim().length>0}function Am(e,t,n=process.env,o){if(resolveClaudeToolName(e).status==="unsupported")return t;let r=t!==null&&typeof t=="object"&&!Array.isArray(t)?t:{};if(xn(r.projectRoot))return r;let i=xn(n.CLAUDE_PROJECT_DIR)?n.CLAUDE_PROJECT_DIR:o;return xn(i)&&(r.projectRoot=i),r}var En=class{constructor(t,n){this.socketIdentity=null;this.pidIdentity=null;this.server=null;this.activeSessionIds=new Set;this.eventMap=[];this.idleTimer=null;this.telemetryFlushTimer=null;this.successfulTelemetryOperations=0;this.shutdownPromise=null;this.embeddingPreparationController=null;this.explicitMemoryGate=null;this.memoryWarmup=null;this.explicitIntentFlush=null;this.hostRuntime=null;this.memoryTurnSpoolTimer=null;this.userPromptSubmitSpoolTimer=null;this.sessionFinalizeSpoolTimer=null;this.projectRoot=t,this.socketPath=getDaemonSocketPath(t),this.pidPath=getDaemonPidPath(t),this.telemetry=new te,this.runtimeStore=new L(this.projectRoot),this.serverManager=new je(t),this.hookRuntime=Jr(t),this.hookHealth=new rt(t),this.hookHandlers=Yr({handlers:{"pre-tool-use":o=>this.handlePreToolUse(o),"post-tool-use":o=>this.handlePostToolUse(o),"post-tool-use-failure":o=>this.handlePostToolUseFailure(o),stop:o=>this.handleStop(o),"memory-snapshot":()=>this.handleMemorySnapshot(),"session-start":o=>this.handleSessionStart(o),"session-end":o=>this.handleSessionEnd(o),"user-prompt-submit":o=>this.handleUserPromptSubmit(o),"pre-compact":o=>this.handlePreCompact(o)},failurePolicy:o=>sn(o,this.hookRuntime,this.hostRuntime??{hostId:"unresolved",capabilities:new Map,profiles:new Set(["minimal","standard","strict"])}).policy}),this.initialSessionInput=n,this.workRuntime=new tt({projectRoot:t,handlers:{...si(t),"memory.explicit_commit":async({item:o})=>{await this.persistMemoryTurnItem(o.payload);},"memory.turn_capture":async({item:o})=>{await this.persistMemoryTurnItem(o.payload);},"memory.explicit_enrichment":async({item:o})=>{let r=o.payload;if(typeof r?.observationId!="string"||!r.observationId)throw new x("invalid_payload","Explicit enrichment requires observationId");await(await this.getMemoryGate()).enrichExplicitMemoryObservation(r.observationId);},"session.bootstrap":async({item:o})=>{await this.bootstrapSessionWork(o.payload);},"memory.vector_backfill":async()=>{await(await this.getMemoryGate()).backfillObservationVectors({batchSize:32});},"memory.turn_distill":async({item:o})=>{await fe({projectRoot:this.projectRoot,sessionId:o.sessionId,trigger:"session_end",memory:await this.getMemoryGate()}),await this.refreshMemorySnapshot("memory_turn_distill");},"context.prefetch":async({item:o})=>{let r=o.payload;if(typeof r.prompt!="string"||typeof r.sessionId!="string"||typeof r.executionId!="string"||typeof r.profileFingerprint!="string"||typeof r.rolloutMode!="string")throw new x("invalid_payload","Context prefetch identity is incomplete");let[{createEngines:i},{projectDiagnosticCodeResult:s},{writeContextPrefetchCache:a}]=await Promise.all([import('@devflow-tools/mcp-server/composition'),import('@devflow-tools/mcp-server/retrieval'),import('@devflow-tools/context-engine')]),c=await i(this.projectRoot);try{let d=await c.context.buildTaskContext(r.prompt,{mode:"fast",sessionId:r.sessionId,executionId:r.executionId,activeSkill:r.skillName}),l=s(d,0,{projectRoot:this.projectRoot,query:r.prompt,sessionId:r.sessionId,executionId:r.executionId,requestId:`prefetch:${r.sessionId}:${r.executionId}`,turnId:`prefetch:${r.sessionId}:${r.executionId}`,host:"claude-code"});if(!a({projectRoot:this.projectRoot,query:r.prompt,sessionId:r.sessionId,executionId:r.executionId,profileFingerprint:r.profileFingerprint,rolloutMode:r.rolloutMode,retrievalVersion:r.retrievalVersion},l))throw new Error("Context prefetch envelope was not receipt-valid")}finally{c.close();}},"verification.policy":async({item:o})=>{await hi(this.projectRoot,o);},"learning.analyze_session":async({item:o})=>{let r=o.payload;if(typeof r.projectRoot!="string"||typeof r.sessionId!="string"||typeof r.closureReceipt!="string"||typeof r.projectRevision!="string"||typeof r.createdAt!="number")throw new x("invalid_payload","Learning analysis identity is incomplete");let i=openGlobalDevFlowDatabase();try{let s=await(await this.getMemoryGate()).listLearningEvidence(r.sessionId),a=un({payload:r,evidence:s,database:i,rolloutMode:resolveCapabilityRollout(this.projectRoot).config.learningOverlays});i.insertEvent({kind:"learning_analysis",timestamp:Date.now(),success:!0,metadata:{...r,...a}});}finally{i.close();}},"session.finalize":async({item:o})=>{await this.finalizeSessionWork(o.payload,o.id);},"telemetry.reconcile":async()=>{await this.flushTelemetry();}},afterComplete:({item:o,database:r})=>{let i=o.kind==="memory.explicit_commit"||o.kind==="memory.turn_capture"?"memory":o.kind==="verification.policy"?"verification":null;i&&o.sessionId&&o.turnId&&O({projectRoot:this.projectRoot,sessionId:o.sessionId,turnId:o.turnId,kind:"durable_work.completed",payload:{workId:o.id,obligation:i},dedupeKey:`${o.id}:completed`,producer:"devflow-work-runtime"}),o.sessionId&&this.enqueueLearningAnalysisIfReady(r,o.sessionId);}});}logRuntime(t,n,o={},r){let i=r?this.runtimeStore.get(r):void 0;y({event:t==="warn"||t==="error"?"hook.runtime.degraded":"hook.runtime.completed",identity:{projectRoot:this.projectRoot,sessionId:r,executionId:i?.executionId},level:t,timestamp:Date.now(),data:{stage:n,...o}});}async start(){this.hostRuntime=await Gr(this.projectRoot);let t=wo(this.projectRoot,process.pid);this.runtimeManifestHash=t.manifestHash,mkdirSync(dirname(this.socketPath),{recursive:true,mode:448}),mkdirSync(dirname(this.pidPath),{recursive:true,mode:448}),await this.cleanStaleStartupResources(),this.server=createServer(n=>this.handleConnection(n));try{await this.listen(),this.writePidFile(),ho(this.projectRoot,process.pid);}catch(n){throw await this.closeServer(),this.cleanupOwnedResources(),n}if(this.server.on("error",n=>{this.logRuntime("error","server_error",{reason:n.message});}),this.logRuntime("info","server_listening",{socketHash:createHash("sha256").update(this.socketPath).digest("hex").slice(0,16)}),await this.telemetry.flushAndAggregate(),this.telemetryFlushTimer=setInterval(()=>{this.flushTelemetry();},Rm),this.telemetryFlushTimer.unref(),this.startEmbeddingPreparation(),this.workRuntime.start(),this.initialSessionInput){let n=this.initialSessionInput;this.initialSessionInput=void 0,this.handleRequest({type:"session-start",input:n});}this.drainSessionStartSpool(),this.scheduleUserPromptSubmitSpoolDrain(0),this.scheduleMemoryTurnSpoolDrain(0),this.scheduleSessionFinalizeSpoolDrain(0),this.resetIdleTimer();}startEmbeddingPreparation(){let t=new AbortController;this.embeddingPreparationController=t,prepareEmbeddingModel({signal:t.signal}).then(n=>{this.logRuntime("info","embedding_ready",{source:n.source,cacheRootHash:createHash("sha256").update(n.cacheRoot).digest("hex").slice(0,16)});}).catch(n=>{t.signal.aborted||this.logRuntime("warn","embedding_unavailable",{reason:n.message,fallback:"lexical_retrieval"});}).finally(()=>{this.embeddingPreparationController===t&&(this.embeddingPreparationController=null);});}handleConnection(t){let n="",o=false,r=false,i=0,s=Promise.resolve();t.setEncoding("utf8");let a=()=>{r||(r=true,clearTimeout(c),t.destroy());},c=setTimeout(()=>{a();},wm).unref(),d=async l=>{if(!r){r=true,clearTimeout(c);try{await this.writeFrame(t,l);}catch{}finally{t.destroy();}}};t.on("data",l=>{if(r)return;n+=l;let u=n.split(`
37
37
  `);if(n=u.pop()??"",Buffer.byteLength(n,"utf8")>ji){a();return}if(u.length===0)return;let m=0;for(let f of u){let p=Buffer.byteLength(f,"utf8");if(p>ji){a();return}m+=p+1;}if(i+m>Sm){a();return}i+=m,s=s.then(async()=>{for(let f of u){if(r)return;if(!o){let p;try{p=JSON.parse(f);}catch{await d({error:"handshake_invalid"});return}if(p?.type!=="hello"||typeof p.rootPath!="string"){await d({error:"handshake_invalid"});return}if(p.rootPath!==this.projectRoot){await d({error:"handshake_root_mismatch",expected:this.projectRoot});return}if(p.runtimeManifestHash&&p.runtimeManifestHash!==this.runtimeManifestHash){await d({error:"daemon_runtime_mismatch",expected:p.runtimeManifestHash,actual:this.runtimeManifestHash??null});return}o=true,clearTimeout(c),await this.writeFrame(t,{type:"hello_ack",...this.runtimeManifestHash?{runtimeManifestHash:this.runtimeManifestHash}:{}}),this.resetIdleTimer();continue}if(f.trim())try{let p=JSON.parse(f),h=await this.handleRequest(p);h!==null&&!r&&await this.writeFrame(t,h);}catch(p){r||await this.writeFrame(t,{error:p.message});}}}).catch(()=>{a();}).finally(()=>{i-=m;});}),t.on("close",()=>clearTimeout(c)),t.on("error",()=>{});}writeFrame(t,n){return new Promise((o,r)=>{if(t.destroyed||!t.writable){r(new Error("Socket is not writable"));return}let i=false,s=true,a=false,c=setTimeout(()=>{t.destroy(),l(new Error("Timed out writing daemon response"));},km),d=()=>{clearTimeout(c),t.off("close",u),t.off("error",m),t.off("drain",f);},l=h=>{a||!h&&(!i||!s)||(a=true,d(),h?r(h):o());},u=()=>l(new Error("Socket closed during write")),m=h=>l(h),f=()=>{s=true,l();};t.once("close",u),t.once("error",m),t.write(`${JSON.stringify(n)}
38
38
  `,h=>{if(h){l(h);return}i=true,l();})||(s=false,t.once("drain",f));})}async cleanStaleStartupResources(){let t=this.getPathIdentity(this.socketPath);if(t)if(await this.isSocketAcceptingConnections()){let r=this.getPathIdentity(this.pidPath)?this.readPidFile():null;if(r&&this.isProcessAlive(r))throw new Error(`Daemon socket already active for ${this.projectRoot}`);this.removePathIfOwned(this.socketPath,t,"orphan socket");}else this.removePathIfOwned(this.socketPath,t,"stale socket");let n=this.getPathIdentity(this.pidPath);n&&this.removePathIfOwned(this.pidPath,n,"stale PID file");}getPathIdentity(t){try{let n=lstatSync(t);return {dev:n.dev,ino:n.ino}}catch(n){if(n.code==="ENOENT")return null;throw n}}readPidFile(){try{let t=Number.parseInt(readFileSync(this.pidPath,"utf8").trim(),10);return Number.isInteger(t)&&t>1?t:null}catch{return null}}isProcessAlive(t){try{return process.kill(t,0),!0}catch(n){return n.code==="EPERM"}}pathMatchesIdentity(t,n){if(!n)return false;try{let o=this.getPathIdentity(t);return o?.dev===n.dev&&o.ino===n.ino}catch(o){return this.logRuntime("warn","path_ownership_check",{reason:o.message}),false}}writePidFile(){let t=openSync(this.pidPath,"wx",384);try{writeFileSync(t,`${process.pid}
@@ -3,6 +3,6 @@ import {existsSync,readFileSync,rmSync,mkdirSync,writeFileSync,linkSync,readdirS
3
3
 
4
4
  `)}function K(n,t=0){if(t>6||n==null)return [];if(typeof n=="string")try{return K(JSON.parse(n),t+1)}catch{return []}if(Array.isArray(n)){for(let o of n){let r=K(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=K(o,t+1);if(r.length>0)return r}return []}function P(n,t,e){if(t>pn||n===null||n===void 0)return null;if(typeof n=="string"){if(Buffer.byteLength(n,"utf8")>un)return null;try{return P(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=P(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=P(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=P(i,t+1,e);if(s)return s}return null}function hn(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!==B.length)return null;let o=e.requiredSections.filter(c=>typeof c=="string");if(o.length!==B.length||B.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")>fn||B.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(Sn(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=_n(n.toolInput);if(o.length===0)return null;let r=n.toolName==="Read"?Rn(n.toolInput):void 0,i=r?e.selectedFiles?.find(d=>xn(n.projectRoot,d,r)):void 0,s=kn(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 _n(...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 Rn(n){for(let t of ["file_path","path"]){let e=n[t];if(typeof e=="string"&&e.trim())return e.trim()}}function xn(n,t,e){let o=resolve(n,t),r=isAbsolute(e)?resolve(e):resolve(n,e);return o===r}function kn(n){return n.startsWith("mcp__")?n.split("__").at(-1)??n:n}function Sn(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{y(n);}catch{}}var Tn=new Set(["Write","Edit","NotebookEdit"]);function ze(n){if(!Tn.has(n.toolName)||$n(n.toolResponse))return null;let t=jn(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=Cn({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")}`,g=Date.now();if(!l){let D=`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:D,createdAt:g,updatedAt:g,resolvedAt:g}),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:D},dedupeKey:`${u}:unavailable`,producer:"devflow-verification-scheduler"});continue}let h={...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:g,updatedAt:g});let b=e.enqueueWork({idempotencyKey:u,kind:"verification.policy",projectRoot:n.projectRoot,sessionId:n.sessionId,payload:h,maxAttempts:2,nextAttemptAt:g});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 Cn(n){let t=Pn(n.projectRoot),e=qn(n.projectRoot),o=t?.scripts??{},r={...t?.dependencies,...t?.devDependencies},i=null;if(n.kind==="formatter"&&(r.prettier||Ln(n.projectRoot)))i=J(e,"prettier",[n.mode==="write"?"--write":"--check",n.targetFile],6e4);else if(n.kind==="typecheck"){let s=le(o,["typecheck","type-check","check:types"]);s?i=de(e,s,12e4):r.typescript&&existsSync$1(join(n.projectRoot,"tsconfig.json"))&&(i=J(e,"tsc",["--noEmit","--pretty","false"],12e4));}else if(n.kind==="lint"){let s=le(o,["lint"]);s&&(i=de(e,s,12e4));}else if(n.kind==="test"){let s=Mn(n.projectRoot,n.targetFile);s&&r.vitest?i=J(e,"vitest",["run",s],12e4):s&&(r.jest||r["@jest/core"])&&(i=J(e,"jest",["--runTestsByPath",s],12e4));}else if(n.kind==="build"){let s=le(o,["build"]);s&&(i=de(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(Nn).join(" "),required:n.required,targetFile:n.targetFile,contextReceipt:n.contextReceipt}:null}function de(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 J(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 jn(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 Fn(n,o)?relative(n,o).split(sep).join("/"):null}function Fn(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 $n(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 Pn(n){try{return JSON.parse(readFileSync$1(join(n,"package.json"),"utf8"))}catch{return null}}function qn(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 Ln(n){return [".prettierrc",".prettierrc.json",".prettierrc.js",".prettierrc.cjs","prettier.config.js","prettier.config.cjs"].some(t=>existsSync$1(join(n,t)))}function le(n,t){return t.find(e=>typeof n[e]=="string"&&n[e].trim())??null}function Mn(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 Nn(n){return /^[A-Za-z0-9_./:@=-]+$/u.test(n)?n:JSON.stringify(n)}function Je(n){if(!n.toolUseId)return null;let t=Yn(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:Wn(t.path),completedAt:e,error:n.error?.slice(0,500)},r=Gn(n.projectRoot);return mkdirSync$1(dirname(r),{recursive:true}),appendFileSync(r,`${JSON.stringify(o)}
6
- `,{encoding:"utf8",mode:384}),y({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 Wn(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(A(n),"file-state")}function Ge(n){return join(We(n),"pending.json")}function Gn(n){return join(We(n),"observations.jsonl")}function Zn(n){try{return JSON.parse(readFileSync$1(Ge(n),"utf8"))}catch{return {}}}function Yn(n,t){let e=Ge(n),o=Zn(n),r=o[t];if(r)return delete o[t],Qn(e,JSON.stringify(o)),r}function Qn(n,t){let e=`${n}.${process.pid}.${Date.now()}.tmp`;writeFileSync$1(e,t,{encoding:"utf8",mode:384}),renameSync$1(e,n);}var eo={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 to(n){return no(n)}function no(n){let t=openGlobalDevFlowDatabase(void 0,{busyTimeoutMs:250});try{let e=so(t,n.artifact);if(ao(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?oo(n.artifact,o):"context_ready";e.toState==="intent_bound"&&(e=I(t,e,n,s,i?"task_context_not_required":s==="context_ready"?"canonical_context_receipt_ready":"canonical_context_receipt_degraded"));let a=o?ro(n.artifact,o):"action_not_required";if((e.toState==="context_ready"||e.toState==="context_degraded")&&(a==="action_not_required"?e=I(t,e,n,"action_not_required","task_action_not_required"):e=I(t,e,n,"action_required","canonical_action_obligation_present")),e.toState==="action_required"){if(a==="action_required")return e;if(a==="action_failed")return I(t,e,n,"action_failed","canonical_action_attempt_failed");a==="action_degraded"?e=I(t,e,n,"action_degraded","canonical_action_unavailable_or_degraded"):a==="action_satisfied"&&(e=I(t,e,n,"action_satisfied","canonical_action_succeeded"));}if(e.toState==="action_failed")if(a==="action_satisfied")e=I(t,e,n,"action_satisfied","canonical_action_retry_succeeded");else if(a==="action_degraded")e=I(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=I(t,e,n,n.memoryStatus==="pending"?"memory_quarantined":"memory_decided",n.memoryStatus==="pending"?n.reason:`canonical_memory_${n.memoryStatus}`)),e.toState==="memory_decided"?I(t,e,n,c?"closed_with_degradation":"closed",n.reason):e.toState==="memory_quarantined"?I(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 Ye(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:to({artifact:r,memoryStatus:i.status,memoryReceiptId:i.receiptId,reason:n.reason})}finally{t.close();}}function oo(n,t){return n.intent==="memory"||n.intent==="knowledge"||(t.selectedFiles?.length??0)>0?"context_ready":"context_degraded"}function ro(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||io(n)?"action_required":"action_not_required"}function io(n){return ["create","modify","debug","test","format"].includes(n.action)||["feature","refactor","performance"].includes(n.intent)}function so(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 I(n,t,e,o,r){if(!eo[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 y({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 ao(n){return n==="closed"||n==="closed_with_degradation"||n==="closed_with_retry_work"}function Qe(n){let t=n.hook==="post_tool_use_failure"||!!n.error?.trim()||co(n.response),e=t?"not_consumed":n.hook==="post_tool_use"?"consumed":"unknown",o=t?lo(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 co(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 lo(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;function ot(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 bo(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 rt(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=Io(n.projectRoot),r=ot(e.header)??ot(e.question);if(!r){let f=await o.pendingDecisionForSession(n.sessionId);if(!f||"ambiguous"in f||f.decision.kind!=="artifact_approval")return {handled:false};r=f.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(f=>({label:typeof f.label=="string"?x(f.label):"",description:typeof f.description=="string"?x(f.description):""})):[],c=createHash$1("sha256").update(JSON.stringify({decisionId:r,question:x(String(e.question??"")),options:a})).digest("hex"),l=bo(n.toolResponse),d=l?x(l):void 0;if(!d)return (typeof o.recordDecisionPresentation=="function"?await o.recordDecisionPresentation({caseId:i,decisionId:r,caseVersion:s.caseVersion,presentationHash:c,sourceTurnId:n.sourceTurnId??n.toolUseId}):true)?{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.`}:{handled:true,resolved:false,message:`DevFlow interactive decision ${r} was already presented. Reuse the existing answer or refresh delivery_status after resolution.`};if(e.multiSelect===true)return {handled:true,resolved:false,message:`DevFlow interactive decision rejected: ${r} must be a single selection.`};let u;if(s.options.length>0){let f=s.options.map(v=>({label:x(v.label),description:v.description?x(v.description):""}));if(a.length!==f.length||a.some((v,W)=>v.label!==f[W]?.label||v.description!==f[W]?.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 O=s.options.find(v=>x(v.label)===d);if(!O)return {handled:true,resolved:false,message:`DevFlow interactive decision rejected: answer does not match a pending option for ${r}.`};s.kind==="artifact_approval"?u=O.id==="approve"?`/devflow:approve ${r}`:`/devflow:reject ${r} -- ${d}`:u=`/devflow:decide ${r} ${O.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.`};u=`/devflow:decide ${r} -- ${d}`;}if(!(typeof o.recordDecisionPresentation=="function"?await o.recordDecisionPresentation({caseId:i,decisionId:r,caseVersion:s.caseVersion,presentationHash:c,sourceTurnId:n.sourceTurnId??n.toolUseId}):true))return {handled:true,resolved:false,message:`DevFlow interactive decision ${r} was already presented. Reuse the existing answer or refresh delivery_status after resolution.`};let h=process.env.DEVFLOW_HOST_ACTOR_ID?.trim()||`user:${process.env.USER?.trim()||"local"}`,b=et(),D=tt({rawUserEvent:u,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:h,targetDecisionHash:s.targetDecisionHash,eventSequence:Date.now(),nonce:randomUUID$1(),privateKey:b.privateKey,allowedOptionIds:s.options.map(f=>f.id)});try{return await o.resolveTrustedDecision({evidence:D,publicKey:b.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(f){return {handled:true,resolved:false,message:`DevFlow interactive decision rejected: ${f instanceof Error?f.message:String(f)}`}}}function Io(n){let t=nt.get(n);if(t)return t;let e=createTrustedDeliveryFacade(n);return nt.set(n,e),e}function it(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 Do(n,t,e,o){try{let r=join$1(A(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 st(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+=st(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=ee(),r=t.tool_input||{},i=t.tool_response||{},s=t.session_id?.trim()||null,a=new E(o);if(s&&a.registerSession(s),s){let p=await rt({projectRoot:o,sessionId:s,sourceTurnId:a.get(s)?.activeTurnId,toolName:e,toolInput:r,toolResponse:i,toolUseId:t.tool_use_id});if(p.handled)return p.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 p=typeof r=="object"&&r.skill?r.skill:"",m=Le(p);s&&m&&(a.startExecution(s,m,qe(m)),ie(o,{lastMcpCall:Math.floor(Date.now()/1e3),bypassCount:0}));}let d=s?a.get(s):null;if(e.startsWith("mcp__")){let p=new N(o,s??void 0,d?.executionId??s??void 0);p.recordMcpCall();let m=it(typeof i=="object"&&i!==null?i:null),_=l??e,Y=p.getContextReceipt?.()?.canonicalAction?.tool===_;if((p.recordDomainActionOutcome(_,m?To(m):"succeeded",m,t.tool_use_id)||Y)&&s){let T=Qe({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:T.consumption==="consumed"?"action.succeeded":"action.failed",payload:{receiptId:T.receiptId,reasonCode:T.reasonCode,consumption:T.consumption,tool:_},dedupeKey:`${T.receiptId}:${T.consumption}`,producer:"devflow-post-tool-use"});try{Ye({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?Do(o,s,e,t.tool_use_id):null,g=s&&t.tool_use_id&&!u?(()=>{try{let p=openGlobalDevFlowDatabase();try{return p.getToolCallEventByToolUseId(s,t.tool_use_id)}finally{p.close();}}catch{return null}})():null,h=u??g,b=typeof i=="object"&&i!==null?i:null,D=JSON.stringify(i),f=Buffer.byteLength(D,"utf8"),O=st(i),v=it(b);if(s&&Je({projectRoot:o,sessionId:s,toolUseId:t.tool_use_id,success:!v,error:v}),d?.executionId!==void 0||l!==void 0||e==="Skill"){let p=getLogWriter(o),m=d?.executionId??`auto-${s??Date.now()}`;p.toolCall({tool:e,runId:m,stepId:`step-${m}`,input:r,output:i,duration:h?Math.max(0,Date.now()-h.timestamp):0,success:!b?.error,resultCount:O,resultSizeBytes:f,error:b?.error});}if(h&&s){let p=typeof i=="string"?i:JSON.stringify(i),m=p.length>5e3?{_truncated:true,_originalSize:p.length,text:p.slice(0,5e3)}:i,_=v,Y=_?classifyWorkflowFailure({stepId:e,toolName:e,output:i,error:new Error(_),errorStack:_}).category:void 0;await new V().completeEvent({eventId:h.eventId,sessionId:s,output:m,error:_,failureCategory:Y,duration:h?Math.max(0,Date.now()-h.timestamp):0,completedAt:Date.now()});}let me=typeof r=="object"&&r.command?r.command:"",G=b?.exitCode,at=b?.stderr,ct=/^\s*(ls|cat|pwd|cd|echo|head|tail|wc|which|whoami|date|env|printenv|id|hostname|uname)\b/,k,S,Z=true;if(e.startsWith("mcp__"))k="mcp_call",S={mcpTool:l??e,query:typeof r=="object"&&r.query?r.query:null,resultCount:O,resultSizeBytes:f};else if(e==="Read"||e==="Write"||e==="Edit")k=e==="Read"?"file_read":"file_write",S={filePath:typeof r=="object"&&r.file_path?r.file_path:null,fileContentSize:f};else if(e==="Bash"){let p=ct.test(me),m=G!==void 0&&G!==0;Z=!p||m,k=m?"bash_error":"bash_command",S={command:me||e,exitCode:G??null,stderr:at??null};}else e==="Agent"?(k="subagent",S={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"?(k=e==="WebSearch"?"web_search":"web_fetch",S={query:typeof r=="object"&&r.query?String(r.query).slice(0,200):null}):(Z=false,k="tool_use",S={});if(Z){let p={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:k,payload:{...S,durationMs:h?Math.max(0,Date.now()-h.timestamp):0},createdAt:Date.now()};s&&L(`/api/memory/session-events?rootPath=${encodeURIComponent(o)}`,p);}let dt=Ue({toolName:e,toolResponse:i,sessionId:s,toolUseId:t.tool_use_id,runtimeStore:a}),lt=s?ze({projectRoot:o,sessionId:s,executionId:d?.executionId,toolName:e,toolInput:r,toolResponse:i,toolUseId:t.tool_use_id}):null;return [dt,lt].filter(p=>!!p).join(`
6
+ `,{encoding:"utf8",mode:384}),y({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 Wn(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(A(n),"file-state")}function Ge(n){return join(We(n),"pending.json")}function Gn(n){return join(We(n),"observations.jsonl")}function Zn(n){try{return JSON.parse(readFileSync$1(Ge(n),"utf8"))}catch{return {}}}function Yn(n,t){let e=Ge(n),o=Zn(n),r=o[t];if(r)return delete o[t],Qn(e,JSON.stringify(o)),r}function Qn(n,t){let e=`${n}.${process.pid}.${Date.now()}.tmp`;writeFileSync$1(e,t,{encoding:"utf8",mode:384}),renameSync$1(e,n);}var eo={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 to(n){return no(n)}function no(n){let t=openGlobalDevFlowDatabase(void 0,{busyTimeoutMs:250});try{let e=so(t,n.artifact);if(ao(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?oo(n.artifact,o):"context_ready";e.toState==="intent_bound"&&(e=I(t,e,n,s,i?"task_context_not_required":s==="context_ready"?"canonical_context_receipt_ready":"canonical_context_receipt_degraded"));let a=o?ro(n.artifact,o):"action_not_required";if((e.toState==="context_ready"||e.toState==="context_degraded")&&(a==="action_not_required"?e=I(t,e,n,"action_not_required","task_action_not_required"):e=I(t,e,n,"action_required","canonical_action_obligation_present")),e.toState==="action_required"){if(a==="action_required")return e;if(a==="action_failed")return I(t,e,n,"action_failed","canonical_action_attempt_failed");a==="action_degraded"?e=I(t,e,n,"action_degraded","canonical_action_unavailable_or_degraded"):a==="action_satisfied"&&(e=I(t,e,n,"action_satisfied","canonical_action_succeeded"));}if(e.toState==="action_failed")if(a==="action_satisfied")e=I(t,e,n,"action_satisfied","canonical_action_retry_succeeded");else if(a==="action_degraded")e=I(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=I(t,e,n,n.memoryStatus==="pending"?"memory_quarantined":"memory_decided",n.memoryStatus==="pending"?n.reason:`canonical_memory_${n.memoryStatus}`)),e.toState==="memory_decided"?I(t,e,n,c?"closed_with_degradation":"closed",n.reason):e.toState==="memory_quarantined"?I(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 Ye(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:to({artifact:r,memoryStatus:i.status,memoryReceiptId:i.receiptId,reason:n.reason})}finally{t.close();}}function oo(n,t){return n.intent==="memory"||n.intent==="knowledge"||(t.selectedFiles?.length??0)>0?"context_ready":"context_degraded"}function ro(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||io(n)?"action_required":"action_not_required"}function io(n){return ["create","modify","debug","test","format"].includes(n.action)||["feature","refactor","performance"].includes(n.intent)}function so(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 I(n,t,e,o,r){if(!eo[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 y({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 ao(n){return n==="closed"||n==="closed_with_degradation"||n==="closed_with_retry_work"}function Qe(n){let t=n.hook==="post_tool_use_failure"||!!n.error?.trim()||co(n.response),e=t?"not_consumed":n.hook==="post_tool_use"?"consumed":"unknown",o=t?lo(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 co(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 lo(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;function ot(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 bo(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 rt(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=Io(n.projectRoot),r=ot(e.header)??ot(e.question);if(!r){let f=await o.pendingDecisionForSession(n.sessionId);if(!f||"ambiguous"in f||!["artifact_approval","trusted_action"].includes(f.decision.kind))return {handled:false};r=f.decision.id;}let i=r.split(":")[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(f=>({label:typeof f.label=="string"?x(f.label):"",description:typeof f.description=="string"?x(f.description):""})):[],c=createHash$1("sha256").update(JSON.stringify({decisionId:r,question:x(String(e.question??"")),options:a})).digest("hex"),l=bo(n.toolResponse),d=l?x(l):void 0;if(!d)return (typeof o.recordDecisionPresentation=="function"?await o.recordDecisionPresentation({caseId:i,decisionId:r,caseVersion:s.caseVersion,presentationHash:c,sourceTurnId:n.sourceTurnId??n.toolUseId}):true)?{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.`}:{handled:true,resolved:false,message:`DevFlow interactive decision ${r} was already presented. Reuse the existing answer or refresh delivery_status after resolution.`};if(e.multiSelect===true)return {handled:true,resolved:false,message:`DevFlow interactive decision rejected: ${r} must be a single selection.`};let u;if(s.options.length>0){let f=s.options.map(v=>({label:x(v.label),description:v.description?x(v.description):""}));if(a.length!==f.length||a.some((v,W)=>v.label!==f[W]?.label||v.description!==f[W]?.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 O=s.options.find(v=>x(v.label)===d);if(!O)return {handled:true,resolved:false,message:`DevFlow interactive decision rejected: answer does not match a pending option for ${r}.`};s.kind==="artifact_approval"?u=O.id==="approve"?`/devflow:approve ${r}`:`/devflow:reject ${r} -- ${d}`:u=`/devflow:decide ${r} ${O.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.`};u=`/devflow:decide ${r} -- ${d}`;}if(!(typeof o.recordDecisionPresentation=="function"?await o.recordDecisionPresentation({caseId:i,decisionId:r,caseVersion:s.caseVersion,presentationHash:c,sourceTurnId:n.sourceTurnId??n.toolUseId}):true))return {handled:true,resolved:false,message:`DevFlow interactive decision ${r} was already presented. Reuse the existing answer or refresh delivery_status after resolution.`};let h=process.env.DEVFLOW_HOST_ACTOR_ID?.trim()||`user:${process.env.USER?.trim()||"local"}`,b=et(),D=tt({rawUserEvent:u,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:h,targetDecisionHash:s.targetDecisionHash,eventSequence:Date.now(),nonce:randomUUID$1(),privateKey:b.privateKey,allowedOptionIds:s.options.map(f=>f.id)});try{return await o.resolveTrustedDecision({evidence:D,publicKey:b.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(f){return {handled:true,resolved:false,message:`DevFlow interactive decision rejected: ${f instanceof Error?f.message:String(f)}`}}}function Io(n){let t=nt.get(n);if(t)return t;let e=createTrustedDeliveryFacade(n);return nt.set(n,e),e}function it(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 Do(n,t,e,o){try{let r=join$1(A(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 st(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+=st(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=ee(),r=t.tool_input||{},i=t.tool_response||{},s=t.session_id?.trim()||null,a=new E(o);if(s&&a.registerSession(s),s){let p=await rt({projectRoot:o,sessionId:s,sourceTurnId:a.get(s)?.activeTurnId,toolName:e,toolInput:r,toolResponse:i,toolUseId:t.tool_use_id});if(p.handled)return p.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 p=typeof r=="object"&&r.skill?r.skill:"",m=Le(p);s&&m&&(a.startExecution(s,m,qe(m)),ie(o,{lastMcpCall:Math.floor(Date.now()/1e3),bypassCount:0}));}let d=s?a.get(s):null;if(e.startsWith("mcp__")){let p=new N(o,s??void 0,d?.executionId??s??void 0);p.recordMcpCall();let m=it(typeof i=="object"&&i!==null?i:null),_=l??e,Y=p.getContextReceipt?.()?.canonicalAction?.tool===_;if((p.recordDomainActionOutcome(_,m?To(m):"succeeded",m,t.tool_use_id)||Y)&&s){let T=Qe({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:T.consumption==="consumed"?"action.succeeded":"action.failed",payload:{receiptId:T.receiptId,reasonCode:T.reasonCode,consumption:T.consumption,tool:_},dedupeKey:`${T.receiptId}:${T.consumption}`,producer:"devflow-post-tool-use"});try{Ye({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?Do(o,s,e,t.tool_use_id):null,g=s&&t.tool_use_id&&!u?(()=>{try{let p=openGlobalDevFlowDatabase();try{return p.getToolCallEventByToolUseId(s,t.tool_use_id)}finally{p.close();}}catch{return null}})():null,h=u??g,b=typeof i=="object"&&i!==null?i:null,D=JSON.stringify(i),f=Buffer.byteLength(D,"utf8"),O=st(i),v=it(b);if(s&&Je({projectRoot:o,sessionId:s,toolUseId:t.tool_use_id,success:!v,error:v}),d?.executionId!==void 0||l!==void 0||e==="Skill"){let p=getLogWriter(o),m=d?.executionId??`auto-${s??Date.now()}`;p.toolCall({tool:e,runId:m,stepId:`step-${m}`,input:r,output:i,duration:h?Math.max(0,Date.now()-h.timestamp):0,success:!b?.error,resultCount:O,resultSizeBytes:f,error:b?.error});}if(h&&s){let p=typeof i=="string"?i:JSON.stringify(i),m=p.length>5e3?{_truncated:true,_originalSize:p.length,text:p.slice(0,5e3)}:i,_=v,Y=_?classifyWorkflowFailure({stepId:e,toolName:e,output:i,error:new Error(_),errorStack:_}).category:void 0;await new V().completeEvent({eventId:h.eventId,sessionId:s,output:m,error:_,failureCategory:Y,duration:h?Math.max(0,Date.now()-h.timestamp):0,completedAt:Date.now()});}let me=typeof r=="object"&&r.command?r.command:"",G=b?.exitCode,at=b?.stderr,ct=/^\s*(ls|cat|pwd|cd|echo|head|tail|wc|which|whoami|date|env|printenv|id|hostname|uname)\b/,k,S,Z=true;if(e.startsWith("mcp__"))k="mcp_call",S={mcpTool:l??e,query:typeof r=="object"&&r.query?r.query:null,resultCount:O,resultSizeBytes:f};else if(e==="Read"||e==="Write"||e==="Edit")k=e==="Read"?"file_read":"file_write",S={filePath:typeof r=="object"&&r.file_path?r.file_path:null,fileContentSize:f};else if(e==="Bash"){let p=ct.test(me),m=G!==void 0&&G!==0;Z=!p||m,k=m?"bash_error":"bash_command",S={command:me||e,exitCode:G??null,stderr:at??null};}else e==="Agent"?(k="subagent",S={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"?(k=e==="WebSearch"?"web_search":"web_fetch",S={query:typeof r=="object"&&r.query?String(r.query).slice(0,200):null}):(Z=false,k="tool_use",S={});if(Z){let p={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:k,payload:{...S,durationMs:h?Math.max(0,Date.now()-h.timestamp):0},createdAt:Date.now()};s&&L(`/api/memory/session-events?rootPath=${encodeURIComponent(o)}`,p);}let dt=Ue({toolName:e,toolResponse:i,sessionId:s,toolUseId:t.tool_use_id,runtimeStore:a}),lt=s?ze({projectRoot:o,sessionId:s,executionId:d?.executionId,toolName:e,toolInput:r,toolResponse:i,toolUseId:t.tool_use_id}):null;return [dt,lt].filter(p=>!!p).join(`
7
7
 
8
8
  `)||null}function To(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};
@@ -6,7 +6,7 @@ ${n.join(`
6
6
  `)}`}function kn(t){let e=t.now??Date.now();if(In(t.configPath)===false)return "";let n=bn(t.projectRoot,t.daemonResponse??"",e),r=n?{snapshot:n,source:"daemon"}:vn(t.projectRoot,{...t.cacheOptions,now:e}),{snapshot:o}=r;if(o.status==="disabled")return `## Project memory
7
7
  DevFlow memory snapshot=pending; source=${r.source}; reason=previous_snapshot_disabled. Memory availability is not yet known; do not conclude that the project has no memories.`;let i=new Date(o.generatedAt).toISOString(),s=o.degradation?.reason?`; reason=${o.degradation.reason}`:"",a=`DevFlow memory snapshot=${o.status}; source=${r.source}; generatedAt=${i}${s}.`,l=wn(o.conflicts);return o.markdown?[o.markdown,l,a].filter(Boolean).join(`
8
8
  `):["## Project memory",l,`${a} Memory availability is not yet known; do not conclude that the project has no memories.`].filter(Boolean).join(`
9
- `)}if(process.env.DEVFLOW_MEMORY_SNAPSHOT_CLI==="1"){let[,,t,e,n]=process.argv;t!=="session-start"||!e?process.exitCode=2:process.stdout.write(kn({projectRoot:e,configPath:n,daemonResponse:process.env.DEVFLOW_MEMORY_RESPONSE}));}function b(t){let{projectRoot:e,...n}=t;try{return new q(e).dispatchBoundary(n).snapshot??null}catch(r){return f({event:"hook.runtime.degraded",identity:{projectRoot:e,sessionId:t.sessionId,...t.turnId?{turnId:t.turnId}:{},...t.requestId?{requestId:t.requestId}:{},...t.executionId?{executionId:t.executionId}:{}},level:"error",timestamp:Date.now(),data:{stage:t.kind,reason:r instanceof Error?r.message:String(r),tool:t.producer}}),null}}var q=class{constructor(e){this.projectRoot=e;}dispatchBoundary(e){let n=Dn(e.kind,e.payload??{});if(!n)return {handled:false};let r=openGlobalDevFlowDatabase(void 0,{busyTimeoutMs:250});try{let o=xn(r,{projectRoot:this.projectRoot,sessionId:e.sessionId,...e.turnId?{turnId:e.turnId}:{},...e.requestId?{requestId:e.requestId}:{},...e.executionId?{executionId:e.executionId}:{}});return o?{handled:!0,snapshot:new TaskKernel(new TaskEventStore(r),new SemanticRuntimeEventProjector).dispatch({definition:o.definition,kind:n.kind,payload:n.payload,idempotencyKey:`host:${o.definition.definitionHash}:${e.dedupeKey}`,producer:e.producer}).snapshot}:{handled:!1}}finally{r.close();}}};function xn(t,e){let n=e.executionId?t.getActiveContextReceipt(e.projectRoot,e.sessionId,e.executionId):null,r=e.turnId??n?.canonicalAction?.binding.turnId,o=e.requestId??n?.requestId;if(!r&&!o)return null;let i=t.listLatestTaskIntentArtifacts(e.projectRoot,e.sessionId).find(l=>r?l.turnId===r:l.requestId===o);if(!i)return null;let s=t.getTaskAggregateSnapshot(e.projectRoot,e.sessionId,i.turnId,i.version);if(!s)return null;let a=t.getTaskDefinitionV2(s.taskDefinitionHash);return !a||a.revision!==i.version?null:{definition:a,snapshot:s}}function Dn(t,e){switch(t){case "action.lease.issued":return {kind:"action_lease_issued",payload:e};case "action.succeeded":return {kind:"action_completed",payload:e};case "action.failed":return {kind:"action_failed",payload:e};case "verification.succeeded":return {kind:"verification_completed",payload:e};case "verification.failed":return {kind:"verification_failed",payload:e};case "memory.committed":return {kind:"memory_episode_persisted",payload:e};case "memory.skipped":return {kind:"memory_decision_completed",payload:e};case "memory.pending":return {kind:"memory_extraction_queued",payload:e};case "memory.failed":return {kind:"memory_extraction_failed",payload:e};case "durable_work.owned":return {kind:"durable_work_leased",payload:{...e,fencingToken:Number.isSafeInteger(e.fencingToken)?e.fencingToken:0}};case "durable_work.completed":return {kind:"durable_work_completed",payload:e};case "durable_work.dead_lettered":return {kind:"durable_work_dead_lettered",payload:e};default:return null}}var Mn=/^(?:ok(?:ay)?|yes|no|thanks?|thank you|continue|好的?|可以|行|是|否|谢谢|继续|收到|明白了?)[.!。!\s]*$/iu,On=/(?:记住|记下|保存|持久化|跨会话|以后|始终|永远|统一使用|项目约定|团队约定|偏好|决定采用|保留可复用|提炼结论|沉淀|记录(?:下来|为|成)?(?:架构|规则|约定|知识|结论))|\b(?:remember|memorize|persist|across sessions|from now on|always|project convention|team convention|preference|we use|adopt|retain reusable|distill)\b/iu,jn=/(?:分析|审查|检查|评估|性能|生成|创建|新建|添加|编写|实现|开发|设计|撰写|总结|修改|重构|修复|调试|解释|查看)|\b(?:analy[sz]e|review|inspect|audit|performance|generate|create|add|build|implement|develop|design|write|summarize|modify|refactor|fix|debug|explain)\b/iu,$n=/(?:召回|查询|检索|查找|定位|询问|什么|如何|是否|哪里|哪个)|\b(?:recall|query|search|find|locate|ask|what|how|whether|where|which)\b/iu;function Pn(t){let e=t.trim();return e.length>0&&!Mn.test(e)}function Fn(t,e){if(!e.trim())return false;let n=join(t,".devflow","delivery-line","state.db");if(!existsSync$1(n))return false;let r;try{return r=new DatabaseSync(n,{readOnly:!0,timeout:250}),r.prepare("SELECT payload FROM delivery_cases").all().some(i=>{try{let s=JSON.parse(i.payload);return s.sessionId===e&&!["delivered","cancelled","rejected"].includes(String(s.stage??""))}catch{return !1}})}catch{return false}finally{r?.close();}}function Nn(t){let e=t.normalize("NFKC").trim(),n=$n.test(e);return e.length>=4&&(jn.test(e)||n)&&(!On.test(e)||n)&&k(e)===null}function Hn(t,e,n=Date.now()){let r=createHash$1("sha256").update(e.trim()).digest("hex"),o=createHash$1("sha256").update(`${t}\0${n}\0${r}`).digest("hex").slice(0,24);return {turnId:`turn:${o}`,eventId:`memory-turn:${o}`,promptHash:r,createdAt:n}}function Me(t,e,n=[]){return `memory-receipt:${createHash$1("sha256").update(`${t}\0${e}\0${[...n].sort().join("\0")}`).digest("hex").slice(0,24)}`}function Ln(t){return `DevFlow memory decision required for ${t.turnId}. Before the final response, semantically decide whether this turn contains durable project knowledge. Call ${projectClaudeToolName("memory_commit_turn")} with evidence-bound candidates, or ${projectClaudeToolName("memory_skip_turn")} with a concrete reason. Do not claim memory success without a canonical receipt. For candidates, copy exact evidenceSpans from this user prompt, preserve package names, flags, versions, paths, and identifiers, and provide subject, predicate, value, polarity, and entities when known. To replace or retire an existing fact, provide operation=supersede or operation=retire plus referencedFactIds from the canonical memory receipt; aliases and entity names are not fact identity. Do not save assistant echoes, task narration, retries, or unverified guesses. Express a change from an old choice as the new durable value. If the decision tool remains unavailable, explicitly state that the memory was not saved.`}function U(t){let e=t.memoryIds.length>0?t.memoryIds.join(","):"none",n=t.status==="committed"?"accepted":t.status,r=t.status==="committed"?"; indexStatus=pending":"",o=t.memoryIds.some(a=>a.startsWith("raw-memory:")),i=t.status==="committed"&&t.source==="explicit_intent"&&!o?"; memoryOnlyCompleted=true; skipProjectContext=true; hostRefinementRequired=true":t.status==="committed"&&t.source==="explicit_intent"?"; asyncReadiness=queued; hostRefinementRequired=true":"",s=t.status==="committed"&&t.source==="explicit_intent"?` The deterministic explicit-memory save is complete and remains authoritative if refinement fails. Before the final response, call ${projectClaudeToolName("memory_commit_turn")} once with turnId=${t.turnId} and semantic candidates. Split every distinct reusable fact into a durable_memory candidate, classify instructions that apply only to this turn as turn_constraint, and include evidenceSpans copied verbatim from the user prompt for every candidate. Preserve exact flags, package names, versions, paths, and identifiers. Keep narrative and value in the user prompt language; do not translate evidence into a different surface form. The tool refines the existing receipt idempotently; it must not create native Claude memory. If refinement is unavailable, return the existing canonical receipt without claiming refinement.`:"";return `DevFlow canonical memory receipt: status=${n}; receiptId=${t.receiptId??"missing"}; turnId=${t.turnId}; memoryIds=${e}; source=${t.source??"unknown"}${r}${i}.`+s}function Oe(t){if(!Pn(t.prompt))return null;let e=openGlobalDevFlowDatabase(void 0,{busyTimeoutMs:50});try{let n=t.prompt.trim().slice(0,4e3),r=createHash$1("sha256").update(n).digest("hex"),o=e.listMemoryTurns(t.projectRoot,t.sessionId,5).find(d=>d.promptHash===r&&Date.now()-d.createdAt<1e4),i=o?{turnId:o.turnId,eventId:o.eventId,promptHash:o.promptHash,createdAt:o.createdAt}:t.identity??Hn(t.sessionId,n),s=o??e.beginMemoryTurn({...i,projectRoot:t.projectRoot,sessionId:t.sessionId});if(s.status!=="pending")return {turn:s,additionalContext:U(s),skipSkillRouting:s.source==="explicit_intent"};let l=(t.activation?.semantic??"degraded_structural")==="degraded_structural"?k(n)??void 0:void 0,m=Fn(t.projectRoot,t.sessionId);if(!l&&!m&&Nn(n)){let d=Me(s.turnId,"skipped"),p=e.skipMemoryTurn({turnId:s.turnId,receiptId:d,source:"automatic_transient_skip",reason:"high_confidence_transient_task"});return b({projectRoot:t.projectRoot,sessionId:t.sessionId,turnId:s.turnId,kind:"memory.skipped",payload:{receiptId:d,reasonCode:"high_confidence_transient_task"},dedupeKey:d,producer:"devflow-memory-turn"}),f({event:"memory.semantic.decided",identity:{projectRoot:t.projectRoot,sessionId:t.sessionId,turnId:s.turnId},level:"info",timestamp:Date.now(),data:{status:"semantic_empty",operation:"none",reason:"high_confidence_transient_task"}}),{turn:p,additionalContext:U(p),skipSkillRouting:!1}}let c=l?"commit_explicit":"capture_prompt",u=e.enqueueWork({idempotencyKey:`memory-turn:${c}:${s.turnId}`,kind:l?"memory.explicit_commit":"memory.turn_capture",projectRoot:t.projectRoot,sessionId:t.sessionId,turnId:s.turnId,payload:{operation:c,turnId:s.turnId,eventId:s.eventId,sessionId:t.sessionId,prompt:n,explicitContent:l,createdAt:s.createdAt}});if(l){let d=`raw-memory:${createHash$1("sha256").update(`${t.projectRoot}\0${i.turnId}\0${l}`).digest("hex").slice(0,24)}`,p=Me(s.turnId,"committed",[d]),g=e.commitMemoryTurn({turnId:s.turnId,receiptId:p,memoryIds:[d],source:"explicit_intent",reason:"explicit_raw_queued",decidedAt:Date.now()});return b({projectRoot:t.projectRoot,sessionId:t.sessionId,turnId:s.turnId,kind:"durable_work.owned",payload:{workId:u.id,obligation:"memory"},dedupeKey:`${u.id}:owned`,producer:"devflow-memory-turn"}),b({projectRoot:t.projectRoot,sessionId:t.sessionId,turnId:s.turnId,kind:"memory.committed",payload:{receiptId:p,reasonCode:"explicit_raw_queued"},dedupeKey:p,producer:"devflow-memory-turn"}),f({event:"memory.write.completed",identity:{projectRoot:t.projectRoot,sessionId:t.sessionId,turnId:s.turnId,actionReceipt:p},level:"info",timestamp:Date.now(),data:{stage:"explicit_fast_ack",durable:!0,rawMemoryId:d,receiptLatencyMs:Date.now()-i.createdAt,asyncReadiness:"queued"}}),{turn:g,explicitContent:l,additionalContext:U(g),skipSkillRouting:!0}}return b({projectRoot:t.projectRoot,sessionId:t.sessionId,turnId:s.turnId,kind:"memory.pending",payload:{reasonCode:"semantic_decision_queued"},dedupeKey:`${s.turnId}:pending`,producer:"devflow-memory-turn"}),b({projectRoot:t.projectRoot,sessionId:t.sessionId,turnId:s.turnId,kind:"durable_work.owned",payload:{workId:u.id,obligation:"memory"},dedupeKey:`${u.id}:owned`,producer:"devflow-memory-turn"}),{turn:s,explicitContent:l,additionalContext:Ln(s),skipSkillRouting:!1}}finally{e.close();}}function $e(t,e){let n=Vn(t);mkdirSync$1(n,{recursive:true,mode:448});let r=`memory-turn-spool-${Date.now()}-${process.pid}-${randomUUID()}`,o=join(n,`${r}.json`),i=`${o}.tmp`;return writeFileSync$1(i,JSON.stringify({...e,prompt:e.prompt.trim().slice(0,4e3)}),{mode:384}),renameSync$1(i,o),r}function Vn(t){return join(w(t),"memory-turn-pending")}function Pe(t){let e=Date.now();try{let n=openGlobalDevFlowDatabase(void 0,{busyTimeoutMs:100});try{let r=`context-prefetch:${createHash$1("sha256").update(`${t.projectRoot}\0${t.sessionId}\0${t.executionId}\0${Wn(t.prompt)}\0${t.profileFingerprint}`).digest("hex")}`,o=n.enqueueWork({idempotencyKey:r,kind:"context.prefetch",projectRoot:t.projectRoot,sessionId:t.sessionId,payload:t,maxAttempts:3});return h("prefetch_queue",{projectRoot:t.projectRoot,skillName:t.skillName,accepted:!0,workState:o.state,latencyMs:Date.now()-e}),{accepted:!0,workItemId:o.id}}finally{n.close();}}catch(n){let r=n instanceof Error?n.message:String(n);return h("prefetch_queue",{projectRoot:t.projectRoot,skillName:t.skillName,accepted:false,reason:r,latencyMs:Date.now()-e}),{accepted:false,reason:r}}}function Wn(t){return t.trim().toLowerCase().replace(/\s+/g," ").slice(0,4e3)}async function Le(t){let e=Date.now(),n=ar(t.projectRoot),r=claudeCodeRuntimeAdapter.normalizePrompt(t.hostEvent??{session_id:t.sessionId,prompt:t.prompt},{projectRoot:n}),o=semanticTextHash(He(r.rawPrompt)),i=openGlobalDevFlowDatabase(void 0,{busyTimeoutMs:100});try{let s=i.getTaskIntentArtifactBySource({projectRoot:n,sessionId:t.sessionId,sourceHash:o});if(s){let j=Fe(s).identity,z=i.getRuntimeActivation(j.projectRoot,j.sessionId,j.turnId,s.version);if(!z)throw new Error(`RUNTIME_ACTIVATION_MISSING:${s.artifactHash}`);return {artifact:Fe(s),memoryIdentity:Ne(s),activation:z,reused:!0}}let a=`turn:${O(`${t.sessionId}\0${o}`)}`,l=`request:${O(`${n}\0${t.sessionId}\0${a}`)}`,m={projectRoot:n,projectId:`project:${stableRuntimeHash(n).slice(0,20)}`,hostId:r.hostId,sessionId:t.sessionId,executionId:t.sessionId,turnId:a,requestId:l},c=1,u=resolveRuntimeActivationSnapshot({projectRoot:n,createdAt:r.timestamp}),d=ir(r.rawPrompt),p={identity:m,version:c,rawPrompt:r.rawPrompt,normalizedPrompt:He(r.rawPrompt),...r.command?{command:r.command}:{},slashArgs:r.slashArgs,...r.activeSkill?{activeSkill:r.activeSkill}:{},intent:"unknown",action:"unknown",entities:[],targetAnchors:d,policyConstraints:[],classificationEvidence:[],sourceEventIds:[r.sourceEventId??`host-event:${o.slice(0,24)}`],sourceHash:o,createdAt:r.timestamp},g={...p,artifactHash:cr(p)};i.appendTaskIntentArtifact(rr(g)),i.bindRuntimeActivation({identity:m,revision:c,snapshot:u});let ze=nr(i,g);return f({event:"host.prompt.normalized",identity:m,level:"info",timestamp:Date.now(),data:{sourceHash:o,command:g.command,activeSkill:g.activeSkill,rawPromptBytes:Buffer.byteLength(g.rawPrompt)}}),f({event:"intent.artifact.created",identity:m,level:"info",timestamp:Date.now(),data:{artifactHash:g.artifactHash,targetCount:d.length}}),f({event:"intent.artifact.persisted",identity:m,level:"info",timestamp:Date.now(),data:{artifactHash:g.artifactHash,version:g.version,sourceHash:g.sourceHash,authority:"immutable-intent",captureLatencyMs:Date.now()-e}}),f({event:"terminal.transition.persisted",identity:m,level:"info",timestamp:Date.now(),data:{state:"intent_bound",receiptId:ze,sourceIntentHash:g.artifactHash}}),{artifact:g,memoryIdentity:Ne(g),activation:u,reused:!1}}finally{i.close();}}function nr(t,e){let n=t.getLatestTerminalTransition(e.identity.projectRoot,e.identity.sessionId,e.identity.turnId);if(n)return n.receiptId;let r=`terminal:${O(`${e.artifactHash}\0open`)}`;return t.appendTerminalTransition({...e.identity,sequence:1,toState:"open",receiptId:r,reason:"host_prompt_accepted",payload:{sourceHash:e.sourceHash},createdAt:e.createdAt}),t.appendTerminalTransition({...e.identity,sequence:2,fromState:"open",toState:"intent_bound",receiptId:`terminal:${O(`${e.artifactHash}\0intent_bound`)}`,sourceReceiptId:r,reason:"immutable_intent_persisted",payload:{intentArtifactHash:e.artifactHash},createdAt:Math.max(e.createdAt,Date.now())}).receiptId}function rr(t){return {...t.identity,version:t.version,supersedesHash:t.supersedesHash,rawPrompt:t.rawPrompt,normalizedPrompt:t.normalizedPrompt,command:t.command,slashArgs:t.slashArgs,activeSkill:t.activeSkill,intent:t.intent,action:t.action,entities:t.entities,targetAnchors:t.targetAnchors,policyConstraints:t.policyConstraints,classificationEvidence:t.classificationEvidence.map(e=>({...e})),sourceEventIds:t.sourceEventIds,sourceHash:t.sourceHash,artifactHash:t.artifactHash,createdAt:t.createdAt}}function Fe(t){return {identity:or(t),version:t.version,...t.supersedesHash?{supersedesHash:t.supersedesHash}:{},rawPrompt:t.rawPrompt,normalizedPrompt:t.normalizedPrompt,...t.command?{command:t.command}:{},slashArgs:t.slashArgs,...t.activeSkill?{activeSkill:t.activeSkill}:{},intent:t.intent,action:t.action,entities:t.entities,targetAnchors:t.targetAnchors,policyConstraints:t.policyConstraints,classificationEvidence:t.classificationEvidence,sourceEventIds:t.sourceEventIds,sourceHash:t.sourceHash,artifactHash:t.artifactHash,createdAt:t.createdAt}}function or(t){return {projectRoot:t.projectRoot,projectId:t.projectId,hostId:t.hostId,sessionId:t.sessionId,turnId:t.turnId,requestId:t.requestId,...t.executionId?{executionId:t.executionId}:{}}}function Ne(t){let e=t.rawPrompt.trim().slice(0,4e3),n="identity"in t?t.identity.turnId:t.turnId;return {turnId:n,eventId:`memory-turn:${n.replace(/^turn:/u,"")}`,promptHash:createHash$1("sha256").update(e).digest("hex"),createdAt:t.createdAt}}function ir(t){let e=t.match(/(?:^|[\s`'"(])((?:\.{0,2}\/)?(?:[A-Za-z0-9_@.-]+\/)+[A-Za-z0-9_@.-]+(?:\.[A-Za-z0-9]+)?)/gu)??[];return sr(e.map(n=>n.trim().replace(/^[`'"(]+|[`'"),.;:,。;:]+$/gu,"")).filter(n=>!n.startsWith("/")||/\.[A-Za-z0-9]+$/u.test(n))).slice(0,16)}function He(t){return t.normalize("NFKC").replace(/\s+/gu," ").trim().slice(0,4e3)}function sr(t){return [...new Set(t.filter(Boolean))]}function ar(t){let e=resolve(t);try{return realpathSync(e)}catch{return e}}function cr(t){return createHash$1("sha256").update(J(t)).digest("hex")}function O(t){return createHash$1("sha256").update(t).digest("hex").slice(0,24)}function J(t){if(t===null||typeof t=="string"||typeof t=="boolean")return JSON.stringify(t);if(typeof t=="number")return Number.isFinite(t)?JSON.stringify(t):"null";if(Array.isArray(t))return `[${t.map(J).join(",")}]`;if(!t||typeof t!="object")return JSON.stringify(String(t));let e=t;return `{${Object.keys(e).sort().map(n=>`${JSON.stringify(n)}:${J(e[n])}`).join(",")}}`}function Ue(){return generateKeyPairSync("ed25519")}function Ke(t){let e=parseTrustedDecisionCommand(t.rawUserEvent,t.allowedOptionIds),n=t.now??Date.now(),r={schemaVersion:"delivery-user-attestation.v1",issuer:t.issuer,keyId:t.keyId,purpose:e.purpose,decisionId:e.decisionId,caseId:t.caseId,caseVersion:t.caseVersion,sessionId:t.sessionId,sourceTurnId:t.sourceTurnId,actorId:t.actorId,targetDecisionHash:t.targetDecisionHash,rawUserEvent:t.rawUserEvent,rawUserEventHash:domainHash("raw-user-event",t.rawUserEvent),selectedValueHash:domainHash("decision-value",{decisionId:e.decisionId,purpose:e.purpose,value:encodeDecisionValue(e.purpose,e.value)}),eventSequence:t.eventSequence,issuedAt:new Date(n).toISOString(),expiresAt:new Date(n+6e4).toISOString(),nonce:t.nonce};return {...r,attestation:sign(null,canonicalJsonBytes(r),t.privateKey).toString("base64url")}}var Je=new Map;async function Ve(t){let e=t.prompt.trim();if(!/^\/devflow:(?:decide|approve|reject|revise|cancel|exit)\b/u.test(e))return {handled:false};let n=hr(t.projectRoot),r=e;if(e==="/devflow:approve"||e==="/devflow:approve current"){let c=await n.pendingDecisionForSession(t.sessionId);if(!c)return {handled:true,resolved:false,message:"DevFlow approval not found: there is no pending decision for this session."};if("ambiguous"in c)return {handled:true,resolved:false,message:`DevFlow approval is ambiguous: multiple pending cases exist (${c.caseIds.join(", ")}). Use the approval choices shown by the host.`};if(c.decision.kind!=="artifact_approval")return {handled:true,resolved:false,message:"DevFlow approval is not available yet: the current pending item is a clarification, not an artifact gate."};r=`/devflow:approve ${c.decision.id}`;}let o;try{o=parseTrustedDecisionCommand(r);}catch(c){return {handled:true,resolved:false,message:`DevFlow trusted decision rejected: ${c instanceof Error?c.message:String(c)}`}}let i=o.decisionId.split(/:(?:decision|question|approval):/u)[0],s=await n.pendingDecision(i);if(!s||s.id!==o.decisionId)return {handled:true,resolved:false,message:`DevFlow trusted decision rejected: no pending decision matches ${o.decisionId}. Refresh delivery_status.`};let a=process.env.DEVFLOW_HOST_ACTOR_ID?.trim()||`user:${process.env.USER?.trim()||"local"}`,l=Ue(),m=Ke({rawUserEvent:r,issuer:"claude-code",keyId:"session-ephemeral",caseId:i,caseVersion:s.caseVersion,sessionId:t.sessionId,sourceTurnId:t.sourceTurnId?.trim()||`host-turn:${t.sessionId}:${Date.now()}`,actorId:a,targetDecisionHash:s.targetDecisionHash,eventSequence:Date.now(),nonce:randomUUID(),privateKey:l.privateKey,allowedOptionIds:s.options.map(c=>c.id)});try{return await n.resolveTrustedDecision({evidence:m,publicKey:l.publicKey,expectedIssuer:"claude-code",expectedKeyId:"session-ephemeral"}),{handled:!0,resolved:!0,message:`DevFlow trusted decision resolved for ${i}. Refresh delivery_status and follow nextActions.`}}catch(c){return {handled:true,resolved:false,message:`DevFlow trusted decision rejected: ${c instanceof Error?c.message:String(c)}`}}}function hr(t){let e=Je.get(t);if(e)return e;let n=createTrustedDeliveryFacade(t);return Je.set(t,n),n}var y=process.env.CLAUDE_PROJECT_DIR||process.cwd();async function br(t){let e=W()?[B]:[],n;try{n=JSON.parse(t);}catch{return {hookSpecificOutput:{hookEventName:"UserPromptSubmit",permissionDecision:"allow",...e.length?{additionalContext:e.join(`
9
+ `)}if(process.env.DEVFLOW_MEMORY_SNAPSHOT_CLI==="1"){let[,,t,e,n]=process.argv;t!=="session-start"||!e?process.exitCode=2:process.stdout.write(kn({projectRoot:e,configPath:n,daemonResponse:process.env.DEVFLOW_MEMORY_RESPONSE}));}function b(t){let{projectRoot:e,...n}=t;try{return new q(e).dispatchBoundary(n).snapshot??null}catch(r){return f({event:"hook.runtime.degraded",identity:{projectRoot:e,sessionId:t.sessionId,...t.turnId?{turnId:t.turnId}:{},...t.requestId?{requestId:t.requestId}:{},...t.executionId?{executionId:t.executionId}:{}},level:"error",timestamp:Date.now(),data:{stage:t.kind,reason:r instanceof Error?r.message:String(r),tool:t.producer}}),null}}var q=class{constructor(e){this.projectRoot=e;}dispatchBoundary(e){let n=Dn(e.kind,e.payload??{});if(!n)return {handled:false};let r=openGlobalDevFlowDatabase(void 0,{busyTimeoutMs:250});try{let o=xn(r,{projectRoot:this.projectRoot,sessionId:e.sessionId,...e.turnId?{turnId:e.turnId}:{},...e.requestId?{requestId:e.requestId}:{},...e.executionId?{executionId:e.executionId}:{}});return o?{handled:!0,snapshot:new TaskKernel(new TaskEventStore(r),new SemanticRuntimeEventProjector).dispatch({definition:o.definition,kind:n.kind,payload:n.payload,idempotencyKey:`host:${o.definition.definitionHash}:${e.dedupeKey}`,producer:e.producer}).snapshot}:{handled:!1}}finally{r.close();}}};function xn(t,e){let n=e.executionId?t.getActiveContextReceipt(e.projectRoot,e.sessionId,e.executionId):null,r=e.turnId??n?.canonicalAction?.binding.turnId,o=e.requestId??n?.requestId;if(!r&&!o)return null;let i=t.listLatestTaskIntentArtifacts(e.projectRoot,e.sessionId).find(l=>r?l.turnId===r:l.requestId===o);if(!i)return null;let s=t.getTaskAggregateSnapshot(e.projectRoot,e.sessionId,i.turnId,i.version);if(!s)return null;let a=t.getTaskDefinitionV2(s.taskDefinitionHash);return !a||a.revision!==i.version?null:{definition:a,snapshot:s}}function Dn(t,e){switch(t){case "action.lease.issued":return {kind:"action_lease_issued",payload:e};case "action.succeeded":return {kind:"action_completed",payload:e};case "action.failed":return {kind:"action_failed",payload:e};case "verification.succeeded":return {kind:"verification_completed",payload:e};case "verification.failed":return {kind:"verification_failed",payload:e};case "memory.committed":return {kind:"memory_episode_persisted",payload:e};case "memory.skipped":return {kind:"memory_decision_completed",payload:e};case "memory.pending":return {kind:"memory_extraction_queued",payload:e};case "memory.failed":return {kind:"memory_extraction_failed",payload:e};case "durable_work.owned":return {kind:"durable_work_leased",payload:{...e,fencingToken:Number.isSafeInteger(e.fencingToken)?e.fencingToken:0}};case "durable_work.completed":return {kind:"durable_work_completed",payload:e};case "durable_work.dead_lettered":return {kind:"durable_work_dead_lettered",payload:e};default:return null}}var Mn=/^(?:ok(?:ay)?|yes|no|thanks?|thank you|continue|好的?|可以|行|是|否|谢谢|继续|收到|明白了?)[.!。!\s]*$/iu,On=/(?:记住|记下|保存|持久化|跨会话|以后|始终|永远|统一使用|项目约定|团队约定|偏好|决定采用|保留可复用|提炼结论|沉淀|记录(?:下来|为|成)?(?:架构|规则|约定|知识|结论))|\b(?:remember|memorize|persist|across sessions|from now on|always|project convention|team convention|preference|we use|adopt|retain reusable|distill)\b/iu,jn=/(?:分析|审查|检查|评估|性能|生成|创建|新建|添加|编写|实现|开发|设计|撰写|总结|修改|重构|修复|调试|解释|查看)|\b(?:analy[sz]e|review|inspect|audit|performance|generate|create|add|build|implement|develop|design|write|summarize|modify|refactor|fix|debug|explain)\b/iu,$n=/(?:召回|查询|检索|查找|定位|询问|什么|如何|是否|哪里|哪个)|\b(?:recall|query|search|find|locate|ask|what|how|whether|where|which)\b/iu;function Pn(t){let e=t.trim();return e.length>0&&!Mn.test(e)}function Fn(t,e){if(!e.trim())return false;let n=join(t,".devflow","delivery-line","state.db");if(!existsSync$1(n))return false;let r;try{return r=new DatabaseSync(n,{readOnly:!0,timeout:250}),r.prepare("SELECT payload FROM delivery_cases").all().some(i=>{try{let s=JSON.parse(i.payload);return s.sessionId===e&&!["delivered","cancelled","rejected"].includes(String(s.stage??""))}catch{return !1}})}catch{return false}finally{r?.close();}}function Nn(t){let e=t.normalize("NFKC").trim(),n=$n.test(e);return e.length>=4&&(jn.test(e)||n)&&(!On.test(e)||n)&&k(e)===null}function Hn(t,e,n=Date.now()){let r=createHash$1("sha256").update(e.trim()).digest("hex"),o=createHash$1("sha256").update(`${t}\0${n}\0${r}`).digest("hex").slice(0,24);return {turnId:`turn:${o}`,eventId:`memory-turn:${o}`,promptHash:r,createdAt:n}}function Me(t,e,n=[]){return `memory-receipt:${createHash$1("sha256").update(`${t}\0${e}\0${[...n].sort().join("\0")}`).digest("hex").slice(0,24)}`}function Ln(t){return `DevFlow memory decision required for ${t.turnId}. Before the final response, semantically decide whether this turn contains durable project knowledge. Call ${projectClaudeToolName("memory_commit_turn")} with evidence-bound candidates, or ${projectClaudeToolName("memory_skip_turn")} with a concrete reason. Do not claim memory success without a canonical receipt. For candidates, copy exact evidenceSpans from this user prompt, preserve package names, flags, versions, paths, and identifiers, and provide subject, predicate, value, polarity, and entities when known. To replace or retire an existing fact, provide operation=supersede or operation=retire plus referencedFactIds from the canonical memory receipt; aliases and entity names are not fact identity. Do not save assistant echoes, task narration, retries, or unverified guesses. Express a change from an old choice as the new durable value. If the decision tool remains unavailable, explicitly state that the memory was not saved.`}function U(t){let e=t.memoryIds.length>0?t.memoryIds.join(","):"none",n=t.status==="committed"?"accepted":t.status,r=t.status==="committed"?"; indexStatus=pending":"",o=t.memoryIds.some(a=>a.startsWith("raw-memory:")),i=t.status==="committed"&&t.source==="explicit_intent"&&!o?"; memoryOnlyCompleted=true; skipProjectContext=true; hostRefinementRequired=true":t.status==="committed"&&t.source==="explicit_intent"?"; asyncReadiness=queued; hostRefinementRequired=true":"",s=t.status==="committed"&&t.source==="explicit_intent"?` The deterministic explicit-memory save is complete and remains authoritative if refinement fails. Before the final response, call ${projectClaudeToolName("memory_commit_turn")} once with turnId=${t.turnId} and semantic candidates. Split every distinct reusable fact into a durable_memory candidate, classify instructions that apply only to this turn as turn_constraint, and include evidenceSpans copied verbatim from the user prompt for every candidate. Preserve exact flags, package names, versions, paths, and identifiers. Keep narrative and value in the user prompt language; do not translate evidence into a different surface form. The tool refines the existing receipt idempotently; it must not create native Claude memory. If refinement is unavailable, return the existing canonical receipt without claiming refinement.`:"";return `DevFlow canonical memory receipt: status=${n}; receiptId=${t.receiptId??"missing"}; turnId=${t.turnId}; memoryIds=${e}; source=${t.source??"unknown"}${r}${i}.`+s}function Oe(t){if(!Pn(t.prompt))return null;let e=openGlobalDevFlowDatabase(void 0,{busyTimeoutMs:50});try{let n=t.prompt.trim().slice(0,4e3),r=createHash$1("sha256").update(n).digest("hex"),o=e.listMemoryTurns(t.projectRoot,t.sessionId,5).find(d=>d.promptHash===r&&Date.now()-d.createdAt<1e4),i=o?{turnId:o.turnId,eventId:o.eventId,promptHash:o.promptHash,createdAt:o.createdAt}:t.identity??Hn(t.sessionId,n),s=o??e.beginMemoryTurn({...i,projectRoot:t.projectRoot,sessionId:t.sessionId});if(s.status!=="pending")return {turn:s,additionalContext:U(s),skipSkillRouting:s.source==="explicit_intent"};let l=(t.activation?.semantic??"degraded_structural")==="degraded_structural"?k(n)??void 0:void 0,m=Fn(t.projectRoot,t.sessionId);if(!l&&!m&&Nn(n)){let d=Me(s.turnId,"skipped"),p=e.skipMemoryTurn({turnId:s.turnId,receiptId:d,source:"automatic_transient_skip",reason:"high_confidence_transient_task"});return b({projectRoot:t.projectRoot,sessionId:t.sessionId,turnId:s.turnId,kind:"memory.skipped",payload:{receiptId:d,reasonCode:"high_confidence_transient_task"},dedupeKey:d,producer:"devflow-memory-turn"}),f({event:"memory.semantic.decided",identity:{projectRoot:t.projectRoot,sessionId:t.sessionId,turnId:s.turnId},level:"info",timestamp:Date.now(),data:{status:"semantic_empty",operation:"none",reason:"high_confidence_transient_task"}}),{turn:p,additionalContext:U(p),skipSkillRouting:!1}}let c=l?"commit_explicit":"capture_prompt",u=e.enqueueWork({idempotencyKey:`memory-turn:${c}:${s.turnId}`,kind:l?"memory.explicit_commit":"memory.turn_capture",projectRoot:t.projectRoot,sessionId:t.sessionId,turnId:s.turnId,payload:{operation:c,turnId:s.turnId,eventId:s.eventId,sessionId:t.sessionId,prompt:n,explicitContent:l,createdAt:s.createdAt}});if(l){let d=`raw-memory:${createHash$1("sha256").update(`${t.projectRoot}\0${i.turnId}\0${l}`).digest("hex").slice(0,24)}`,p=Me(s.turnId,"committed",[d]),g=e.commitMemoryTurn({turnId:s.turnId,receiptId:p,memoryIds:[d],source:"explicit_intent",reason:"explicit_raw_queued",decidedAt:Date.now()});return b({projectRoot:t.projectRoot,sessionId:t.sessionId,turnId:s.turnId,kind:"durable_work.owned",payload:{workId:u.id,obligation:"memory"},dedupeKey:`${u.id}:owned`,producer:"devflow-memory-turn"}),b({projectRoot:t.projectRoot,sessionId:t.sessionId,turnId:s.turnId,kind:"memory.committed",payload:{receiptId:p,reasonCode:"explicit_raw_queued"},dedupeKey:p,producer:"devflow-memory-turn"}),f({event:"memory.write.completed",identity:{projectRoot:t.projectRoot,sessionId:t.sessionId,turnId:s.turnId,actionReceipt:p},level:"info",timestamp:Date.now(),data:{stage:"explicit_fast_ack",durable:!0,rawMemoryId:d,receiptLatencyMs:Date.now()-i.createdAt,asyncReadiness:"queued"}}),{turn:g,explicitContent:l,additionalContext:U(g),skipSkillRouting:!0}}return b({projectRoot:t.projectRoot,sessionId:t.sessionId,turnId:s.turnId,kind:"memory.pending",payload:{reasonCode:"semantic_decision_queued"},dedupeKey:`${s.turnId}:pending`,producer:"devflow-memory-turn"}),b({projectRoot:t.projectRoot,sessionId:t.sessionId,turnId:s.turnId,kind:"durable_work.owned",payload:{workId:u.id,obligation:"memory"},dedupeKey:`${u.id}:owned`,producer:"devflow-memory-turn"}),{turn:s,explicitContent:l,additionalContext:Ln(s),skipSkillRouting:!1}}finally{e.close();}}function $e(t,e){let n=Vn(t);mkdirSync$1(n,{recursive:true,mode:448});let r=`memory-turn-spool-${Date.now()}-${process.pid}-${randomUUID()}`,o=join(n,`${r}.json`),i=`${o}.tmp`;return writeFileSync$1(i,JSON.stringify({...e,prompt:e.prompt.trim().slice(0,4e3)}),{mode:384}),renameSync$1(i,o),r}function Vn(t){return join(w(t),"memory-turn-pending")}function Pe(t){let e=Date.now();try{let n=openGlobalDevFlowDatabase(void 0,{busyTimeoutMs:100});try{let r=`context-prefetch:${createHash$1("sha256").update(`${t.projectRoot}\0${t.sessionId}\0${t.executionId}\0${Wn(t.prompt)}\0${t.profileFingerprint}`).digest("hex")}`,o=n.enqueueWork({idempotencyKey:r,kind:"context.prefetch",projectRoot:t.projectRoot,sessionId:t.sessionId,payload:t,maxAttempts:3});return h("prefetch_queue",{projectRoot:t.projectRoot,skillName:t.skillName,accepted:!0,workState:o.state,latencyMs:Date.now()-e}),{accepted:!0,workItemId:o.id}}finally{n.close();}}catch(n){let r=n instanceof Error?n.message:String(n);return h("prefetch_queue",{projectRoot:t.projectRoot,skillName:t.skillName,accepted:false,reason:r,latencyMs:Date.now()-e}),{accepted:false,reason:r}}}function Wn(t){return t.trim().toLowerCase().replace(/\s+/g," ").slice(0,4e3)}async function Le(t){let e=Date.now(),n=ar(t.projectRoot),r=claudeCodeRuntimeAdapter.normalizePrompt(t.hostEvent??{session_id:t.sessionId,prompt:t.prompt},{projectRoot:n}),o=semanticTextHash(He(r.rawPrompt)),i=openGlobalDevFlowDatabase(void 0,{busyTimeoutMs:100});try{let s=i.getTaskIntentArtifactBySource({projectRoot:n,sessionId:t.sessionId,sourceHash:o});if(s){let j=Fe(s).identity,z=i.getRuntimeActivation(j.projectRoot,j.sessionId,j.turnId,s.version);if(!z)throw new Error(`RUNTIME_ACTIVATION_MISSING:${s.artifactHash}`);return {artifact:Fe(s),memoryIdentity:Ne(s),activation:z,reused:!0}}let a=`turn:${O(`${t.sessionId}\0${o}`)}`,l=`request:${O(`${n}\0${t.sessionId}\0${a}`)}`,m={projectRoot:n,projectId:`project:${stableRuntimeHash(n).slice(0,20)}`,hostId:r.hostId,sessionId:t.sessionId,executionId:t.sessionId,turnId:a,requestId:l},c=1,u=resolveRuntimeActivationSnapshot({projectRoot:n,createdAt:r.timestamp}),d=ir(r.rawPrompt),p={identity:m,version:c,rawPrompt:r.rawPrompt,normalizedPrompt:He(r.rawPrompt),...r.command?{command:r.command}:{},slashArgs:r.slashArgs,...r.activeSkill?{activeSkill:r.activeSkill}:{},intent:"unknown",action:"unknown",entities:[],targetAnchors:d,policyConstraints:[],classificationEvidence:[],sourceEventIds:[r.sourceEventId??`host-event:${o.slice(0,24)}`],sourceHash:o,createdAt:r.timestamp},g={...p,artifactHash:cr(p)};i.appendTaskIntentArtifact(rr(g)),i.bindRuntimeActivation({identity:m,revision:c,snapshot:u});let ze=nr(i,g);return f({event:"host.prompt.normalized",identity:m,level:"info",timestamp:Date.now(),data:{sourceHash:o,command:g.command,activeSkill:g.activeSkill,rawPromptBytes:Buffer.byteLength(g.rawPrompt)}}),f({event:"intent.artifact.created",identity:m,level:"info",timestamp:Date.now(),data:{artifactHash:g.artifactHash,targetCount:d.length}}),f({event:"intent.artifact.persisted",identity:m,level:"info",timestamp:Date.now(),data:{artifactHash:g.artifactHash,version:g.version,sourceHash:g.sourceHash,authority:"immutable-intent",captureLatencyMs:Date.now()-e}}),f({event:"terminal.transition.persisted",identity:m,level:"info",timestamp:Date.now(),data:{state:"intent_bound",receiptId:ze,sourceIntentHash:g.artifactHash}}),{artifact:g,memoryIdentity:Ne(g),activation:u,reused:!1}}finally{i.close();}}function nr(t,e){let n=t.getLatestTerminalTransition(e.identity.projectRoot,e.identity.sessionId,e.identity.turnId);if(n)return n.receiptId;let r=`terminal:${O(`${e.artifactHash}\0open`)}`;return t.appendTerminalTransition({...e.identity,sequence:1,toState:"open",receiptId:r,reason:"host_prompt_accepted",payload:{sourceHash:e.sourceHash},createdAt:e.createdAt}),t.appendTerminalTransition({...e.identity,sequence:2,fromState:"open",toState:"intent_bound",receiptId:`terminal:${O(`${e.artifactHash}\0intent_bound`)}`,sourceReceiptId:r,reason:"immutable_intent_persisted",payload:{intentArtifactHash:e.artifactHash},createdAt:Math.max(e.createdAt,Date.now())}).receiptId}function rr(t){return {...t.identity,version:t.version,supersedesHash:t.supersedesHash,rawPrompt:t.rawPrompt,normalizedPrompt:t.normalizedPrompt,command:t.command,slashArgs:t.slashArgs,activeSkill:t.activeSkill,intent:t.intent,action:t.action,entities:t.entities,targetAnchors:t.targetAnchors,policyConstraints:t.policyConstraints,classificationEvidence:t.classificationEvidence.map(e=>({...e})),sourceEventIds:t.sourceEventIds,sourceHash:t.sourceHash,artifactHash:t.artifactHash,createdAt:t.createdAt}}function Fe(t){return {identity:or(t),version:t.version,...t.supersedesHash?{supersedesHash:t.supersedesHash}:{},rawPrompt:t.rawPrompt,normalizedPrompt:t.normalizedPrompt,...t.command?{command:t.command}:{},slashArgs:t.slashArgs,...t.activeSkill?{activeSkill:t.activeSkill}:{},intent:t.intent,action:t.action,entities:t.entities,targetAnchors:t.targetAnchors,policyConstraints:t.policyConstraints,classificationEvidence:t.classificationEvidence,sourceEventIds:t.sourceEventIds,sourceHash:t.sourceHash,artifactHash:t.artifactHash,createdAt:t.createdAt}}function or(t){return {projectRoot:t.projectRoot,projectId:t.projectId,hostId:t.hostId,sessionId:t.sessionId,turnId:t.turnId,requestId:t.requestId,...t.executionId?{executionId:t.executionId}:{}}}function Ne(t){let e=t.rawPrompt.trim().slice(0,4e3),n="identity"in t?t.identity.turnId:t.turnId;return {turnId:n,eventId:`memory-turn:${n.replace(/^turn:/u,"")}`,promptHash:createHash$1("sha256").update(e).digest("hex"),createdAt:t.createdAt}}function ir(t){let e=t.match(/(?:^|[\s`'"(])((?:\.{0,2}\/)?(?:[A-Za-z0-9_@.-]+\/)+[A-Za-z0-9_@.-]+(?:\.[A-Za-z0-9]+)?)/gu)??[];return sr(e.map(n=>n.trim().replace(/^[`'"(]+|[`'"),.;:,。;:]+$/gu,"")).filter(n=>!n.startsWith("/")||/\.[A-Za-z0-9]+$/u.test(n))).slice(0,16)}function He(t){return t.normalize("NFKC").replace(/\s+/gu," ").trim().slice(0,4e3)}function sr(t){return [...new Set(t.filter(Boolean))]}function ar(t){let e=resolve(t);try{return realpathSync(e)}catch{return e}}function cr(t){return createHash$1("sha256").update(J(t)).digest("hex")}function O(t){return createHash$1("sha256").update(t).digest("hex").slice(0,24)}function J(t){if(t===null||typeof t=="string"||typeof t=="boolean")return JSON.stringify(t);if(typeof t=="number")return Number.isFinite(t)?JSON.stringify(t):"null";if(Array.isArray(t))return `[${t.map(J).join(",")}]`;if(!t||typeof t!="object")return JSON.stringify(String(t));let e=t;return `{${Object.keys(e).sort().map(n=>`${JSON.stringify(n)}:${J(e[n])}`).join(",")}}`}function Ue(){return generateKeyPairSync("ed25519")}function Ke(t){let e=parseTrustedDecisionCommand(t.rawUserEvent,t.allowedOptionIds),n=t.now??Date.now(),r={schemaVersion:"delivery-user-attestation.v1",issuer:t.issuer,keyId:t.keyId,purpose:e.purpose,decisionId:e.decisionId,caseId:t.caseId,caseVersion:t.caseVersion,sessionId:t.sessionId,sourceTurnId:t.sourceTurnId,actorId:t.actorId,targetDecisionHash:t.targetDecisionHash,rawUserEvent:t.rawUserEvent,rawUserEventHash:domainHash("raw-user-event",t.rawUserEvent),selectedValueHash:domainHash("decision-value",{decisionId:e.decisionId,purpose:e.purpose,value:encodeDecisionValue(e.purpose,e.value)}),eventSequence:t.eventSequence,issuedAt:new Date(n).toISOString(),expiresAt:new Date(n+6e4).toISOString(),nonce:t.nonce};return {...r,attestation:sign(null,canonicalJsonBytes(r),t.privateKey).toString("base64url")}}var Je=new Map;async function Ve(t){let e=t.prompt.trim();if(!/^\/devflow:(?:decide|approve|reject|revise|cancel|exit)\b/u.test(e))return {handled:false};let n=hr(t.projectRoot),r=e;if(e==="/devflow:approve"||e==="/devflow:approve current"){let c=await n.pendingDecisionForSession(t.sessionId);if(!c)return {handled:true,resolved:false,message:"DevFlow approval not found: there is no pending decision for this session."};if("ambiguous"in c)return {handled:true,resolved:false,message:`DevFlow approval is ambiguous: multiple pending cases exist (${c.caseIds.join(", ")}). Use the approval choices shown by the host.`};if(c.decision.kind!=="artifact_approval")return {handled:true,resolved:false,message:"DevFlow approval is not available yet: the current pending item is a clarification, not an artifact gate."};r=`/devflow:approve ${c.decision.id}`;}let o;try{o=parseTrustedDecisionCommand(r);}catch(c){return {handled:true,resolved:false,message:`DevFlow trusted decision rejected: ${c instanceof Error?c.message:String(c)}`}}let i=o.decisionId.split(":")[0],s=await n.pendingDecision(i);if(!s||s.id!==o.decisionId)return {handled:true,resolved:false,message:`DevFlow trusted decision rejected: no pending decision matches ${o.decisionId}. Refresh delivery_status.`};let a=process.env.DEVFLOW_HOST_ACTOR_ID?.trim()||`user:${process.env.USER?.trim()||"local"}`,l=Ue(),m=Ke({rawUserEvent:r,issuer:"claude-code",keyId:"session-ephemeral",caseId:i,caseVersion:s.caseVersion,sessionId:t.sessionId,sourceTurnId:t.sourceTurnId?.trim()||`host-turn:${t.sessionId}:${Date.now()}`,actorId:a,targetDecisionHash:s.targetDecisionHash,eventSequence:Date.now(),nonce:randomUUID(),privateKey:l.privateKey,allowedOptionIds:s.options.map(c=>c.id)});try{return await n.resolveTrustedDecision({evidence:m,publicKey:l.publicKey,expectedIssuer:"claude-code",expectedKeyId:"session-ephemeral"}),{handled:!0,resolved:!0,message:`DevFlow trusted decision resolved for ${i}. Refresh delivery_status and follow nextActions.`}}catch(c){return {handled:true,resolved:false,message:`DevFlow trusted decision rejected: ${c instanceof Error?c.message:String(c)}`}}}function hr(t){let e=Je.get(t);if(e)return e;let n=createTrustedDeliveryFacade(t);return Je.set(t,n),n}var y=process.env.CLAUDE_PROJECT_DIR||process.cwd();async function br(t){let e=W()?[B]:[],n;try{n=JSON.parse(t);}catch{return {hookSpecificOutput:{hookEventName:"UserPromptSubmit",permissionDecision:"allow",...e.length?{additionalContext:e.join(`
10
10
  `)}:{}}}}let r=n.prompt||"";if(!r.trim())return {hookSpecificOutput:{hookEventName:"UserPromptSubmit",permissionDecision:"allow",...e.length?{additionalContext:e.join(`
11
11
  `)}:{}}};let o=n.session_id?.trim();if(o&&/^\/devflow:(?:decide|approve|reject)\b/u.test(r.trim()))try{let c=await Ve({projectRoot:y,sessionId:o,prompt:r});if(c.handled)return {hookSpecificOutput:{hookEventName:"UserPromptSubmit",permissionDecision:"allow",additionalContext:c.message}}}catch(c){e.push(`DevFlow trusted delivery fallback degraded: ${c instanceof Error?c.message:String(c)}`);}let i=se(r),s=false,a,l,m=o?new x(y):void 0;if(o){try{l=await Le({projectRoot:y,sessionId:o,prompt:r,hostEvent:n}),m.bindTaskIdentity(o,{turnId:l.artifact.identity.turnId,requestId:l.artifact.identity.requestId,intentArtifactHash:l.artifact.artifactHash}),e.push(`DevFlow immutable task identity: turnId=${l.artifact.identity.turnId}; requestId=${l.artifact.identity.requestId}; intentArtifactHash=${l.artifact.artifactHash}. Retrieval query expansion must not replace this original intent.`);}catch(c){e.push("DevFlow task intent persistence degraded; preserve the original user command and do not claim canonical context binding."),f({event:"intent.artifact.failed",identity:{projectRoot:y,sessionId:o},level:"error",timestamp:Date.now(),data:{stage:"user_prompt_submit",category:"intent_persistence_unavailable",error:c instanceof Error?c.message:String(c)}});}try{let c=Oe({projectRoot:y,sessionId:o,prompt:r,...l?{identity:l.memoryIdentity}:{},...l?{activation:l.activation}:{}});c&&(e.push(c.additionalContext),s=c.skipSkillRouting);}catch(c){s=!!k(r);try{let u=$e(y,{sessionId:o,prompt:r,createdAt:Date.now()});e.push(`DevFlow memory turn status=accepted; durable=true; receiptId=${u}; canonicalMemory=false; SQLite queue replay pending. Do not claim memory success without a canonical receipt.`),f({event:"memory.write.degraded",identity:{projectRoot:y,sessionId:o},level:"warn",timestamp:Date.now(),data:{stage:"turn_capture",reason:c.message,fallback:"durable_spool",receiptId:u}});}catch(u){e.push("DevFlow memory turn status=degraded; durable=false; no canonical receipt exists. Do not claim memory success."),f({event:"memory.write.degraded",identity:{projectRoot:y,sessionId:o},level:"error",timestamp:Date.now(),data:{stage:"turn_capture",reason:u.message,fallback:"none"}});}}}if(o&&i&&!s){let c=m.get(o)?.executionId,u=m.startExecution(o,i.skillName,fe(i.skillName));if(a=u.executionId,u.executionId&&u.executionId!==c){let p=new C;try{await p.sendSessionStart(o,y,u.startedAt),await p.sendExecutionStart(u.executionId,o,i.skillName,u.lastActivityAt,y,u.requiredMcpTools);}finally{p.close();}}let d=ge(i.skillName,y,r);d&&e.push(d);}if(o&&i&&a&&!s){let c=resolveProjectCapabilityProfile(y),u=resolveCapabilityRollout(y).config.retrievalSessions;Pe({prompt:r.trimStart().replace(/^\/devflow:[a-z0-9][a-z0-9-]*\b/i,"").trim()||r,projectRoot:y,sessionId:o,executionId:a,skillName:i.skillName,profileFingerprint:c.fingerprint,rolloutMode:u,retrievalVersion:"r2.v1",createdAt:Date.now()});}return {hookSpecificOutput:{hookEventName:"UserPromptSubmit",permissionDecision:"allow",...e.length?{additionalContext:e.join(`
12
12
  `)}:{}}}}if(process.argv[1]?.endsWith("user-prompt-submit")||process.argv[1]?.endsWith("user-prompt-submit.js")){let t=console.log.bind(console);console.log=console.error.bind(console),console.info=console.error.bind(console);let e="";process.stdin.setEncoding("utf8"),process.stdin.on("data",n=>{e+=n;}),process.stdin.on("end",async()=>{let n=await br(e.trim()||process.argv[2]||"");t(JSON.stringify(n)),process.exit(0);}),process.stdin.on("error",()=>{t(JSON.stringify({hookSpecificOutput:{hookEventName:"UserPromptSubmit",permissionDecision:"allow"}})),process.exit(0);}),setTimeout(()=>{t(JSON.stringify({hookSpecificOutput:{hookEventName:"UserPromptSubmit",permissionDecision:"allow"}})),process.exit(0);},3e4).unref();}export{br as handleUserPromptSubmit};
@@ -1,14 +1,14 @@
1
1
  {
2
2
  "manifestVersion": "devflow-runtime.v1",
3
- "packageVersion": "0.19.13",
4
- "sourceCommit": "365bcb0d71ff993575157a116ecc34b77dbc4f69",
3
+ "packageVersion": "0.19.15",
4
+ "sourceCommit": "1bf7dfe631751d5d856c9e363cdfef9d0ffee620",
5
5
  "bundleHashes": {
6
6
  "hooks": "858e24cc2bc01cdc69e47010e9e51eafc9d9230c9799a421821c3aa917f9c062",
7
- "mcp": "426258c76db3c4032baafd4b3926795e053b2a3df1ae72f0f2425f2e3f1e3c99",
7
+ "mcp": "4b1b4152fca04afcbc8466ed46799b60a35c6c4c5b5f7c7ed8252387d5c359df",
8
8
  "cli": "6205081f819ee3651962df36edd626b993a917fb8691f20c84e6b6e04af81d16"
9
9
  },
10
- "registryHash": "0cea9f9cd55d6b99041ece83d4d5e33a0b3bba425447ebbc5d523e4640183ef7",
10
+ "registryHash": "d779cbeb63b003f41ab5a0e1d7511824423800141f07e17863699a386eb0e31a",
11
11
  "stateDbPath": "<projectRoot>/.devflow/delivery-line/state.db",
12
- "builtAt": 1793880943633,
13
- "manifestHash": "1efdcdd27ceec698dc1e048747f4382b28dba8d4f3a94a9b59c05401061ae440"
12
+ "builtAt": 1794192809406,
13
+ "manifestHash": "b0a2617ae0151daeb104a25707cf91cf0ec3f066f15751a328aae014dc09ba0f"
14
14
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@devflow-tools/claude-code-plugin",
3
- "version": "0.19.13",
3
+ "version": "0.19.15",
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.19.13",
16
- "@devflow-tools/context-engine": "0.19.13",
17
- "@devflow-tools/database": "0.19.13",
18
- "@devflow-tools/mcp-server": "0.19.13",
19
- "@devflow-tools/memory-engine": "0.19.13",
20
- "@devflow-tools/sdk": "0.19.13",
21
- "@devflow-tools/semantic-engine": "0.19.13",
22
- "@devflow-tools/server": "0.19.13",
23
- "@devflow-tools/task-runtime": "0.19.13",
24
- "@devflow-tools/telemetry": "0.19.13",
25
- "@devflow-tools/workflow-engine": "0.19.13"
15
+ "@devflow-tools/benchmark": "0.19.15",
16
+ "@devflow-tools/context-engine": "0.19.15",
17
+ "@devflow-tools/database": "0.19.15",
18
+ "@devflow-tools/mcp-server": "0.19.15",
19
+ "@devflow-tools/memory-engine": "0.19.15",
20
+ "@devflow-tools/sdk": "0.19.15",
21
+ "@devflow-tools/semantic-engine": "0.19.15",
22
+ "@devflow-tools/server": "0.19.15",
23
+ "@devflow-tools/task-runtime": "0.19.15",
24
+ "@devflow-tools/telemetry": "0.19.15",
25
+ "@devflow-tools/workflow-engine": "0.19.15"
26
26
  },
27
27
  "devDependencies": {
28
- "@devflow-tools/devflow": "0.19.13"
28
+ "@devflow-tools/devflow": "0.19.15"
29
29
  },
30
30
  "allowScripts": {
31
31
  "better-sqlite3@12.11.1": true,
@@ -50,7 +50,7 @@
50
50
  "hooks",
51
51
  "skills"
52
52
  ],
53
- "gitHead": "365bcb0d71ff993575157a116ecc34b77dbc4f69",
53
+ "gitHead": "1086fb1f45a3caa1fb1008a5b3a51520afe5aa28",
54
54
  "license": "MIT",
55
55
  "repository": {
56
56
  "type": "git",
@@ -107,16 +107,20 @@ integration ref)完整保留。执行车辆是会话本身,交付线只做
107
107
 
108
108
  流程(对每个 pending 任务重复 2-6):
109
109
 
110
- 1. `plan_approved` 阶段且 `nextActions` 含 `begin_foreground_execution` 时,必须先用 `AskUserQuestion`
111
- 询问执行方式(前台执行 / 后台 worker)——这是机器语义 gate,不得跳过询问直接 resume。
112
- 选前台后调用 `mcp__plugin_devflow_devflow__delivery_begin_foreground_execution` 获取任务租约
113
- (此后宿主会话的 Write/Edit/Bash 对本案件放行——你就是在受审计地扮演 worker)。
110
+ 1. `plan_approved` 阶段且 `nextActions` 含 `begin_foreground_execution` 时,调用
111
+ `delivery_propose_trusted_action(action=begin_foreground_execution)` 并把生成的 pending decision
112
+ 用 `AskUserQuestion` **一次性**渲染(选项即 前台执行/放弃;放弃后可走 `delivery_resume` 后台)。
113
+ 不得先问一遍执行方式再弹一次确认——一次决策完成选择与授权。确认后宿主会话即持有任务租约
114
+ (你就是在受审计地扮演 worker)。
114
115
  2. 从 `delivery_status` 的任务列表取第一个 `pending` 任务,向用户展示任务卡:目标、`allowedFiles`、
115
- `implementationSteps`(RED/GREEN 顺序)、验收标准、验证命令。明确声明 allowedFiles 之外不做任何修改。
116
+ `implementationSteps`、验收标准、验证命令。明确声明 allowedFiles 之外不做任何修改。
116
117
  3. 基于任务的 base revision 建独立 worktree(候选必须是 base 后代,否则 import 会被权威校验拒绝):
117
118
  `git worktree add <临时目录> -b devflow-fg/<caseId>/<taskId> <baseRevision>`,在该目录中工作。
118
119
  4. 前台实现:按 `implementationSteps` 先写失败测试再实现(原生 Read/Write/Edit/Bash,输出对用户可见,
119
120
  可用原生 Task/Agent 工具拆子任务)。验证命令在前台逐条运行并向用户展示结果。
121
+ **纯 UI 组件且项目无 DOM 测试设施时,不要编写"读源码断言字符串"的伪测试**——用计划里的
122
+ `testFirstWaiver`(verificationAlternative 填 build + typecheck + 既有测试套件),build/类型检查
123
+ 就是该场景下的诚实验证。伪测试不产生行为覆盖,只是为了让 gate 通过的仪式。
120
124
  5. 在 worktree 中以规范 commit message 提交,得到 candidateRevision。
121
125
  6. 调用 `delivery_import_external_change(caseId, taskId, candidateRevision, reason)`——系统自动完成
122
126
  authority 校验(base 后代 + allowedFiles 边界)、独立验证与 integration ref 写入。导入被拒时按
@@ -124,7 +128,7 @@ integration ref)完整保留。执行车辆是会话本身,交付线只做
124
128
  全部任务 integrated 后按 `nextActions` 进入 review/export gate。
125
129
 
126
130
  边界:前台模式不改变 Delivery authority——不碰 target ref、不跳过验证、不伪造证据;import 失败照常
127
- 按错误处理规则恢复。
131
+ 按错误处理规则恢复。worktree 用完即清(`git worktree remove --force`)。
128
132
 
129
133
  ## 人工 Review Gate(REVIEW_AWAITING_HUMAN)
130
134
 
@@ -134,7 +138,8 @@ integration ref)完整保留。执行车辆是会话本身,交付线只做
134
138
  流程:
135
139
  1. 收到 `REVIEW_AWAITING_HUMAN` 后,先向用户展示审查材料:集成 diff(`git diff <parentRevision>..<integrationRevision>`)、
136
140
  验证证据摘要(verification 命令与结果)、任务验收标准。
137
- 2. 用 `AskUserQuestion` 一次收集三类裁决(bugs / security / compliance),每类选项:通过 / 退回(附 finding)。
141
+ 2. 用 `AskUserQuestion` **单次调用**收集三类裁决——一次调用带 3 个 question(bugs / security / compliance),
142
+ 每类选项:通过 / 退回(附 finding)。不要分三次弹窗。
138
143
  用户的裁决必须原样提交,不得代答或合并。
139
144
  3. 调用 `delivery_submit_review(caseId, verdicts)` 提交三类 verdict(每项 `{ kind, passed, findings? }`,
140
145
  findings 的 severity 用 blocker/major/minor/informational)。宿主可信通道会签名该决策。
@@ -143,6 +148,19 @@ integration ref)完整保留。执行车辆是会话本身,交付线只做
143
148
 
144
149
  禁止:agent 不得代替用户生成 verdict;不得在未展示 diff 与验证证据的情况下请求裁决;三类缺一不可。
145
150
 
151
+ ## 交付收尾(delivered 之后)
152
+
153
+ export 产出交付包后,闭环还差两步,按 `nextActions` 继续:
154
+
155
+ 1. **合入目标分支**:`nextActions` 含 `merge_to_target` 时,调用
156
+ `delivery_propose_trusted_action(action=merge_to_target)` 并渲染确认决策。确认后系统执行
157
+ fast-forward-only 合入(target 分叉时报 `TARGET_DIVERGED`,由用户手工解决,绝不强制合并)。
158
+ 合入成功后本轮交付的代码才真正落到 targetRef。
159
+ 2. **记忆沉淀(闭环第⑨步)**:合入完成后,调用 `mcp__plugin_devflow_devflow__memory_save_distilled`
160
+ 提炼本案的持久知识,至少包含:新增/变更的组件与位置(observation:decision_made/config_discovery)、
161
+ 设计决策与被否方案及理由(decision_made)、验证约定(config_discovery,如"本地工具链形式命令已验证可用")。
162
+ 没有这一步,下一个同类需求无法从本轮受益——闭环"每圈更便宜"依赖它。
163
+
146
164
  ## 可用操作
147
165
 
148
166
  - 澄清和设计:`delivery_propose_options`、`delivery_answer`、`delivery_revise`、`delivery_compare_options`、`delivery_prepare_plan`