@devflow-tools/cli 0.18.0 → 0.18.2

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,4 +1,4 @@
1
- import {getLocalApiKey,getDevFlowStateRoot,resolveRuntimeEndpoint,acquireRuntimeHttpCircuit,registerRuntimeHttpSuccess,registerRuntimeHttpFailure}from'@devflow-tools/sdk';import {existsSync,readdirSync,readFileSync,unlinkSync,mkdirSync,writeFileSync}from'fs';import {join as join$1}from'path';import {openGlobalDevFlowDatabase}from'@devflow-tools/database';import {request}from'node:http';import {existsSync as existsSync$1,mkdirSync as mkdirSync$1,appendFileSync}from'node:fs';import {join}from'node:path';import {MemoryGate}from'@devflow-tools/memory-engine';import {createHash}from'node:crypto';function b(s){return s??process.env.CLAUDE_PROJECT_DIR??process.cwd()}function p(s,r,e){try{let t=openGlobalDevFlowDatabase();try{t.insertEvent({kind:s,timestamp:Date.now(),duration:e,success:r.success!==!1,metadata:r});}finally{t.close();}}catch{}}var G=getLocalApiKey(),y=join(getDevFlowStateRoot(),"errors");async function k(s,r,e={}){let t=e.endpoint??resolveRuntimeEndpoint().url,o=e.timeout??1500,n=e.durableMirror??true,i=e.maxRetries??(n?0:2),a=e.circuitBreaker??true,c=acquireRuntimeHttpCircuit(t,s);if(a&&!c.allowed)return {delivered:false,suppressed:true,fallbackReason:c.state.fallbackReason};let d;for(let l=0;l<=i;l+=1)try{return await J(t,s,r,o),a&&registerRuntimeHttpSuccess(t,s).transitioned&&p("http_circuit_transition",{endpoint:t,path:new URL(s,t).pathname,previous:c.state.status,status:"closed",failures:0}),{delivered:!0,suppressed:!1}}catch(m){d=m instanceof Error?m:new Error(String(m)),l<i&&await W(Math.min(100*2**l,1e3));}if(!d)return {delivered:false,suppressed:false,fallbackReason:"unknown_http_failure"};if(!a)return w(s,d),{delivered:false,suppressed:false,fallbackReason:d.message};let u=registerRuntimeHttpFailure(t,s,e.fallbackReason??(n?"local_durable_mirror":"http_delivery_failed"));return u.transitioned&&(w(s,d),p("http_circuit_transition",{endpoint:t,path:new URL(s,t).pathname,previous:c.state.status,status:"open",failures:u.state.failures,openUntil:u.state.openUntil,fallbackReason:u.state.fallbackReason})),{delivered:false,suppressed:false,fallbackReason:u.state.fallbackReason}}function J(s,r,e,t){return new Promise((o,n)=>{let i=JSON.stringify(e),a=new URL(r,s),c=false,d=l=>{c||(c=true,l?n(l):o());},u=request({hostname:a.hostname,port:a.port,path:a.pathname+a.search,method:"POST",headers:{"Content-Type":"application/json","X-API-Key":G,"Content-Length":Buffer.byteLength(i)},timeout:t},l=>{l.on("error",d),l.on("end",()=>{let m=l.statusCode??0;d(m>=200&&m<300?void 0:new Error(`HTTP ${m}`));}),l.resume();});u.on("error",d),u.on("timeout",()=>u.destroy(new Error(`HTTP mirror timed out after ${t}ms`))),u.write(i),u.end();})}function w(s,r){try{existsSync$1(y)||mkdirSync$1(y,{recursive:!0}),appendFileSync(join(y,"http-errors.log"),`${new Date().toISOString()} | ${s} | ${r.message}
2
- `);}catch{}}function W(s){return new Promise(r=>setTimeout(r,s))}var C=1e4,z=3e4,f=500,h=class{constructor(r){this.retryScheduled=false;this.metricAggregationScheduled=false;this.apiUrl=r?.apiUrl,this.cacheDir=r?.cacheDir??join$1(getDevFlowStateRoot(),"global","telemetry-cache"),this.database=r?.database??null,this.ownsDatabase=!r?.database;let e=r?.busyTimeoutMs??Number(process.env.DEVFLOW_TELEMETRY_DB_BUSY_TIMEOUT_MS);this.busyTimeoutMs=Number.isSafeInteger(e)&&e>=0?e:100;}async sendEvent(r){let e={...r,input:this.truncateInput(r.input)};return this.commitOrCache("tool_call",e)?(this.postHttp("/api/telemetry/tool-call",e),r.eventId):null}async sendExecutionStart(r,e,t,o,n=process.env.CLAUDE_PROJECT_DIR??process.cwd(),i=[]){let a={executionId:r,sessionId:e,skillName:t,startedAt:o,projectRoot:n,requiredMcpTools:i};this.commitOrCache("execution_start",a)&&this.postHttp("/api/telemetry/skill-execution/start",a);}async sendExecutionComplete(r,e="completed",t=Date.now(),o){let n={executionId:r,status:e,finishedAt:t,metadata:o},i=this.commitOrCache("execution_complete",n);return i&&this.postHttp("/api/telemetry/skill-execution/complete-reconciled",n),i}async sendSessionStart(r,e,t){let o={id:r,projectRoot:e,startedAt:t,label:e.split("/").pop()??"unknown"},n=this.commitOrCache("session_start",o);return n&&this.postHttp("/api/telemetry/sessions",o),n}async completeEvent(r){let e=this.commitOrCache("complete_event",r);return e&&(this.postHttp("/api/telemetry/tool-call/output",r),this.scheduleMetricAggregation()),e}async endSession(r,e=Date.now()){let t={sessionId:r,finishedAt:e},o=this.commitOrCache("session_end",t);return o&&(this.getDatabase().aggregatePendingToolMetrics(),this.postHttp(`/api/telemetry/sessions/${encodeURIComponent(r)}/close`,{finishedAt:e})),o}async flushCache(){try{let e=this.getDatabase(),t=e.listTelemetryFailures({unresolvedOnly:!0,limit:f}).reverse();for(let o of t)try{this.applyOperation(o.operation,o.payload),e.resolveTelemetryFailure(o.id);}catch{}e.trimTelemetryFailures(f);}catch{}let r=(existsSync(this.cacheDir)?readdirSync(this.cacheDir):[]).filter(e=>e.endsWith(".json")).map(e=>{let t=join$1(this.cacheDir,e);try{return {cacheFile:t,envelope:Z(JSON.parse(readFileSync(t,"utf8")))}}catch{return null}}).filter(e=>e!==null).sort((e,t)=>e.envelope.timestamp-t.envelope.timestamp||O(e.envelope.operation)-O(t.envelope.operation));for(let{cacheFile:e,envelope:t}of r)try{let o=this.getDatabase();o.insertTelemetryFailure({id:t.id,operation:t.operation,payload:t.payload,error:t.failure,createdAt:t.timestamp}),this.applyOperation(t.operation,t.payload),o.resolveTelemetryFailure(t.id),unlinkSync(e);}catch{}this.database?.aggregatePendingToolMetrics();}aggregateMetrics(){return this.getDatabase().aggregatePendingToolMetrics()}async flushAndAggregate(){await this.flushCache(),this.aggregateMetrics();}close(){this.ownsDatabase&&this.database?.close(),this.database=null;}getDatabase(){return this.database??=openGlobalDevFlowDatabase(void 0,{busyTimeoutMs:this.busyTimeoutMs}),this.database}commitOrCache(r,e){try{return this.applyOperation(r,e),!0}catch(t){return this.cacheOperation(r,e,t),false}}applyOperation(r,e){let t=this.getDatabase();switch(r){case "tool_call":this.ensureParentSession(t,e),t.insertToolCallEvent(e);return;case "execution_start":this.ensureParentSession(t,e),t.insertSkillExecution({executionId:e.executionId,sessionId:e.sessionId,skillName:e.skillName,startedAt:e.startedAt,status:"running",requiredMcpTools:e.requiredMcpTools});return;case "execution_complete":t.reconcileSkillExecution(e.executionId,e.status,e.finishedAt,e.metadata);return;case "session_start":t.ensureSession(e),t.insertRun({id:x(e.id),source:"hook",tool:"session",input:{projectRoot:e.projectRoot},status:"active",startedAt:e.startedAt,tokenUsed:0,metadata:{sessionId:e.id,projectRoot:e.projectRoot}});return;case "complete_event":if(!t.updateToolCallEvent(e.eventId,{output:e.output===void 0?void 0:JSON.stringify(e.output),error:e.error,failureCategory:e.failureCategory,duration:e.duration}))throw new Error(`Tool call event ${e.eventId} is not available for completion`);return;case "session_end":t.closeSession(e.sessionId,e.finishedAt),t.updateRun(x(e.sessionId),{status:"completed",finishedAt:e.finishedAt});return}}ensureParentSession(r,e){let t=typeof e.sessionId=="string"?e.sessionId.trim():"";if(!t)throw new Error("Canonical session ID is required for telemetry");let o=typeof e.projectRoot=="string"&&e.projectRoot.trim()?e.projectRoot:typeof e.input?.projectRoot=="string"&&e.input.projectRoot.trim()?e.input.projectRoot:process.env.CLAUDE_PROJECT_DIR??"unknown";r.ensureSession({id:t,projectRoot:o,label:o==="unknown"?void 0:o.split("/").pop(),startedAt:Number(e.startedAt??e.timestamp??Date.now())});}cacheOperation(r,e,t){let o=Date.now(),n={id:`failure:${o}:${Math.random().toString(36).slice(2,11)}`,operation:r,payload:e,failure:t instanceof Error?t.message:String(t),timestamp:o};try{let i=this.getDatabase();i.insertTelemetryFailure({id:n.id,operation:r,payload:e,error:n.failure,createdAt:o}),i.trimTelemetryFailures(f),this.scheduleRetry();return}catch{}try{existsSync(this.cacheDir)||mkdirSync(this.cacheDir,{recursive:!0});let i=join$1(this.cacheDir,`${o}_${Math.random().toString(36).slice(2,11)}.json`);writeFileSync(i,JSON.stringify(n,null,2),{mode:384}),this.trimRetryCache(),this.scheduleRetry();}catch{}}trimRetryCache(){try{let r=readdirSync(this.cacheDir).filter(e=>e.endsWith(".json")).sort();for(let e of r.slice(0,Math.max(0,r.length-f)))unlinkSync(join$1(this.cacheDir,e));}catch{}}scheduleRetry(){this.retryScheduled||(this.retryScheduled=true,setTimeout(()=>{this.retryScheduled=false,this.flushCache();},z).unref());}scheduleMetricAggregation(){if(this.metricAggregationScheduled||process.env.DEVFLOW_HOOK_DEGRADED==="1")return;this.metricAggregationScheduled=true,setTimeout(()=>{this.metricAggregationScheduled=false;try{this.getDatabase().aggregatePendingToolMetrics(50)===50&&this.scheduleMetricAggregation();}catch{}},25).unref();}postHttp(r,e){k(r,e,{endpoint:this.apiUrl,fallbackReason:"telemetry_already_committed_locally"});}truncateInput(r){let e=JSON.stringify(r);return e===void 0||e.length<=C?r:{_truncated:true,_original_size:e.length,_preview:`${e.substring(0,C)}...`}}};function O(s){return ["session_start","execution_start","tool_call","complete_event","execution_complete","session_end"].indexOf(s)}function x(s){return `hook-run:${s}`}function Z(s){if(!s||typeof s!="object")throw new Error("Invalid telemetry cache envelope");let r=s;if(typeof r.id!="string"||typeof r.operation!="string"||r.payload===void 0||typeof r.failure!="string"||typeof r.timestamp!="number")throw new Error("Invalid telemetry cache envelope");return r}async function M(s){let r=!s.memory,e=s.memory??new MemoryGate(s.projectRoot),t=0,o=0;try{await e.forceWarmUp(),s.trigger==="session_end"&&(t=await e.releasePendingDistillLeases(s.sessionId)),o=e.getPendingEventCount(s.sessionId,s.trigger!=="session_end");}finally{r&&e.close();}let n=Date.now(),i=s.trigger==="session_end"&&s.sessionId?`distill:session_end:${createHash("sha256").update(`${s.projectRoot}\0${s.sessionId}`).digest("hex").slice(0,24)}`:`distill:${n}:${Math.random().toString(36).slice(2,10)}`,a={id:i,pendingEvents:o,releasedLeases:t,trigger:s.trigger,sessionId:s.sessionId,details:s.details};try{let c=openGlobalDevFlowDatabase();try{c.recordMemoryDistillCheckpoint({id:i,projectRoot:s.projectRoot,sessionId:s.sessionId,trigger:s.trigger,pendingEvents:o,releasedLeases:t,details:s.details,createdAt:n}),c.insertEvent({kind:"memory_distill_requested",timestamp:n,success:!0,metadata:{...a,projectRoot:s.projectRoot}});}finally{c.close();}}catch(c){if(s.strictPersistence)throw c}return a}function P(s){if(s.pendingEvents===0)return "";let r=s.sessionId?`\uFF0CsessionId=${s.sessionId}`:"";return `Memory distill checkpoint: ${s.pendingEvents} \u4E2A\u4E8B\u4EF6\u5F85\u63D0\u70BC${r}\u3002\u4E0A\u4E0B\u6587\u538B\u7F29\u5B8C\u6210\u540E\uFF0C\u8C03\u7528 mcp__devflow__memory_request_distill\uFF1B\u6309\u8FD4\u56DE\u7684 nextPage \u5206\u9875\u8BFB\u53D6\u5168\u90E8\u4E8B\u4EF6\uFF0C\u63D0\u70BC observations\uFF0C\u518D\u8C03\u7528 mcp__devflow__memory_save_distilled \u5E76\u786E\u8BA4\u4FDD\u5B58\u7ED3\u679C\u3002`}var A="WARNING: DevFlow is in degraded mode (daemon unreachable): 4-Gate enforcement and memory prefetch cache are unavailable. Run `devflow doctor` for details.";function F(){return process.env.DEVFLOW_HOOK_DEGRADED==="1"}async function re(s="",r=b()){let e;try{let i=JSON.parse(s);typeof i.session_id=="string"&&i.session_id.trim()&&(e=i.session_id.trim());}catch{}let t=new h;try{await t.flushAndAggregate();}finally{t.close();}let o=await M({projectRoot:r,sessionId:e,trigger:"pre_compact"}),n=[F()?A:"",P(o)].filter(Boolean).join(`
1
+ import {getLocalApiKey,getDevFlowStateRoot,resolveRuntimeEndpoint,acquireRuntimeHttpCircuit,registerRuntimeHttpSuccess,registerRuntimeHttpFailure}from'@devflow-tools/sdk';import {existsSync,readdirSync,readFileSync,unlinkSync,mkdirSync,writeFileSync}from'fs';import {join as join$1}from'path';import {openGlobalDevFlowDatabase}from'@devflow-tools/database';import {request}from'node:http';import {existsSync as existsSync$1,mkdirSync as mkdirSync$1,appendFileSync}from'node:fs';import {join}from'node:path';import {rotateDiagnosticLogFile}from'@devflow-tools/telemetry';import {MemoryGate}from'@devflow-tools/memory-engine';import {createHash}from'node:crypto';function b(s){return s??process.env.CLAUDE_PROJECT_DIR??process.cwd()}function p(s,r,e){try{let t=openGlobalDevFlowDatabase();try{t.insertEvent({kind:s,timestamp:Date.now(),duration:e,success:r.success!==!1,metadata:r});}finally{t.close();}}catch{}}var J=getLocalApiKey(),y=join(getDevFlowStateRoot(),"errors");async function k(s,r,e={}){let t=e.endpoint??resolveRuntimeEndpoint().url,o=e.timeout??1500,n=e.durableMirror??true,i=e.maxRetries??(n?0:2),a=e.circuitBreaker??true,c=acquireRuntimeHttpCircuit(t,s);if(a&&!c.allowed)return {delivered:false,suppressed:true,fallbackReason:c.state.fallbackReason};let d;for(let l=0;l<=i;l+=1)try{return await W(t,s,r,o),a&&registerRuntimeHttpSuccess(t,s).transitioned&&p("http_circuit_transition",{endpoint:t,path:new URL(s,t).pathname,previous:c.state.status,status:"closed",failures:0}),{delivered:!0,suppressed:!1}}catch(m){d=m instanceof Error?m:new Error(String(m)),l<i&&await B(Math.min(100*2**l,1e3));}if(!d)return {delivered:false,suppressed:false,fallbackReason:"unknown_http_failure"};if(!a)return w(s,d),{delivered:false,suppressed:false,fallbackReason:d.message};let u=registerRuntimeHttpFailure(t,s,e.fallbackReason??(n?"local_durable_mirror":"http_delivery_failed"));return u.transitioned&&(w(s,d),p("http_circuit_transition",{endpoint:t,path:new URL(s,t).pathname,previous:c.state.status,status:"open",failures:u.state.failures,openUntil:u.state.openUntil,fallbackReason:u.state.fallbackReason})),{delivered:false,suppressed:false,fallbackReason:u.state.fallbackReason}}function W(s,r,e,t){return new Promise((o,n)=>{let i=JSON.stringify(e),a=new URL(r,s),c=false,d=l=>{c||(c=true,l?n(l):o());},u=request({hostname:a.hostname,port:a.port,path:a.pathname+a.search,method:"POST",headers:{"Content-Type":"application/json","X-API-Key":J,"Content-Length":Buffer.byteLength(i)},timeout:t},l=>{l.on("error",d),l.on("end",()=>{let m=l.statusCode??0;d(m>=200&&m<300?void 0:new Error(`HTTP ${m}`));}),l.resume();});u.on("error",d),u.on("timeout",()=>u.destroy(new Error(`HTTP mirror timed out after ${t}ms`))),u.write(i),u.end();})}function w(s,r){try{existsSync$1(y)||mkdirSync$1(y,{recursive:!0});let e=join(y,"http-errors.log"),t=`${new Date().toISOString()} | ${s} | ${r.message}
2
+ `;rotateDiagnosticLogFile({path:e,maxBytes:50*1024*1024,maxFiles:5,incomingBytes:Buffer.byteLength(t)}),appendFileSync(e,t);}catch{}}function B(s){return new Promise(r=>setTimeout(r,s))}var C=1e4,Z=3e4,f=500,h=class{constructor(r){this.retryScheduled=false;this.metricAggregationScheduled=false;this.apiUrl=r?.apiUrl,this.cacheDir=r?.cacheDir??join$1(getDevFlowStateRoot(),"global","telemetry-cache"),this.database=r?.database??null,this.ownsDatabase=!r?.database;let e=r?.busyTimeoutMs??Number(process.env.DEVFLOW_TELEMETRY_DB_BUSY_TIMEOUT_MS);this.busyTimeoutMs=Number.isSafeInteger(e)&&e>=0?e:100;}async sendEvent(r){let e={...r,input:this.truncateInput(r.input)};return this.commitOrCache("tool_call",e)?(this.postHttp("/api/telemetry/tool-call",e),r.eventId):null}async sendExecutionStart(r,e,t,o,n=process.env.CLAUDE_PROJECT_DIR??process.cwd(),i=[]){let a={executionId:r,sessionId:e,skillName:t,startedAt:o,projectRoot:n,requiredMcpTools:i};this.commitOrCache("execution_start",a)&&this.postHttp("/api/telemetry/skill-execution/start",a);}async sendExecutionComplete(r,e="completed",t=Date.now(),o){let n={executionId:r,status:e,finishedAt:t,metadata:o},i=this.commitOrCache("execution_complete",n);return i&&this.postHttp("/api/telemetry/skill-execution/complete-reconciled",n),i}async sendSessionStart(r,e,t){let o={id:r,projectRoot:e,startedAt:t,label:e.split("/").pop()??"unknown"},n=this.commitOrCache("session_start",o);return n&&this.postHttp("/api/telemetry/sessions",o),n}async completeEvent(r){let e=this.commitOrCache("complete_event",r);return e&&(this.postHttp("/api/telemetry/tool-call/output",r),this.scheduleMetricAggregation()),e}async endSession(r,e=Date.now()){let t={sessionId:r,finishedAt:e},o=this.commitOrCache("session_end",t);return o&&(this.getDatabase().aggregatePendingToolMetrics(),this.postHttp(`/api/telemetry/sessions/${encodeURIComponent(r)}/close`,{finishedAt:e})),o}async flushCache(){try{let e=this.getDatabase(),t=e.listTelemetryFailures({unresolvedOnly:!0,limit:f}).reverse();for(let o of t)try{this.applyOperation(o.operation,o.payload),e.resolveTelemetryFailure(o.id);}catch{}e.trimTelemetryFailures(f);}catch{}let r=(existsSync(this.cacheDir)?readdirSync(this.cacheDir):[]).filter(e=>e.endsWith(".json")).map(e=>{let t=join$1(this.cacheDir,e);try{return {cacheFile:t,envelope:Q(JSON.parse(readFileSync(t,"utf8")))}}catch{return null}}).filter(e=>e!==null).sort((e,t)=>e.envelope.timestamp-t.envelope.timestamp||O(e.envelope.operation)-O(t.envelope.operation));for(let{cacheFile:e,envelope:t}of r)try{let o=this.getDatabase();o.insertTelemetryFailure({id:t.id,operation:t.operation,payload:t.payload,error:t.failure,createdAt:t.timestamp}),this.applyOperation(t.operation,t.payload),o.resolveTelemetryFailure(t.id),unlinkSync(e);}catch{}this.database?.aggregatePendingToolMetrics();}aggregateMetrics(){return this.getDatabase().aggregatePendingToolMetrics()}async flushAndAggregate(){await this.flushCache(),this.aggregateMetrics();}close(){this.ownsDatabase&&this.database?.close(),this.database=null;}getDatabase(){return this.database??=openGlobalDevFlowDatabase(void 0,{busyTimeoutMs:this.busyTimeoutMs}),this.database}commitOrCache(r,e){try{return this.applyOperation(r,e),!0}catch(t){return this.cacheOperation(r,e,t),false}}applyOperation(r,e){let t=this.getDatabase();switch(r){case "tool_call":this.ensureParentSession(t,e),t.insertToolCallEvent(e);return;case "execution_start":this.ensureParentSession(t,e),t.insertSkillExecution({executionId:e.executionId,sessionId:e.sessionId,skillName:e.skillName,startedAt:e.startedAt,status:"running",requiredMcpTools:e.requiredMcpTools});return;case "execution_complete":t.reconcileSkillExecution(e.executionId,e.status,e.finishedAt,e.metadata);return;case "session_start":t.ensureSession(e),t.insertRun({id:x(e.id),source:"hook",tool:"session",input:{projectRoot:e.projectRoot},status:"active",startedAt:e.startedAt,tokenUsed:0,metadata:{sessionId:e.id,projectRoot:e.projectRoot}});return;case "complete_event":if(!t.updateToolCallEvent(e.eventId,{output:e.output===void 0?void 0:JSON.stringify(e.output),error:e.error,failureCategory:e.failureCategory,duration:e.duration}))throw new Error(`Tool call event ${e.eventId} is not available for completion`);return;case "session_end":t.closeSession(e.sessionId,e.finishedAt),t.updateRun(x(e.sessionId),{status:"completed",finishedAt:e.finishedAt});return}}ensureParentSession(r,e){let t=typeof e.sessionId=="string"?e.sessionId.trim():"";if(!t)throw new Error("Canonical session ID is required for telemetry");let o=typeof e.projectRoot=="string"&&e.projectRoot.trim()?e.projectRoot:typeof e.input?.projectRoot=="string"&&e.input.projectRoot.trim()?e.input.projectRoot:process.env.CLAUDE_PROJECT_DIR??"unknown";r.ensureSession({id:t,projectRoot:o,label:o==="unknown"?void 0:o.split("/").pop(),startedAt:Number(e.startedAt??e.timestamp??Date.now())});}cacheOperation(r,e,t){let o=Date.now(),n={id:`failure:${o}:${Math.random().toString(36).slice(2,11)}`,operation:r,payload:e,failure:t instanceof Error?t.message:String(t),timestamp:o};try{let i=this.getDatabase();i.insertTelemetryFailure({id:n.id,operation:r,payload:e,error:n.failure,createdAt:o}),i.trimTelemetryFailures(f),this.scheduleRetry();return}catch{}try{existsSync(this.cacheDir)||mkdirSync(this.cacheDir,{recursive:!0});let i=join$1(this.cacheDir,`${o}_${Math.random().toString(36).slice(2,11)}.json`);writeFileSync(i,JSON.stringify(n,null,2),{mode:384}),this.trimRetryCache(),this.scheduleRetry();}catch{}}trimRetryCache(){try{let r=readdirSync(this.cacheDir).filter(e=>e.endsWith(".json")).sort();for(let e of r.slice(0,Math.max(0,r.length-f)))unlinkSync(join$1(this.cacheDir,e));}catch{}}scheduleRetry(){this.retryScheduled||(this.retryScheduled=true,setTimeout(()=>{this.retryScheduled=false,this.flushCache();},Z).unref());}scheduleMetricAggregation(){if(this.metricAggregationScheduled||process.env.DEVFLOW_HOOK_DEGRADED==="1")return;this.metricAggregationScheduled=true,setTimeout(()=>{this.metricAggregationScheduled=false;try{this.getDatabase().aggregatePendingToolMetrics(50)===50&&this.scheduleMetricAggregation();}catch{}},25).unref();}postHttp(r,e){k(r,e,{endpoint:this.apiUrl,fallbackReason:"telemetry_already_committed_locally"});}truncateInput(r){let e=JSON.stringify(r);return e===void 0||e.length<=C?r:{_truncated:true,_original_size:e.length,_preview:`${e.substring(0,C)}...`}}};function O(s){return ["session_start","execution_start","tool_call","complete_event","execution_complete","session_end"].indexOf(s)}function x(s){return `hook-run:${s}`}function Q(s){if(!s||typeof s!="object")throw new Error("Invalid telemetry cache envelope");let r=s;if(typeof r.id!="string"||typeof r.operation!="string"||r.payload===void 0||typeof r.failure!="string"||typeof r.timestamp!="number")throw new Error("Invalid telemetry cache envelope");return r}async function M(s){let r=!s.memory,e=s.memory??new MemoryGate(s.projectRoot),t=0,o=0;try{await e.forceWarmUp(),s.trigger==="session_end"&&(t=await e.releasePendingDistillLeases(s.sessionId)),o=e.getPendingEventCount(s.sessionId,s.trigger!=="session_end");}finally{r&&e.close();}let n=Date.now(),i=s.trigger==="session_end"&&s.sessionId?`distill:session_end:${createHash("sha256").update(`${s.projectRoot}\0${s.sessionId}`).digest("hex").slice(0,24)}`:`distill:${n}:${Math.random().toString(36).slice(2,10)}`,a={id:i,pendingEvents:o,releasedLeases:t,trigger:s.trigger,sessionId:s.sessionId,details:s.details};try{let c=openGlobalDevFlowDatabase();try{c.recordMemoryDistillCheckpoint({id:i,projectRoot:s.projectRoot,sessionId:s.sessionId,trigger:s.trigger,pendingEvents:o,releasedLeases:t,details:s.details,createdAt:n}),c.insertEvent({kind:"memory_distill_requested",timestamp:n,success:!0,metadata:{...a,projectRoot:s.projectRoot}});}finally{c.close();}}catch(c){if(s.strictPersistence)throw c}return a}function P(s){if(s.pendingEvents===0)return "";let r=s.sessionId?`\uFF0CsessionId=${s.sessionId}`:"";return `Memory distill checkpoint: ${s.pendingEvents} \u4E2A\u4E8B\u4EF6\u5F85\u63D0\u70BC${r}\u3002\u4E0A\u4E0B\u6587\u538B\u7F29\u5B8C\u6210\u540E\uFF0C\u8C03\u7528 mcp__devflow__memory_request_distill\uFF1B\u6309\u8FD4\u56DE\u7684 nextPage \u5206\u9875\u8BFB\u53D6\u5168\u90E8\u4E8B\u4EF6\uFF0C\u63D0\u70BC observations\uFF0C\u518D\u8C03\u7528 mcp__devflow__memory_save_distilled \u5E76\u786E\u8BA4\u4FDD\u5B58\u7ED3\u679C\u3002`}var A="WARNING: DevFlow is in degraded mode (daemon unreachable): 4-Gate enforcement and memory prefetch cache are unavailable. Run `devflow doctor` for details.";function F(){return process.env.DEVFLOW_HOOK_DEGRADED==="1"}async function se(s="",r=b()){let e;try{let i=JSON.parse(s);typeof i.session_id=="string"&&i.session_id.trim()&&(e=i.session_id.trim());}catch{}let t=new h;try{await t.flushAndAggregate();}finally{t.close();}let o=await M({projectRoot:r,sessionId:e,trigger:"pre_compact"}),n=[F()?A:"",P(o)].filter(Boolean).join(`
3
3
 
4
- `);return {hookSpecificOutput:{hookEventName:"PreCompact",...n?{additionalContext:n}:{}}}}if(process.argv[1]?.endsWith("pre-compact")||process.argv[1]?.endsWith("pre-compact.js")){let s=console.log,r=console.info,e=()=>{console.log=s,console.info=r;};console.log=console.error.bind(console),console.info=console.error.bind(console);let t="";process.stdin.setEncoding("utf8"),process.stdin.on("data",o=>{t+=o;}),process.stdin.on("end",()=>{re(t.trim()||process.argv[2]||"").then(o=>{e(),s(JSON.stringify(o)),process.exit(0);}).catch(()=>{e(),process.exit(0);});}),process.stdin.on("error",()=>{e(),process.exit(0);}),setTimeout(()=>process.exit(0),14e3).unref();}export{re as handlePreCompact};
4
+ `);return {hookSpecificOutput:{hookEventName:"PreCompact",...n?{additionalContext:n}:{}}}}if(process.argv[1]?.endsWith("pre-compact")||process.argv[1]?.endsWith("pre-compact.js")){let s=console.log,r=console.info,e=()=>{console.log=s,console.info=r;};console.log=console.error.bind(console),console.info=console.error.bind(console);let t="";process.stdin.setEncoding("utf8"),process.stdin.on("data",o=>{t+=o;}),process.stdin.on("end",()=>{se(t.trim()||process.argv[2]||"").then(o=>{e(),s(JSON.stringify(o)),process.exit(0);}).catch(()=>{e(),process.exit(0);});}),process.stdin.on("error",()=>{e(),process.exit(0);}),setTimeout(()=>process.exit(0),14e3).unref();}export{se as handlePreCompact};
@@ -1,4 +1,4 @@
1
- import {existsSync,readdirSync,readFileSync,unlinkSync,mkdirSync,writeFileSync,rmSync,linkSync,renameSync}from'fs';import {join as join$1,dirname as dirname$1}from'path';import {openGlobalDevFlowDatabase}from'@devflow-tools/database';import {getLocalApiKey,getDevFlowStateRoot,resolveRuntimeEndpoint,acquireRuntimeHttpCircuit,registerRuntimeHttpSuccess,registerRuntimeHttpFailure,getProjectStateDir}from'@devflow-tools/sdk';import {request}from'node:http';import {mkdirSync as mkdirSync$1,existsSync as existsSync$1,statSync,appendFileSync,chmodSync,readFileSync as readFileSync$1,rmSync as rmSync$1,renameSync as renameSync$1,writeFileSync as writeFileSync$1}from'node:fs';import {join,resolve,basename,relative,sep,dirname,isAbsolute,normalize}from'node:path';import {fileURLToPath}from'url';import {emitSemanticControlLog}from'@devflow-tools/telemetry';import {createHash as createHash$1}from'node:crypto';import {homedir}from'node:os';import {randomUUID,createHash}from'crypto';function D(n,t,e){try{let o=openGlobalDevFlowDatabase();try{o.insertEvent({kind:n,timestamp:Date.now(),duration:e,success:t.success!==!1,metadata:t});}finally{o.close();}}catch{}}var ot=getLocalApiKey(),L=join(getDevFlowStateRoot(),"errors");async function te(n,t,e={}){let o=e.endpoint??resolveRuntimeEndpoint().url,r=e.timeout??1500,i=e.durableMirror??true,s=e.maxRetries??(i?0:2),a=e.circuitBreaker??true,l=acquireRuntimeHttpCircuit(o,n);if(a&&!l.allowed)return {delivered:false,suppressed:true,fallbackReason:l.state.fallbackReason};let c;for(let u=0;u<=s;u+=1)try{return await rt(o,n,t,r),a&&registerRuntimeHttpSuccess(o,n).transitioned&&D("http_circuit_transition",{endpoint:o,path:new URL(n,o).pathname,previous:l.state.status,status:"closed",failures:0}),{delivered:!0,suppressed:!1}}catch(p){c=p instanceof Error?p:new Error(String(p)),u<s&&await it(Math.min(100*2**u,1e3));}if(!c)return {delivered:false,suppressed:false,fallbackReason:"unknown_http_failure"};if(!a)return Z(n,c),{delivered:false,suppressed:false,fallbackReason:c.message};let d=registerRuntimeHttpFailure(o,n,e.fallbackReason??(i?"local_durable_mirror":"http_delivery_failed"));return d.transitioned&&(Z(n,c),D("http_circuit_transition",{endpoint:o,path:new URL(n,o).pathname,previous:l.state.status,status:"open",failures:d.state.failures,openUntil:d.state.openUntil,fallbackReason:d.state.fallbackReason})),{delivered:false,suppressed:false,fallbackReason:d.state.fallbackReason}}function rt(n,t,e,o){return new Promise((r,i)=>{let s=JSON.stringify(e),a=new URL(t,n),l=false,c=u=>{l||(l=true,u?i(u):r());},d=request({hostname:a.hostname,port:a.port,path:a.pathname+a.search,method:"POST",headers:{"Content-Type":"application/json","X-API-Key":ot,"Content-Length":Buffer.byteLength(s)},timeout:o},u=>{u.on("error",c),u.on("end",()=>{let p=u.statusCode??0;c(p>=200&&p<300?void 0:new Error(`HTTP ${p}`));}),u.resume();});d.on("error",c),d.on("timeout",()=>d.destroy(new Error(`HTTP mirror timed out after ${o}ms`))),d.write(s),d.end();})}function Z(n,t){try{existsSync$1(L)||mkdirSync$1(L,{recursive:!0}),appendFileSync(join(L,"http-errors.log"),`${new Date().toISOString()} | ${n} | ${t.message}
2
- `);}catch{}}function it(n){return new Promise(t=>setTimeout(t,n))}var ie=1e4,ut=3e4,k=500,O=class{constructor(t){this.retryScheduled=false;this.metricAggregationScheduled=false;this.apiUrl=t?.apiUrl,this.cacheDir=t?.cacheDir??join$1(getDevFlowStateRoot(),"global","telemetry-cache"),this.database=t?.database??null,this.ownsDatabase=!t?.database;let e=t?.busyTimeoutMs??Number(process.env.DEVFLOW_TELEMETRY_DB_BUSY_TIMEOUT_MS);this.busyTimeoutMs=Number.isSafeInteger(e)&&e>=0?e:100;}async sendEvent(t){let e={...t,input:this.truncateInput(t.input)};return this.commitOrCache("tool_call",e)?(this.postHttp("/api/telemetry/tool-call",e),t.eventId):null}async sendExecutionStart(t,e,o,r,i=process.env.CLAUDE_PROJECT_DIR??process.cwd(),s=[]){let a={executionId:t,sessionId:e,skillName:o,startedAt:r,projectRoot:i,requiredMcpTools:s};this.commitOrCache("execution_start",a)&&this.postHttp("/api/telemetry/skill-execution/start",a);}async sendExecutionComplete(t,e="completed",o=Date.now(),r){let i={executionId:t,status:e,finishedAt:o,metadata:r},s=this.commitOrCache("execution_complete",i);return s&&this.postHttp("/api/telemetry/skill-execution/complete-reconciled",i),s}async sendSessionStart(t,e,o){let r={id:t,projectRoot:e,startedAt:o,label:e.split("/").pop()??"unknown"},i=this.commitOrCache("session_start",r);return i&&this.postHttp("/api/telemetry/sessions",r),i}async completeEvent(t){let e=this.commitOrCache("complete_event",t);return e&&(this.postHttp("/api/telemetry/tool-call/output",t),this.scheduleMetricAggregation()),e}async endSession(t,e=Date.now()){let o={sessionId:t,finishedAt:e},r=this.commitOrCache("session_end",o);return r&&(this.getDatabase().aggregatePendingToolMetrics(),this.postHttp(`/api/telemetry/sessions/${encodeURIComponent(t)}/close`,{finishedAt:e})),r}async flushCache(){try{let e=this.getDatabase(),o=e.listTelemetryFailures({unresolvedOnly:!0,limit:k}).reverse();for(let r of o)try{this.applyOperation(r.operation,r.payload),e.resolveTelemetryFailure(r.id);}catch{}e.trimTelemetryFailures(k);}catch{}let t=(existsSync(this.cacheDir)?readdirSync(this.cacheDir):[]).filter(e=>e.endsWith(".json")).map(e=>{let o=join$1(this.cacheDir,e);try{return {cacheFile:o,envelope:pt(JSON.parse(readFileSync(o,"utf8")))}}catch{return null}}).filter(e=>e!==null).sort((e,o)=>e.envelope.timestamp-o.envelope.timestamp||se(e.envelope.operation)-se(o.envelope.operation));for(let{cacheFile:e,envelope:o}of t)try{let r=this.getDatabase();r.insertTelemetryFailure({id:o.id,operation:o.operation,payload:o.payload,error:o.failure,createdAt:o.timestamp}),this.applyOperation(o.operation,o.payload),r.resolveTelemetryFailure(o.id),unlinkSync(e);}catch{}this.database?.aggregatePendingToolMetrics();}aggregateMetrics(){return this.getDatabase().aggregatePendingToolMetrics()}async flushAndAggregate(){await this.flushCache(),this.aggregateMetrics();}close(){this.ownsDatabase&&this.database?.close(),this.database=null;}getDatabase(){return this.database??=openGlobalDevFlowDatabase(void 0,{busyTimeoutMs:this.busyTimeoutMs}),this.database}commitOrCache(t,e){try{return this.applyOperation(t,e),!0}catch(o){return this.cacheOperation(t,e,o),false}}applyOperation(t,e){let o=this.getDatabase();switch(t){case "tool_call":this.ensureParentSession(o,e),o.insertToolCallEvent(e);return;case "execution_start":this.ensureParentSession(o,e),o.insertSkillExecution({executionId:e.executionId,sessionId:e.sessionId,skillName:e.skillName,startedAt:e.startedAt,status:"running",requiredMcpTools:e.requiredMcpTools});return;case "execution_complete":o.reconcileSkillExecution(e.executionId,e.status,e.finishedAt,e.metadata);return;case "session_start":o.ensureSession(e),o.insertRun({id:ae(e.id),source:"hook",tool:"session",input:{projectRoot:e.projectRoot},status:"active",startedAt:e.startedAt,tokenUsed:0,metadata:{sessionId:e.id,projectRoot:e.projectRoot}});return;case "complete_event":if(!o.updateToolCallEvent(e.eventId,{output:e.output===void 0?void 0:JSON.stringify(e.output),error:e.error,failureCategory:e.failureCategory,duration:e.duration}))throw new Error(`Tool call event ${e.eventId} is not available for completion`);return;case "session_end":o.closeSession(e.sessionId,e.finishedAt),o.updateRun(ae(e.sessionId),{status:"completed",finishedAt:e.finishedAt});return}}ensureParentSession(t,e){let o=typeof e.sessionId=="string"?e.sessionId.trim():"";if(!o)throw new Error("Canonical session ID is required for telemetry");let r=typeof e.projectRoot=="string"&&e.projectRoot.trim()?e.projectRoot:typeof e.input?.projectRoot=="string"&&e.input.projectRoot.trim()?e.input.projectRoot:process.env.CLAUDE_PROJECT_DIR??"unknown";t.ensureSession({id:o,projectRoot:r,label:r==="unknown"?void 0:r.split("/").pop(),startedAt:Number(e.startedAt??e.timestamp??Date.now())});}cacheOperation(t,e,o){let r=Date.now(),i={id:`failure:${r}:${Math.random().toString(36).slice(2,11)}`,operation:t,payload:e,failure:o instanceof Error?o.message:String(o),timestamp:r};try{let s=this.getDatabase();s.insertTelemetryFailure({id:i.id,operation:t,payload:e,error:i.failure,createdAt:r}),s.trimTelemetryFailures(k),this.scheduleRetry();return}catch{}try{existsSync(this.cacheDir)||mkdirSync(this.cacheDir,{recursive:!0});let s=join$1(this.cacheDir,`${r}_${Math.random().toString(36).slice(2,11)}.json`);writeFileSync(s,JSON.stringify(i,null,2),{mode:384}),this.trimRetryCache(),this.scheduleRetry();}catch{}}trimRetryCache(){try{let t=readdirSync(this.cacheDir).filter(e=>e.endsWith(".json")).sort();for(let e of t.slice(0,Math.max(0,t.length-k)))unlinkSync(join$1(this.cacheDir,e));}catch{}}scheduleRetry(){this.retryScheduled||(this.retryScheduled=true,setTimeout(()=>{this.retryScheduled=false,this.flushCache();},ut).unref());}scheduleMetricAggregation(){if(this.metricAggregationScheduled||process.env.DEVFLOW_HOOK_DEGRADED==="1")return;this.metricAggregationScheduled=true,setTimeout(()=>{this.metricAggregationScheduled=false;try{this.getDatabase().aggregatePendingToolMetrics(50)===50&&this.scheduleMetricAggregation();}catch{}},25).unref();}postHttp(t,e){te(t,e,{endpoint:this.apiUrl,fallbackReason:"telemetry_already_committed_locally"});}truncateInput(t){let e=JSON.stringify(t);return e===void 0||e.length<=ie?t:{_truncated:true,_original_size:e.length,_preview:`${e.substring(0,ie)}...`}}};function se(n){return ["session_start","execution_start","tool_call","complete_event","execution_complete","session_end"].indexOf(n)}function ae(n){return `hook-run:${n}`}function pt(n){if(!n||typeof n!="object")throw new Error("Invalid telemetry cache envelope");let t=n;if(typeof t.id!="string"||typeof t.operation!="string"||t.payload===void 0||typeof t.failure!="string"||typeof t.timestamp!="number")throw new Error("Invalid telemetry cache envelope");return t}function $(n){return n??process.env.CLAUDE_PROJECT_DIR??process.cwd()}function f(n){return getProjectStateDir($(n))}var m=emitSemanticControlLog;var bt=2,_t=1;function Rt(){if(process.env.CLAUDE_PLUGIN_ROOT)return process.env.CLAUDE_PLUGIN_ROOT;try{return join$1(dirname$1(fileURLToPath(import.meta.url)),"..","..")}catch{return process.cwd()}}function ce(n=Rt()){let t=[join$1(n,"dist","command-registry.json"),join$1(n,"command-registry.json")];for(let e of t)try{if(!existsSync(e))continue;let o=JSON.parse(readFileSync(e,"utf8"));if(o.version!==bt&&o.version!==_t||!Et(o.commands)){m({event:"hook.runtime.degraded",identity:{projectRoot:process.env.CLAUDE_PROJECT_DIR||process.cwd()},level:"warn",timestamp:Date.now(),data:{stage:"command_registry",reason:"contract_mismatch",registryPath:e}});continue}return o.commands}catch(o){m({event:"hook.runtime.degraded",identity:{projectRoot:process.env.CLAUDE_PROJECT_DIR||process.cwd()},level:"warn",timestamp:Date.now(),data:{stage:"command_registry",reason:o.message,fallback:"next_registry_candidate"}});}return null}function Et(n){return !n||typeof n!="object"||Array.isArray(n)?false:Object.values(n).every(t=>{if(!t||typeof t!="object"||Array.isArray(t))return false;let e=t;return A(e.mcpTools)&&A(e.blockedNative)&&(e.source===void 0||e.source==="core"||e.source==="plugin")&&(e.requiresContext===void 0||typeof e.requiresContext=="boolean")&&(e.runtimePackages===void 0||A(e.runtimePackages))&&(e.hostTools===void 0||wt(e.hostTools))&&(e.evidenceMode===void 0||["static","runtime","mixed"].includes(e.evidenceMode))})}function wt(n){return !!n&&typeof n=="object"&&!Array.isArray(n)&&Object.entries(n).every(([t,e])=>t.length>0&&A(e))}function A(n){return Array.isArray(n)&&n.every(t=>typeof t=="string"&&t.length>0)}function le(n){let t=ce();return t?t[n]?.mcpTools??[]:[]}function C(n){if(!n||typeof n!="object"||Array.isArray(n))return {};let t=n,e={};for(let o of ["lastMcpCall","bypassCount"])if(o in t){let r=t[o];if(r==null)continue;e[o]=typeof r=="number"&&Number.isFinite(r)&&r>=0?r:0;}return e}function xt(n,t){return n.lastMcpCall===t.lastMcpCall&&n.bypassCount===t.bypassCount}function ue(n,t,e){let o=e instanceof Error?e.message:String(e);m({event:"hook.runtime.degraded",identity:{projectRoot:n},level:"warn",timestamp:Date.now(),data:{stage:"enforcement_receipt",operation:t,reason:o,fallback:"fail_open"}});}function pe(n,t,e){let o;try{o=openGlobalDevFlowDatabase(void 0,{busyTimeoutMs:250});let r={},i=o.updateHookReceipt(n,a=>(r=C(a),C(t(r)))),s=C(i);return {receipt:s,applied:!0,changed:!xt(r,s)}}catch(r){return ue(n,e,r),{receipt:{},applied:false,changed:false}}finally{try{o?.close();}catch{}}}function ge(n){let t;try{return t=openGlobalDevFlowDatabase(void 0,{busyTimeoutMs:250}),C(t.getHookReceipt(n))}catch(e){return ue(n,"update",e),{}}finally{try{t?.close();}catch{}}}function It(n,t){return pe(n,()=>t,"write").applied}function Dt(n,t){return pe(n,t,"update")}var de={Grep:"get_project_context",Glob:"get_project_context",Agent:"get_project_context",Bash:"get_project_context",WebSearch:"get_knowledge",WebFetch:"get_knowledge"},St=new Set(["Write","Edit","NotebookEdit"]),kt=new Set(["failed","timeout","unavailable"]);function Ot(n){switch(n){case "WebSearch":case "WebFetch":return 1;case "Agent":return 3;case "Grep":case "Glob":return 3;case "Bash":return 5;default:return 2}}var T=class{constructor(t,e,o){this.projectRoot=t;this.sessionId=e;this.executionId=o;}getPhase(){if(!this.sessionId||!this.executionId)return "idle";let t;try{t=openGlobalDevFlowDatabase(void 0,{busyTimeoutMs:250});let e=t.getContextReceipt(this.projectRoot,this.sessionId,this.executionId);if(e&&e.expiresAt>Date.now())return "context_ready";e&&t.deleteContextReceipt(this.projectRoot,this.sessionId,this.executionId);}catch{}finally{try{t?.close();}catch{}}return "context_gathering"}getContextReceipt(){if(!this.sessionId||!this.executionId)return null;let t;try{t=openGlobalDevFlowDatabase(void 0,{busyTimeoutMs:250});let e=t.getContextReceipt(this.projectRoot,this.sessionId,this.executionId);return e&&e.expiresAt>Date.now()?e:(e&&t.deleteContextReceipt(this.projectRoot,this.sessionId,this.executionId),null)}catch{return null}finally{try{t?.close();}catch{}}}evaluate(t,e){let o=this.getPhase();if(e||t==="Skill")return {permissionDecision:"allow"};if(o==="context_gathering"&&de[t])return {permissionDecision:"deny",reasonCode:"DEVFLOW_CONTEXT_REQUIRED",reason:`DevFlow context required. Call mcp__devflow__get_project_context, then retry ${t}.`};if(o==="context_ready"){if(St.has(t)){let l=this.evaluateRequiredAction();if(l)return l}return {permissionDecision:"allow"}}let r=de[t];if(!r)return {permissionDecision:"allow"};let i=Dt(this.projectRoot,l=>({...l,bypassCount:(l.bypassCount??0)+1}));if(!i.applied)return {permissionDecision:"allow"};let s=i.receipt.bypassCount??0,a=Ot(t);return s>=a?{permissionDecision:"allow",additionalContext:`\u5DF2 ${s} \u6B21\u76F4\u63A5\u4F7F\u7528 ${t}\uFF0C\u5EFA\u8BAE\u7528 mcp__devflow__${r} \u83B7\u53D6\u66F4\u7CBE\u786E\u7684\u4E0A\u4E0B\u6587\u3002`}:{permissionDecision:"allow"}}recordMcpCall(){It(this.projectRoot,{lastMcpCall:Math.floor(Date.now()/1e3),bypassCount:0});}recordDomainActionOutcome(t,e,o,r){if(!this.sessionId||!this.executionId)return false;let i;try{i=openGlobalDevFlowDatabase(void 0,{busyTimeoutMs:250});let s=i.getContextReceipt(this.projectRoot,this.sessionId,this.executionId);if(!s||s.expiresAt<=Date.now()||s.canonicalAction?.tool!==t)return !1;let a=Date.now(),l=r?.trim()?`${r.trim()}:${e}`:`${t}:${e}:${a}`,c=s.actionAttempts??[];return i.upsertContextReceipt({...s,actionAttempts:c.some(d=>d.id===l||r&&d.toolUseId===r&&d.status===e)?c:[...c,{id:l,tool:t,status:e,attemptedAt:a,toolUseId:r,reason:o?.slice(0,500)}].slice(-20),actionSatisfiedAt:e==="succeeded"?a:s.actionSatisfiedAt,actionDegradation:e==="succeeded"?void 0:s.actionDegradation}),!0}catch{return false}finally{try{i?.close();}catch{}}}evaluateRequiredAction(){let t=this.getContextReceipt(),e=t?.canonicalAction;if(!t||!e||!e.required||e.status!=="required")return null;let o=e.binding;if(o.requiredContextReceipt!==t.contextHash||o.projectRoot!==this.projectRoot||o.sessionId!==this.sessionId||o.requestId!==t.requestId||o.executionId&&o.executionId!==this.executionId)return {permissionDecision:"deny",reasonCode:"DEVFLOW_ACTION_BINDING_STALE",reason:"DevFlow canonical action binding is stale or mismatched. Call mcp__devflow__get_project_context again before writing."};if(t.actionSatisfiedAt)return null;if(t.actionDegradation?.authorizedByContextReceipt===t.contextHash)return {permissionDecision:"allow",additionalContext:`DevFlow degraded fallback authorized by context receipt ${t.contextHash}: ${t.actionDegradation.reason}`};let r=(t.actionAttempts??[]).filter(i=>i.tool===e.tool&&kt.has(i.status));if(r.length>0){let i=r.at(-1),s={missedTool:e.tool,failedAttemptCount:r.length,reason:`${i.status}:${i.reason??"canonical domain action did not complete"}`,authorizedByContextReceipt:t.contextHash,authorizedAt:Date.now()};return this.persistDegradation(t,s),{permissionDecision:"allow",additionalContext:`DevFlow canonical tool mcp__devflow__${e.tool} ${i.status}; degraded direct write authorized by context receipt ${t.contextHash}. Preserve the action contract and verification plan.`}}return {permissionDecision:"deny",reasonCode:"DEVFLOW_REQUIRED_ACTION",reason:`DevFlow required action not completed. Call mcp__devflow__${e.tool} using context receipt ${t.contextHash}, then retry the write. Direct fallback is allowed only after unavailable, failed, or timeout evidence.`}}persistDegradation(t,e){let o;try{o=openGlobalDevFlowDatabase(void 0,{busyTimeoutMs:250});let r=o.getContextReceipt(t.projectRoot,t.sessionId,t.executionId);if(!r||r.contextHash!==t.contextHash||r.actionDegradation)return;o.upsertContextReceipt({...r,actionDegradation:e});let i=o.getSkillExecution(t.executionId);if(!i)return;let s=i.metadata&&typeof i.metadata=="object"?i.metadata:{},a=Array.isArray(s.requiredActionDegradations)?s.requiredActionDegradations:[];o.updateSkillExecution(t.executionId,{missedMcpTools:[...new Set([...i.missedMcpTools??[],e.missedTool])],failedToolCalls:Math.max(i.failedToolCalls??0,e.failedAttemptCount),fallbackCount:(i.fallbackCount??0)+1,fallbackReasons:[...new Set([...i.fallbackReasons??[],`required_action_${e.reason}`])],metadata:{...s,requiredActionDegradations:[...a,e]}});}catch{}finally{try{o?.close();}catch{}}}};var $t=10*1024*1024,Nt=5;function Ht(n){return createHash$1("sha256").update(n).digest("hex").slice(0,16)}function he(n){return join(homedir(),".devflow","logs","hook-debug",`${Ht(n)}.jsonl`)}function ve(n,t,e={}){let o=e.maxBytes??$t,r=e.maxFiles??Nt;mkdirSync$1(dirname(n),{recursive:true,mode:448});let i=Buffer.byteLength(t),s=existsSync$1(n)?statSync(n).size:0;s>0&&s+i>o&&Ut(n,r),appendFileSync(n,t,{mode:384}),chmodSync(n,384);}function Ut(n,t){if(t<=1){rmSync$1(n,{force:true});return}rmSync$1(`${n}.${t-1}`,{force:true});for(let e=t-2;e>=1;e-=1){let o=`${n}.${e}`;existsSync$1(o)&&renameSync$1(o,`${n}.${e+1}`);}existsSync$1(n)&&renameSync$1(n,`${n}.1`);}var U="WARNING: DevFlow is in degraded mode (daemon unreachable): 4-Gate enforcement and memory prefetch cache are unavailable. Run `devflow doctor` for details.";function ye(){return process.env.DEVFLOW_HOOK_DEGRADED==="1"}function Ee(n){return Buffer.from(n,"utf8").toString("base64url")}function Vt(n,t,e){let o=t?.trim();if(o){let r=/^[a-zA-Z0-9:._-]{1,192}$/.test(o)?o:`tool-${createHash("sha256").update(o.slice(0,1024)).digest("hex").slice(0,32)}`;return `${n}:${r}`}return `${n}:legacy-${e}-${randomUUID().slice(0,8)}`}function ke(n){return `${n}:legacy-journal`}var j=class{constructor(t){this.projectRoot=t;this.sessions=new Map;this.sessionsDir=join$1(f(t),"hook-sessions");}registerSession(t){let e=t.trim();if(!e)throw new Error("session_id_required");let o=this.get(e);if(o)return o.lastActivityAt=Date.now(),this.persist(o),o;let r=Date.now(),i={sessionId:e,projectRoot:this.projectRoot,requiredMcpTools:[],evidenceObligations:[],evidenceDegradations:[],evidenceOutcomes:[],startedAt:r,lastActivityAt:r};return this.sessions.set(e,i),this.persist(i),i}startExecution(t,e,o){let r=this.registerSession(t);return (!r.executionId||r.skillName!==e)&&(r.executionId=`exec_${Date.now()}_${randomUUID().slice(0,8)}`),r.skillName=e,r.requiredMcpTools=[...new Set(o)],r.lastActivityAt=Date.now(),this.persist(r),r}bindTaskIdentity(t,e){let o=this.registerSession(t);return o.activeTurnId=e.turnId,o.activeRequestId=e.requestId,o.intentArtifactHash=e.intentArtifactHash,o.lastActivityAt=Date.now(),this.persist(o),o}get(t){let e=t.trim();if(!e)return null;let o=this.sessions.get(e);if(o)return this.replayEvidenceJournal(o),o;let r=this.snapshotPath(e);if(!existsSync(r))return null;try{let i=JSON.parse(readFileSync(r,"utf8"));return i.sessionId!==e||i.projectRoot!==this.projectRoot?null:(i.requiredMcpTools=Array.isArray(i.requiredMcpTools)?i.requiredMcpTools:[],i.evidenceObligations=we(i.evidenceObligations),i.evidenceDegradations=xe(i.evidenceDegradations),i.evidenceOutcomes=Ie(i.evidenceOutcomes),this.replayEvidenceJournal(i),this.sessions.set(e,i),i)}catch{return null}}completeExecution(t){let e=this.get(t);if(!e)return null;let o=structuredClone(e);return delete e.executionId,delete e.skillName,e.requiredMcpTools=[],e.lastActivityAt=Date.now(),this.persist(e),o}addEvidenceObligation(t,e,o=Date.now(),r){let i=this.registerSession(t),a=(r?void 0:i.evidenceObligations.find(c=>c.contractId===e.id))?.obligationId??Vt(e.id,r,o);this.appendEvidenceEvent(t,{kind:"add",obligationId:a,contractId:e.id,at:o,contract:e},`add\0${a}`),this.replayEvidenceJournal(i);let l=i.evidenceObligations.find(c=>c.obligationId===a);return l?(i.lastActivityAt=Date.now(),this.persist(i),structuredClone(l)):null}listEvidenceObligations(t){return (this.get(t)?.evidenceObligations??[]).map(e=>structuredClone(e))}markEvidenceCorrection(t,e,o,r,i=Date.now()){let s=this.get(t),a=s?.evidenceObligations.find(d=>d.obligationId===e);if(!s||!a)return null;let l=/^[a-f0-9]{64}$/.test(r)?r:"";if(!l)return null;this.appendEvidenceEvent(t,{kind:"correction",obligationId:e,contractId:a.contractId,at:i,fingerprint:l,violations:o.slice(0,16).map(d=>d.slice(0,240))},`correction\0${e}\0${l}`),this.replayEvidenceJournal(s),s.lastActivityAt=i,this.persist(s);let c=s.evidenceObligations.find(d=>d.obligationId===e);return c?structuredClone(c):null}resolveEvidenceObligation(t,e){let o=this.get(t);if(!o)return false;let r=o.evidenceObligations.find(s=>s.obligationId===e);if(!r)return false;let i=Date.now();return this.appendEvidenceEvent(t,{kind:"resolve",obligationId:e,contractId:r.contractId,at:i},`resolve\0${e}`),this.replayEvidenceJournal(o),o.lastActivityAt=i,this.persist(o),true}resolveDegradedEvidence(t,e){let o=this.get(t),r=o?.evidenceDegradations.find(s=>s.obligationId===e);if(!o||!r)return false;let i=Date.now();return this.appendEvidenceEvent(t,{kind:"resolve",obligationId:e,contractId:r.contractId,at:i},`resolve-degraded\0${e}\0${i}`),this.replayEvidenceJournal(o),o.lastActivityAt=i,this.persist(o),true}degradeEvidenceObligation(t,e,o,r=Date.now()){let i=this.get(t),s=i?.evidenceObligations.find(l=>l.obligationId===e);if(!i||!s)return false;let a=o.slice(0,240);return this.appendEvidenceEvent(t,{kind:"degrade",obligationId:e,contractId:s.contractId,at:r,reason:a},`degrade\0${e}\0${a}`),this.replayEvidenceJournal(i),i.lastActivityAt=r,this.persist(i),true}removeSession(t){let e=t.trim();e&&(this.sessions.delete(e),rmSync(this.snapshotPath(e),{force:true}),rmSync(this.evidenceJournalDir(e),{recursive:true,force:true}));}list(){return [...this.sessions.values()]}snapshotPath(t){return join$1(this.sessionsDir,`${Ee(t)}.json`)}evidenceJournalDir(t){return join$1(this.sessionsDir,"evidence-journal",Ee(t))}appendEvidenceEvent(t,e,o){let r=this.evidenceJournalDir(t);mkdirSync(r,{recursive:true,mode:448});let i=createHash("sha256").update(o).digest("hex"),s=join$1(r,`${e.kind}-${i}.json`);if(existsSync(s))return;let a=join$1(r,`.${process.pid}.${randomUUID()}.tmp`);writeFileSync(a,JSON.stringify(e),{mode:384});try{linkSync(a,s);}catch(l){if(l.code!=="EEXIST")throw l}finally{rmSync(a,{force:true});}}replayEvidenceJournal(t){t.evidenceObligations=we(t.evidenceObligations),t.evidenceDegradations=xe(t.evidenceDegradations),t.evidenceOutcomes=Ie(t.evidenceOutcomes);let e=this.evidenceJournalDir(t.sessionId);if(!existsSync(e))return;let o;try{o=readdirSync(e).filter(i=>/^(?:add|correction|resolve|degrade)-[a-f0-9]{64}\.json$/.test(i)).slice(0,4096);}catch{return}let r=o.flatMap(i=>{try{let s=readFileSync(join$1(e,i),"utf8");if(Buffer.byteLength(s,"utf8")>64*1024)return [];let a=Bt(JSON.parse(s));return a?[a]:[]}catch{return []}}).sort((i,s)=>i.at-s.at||De(i.kind)-De(s.kind));for(let i of r)this.applyEvidenceEvent(t,i);t.evidenceObligations=t.evidenceObligations.slice(-8),t.evidenceDegradations=t.evidenceDegradations.slice(-20),t.evidenceOutcomes=t.evidenceOutcomes.slice(-20);}applyEvidenceEvent(t,e){let o=t.evidenceOutcomes.find(s=>s.obligationId===e.obligationId);if(e.kind==="add"){if(o)return;let s=t.evidenceObligations.find(a=>a.obligationId===e.obligationId);s?(s.contract=e.contract,s.promptedAt=Math.min(s.promptedAt,e.at)):t.evidenceObligations.push({obligationId:e.obligationId,contractId:e.contractId,contract:e.contract,promptedAt:e.at,attempt:0,correctionRequested:false,violations:[]});return}let r=t.evidenceObligations.find(s=>s.obligationId===e.obligationId);if(e.kind==="correction"){if(!r||o||r.correctionFingerprint===e.fingerprint)return;r.attempt+=1,r.correctionRequested=true,r.correctionRequestedAt=e.at,r.correctionFingerprint=e.fingerprint,r.violations=e.violations;return}let i=r?.attempt??o?.attempt??0;if(e.kind==="resolve"&&o?.status==="degraded")t.evidenceOutcomes=t.evidenceOutcomes.filter(s=>s.obligationId!==e.obligationId),t.evidenceDegradations=t.evidenceDegradations.filter(s=>s.obligationId!==e.obligationId);else if(o)return;e.kind==="degrade"?(t.evidenceObligations=t.evidenceObligations.filter(s=>s.obligationId!==e.obligationId),t.evidenceDegradations.push({obligationId:e.obligationId,contractId:e.contractId,reason:e.reason,degradedAt:e.at,attempt:i,contract:r?.contract})):t.evidenceObligations=t.evidenceObligations.filter(s=>s.obligationId!==e.obligationId),t.evidenceOutcomes.push({obligationId:e.obligationId,contractId:e.contractId,status:e.kind==="resolve"?"resolved":"degraded",completedAt:e.at,attempt:i,...e.kind==="degrade"?{reason:e.reason}:{}});}persist(t){mkdirSync(this.sessionsDir,{recursive:true,mode:448});let e=this.snapshotPath(t.sessionId),o=`${e}.${process.pid}.${randomUUID()}.tmp`;writeFileSync(o,JSON.stringify(t),{mode:384}),renameSync(o,e);}};function we(n){return Array.isArray(n)?n.flatMap(t=>{if(!t||typeof t!="object")return [];let e=t;if(typeof e.contractId!="string"||e.contractId.length===0||e.contractId.length>128||typeof e.promptedAt!="number"||typeof e.attempt!="number"||typeof e.correctionRequested!="boolean"||!Array.isArray(e.violations)||!Oe(e.contract))return [];let o=typeof e.obligationId=="string"&&e.obligationId.length>0&&e.obligationId.length<=384?e.obligationId:ke(e.contractId),r=typeof e.correctionTranscriptHash=="string"?e.correctionTranscriptHash:void 0,i=e.correctionFingerprint??r;return i!==void 0&&!/^[a-f0-9]{64}$/.test(i)?[]:[{...e,obligationId:o,correctionFingerprint:i}]}).slice(-8):[]}function xe(n){return Array.isArray(n)?n.filter(t=>{if(!t||typeof t!="object")return false;let e=t;return typeof e.obligationId=="string"&&typeof e.contractId=="string"&&typeof e.reason=="string"&&typeof e.degradedAt=="number"&&typeof e.attempt=="number"}).slice(-20):[]}function Ie(n){return Array.isArray(n)?n.filter(t=>{if(!t||typeof t!="object")return false;let e=t;return typeof e.obligationId=="string"&&typeof e.contractId=="string"&&(e.status==="resolved"||e.status==="degraded")&&typeof e.completedAt=="number"&&typeof e.attempt=="number"&&(e.reason===void 0||typeof e.reason=="string")}).slice(-20):[]}function Bt(n){if(!n||typeof n!="object")return null;let t=n,e=t.kind;if(e!=="add"&&e!=="correction"&&e!=="resolve"&&e!=="degrade"||typeof t.contractId!="string"||t.contractId.length>128||typeof t.at!="number")return null;let r={obligationId:typeof t.obligationId=="string"&&t.obligationId.length>0&&t.obligationId.length<=384?t.obligationId:ke(t.contractId),contractId:t.contractId,at:t.at};if(e==="add")return Oe(t.contract)?{kind:e,...r,contract:t.contract}:null;if(e==="correction"){let i=typeof t.fingerprint=="string"?t.fingerprint:t.transcriptHash;return typeof i=="string"&&/^[a-f0-9]{64}$/.test(i)&&Array.isArray(t.violations)&&t.violations.every(s=>typeof s=="string"&&s.length<=240)?{kind:e,...r,fingerprint:i,violations:t.violations}:null}return e==="resolve"?{kind:e,...r}:typeof t.reason=="string"&&t.reason.length<=240?{kind:e,...r,reason:t.reason}:null}function De(n){return n==="add"?0:n==="correction"?1:2}function Oe(n){if(!n||typeof n!="object")return false;let t=n,e=t.requiredSections,o=t.prohibitedClaims;return t.version==="1.0"&&typeof t.id=="string"&&/^[a-zA-Z0-9][a-zA-Z0-9:._-]{0,127}$/.test(t.id)&&typeof t.runtimeProfilingOccurred=="boolean"&&typeof t.samplingEvidenceOccurred=="boolean"&&Array.isArray(e)&&e.length===3&&e[0]==="\u5DE5\u5177\u53D1\u73B0"&&e[1]==="\u6A21\u578B\u5047\u8BBE"&&e[2]==="\u9700\u8981\u8FD0\u884C\u65F6\u9A8C\u8BC1"&&Array.isArray(o)&&o.length<=16&&o.every(r=>typeof r=="string"&&r.length<=128)&&typeof t.canonicalReport=="string"&&Buffer.byteLength(t.canonicalReport,"utf8")<=48*1024&&!!t.correctionPolicy&&t.correctionPolicy.maxAttempts===1&&t.correctionPolicy.repeatedViolation==="fail_open"}function Ae(n){let t=n.trim().replace(/^\//,"");if(!t.startsWith("devflow:"))return null;let e=t.slice(8).replace(/^devflow-/,"");return /^[a-z0-9][a-z0-9-]*$/i.test(e)?`devflow:${e.toLowerCase()}`:null}function Ce(n,t){return t?`evt_tool_${createHash("sha256").update(`${n}\0${t}`).digest("hex").slice(0,24)}`:`evt_${Date.now()}_${Math.random().toString(36).slice(2,11)}`}var Yt=new Set(["Write","Edit","NotebookEdit"]),Te="Claude native memory writes are disabled for this project. Use DevFlow explicit memory or mcp__devflow__memory_commit_turn so a canonical receipt is created.";function Le(n){if(!Yt.has(n.toolName))return null;let t=Xt(n.toolInput);if(!t)return null;let e=Qt(t,n.projectRoot),o=resolve(n.projectRoot,".claude");if(Fe(e,o)&&basename(e).toLocaleUpperCase("en-US")==="MEMORY.MD")return Te;let r=resolve(n.home??homedir(),".claude","projects");return Fe(e,r)&&relative(r,e).split(sep).some(s=>s.toLocaleLowerCase("en-US")==="memory")?Te:null}function Xt(n){for(let t of ["file_path","notebook_path","path"]){let e=n[t];if(typeof e=="string"&&e.trim())return e.trim()}return null}function Qt(n,t){return resolve(isAbsolute(n)?n:resolve(t,n))}function Fe(n,t){let e=relative(t,n);return e===""||!e.startsWith(`..${sep}`)&&e!==".."&&!isAbsolute(e)}function Ue(n){let t=an(n.toolName,n.toolInput),e=t?cn(n.projectRoot,n.toolName,n.toolInput):void 0;if(!t||!e||!n.toolUseId)return {allowed:true};let o=dn(e),r,i=0,s,a;try{a=openGlobalDevFlowDatabase(void 0,{busyTimeoutMs:100,readonly:!0});let c=a.getActiveContextReceipt(n.projectRoot,n.sessionId,n.executionId);r=c?.contextHash,i=c?.issuedAt??0,s=c?.canonicalAction?.binding.operationTargets?.find(d=>un(n.projectRoot,d.path,e));}catch{}finally{try{a?.close();}catch{}}let l={toolUseId:n.toolUseId,sessionId:n.sessionId,executionId:n.executionId,operation:t,path:e,before:o,contextReceipt:r,observedAt:Date.now()};if(fn(n.projectRoot,l),t==="edit"||t==="write"||t==="delete"){let c=mn(n.projectRoot,e),d=c?.success&&c.operation==="delete"&&!c.after.exists&&c.completedAt>=i,u=s?.expectedState==="existing"&&!o.exists||s?.expectedState==="missing"&&o.exists||!!(s?.contentHash&&o.hash!==s.contentHash);if(d||s?.expectedState==="existing"&&!o.exists)return $e(n,l,"DEVFLOW_FILE_STATE_DELETED","The target was deleted after the active Context receipt. Refresh project context before editing or recreating it.");if(u)return $e(n,l,"DEVFLOW_FILE_STATE_STALE","The target state no longer matches the active Context receipt. Refresh project context before overwriting it.")}return qe(n,l,true),{allowed:true,pending:l}}function $e(n,t,e,o){return qe(n,t,false,e),{allowed:false,reasonCode:e,reason:o,pending:t}}function qe(n,t,e,o){m({event:"canonical.action.validated",identity:{projectRoot:n.projectRoot,sessionId:n.sessionId,executionId:n.executionId,contextReceipt:t.contextReceipt},level:e?"info":"warn",timestamp:Date.now(),data:{stage:"host_file_state_precondition",valid:e,operation:t.operation,targetPath:relative(n.projectRoot,t.path),targetExists:t.before.exists,targetHash:t.before.hash,reason:o,toolUseId:t.toolUseId}});}function an(n,t){if(n==="Read")return "read";if(n==="Edit"||n==="NotebookEdit")return "edit";if(n==="Write")return "write";if(n==="Delete"||n==="Bash"&&Je(t.command))return "delete"}function cn(n,t,e){let o=ln(e,["file_path","filePath","notebook_path","path","targetPath"])??(t==="Bash"?Je(e.command):void 0);if(!o)return;let r=isAbsolute(o)?normalize(o):resolve(n,o),i=relative(n,r);return i.startsWith("..")||isAbsolute(i)?void 0:r}function Je(n){return typeof n!="string"?void 0:/(?:^|[;&|]\s*)\s*(?:rm|unlink)\s+(?:-[A-Za-z]+\s+)*(?:--\s+)?(["']?)([^\s;&|"']+)\1/u.exec(n)?.[2]}function ln(n,t){for(let e of t){let o=n[e];if(typeof o=="string"&&o.trim())return o.trim()}}function dn(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 un(n,t,e){return (isAbsolute(t)?normalize(t):resolve(n,t))===normalize(e)}function We(n){return join(f(n),"file-state")}function Ve(n){return join(We(n),"pending.json")}function pn(n){return join(We(n),"observations.jsonl")}function gn(n){try{return JSON.parse(readFileSync$1(Ve(n),"utf8"))}catch{return {}}}function fn(n,t){let e=Ve(n);mkdirSync$1(dirname(e),{recursive:true});let o=gn(n);o[t.toolUseId]=t,hn(e,JSON.stringify(o));}function mn(n,t){try{let e=readFileSync$1(pn(n),"utf8").trim().split(`
3
- `);for(let o=e.length-1;o>=0;o-=1){let r=JSON.parse(e[o]);if(r.path===t)return r}}catch{}}function hn(n,t){let e=`${n}.${process.pid}.${Date.now()}.tmp`;writeFileSync$1(e,t,{encoding:"utf8",mode:384}),renameSync$1(e,n);}function E(){return {hookSpecificOutput:{hookEventName:"PreToolUse",permissionDecision:"allow"}}}function Be(n){return {hookSpecificOutput:{hookEventName:"PreToolUse",permissionDecision:"allow",additionalContext:n}}}function Rn(n){let t=f(n);return existsSync(t)||mkdirSync(t,{recursive:true}),t}function En(n,t,e,o,r,i){let s=join$1(Rn(n),"event-map.json"),a=[];try{existsSync(s)&&(a=JSON.parse(readFileSync(s,"utf-8")));}catch{}a.push({sessionId:t,toolName:e,toolUseId:o,eventId:r,timestamp:i}),writeFileSync(s,JSON.stringify(a));}function wn(n){switch(n){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"}}async function xn(n){let t=ye();try{if(!n||n.trim()==="")return E();let e=JSON.parse(n),o=Date.now(),r=$(),i=new O;e.tool_name.startsWith("mcp__devflow__")&&(typeof e.tool_input.projectRoot!="string"||!e.tool_input.projectRoot.trim())&&(e.tool_input.projectRoot=r);let s=e.session_id?.trim();if(!s)return Be(U);let a=new j(r),l=a.get(s)!==null;if(a.registerSession(s),l||await i.sendSessionStart(s,r,Date.now()),e.tool_name==="Skill"){let I=e.tool_input?.skill,v=I?Ae(I):null;if(v){let Ke=a.get(s)?.executionId,R=a.startExecution(s,v,le(v));R.executionId&&R.executionId!==Ke&&await i.sendExecutionStart(R.executionId,s,v,R.lastActivityAt,r,R.requiredMcpTools);}}let c=a.get(s);e.tool_name.startsWith("mcp__devflow__")&&(e.tool_input._devflow_session_id=s,e.tool_input._devflow_execution_id=c?.executionId??s,c?.activeTurnId&&(e.tool_input._devflow_turn_id=c.activeTurnId),c?.activeRequestId&&(e.tool_input._devflow_request_id=c.activeRequestId),c?.intentArtifactHash&&(e.tool_input._devflow_intent_artifact_hash=c.intentArtifactHash),c?.skillName&&(e.tool_input._devflow_active_skill=c.skillName),e.tool_use_id&&(e.tool_input._devflow_tool_use_id=e.tool_use_id));let d=e.tool_name.startsWith("mcp__"),u=d?e.tool_name.replace(/^mcp__[^_]+__/,""):void 0,p=new T(r,s,c?.executionId),z=p.getPhase(),g,w=Le({toolName:e.tool_name,toolInput:e.tool_input,projectRoot:r}),M=Ue({projectRoot:r,sessionId:s,executionId:c?.executionId,toolUseId:e.tool_use_id,toolName:e.tool_name,toolInput:e.tool_input}),h=w?{permissionDecision:"deny",reason:w}:M.allowed?p.evaluate(e.tool_name,d):{permissionDecision:"deny",reason:M.reason,reasonCode:M.reasonCode};h.permissionDecision==="deny"?g={hookSpecificOutput:{hookEventName:"PreToolUse",permissionDecision:"deny",permissionDecisionReason:h.reason??"MCP context required"}}:h.additionalContext?g=Be(h.additionalContext):g=E(),e.tool_name.startsWith("mcp__devflow__")&&(g.hookSpecificOutput.updatedInput=e.tool_input),t&&g.hookSpecificOutput.permissionDecision==="allow"&&(g.hookSpecificOutput.additionalContext=U);let ze=c?.executionId??s,_={eventId:Ce(s,e.tool_use_id),executionId:ze,sessionId:s,projectRoot:r,toolUseId:e.tool_use_id,timestamp:Date.now(),toolName:e.tool_name,toolType:d?"mcp":e.tool_name==="Agent"?"subagent":"direct",isMcpTool:d,mcpToolName:u,mcpEnforced:d&&z==="context_gathering",mcpFallback:!d&&z==="context_gathering",kind:wn(e.tool_name),input:e.tool_input,duration:0,blocked:g.hookSpecificOutput.permissionDecision==="deny",blockReason:g.hookSpecificOutput.permissionDecision==="deny"?w?"DEVFLOW_CANONICAL_MEMORY_REQUIRED":h.reasonCode??"DEVFLOW_CONTEXT_REQUIRED":void 0},x=await i.sendEvent(_);x&&!_.blocked&&En(r,s,e.tool_name,e.tool_use_id,x,_.timestamp),x&&_.blocked&&await i.completeEvent({eventId:x,sessionId:s,error:w?"DEVFLOW_CANONICAL_MEMORY_REQUIRED":h.reasonCode??"DEVFLOW_CONTEXT_REQUIRED",duration:Date.now()-_.timestamp,completedAt:Date.now()});try{let I=ge(r),v={ts:o,tool:e.tool_name,sessionId:s,skill:c?.skillName??"(none)",requiredTools:c?.requiredMcpTools??[],isMcp:d,enforce:c?.executionId!==void 0,stateless:c?.executionId===void 0&&!d&&e.tool_name!=="Skill",bypassCount:I.bypassCount??0,decision:g.hookSpecificOutput.permissionDecision,env_CLAUDE_PLUGIN_ROOT:process.env.CLAUDE_PLUGIN_ROOT??"(unset)",cwd:process.cwd()};ve(he(r),`${JSON.stringify(v)}
4
- `);}catch{}return g}catch{return E()}}if(process.argv[1]?.endsWith("pre-tool-use")||process.argv[1]?.endsWith("pre-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 xn(t);n(JSON.stringify(e));}),process.stdin.on("error",()=>{n(JSON.stringify(E())),process.exit(0);}),setTimeout(()=>{n(JSON.stringify(E())),process.exit(0);},4e3).unref();}export{xn as handlePreToolUse};
1
+ import {existsSync,readdirSync,readFileSync,unlinkSync,mkdirSync,writeFileSync,rmSync,linkSync,renameSync}from'fs';import {join as join$1,dirname as dirname$1}from'path';import {openGlobalDevFlowDatabase}from'@devflow-tools/database';import {getLocalApiKey,getDevFlowStateRoot,resolveRuntimeEndpoint,acquireRuntimeHttpCircuit,registerRuntimeHttpSuccess,registerRuntimeHttpFailure,getProjectStateDir}from'@devflow-tools/sdk';import {request}from'node:http';import {mkdirSync as mkdirSync$1,appendFileSync,chmodSync,existsSync as existsSync$1,readFileSync as readFileSync$1,writeFileSync as writeFileSync$1,renameSync as renameSync$1}from'node:fs';import {join,resolve,basename,relative,sep,dirname,isAbsolute,normalize}from'node:path';import {maybeRunDiagnosticLogCleanup,rotateDiagnosticLogFile,emitSemanticControlLog}from'@devflow-tools/telemetry';import {fileURLToPath}from'url';import {createHash as createHash$1}from'node:crypto';import {homedir}from'node:os';import {randomUUID,createHash}from'crypto';function D(n,t,e){try{let o=openGlobalDevFlowDatabase();try{o.insertEvent({kind:n,timestamp:Date.now(),duration:e,success:t.success!==!1,metadata:t});}finally{o.close();}}catch{}}var tt=getLocalApiKey(),$=join(getDevFlowStateRoot(),"errors");async function ee(n,t,e={}){let o=e.endpoint??resolveRuntimeEndpoint().url,r=e.timeout??1500,i=e.durableMirror??true,s=e.maxRetries??(i?0:2),a=e.circuitBreaker??true,l=acquireRuntimeHttpCircuit(o,n);if(a&&!l.allowed)return {delivered:false,suppressed:true,fallbackReason:l.state.fallbackReason};let c;for(let u=0;u<=s;u+=1)try{return await nt(o,n,t,r),a&&registerRuntimeHttpSuccess(o,n).transitioned&&D("http_circuit_transition",{endpoint:o,path:new URL(n,o).pathname,previous:l.state.status,status:"closed",failures:0}),{delivered:!0,suppressed:!1}}catch(p){c=p instanceof Error?p:new Error(String(p)),u<s&&await ot(Math.min(100*2**u,1e3));}if(!c)return {delivered:false,suppressed:false,fallbackReason:"unknown_http_failure"};if(!a)return Q(n,c),{delivered:false,suppressed:false,fallbackReason:c.message};let d=registerRuntimeHttpFailure(o,n,e.fallbackReason??(i?"local_durable_mirror":"http_delivery_failed"));return d.transitioned&&(Q(n,c),D("http_circuit_transition",{endpoint:o,path:new URL(n,o).pathname,previous:l.state.status,status:"open",failures:d.state.failures,openUntil:d.state.openUntil,fallbackReason:d.state.fallbackReason})),{delivered:false,suppressed:false,fallbackReason:d.state.fallbackReason}}function nt(n,t,e,o){return new Promise((r,i)=>{let s=JSON.stringify(e),a=new URL(t,n),l=false,c=u=>{l||(l=true,u?i(u):r());},d=request({hostname:a.hostname,port:a.port,path:a.pathname+a.search,method:"POST",headers:{"Content-Type":"application/json","X-API-Key":tt,"Content-Length":Buffer.byteLength(s)},timeout:o},u=>{u.on("error",c),u.on("end",()=>{let p=u.statusCode??0;c(p>=200&&p<300?void 0:new Error(`HTTP ${p}`));}),u.resume();});d.on("error",c),d.on("timeout",()=>d.destroy(new Error(`HTTP mirror timed out after ${o}ms`))),d.write(s),d.end();})}function Q(n,t){try{existsSync$1($)||mkdirSync$1($,{recursive:!0});let e=join($,"http-errors.log"),o=`${new Date().toISOString()} | ${n} | ${t.message}
2
+ `;rotateDiagnosticLogFile({path:e,maxBytes:50*1024*1024,maxFiles:5,incomingBytes:Buffer.byteLength(o)}),appendFileSync(e,o);}catch{}}function ot(n){return new Promise(t=>setTimeout(t,n))}var re=1e4,lt=3e4,S=500,O=class{constructor(t){this.retryScheduled=false;this.metricAggregationScheduled=false;this.apiUrl=t?.apiUrl,this.cacheDir=t?.cacheDir??join$1(getDevFlowStateRoot(),"global","telemetry-cache"),this.database=t?.database??null,this.ownsDatabase=!t?.database;let e=t?.busyTimeoutMs??Number(process.env.DEVFLOW_TELEMETRY_DB_BUSY_TIMEOUT_MS);this.busyTimeoutMs=Number.isSafeInteger(e)&&e>=0?e:100;}async sendEvent(t){let e={...t,input:this.truncateInput(t.input)};return this.commitOrCache("tool_call",e)?(this.postHttp("/api/telemetry/tool-call",e),t.eventId):null}async sendExecutionStart(t,e,o,r,i=process.env.CLAUDE_PROJECT_DIR??process.cwd(),s=[]){let a={executionId:t,sessionId:e,skillName:o,startedAt:r,projectRoot:i,requiredMcpTools:s};this.commitOrCache("execution_start",a)&&this.postHttp("/api/telemetry/skill-execution/start",a);}async sendExecutionComplete(t,e="completed",o=Date.now(),r){let i={executionId:t,status:e,finishedAt:o,metadata:r},s=this.commitOrCache("execution_complete",i);return s&&this.postHttp("/api/telemetry/skill-execution/complete-reconciled",i),s}async sendSessionStart(t,e,o){let r={id:t,projectRoot:e,startedAt:o,label:e.split("/").pop()??"unknown"},i=this.commitOrCache("session_start",r);return i&&this.postHttp("/api/telemetry/sessions",r),i}async completeEvent(t){let e=this.commitOrCache("complete_event",t);return e&&(this.postHttp("/api/telemetry/tool-call/output",t),this.scheduleMetricAggregation()),e}async endSession(t,e=Date.now()){let o={sessionId:t,finishedAt:e},r=this.commitOrCache("session_end",o);return r&&(this.getDatabase().aggregatePendingToolMetrics(),this.postHttp(`/api/telemetry/sessions/${encodeURIComponent(t)}/close`,{finishedAt:e})),r}async flushCache(){try{let e=this.getDatabase(),o=e.listTelemetryFailures({unresolvedOnly:!0,limit:S}).reverse();for(let r of o)try{this.applyOperation(r.operation,r.payload),e.resolveTelemetryFailure(r.id);}catch{}e.trimTelemetryFailures(S);}catch{}let t=(existsSync(this.cacheDir)?readdirSync(this.cacheDir):[]).filter(e=>e.endsWith(".json")).map(e=>{let o=join$1(this.cacheDir,e);try{return {cacheFile:o,envelope:dt(JSON.parse(readFileSync(o,"utf8")))}}catch{return null}}).filter(e=>e!==null).sort((e,o)=>e.envelope.timestamp-o.envelope.timestamp||ie(e.envelope.operation)-ie(o.envelope.operation));for(let{cacheFile:e,envelope:o}of t)try{let r=this.getDatabase();r.insertTelemetryFailure({id:o.id,operation:o.operation,payload:o.payload,error:o.failure,createdAt:o.timestamp}),this.applyOperation(o.operation,o.payload),r.resolveTelemetryFailure(o.id),unlinkSync(e);}catch{}this.database?.aggregatePendingToolMetrics();}aggregateMetrics(){return this.getDatabase().aggregatePendingToolMetrics()}async flushAndAggregate(){await this.flushCache(),this.aggregateMetrics();}close(){this.ownsDatabase&&this.database?.close(),this.database=null;}getDatabase(){return this.database??=openGlobalDevFlowDatabase(void 0,{busyTimeoutMs:this.busyTimeoutMs}),this.database}commitOrCache(t,e){try{return this.applyOperation(t,e),!0}catch(o){return this.cacheOperation(t,e,o),false}}applyOperation(t,e){let o=this.getDatabase();switch(t){case "tool_call":this.ensureParentSession(o,e),o.insertToolCallEvent(e);return;case "execution_start":this.ensureParentSession(o,e),o.insertSkillExecution({executionId:e.executionId,sessionId:e.sessionId,skillName:e.skillName,startedAt:e.startedAt,status:"running",requiredMcpTools:e.requiredMcpTools});return;case "execution_complete":o.reconcileSkillExecution(e.executionId,e.status,e.finishedAt,e.metadata);return;case "session_start":o.ensureSession(e),o.insertRun({id:se(e.id),source:"hook",tool:"session",input:{projectRoot:e.projectRoot},status:"active",startedAt:e.startedAt,tokenUsed:0,metadata:{sessionId:e.id,projectRoot:e.projectRoot}});return;case "complete_event":if(!o.updateToolCallEvent(e.eventId,{output:e.output===void 0?void 0:JSON.stringify(e.output),error:e.error,failureCategory:e.failureCategory,duration:e.duration}))throw new Error(`Tool call event ${e.eventId} is not available for completion`);return;case "session_end":o.closeSession(e.sessionId,e.finishedAt),o.updateRun(se(e.sessionId),{status:"completed",finishedAt:e.finishedAt});return}}ensureParentSession(t,e){let o=typeof e.sessionId=="string"?e.sessionId.trim():"";if(!o)throw new Error("Canonical session ID is required for telemetry");let r=typeof e.projectRoot=="string"&&e.projectRoot.trim()?e.projectRoot:typeof e.input?.projectRoot=="string"&&e.input.projectRoot.trim()?e.input.projectRoot:process.env.CLAUDE_PROJECT_DIR??"unknown";t.ensureSession({id:o,projectRoot:r,label:r==="unknown"?void 0:r.split("/").pop(),startedAt:Number(e.startedAt??e.timestamp??Date.now())});}cacheOperation(t,e,o){let r=Date.now(),i={id:`failure:${r}:${Math.random().toString(36).slice(2,11)}`,operation:t,payload:e,failure:o instanceof Error?o.message:String(o),timestamp:r};try{let s=this.getDatabase();s.insertTelemetryFailure({id:i.id,operation:t,payload:e,error:i.failure,createdAt:r}),s.trimTelemetryFailures(S),this.scheduleRetry();return}catch{}try{existsSync(this.cacheDir)||mkdirSync(this.cacheDir,{recursive:!0});let s=join$1(this.cacheDir,`${r}_${Math.random().toString(36).slice(2,11)}.json`);writeFileSync(s,JSON.stringify(i,null,2),{mode:384}),this.trimRetryCache(),this.scheduleRetry();}catch{}}trimRetryCache(){try{let t=readdirSync(this.cacheDir).filter(e=>e.endsWith(".json")).sort();for(let e of t.slice(0,Math.max(0,t.length-S)))unlinkSync(join$1(this.cacheDir,e));}catch{}}scheduleRetry(){this.retryScheduled||(this.retryScheduled=true,setTimeout(()=>{this.retryScheduled=false,this.flushCache();},lt).unref());}scheduleMetricAggregation(){if(this.metricAggregationScheduled||process.env.DEVFLOW_HOOK_DEGRADED==="1")return;this.metricAggregationScheduled=true,setTimeout(()=>{this.metricAggregationScheduled=false;try{this.getDatabase().aggregatePendingToolMetrics(50)===50&&this.scheduleMetricAggregation();}catch{}},25).unref();}postHttp(t,e){ee(t,e,{endpoint:this.apiUrl,fallbackReason:"telemetry_already_committed_locally"});}truncateInput(t){let e=JSON.stringify(t);return e===void 0||e.length<=re?t:{_truncated:true,_original_size:e.length,_preview:`${e.substring(0,re)}...`}}};function ie(n){return ["session_start","execution_start","tool_call","complete_event","execution_complete","session_end"].indexOf(n)}function se(n){return `hook-run:${n}`}function dt(n){if(!n||typeof n!="object")throw new Error("Invalid telemetry cache envelope");let t=n;if(typeof t.id!="string"||typeof t.operation!="string"||t.payload===void 0||typeof t.failure!="string"||typeof t.timestamp!="number")throw new Error("Invalid telemetry cache envelope");return t}function A(n){return n??process.env.CLAUDE_PROJECT_DIR??process.cwd()}function m(n){return getProjectStateDir(A(n))}var f=emitSemanticControlLog;var vt=2,yt=1;function bt(){if(process.env.CLAUDE_PLUGIN_ROOT)return process.env.CLAUDE_PLUGIN_ROOT;try{return join$1(dirname$1(fileURLToPath(import.meta.url)),"..","..")}catch{return process.cwd()}}function ae(n=bt()){let t=[join$1(n,"dist","command-registry.json"),join$1(n,"command-registry.json")];for(let e of t)try{if(!existsSync(e))continue;let o=JSON.parse(readFileSync(e,"utf8"));if(o.version!==vt&&o.version!==yt||!_t(o.commands)){f({event:"hook.runtime.degraded",identity:{projectRoot:process.env.CLAUDE_PROJECT_DIR||process.cwd()},level:"warn",timestamp:Date.now(),data:{stage:"command_registry",reason:"contract_mismatch",registryPath:e}});continue}return o.commands}catch(o){f({event:"hook.runtime.degraded",identity:{projectRoot:process.env.CLAUDE_PROJECT_DIR||process.cwd()},level:"warn",timestamp:Date.now(),data:{stage:"command_registry",reason:o.message,fallback:"next_registry_candidate"}});}return null}function _t(n){return !n||typeof n!="object"||Array.isArray(n)?false:Object.values(n).every(t=>{if(!t||typeof t!="object"||Array.isArray(t))return false;let e=t;return C(e.mcpTools)&&C(e.blockedNative)&&(e.source===void 0||e.source==="core"||e.source==="plugin")&&(e.requiresContext===void 0||typeof e.requiresContext=="boolean")&&(e.runtimePackages===void 0||C(e.runtimePackages))&&(e.hostTools===void 0||Rt(e.hostTools))&&(e.evidenceMode===void 0||["static","runtime","mixed"].includes(e.evidenceMode))})}function Rt(n){return !!n&&typeof n=="object"&&!Array.isArray(n)&&Object.entries(n).every(([t,e])=>t.length>0&&C(e))}function C(n){return Array.isArray(n)&&n.every(t=>typeof t=="string"&&t.length>0)}function ce(n){let t=ae();return t?t[n]?.mcpTools??[]:[]}function T(n){if(!n||typeof n!="object"||Array.isArray(n))return {};let t=n,e={};for(let o of ["lastMcpCall","bypassCount"])if(o in t){let r=t[o];if(r==null)continue;e[o]=typeof r=="number"&&Number.isFinite(r)&&r>=0?r:0;}return e}function Et(n,t){return n.lastMcpCall===t.lastMcpCall&&n.bypassCount===t.bypassCount}function de(n,t,e){let o=e instanceof Error?e.message:String(e);f({event:"hook.runtime.degraded",identity:{projectRoot:n},level:"warn",timestamp:Date.now(),data:{stage:"enforcement_receipt",operation:t,reason:o,fallback:"fail_open"}});}function ue(n,t,e){let o;try{o=openGlobalDevFlowDatabase(void 0,{busyTimeoutMs:250});let r={},i=o.updateHookReceipt(n,a=>(r=T(a),T(t(r)))),s=T(i);return {receipt:s,applied:!0,changed:!Et(r,s)}}catch(r){return de(n,e,r),{receipt:{},applied:false,changed:false}}finally{try{o?.close();}catch{}}}function pe(n){let t;try{return t=openGlobalDevFlowDatabase(void 0,{busyTimeoutMs:250}),T(t.getHookReceipt(n))}catch(e){return de(n,"update",e),{}}finally{try{t?.close();}catch{}}}function xt(n,t){return ue(n,()=>t,"write").applied}function wt(n,t){return ue(n,t,"update")}var le={Grep:"get_project_context",Glob:"get_project_context",Agent:"get_project_context",Bash:"get_project_context",WebSearch:"get_knowledge",WebFetch:"get_knowledge"},It=new Set(["Write","Edit","NotebookEdit"]),Dt=new Set(["failed","timeout","unavailable"]);function kt(n){switch(n){case "WebSearch":case "WebFetch":return 1;case "Agent":return 3;case "Grep":case "Glob":return 3;case "Bash":return 5;default:return 2}}var F=class{constructor(t,e,o){this.projectRoot=t;this.sessionId=e;this.executionId=o;}getPhase(){if(!this.sessionId||!this.executionId)return "idle";let t;try{t=openGlobalDevFlowDatabase(void 0,{busyTimeoutMs:250});let e=t.getContextReceipt(this.projectRoot,this.sessionId,this.executionId);if(e&&e.expiresAt>Date.now())return "context_ready";e&&t.deleteContextReceipt(this.projectRoot,this.sessionId,this.executionId);}catch{}finally{try{t?.close();}catch{}}return "context_gathering"}getContextReceipt(){if(!this.sessionId||!this.executionId)return null;let t;try{t=openGlobalDevFlowDatabase(void 0,{busyTimeoutMs:250});let e=t.getContextReceipt(this.projectRoot,this.sessionId,this.executionId);return e&&e.expiresAt>Date.now()?e:(e&&t.deleteContextReceipt(this.projectRoot,this.sessionId,this.executionId),null)}catch{return null}finally{try{t?.close();}catch{}}}evaluate(t,e){let o=this.getPhase();if(e||t==="Skill")return {permissionDecision:"allow"};if(o==="context_gathering"&&le[t])return {permissionDecision:"deny",reasonCode:"DEVFLOW_CONTEXT_REQUIRED",reason:`DevFlow context required. Call mcp__devflow__get_project_context, then retry ${t}.`};if(o==="context_ready"){if(It.has(t)){let l=this.evaluateRequiredAction();if(l)return l}return {permissionDecision:"allow"}}let r=le[t];if(!r)return {permissionDecision:"allow"};let i=wt(this.projectRoot,l=>({...l,bypassCount:(l.bypassCount??0)+1}));if(!i.applied)return {permissionDecision:"allow"};let s=i.receipt.bypassCount??0,a=kt(t);return s>=a?{permissionDecision:"allow",additionalContext:`\u5DF2 ${s} \u6B21\u76F4\u63A5\u4F7F\u7528 ${t}\uFF0C\u5EFA\u8BAE\u7528 mcp__devflow__${r} \u83B7\u53D6\u66F4\u7CBE\u786E\u7684\u4E0A\u4E0B\u6587\u3002`}:{permissionDecision:"allow"}}recordMcpCall(){xt(this.projectRoot,{lastMcpCall:Math.floor(Date.now()/1e3),bypassCount:0});}recordDomainActionOutcome(t,e,o,r){if(!this.sessionId||!this.executionId)return false;let i;try{i=openGlobalDevFlowDatabase(void 0,{busyTimeoutMs:250});let s=i.getContextReceipt(this.projectRoot,this.sessionId,this.executionId);if(!s||s.expiresAt<=Date.now()||s.canonicalAction?.tool!==t)return !1;let a=Date.now(),l=r?.trim()?`${r.trim()}:${e}`:`${t}:${e}:${a}`,c=s.actionAttempts??[];return i.upsertContextReceipt({...s,actionAttempts:c.some(d=>d.id===l||r&&d.toolUseId===r&&d.status===e)?c:[...c,{id:l,tool:t,status:e,attemptedAt:a,toolUseId:r,reason:o?.slice(0,500)}].slice(-20),actionSatisfiedAt:e==="succeeded"?a:s.actionSatisfiedAt,actionDegradation:e==="succeeded"?void 0:s.actionDegradation}),!0}catch{return false}finally{try{i?.close();}catch{}}}evaluateRequiredAction(){let t=this.getContextReceipt(),e=t?.canonicalAction;if(!t||!e||!e.required||e.status!=="required")return null;let o=e.binding;if(o.requiredContextReceipt!==t.contextHash||o.projectRoot!==this.projectRoot||o.sessionId!==this.sessionId||o.requestId!==t.requestId||o.executionId&&o.executionId!==this.executionId)return {permissionDecision:"deny",reasonCode:"DEVFLOW_ACTION_BINDING_STALE",reason:"DevFlow canonical action binding is stale or mismatched. Call mcp__devflow__get_project_context again before writing."};if(t.actionSatisfiedAt)return null;if(t.actionDegradation?.authorizedByContextReceipt===t.contextHash)return {permissionDecision:"allow",additionalContext:`DevFlow degraded fallback authorized by context receipt ${t.contextHash}: ${t.actionDegradation.reason}`};let r=(t.actionAttempts??[]).filter(i=>i.tool===e.tool&&Dt.has(i.status));if(r.length>0){let i=r.at(-1),s={missedTool:e.tool,failedAttemptCount:r.length,reason:`${i.status}:${i.reason??"canonical domain action did not complete"}`,authorizedByContextReceipt:t.contextHash,authorizedAt:Date.now()};return this.persistDegradation(t,s),{permissionDecision:"allow",additionalContext:`DevFlow canonical tool mcp__devflow__${e.tool} ${i.status}; degraded direct write authorized by context receipt ${t.contextHash}. Preserve the action contract and verification plan.`}}return {permissionDecision:"deny",reasonCode:"DEVFLOW_REQUIRED_ACTION",reason:`DevFlow required action not completed. Call mcp__devflow__${e.tool} using context receipt ${t.contextHash}, then retry the write. Direct fallback is allowed only after unavailable, failed, or timeout evidence.`}}persistDegradation(t,e){let o;try{o=openGlobalDevFlowDatabase(void 0,{busyTimeoutMs:250});let r=o.getContextReceipt(t.projectRoot,t.sessionId,t.executionId);if(!r||r.contextHash!==t.contextHash||r.actionDegradation)return;o.upsertContextReceipt({...r,actionDegradation:e});let i=o.getSkillExecution(t.executionId);if(!i)return;let s=i.metadata&&typeof i.metadata=="object"?i.metadata:{},a=Array.isArray(s.requiredActionDegradations)?s.requiredActionDegradations:[];o.updateSkillExecution(t.executionId,{missedMcpTools:[...new Set([...i.missedMcpTools??[],e.missedTool])],failedToolCalls:Math.max(i.failedToolCalls??0,e.failedAttemptCount),fallbackCount:(i.fallbackCount??0)+1,fallbackReasons:[...new Set([...i.fallbackReasons??[],`required_action_${e.reason}`])],metadata:{...s,requiredActionDegradations:[...a,e]}});}catch{}finally{try{o?.close();}catch{}}}};var Lt=10*1024*1024,Mt=5;function $t(n){return createHash$1("sha256").update(n).digest("hex").slice(0,16)}function ge(n){return join(homedir(),".devflow","logs","hook-debug",`${$t(n)}.jsonl`)}function me(n,t,e={}){let o=e.maxBytes??Lt,r=e.maxFiles??Mt;mkdirSync$1(dirname(n),{recursive:true,mode:448});let i=Buffer.byteLength(t);rotateDiagnosticLogFile({path:n,maxBytes:o,maxFiles:r,incomingBytes:i}),appendFileSync(n,t,{mode:384}),chmodSync(n,384);}var H="WARNING: DevFlow is in degraded mode (daemon unreachable): 4-Gate enforcement and memory prefetch cache are unavailable. Run `devflow doctor` for details.";function fe(){return process.env.DEVFLOW_HOOK_DEGRADED==="1"}function be(n){return Buffer.from(n,"utf8").toString("base64url")}function qt(n,t,e){let o=t?.trim();if(o){let r=/^[a-zA-Z0-9:._-]{1,192}$/.test(o)?o:`tool-${createHash("sha256").update(o.slice(0,1024)).digest("hex").slice(0,32)}`;return `${n}:${r}`}return `${n}:legacy-${e}-${randomUUID().slice(0,8)}`}function Ie(n){return `${n}:legacy-journal`}var P=class{constructor(t){this.projectRoot=t;this.sessions=new Map;this.sessionsDir=join$1(m(t),"hook-sessions");}registerSession(t){let e=t.trim();if(!e)throw new Error("session_id_required");let o=this.get(e);if(o)return o.lastActivityAt=Date.now(),this.persist(o),o;let r=Date.now(),i={sessionId:e,projectRoot:this.projectRoot,requiredMcpTools:[],evidenceObligations:[],evidenceDegradations:[],evidenceOutcomes:[],startedAt:r,lastActivityAt:r};return this.sessions.set(e,i),this.persist(i),i}startExecution(t,e,o){let r=this.registerSession(t);return (!r.executionId||r.skillName!==e)&&(r.executionId=`exec_${Date.now()}_${randomUUID().slice(0,8)}`),r.skillName=e,r.requiredMcpTools=[...new Set(o)],r.lastActivityAt=Date.now(),this.persist(r),r}bindTaskIdentity(t,e){let o=this.registerSession(t);return o.activeTurnId=e.turnId,o.activeRequestId=e.requestId,o.intentArtifactHash=e.intentArtifactHash,o.lastActivityAt=Date.now(),this.persist(o),o}get(t){let e=t.trim();if(!e)return null;let o=this.sessions.get(e);if(o)return this.replayEvidenceJournal(o),o;let r=this.snapshotPath(e);if(!existsSync(r))return null;try{let i=JSON.parse(readFileSync(r,"utf8"));return i.sessionId!==e||i.projectRoot!==this.projectRoot?null:(i.requiredMcpTools=Array.isArray(i.requiredMcpTools)?i.requiredMcpTools:[],i.evidenceObligations=_e(i.evidenceObligations),i.evidenceDegradations=Re(i.evidenceDegradations),i.evidenceOutcomes=Ee(i.evidenceOutcomes),this.replayEvidenceJournal(i),this.sessions.set(e,i),i)}catch{return null}}completeExecution(t){let e=this.get(t);if(!e)return null;let o=structuredClone(e);return delete e.executionId,delete e.skillName,e.requiredMcpTools=[],e.lastActivityAt=Date.now(),this.persist(e),o}addEvidenceObligation(t,e,o=Date.now(),r){let i=this.registerSession(t),a=(r?void 0:i.evidenceObligations.find(c=>c.contractId===e.id))?.obligationId??qt(e.id,r,o);this.appendEvidenceEvent(t,{kind:"add",obligationId:a,contractId:e.id,at:o,contract:e},`add\0${a}`),this.replayEvidenceJournal(i);let l=i.evidenceObligations.find(c=>c.obligationId===a);return l?(i.lastActivityAt=Date.now(),this.persist(i),structuredClone(l)):null}listEvidenceObligations(t){return (this.get(t)?.evidenceObligations??[]).map(e=>structuredClone(e))}markEvidenceCorrection(t,e,o,r,i=Date.now()){let s=this.get(t),a=s?.evidenceObligations.find(d=>d.obligationId===e);if(!s||!a)return null;let l=/^[a-f0-9]{64}$/.test(r)?r:"";if(!l)return null;this.appendEvidenceEvent(t,{kind:"correction",obligationId:e,contractId:a.contractId,at:i,fingerprint:l,violations:o.slice(0,16).map(d=>d.slice(0,240))},`correction\0${e}\0${l}`),this.replayEvidenceJournal(s),s.lastActivityAt=i,this.persist(s);let c=s.evidenceObligations.find(d=>d.obligationId===e);return c?structuredClone(c):null}resolveEvidenceObligation(t,e){let o=this.get(t);if(!o)return false;let r=o.evidenceObligations.find(s=>s.obligationId===e);if(!r)return false;let i=Date.now();return this.appendEvidenceEvent(t,{kind:"resolve",obligationId:e,contractId:r.contractId,at:i},`resolve\0${e}`),this.replayEvidenceJournal(o),o.lastActivityAt=i,this.persist(o),true}resolveDegradedEvidence(t,e){let o=this.get(t),r=o?.evidenceDegradations.find(s=>s.obligationId===e);if(!o||!r)return false;let i=Date.now();return this.appendEvidenceEvent(t,{kind:"resolve",obligationId:e,contractId:r.contractId,at:i},`resolve-degraded\0${e}\0${i}`),this.replayEvidenceJournal(o),o.lastActivityAt=i,this.persist(o),true}degradeEvidenceObligation(t,e,o,r=Date.now()){let i=this.get(t),s=i?.evidenceObligations.find(l=>l.obligationId===e);if(!i||!s)return false;let a=o.slice(0,240);return this.appendEvidenceEvent(t,{kind:"degrade",obligationId:e,contractId:s.contractId,at:r,reason:a},`degrade\0${e}\0${a}`),this.replayEvidenceJournal(i),i.lastActivityAt=r,this.persist(i),true}removeSession(t){let e=t.trim();e&&(this.sessions.delete(e),rmSync(this.snapshotPath(e),{force:true}),rmSync(this.evidenceJournalDir(e),{recursive:true,force:true}));}list(){return [...this.sessions.values()]}snapshotPath(t){return join$1(this.sessionsDir,`${be(t)}.json`)}evidenceJournalDir(t){return join$1(this.sessionsDir,"evidence-journal",be(t))}appendEvidenceEvent(t,e,o){let r=this.evidenceJournalDir(t);mkdirSync(r,{recursive:true,mode:448});let i=createHash("sha256").update(o).digest("hex"),s=join$1(r,`${e.kind}-${i}.json`);if(existsSync(s))return;let a=join$1(r,`.${process.pid}.${randomUUID()}.tmp`);writeFileSync(a,JSON.stringify(e),{mode:384});try{linkSync(a,s);}catch(l){if(l.code!=="EEXIST")throw l}finally{rmSync(a,{force:true});}}replayEvidenceJournal(t){t.evidenceObligations=_e(t.evidenceObligations),t.evidenceDegradations=Re(t.evidenceDegradations),t.evidenceOutcomes=Ee(t.evidenceOutcomes);let e=this.evidenceJournalDir(t.sessionId);if(!existsSync(e))return;let o;try{o=readdirSync(e).filter(i=>/^(?:add|correction|resolve|degrade)-[a-f0-9]{64}\.json$/.test(i)).slice(0,4096);}catch{return}let r=o.flatMap(i=>{try{let s=readFileSync(join$1(e,i),"utf8");if(Buffer.byteLength(s,"utf8")>64*1024)return [];let a=Jt(JSON.parse(s));return a?[a]:[]}catch{return []}}).sort((i,s)=>i.at-s.at||xe(i.kind)-xe(s.kind));for(let i of r)this.applyEvidenceEvent(t,i);t.evidenceObligations=t.evidenceObligations.slice(-8),t.evidenceDegradations=t.evidenceDegradations.slice(-20),t.evidenceOutcomes=t.evidenceOutcomes.slice(-20);}applyEvidenceEvent(t,e){let o=t.evidenceOutcomes.find(s=>s.obligationId===e.obligationId);if(e.kind==="add"){if(o)return;let s=t.evidenceObligations.find(a=>a.obligationId===e.obligationId);s?(s.contract=e.contract,s.promptedAt=Math.min(s.promptedAt,e.at)):t.evidenceObligations.push({obligationId:e.obligationId,contractId:e.contractId,contract:e.contract,promptedAt:e.at,attempt:0,correctionRequested:false,violations:[]});return}let r=t.evidenceObligations.find(s=>s.obligationId===e.obligationId);if(e.kind==="correction"){if(!r||o||r.correctionFingerprint===e.fingerprint)return;r.attempt+=1,r.correctionRequested=true,r.correctionRequestedAt=e.at,r.correctionFingerprint=e.fingerprint,r.violations=e.violations;return}let i=r?.attempt??o?.attempt??0;if(e.kind==="resolve"&&o?.status==="degraded")t.evidenceOutcomes=t.evidenceOutcomes.filter(s=>s.obligationId!==e.obligationId),t.evidenceDegradations=t.evidenceDegradations.filter(s=>s.obligationId!==e.obligationId);else if(o)return;e.kind==="degrade"?(t.evidenceObligations=t.evidenceObligations.filter(s=>s.obligationId!==e.obligationId),t.evidenceDegradations.push({obligationId:e.obligationId,contractId:e.contractId,reason:e.reason,degradedAt:e.at,attempt:i,contract:r?.contract})):t.evidenceObligations=t.evidenceObligations.filter(s=>s.obligationId!==e.obligationId),t.evidenceOutcomes.push({obligationId:e.obligationId,contractId:e.contractId,status:e.kind==="resolve"?"resolved":"degraded",completedAt:e.at,attempt:i,...e.kind==="degrade"?{reason:e.reason}:{}});}persist(t){mkdirSync(this.sessionsDir,{recursive:true,mode:448});let e=this.snapshotPath(t.sessionId),o=`${e}.${process.pid}.${randomUUID()}.tmp`;writeFileSync(o,JSON.stringify(t),{mode:384}),renameSync(o,e);}};function _e(n){return Array.isArray(n)?n.flatMap(t=>{if(!t||typeof t!="object")return [];let e=t;if(typeof e.contractId!="string"||e.contractId.length===0||e.contractId.length>128||typeof e.promptedAt!="number"||typeof e.attempt!="number"||typeof e.correctionRequested!="boolean"||!Array.isArray(e.violations)||!De(e.contract))return [];let o=typeof e.obligationId=="string"&&e.obligationId.length>0&&e.obligationId.length<=384?e.obligationId:Ie(e.contractId),r=typeof e.correctionTranscriptHash=="string"?e.correctionTranscriptHash:void 0,i=e.correctionFingerprint??r;return i!==void 0&&!/^[a-f0-9]{64}$/.test(i)?[]:[{...e,obligationId:o,correctionFingerprint:i}]}).slice(-8):[]}function Re(n){return Array.isArray(n)?n.filter(t=>{if(!t||typeof t!="object")return false;let e=t;return typeof e.obligationId=="string"&&typeof e.contractId=="string"&&typeof e.reason=="string"&&typeof e.degradedAt=="number"&&typeof e.attempt=="number"}).slice(-20):[]}function Ee(n){return Array.isArray(n)?n.filter(t=>{if(!t||typeof t!="object")return false;let e=t;return typeof e.obligationId=="string"&&typeof e.contractId=="string"&&(e.status==="resolved"||e.status==="degraded")&&typeof e.completedAt=="number"&&typeof e.attempt=="number"&&(e.reason===void 0||typeof e.reason=="string")}).slice(-20):[]}function Jt(n){if(!n||typeof n!="object")return null;let t=n,e=t.kind;if(e!=="add"&&e!=="correction"&&e!=="resolve"&&e!=="degrade"||typeof t.contractId!="string"||t.contractId.length>128||typeof t.at!="number")return null;let r={obligationId:typeof t.obligationId=="string"&&t.obligationId.length>0&&t.obligationId.length<=384?t.obligationId:Ie(t.contractId),contractId:t.contractId,at:t.at};if(e==="add")return De(t.contract)?{kind:e,...r,contract:t.contract}:null;if(e==="correction"){let i=typeof t.fingerprint=="string"?t.fingerprint:t.transcriptHash;return typeof i=="string"&&/^[a-f0-9]{64}$/.test(i)&&Array.isArray(t.violations)&&t.violations.every(s=>typeof s=="string"&&s.length<=240)?{kind:e,...r,fingerprint:i,violations:t.violations}:null}return e==="resolve"?{kind:e,...r}:typeof t.reason=="string"&&t.reason.length<=240?{kind:e,...r,reason:t.reason}:null}function xe(n){return n==="add"?0:n==="correction"?1:2}function De(n){if(!n||typeof n!="object")return false;let t=n,e=t.requiredSections,o=t.prohibitedClaims;return t.version==="1.0"&&typeof t.id=="string"&&/^[a-zA-Z0-9][a-zA-Z0-9:._-]{0,127}$/.test(t.id)&&typeof t.runtimeProfilingOccurred=="boolean"&&typeof t.samplingEvidenceOccurred=="boolean"&&Array.isArray(e)&&e.length===3&&e[0]==="\u5DE5\u5177\u53D1\u73B0"&&e[1]==="\u6A21\u578B\u5047\u8BBE"&&e[2]==="\u9700\u8981\u8FD0\u884C\u65F6\u9A8C\u8BC1"&&Array.isArray(o)&&o.length<=16&&o.every(r=>typeof r=="string"&&r.length<=128)&&typeof t.canonicalReport=="string"&&Buffer.byteLength(t.canonicalReport,"utf8")<=48*1024&&!!t.correctionPolicy&&t.correctionPolicy.maxAttempts===1&&t.correctionPolicy.repeatedViolation==="fail_open"}function ke(n){let t=n.trim().replace(/^\//,"");if(!t.startsWith("devflow:"))return null;let e=t.slice(8).replace(/^devflow-/,"");return /^[a-z0-9][a-z0-9-]*$/i.test(e)?`devflow:${e.toLowerCase()}`:null}function Se(n,t){return t?`evt_tool_${createHash("sha256").update(`${n}\0${t}`).digest("hex").slice(0,24)}`:`evt_${Date.now()}_${Math.random().toString(36).slice(2,11)}`}var Gt=new Set(["Write","Edit","NotebookEdit"]),Oe="Claude native memory writes are disabled for this project. Use DevFlow explicit memory or mcp__devflow__memory_commit_turn so a canonical receipt is created.";function je(n){if(!Gt.has(n.toolName))return null;let t=zt(n.toolInput);if(!t)return null;let e=Kt(t,n.projectRoot),o=resolve(n.projectRoot,".claude");if(Ae(e,o)&&basename(e).toLocaleUpperCase("en-US")==="MEMORY.MD")return Oe;let r=resolve(n.home??homedir(),".claude","projects");return Ae(e,r)&&relative(r,e).split(sep).some(s=>s.toLocaleLowerCase("en-US")==="memory")?Oe:null}function zt(n){for(let t of ["file_path","notebook_path","path"]){let e=n[t];if(typeof e=="string"&&e.trim())return e.trim()}return null}function Kt(n,t){return resolve(isAbsolute(n)?n:resolve(t,n))}function Ae(n,t){let e=relative(t,n);return e===""||!e.startsWith(`..${sep}`)&&e!==".."&&!isAbsolute(e)}function $e(n){let t=on(n.toolName,n.toolInput),e=t?rn(n.projectRoot,n.toolName,n.toolInput):void 0;if(!t||!e||!n.toolUseId)return {allowed:true};let o=an(e),r,i=0,s,a;try{a=openGlobalDevFlowDatabase(void 0,{busyTimeoutMs:100,readonly:!0});let c=a.getActiveContextReceipt(n.projectRoot,n.sessionId,n.executionId);r=c?.contextHash,i=c?.issuedAt??0,s=c?.canonicalAction?.binding.operationTargets?.find(d=>cn(n.projectRoot,d.path,e));}catch{}finally{try{a?.close();}catch{}}let l={toolUseId:n.toolUseId,sessionId:n.sessionId,executionId:n.executionId,operation:t,path:e,before:o,contextReceipt:r,observedAt:Date.now()};if(un(n.projectRoot,l),t==="edit"||t==="write"||t==="delete"){let c=pn(n.projectRoot,e),d=c?.success&&c.operation==="delete"&&!c.after.exists&&c.completedAt>=i,u=s?.expectedState==="existing"&&!o.exists||s?.expectedState==="missing"&&o.exists||!!(s?.contentHash&&o.hash!==s.contentHash);if(d||s?.expectedState==="existing"&&!o.exists)return Pe(n,l,"DEVFLOW_FILE_STATE_DELETED","The target was deleted after the active Context receipt. Refresh project context before editing or recreating it.");if(u)return Pe(n,l,"DEVFLOW_FILE_STATE_STALE","The target state no longer matches the active Context receipt. Refresh project context before overwriting it.")}return Ne(n,l,true),{allowed:true,pending:l}}function Pe(n,t,e,o){return Ne(n,t,false,e),{allowed:false,reasonCode:e,reason:o,pending:t}}function Ne(n,t,e,o){f({event:"canonical.action.validated",identity:{projectRoot:n.projectRoot,sessionId:n.sessionId,executionId:n.executionId,contextReceipt:t.contextReceipt},level:e?"info":"warn",timestamp:Date.now(),data:{stage:"host_file_state_precondition",valid:e,operation:t.operation,targetPath:relative(n.projectRoot,t.path),targetExists:t.before.exists,targetHash:t.before.hash,reason:o,toolUseId:t.toolUseId}});}function on(n,t){if(n==="Read")return "read";if(n==="Edit"||n==="NotebookEdit")return "edit";if(n==="Write")return "write";if(n==="Delete"||n==="Bash"&&He(t.command))return "delete"}function rn(n,t,e){let o=sn(e,["file_path","filePath","notebook_path","path","targetPath"])??(t==="Bash"?He(e.command):void 0);if(!o)return;let r=isAbsolute(o)?normalize(o):resolve(n,o),i=relative(n,r);return i.startsWith("..")||isAbsolute(i)?void 0:r}function He(n){return typeof n!="string"?void 0:/(?:^|[;&|]\s*)\s*(?:rm|unlink)\s+(?:-[A-Za-z]+\s+)*(?:--\s+)?(["']?)([^\s;&|"']+)\1/u.exec(n)?.[2]}function sn(n,t){for(let e of t){let o=n[e];if(typeof o=="string"&&o.trim())return o.trim()}}function an(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 cn(n,t,e){return (isAbsolute(t)?normalize(t):resolve(n,t))===normalize(e)}function Ue(n){return join(m(n),"file-state")}function qe(n){return join(Ue(n),"pending.json")}function ln(n){return join(Ue(n),"observations.jsonl")}function dn(n){try{return JSON.parse(readFileSync$1(qe(n),"utf8"))}catch{return {}}}function un(n,t){let e=qe(n);mkdirSync$1(dirname(e),{recursive:true});let o=dn(n);o[t.toolUseId]=t,gn(e,JSON.stringify(o));}function pn(n,t){try{let e=readFileSync$1(ln(n),"utf8").trim().split(`
3
+ `);for(let o=e.length-1;o>=0;o-=1){let r=JSON.parse(e[o]);if(r.path===t)return r}}catch{}}function gn(n,t){let e=`${n}.${process.pid}.${Date.now()}.tmp`;writeFileSync$1(e,t,{encoding:"utf8",mode:384}),renameSync$1(e,n);}function E(){return {hookSpecificOutput:{hookEventName:"PreToolUse",permissionDecision:"allow"}}}function Je(n){return {hookSpecificOutput:{hookEventName:"PreToolUse",permissionDecision:"allow",additionalContext:n}}}function bn(n){let t=m(n);return existsSync(t)||mkdirSync(t,{recursive:true}),t}function _n(n,t,e,o,r,i){let s=join$1(bn(n),"event-map.json"),a=[];try{existsSync(s)&&(a=JSON.parse(readFileSync(s,"utf-8")));}catch{}a.push({sessionId:t,toolName:e,toolUseId:o,eventId:r,timestamp:i}),writeFileSync(s,JSON.stringify(a));}function Rn(n){switch(n){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"}}async function En(n){let t=fe();try{if(!n||n.trim()==="")return E();let e=JSON.parse(n),o=Date.now();try{maybeRunDiagnosticLogCleanup(A(),{now:o});}catch{}let r=A(),i=new O;e.tool_name.startsWith("mcp__devflow__")&&(typeof e.tool_input.projectRoot!="string"||!e.tool_input.projectRoot.trim())&&(e.tool_input.projectRoot=r);let s=e.session_id?.trim();if(!s)return Je(H);let a=new P(r),l=a.get(s)!==null;if(a.registerSession(s),l||await i.sendSessionStart(s,r,Date.now()),e.tool_name==="Skill"){let I=e.tool_input?.skill,v=I?ke(I):null;if(v){let Be=a.get(s)?.executionId,R=a.startExecution(s,v,ce(v));R.executionId&&R.executionId!==Be&&await i.sendExecutionStart(R.executionId,s,v,R.lastActivityAt,r,R.requiredMcpTools);}}let c=a.get(s);e.tool_name.startsWith("mcp__devflow__")&&(e.tool_input._devflow_session_id=s,e.tool_input._devflow_execution_id=c?.executionId??s,c?.activeTurnId&&(e.tool_input._devflow_turn_id=c.activeTurnId),c?.activeRequestId&&(e.tool_input._devflow_request_id=c.activeRequestId),c?.intentArtifactHash&&(e.tool_input._devflow_intent_artifact_hash=c.intentArtifactHash),c?.skillName&&(e.tool_input._devflow_active_skill=c.skillName),e.tool_use_id&&(e.tool_input._devflow_tool_use_id=e.tool_use_id));let d=e.tool_name.startsWith("mcp__"),u=d?e.tool_name.replace(/^mcp__[^_]+__/,""):void 0,p=new F(r,s,c?.executionId),G=p.getPhase(),g,x=je({toolName:e.tool_name,toolInput:e.tool_input,projectRoot:r}),M=$e({projectRoot:r,sessionId:s,executionId:c?.executionId,toolUseId:e.tool_use_id,toolName:e.tool_name,toolInput:e.tool_input}),h=x?{permissionDecision:"deny",reason:x}:M.allowed?p.evaluate(e.tool_name,d):{permissionDecision:"deny",reason:M.reason,reasonCode:M.reasonCode};h.permissionDecision==="deny"?g={hookSpecificOutput:{hookEventName:"PreToolUse",permissionDecision:"deny",permissionDecisionReason:h.reason??"MCP context required"}}:h.additionalContext?g=Je(h.additionalContext):g=E(),e.tool_name.startsWith("mcp__devflow__")&&(g.hookSpecificOutput.updatedInput=e.tool_input),t&&g.hookSpecificOutput.permissionDecision==="allow"&&(g.hookSpecificOutput.additionalContext=H);let Ve=c?.executionId??s,_={eventId:Se(s,e.tool_use_id),executionId:Ve,sessionId:s,projectRoot:r,toolUseId:e.tool_use_id,timestamp:Date.now(),toolName:e.tool_name,toolType:d?"mcp":e.tool_name==="Agent"?"subagent":"direct",isMcpTool:d,mcpToolName:u,mcpEnforced:d&&G==="context_gathering",mcpFallback:!d&&G==="context_gathering",kind:Rn(e.tool_name),input:e.tool_input,duration:0,blocked:g.hookSpecificOutput.permissionDecision==="deny",blockReason:g.hookSpecificOutput.permissionDecision==="deny"?x?"DEVFLOW_CANONICAL_MEMORY_REQUIRED":h.reasonCode??"DEVFLOW_CONTEXT_REQUIRED":void 0},w=await i.sendEvent(_);w&&!_.blocked&&_n(r,s,e.tool_name,e.tool_use_id,w,_.timestamp),w&&_.blocked&&await i.completeEvent({eventId:w,sessionId:s,error:x?"DEVFLOW_CANONICAL_MEMORY_REQUIRED":h.reasonCode??"DEVFLOW_CONTEXT_REQUIRED",duration:Date.now()-_.timestamp,completedAt:Date.now()});try{let I=pe(r),v={ts:o,tool:e.tool_name,sessionId:s,skill:c?.skillName??"(none)",requiredTools:c?.requiredMcpTools??[],isMcp:d,enforce:c?.executionId!==void 0,stateless:c?.executionId===void 0&&!d&&e.tool_name!=="Skill",bypassCount:I.bypassCount??0,decision:g.hookSpecificOutput.permissionDecision,env_CLAUDE_PLUGIN_ROOT:process.env.CLAUDE_PLUGIN_ROOT??"(unset)",cwd:process.cwd()};me(ge(r),`${JSON.stringify(v)}
4
+ `);}catch{}return g}catch{return E()}}if(process.argv[1]?.endsWith("pre-tool-use")||process.argv[1]?.endsWith("pre-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 En(t);n(JSON.stringify(e));}),process.stdin.on("error",()=>{n(JSON.stringify(E())),process.exit(0);}),setTimeout(()=>{n(JSON.stringify(E())),process.exit(0);},4e3).unref();}export{En as handlePreToolUse};
@@ -1,6 +1,6 @@
1
- import {getLocalApiKey,getDevFlowStateRoot,getProjectStateDir,claudeCodeRuntimeAdapter,resolveRuntimeEndpoint,acquireRuntimeHttpCircuit,registerRuntimeHttpSuccess,registerRuntimeHttpFailure}from'@devflow-tools/sdk';import {openGlobalDevFlowDatabase,retrievalLedgerTransitionId}from'@devflow-tools/database';import {MemoryGate}from'@devflow-tools/memory-engine';import {existsSync as existsSync$1,readFileSync,rmSync as rmSync$1,mkdirSync as mkdirSync$1,writeFileSync as writeFileSync$1,linkSync,readdirSync,renameSync as renameSync$1,unlinkSync as unlinkSync$1}from'fs';import {join as join$1}from'path';import {request}from'node:http';import {mkdirSync,existsSync,writeFileSync,renameSync,unlinkSync,rmSync,statSync,openSync,readSync,closeSync,lstatSync,constants,fstatSync,appendFileSync}from'node:fs';import {join}from'node:path';import {createHash}from'node:crypto';import {randomUUID,createHash as createHash$1}from'crypto';import {emitSemanticControlLog}from'@devflow-tools/telemetry';import'@devflow-tools/task-runtime';function X(n){return n??process.env.CLAUDE_PROJECT_DIR??process.cwd()}function z(n){return getProjectStateDir(X(n))}function re(n,t,e){try{let i=openGlobalDevFlowDatabase();try{i.insertEvent({kind:n,timestamp:Date.now(),duration:e,success:t.success!==!1,metadata:t});}finally{i.close();}}catch{}}var at=getLocalApiKey(),se=join(getDevFlowStateRoot(),"errors");async function G(n,t,e={}){let i=e.endpoint??resolveRuntimeEndpoint().url,r=e.timeout??1500,o=e.durableMirror??true,s=e.maxRetries??(o?0:2),a=e.circuitBreaker??true,d=acquireRuntimeHttpCircuit(i,n);if(a&&!d.allowed)return {delivered:false,suppressed:true,fallbackReason:d.state.fallbackReason};let f;for(let c=0;c<=s;c+=1)try{return await ct(i,n,t,r),a&&registerRuntimeHttpSuccess(i,n).transitioned&&re("http_circuit_transition",{endpoint:i,path:new URL(n,i).pathname,previous:d.state.status,status:"closed",failures:0}),{delivered:!0,suppressed:!1}}catch(y){f=y instanceof Error?y:new Error(String(y)),c<s&&await dt(Math.min(100*2**c,1e3));}if(!f)return {delivered:false,suppressed:false,fallbackReason:"unknown_http_failure"};if(!a)return be(n,f),{delivered:false,suppressed:false,fallbackReason:f.message};let g=registerRuntimeHttpFailure(i,n,e.fallbackReason??(o?"local_durable_mirror":"http_delivery_failed"));return g.transitioned&&(be(n,f),re("http_circuit_transition",{endpoint:i,path:new URL(n,i).pathname,previous:d.state.status,status:"open",failures:g.state.failures,openUntil:g.state.openUntil,fallbackReason:g.state.fallbackReason})),{delivered:false,suppressed:false,fallbackReason:g.state.fallbackReason}}function ct(n,t,e,i){return new Promise((r,o)=>{let s=JSON.stringify(e),a=new URL(t,n),d=false,f=c=>{d||(d=true,c?o(c):r());},g=request({hostname:a.hostname,port:a.port,path:a.pathname+a.search,method:"POST",headers:{"Content-Type":"application/json","X-API-Key":at,"Content-Length":Buffer.byteLength(s)},timeout:i},c=>{c.on("error",f),c.on("end",()=>{let y=c.statusCode??0;f(y>=200&&y<300?void 0:new Error(`HTTP ${y}`));}),c.resume();});g.on("error",f),g.on("timeout",()=>g.destroy(new Error(`HTTP mirror timed out after ${i}ms`))),g.write(s),g.end();})}function be(n,t){try{existsSync(se)||mkdirSync(se,{recursive:!0}),appendFileSync(join(se,"http-errors.log"),`${new Date().toISOString()} | ${n} | ${t.message}
2
- `);}catch{}}function dt(n){return new Promise(t=>setTimeout(t,n))}var Se=1e4,pt=3e4,Q=500,ee=class{constructor(t){this.retryScheduled=false;this.metricAggregationScheduled=false;this.apiUrl=t?.apiUrl,this.cacheDir=t?.cacheDir??join$1(getDevFlowStateRoot(),"global","telemetry-cache"),this.database=t?.database??null,this.ownsDatabase=!t?.database;let e=t?.busyTimeoutMs??Number(process.env.DEVFLOW_TELEMETRY_DB_BUSY_TIMEOUT_MS);this.busyTimeoutMs=Number.isSafeInteger(e)&&e>=0?e:100;}async sendEvent(t){let e={...t,input:this.truncateInput(t.input)};return this.commitOrCache("tool_call",e)?(this.postHttp("/api/telemetry/tool-call",e),t.eventId):null}async sendExecutionStart(t,e,i,r,o=process.env.CLAUDE_PROJECT_DIR??process.cwd(),s=[]){let a={executionId:t,sessionId:e,skillName:i,startedAt:r,projectRoot:o,requiredMcpTools:s};this.commitOrCache("execution_start",a)&&this.postHttp("/api/telemetry/skill-execution/start",a);}async sendExecutionComplete(t,e="completed",i=Date.now(),r){let o={executionId:t,status:e,finishedAt:i,metadata:r},s=this.commitOrCache("execution_complete",o);return s&&this.postHttp("/api/telemetry/skill-execution/complete-reconciled",o),s}async sendSessionStart(t,e,i){let r={id:t,projectRoot:e,startedAt:i,label:e.split("/").pop()??"unknown"},o=this.commitOrCache("session_start",r);return o&&this.postHttp("/api/telemetry/sessions",r),o}async completeEvent(t){let e=this.commitOrCache("complete_event",t);return e&&(this.postHttp("/api/telemetry/tool-call/output",t),this.scheduleMetricAggregation()),e}async endSession(t,e=Date.now()){let i={sessionId:t,finishedAt:e},r=this.commitOrCache("session_end",i);return r&&(this.getDatabase().aggregatePendingToolMetrics(),this.postHttp(`/api/telemetry/sessions/${encodeURIComponent(t)}/close`,{finishedAt:e})),r}async flushCache(){try{let e=this.getDatabase(),i=e.listTelemetryFailures({unresolvedOnly:!0,limit:Q}).reverse();for(let r of i)try{this.applyOperation(r.operation,r.payload),e.resolveTelemetryFailure(r.id);}catch{}e.trimTelemetryFailures(Q);}catch{}let t=(existsSync$1(this.cacheDir)?readdirSync(this.cacheDir):[]).filter(e=>e.endsWith(".json")).map(e=>{let i=join$1(this.cacheDir,e);try{return {cacheFile:i,envelope:yt(JSON.parse(readFileSync(i,"utf8")))}}catch{return null}}).filter(e=>e!==null).sort((e,i)=>e.envelope.timestamp-i.envelope.timestamp||ke(e.envelope.operation)-ke(i.envelope.operation));for(let{cacheFile:e,envelope:i}of t)try{let r=this.getDatabase();r.insertTelemetryFailure({id:i.id,operation:i.operation,payload:i.payload,error:i.failure,createdAt:i.timestamp}),this.applyOperation(i.operation,i.payload),r.resolveTelemetryFailure(i.id),unlinkSync$1(e);}catch{}this.database?.aggregatePendingToolMetrics();}aggregateMetrics(){return this.getDatabase().aggregatePendingToolMetrics()}async flushAndAggregate(){await this.flushCache(),this.aggregateMetrics();}close(){this.ownsDatabase&&this.database?.close(),this.database=null;}getDatabase(){return this.database??=openGlobalDevFlowDatabase(void 0,{busyTimeoutMs:this.busyTimeoutMs}),this.database}commitOrCache(t,e){try{return this.applyOperation(t,e),!0}catch(i){return this.cacheOperation(t,e,i),false}}applyOperation(t,e){let i=this.getDatabase();switch(t){case "tool_call":this.ensureParentSession(i,e),i.insertToolCallEvent(e);return;case "execution_start":this.ensureParentSession(i,e),i.insertSkillExecution({executionId:e.executionId,sessionId:e.sessionId,skillName:e.skillName,startedAt:e.startedAt,status:"running",requiredMcpTools:e.requiredMcpTools});return;case "execution_complete":i.reconcileSkillExecution(e.executionId,e.status,e.finishedAt,e.metadata);return;case "session_start":i.ensureSession(e),i.insertRun({id:Ee(e.id),source:"hook",tool:"session",input:{projectRoot:e.projectRoot},status:"active",startedAt:e.startedAt,tokenUsed:0,metadata:{sessionId:e.id,projectRoot:e.projectRoot}});return;case "complete_event":if(!i.updateToolCallEvent(e.eventId,{output:e.output===void 0?void 0:JSON.stringify(e.output),error:e.error,failureCategory:e.failureCategory,duration:e.duration}))throw new Error(`Tool call event ${e.eventId} is not available for completion`);return;case "session_end":i.closeSession(e.sessionId,e.finishedAt),i.updateRun(Ee(e.sessionId),{status:"completed",finishedAt:e.finishedAt});return}}ensureParentSession(t,e){let i=typeof e.sessionId=="string"?e.sessionId.trim():"";if(!i)throw new Error("Canonical session ID is required for telemetry");let r=typeof e.projectRoot=="string"&&e.projectRoot.trim()?e.projectRoot:typeof e.input?.projectRoot=="string"&&e.input.projectRoot.trim()?e.input.projectRoot:process.env.CLAUDE_PROJECT_DIR??"unknown";t.ensureSession({id:i,projectRoot:r,label:r==="unknown"?void 0:r.split("/").pop(),startedAt:Number(e.startedAt??e.timestamp??Date.now())});}cacheOperation(t,e,i){let r=Date.now(),o={id:`failure:${r}:${Math.random().toString(36).slice(2,11)}`,operation:t,payload:e,failure:i instanceof Error?i.message:String(i),timestamp:r};try{let s=this.getDatabase();s.insertTelemetryFailure({id:o.id,operation:t,payload:e,error:o.failure,createdAt:r}),s.trimTelemetryFailures(Q),this.scheduleRetry();return}catch{}try{existsSync$1(this.cacheDir)||mkdirSync$1(this.cacheDir,{recursive:!0});let s=join$1(this.cacheDir,`${r}_${Math.random().toString(36).slice(2,11)}.json`);writeFileSync$1(s,JSON.stringify(o,null,2),{mode:384}),this.trimRetryCache(),this.scheduleRetry();}catch{}}trimRetryCache(){try{let t=readdirSync(this.cacheDir).filter(e=>e.endsWith(".json")).sort();for(let e of t.slice(0,Math.max(0,t.length-Q)))unlinkSync$1(join$1(this.cacheDir,e));}catch{}}scheduleRetry(){this.retryScheduled||(this.retryScheduled=true,setTimeout(()=>{this.retryScheduled=false,this.flushCache();},pt).unref());}scheduleMetricAggregation(){if(this.metricAggregationScheduled||process.env.DEVFLOW_HOOK_DEGRADED==="1")return;this.metricAggregationScheduled=true,setTimeout(()=>{this.metricAggregationScheduled=false;try{this.getDatabase().aggregatePendingToolMetrics(50)===50&&this.scheduleMetricAggregation();}catch{}},25).unref();}postHttp(t,e){G(t,e,{endpoint:this.apiUrl,fallbackReason:"telemetry_already_committed_locally"});}truncateInput(t){let e=JSON.stringify(t);return e===void 0||e.length<=Se?t:{_truncated:true,_original_size:e.length,_preview:`${e.substring(0,Se)}...`}}};function ke(n){return ["session_start","execution_start","tool_call","complete_event","execution_complete","session_end"].indexOf(n)}function Ee(n){return `hook-run:${n}`}function yt(n){if(!n||typeof n!="object")throw new Error("Invalid telemetry cache envelope");let t=n;if(typeof t.id!="string"||typeof t.operation!="string"||t.payload===void 0||typeof t.failure!="string"||typeof t.timestamp!="number")throw new Error("Invalid telemetry cache envelope");return t}async function xe(n){let t=!n.memory,e=n.memory??new MemoryGate(n.projectRoot),i=0,r=0;try{await e.forceWarmUp(),n.trigger==="session_end"&&(i=await e.releasePendingDistillLeases(n.sessionId)),r=e.getPendingEventCount(n.sessionId,n.trigger!=="session_end");}finally{t&&e.close();}let o=Date.now(),s=n.trigger==="session_end"&&n.sessionId?`distill:session_end:${createHash("sha256").update(`${n.projectRoot}\0${n.sessionId}`).digest("hex").slice(0,24)}`:`distill:${o}:${Math.random().toString(36).slice(2,10)}`,a={id:s,pendingEvents:r,releasedLeases:i,trigger:n.trigger,sessionId:n.sessionId,details:n.details};try{let d=openGlobalDevFlowDatabase();try{d.recordMemoryDistillCheckpoint({id:s,projectRoot:n.projectRoot,sessionId:n.sessionId,trigger:n.trigger,pendingEvents:r,releasedLeases:i,details:n.details,createdAt:o}),d.insertEvent({kind:"memory_distill_requested",timestamp:o,success:!0,metadata:{...a,projectRoot:n.projectRoot}});}finally{d.close();}}catch(d){throw d}return a}function De(n){return Buffer.from(n,"utf8").toString("base64url")}function wt(n,t,e){let i=t?.trim();if(i){let r=/^[a-zA-Z0-9:._-]{1,192}$/.test(i)?i:`tool-${createHash$1("sha256").update(i.slice(0,1024)).digest("hex").slice(0,32)}`;return `${n}:${r}`}return `${n}:legacy-${e}-${randomUUID().slice(0,8)}`}function Fe(n){return `${n}:legacy-journal`}var W=class{constructor(t){this.projectRoot=t;this.sessions=new Map;this.sessionsDir=join$1(z(t),"hook-sessions");}registerSession(t){let e=t.trim();if(!e)throw new Error("session_id_required");let i=this.get(e);if(i)return i.lastActivityAt=Date.now(),this.persist(i),i;let r=Date.now(),o={sessionId:e,projectRoot:this.projectRoot,requiredMcpTools:[],evidenceObligations:[],evidenceDegradations:[],evidenceOutcomes:[],startedAt:r,lastActivityAt:r};return this.sessions.set(e,o),this.persist(o),o}startExecution(t,e,i){let r=this.registerSession(t);return (!r.executionId||r.skillName!==e)&&(r.executionId=`exec_${Date.now()}_${randomUUID().slice(0,8)}`),r.skillName=e,r.requiredMcpTools=[...new Set(i)],r.lastActivityAt=Date.now(),this.persist(r),r}bindTaskIdentity(t,e){let i=this.registerSession(t);return i.activeTurnId=e.turnId,i.activeRequestId=e.requestId,i.intentArtifactHash=e.intentArtifactHash,i.lastActivityAt=Date.now(),this.persist(i),i}get(t){let e=t.trim();if(!e)return null;let i=this.sessions.get(e);if(i)return this.replayEvidenceJournal(i),i;let r=this.snapshotPath(e);if(!existsSync$1(r))return null;try{let o=JSON.parse(readFileSync(r,"utf8"));return o.sessionId!==e||o.projectRoot!==this.projectRoot?null:(o.requiredMcpTools=Array.isArray(o.requiredMcpTools)?o.requiredMcpTools:[],o.evidenceObligations=Oe(o.evidenceObligations),o.evidenceDegradations=qe(o.evidenceDegradations),o.evidenceOutcomes=Pe(o.evidenceOutcomes),this.replayEvidenceJournal(o),this.sessions.set(e,o),o)}catch{return null}}completeExecution(t){let e=this.get(t);if(!e)return null;let i=structuredClone(e);return delete e.executionId,delete e.skillName,e.requiredMcpTools=[],e.lastActivityAt=Date.now(),this.persist(e),i}addEvidenceObligation(t,e,i=Date.now(),r){let o=this.registerSession(t),a=(r?void 0:o.evidenceObligations.find(f=>f.contractId===e.id))?.obligationId??wt(e.id,r,i);this.appendEvidenceEvent(t,{kind:"add",obligationId:a,contractId:e.id,at:i,contract:e},`add\0${a}`),this.replayEvidenceJournal(o);let d=o.evidenceObligations.find(f=>f.obligationId===a);return d?(o.lastActivityAt=Date.now(),this.persist(o),structuredClone(d)):null}listEvidenceObligations(t){return (this.get(t)?.evidenceObligations??[]).map(e=>structuredClone(e))}markEvidenceCorrection(t,e,i,r,o=Date.now()){let s=this.get(t),a=s?.evidenceObligations.find(g=>g.obligationId===e);if(!s||!a)return null;let d=/^[a-f0-9]{64}$/.test(r)?r:"";if(!d)return null;this.appendEvidenceEvent(t,{kind:"correction",obligationId:e,contractId:a.contractId,at:o,fingerprint:d,violations:i.slice(0,16).map(g=>g.slice(0,240))},`correction\0${e}\0${d}`),this.replayEvidenceJournal(s),s.lastActivityAt=o,this.persist(s);let f=s.evidenceObligations.find(g=>g.obligationId===e);return f?structuredClone(f):null}resolveEvidenceObligation(t,e){let i=this.get(t);if(!i)return false;let r=i.evidenceObligations.find(s=>s.obligationId===e);if(!r)return false;let o=Date.now();return this.appendEvidenceEvent(t,{kind:"resolve",obligationId:e,contractId:r.contractId,at:o},`resolve\0${e}`),this.replayEvidenceJournal(i),i.lastActivityAt=o,this.persist(i),true}resolveDegradedEvidence(t,e){let i=this.get(t),r=i?.evidenceDegradations.find(s=>s.obligationId===e);if(!i||!r)return false;let o=Date.now();return this.appendEvidenceEvent(t,{kind:"resolve",obligationId:e,contractId:r.contractId,at:o},`resolve-degraded\0${e}\0${o}`),this.replayEvidenceJournal(i),i.lastActivityAt=o,this.persist(i),true}degradeEvidenceObligation(t,e,i,r=Date.now()){let o=this.get(t),s=o?.evidenceObligations.find(d=>d.obligationId===e);if(!o||!s)return false;let a=i.slice(0,240);return this.appendEvidenceEvent(t,{kind:"degrade",obligationId:e,contractId:s.contractId,at:r,reason:a},`degrade\0${e}\0${a}`),this.replayEvidenceJournal(o),o.lastActivityAt=r,this.persist(o),true}removeSession(t){let e=t.trim();e&&(this.sessions.delete(e),rmSync$1(this.snapshotPath(e),{force:true}),rmSync$1(this.evidenceJournalDir(e),{recursive:true,force:true}));}list(){return [...this.sessions.values()]}snapshotPath(t){return join$1(this.sessionsDir,`${De(t)}.json`)}evidenceJournalDir(t){return join$1(this.sessionsDir,"evidence-journal",De(t))}appendEvidenceEvent(t,e,i){let r=this.evidenceJournalDir(t);mkdirSync$1(r,{recursive:true,mode:448});let o=createHash$1("sha256").update(i).digest("hex"),s=join$1(r,`${e.kind}-${o}.json`);if(existsSync$1(s))return;let a=join$1(r,`.${process.pid}.${randomUUID()}.tmp`);writeFileSync$1(a,JSON.stringify(e),{mode:384});try{linkSync(a,s);}catch(d){if(d.code!=="EEXIST")throw d}finally{rmSync$1(a,{force:true});}}replayEvidenceJournal(t){t.evidenceObligations=Oe(t.evidenceObligations),t.evidenceDegradations=qe(t.evidenceDegradations),t.evidenceOutcomes=Pe(t.evidenceOutcomes);let e=this.evidenceJournalDir(t.sessionId);if(!existsSync$1(e))return;let i;try{i=readdirSync(e).filter(o=>/^(?:add|correction|resolve|degrade)-[a-f0-9]{64}\.json$/.test(o)).slice(0,4096);}catch{return}let r=i.flatMap(o=>{try{let s=readFileSync(join$1(e,o),"utf8");if(Buffer.byteLength(s,"utf8")>64*1024)return [];let a=St(JSON.parse(s));return a?[a]:[]}catch{return []}}).sort((o,s)=>o.at-s.at||$e(o.kind)-$e(s.kind));for(let o of r)this.applyEvidenceEvent(t,o);t.evidenceObligations=t.evidenceObligations.slice(-8),t.evidenceDegradations=t.evidenceDegradations.slice(-20),t.evidenceOutcomes=t.evidenceOutcomes.slice(-20);}applyEvidenceEvent(t,e){let i=t.evidenceOutcomes.find(s=>s.obligationId===e.obligationId);if(e.kind==="add"){if(i)return;let s=t.evidenceObligations.find(a=>a.obligationId===e.obligationId);s?(s.contract=e.contract,s.promptedAt=Math.min(s.promptedAt,e.at)):t.evidenceObligations.push({obligationId:e.obligationId,contractId:e.contractId,contract:e.contract,promptedAt:e.at,attempt:0,correctionRequested:false,violations:[]});return}let r=t.evidenceObligations.find(s=>s.obligationId===e.obligationId);if(e.kind==="correction"){if(!r||i||r.correctionFingerprint===e.fingerprint)return;r.attempt+=1,r.correctionRequested=true,r.correctionRequestedAt=e.at,r.correctionFingerprint=e.fingerprint,r.violations=e.violations;return}let o=r?.attempt??i?.attempt??0;if(e.kind==="resolve"&&i?.status==="degraded")t.evidenceOutcomes=t.evidenceOutcomes.filter(s=>s.obligationId!==e.obligationId),t.evidenceDegradations=t.evidenceDegradations.filter(s=>s.obligationId!==e.obligationId);else if(i)return;e.kind==="degrade"?(t.evidenceObligations=t.evidenceObligations.filter(s=>s.obligationId!==e.obligationId),t.evidenceDegradations.push({obligationId:e.obligationId,contractId:e.contractId,reason:e.reason,degradedAt:e.at,attempt:o,contract:r?.contract})):t.evidenceObligations=t.evidenceObligations.filter(s=>s.obligationId!==e.obligationId),t.evidenceOutcomes.push({obligationId:e.obligationId,contractId:e.contractId,status:e.kind==="resolve"?"resolved":"degraded",completedAt:e.at,attempt:o,...e.kind==="degrade"?{reason:e.reason}:{}});}persist(t){mkdirSync$1(this.sessionsDir,{recursive:true,mode:448});let e=this.snapshotPath(t.sessionId),i=`${e}.${process.pid}.${randomUUID()}.tmp`;writeFileSync$1(i,JSON.stringify(t),{mode:384}),renameSync$1(i,e);}};function Oe(n){return Array.isArray(n)?n.flatMap(t=>{if(!t||typeof t!="object")return [];let e=t;if(typeof e.contractId!="string"||e.contractId.length===0||e.contractId.length>128||typeof e.promptedAt!="number"||typeof e.attempt!="number"||typeof e.correctionRequested!="boolean"||!Array.isArray(e.violations)||!Me(e.contract))return [];let i=typeof e.obligationId=="string"&&e.obligationId.length>0&&e.obligationId.length<=384?e.obligationId:Fe(e.contractId),r=typeof e.correctionTranscriptHash=="string"?e.correctionTranscriptHash:void 0,o=e.correctionFingerprint??r;return o!==void 0&&!/^[a-f0-9]{64}$/.test(o)?[]:[{...e,obligationId:i,correctionFingerprint:o}]}).slice(-8):[]}function qe(n){return Array.isArray(n)?n.filter(t=>{if(!t||typeof t!="object")return false;let e=t;return typeof e.obligationId=="string"&&typeof e.contractId=="string"&&typeof e.reason=="string"&&typeof e.degradedAt=="number"&&typeof e.attempt=="number"}).slice(-20):[]}function Pe(n){return Array.isArray(n)?n.filter(t=>{if(!t||typeof t!="object")return false;let e=t;return typeof e.obligationId=="string"&&typeof e.contractId=="string"&&(e.status==="resolved"||e.status==="degraded")&&typeof e.completedAt=="number"&&typeof e.attempt=="number"&&(e.reason===void 0||typeof e.reason=="string")}).slice(-20):[]}function St(n){if(!n||typeof n!="object")return null;let t=n,e=t.kind;if(e!=="add"&&e!=="correction"&&e!=="resolve"&&e!=="degrade"||typeof t.contractId!="string"||t.contractId.length>128||typeof t.at!="number")return null;let r={obligationId:typeof t.obligationId=="string"&&t.obligationId.length>0&&t.obligationId.length<=384?t.obligationId:Fe(t.contractId),contractId:t.contractId,at:t.at};if(e==="add")return Me(t.contract)?{kind:e,...r,contract:t.contract}:null;if(e==="correction"){let o=typeof t.fingerprint=="string"?t.fingerprint:t.transcriptHash;return typeof o=="string"&&/^[a-f0-9]{64}$/.test(o)&&Array.isArray(t.violations)&&t.violations.every(s=>typeof s=="string"&&s.length<=240)?{kind:e,...r,fingerprint:o,violations:t.violations}:null}return e==="resolve"?{kind:e,...r}:typeof t.reason=="string"&&t.reason.length<=240?{kind:e,...r,reason:t.reason}:null}function $e(n){return n==="add"?0:n==="correction"?1:2}function Me(n){if(!n||typeof n!="object")return false;let t=n,e=t.requiredSections,i=t.prohibitedClaims;return t.version==="1.0"&&typeof t.id=="string"&&/^[a-zA-Z0-9][a-zA-Z0-9:._-]{0,127}$/.test(t.id)&&typeof t.runtimeProfilingOccurred=="boolean"&&typeof t.samplingEvidenceOccurred=="boolean"&&Array.isArray(e)&&e.length===3&&e[0]==="\u5DE5\u5177\u53D1\u73B0"&&e[1]==="\u6A21\u578B\u5047\u8BBE"&&e[2]==="\u9700\u8981\u8FD0\u884C\u65F6\u9A8C\u8BC1"&&Array.isArray(i)&&i.length<=16&&i.every(r=>typeof r=="string"&&r.length<=128)&&typeof t.canonicalReport=="string"&&Buffer.byteLength(t.canonicalReport,"utf8")<=48*1024&&!!t.correctionPolicy&&t.correctionPolicy.maxAttempts===1&&t.correctionPolicy.repeatedViolation==="fail_open"}function ze(n,t){let e=Tt(n);mkdirSync(e,{recursive:true,mode:448});let i=join(e,`${t.receiptId}.json`);if(existsSync(i))return t.receiptId;let r=`${i}.${process.pid}.tmp`;writeFileSync(r,JSON.stringify(t),{mode:384});try{renameSync(r,i);}catch(o){try{unlinkSync(r);}catch{}if(!existsSync(i))throw o}return t.receiptId}function Tt(n){return join(z(n),"session-finalize-pending")}var _=emitSemanticControlLog;var Ft=512*1024,Mt=500;var Lt=["\u5DE5\u5177\u53D1\u73B0","\u6A21\u578B\u5047\u8BBE","\u9700\u8981\u8FD0\u884C\u65F6\u9A8C\u8BC1"];function Nt(n){let t=false,e=[],i=[];for(let r of n){if(/^\s*```/.test(r)){t=!t,e.push(""),i.push(r.replace(/^\s*```+[^\s`]*/,"").replace(/```+\s*$/,"").trim());continue}e.push(t?"":r.replace(/`[^`]*`/g,"").trim()),i.push(r.replace(/`([^`]*)`/g,(o,s)=>zt(s)?"":s).trim());}return {headingLines:e,claimLines:i}}function zt(n){let t=n.trim().slice(0,256);return !t||/\s/.test(t)||n.trim().length>256?false:/^[A-Za-z_$][\w$.-]*$/.test(t)||/^(['"])[^'"`]*\1$/.test(t)}function Ht(n,t){if(!n||n.length>4096)return {degradationReason:"transcript_path_missing"};let e;try{let i=lstatSync(n);if(!i.isFile()||i.isSymbolicLink())return {degradationReason:"transcript_path_unsafe"};e=openSync(n,constants.O_RDONLY|(constants.O_NOFOLLOW??0));let r=fstatSync(e);if(!r.isFile()||r.dev!==i.dev||r.ino!==i.ino)return {degradationReason:"transcript_path_changed"};let o=Math.min(r.size,Ft),s=Buffer.alloc(o),a=0;for(;a<o;){let h=readSync(e,s,a,o-a,r.size-o+a);if(h===0)break;a+=h;}let d=s.subarray(0,a).toString("utf8");r.size>o&&(d=d.slice(Math.max(0,d.indexOf(`
3
- `)+1)));let f=d.split(/\r?\n/).slice(-Mt),g=t.length>0?Math.min(...t.map(h=>h.promptedAt)):0,c=Bt(f,g),v=[...c].reverse().find(h=>Ut(h.text,t))??c.at(-1);return v?.text?{answer:v.text,fingerprint:v.fingerprint}:{degradationReason:"transcript_answer_unavailable"}}catch{return {degradationReason:"transcript_unreadable"}}finally{e!==void 0&&closeSync(e);}}function Ut(n,t){let e=new Set(t.flatMap(r=>r.contract.requiredSections)),i=Vt(Nt(n.split(/\r?\n/u)).headingLines);return [...e].every(r=>i.found.has(r))}function Ue(n){return Ht(n,[]).answer}function Bt(n,t){let e=[];for(let i=0;i<n.length;i++){let r=n[i];if(r.trim())try{let o=JSON.parse(r),s=o.message;if(!s||typeof s!="object"||s.role!=="assistant")continue;let a=s,d=Jt(o.timestamp);if(d>0&&d+5e3<t)continue;let f=s.content,g=typeof f=="string"?f:Array.isArray(f)?f.filter(c=>c&&typeof c=="object"&&c.type==="text").map(c=>c.text).filter(c=>typeof c=="string").join(`
4
- `):"";if(g.trim()){let c=g.trim(),y=typeof a.id=="string"&&a.id?`message:${a.id}`:typeof o.uuid=="string"&&o.uuid?`uuid:${o.uuid}`:`record:${String(o.timestamp??"")}:${i}:${createHash("sha256").update(r).digest("hex")}`,v=createHash("sha256").update(c).digest("hex"),h=createHash("sha256").update(`${y}\0${v}`).digest("hex");e.push({text:c,timestamp:d,fingerprint:h});}}catch{continue}}return e}function Jt(n){if(typeof n=="number"&&Number.isFinite(n))return n;if(typeof n!="string")return 0;let t=Date.parse(n);return Number.isFinite(t)?t:0}function Vt(n){let t=new Set,e=new Map,i;for(let r=0;r<n.length;r++){let o=n[r].trim().replace(/^#{1,6}\s*/,"").replace(/^\*\*(.*)\*\*$/,"$1").replace(/^(?:[一二三123][、..]\s*)/,"").replace(/[::]\s*$/,"").trim(),s=Lt.find(a=>o===a);s&&(i=s,t.add(s)),e.set(r,i);}return {found:t,byLine:e}}function Ve(n){let t=openGlobalDevFlowDatabase();try{let e=t.listRetrievalLedgerEvents(n),i=new Map(e.filter(c=>c.stage==="selected").map(c=>[Je(c),c])),r=new Map(e.filter(c=>c.stage==="consumed").map(c=>[Je(c),c])),o=0,s=0,a=0;for(let[c,y]of i){let v=r.get(c);v&&n.verificationReceipt&&t.appendRetrievalLedgerEvent({...v,id:retrievalLedgerTransitionId(v.id,"verified",n.verificationReceipt),stage:"verified",verificationReceipt:n.verificationReceipt,reasonCode:"same_task_verification_receipt",createdAt:n.finishedAt??Date.now()});let h=v&&n.verificationReceipt&&n.outcome!=="unknown"?n.outcome:"unknown",b=h==="positive"?"positive_outcome":h==="negative"?"negative_outcome":"unknown_outcome";t.appendRetrievalLedgerEvent({...y,id:retrievalLedgerTransitionId(y.id,b,n.verificationReceipt??n.sessionId),stage:b,reason:v?n.outcomeReason:"selected_not_consumed",toolEvidence:v?.toolEvidence??[],verificationReceipt:h==="unknown"?void 0:n.verificationReceipt,payload:{...y.payload,consumed:!!v},createdAt:n.finishedAt??Date.now()}),b==="positive_outcome"?o+=1:b==="negative_outcome"?s+=1:a+=1;}let d=n.requiredChannels.map(c=>{let y=[...i.values()].filter(h=>h.sourceType===c).length,v=[...r.values()].filter(h=>h.sourceType===c).length;return {channel:c,selected:y,consumed:v,verified:n.verificationReceipt?v:0}}),f={status:d.length>0&&d.every(c=>c.selected>0&&c.consumed===c.selected&&c.verified===c.selected)?"complete":"unavailable",channels:d},g={consumed:r.size,positive:o,negative:s,unknown:a,consumedSources:[...r.values()].map(c=>({sourceType:c.sourceType,sourceId:c.sourceId})),proof:f};return n.verificationReceipt&&r.size>0&&le({event:"retrieval.attribution.transitioned",identity:{projectRoot:n.projectRoot,sessionId:n.sessionId,executionId:n.executionId,requestId:n.requestId},level:"info",timestamp:n.finishedAt??Date.now(),data:{stage:"verified",verifiedCount:r.size}}),le({event:"task.proof.completed",identity:{projectRoot:n.projectRoot,sessionId:n.sessionId,executionId:n.executionId,requestId:n.requestId},level:f.status==="complete"?"info":"warn",timestamp:n.finishedAt??Date.now(),data:f}),le({event:"retrieval.attribution.transitioned",identity:{projectRoot:n.projectRoot,sessionId:n.sessionId,executionId:n.executionId,requestId:n.requestId},level:a>0?"warn":"info",timestamp:n.finishedAt??Date.now(),data:{stage:"session_outcome",selectedCount:i.size,consumedCount:r.size,verifiedCount:n.verificationReceipt?r.size:0,positiveCount:o,negativeCount:s,unknownCount:a}}),g}finally{t.close();}}function Je(n){return [n.requestId,n.contextReceipt,n.sourceType,n.sourceId].join("\0")}function le(n){try{_(n);}catch{}}var tn=8*1024*1024;function Ke(n){if(!n.transcriptPath||!existsSync(n.transcriptPath))return {status:"unavailable",eventsRead:0,failuresFound:0,failuresRecorded:0,reason:"transcript_path_unavailable"};let t=openGlobalDevFlowDatabase(void 0,{busyTimeoutMs:250});try{let e=t.getLatestTranscriptCheckpoint({projectRoot:n.projectRoot,hostId:"claude-code",sessionId:n.sessionId,sourcePath:n.transcriptPath}),i=statSync(n.transcriptPath).size,r=Math.min(e?.byteOffset??0,i),o=Math.min(tn,i-r);if(o<=0)return {status:"completed",eventsRead:0,failuresFound:0,failuresRecorded:0,checkpointId:e?.id};let s=Buffer.alloc(o),a=openSync(n.transcriptPath,"r");try{readSync(a,s,0,o,r);}finally{closeSync(a);}let d=s.toString("utf8").split(/\r?\n/u).filter(Boolean),f=t.listLatestTaskIntentArtifacts(n.projectRoot,n.sessionId),g=new Map,c=new Set,y=0,v=0;for(let C of d){let D;try{D=JSON.parse(C);}catch{continue}for(let O of ue(D,g)){let I=claudeCodeRuntimeAdapter.normalizeToolResult(O,{projectRoot:n.projectRoot});if(I.success||!I.error)continue;let P=I.toolUseId??I.sourceHash;if(c.has(P))continue;c.add(P),y++;let R=I.toolUseId?t.getToolCallEventByToolUseId(n.sessionId,I.toolUseId):null,A=We(R?.input,"_devflow_turn_id"),U=We(R?.input,"_devflow_request_id"),k=A?f.find(w=>w.turnId===A):[...f].reverse().find(w=>(!R?.executionId||w.executionId===R.executionId)&&w.createdAt<=(R?.timestamp??I.timestamp))??f.at(-1),B=`host-failure:${I.sourceHash}`;t.insertEvent({kind:"host_transcript_tool_failure",timestamp:I.timestamp,success:!1,toolName:I.canonicalName??I.requestedName,metadata:{projectRoot:n.projectRoot,sessionId:n.sessionId,turnId:A??k?.turnId,requestId:U??k?.requestId,sourceId:B,toolUseId:I.toolUseId,correlatedEventId:R?.eventId,requestedName:I.requestedName,canonicalName:I.canonicalName,failureCategory:I.failureCategory,error:I.error.slice(0,1e3)}}),_({event:"host.tool.result.reconciled",identity:{projectRoot:n.projectRoot,sessionId:n.sessionId,turnId:A??k?.turnId,requestId:U??k?.requestId,executionId:R?.executionId},level:"warn",timestamp:Date.now(),data:{toolUseId:I.toolUseId,toolName:I.canonicalName??I.requestedName,failureCategory:I.failureCategory,correlation:R?"tool_use_id":"timestamp_fallback"}}),v++;}}let h=createHash("sha256").update(s).digest("hex"),b=`transcript:${createHash("sha256").update(`${n.projectRoot}\0${n.sessionId}\0${n.transcriptPath}\0${r+o}\0${h}`).digest("hex").slice(0,24)}`;return t.appendTranscriptCheckpoint({id:b,projectRoot:n.projectRoot,hostId:"claude-code",sessionId:n.sessionId,sourcePath:n.transcriptPath,sourceHash:h,byteOffset:r+o,eventCount:d.length,createdAt:Date.now()}),_({event:"session.reconciled",identity:{projectRoot:n.projectRoot,sessionId:n.sessionId},level:y>0?"warn":"info",timestamp:Date.now(),data:{stage:"transcript",eventsRead:d.length,failuresFound:y,failuresRecorded:v,checkpointId:b}}),{status:"completed",eventsRead:d.length,failuresFound:y,failuresRecorded:v,checkpointId:b}}catch(e){return {status:"degraded",eventsRead:0,failuresFound:0,failuresRecorded:0,reason:e instanceof Error?e.message:String(e)}}finally{t.close();}}function We(n,t){let e=n?.[t];return typeof e=="string"&&e.trim()?e.trim():void 0}function ue(n,t,e=0){if(e>7||n===null||n===void 0)return [];if(Array.isArray(n))return n.flatMap(s=>ue(s,t,e+1));if(typeof n!="object")return [];let i=n,r=typeof i.type=="string"?i.type:"";r==="tool_use"&&typeof i.id=="string"&&typeof i.name=="string"&&t.set(i.id,i.name);let o=[];if(r==="tool_result"){let s=typeof i.tool_use_id=="string"?i.tool_use_id:void 0;o.push({tool_name:s?t.get(s)??"unknown":"unknown",tool_use_id:s,tool_response:i.content,is_error:i.is_error===true,...i.is_error===true?{error:fe(i.content)||"host tool result failed"}:{},timestamp:i.timestamp});}else (i.tool_name||i.toolName)&&(i.tool_response!==void 0||i.output!==void 0||i.error!==void 0)&&o.push(i);for(let[s,a]of Object.entries(i))s==="content"&&r==="tool_result"||o.push(...ue(a,t,e+1));return o}function fe(n){if(typeof n=="string")return n.slice(0,4e3);if(Array.isArray(n))return n.map(fe).filter(Boolean).join(`
1
+ import {getLocalApiKey,getDevFlowStateRoot,getProjectStateDir,claudeCodeRuntimeAdapter,resolveRuntimeEndpoint,acquireRuntimeHttpCircuit,registerRuntimeHttpSuccess,registerRuntimeHttpFailure}from'@devflow-tools/sdk';import {openGlobalDevFlowDatabase,retrievalLedgerTransitionId}from'@devflow-tools/database';import {MemoryGate}from'@devflow-tools/memory-engine';import {existsSync as existsSync$1,readFileSync,rmSync as rmSync$1,mkdirSync as mkdirSync$1,writeFileSync as writeFileSync$1,linkSync,readdirSync,renameSync as renameSync$1,unlinkSync as unlinkSync$1}from'fs';import {join as join$1}from'path';import {request}from'node:http';import {mkdirSync,existsSync,writeFileSync,renameSync,unlinkSync,rmSync,statSync,openSync,readSync,closeSync,lstatSync,constants,fstatSync,appendFileSync}from'node:fs';import {join}from'node:path';import {emitSemanticControlLog,rotateDiagnosticLogFile}from'@devflow-tools/telemetry';import {createHash}from'node:crypto';import {randomUUID,createHash as createHash$1}from'crypto';import'@devflow-tools/task-runtime';function X(n){return n??process.env.CLAUDE_PROJECT_DIR??process.cwd()}function z(n){return getProjectStateDir(X(n))}function re(n,t,e){try{let i=openGlobalDevFlowDatabase();try{i.insertEvent({kind:n,timestamp:Date.now(),duration:e,success:t.success!==!1,metadata:t});}finally{i.close();}}catch{}}var ct=getLocalApiKey(),se=join(getDevFlowStateRoot(),"errors");async function G(n,t,e={}){let i=e.endpoint??resolveRuntimeEndpoint().url,r=e.timeout??1500,o=e.durableMirror??true,s=e.maxRetries??(o?0:2),a=e.circuitBreaker??true,d=acquireRuntimeHttpCircuit(i,n);if(a&&!d.allowed)return {delivered:false,suppressed:true,fallbackReason:d.state.fallbackReason};let f;for(let c=0;c<=s;c+=1)try{return await dt(i,n,t,r),a&&registerRuntimeHttpSuccess(i,n).transitioned&&re("http_circuit_transition",{endpoint:i,path:new URL(n,i).pathname,previous:d.state.status,status:"closed",failures:0}),{delivered:!0,suppressed:!1}}catch(y){f=y instanceof Error?y:new Error(String(y)),c<s&&await lt(Math.min(100*2**c,1e3));}if(!f)return {delivered:false,suppressed:false,fallbackReason:"unknown_http_failure"};if(!a)return be(n,f),{delivered:false,suppressed:false,fallbackReason:f.message};let g=registerRuntimeHttpFailure(i,n,e.fallbackReason??(o?"local_durable_mirror":"http_delivery_failed"));return g.transitioned&&(be(n,f),re("http_circuit_transition",{endpoint:i,path:new URL(n,i).pathname,previous:d.state.status,status:"open",failures:g.state.failures,openUntil:g.state.openUntil,fallbackReason:g.state.fallbackReason})),{delivered:false,suppressed:false,fallbackReason:g.state.fallbackReason}}function dt(n,t,e,i){return new Promise((r,o)=>{let s=JSON.stringify(e),a=new URL(t,n),d=false,f=c=>{d||(d=true,c?o(c):r());},g=request({hostname:a.hostname,port:a.port,path:a.pathname+a.search,method:"POST",headers:{"Content-Type":"application/json","X-API-Key":ct,"Content-Length":Buffer.byteLength(s)},timeout:i},c=>{c.on("error",f),c.on("end",()=>{let y=c.statusCode??0;f(y>=200&&y<300?void 0:new Error(`HTTP ${y}`));}),c.resume();});g.on("error",f),g.on("timeout",()=>g.destroy(new Error(`HTTP mirror timed out after ${i}ms`))),g.write(s),g.end();})}function be(n,t){try{existsSync(se)||mkdirSync(se,{recursive:!0});let e=join(se,"http-errors.log"),i=`${new Date().toISOString()} | ${n} | ${t.message}
2
+ `;rotateDiagnosticLogFile({path:e,maxBytes:50*1024*1024,maxFiles:5,incomingBytes:Buffer.byteLength(i)}),appendFileSync(e,i);}catch{}}function lt(n){return new Promise(t=>setTimeout(t,n))}var Se=1e4,yt=3e4,Q=500,ee=class{constructor(t){this.retryScheduled=false;this.metricAggregationScheduled=false;this.apiUrl=t?.apiUrl,this.cacheDir=t?.cacheDir??join$1(getDevFlowStateRoot(),"global","telemetry-cache"),this.database=t?.database??null,this.ownsDatabase=!t?.database;let e=t?.busyTimeoutMs??Number(process.env.DEVFLOW_TELEMETRY_DB_BUSY_TIMEOUT_MS);this.busyTimeoutMs=Number.isSafeInteger(e)&&e>=0?e:100;}async sendEvent(t){let e={...t,input:this.truncateInput(t.input)};return this.commitOrCache("tool_call",e)?(this.postHttp("/api/telemetry/tool-call",e),t.eventId):null}async sendExecutionStart(t,e,i,r,o=process.env.CLAUDE_PROJECT_DIR??process.cwd(),s=[]){let a={executionId:t,sessionId:e,skillName:i,startedAt:r,projectRoot:o,requiredMcpTools:s};this.commitOrCache("execution_start",a)&&this.postHttp("/api/telemetry/skill-execution/start",a);}async sendExecutionComplete(t,e="completed",i=Date.now(),r){let o={executionId:t,status:e,finishedAt:i,metadata:r},s=this.commitOrCache("execution_complete",o);return s&&this.postHttp("/api/telemetry/skill-execution/complete-reconciled",o),s}async sendSessionStart(t,e,i){let r={id:t,projectRoot:e,startedAt:i,label:e.split("/").pop()??"unknown"},o=this.commitOrCache("session_start",r);return o&&this.postHttp("/api/telemetry/sessions",r),o}async completeEvent(t){let e=this.commitOrCache("complete_event",t);return e&&(this.postHttp("/api/telemetry/tool-call/output",t),this.scheduleMetricAggregation()),e}async endSession(t,e=Date.now()){let i={sessionId:t,finishedAt:e},r=this.commitOrCache("session_end",i);return r&&(this.getDatabase().aggregatePendingToolMetrics(),this.postHttp(`/api/telemetry/sessions/${encodeURIComponent(t)}/close`,{finishedAt:e})),r}async flushCache(){try{let e=this.getDatabase(),i=e.listTelemetryFailures({unresolvedOnly:!0,limit:Q}).reverse();for(let r of i)try{this.applyOperation(r.operation,r.payload),e.resolveTelemetryFailure(r.id);}catch{}e.trimTelemetryFailures(Q);}catch{}let t=(existsSync$1(this.cacheDir)?readdirSync(this.cacheDir):[]).filter(e=>e.endsWith(".json")).map(e=>{let i=join$1(this.cacheDir,e);try{return {cacheFile:i,envelope:ht(JSON.parse(readFileSync(i,"utf8")))}}catch{return null}}).filter(e=>e!==null).sort((e,i)=>e.envelope.timestamp-i.envelope.timestamp||ke(e.envelope.operation)-ke(i.envelope.operation));for(let{cacheFile:e,envelope:i}of t)try{let r=this.getDatabase();r.insertTelemetryFailure({id:i.id,operation:i.operation,payload:i.payload,error:i.failure,createdAt:i.timestamp}),this.applyOperation(i.operation,i.payload),r.resolveTelemetryFailure(i.id),unlinkSync$1(e);}catch{}this.database?.aggregatePendingToolMetrics();}aggregateMetrics(){return this.getDatabase().aggregatePendingToolMetrics()}async flushAndAggregate(){await this.flushCache(),this.aggregateMetrics();}close(){this.ownsDatabase&&this.database?.close(),this.database=null;}getDatabase(){return this.database??=openGlobalDevFlowDatabase(void 0,{busyTimeoutMs:this.busyTimeoutMs}),this.database}commitOrCache(t,e){try{return this.applyOperation(t,e),!0}catch(i){return this.cacheOperation(t,e,i),false}}applyOperation(t,e){let i=this.getDatabase();switch(t){case "tool_call":this.ensureParentSession(i,e),i.insertToolCallEvent(e);return;case "execution_start":this.ensureParentSession(i,e),i.insertSkillExecution({executionId:e.executionId,sessionId:e.sessionId,skillName:e.skillName,startedAt:e.startedAt,status:"running",requiredMcpTools:e.requiredMcpTools});return;case "execution_complete":i.reconcileSkillExecution(e.executionId,e.status,e.finishedAt,e.metadata);return;case "session_start":i.ensureSession(e),i.insertRun({id:xe(e.id),source:"hook",tool:"session",input:{projectRoot:e.projectRoot},status:"active",startedAt:e.startedAt,tokenUsed:0,metadata:{sessionId:e.id,projectRoot:e.projectRoot}});return;case "complete_event":if(!i.updateToolCallEvent(e.eventId,{output:e.output===void 0?void 0:JSON.stringify(e.output),error:e.error,failureCategory:e.failureCategory,duration:e.duration}))throw new Error(`Tool call event ${e.eventId} is not available for completion`);return;case "session_end":i.closeSession(e.sessionId,e.finishedAt),i.updateRun(xe(e.sessionId),{status:"completed",finishedAt:e.finishedAt});return}}ensureParentSession(t,e){let i=typeof e.sessionId=="string"?e.sessionId.trim():"";if(!i)throw new Error("Canonical session ID is required for telemetry");let r=typeof e.projectRoot=="string"&&e.projectRoot.trim()?e.projectRoot:typeof e.input?.projectRoot=="string"&&e.input.projectRoot.trim()?e.input.projectRoot:process.env.CLAUDE_PROJECT_DIR??"unknown";t.ensureSession({id:i,projectRoot:r,label:r==="unknown"?void 0:r.split("/").pop(),startedAt:Number(e.startedAt??e.timestamp??Date.now())});}cacheOperation(t,e,i){let r=Date.now(),o={id:`failure:${r}:${Math.random().toString(36).slice(2,11)}`,operation:t,payload:e,failure:i instanceof Error?i.message:String(i),timestamp:r};try{let s=this.getDatabase();s.insertTelemetryFailure({id:o.id,operation:t,payload:e,error:o.failure,createdAt:r}),s.trimTelemetryFailures(Q),this.scheduleRetry();return}catch{}try{existsSync$1(this.cacheDir)||mkdirSync$1(this.cacheDir,{recursive:!0});let s=join$1(this.cacheDir,`${r}_${Math.random().toString(36).slice(2,11)}.json`);writeFileSync$1(s,JSON.stringify(o,null,2),{mode:384}),this.trimRetryCache(),this.scheduleRetry();}catch{}}trimRetryCache(){try{let t=readdirSync(this.cacheDir).filter(e=>e.endsWith(".json")).sort();for(let e of t.slice(0,Math.max(0,t.length-Q)))unlinkSync$1(join$1(this.cacheDir,e));}catch{}}scheduleRetry(){this.retryScheduled||(this.retryScheduled=true,setTimeout(()=>{this.retryScheduled=false,this.flushCache();},yt).unref());}scheduleMetricAggregation(){if(this.metricAggregationScheduled||process.env.DEVFLOW_HOOK_DEGRADED==="1")return;this.metricAggregationScheduled=true,setTimeout(()=>{this.metricAggregationScheduled=false;try{this.getDatabase().aggregatePendingToolMetrics(50)===50&&this.scheduleMetricAggregation();}catch{}},25).unref();}postHttp(t,e){G(t,e,{endpoint:this.apiUrl,fallbackReason:"telemetry_already_committed_locally"});}truncateInput(t){let e=JSON.stringify(t);return e===void 0||e.length<=Se?t:{_truncated:true,_original_size:e.length,_preview:`${e.substring(0,Se)}...`}}};function ke(n){return ["session_start","execution_start","tool_call","complete_event","execution_complete","session_end"].indexOf(n)}function xe(n){return `hook-run:${n}`}function ht(n){if(!n||typeof n!="object")throw new Error("Invalid telemetry cache envelope");let t=n;if(typeof t.id!="string"||typeof t.operation!="string"||t.payload===void 0||typeof t.failure!="string"||typeof t.timestamp!="number")throw new Error("Invalid telemetry cache envelope");return t}async function Ee(n){let t=!n.memory,e=n.memory??new MemoryGate(n.projectRoot),i=0,r=0;try{await e.forceWarmUp(),n.trigger==="session_end"&&(i=await e.releasePendingDistillLeases(n.sessionId)),r=e.getPendingEventCount(n.sessionId,n.trigger!=="session_end");}finally{t&&e.close();}let o=Date.now(),s=n.trigger==="session_end"&&n.sessionId?`distill:session_end:${createHash("sha256").update(`${n.projectRoot}\0${n.sessionId}`).digest("hex").slice(0,24)}`:`distill:${o}:${Math.random().toString(36).slice(2,10)}`,a={id:s,pendingEvents:r,releasedLeases:i,trigger:n.trigger,sessionId:n.sessionId,details:n.details};try{let d=openGlobalDevFlowDatabase();try{d.recordMemoryDistillCheckpoint({id:s,projectRoot:n.projectRoot,sessionId:n.sessionId,trigger:n.trigger,pendingEvents:r,releasedLeases:i,details:n.details,createdAt:o}),d.insertEvent({kind:"memory_distill_requested",timestamp:o,success:!0,metadata:{...a,projectRoot:n.projectRoot}});}finally{d.close();}}catch(d){throw d}return a}function De(n){return Buffer.from(n,"utf8").toString("base64url")}function St(n,t,e){let i=t?.trim();if(i){let r=/^[a-zA-Z0-9:._-]{1,192}$/.test(i)?i:`tool-${createHash$1("sha256").update(i.slice(0,1024)).digest("hex").slice(0,32)}`;return `${n}:${r}`}return `${n}:legacy-${e}-${randomUUID().slice(0,8)}`}function Fe(n){return `${n}:legacy-journal`}var W=class{constructor(t){this.projectRoot=t;this.sessions=new Map;this.sessionsDir=join$1(z(t),"hook-sessions");}registerSession(t){let e=t.trim();if(!e)throw new Error("session_id_required");let i=this.get(e);if(i)return i.lastActivityAt=Date.now(),this.persist(i),i;let r=Date.now(),o={sessionId:e,projectRoot:this.projectRoot,requiredMcpTools:[],evidenceObligations:[],evidenceDegradations:[],evidenceOutcomes:[],startedAt:r,lastActivityAt:r};return this.sessions.set(e,o),this.persist(o),o}startExecution(t,e,i){let r=this.registerSession(t);return (!r.executionId||r.skillName!==e)&&(r.executionId=`exec_${Date.now()}_${randomUUID().slice(0,8)}`),r.skillName=e,r.requiredMcpTools=[...new Set(i)],r.lastActivityAt=Date.now(),this.persist(r),r}bindTaskIdentity(t,e){let i=this.registerSession(t);return i.activeTurnId=e.turnId,i.activeRequestId=e.requestId,i.intentArtifactHash=e.intentArtifactHash,i.lastActivityAt=Date.now(),this.persist(i),i}get(t){let e=t.trim();if(!e)return null;let i=this.sessions.get(e);if(i)return this.replayEvidenceJournal(i),i;let r=this.snapshotPath(e);if(!existsSync$1(r))return null;try{let o=JSON.parse(readFileSync(r,"utf8"));return o.sessionId!==e||o.projectRoot!==this.projectRoot?null:(o.requiredMcpTools=Array.isArray(o.requiredMcpTools)?o.requiredMcpTools:[],o.evidenceObligations=Oe(o.evidenceObligations),o.evidenceDegradations=qe(o.evidenceDegradations),o.evidenceOutcomes=Pe(o.evidenceOutcomes),this.replayEvidenceJournal(o),this.sessions.set(e,o),o)}catch{return null}}completeExecution(t){let e=this.get(t);if(!e)return null;let i=structuredClone(e);return delete e.executionId,delete e.skillName,e.requiredMcpTools=[],e.lastActivityAt=Date.now(),this.persist(e),i}addEvidenceObligation(t,e,i=Date.now(),r){let o=this.registerSession(t),a=(r?void 0:o.evidenceObligations.find(f=>f.contractId===e.id))?.obligationId??St(e.id,r,i);this.appendEvidenceEvent(t,{kind:"add",obligationId:a,contractId:e.id,at:i,contract:e},`add\0${a}`),this.replayEvidenceJournal(o);let d=o.evidenceObligations.find(f=>f.obligationId===a);return d?(o.lastActivityAt=Date.now(),this.persist(o),structuredClone(d)):null}listEvidenceObligations(t){return (this.get(t)?.evidenceObligations??[]).map(e=>structuredClone(e))}markEvidenceCorrection(t,e,i,r,o=Date.now()){let s=this.get(t),a=s?.evidenceObligations.find(g=>g.obligationId===e);if(!s||!a)return null;let d=/^[a-f0-9]{64}$/.test(r)?r:"";if(!d)return null;this.appendEvidenceEvent(t,{kind:"correction",obligationId:e,contractId:a.contractId,at:o,fingerprint:d,violations:i.slice(0,16).map(g=>g.slice(0,240))},`correction\0${e}\0${d}`),this.replayEvidenceJournal(s),s.lastActivityAt=o,this.persist(s);let f=s.evidenceObligations.find(g=>g.obligationId===e);return f?structuredClone(f):null}resolveEvidenceObligation(t,e){let i=this.get(t);if(!i)return false;let r=i.evidenceObligations.find(s=>s.obligationId===e);if(!r)return false;let o=Date.now();return this.appendEvidenceEvent(t,{kind:"resolve",obligationId:e,contractId:r.contractId,at:o},`resolve\0${e}`),this.replayEvidenceJournal(i),i.lastActivityAt=o,this.persist(i),true}resolveDegradedEvidence(t,e){let i=this.get(t),r=i?.evidenceDegradations.find(s=>s.obligationId===e);if(!i||!r)return false;let o=Date.now();return this.appendEvidenceEvent(t,{kind:"resolve",obligationId:e,contractId:r.contractId,at:o},`resolve-degraded\0${e}\0${o}`),this.replayEvidenceJournal(i),i.lastActivityAt=o,this.persist(i),true}degradeEvidenceObligation(t,e,i,r=Date.now()){let o=this.get(t),s=o?.evidenceObligations.find(d=>d.obligationId===e);if(!o||!s)return false;let a=i.slice(0,240);return this.appendEvidenceEvent(t,{kind:"degrade",obligationId:e,contractId:s.contractId,at:r,reason:a},`degrade\0${e}\0${a}`),this.replayEvidenceJournal(o),o.lastActivityAt=r,this.persist(o),true}removeSession(t){let e=t.trim();e&&(this.sessions.delete(e),rmSync$1(this.snapshotPath(e),{force:true}),rmSync$1(this.evidenceJournalDir(e),{recursive:true,force:true}));}list(){return [...this.sessions.values()]}snapshotPath(t){return join$1(this.sessionsDir,`${De(t)}.json`)}evidenceJournalDir(t){return join$1(this.sessionsDir,"evidence-journal",De(t))}appendEvidenceEvent(t,e,i){let r=this.evidenceJournalDir(t);mkdirSync$1(r,{recursive:true,mode:448});let o=createHash$1("sha256").update(i).digest("hex"),s=join$1(r,`${e.kind}-${o}.json`);if(existsSync$1(s))return;let a=join$1(r,`.${process.pid}.${randomUUID()}.tmp`);writeFileSync$1(a,JSON.stringify(e),{mode:384});try{linkSync(a,s);}catch(d){if(d.code!=="EEXIST")throw d}finally{rmSync$1(a,{force:true});}}replayEvidenceJournal(t){t.evidenceObligations=Oe(t.evidenceObligations),t.evidenceDegradations=qe(t.evidenceDegradations),t.evidenceOutcomes=Pe(t.evidenceOutcomes);let e=this.evidenceJournalDir(t.sessionId);if(!existsSync$1(e))return;let i;try{i=readdirSync(e).filter(o=>/^(?:add|correction|resolve|degrade)-[a-f0-9]{64}\.json$/.test(o)).slice(0,4096);}catch{return}let r=i.flatMap(o=>{try{let s=readFileSync(join$1(e,o),"utf8");if(Buffer.byteLength(s,"utf8")>64*1024)return [];let a=kt(JSON.parse(s));return a?[a]:[]}catch{return []}}).sort((o,s)=>o.at-s.at||$e(o.kind)-$e(s.kind));for(let o of r)this.applyEvidenceEvent(t,o);t.evidenceObligations=t.evidenceObligations.slice(-8),t.evidenceDegradations=t.evidenceDegradations.slice(-20),t.evidenceOutcomes=t.evidenceOutcomes.slice(-20);}applyEvidenceEvent(t,e){let i=t.evidenceOutcomes.find(s=>s.obligationId===e.obligationId);if(e.kind==="add"){if(i)return;let s=t.evidenceObligations.find(a=>a.obligationId===e.obligationId);s?(s.contract=e.contract,s.promptedAt=Math.min(s.promptedAt,e.at)):t.evidenceObligations.push({obligationId:e.obligationId,contractId:e.contractId,contract:e.contract,promptedAt:e.at,attempt:0,correctionRequested:false,violations:[]});return}let r=t.evidenceObligations.find(s=>s.obligationId===e.obligationId);if(e.kind==="correction"){if(!r||i||r.correctionFingerprint===e.fingerprint)return;r.attempt+=1,r.correctionRequested=true,r.correctionRequestedAt=e.at,r.correctionFingerprint=e.fingerprint,r.violations=e.violations;return}let o=r?.attempt??i?.attempt??0;if(e.kind==="resolve"&&i?.status==="degraded")t.evidenceOutcomes=t.evidenceOutcomes.filter(s=>s.obligationId!==e.obligationId),t.evidenceDegradations=t.evidenceDegradations.filter(s=>s.obligationId!==e.obligationId);else if(i)return;e.kind==="degrade"?(t.evidenceObligations=t.evidenceObligations.filter(s=>s.obligationId!==e.obligationId),t.evidenceDegradations.push({obligationId:e.obligationId,contractId:e.contractId,reason:e.reason,degradedAt:e.at,attempt:o,contract:r?.contract})):t.evidenceObligations=t.evidenceObligations.filter(s=>s.obligationId!==e.obligationId),t.evidenceOutcomes.push({obligationId:e.obligationId,contractId:e.contractId,status:e.kind==="resolve"?"resolved":"degraded",completedAt:e.at,attempt:o,...e.kind==="degrade"?{reason:e.reason}:{}});}persist(t){mkdirSync$1(this.sessionsDir,{recursive:true,mode:448});let e=this.snapshotPath(t.sessionId),i=`${e}.${process.pid}.${randomUUID()}.tmp`;writeFileSync$1(i,JSON.stringify(t),{mode:384}),renameSync$1(i,e);}};function Oe(n){return Array.isArray(n)?n.flatMap(t=>{if(!t||typeof t!="object")return [];let e=t;if(typeof e.contractId!="string"||e.contractId.length===0||e.contractId.length>128||typeof e.promptedAt!="number"||typeof e.attempt!="number"||typeof e.correctionRequested!="boolean"||!Array.isArray(e.violations)||!Me(e.contract))return [];let i=typeof e.obligationId=="string"&&e.obligationId.length>0&&e.obligationId.length<=384?e.obligationId:Fe(e.contractId),r=typeof e.correctionTranscriptHash=="string"?e.correctionTranscriptHash:void 0,o=e.correctionFingerprint??r;return o!==void 0&&!/^[a-f0-9]{64}$/.test(o)?[]:[{...e,obligationId:i,correctionFingerprint:o}]}).slice(-8):[]}function qe(n){return Array.isArray(n)?n.filter(t=>{if(!t||typeof t!="object")return false;let e=t;return typeof e.obligationId=="string"&&typeof e.contractId=="string"&&typeof e.reason=="string"&&typeof e.degradedAt=="number"&&typeof e.attempt=="number"}).slice(-20):[]}function Pe(n){return Array.isArray(n)?n.filter(t=>{if(!t||typeof t!="object")return false;let e=t;return typeof e.obligationId=="string"&&typeof e.contractId=="string"&&(e.status==="resolved"||e.status==="degraded")&&typeof e.completedAt=="number"&&typeof e.attempt=="number"&&(e.reason===void 0||typeof e.reason=="string")}).slice(-20):[]}function kt(n){if(!n||typeof n!="object")return null;let t=n,e=t.kind;if(e!=="add"&&e!=="correction"&&e!=="resolve"&&e!=="degrade"||typeof t.contractId!="string"||t.contractId.length>128||typeof t.at!="number")return null;let r={obligationId:typeof t.obligationId=="string"&&t.obligationId.length>0&&t.obligationId.length<=384?t.obligationId:Fe(t.contractId),contractId:t.contractId,at:t.at};if(e==="add")return Me(t.contract)?{kind:e,...r,contract:t.contract}:null;if(e==="correction"){let o=typeof t.fingerprint=="string"?t.fingerprint:t.transcriptHash;return typeof o=="string"&&/^[a-f0-9]{64}$/.test(o)&&Array.isArray(t.violations)&&t.violations.every(s=>typeof s=="string"&&s.length<=240)?{kind:e,...r,fingerprint:o,violations:t.violations}:null}return e==="resolve"?{kind:e,...r}:typeof t.reason=="string"&&t.reason.length<=240?{kind:e,...r,reason:t.reason}:null}function $e(n){return n==="add"?0:n==="correction"?1:2}function Me(n){if(!n||typeof n!="object")return false;let t=n,e=t.requiredSections,i=t.prohibitedClaims;return t.version==="1.0"&&typeof t.id=="string"&&/^[a-zA-Z0-9][a-zA-Z0-9:._-]{0,127}$/.test(t.id)&&typeof t.runtimeProfilingOccurred=="boolean"&&typeof t.samplingEvidenceOccurred=="boolean"&&Array.isArray(e)&&e.length===3&&e[0]==="\u5DE5\u5177\u53D1\u73B0"&&e[1]==="\u6A21\u578B\u5047\u8BBE"&&e[2]==="\u9700\u8981\u8FD0\u884C\u65F6\u9A8C\u8BC1"&&Array.isArray(i)&&i.length<=16&&i.every(r=>typeof r=="string"&&r.length<=128)&&typeof t.canonicalReport=="string"&&Buffer.byteLength(t.canonicalReport,"utf8")<=48*1024&&!!t.correctionPolicy&&t.correctionPolicy.maxAttempts===1&&t.correctionPolicy.repeatedViolation==="fail_open"}function ze(n,t){let e=Ct(n);mkdirSync(e,{recursive:true,mode:448});let i=join(e,`${t.receiptId}.json`);if(existsSync(i))return t.receiptId;let r=`${i}.${process.pid}.tmp`;writeFileSync(r,JSON.stringify(t),{mode:384});try{renameSync(r,i);}catch(o){try{unlinkSync(r);}catch{}if(!existsSync(i))throw o}return t.receiptId}function Ct(n){return join(z(n),"session-finalize-pending")}var _=emitSemanticControlLog;var Mt=512*1024,Lt=500;var Nt=["\u5DE5\u5177\u53D1\u73B0","\u6A21\u578B\u5047\u8BBE","\u9700\u8981\u8FD0\u884C\u65F6\u9A8C\u8BC1"];function zt(n){let t=false,e=[],i=[];for(let r of n){if(/^\s*```/.test(r)){t=!t,e.push(""),i.push(r.replace(/^\s*```+[^\s`]*/,"").replace(/```+\s*$/,"").trim());continue}e.push(t?"":r.replace(/`[^`]*`/g,"").trim()),i.push(r.replace(/`([^`]*)`/g,(o,s)=>Ht(s)?"":s).trim());}return {headingLines:e,claimLines:i}}function Ht(n){let t=n.trim().slice(0,256);return !t||/\s/.test(t)||n.trim().length>256?false:/^[A-Za-z_$][\w$.-]*$/.test(t)||/^(['"])[^'"`]*\1$/.test(t)}function Ut(n,t){if(!n||n.length>4096)return {degradationReason:"transcript_path_missing"};let e;try{let i=lstatSync(n);if(!i.isFile()||i.isSymbolicLink())return {degradationReason:"transcript_path_unsafe"};e=openSync(n,constants.O_RDONLY|(constants.O_NOFOLLOW??0));let r=fstatSync(e);if(!r.isFile()||r.dev!==i.dev||r.ino!==i.ino)return {degradationReason:"transcript_path_changed"};let o=Math.min(r.size,Mt),s=Buffer.alloc(o),a=0;for(;a<o;){let h=readSync(e,s,a,o-a,r.size-o+a);if(h===0)break;a+=h;}let d=s.subarray(0,a).toString("utf8");r.size>o&&(d=d.slice(Math.max(0,d.indexOf(`
3
+ `)+1)));let f=d.split(/\r?\n/).slice(-Lt),g=t.length>0?Math.min(...t.map(h=>h.promptedAt)):0,c=Jt(f,g),v=[...c].reverse().find(h=>Bt(h.text,t))??c.at(-1);return v?.text?{answer:v.text,fingerprint:v.fingerprint}:{degradationReason:"transcript_answer_unavailable"}}catch{return {degradationReason:"transcript_unreadable"}}finally{e!==void 0&&closeSync(e);}}function Bt(n,t){let e=new Set(t.flatMap(r=>r.contract.requiredSections)),i=Gt(zt(n.split(/\r?\n/u)).headingLines);return [...e].every(r=>i.found.has(r))}function Ue(n){return Ut(n,[]).answer}function Jt(n,t){let e=[];for(let i=0;i<n.length;i++){let r=n[i];if(r.trim())try{let o=JSON.parse(r),s=o.message;if(!s||typeof s!="object"||s.role!=="assistant")continue;let a=s,d=Vt(o.timestamp);if(d>0&&d+5e3<t)continue;let f=s.content,g=typeof f=="string"?f:Array.isArray(f)?f.filter(c=>c&&typeof c=="object"&&c.type==="text").map(c=>c.text).filter(c=>typeof c=="string").join(`
4
+ `):"";if(g.trim()){let c=g.trim(),y=typeof a.id=="string"&&a.id?`message:${a.id}`:typeof o.uuid=="string"&&o.uuid?`uuid:${o.uuid}`:`record:${String(o.timestamp??"")}:${i}:${createHash("sha256").update(r).digest("hex")}`,v=createHash("sha256").update(c).digest("hex"),h=createHash("sha256").update(`${y}\0${v}`).digest("hex");e.push({text:c,timestamp:d,fingerprint:h});}}catch{continue}}return e}function Vt(n){if(typeof n=="number"&&Number.isFinite(n))return n;if(typeof n!="string")return 0;let t=Date.parse(n);return Number.isFinite(t)?t:0}function Gt(n){let t=new Set,e=new Map,i;for(let r=0;r<n.length;r++){let o=n[r].trim().replace(/^#{1,6}\s*/,"").replace(/^\*\*(.*)\*\*$/,"$1").replace(/^(?:[一二三123][、..]\s*)/,"").replace(/[::]\s*$/,"").trim(),s=Nt.find(a=>o===a);s&&(i=s,t.add(s)),e.set(r,i);}return {found:t,byLine:e}}function Ve(n){let t=openGlobalDevFlowDatabase();try{let e=t.listRetrievalLedgerEvents(n),i=new Map(e.filter(c=>c.stage==="selected").map(c=>[Je(c),c])),r=new Map(e.filter(c=>c.stage==="consumed").map(c=>[Je(c),c])),o=0,s=0,a=0;for(let[c,y]of i){let v=r.get(c);v&&n.verificationReceipt&&t.appendRetrievalLedgerEvent({...v,id:retrievalLedgerTransitionId(v.id,"verified",n.verificationReceipt),stage:"verified",verificationReceipt:n.verificationReceipt,reasonCode:"same_task_verification_receipt",createdAt:n.finishedAt??Date.now()});let h=v&&n.verificationReceipt&&n.outcome!=="unknown"?n.outcome:"unknown",b=h==="positive"?"positive_outcome":h==="negative"?"negative_outcome":"unknown_outcome";t.appendRetrievalLedgerEvent({...y,id:retrievalLedgerTransitionId(y.id,b,n.verificationReceipt??n.sessionId),stage:b,reason:v?n.outcomeReason:"selected_not_consumed",toolEvidence:v?.toolEvidence??[],verificationReceipt:h==="unknown"?void 0:n.verificationReceipt,payload:{...y.payload,consumed:!!v},createdAt:n.finishedAt??Date.now()}),b==="positive_outcome"?o+=1:b==="negative_outcome"?s+=1:a+=1;}let d=n.requiredChannels.map(c=>{let y=[...i.values()].filter(h=>h.sourceType===c).length,v=[...r.values()].filter(h=>h.sourceType===c).length;return {channel:c,selected:y,consumed:v,verified:n.verificationReceipt?v:0}}),f={status:d.length>0&&d.every(c=>c.selected>0&&c.consumed===c.selected&&c.verified===c.selected)?"complete":"unavailable",channels:d},g={consumed:r.size,positive:o,negative:s,unknown:a,consumedSources:[...r.values()].map(c=>({sourceType:c.sourceType,sourceId:c.sourceId})),proof:f};return n.verificationReceipt&&r.size>0&&le({event:"retrieval.attribution.transitioned",identity:{projectRoot:n.projectRoot,sessionId:n.sessionId,executionId:n.executionId,requestId:n.requestId},level:"info",timestamp:n.finishedAt??Date.now(),data:{stage:"verified",verifiedCount:r.size}}),le({event:"task.proof.completed",identity:{projectRoot:n.projectRoot,sessionId:n.sessionId,executionId:n.executionId,requestId:n.requestId},level:f.status==="complete"?"info":"warn",timestamp:n.finishedAt??Date.now(),data:f}),le({event:"retrieval.attribution.transitioned",identity:{projectRoot:n.projectRoot,sessionId:n.sessionId,executionId:n.executionId,requestId:n.requestId},level:a>0?"warn":"info",timestamp:n.finishedAt??Date.now(),data:{stage:"session_outcome",selectedCount:i.size,consumedCount:r.size,verifiedCount:n.verificationReceipt?r.size:0,positiveCount:o,negativeCount:s,unknownCount:a}}),g}finally{t.close();}}function Je(n){return [n.requestId,n.contextReceipt,n.sourceType,n.sourceId].join("\0")}function le(n){try{_(n);}catch{}}var nn=8*1024*1024;function Ke(n){if(!n.transcriptPath||!existsSync(n.transcriptPath))return {status:"unavailable",eventsRead:0,failuresFound:0,failuresRecorded:0,reason:"transcript_path_unavailable"};let t=openGlobalDevFlowDatabase(void 0,{busyTimeoutMs:250});try{let e=t.getLatestTranscriptCheckpoint({projectRoot:n.projectRoot,hostId:"claude-code",sessionId:n.sessionId,sourcePath:n.transcriptPath}),i=statSync(n.transcriptPath).size,r=Math.min(e?.byteOffset??0,i),o=Math.min(nn,i-r);if(o<=0)return {status:"completed",eventsRead:0,failuresFound:0,failuresRecorded:0,checkpointId:e?.id};let s=Buffer.alloc(o),a=openSync(n.transcriptPath,"r");try{readSync(a,s,0,o,r);}finally{closeSync(a);}let d=s.toString("utf8").split(/\r?\n/u).filter(Boolean),f=t.listLatestTaskIntentArtifacts(n.projectRoot,n.sessionId),g=new Map,c=new Set,y=0,v=0;for(let C of d){let D;try{D=JSON.parse(C);}catch{continue}for(let O of ue(D,g)){let I=claudeCodeRuntimeAdapter.normalizeToolResult(O,{projectRoot:n.projectRoot});if(I.success||!I.error)continue;let P=I.toolUseId??I.sourceHash;if(c.has(P))continue;c.add(P),y++;let R=I.toolUseId?t.getToolCallEventByToolUseId(n.sessionId,I.toolUseId):null,A=We(R?.input,"_devflow_turn_id"),U=We(R?.input,"_devflow_request_id"),k=A?f.find(w=>w.turnId===A):[...f].reverse().find(w=>(!R?.executionId||w.executionId===R.executionId)&&w.createdAt<=(R?.timestamp??I.timestamp))??f.at(-1),B=`host-failure:${I.sourceHash}`;t.insertEvent({kind:"host_transcript_tool_failure",timestamp:I.timestamp,success:!1,toolName:I.canonicalName??I.requestedName,metadata:{projectRoot:n.projectRoot,sessionId:n.sessionId,turnId:A??k?.turnId,requestId:U??k?.requestId,sourceId:B,toolUseId:I.toolUseId,correlatedEventId:R?.eventId,requestedName:I.requestedName,canonicalName:I.canonicalName,failureCategory:I.failureCategory,error:I.error.slice(0,1e3)}}),_({event:"host.tool.result.reconciled",identity:{projectRoot:n.projectRoot,sessionId:n.sessionId,turnId:A??k?.turnId,requestId:U??k?.requestId,executionId:R?.executionId},level:"warn",timestamp:Date.now(),data:{toolUseId:I.toolUseId,toolName:I.canonicalName??I.requestedName,failureCategory:I.failureCategory,correlation:R?"tool_use_id":"timestamp_fallback"}}),v++;}}let h=createHash("sha256").update(s).digest("hex"),b=`transcript:${createHash("sha256").update(`${n.projectRoot}\0${n.sessionId}\0${n.transcriptPath}\0${r+o}\0${h}`).digest("hex").slice(0,24)}`;return t.appendTranscriptCheckpoint({id:b,projectRoot:n.projectRoot,hostId:"claude-code",sessionId:n.sessionId,sourcePath:n.transcriptPath,sourceHash:h,byteOffset:r+o,eventCount:d.length,createdAt:Date.now()}),_({event:"session.reconciled",identity:{projectRoot:n.projectRoot,sessionId:n.sessionId},level:y>0?"warn":"info",timestamp:Date.now(),data:{stage:"transcript",eventsRead:d.length,failuresFound:y,failuresRecorded:v,checkpointId:b}}),{status:"completed",eventsRead:d.length,failuresFound:y,failuresRecorded:v,checkpointId:b}}catch(e){return {status:"degraded",eventsRead:0,failuresFound:0,failuresRecorded:0,reason:e instanceof Error?e.message:String(e)}}finally{t.close();}}function We(n,t){let e=n?.[t];return typeof e=="string"&&e.trim()?e.trim():void 0}function ue(n,t,e=0){if(e>7||n===null||n===void 0)return [];if(Array.isArray(n))return n.flatMap(s=>ue(s,t,e+1));if(typeof n!="object")return [];let i=n,r=typeof i.type=="string"?i.type:"";r==="tool_use"&&typeof i.id=="string"&&typeof i.name=="string"&&t.set(i.id,i.name);let o=[];if(r==="tool_result"){let s=typeof i.tool_use_id=="string"?i.tool_use_id:void 0;o.push({tool_name:s?t.get(s)??"unknown":"unknown",tool_use_id:s,tool_response:i.content,is_error:i.is_error===true,...i.is_error===true?{error:fe(i.content)||"host tool result failed"}:{},timestamp:i.timestamp});}else (i.tool_name||i.toolName)&&(i.tool_response!==void 0||i.output!==void 0||i.error!==void 0)&&o.push(i);for(let[s,a]of Object.entries(i))s==="content"&&r==="tool_result"||o.push(...ue(a,t,e+1));return o}function fe(n){if(typeof n=="string")return n.slice(0,4e3);if(Array.isArray(n))return n.map(fe).filter(Boolean).join(`
5
5
  `).slice(0,4e3);if(!n||typeof n!="object")return "";let t=n;return [t.text,t.content,t.message].map(fe).filter(Boolean).join(`
6
- `).slice(0,4e3)}var rn={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 Ze(n){return sn(n)}function sn(n){let t=openGlobalDevFlowDatabase(void 0,{busyTimeoutMs:250});try{let e=ln(t,n.artifact);if(un(e.toState))return e;let i=t.getContextReceiptForRequest(n.artifact.projectRoot,n.artifact.sessionId,n.artifact.requestId),r=t.getMemoryTurn(n.artifact.turnId),o=n.artifact.intent==="memory"||r?.source==="explicit_intent";if(!i&&!o)return e;let s=i?an(n.artifact,i):"context_ready";e.toState==="intent_bound"&&(e=E(t,e,n,s,o?"task_context_not_required":s==="context_ready"?"canonical_context_receipt_ready":"canonical_context_receipt_degraded"));let a=i?cn(n.artifact,i):"action_not_required";if((e.toState==="context_ready"||e.toState==="context_degraded")&&(a==="action_not_required"?e=E(t,e,n,"action_not_required","task_action_not_required"):e=E(t,e,n,"action_required","canonical_action_obligation_present")),e.toState==="action_required"){if(a==="action_required")return e;if(a==="action_failed")return E(t,e,n,"action_failed","canonical_action_attempt_failed");a==="action_degraded"?e=E(t,e,n,"action_degraded","canonical_action_unavailable_or_degraded"):a==="action_satisfied"&&(e=E(t,e,n,"action_satisfied","canonical_action_succeeded"));}if(e.toState==="action_failed")if(a==="action_satisfied")e=E(t,e,n,"action_satisfied","canonical_action_retry_succeeded");else if(a==="action_degraded")e=E(t,e,n,"action_degraded","canonical_action_retry_degraded");else return e;let d=s==="context_degraded"||a==="action_degraded";return ["action_not_required","action_satisfied","action_degraded"].includes(e.toState)&&(e=E(t,e,n,n.memoryStatus==="pending"?"memory_quarantined":"memory_decided",n.memoryStatus==="pending"?n.reason:`canonical_memory_${n.memoryStatus}`)),e.toState==="memory_decided"?E(t,e,n,d?"closed_with_degradation":"closed",n.reason):e.toState==="memory_quarantined"?E(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 an(n,t){return n.intent==="memory"||n.intent==="knowledge"||(t.selectedFiles?.length??0)>0?"context_ready":"context_degraded"}function cn(n,t){let e=t.canonicalAction,r=(e?(t.actionAttempts??[]).filter(o=>o.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||dn(n)?"action_required":"action_not_required"}function dn(n){return ["create","modify","debug","test","format"].includes(n.action)||["feature","refactor","performance"].includes(n.intent)}function ln(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 E(n,t,e,i,r){if(!rn[t.toState]?.includes(i))throw new Error(`TERMINAL_PATH_UNAVAILABLE:${t.toState}->${i}`);let o=t.sequence+1,s=`terminal:${createHash("sha256").update(`${e.artifact.artifactHash}\0${o}\0${i}`).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:o,fromState:t.toState,toState:i,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 _({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:i==="closed"?"info":i.includes("degradation")||i.includes("retry")||i==="action_failed"?"warn":"info",timestamp:Date.now(),data:{fromState:t.toState,nextState:i,receiptId:s,reason:r}}),a}function un(n){return n==="closed"||n==="closed_with_degradation"||n==="closed_with_retry_work"}function pn(n){let t={committed:0,skipped:0,pending:0},e=[];for(let i of n)t[i.status]+=1,i.receiptId&&e.push(i.receiptId);return {memoryReceiptIds:[...new Set(e)],missingMemoryDecisionCount:t.pending,memoryTurnOutcomes:t}}function x(n){return (n instanceof Error?n.message:String(n)).trim().slice(0,240)||"memory_lifecycle_unavailable"}var M=class extends Error{constructor(t,e){super(`session_finalize_${t}:${e}`),this.name="SessionFinalizationRetryableError",this.category=`session_finalize_${t}`;}};function K(n){let t;try{t=openGlobalDevFlowDatabase();let e=(n.executionId?t.getSkillExecution(n.executionId):null)??t.getLatestSkillExecutionForSession(n.sessionId),i={stage:n.stage,reason:n.reason,degradedAt:Date.now()};e&&t.mergeSkillExecutionMetadata(e.executionId,{...n.metadata,sessionFinalizationDegradations:[i]}),t.insertEvent({kind:"session_finalize_degraded",timestamp:i.degradedAt,success:!1,metadata:{projectRoot:n.projectRoot,sessionId:n.sessionId,executionId:e?.executionId,...i}}),_({event:"hook.session_end.degraded",identity:{projectRoot:n.projectRoot,sessionId:n.sessionId,executionId:e?.executionId},level:"warn",timestamp:i.degradedAt,data:{stage:n.stage,reason:n.reason}});}catch{}finally{t?.close();}}function yn(n,t=X(),e=true,i,r=true){let o;try{o=JSON.parse(n);}catch{return null}let s=o.session_id?.trim();if(!s)return null;let a=`session-close:${createHash("sha256").update(`${t}\0${s}`).digest("hex").slice(0,24)}`,d={inputJson:n,sessionId:s,cleanupSharedState:e,executionId:i},f;try{f=openGlobalDevFlowDatabase(void 0,{busyTimeoutMs:50});let g=f.requestSessionClosure({receiptId:a,projectRoot:t,sessionId:s,payload:d}),c=f.getWorkByIdempotencyKey(a),y={status:g.state==="closed"||g.state==="closed_with_pending_work"?"completed":"accepted",receiptId:a,workState:c?.state??"pending",closureState:g.state,pendingWorkCount:g.pendingWorkCount,...c?.id?{workItemId:c.id}:{}};return _({event:"hook.session_end.completed",identity:{projectRoot:t,sessionId:s,executionId:i,terminalReceipt:a},level:y.status==="completed"?"info":"debug",timestamp:Date.now(),data:{stage:"enqueue",...y}}),y}catch(g){if(!r)throw g;return ze(t,{receiptId:a,...d}),_({event:"hook.session_end.degraded",identity:{projectRoot:t,sessionId:s,executionId:i,terminalReceipt:a},level:"warn",timestamp:Date.now(),data:{stage:"enqueue",reason:x(g),fallback:"durable_spool"}}),{status:"accepted",receiptId:a,workState:"spooled",closureState:"closing",pendingWorkCount:1}}finally{f?.close();}}async function lo(n,t=X(),e=true,i){let r;try{r=JSON.parse(n);}catch{return}let o=r.session_id?.trim();if(!o)return;let s=new W(t),a=s.get(o),d=Ke({projectRoot:t,sessionId:o,transcriptPath:r.transcript_path}),f={evidenceDegradations:a?.evidenceDegradations??[],evidenceContractOutcomes:a?.evidenceOutcomes??[],pendingEvidenceContractIds:a?.evidenceObligations.map(h=>h.contractId)??[],transcriptReconciliation:d},g=i?.telemetry??new ee,c=!i?.telemetry,y=false,v;try{try{await g.flushAndAggregate();}catch{}let h=Date.now(),b=i?.executionId??a?.executionId,C;try{let m=openGlobalDevFlowDatabase();try{C=m.listSessionMemoryTurnsForReconciliation(t,o);for(let l of C){let p=`memory:${l.turnId}`,u=m.getSessionObligation(t,o,p);u?u.state==="open"&&l.status!=="pending"&&m.resolveSessionObligation({projectRoot:t,sessionId:o,obligationId:p,state:"satisfied",receiptId:l.receiptId,reason:l.reason,resolvedAt:l.decidedAt}):m.upsertSessionObligation({obligationId:p,projectRoot:t,sessionId:o,turnId:l.turnId,kind:"memory_decision",state:l.status==="pending"?"open":"satisfied",payload:{eventId:l.eventId,promptHash:l.promptHash},receiptId:l.receiptId,reason:l.reason,createdAt:l.createdAt,updatedAt:l.decidedAt??l.createdAt,resolvedAt:l.decidedAt});}}finally{m.close();}}catch(m){let l=x(m),p={...f,memoryEventReconciliation:{status:"degraded",stage:"turn_load",reason:l,committedProcessed:0,skippedDiscarded:0,remainingUndecided:null,checkpointPending:null}};throw K({projectRoot:t,sessionId:o,executionId:b,stage:"turn_load",reason:l,metadata:p}),new M("turn_load",l)}let D=pn(C),O=i?.memory??(v=new MemoryGate(t)),I={status:"completed"};try{I=typeof O.reconcileTurnObservationLineage=="function"?{status:"completed",...await O.reconcileTurnObservationLineage(C)}:{status:"unsupported_adapter",committed:0,skipped:0,quarantined:0,unlinked:0};}catch(m){let l=x(m);throw I={status:"degraded",reason:l},K({projectRoot:t,sessionId:o,executionId:b,stage:"memory_lineage",reason:l,metadata:{...D,...f,memoryLineageReconciliation:I}}),new M("memory_lineage",l)}let P={status:"unknown",selected:0,consumed:0,unknown:0,positive:0,negative:0};try{let m=Ue(r.transcript_path),l=openGlobalDevFlowDatabase(),p="unknown",u="no_terminal_host_action_evidence",J,T,q,L=[],ne=[];try{let $=l.listHostActionsForSession(t,o,b),ge=$.filter(S=>S.state==="verified"),ie=$.filter(S=>["failed","cancelled","degraded"].includes(S.state));ie.length>0?(p="negative",u=`terminal_host_action_${ie[0].state}`):ge.length>0&&(p="positive",u="host_action_verified");let Z=ie[0]??ge.at(-1);if(J=Z?.runId,T=Z?.contextReceipt,q=Z?.evidenceHash,ne=$.flatMap(S=>{let N=S.report.toolUseIds;return Array.isArray(N)?N.filter(V=>typeof V=="string"):[]}),!Z&&b){let S=l.getSkillExecution(b),N=S?.metadata&&typeof S.metadata=="object"&&Array.isArray(S.metadata.policyVerificationOutcomes)?S.metadata.policyVerificationOutcomes:[],V=N.find(j=>j.status==="failed"),oe=N.filter(j=>j.status==="passed");V?(p="negative",u="policy_verification_failed",q=typeof V.receiptId=="string"?V.receiptId:void 0):oe.length>0&&(p="positive",u="policy_verification_passed",q=typeof oe.at(-1)?.receiptId=="string"?String(oe.at(-1).receiptId):void 0),T=l.getActiveContextReceipt(t,o,b)?.contextHash,ne=N.map(j=>j.command).filter(j=>typeof j=="string");}T&&(L=l.getSemanticExecutionContextByHash(T)?.dispositions.filter(S=>S.requirement==="required").map(S=>S.channel)??[]);}finally{l.close();}let me=Ve({projectRoot:t,sessionId:o,executionId:b,outcome:p,outcomeReason:u,verificationReceipt:q,requiredChannels:L,finishedAt:h}),Ye=await O.attributeRetrievalBenefits({sessionId:o,executionId:b,outcome:p,outcomeReason:u,workflowRunId:J,contextReceipt:T,toolEvidence:ne,verificationReceipt:q,consumedSourceIds:me.consumedSources.filter($=>$.sourceType==="memory").map($=>$.sourceId)});P={status:m?"evaluated":"unknown",...Ye,retrievalLedger:me};}catch(m){P={...P,status:"degraded",reason:x(m)};}let R;try{R=await O.reconcileDecidedTurnEventWindows(o,C,h);}catch(m){let l=x(m),p={...D,...f,memoryEventReconciliation:{status:"degraded",stage:"event_reconciliation",reason:l,committedProcessed:0,skippedDiscarded:0,remainingUndecided:null,checkpointPending:null}};throw K({projectRoot:t,sessionId:o,executionId:b,stage:"event_reconciliation",reason:l,metadata:p}),new M("event_reconciliation",l)}let A;try{A=await xe({projectRoot:t,sessionId:o,trigger:"session_end",memory:O,details:{eventReconciliation:R},strictPersistence:!0});}catch(m){let l=x(m),p={...D,...f,memoryEventReconciliation:{status:"completed",...R,checkpointPending:null},memoryCheckpointDegradation:l};throw K({projectRoot:t,sessionId:o,executionId:b,stage:"checkpoint",reason:l,metadata:p}),new M("checkpoint",l)}let U={memoryLineageReconciliation:I,memoryBenefitAttribution:P,memoryEventReconciliation:{status:"completed",...R,checkpointPending:A.pendingEvents},memoryDistillCheckpoint:A};try{let m=openGlobalDevFlowDatabase();try{let l=`session-finalize:${o}:events`,p=Math.max(Number(A.pendingEvents??0),Number(R.remainingUndecided??0)),u=m.getSessionObligation(t,o,l);p>0?m.upsertSessionObligation({obligationId:l,projectRoot:t,sessionId:o,executionId:b,kind:"session_finalize",state:"open",payload:{pendingEvents:p,reconciliation:R,checkpointId:A.id},reason:"active_unprocessed_session_events",createdAt:u?.createdAt??h,updatedAt:h}):u?.state==="open"&&m.resolveSessionObligation({projectRoot:t,sessionId:o,obligationId:l,state:"satisfied",reason:"session_events_reconciled",resolvedAt:h});}finally{m.close();}}catch(m){_({event:"hook.session_end.degraded",identity:{projectRoot:t,sessionId:o,executionId:b},level:"warn",timestamp:Date.now(),data:{stage:"obligation_persistence",reason:x(m)}});}try{await O.closeSession(o),v&&(v.close(),v=void 0);}catch(m){let l=x(m),p={...D,...f,...U,memorySessionCloseDegradation:l};throw K({projectRoot:t,sessionId:o,executionId:b,stage:"memory_close",reason:l,metadata:p}),new M("memory_close",l)}let k={...D,...f,...U},B=[];try{let m=openGlobalDevFlowDatabase();try{let l=new Map(m.listLatestTaskIntentArtifacts(t,o).map(p=>[p.turnId,p]));for(let p of C){let u=l.get(p.turnId);if(!u)continue;let T=[m.getWorkByIdempotencyKey(`memory-turn:capture_prompt:${p.turnId}`),m.getWorkByIdempotencyKey(`memory-turn:commit_explicit:${p.turnId}`)].filter(Boolean).some(L=>L.state==="pending"||L.state==="leased"||L.state==="failed"),q=Ze({artifact:u,memoryStatus:p.status,memoryReceiptId:p.receiptId,retryOwned:T,reason:p.status==="pending"?"session_end_memory_pending":"session_end_reconciled"});B.push({turnId:p.turnId,state:q.toState,receiptId:q.receiptId});}}finally{m.close();}}catch(m){B.push({state:"terminal_integrity_failure",reason:x(m)});}k.terminalOutcomes=B,y=!0;let w;try{w=openGlobalDevFlowDatabase();let m=b;if(m)try{w.reconcileSkillExecution(m,"completed",h,k);let u=w.getSkillExecution(m);await G("/api/telemetry/skill-execution/complete",{executionId:m,finishedAt:h,status:"completed",summary:{totalToolCalls:u?.totalToolCalls??0,mcpToolCalls:u?.mcpToolCalls??0,directToolCalls:u?.directToolCalls??0,subagentCount:u?.subagentCount??0,totalDuration:u?.totalDuration??0,mcpComplianceRate:u?.mcpComplianceRate??0,missedTools:u?.missedMcpTools??[],actualFailureCount:u?.failedToolCalls??0,fallbackCount:u?.fallbackCount??0,fallbackReasons:u?.fallbackReasons??[]},metadata:k},{fallbackReason:"skill_execution_already_reconciled_locally"});}catch{}let l=w.reconcileRunningSkillExecutionsForSession(o,h,{closureReason:"session_finalize",...k});for(let u of l)await G("/api/telemetry/skill-execution/complete",{executionId:u.executionId,finishedAt:u.finishedAt,status:u.status,summary:{totalToolCalls:u.totalToolCalls??0,mcpToolCalls:u.mcpToolCalls??0,directToolCalls:u.directToolCalls??0,subagentCount:u.subagentCount??0,totalDuration:u.totalDuration??0,mcpComplianceRate:u.mcpComplianceRate??0,missedTools:u.missedMcpTools??[],actualFailureCount:u.failedToolCalls??0,fallbackCount:u.fallbackCount??0,fallbackReasons:u.fallbackReasons??[]},metadata:k},{fallbackReason:"skill_execution_already_reconciled_locally"});let p=w.getLatestSkillExecutionForSession(o);if(p&&!l.some(u=>u.executionId===p.executionId)&&w.mergeSkillExecutionMetadata(p.executionId,k),e){w.deleteHookReceipt(t);let u=z(t),J=createHash("sha256").update(t).digest("hex").slice(0,12);for(let T of [`session-id-${J}`,"current-execution-id","current-skill.json","event-map.json"])rmSync(join(u,T),{force:!0});}w.deleteContextReceipt(t,o);}catch(m){_({event:"hook.session_end.degraded",identity:{projectRoot:t,sessionId:o,executionId:b},level:"warn",timestamp:Date.now(),data:{stage:"lifecycle_telemetry",reason:x(m),fallback:"fail_open"}});}finally{w?.close();}try{await g.endSession(o),await g.flushAndAggregate();}catch(m){_({event:"hook.session_end.degraded",identity:{projectRoot:t,sessionId:o,executionId:b},level:"warn",timestamp:Date.now(),data:{stage:"telemetry_flush",reason:x(m),fallback:"local_state_authoritative"}});}}finally{if(v)try{v.close();}catch{}c&&g.close(),y&&s.removeSession(o),_({event:y?"hook.session_end.completed":"hook.session_end.degraded",identity:{projectRoot:t,sessionId:o,executionId:i?.executionId??a?.executionId},level:y?"info":"warn",timestamp:Date.now(),data:{stage:"finalize",criticalStagesCompleted:y,transcriptStatus:d.status}});}}if(process.argv[1]?.endsWith("session-end")||process.argv[1]?.endsWith("session-end.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=yn(t.trim()||process.argv[2]||"");e&&n(JSON.stringify(e)),process.exit(0);}),process.stdin.on("error",()=>process.exit(0)),setTimeout(()=>process.exit(0),1e4).unref();}export{pn as buildMemoryTurnOutcomeMetadata,yn as enqueueSessionEndFinalization,lo as handleSessionEnd};
6
+ `).slice(0,4e3)}var sn={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 Ze(n){return an(n)}function an(n){let t=openGlobalDevFlowDatabase(void 0,{busyTimeoutMs:250});try{let e=un(t,n.artifact);if(fn(e.toState))return e;let i=t.getContextReceiptForRequest(n.artifact.projectRoot,n.artifact.sessionId,n.artifact.requestId),r=t.getMemoryTurn(n.artifact.turnId),o=n.artifact.intent==="memory"||r?.source==="explicit_intent";if(!i&&!o)return e;let s=i?cn(n.artifact,i):"context_ready";e.toState==="intent_bound"&&(e=x(t,e,n,s,o?"task_context_not_required":s==="context_ready"?"canonical_context_receipt_ready":"canonical_context_receipt_degraded"));let a=i?dn(n.artifact,i):"action_not_required";if((e.toState==="context_ready"||e.toState==="context_degraded")&&(a==="action_not_required"?e=x(t,e,n,"action_not_required","task_action_not_required"):e=x(t,e,n,"action_required","canonical_action_obligation_present")),e.toState==="action_required"){if(a==="action_required")return e;if(a==="action_failed")return x(t,e,n,"action_failed","canonical_action_attempt_failed");a==="action_degraded"?e=x(t,e,n,"action_degraded","canonical_action_unavailable_or_degraded"):a==="action_satisfied"&&(e=x(t,e,n,"action_satisfied","canonical_action_succeeded"));}if(e.toState==="action_failed")if(a==="action_satisfied")e=x(t,e,n,"action_satisfied","canonical_action_retry_succeeded");else if(a==="action_degraded")e=x(t,e,n,"action_degraded","canonical_action_retry_degraded");else return e;let d=s==="context_degraded"||a==="action_degraded";return ["action_not_required","action_satisfied","action_degraded"].includes(e.toState)&&(e=x(t,e,n,n.memoryStatus==="pending"?"memory_quarantined":"memory_decided",n.memoryStatus==="pending"?n.reason:`canonical_memory_${n.memoryStatus}`)),e.toState==="memory_decided"?x(t,e,n,d?"closed_with_degradation":"closed",n.reason):e.toState==="memory_quarantined"?x(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 cn(n,t){return n.intent==="memory"||n.intent==="knowledge"||(t.selectedFiles?.length??0)>0?"context_ready":"context_degraded"}function dn(n,t){let e=t.canonicalAction,r=(e?(t.actionAttempts??[]).filter(o=>o.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||ln(n)?"action_required":"action_not_required"}function ln(n){return ["create","modify","debug","test","format"].includes(n.action)||["feature","refactor","performance"].includes(n.intent)}function un(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 x(n,t,e,i,r){if(!sn[t.toState]?.includes(i))throw new Error(`TERMINAL_PATH_UNAVAILABLE:${t.toState}->${i}`);let o=t.sequence+1,s=`terminal:${createHash("sha256").update(`${e.artifact.artifactHash}\0${o}\0${i}`).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:o,fromState:t.toState,toState:i,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 _({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:i==="closed"?"info":i.includes("degradation")||i.includes("retry")||i==="action_failed"?"warn":"info",timestamp:Date.now(),data:{fromState:t.toState,nextState:i,receiptId:s,reason:r}}),a}function fn(n){return n==="closed"||n==="closed_with_degradation"||n==="closed_with_retry_work"}function yn(n){let t={committed:0,skipped:0,pending:0},e=[];for(let i of n)t[i.status]+=1,i.receiptId&&e.push(i.receiptId);return {memoryReceiptIds:[...new Set(e)],missingMemoryDecisionCount:t.pending,memoryTurnOutcomes:t}}function E(n){return (n instanceof Error?n.message:String(n)).trim().slice(0,240)||"memory_lifecycle_unavailable"}var M=class extends Error{constructor(t,e){super(`session_finalize_${t}:${e}`),this.name="SessionFinalizationRetryableError",this.category=`session_finalize_${t}`;}};function K(n){let t;try{t=openGlobalDevFlowDatabase();let e=(n.executionId?t.getSkillExecution(n.executionId):null)??t.getLatestSkillExecutionForSession(n.sessionId),i={stage:n.stage,reason:n.reason,degradedAt:Date.now()};e&&t.mergeSkillExecutionMetadata(e.executionId,{...n.metadata,sessionFinalizationDegradations:[i]}),t.insertEvent({kind:"session_finalize_degraded",timestamp:i.degradedAt,success:!1,metadata:{projectRoot:n.projectRoot,sessionId:n.sessionId,executionId:e?.executionId,...i}}),_({event:"hook.session_end.degraded",identity:{projectRoot:n.projectRoot,sessionId:n.sessionId,executionId:e?.executionId},level:"warn",timestamp:i.degradedAt,data:{stage:n.stage,reason:n.reason}});}catch{}finally{t?.close();}}function hn(n,t=X(),e=true,i,r=true){let o;try{o=JSON.parse(n);}catch{return null}let s=o.session_id?.trim();if(!s)return null;let a=`session-close:${createHash("sha256").update(`${t}\0${s}`).digest("hex").slice(0,24)}`,d={inputJson:n,sessionId:s,cleanupSharedState:e,executionId:i},f;try{f=openGlobalDevFlowDatabase(void 0,{busyTimeoutMs:50});let g=f.requestSessionClosure({receiptId:a,projectRoot:t,sessionId:s,payload:d}),c=f.getWorkByIdempotencyKey(a),y={status:g.state==="closed"||g.state==="closed_with_pending_work"?"completed":"accepted",receiptId:a,workState:c?.state??"pending",closureState:g.state,pendingWorkCount:g.pendingWorkCount,...c?.id?{workItemId:c.id}:{}};return _({event:"hook.session_end.completed",identity:{projectRoot:t,sessionId:s,executionId:i,terminalReceipt:a},level:y.status==="completed"?"info":"debug",timestamp:Date.now(),data:{stage:"enqueue",...y}}),y}catch(g){if(!r)throw g;return ze(t,{receiptId:a,...d}),_({event:"hook.session_end.degraded",identity:{projectRoot:t,sessionId:s,executionId:i,terminalReceipt:a},level:"warn",timestamp:Date.now(),data:{stage:"enqueue",reason:E(g),fallback:"durable_spool"}}),{status:"accepted",receiptId:a,workState:"spooled",closureState:"closing",pendingWorkCount:1}}finally{f?.close();}}async function fo(n,t=X(),e=true,i){let r;try{r=JSON.parse(n);}catch{return}let o=r.session_id?.trim();if(!o)return;let s=new W(t),a=s.get(o),d=Ke({projectRoot:t,sessionId:o,transcriptPath:r.transcript_path}),f={evidenceDegradations:a?.evidenceDegradations??[],evidenceContractOutcomes:a?.evidenceOutcomes??[],pendingEvidenceContractIds:a?.evidenceObligations.map(h=>h.contractId)??[],transcriptReconciliation:d},g=i?.telemetry??new ee,c=!i?.telemetry,y=false,v;try{try{await g.flushAndAggregate();}catch{}let h=Date.now(),b=i?.executionId??a?.executionId,C;try{let m=openGlobalDevFlowDatabase();try{C=m.listSessionMemoryTurnsForReconciliation(t,o);for(let l of C){let p=`memory:${l.turnId}`,u=m.getSessionObligation(t,o,p);u?u.state==="open"&&l.status!=="pending"&&m.resolveSessionObligation({projectRoot:t,sessionId:o,obligationId:p,state:"satisfied",receiptId:l.receiptId,reason:l.reason,resolvedAt:l.decidedAt}):m.upsertSessionObligation({obligationId:p,projectRoot:t,sessionId:o,turnId:l.turnId,kind:"memory_decision",state:l.status==="pending"?"open":"satisfied",payload:{eventId:l.eventId,promptHash:l.promptHash},receiptId:l.receiptId,reason:l.reason,createdAt:l.createdAt,updatedAt:l.decidedAt??l.createdAt,resolvedAt:l.decidedAt});}}finally{m.close();}}catch(m){let l=E(m),p={...f,memoryEventReconciliation:{status:"degraded",stage:"turn_load",reason:l,committedProcessed:0,skippedDiscarded:0,remainingUndecided:null,checkpointPending:null}};throw K({projectRoot:t,sessionId:o,executionId:b,stage:"turn_load",reason:l,metadata:p}),new M("turn_load",l)}let D=yn(C),O=i?.memory??(v=new MemoryGate(t)),I={status:"completed"};try{I=typeof O.reconcileTurnObservationLineage=="function"?{status:"completed",...await O.reconcileTurnObservationLineage(C)}:{status:"unsupported_adapter",committed:0,skipped:0,quarantined:0,unlinked:0};}catch(m){let l=E(m);throw I={status:"degraded",reason:l},K({projectRoot:t,sessionId:o,executionId:b,stage:"memory_lineage",reason:l,metadata:{...D,...f,memoryLineageReconciliation:I}}),new M("memory_lineage",l)}let P={status:"unknown",selected:0,consumed:0,unknown:0,positive:0,negative:0};try{let m=Ue(r.transcript_path),l=openGlobalDevFlowDatabase(),p="unknown",u="no_terminal_host_action_evidence",J,T,q,L=[],ne=[];try{let $=l.listHostActionsForSession(t,o,b),ge=$.filter(S=>S.state==="verified"),ie=$.filter(S=>["failed","cancelled","degraded"].includes(S.state));ie.length>0?(p="negative",u=`terminal_host_action_${ie[0].state}`):ge.length>0&&(p="positive",u="host_action_verified");let Z=ie[0]??ge.at(-1);if(J=Z?.runId,T=Z?.contextReceipt,q=Z?.evidenceHash,ne=$.flatMap(S=>{let N=S.report.toolUseIds;return Array.isArray(N)?N.filter(V=>typeof V=="string"):[]}),!Z&&b){let S=l.getSkillExecution(b),N=S?.metadata&&typeof S.metadata=="object"&&Array.isArray(S.metadata.policyVerificationOutcomes)?S.metadata.policyVerificationOutcomes:[],V=N.find(j=>j.status==="failed"),oe=N.filter(j=>j.status==="passed");V?(p="negative",u="policy_verification_failed",q=typeof V.receiptId=="string"?V.receiptId:void 0):oe.length>0&&(p="positive",u="policy_verification_passed",q=typeof oe.at(-1)?.receiptId=="string"?String(oe.at(-1).receiptId):void 0),T=l.getActiveContextReceipt(t,o,b)?.contextHash,ne=N.map(j=>j.command).filter(j=>typeof j=="string");}T&&(L=l.getSemanticExecutionContextByHash(T)?.dispositions.filter(S=>S.requirement==="required").map(S=>S.channel)??[]);}finally{l.close();}let me=Ve({projectRoot:t,sessionId:o,executionId:b,outcome:p,outcomeReason:u,verificationReceipt:q,requiredChannels:L,finishedAt:h}),Ye=await O.attributeRetrievalBenefits({sessionId:o,executionId:b,outcome:p,outcomeReason:u,workflowRunId:J,contextReceipt:T,toolEvidence:ne,verificationReceipt:q,consumedSourceIds:me.consumedSources.filter($=>$.sourceType==="memory").map($=>$.sourceId)});P={status:m?"evaluated":"unknown",...Ye,retrievalLedger:me};}catch(m){P={...P,status:"degraded",reason:E(m)};}let R;try{R=await O.reconcileDecidedTurnEventWindows(o,C,h);}catch(m){let l=E(m),p={...D,...f,memoryEventReconciliation:{status:"degraded",stage:"event_reconciliation",reason:l,committedProcessed:0,skippedDiscarded:0,remainingUndecided:null,checkpointPending:null}};throw K({projectRoot:t,sessionId:o,executionId:b,stage:"event_reconciliation",reason:l,metadata:p}),new M("event_reconciliation",l)}let A;try{A=await Ee({projectRoot:t,sessionId:o,trigger:"session_end",memory:O,details:{eventReconciliation:R},strictPersistence:!0});}catch(m){let l=E(m),p={...D,...f,memoryEventReconciliation:{status:"completed",...R,checkpointPending:null},memoryCheckpointDegradation:l};throw K({projectRoot:t,sessionId:o,executionId:b,stage:"checkpoint",reason:l,metadata:p}),new M("checkpoint",l)}let U={memoryLineageReconciliation:I,memoryBenefitAttribution:P,memoryEventReconciliation:{status:"completed",...R,checkpointPending:A.pendingEvents},memoryDistillCheckpoint:A};try{let m=openGlobalDevFlowDatabase();try{let l=`session-finalize:${o}:events`,p=Math.max(Number(A.pendingEvents??0),Number(R.remainingUndecided??0)),u=m.getSessionObligation(t,o,l);p>0?m.upsertSessionObligation({obligationId:l,projectRoot:t,sessionId:o,executionId:b,kind:"session_finalize",state:"open",payload:{pendingEvents:p,reconciliation:R,checkpointId:A.id},reason:"active_unprocessed_session_events",createdAt:u?.createdAt??h,updatedAt:h}):u?.state==="open"&&m.resolveSessionObligation({projectRoot:t,sessionId:o,obligationId:l,state:"satisfied",reason:"session_events_reconciled",resolvedAt:h});}finally{m.close();}}catch(m){_({event:"hook.session_end.degraded",identity:{projectRoot:t,sessionId:o,executionId:b},level:"warn",timestamp:Date.now(),data:{stage:"obligation_persistence",reason:E(m)}});}try{await O.closeSession(o),v&&(v.close(),v=void 0);}catch(m){let l=E(m),p={...D,...f,...U,memorySessionCloseDegradation:l};throw K({projectRoot:t,sessionId:o,executionId:b,stage:"memory_close",reason:l,metadata:p}),new M("memory_close",l)}let k={...D,...f,...U},B=[];try{let m=openGlobalDevFlowDatabase();try{let l=new Map(m.listLatestTaskIntentArtifacts(t,o).map(p=>[p.turnId,p]));for(let p of C){let u=l.get(p.turnId);if(!u)continue;let T=[m.getWorkByIdempotencyKey(`memory-turn:capture_prompt:${p.turnId}`),m.getWorkByIdempotencyKey(`memory-turn:commit_explicit:${p.turnId}`)].filter(Boolean).some(L=>L.state==="pending"||L.state==="leased"||L.state==="failed"),q=Ze({artifact:u,memoryStatus:p.status,memoryReceiptId:p.receiptId,retryOwned:T,reason:p.status==="pending"?"session_end_memory_pending":"session_end_reconciled"});B.push({turnId:p.turnId,state:q.toState,receiptId:q.receiptId});}}finally{m.close();}}catch(m){B.push({state:"terminal_integrity_failure",reason:E(m)});}k.terminalOutcomes=B,y=!0;let w;try{w=openGlobalDevFlowDatabase();let m=b;if(m)try{w.reconcileSkillExecution(m,"completed",h,k);let u=w.getSkillExecution(m);await G("/api/telemetry/skill-execution/complete",{executionId:m,finishedAt:h,status:"completed",summary:{totalToolCalls:u?.totalToolCalls??0,mcpToolCalls:u?.mcpToolCalls??0,directToolCalls:u?.directToolCalls??0,subagentCount:u?.subagentCount??0,totalDuration:u?.totalDuration??0,mcpComplianceRate:u?.mcpComplianceRate??0,missedTools:u?.missedMcpTools??[],actualFailureCount:u?.failedToolCalls??0,fallbackCount:u?.fallbackCount??0,fallbackReasons:u?.fallbackReasons??[]},metadata:k},{fallbackReason:"skill_execution_already_reconciled_locally"});}catch{}let l=w.reconcileRunningSkillExecutionsForSession(o,h,{closureReason:"session_finalize",...k});for(let u of l)await G("/api/telemetry/skill-execution/complete",{executionId:u.executionId,finishedAt:u.finishedAt,status:u.status,summary:{totalToolCalls:u.totalToolCalls??0,mcpToolCalls:u.mcpToolCalls??0,directToolCalls:u.directToolCalls??0,subagentCount:u.subagentCount??0,totalDuration:u.totalDuration??0,mcpComplianceRate:u.mcpComplianceRate??0,missedTools:u.missedMcpTools??[],actualFailureCount:u.failedToolCalls??0,fallbackCount:u.fallbackCount??0,fallbackReasons:u.fallbackReasons??[]},metadata:k},{fallbackReason:"skill_execution_already_reconciled_locally"});let p=w.getLatestSkillExecutionForSession(o);if(p&&!l.some(u=>u.executionId===p.executionId)&&w.mergeSkillExecutionMetadata(p.executionId,k),e){w.deleteHookReceipt(t);let u=z(t),J=createHash("sha256").update(t).digest("hex").slice(0,12);for(let T of [`session-id-${J}`,"current-execution-id","current-skill.json","event-map.json"])rmSync(join(u,T),{force:!0});}w.deleteContextReceipt(t,o);}catch(m){_({event:"hook.session_end.degraded",identity:{projectRoot:t,sessionId:o,executionId:b},level:"warn",timestamp:Date.now(),data:{stage:"lifecycle_telemetry",reason:E(m),fallback:"fail_open"}});}finally{w?.close();}try{await g.endSession(o),await g.flushAndAggregate();}catch(m){_({event:"hook.session_end.degraded",identity:{projectRoot:t,sessionId:o,executionId:b},level:"warn",timestamp:Date.now(),data:{stage:"telemetry_flush",reason:E(m),fallback:"local_state_authoritative"}});}}finally{if(v)try{v.close();}catch{}c&&g.close(),y&&s.removeSession(o),_({event:y?"hook.session_end.completed":"hook.session_end.degraded",identity:{projectRoot:t,sessionId:o,executionId:i?.executionId??a?.executionId},level:y?"info":"warn",timestamp:Date.now(),data:{stage:"finalize",criticalStagesCompleted:y,transcriptStatus:d.status}});}}if(process.argv[1]?.endsWith("session-end")||process.argv[1]?.endsWith("session-end.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=hn(t.trim()||process.argv[2]||"");e&&n(JSON.stringify(e)),process.exit(0);}),process.stdin.on("error",()=>process.exit(0)),setTimeout(()=>process.exit(0),1e4).unref();}export{yn as buildMemoryTurnOutcomeMetadata,hn as enqueueSessionEndFinalization,fo as handleSessionEnd};