@devflow-tools/cli 0.17.1 → 0.17.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,17 +1,17 @@
1
- import {getLocalApiKey,resolveRuntimeEndpoint,acquireRuntimeHttpCircuit,registerRuntimeHttpSuccess,registerRuntimeHttpFailure,getProjectStateDir}from'@devflow-tools/sdk';import {existsSync as existsSync$1,readFileSync as readFileSync$1,rmSync,mkdirSync as mkdirSync$1,writeFileSync as writeFileSync$1,linkSync,readdirSync,renameSync as renameSync$1}from'fs';import {join as join$1}from'path';import {randomUUID,createHash as createHash$1}from'crypto';import {openGlobalDevFlowDatabase}from'@devflow-tools/database';import'@devflow-tools/memory-engine';import'os';import {request}from'node:http';import {mkdirSync,existsSync,writeFileSync,renameSync,unlinkSync,readFileSync,openSync,constants,fstatSync,closeSync,appendFileSync,lstatSync,readSync}from'node:fs';import {join,resolve}from'node:path';import {homedir}from'node:os';import {createHash}from'node:crypto';import {emitSemanticControlLog}from'@devflow-tools/telemetry';function _(t){return t??process.env.CLAUDE_PROJECT_DIR??process.cwd()}function I(t){return process.env.DEVFLOW_STATE_DIR??getProjectStateDir(_(t))}function N(t){return Buffer.from(t,"utf8").toString("base64url")}function Ie(t,e,n){let r=e?.trim();if(r){let o=/^[a-zA-Z0-9:._-]{1,192}$/.test(r)?r:`tool-${createHash$1("sha256").update(r.slice(0,1024)).digest("hex").slice(0,32)}`;return `${t}:${o}`}return `${t}:legacy-${n}-${randomUUID().slice(0,8)}`}function J(t){return `${t}:legacy-journal`}var h=class{constructor(e){this.projectRoot=e;this.sessions=new Map;this.sessionsDir=join$1(I(e),"hook-sessions");}registerSession(e){let n=e.trim();if(!n)throw new Error("session_id_required");let r=this.get(n);if(r)return r.lastActivityAt=Date.now(),this.persist(r),r;let o=Date.now(),i={sessionId:n,projectRoot:this.projectRoot,requiredMcpTools:[],evidenceObligations:[],evidenceDegradations:[],evidenceOutcomes:[],startedAt:o,lastActivityAt:o};return this.sessions.set(n,i),this.persist(i),i}startExecution(e,n,r){let o=this.registerSession(e);return (!o.executionId||o.skillName!==n)&&(o.executionId=`exec_${Date.now()}_${randomUUID().slice(0,8)}`),o.skillName=n,o.requiredMcpTools=[...new Set(r)],o.lastActivityAt=Date.now(),this.persist(o),o}bindTaskIdentity(e,n){let r=this.registerSession(e);return r.activeTurnId=n.turnId,r.activeRequestId=n.requestId,r.intentArtifactHash=n.intentArtifactHash,r.lastActivityAt=Date.now(),this.persist(r),r}get(e){let n=e.trim();if(!n)return null;let r=this.sessions.get(n);if(r)return this.replayEvidenceJournal(r),r;let o=this.snapshotPath(n);if(!existsSync$1(o))return null;try{let i=JSON.parse(readFileSync$1(o,"utf8"));return i.sessionId!==n||i.projectRoot!==this.projectRoot?null:(i.requiredMcpTools=Array.isArray(i.requiredMcpTools)?i.requiredMcpTools:[],i.evidenceObligations=L(i.evidenceObligations),i.evidenceDegradations=q(i.evidenceDegradations),i.evidenceOutcomes=H(i.evidenceOutcomes),this.replayEvidenceJournal(i),this.sessions.set(n,i),i)}catch{return null}}completeExecution(e){let n=this.get(e);if(!n)return null;let r=structuredClone(n);return delete n.executionId,delete n.skillName,n.requiredMcpTools=[],n.lastActivityAt=Date.now(),this.persist(n),r}addEvidenceObligation(e,n,r=Date.now(),o){let i=this.registerSession(e),a=(o?void 0:i.evidenceObligations.find(l=>l.contractId===n.id))?.obligationId??Ie(n.id,o,r);this.appendEvidenceEvent(e,{kind:"add",obligationId:a,contractId:n.id,at:r,contract:n},`add\0${a}`),this.replayEvidenceJournal(i);let c=i.evidenceObligations.find(l=>l.obligationId===a);return c?(i.lastActivityAt=Date.now(),this.persist(i),structuredClone(c)):null}listEvidenceObligations(e){return (this.get(e)?.evidenceObligations??[]).map(n=>structuredClone(n))}markEvidenceCorrection(e,n,r,o,i=Date.now()){let s=this.get(e),a=s?.evidenceObligations.find(d=>d.obligationId===n);if(!s||!a)return null;let c=/^[a-f0-9]{64}$/.test(o)?o:"";if(!c)return null;this.appendEvidenceEvent(e,{kind:"correction",obligationId:n,contractId:a.contractId,at:i,fingerprint:c,violations:r.slice(0,16).map(d=>d.slice(0,240))},`correction\0${n}\0${c}`),this.replayEvidenceJournal(s),s.lastActivityAt=i,this.persist(s);let l=s.evidenceObligations.find(d=>d.obligationId===n);return l?structuredClone(l):null}resolveEvidenceObligation(e,n){let r=this.get(e);if(!r)return false;let o=r.evidenceObligations.find(s=>s.obligationId===n);if(!o)return false;let i=Date.now();return this.appendEvidenceEvent(e,{kind:"resolve",obligationId:n,contractId:o.contractId,at:i},`resolve\0${n}`),this.replayEvidenceJournal(r),r.lastActivityAt=i,this.persist(r),true}degradeEvidenceObligation(e,n,r,o=Date.now()){let i=this.get(e),s=i?.evidenceObligations.find(c=>c.obligationId===n);if(!i||!s)return false;let a=r.slice(0,240);return this.appendEvidenceEvent(e,{kind:"degrade",obligationId:n,contractId:s.contractId,at:o,reason:a},`degrade\0${n}\0${a}`),this.replayEvidenceJournal(i),i.lastActivityAt=o,this.persist(i),true}removeSession(e){let n=e.trim();n&&(this.sessions.delete(n),rmSync(this.snapshotPath(n),{force:true}),rmSync(this.evidenceJournalDir(n),{recursive:true,force:true}));}list(){return [...this.sessions.values()]}snapshotPath(e){return join$1(this.sessionsDir,`${N(e)}.json`)}evidenceJournalDir(e){return join$1(this.sessionsDir,"evidence-journal",N(e))}appendEvidenceEvent(e,n,r){let o=this.evidenceJournalDir(e);mkdirSync$1(o,{recursive:true,mode:448});let i=createHash$1("sha256").update(r).digest("hex"),s=join$1(o,`${n.kind}-${i}.json`);if(existsSync$1(s))return;let a=join$1(o,`.${process.pid}.${randomUUID()}.tmp`);writeFileSync$1(a,JSON.stringify(n),{mode:384});try{linkSync(a,s);}catch(c){if(c.code!=="EEXIST")throw c}finally{rmSync(a,{force:true});}}replayEvidenceJournal(e){e.evidenceObligations=L(e.evidenceObligations),e.evidenceDegradations=q(e.evidenceDegradations),e.evidenceOutcomes=H(e.evidenceOutcomes);let n=this.evidenceJournalDir(e.sessionId);if(!existsSync$1(n))return;let r;try{r=readdirSync(n).filter(i=>/^(?:add|correction|resolve|degrade)-[a-f0-9]{64}\.json$/.test(i)).slice(0,4096);}catch{return}let o=r.flatMap(i=>{try{let s=readFileSync$1(join$1(n,i),"utf8");if(Buffer.byteLength(s,"utf8")>64*1024)return [];let a=Se(JSON.parse(s));return a?[a]:[]}catch{return []}}).sort((i,s)=>i.at-s.at||z(i.kind)-z(s.kind));for(let i of o)this.applyEvidenceEvent(e,i);e.evidenceObligations=e.evidenceObligations.slice(-8),e.evidenceDegradations=e.evidenceDegradations.slice(-20),e.evidenceOutcomes=e.evidenceOutcomes.slice(-20);}applyEvidenceEvent(e,n){let r=e.evidenceOutcomes.find(s=>s.obligationId===n.obligationId);if(n.kind==="add"){if(r)return;let s=e.evidenceObligations.find(a=>a.obligationId===n.obligationId);s?(s.contract=n.contract,s.promptedAt=Math.min(s.promptedAt,n.at)):e.evidenceObligations.push({obligationId:n.obligationId,contractId:n.contractId,contract:n.contract,promptedAt:n.at,attempt:0,correctionRequested:false,violations:[]});return}let o=e.evidenceObligations.find(s=>s.obligationId===n.obligationId);if(n.kind==="correction"){if(!o||r||o.correctionFingerprint===n.fingerprint)return;o.attempt+=1,o.correctionRequested=true,o.correctionRequestedAt=n.at,o.correctionFingerprint=n.fingerprint,o.violations=n.violations;return}let i=o?.attempt??0;e.evidenceObligations=e.evidenceObligations.filter(s=>s.obligationId!==n.obligationId),!r&&(n.kind==="degrade"&&e.evidenceDegradations.push({obligationId:n.obligationId,contractId:n.contractId,reason:n.reason,degradedAt:n.at,attempt:i}),e.evidenceOutcomes.push({obligationId:n.obligationId,contractId:n.contractId,status:n.kind==="resolve"?"resolved":"degraded",completedAt:n.at,attempt:i,...n.kind==="degrade"?{reason:n.reason}:{}}));}persist(e){mkdirSync$1(this.sessionsDir,{recursive:true,mode:448});let n=this.snapshotPath(e.sessionId),r=`${n}.${process.pid}.${randomUUID()}.tmp`;writeFileSync$1(r,JSON.stringify(e),{mode:384}),renameSync$1(r,n);}};function L(t){return Array.isArray(t)?t.flatMap(e=>{if(!e||typeof e!="object")return [];let n=e;if(typeof n.contractId!="string"||n.contractId.length===0||n.contractId.length>128||typeof n.promptedAt!="number"||typeof n.attempt!="number"||typeof n.correctionRequested!="boolean"||!Array.isArray(n.violations)||!B(n.contract))return [];let r=typeof n.obligationId=="string"&&n.obligationId.length>0&&n.obligationId.length<=384?n.obligationId:J(n.contractId),o=typeof n.correctionTranscriptHash=="string"?n.correctionTranscriptHash:void 0,i=n.correctionFingerprint??o;return i!==void 0&&!/^[a-f0-9]{64}$/.test(i)?[]:[{...n,obligationId:r,correctionFingerprint:i}]}).slice(-8):[]}function q(t){return Array.isArray(t)?t.filter(e=>{if(!e||typeof e!="object")return false;let n=e;return typeof n.obligationId=="string"&&typeof n.contractId=="string"&&typeof n.reason=="string"&&typeof n.degradedAt=="number"&&typeof n.attempt=="number"}).slice(-20):[]}function H(t){return Array.isArray(t)?t.filter(e=>{if(!e||typeof e!="object")return false;let n=e;return typeof n.obligationId=="string"&&typeof n.contractId=="string"&&(n.status==="resolved"||n.status==="degraded")&&typeof n.completedAt=="number"&&typeof n.attempt=="number"&&(n.reason===void 0||typeof n.reason=="string")}).slice(-20):[]}function Se(t){if(!t||typeof t!="object")return null;let e=t,n=e.kind;if(n!=="add"&&n!=="correction"&&n!=="resolve"&&n!=="degrade"||typeof e.contractId!="string"||e.contractId.length>128||typeof e.at!="number")return null;let o={obligationId:typeof e.obligationId=="string"&&e.obligationId.length>0&&e.obligationId.length<=384?e.obligationId:J(e.contractId),contractId:e.contractId,at:e.at};if(n==="add")return B(e.contract)?{kind:n,...o,contract:e.contract}:null;if(n==="correction"){let i=typeof e.fingerprint=="string"?e.fingerprint:e.transcriptHash;return typeof i=="string"&&/^[a-f0-9]{64}$/.test(i)&&Array.isArray(e.violations)&&e.violations.every(s=>typeof s=="string"&&s.length<=240)?{kind:n,...o,fingerprint:i,violations:e.violations}:null}return n==="resolve"?{kind:n,...o}:typeof e.reason=="string"&&e.reason.length<=240?{kind:n,...o,reason:e.reason}:null}function z(t){return t==="add"?0:t==="correction"?1:2}function B(t){if(!t||typeof t!="object")return false;let e=t,n=e.requiredSections,r=e.prohibitedClaims;return e.version==="1.0"&&typeof e.id=="string"&&/^[a-zA-Z0-9][a-zA-Z0-9:._-]{0,127}$/.test(e.id)&&typeof e.runtimeProfilingOccurred=="boolean"&&typeof e.samplingEvidenceOccurred=="boolean"&&Array.isArray(n)&&n.length===3&&n[0]==="\u5DE5\u5177\u53D1\u73B0"&&n[1]==="\u6A21\u578B\u5047\u8BBE"&&n[2]==="\u9700\u8981\u8FD0\u884C\u65F6\u9A8C\u8BC1"&&Array.isArray(r)&&r.length<=16&&r.every(o=>typeof o=="string"&&o.length<=128)&&typeof e.canonicalReport=="string"&&Buffer.byteLength(e.canonicalReport,"utf8")<=48*1024&&!!e.correctionPolicy&&e.correctionPolicy.maxAttempts===1&&e.correctionPolicy.repeatedViolation==="fail_open"}function C(t,e,n){try{let r=openGlobalDevFlowDatabase();try{r.insertEvent({kind:t,timestamp:Date.now(),duration:n,success:e.success!==!1,metadata:e});}finally{r.close();}}catch{}}var Te=getLocalApiKey(),A=join(homedir(),".devflow","errors");async function k(t,e,n={}){let r=n.endpoint??resolveRuntimeEndpoint().url,o=n.timeout??1500,i=n.durableMirror??true,s=n.maxRetries??(i?0:2),a=n.circuitBreaker??true,c=acquireRuntimeHttpCircuit(r,t);if(a&&!c.allowed)return {delivered:false,suppressed:true,fallbackReason:c.state.fallbackReason};let l;for(let u=0;u<=s;u+=1)try{return await Me(r,t,e,o),a&&registerRuntimeHttpSuccess(r,t).transitioned&&C("http_circuit_transition",{endpoint:r,path:new URL(t,r).pathname,previous:c.state.status,status:"closed",failures:0}),{delivered:!0,suppressed:!1}}catch(m){l=m instanceof Error?m:new Error(String(m)),u<s&&await De(Math.min(100*2**u,1e3));}if(!l)return {delivered:false,suppressed:false,fallbackReason:"unknown_http_failure"};if(!a)return X(t,l),{delivered:false,suppressed:false,fallbackReason:l.message};let d=registerRuntimeHttpFailure(r,t,n.fallbackReason??(i?"local_durable_mirror":"http_delivery_failed"));return d.transitioned&&(X(t,l),C("http_circuit_transition",{endpoint:r,path:new URL(t,r).pathname,previous:c.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 Me(t,e,n,r){return new Promise((o,i)=>{let s=JSON.stringify(n),a=new URL(e,t),c=false,l=u=>{c||(c=true,u?i(u):o());},d=request({hostname:a.hostname,port:a.port,path:a.pathname+a.search,method:"POST",headers:{"Content-Type":"application/json","X-API-Key":Te,"Content-Length":Buffer.byteLength(s)},timeout:r},u=>{u.on("error",l),u.on("end",()=>{let m=u.statusCode??0;l(m>=200&&m<300?void 0:new Error(`HTTP ${m}`));}),u.resume();});d.on("error",l),d.on("timeout",()=>d.destroy(new Error(`HTTP mirror timed out after ${r}ms`))),d.write(s),d.end();})}function X(t,e){try{existsSync(A)||mkdirSync(A,{recursive:!0}),appendFileSync(join(A,"http-errors.log"),`${new Date().toISOString()} | ${t} | ${e.message}
2
- `);}catch{}}function De(t){return new Promise(e=>setTimeout(e,t))}function ee(t,e){let n=Fe(t);mkdirSync(n,{recursive:true,mode:448});let r=join(n,`${e.receiptId}.json`);if(existsSync(r))return e.receiptId;let o=`${r}.${process.pid}.tmp`;writeFileSync(o,JSON.stringify(e),{mode:384});try{renameSync(o,r);}catch(i){try{unlinkSync(o);}catch{}if(!existsSync(r))throw i}return e.receiptId}function Fe(t){return join(I(t),"session-finalize-pending")}var Ue=512*1024,Je=500;var Be=["\u5DE5\u5177\u53D1\u73B0","\u6A21\u578B\u5047\u8BBE","\u9700\u8981\u8FD0\u884C\u65F6\u9A8C\u8BC1"];function re(t){let e=t.runtimeStore??new h(t.projectRoot),n=e.listEvidenceObligations(t.sessionId);if(n.length===0)return null;let r=ie(t.transcriptPath,n);if(!r.answer){let s=r.degradationReason??"transcript_answer_unavailable";for(let a of n)e.degradeEvidenceObligation(t.sessionId,a.obligationId,s);return null}let o=r.fingerprint;if(!o){for(let s of n)e.degradeEvidenceObligation(t.sessionId,s.obligationId,"transcript_identity_unavailable");return null}let i=[];for(let s of n){let a=Ge(r.answer,[s]);if(a.length===0){e.resolveEvidenceObligation(t.sessionId,s.obligationId);continue}if(!s.correctionFingerprint){e.markEvidenceCorrection(t.sessionId,s.obligationId,a,o),i.push({obligation:s,violations:a});continue}if(s.correctionFingerprint===o){i.push({obligation:s,violations:a});continue}e.degradeEvidenceObligation(t.sessionId,s.obligationId,"evidence_contract_unresolved");}return i.length===0?null:We(i)}function We(t){let e=[...new Set(t.flatMap(r=>r.violations))],n=[...new Map(t.map(r=>[r.obligation.contractId,r.obligation.contract.canonicalReport])).values()];return {decision:"block",reason:["DevFlow evidence contract violation. Correct the final performance answer once before stopping.",`Violations: ${e.join("; ")}`,"Use this canonical report (you may add clearly labeled hypotheses or runtime verification steps, but no unsupported measured claims):",n.join(`
1
+ import {getLocalApiKey,resolveRuntimeEndpoint,acquireRuntimeHttpCircuit,registerRuntimeHttpSuccess,registerRuntimeHttpFailure,getProjectStateDir}from'@devflow-tools/sdk';import {existsSync as existsSync$1,readFileSync as readFileSync$1,rmSync,mkdirSync as mkdirSync$1,writeFileSync as writeFileSync$1,linkSync,readdirSync,renameSync as renameSync$1}from'fs';import {join as join$1}from'path';import {randomUUID,createHash as createHash$1}from'crypto';import {openGlobalDevFlowDatabase}from'@devflow-tools/database';import'@devflow-tools/memory-engine';import'os';import {request}from'node:http';import {mkdirSync,existsSync,writeFileSync,renameSync,unlinkSync,readFileSync,openSync,constants,fstatSync,closeSync,appendFileSync,lstatSync,readSync}from'node:fs';import {join,resolve}from'node:path';import {homedir}from'node:os';import {createHash}from'node:crypto';import {emitSemanticControlLog}from'@devflow-tools/telemetry';function I(n){return n??process.env.CLAUDE_PROJECT_DIR??process.cwd()}function _(n){return process.env.DEVFLOW_STATE_DIR??getProjectStateDir(I(n))}function q(n){return Buffer.from(n,"utf8").toString("base64url")}function we(n,e,t){let o=e?.trim();if(o){let r=/^[a-zA-Z0-9:._-]{1,192}$/.test(o)?o:`tool-${createHash$1("sha256").update(o.slice(0,1024)).digest("hex").slice(0,32)}`;return `${n}:${r}`}return `${n}:legacy-${t}-${randomUUID().slice(0,8)}`}function B(n){return `${n}:legacy-journal`}var h=class{constructor(e){this.projectRoot=e;this.sessions=new Map;this.sessionsDir=join$1(_(e),"hook-sessions");}registerSession(e){let t=e.trim();if(!t)throw new Error("session_id_required");let o=this.get(t);if(o)return o.lastActivityAt=Date.now(),this.persist(o),o;let r=Date.now(),i={sessionId:t,projectRoot:this.projectRoot,requiredMcpTools:[],evidenceObligations:[],evidenceDegradations:[],evidenceOutcomes:[],startedAt:r,lastActivityAt:r};return this.sessions.set(t,i),this.persist(i),i}startExecution(e,t,o){let r=this.registerSession(e);return (!r.executionId||r.skillName!==t)&&(r.executionId=`exec_${Date.now()}_${randomUUID().slice(0,8)}`),r.skillName=t,r.requiredMcpTools=[...new Set(o)],r.lastActivityAt=Date.now(),this.persist(r),r}bindTaskIdentity(e,t){let o=this.registerSession(e);return o.activeTurnId=t.turnId,o.activeRequestId=t.requestId,o.intentArtifactHash=t.intentArtifactHash,o.lastActivityAt=Date.now(),this.persist(o),o}get(e){let t=e.trim();if(!t)return null;let o=this.sessions.get(t);if(o)return this.replayEvidenceJournal(o),o;let r=this.snapshotPath(t);if(!existsSync$1(r))return null;try{let i=JSON.parse(readFileSync$1(r,"utf8"));return i.sessionId!==t||i.projectRoot!==this.projectRoot?null:(i.requiredMcpTools=Array.isArray(i.requiredMcpTools)?i.requiredMcpTools:[],i.evidenceObligations=H(i.evidenceObligations),i.evidenceDegradations=U(i.evidenceDegradations),i.evidenceOutcomes=z(i.evidenceOutcomes),this.replayEvidenceJournal(i),this.sessions.set(t,i),i)}catch{return null}}completeExecution(e){let t=this.get(e);if(!t)return null;let o=structuredClone(t);return delete t.executionId,delete t.skillName,t.requiredMcpTools=[],t.lastActivityAt=Date.now(),this.persist(t),o}addEvidenceObligation(e,t,o=Date.now(),r){let i=this.registerSession(e),a=(r?void 0:i.evidenceObligations.find(u=>u.contractId===t.id))?.obligationId??we(t.id,r,o);this.appendEvidenceEvent(e,{kind:"add",obligationId:a,contractId:t.id,at:o,contract:t},`add\0${a}`),this.replayEvidenceJournal(i);let c=i.evidenceObligations.find(u=>u.obligationId===a);return c?(i.lastActivityAt=Date.now(),this.persist(i),structuredClone(c)):null}listEvidenceObligations(e){return (this.get(e)?.evidenceObligations??[]).map(t=>structuredClone(t))}markEvidenceCorrection(e,t,o,r,i=Date.now()){let s=this.get(e),a=s?.evidenceObligations.find(d=>d.obligationId===t);if(!s||!a)return null;let c=/^[a-f0-9]{64}$/.test(r)?r:"";if(!c)return null;this.appendEvidenceEvent(e,{kind:"correction",obligationId:t,contractId:a.contractId,at:i,fingerprint:c,violations:o.slice(0,16).map(d=>d.slice(0,240))},`correction\0${t}\0${c}`),this.replayEvidenceJournal(s),s.lastActivityAt=i,this.persist(s);let u=s.evidenceObligations.find(d=>d.obligationId===t);return u?structuredClone(u):null}resolveEvidenceObligation(e,t){let o=this.get(e);if(!o)return false;let r=o.evidenceObligations.find(s=>s.obligationId===t);if(!r)return false;let i=Date.now();return this.appendEvidenceEvent(e,{kind:"resolve",obligationId:t,contractId:r.contractId,at:i},`resolve\0${t}`),this.replayEvidenceJournal(o),o.lastActivityAt=i,this.persist(o),true}resolveDegradedEvidence(e,t){let o=this.get(e),r=o?.evidenceDegradations.find(s=>s.obligationId===t);if(!o||!r)return false;let i=Date.now();return this.appendEvidenceEvent(e,{kind:"resolve",obligationId:t,contractId:r.contractId,at:i},`resolve-degraded\0${t}\0${i}`),this.replayEvidenceJournal(o),o.lastActivityAt=i,this.persist(o),true}degradeEvidenceObligation(e,t,o,r=Date.now()){let i=this.get(e),s=i?.evidenceObligations.find(c=>c.obligationId===t);if(!i||!s)return false;let a=o.slice(0,240);return this.appendEvidenceEvent(e,{kind:"degrade",obligationId:t,contractId:s.contractId,at:r,reason:a},`degrade\0${t}\0${a}`),this.replayEvidenceJournal(i),i.lastActivityAt=r,this.persist(i),true}removeSession(e){let t=e.trim();t&&(this.sessions.delete(t),rmSync(this.snapshotPath(t),{force:true}),rmSync(this.evidenceJournalDir(t),{recursive:true,force:true}));}list(){return [...this.sessions.values()]}snapshotPath(e){return join$1(this.sessionsDir,`${q(e)}.json`)}evidenceJournalDir(e){return join$1(this.sessionsDir,"evidence-journal",q(e))}appendEvidenceEvent(e,t,o){let r=this.evidenceJournalDir(e);mkdirSync$1(r,{recursive:true,mode:448});let i=createHash$1("sha256").update(o).digest("hex"),s=join$1(r,`${t.kind}-${i}.json`);if(existsSync$1(s))return;let a=join$1(r,`.${process.pid}.${randomUUID()}.tmp`);writeFileSync$1(a,JSON.stringify(t),{mode:384});try{linkSync(a,s);}catch(c){if(c.code!=="EEXIST")throw c}finally{rmSync(a,{force:true});}}replayEvidenceJournal(e){e.evidenceObligations=H(e.evidenceObligations),e.evidenceDegradations=U(e.evidenceDegradations),e.evidenceOutcomes=z(e.evidenceOutcomes);let t=this.evidenceJournalDir(e.sessionId);if(!existsSync$1(t))return;let o;try{o=readdirSync(t).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$1(join$1(t,i),"utf8");if(Buffer.byteLength(s,"utf8")>64*1024)return [];let a=Re(JSON.parse(s));return a?[a]:[]}catch{return []}}).sort((i,s)=>i.at-s.at||J(i.kind)-J(s.kind));for(let i of r)this.applyEvidenceEvent(e,i);e.evidenceObligations=e.evidenceObligations.slice(-8),e.evidenceDegradations=e.evidenceDegradations.slice(-20),e.evidenceOutcomes=e.evidenceOutcomes.slice(-20);}applyEvidenceEvent(e,t){let o=e.evidenceOutcomes.find(s=>s.obligationId===t.obligationId);if(t.kind==="add"){if(o)return;let s=e.evidenceObligations.find(a=>a.obligationId===t.obligationId);s?(s.contract=t.contract,s.promptedAt=Math.min(s.promptedAt,t.at)):e.evidenceObligations.push({obligationId:t.obligationId,contractId:t.contractId,contract:t.contract,promptedAt:t.at,attempt:0,correctionRequested:false,violations:[]});return}let r=e.evidenceObligations.find(s=>s.obligationId===t.obligationId);if(t.kind==="correction"){if(!r||o||r.correctionFingerprint===t.fingerprint)return;r.attempt+=1,r.correctionRequested=true,r.correctionRequestedAt=t.at,r.correctionFingerprint=t.fingerprint,r.violations=t.violations;return}let i=r?.attempt??o?.attempt??0;if(t.kind==="resolve"&&o?.status==="degraded")e.evidenceOutcomes=e.evidenceOutcomes.filter(s=>s.obligationId!==t.obligationId),e.evidenceDegradations=e.evidenceDegradations.filter(s=>s.obligationId!==t.obligationId);else if(o)return;t.kind==="degrade"?(e.evidenceObligations=e.evidenceObligations.filter(s=>s.obligationId!==t.obligationId),e.evidenceDegradations.push({obligationId:t.obligationId,contractId:t.contractId,reason:t.reason,degradedAt:t.at,attempt:i,contract:r?.contract})):e.evidenceObligations=e.evidenceObligations.filter(s=>s.obligationId!==t.obligationId),e.evidenceOutcomes.push({obligationId:t.obligationId,contractId:t.contractId,status:t.kind==="resolve"?"resolved":"degraded",completedAt:t.at,attempt:i,...t.kind==="degrade"?{reason:t.reason}:{}});}persist(e){mkdirSync$1(this.sessionsDir,{recursive:true,mode:448});let t=this.snapshotPath(e.sessionId),o=`${t}.${process.pid}.${randomUUID()}.tmp`;writeFileSync$1(o,JSON.stringify(e),{mode:384}),renameSync$1(o,t);}};function H(n){return Array.isArray(n)?n.flatMap(e=>{if(!e||typeof e!="object")return [];let t=e;if(typeof t.contractId!="string"||t.contractId.length===0||t.contractId.length>128||typeof t.promptedAt!="number"||typeof t.attempt!="number"||typeof t.correctionRequested!="boolean"||!Array.isArray(t.violations)||!G(t.contract))return [];let o=typeof t.obligationId=="string"&&t.obligationId.length>0&&t.obligationId.length<=384?t.obligationId:B(t.contractId),r=typeof t.correctionTranscriptHash=="string"?t.correctionTranscriptHash:void 0,i=t.correctionFingerprint??r;return i!==void 0&&!/^[a-f0-9]{64}$/.test(i)?[]:[{...t,obligationId:o,correctionFingerprint:i}]}).slice(-8):[]}function U(n){return Array.isArray(n)?n.filter(e=>{if(!e||typeof e!="object")return false;let t=e;return typeof t.obligationId=="string"&&typeof t.contractId=="string"&&typeof t.reason=="string"&&typeof t.degradedAt=="number"&&typeof t.attempt=="number"}).slice(-20):[]}function z(n){return Array.isArray(n)?n.filter(e=>{if(!e||typeof e!="object")return false;let t=e;return typeof t.obligationId=="string"&&typeof t.contractId=="string"&&(t.status==="resolved"||t.status==="degraded")&&typeof t.completedAt=="number"&&typeof t.attempt=="number"&&(t.reason===void 0||typeof t.reason=="string")}).slice(-20):[]}function Re(n){if(!n||typeof n!="object")return null;let e=n,t=e.kind;if(t!=="add"&&t!=="correction"&&t!=="resolve"&&t!=="degrade"||typeof e.contractId!="string"||e.contractId.length>128||typeof e.at!="number")return null;let r={obligationId:typeof e.obligationId=="string"&&e.obligationId.length>0&&e.obligationId.length<=384?e.obligationId:B(e.contractId),contractId:e.contractId,at:e.at};if(t==="add")return G(e.contract)?{kind:t,...r,contract:e.contract}:null;if(t==="correction"){let i=typeof e.fingerprint=="string"?e.fingerprint:e.transcriptHash;return typeof i=="string"&&/^[a-f0-9]{64}$/.test(i)&&Array.isArray(e.violations)&&e.violations.every(s=>typeof s=="string"&&s.length<=240)?{kind:t,...r,fingerprint:i,violations:e.violations}:null}return t==="resolve"?{kind:t,...r}:typeof e.reason=="string"&&e.reason.length<=240?{kind:t,...r,reason:e.reason}:null}function J(n){return n==="add"?0:n==="correction"?1:2}function G(n){if(!n||typeof n!="object")return false;let e=n,t=e.requiredSections,o=e.prohibitedClaims;return e.version==="1.0"&&typeof e.id=="string"&&/^[a-zA-Z0-9][a-zA-Z0-9:._-]{0,127}$/.test(e.id)&&typeof e.runtimeProfilingOccurred=="boolean"&&typeof e.samplingEvidenceOccurred=="boolean"&&Array.isArray(t)&&t.length===3&&t[0]==="\u5DE5\u5177\u53D1\u73B0"&&t[1]==="\u6A21\u578B\u5047\u8BBE"&&t[2]==="\u9700\u8981\u8FD0\u884C\u65F6\u9A8C\u8BC1"&&Array.isArray(o)&&o.length<=16&&o.every(r=>typeof r=="string"&&r.length<=128)&&typeof e.canonicalReport=="string"&&Buffer.byteLength(e.canonicalReport,"utf8")<=48*1024&&!!e.correctionPolicy&&e.correctionPolicy.maxAttempts===1&&e.correctionPolicy.repeatedViolation==="fail_open"}function C(n,e,t){try{let o=openGlobalDevFlowDatabase();try{o.insertEvent({kind:n,timestamp:Date.now(),duration:t,success:e.success!==!1,metadata:e});}finally{o.close();}}catch{}}var Me=getLocalApiKey(),T=join(homedir(),".devflow","errors");async function R(n,e,t={}){let o=t.endpoint??resolveRuntimeEndpoint().url,r=t.timeout??1500,i=t.durableMirror??true,s=t.maxRetries??(i?0:2),a=t.circuitBreaker??true,c=acquireRuntimeHttpCircuit(o,n);if(a&&!c.allowed)return {delivered:false,suppressed:true,fallbackReason:c.state.fallbackReason};let u;for(let l=0;l<=s;l+=1)try{return await Oe(o,n,e,r),a&&registerRuntimeHttpSuccess(o,n).transitioned&&C("http_circuit_transition",{endpoint:o,path:new URL(n,o).pathname,previous:c.state.status,status:"closed",failures:0}),{delivered:!0,suppressed:!1}}catch(m){u=m instanceof Error?m:new Error(String(m)),l<s&&await $e(Math.min(100*2**l,1e3));}if(!u)return {delivered:false,suppressed:false,fallbackReason:"unknown_http_failure"};if(!a)return Z(n,u),{delivered:false,suppressed:false,fallbackReason:u.message};let d=registerRuntimeHttpFailure(o,n,t.fallbackReason??(i?"local_durable_mirror":"http_delivery_failed"));return d.transitioned&&(Z(n,u),C("http_circuit_transition",{endpoint:o,path:new URL(n,o).pathname,previous:c.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 Oe(n,e,t,o){return new Promise((r,i)=>{let s=JSON.stringify(t),a=new URL(e,n),c=false,u=l=>{c||(c=true,l?i(l):r());},d=request({hostname:a.hostname,port:a.port,path:a.pathname+a.search,method:"POST",headers:{"Content-Type":"application/json","X-API-Key":Me,"Content-Length":Buffer.byteLength(s)},timeout:o},l=>{l.on("error",u),l.on("end",()=>{let m=l.statusCode??0;u(m>=200&&m<300?void 0:new Error(`HTTP ${m}`));}),l.resume();});d.on("error",u),d.on("timeout",()=>d.destroy(new Error(`HTTP mirror timed out after ${o}ms`))),d.write(s),d.end();})}function Z(n,e){try{existsSync(T)||mkdirSync(T,{recursive:!0}),appendFileSync(join(T,"http-errors.log"),`${new Date().toISOString()} | ${n} | ${e.message}
2
+ `);}catch{}}function $e(n){return new Promise(e=>setTimeout(e,n))}function ne(n,e){let t=Le(n);mkdirSync(t,{recursive:true,mode:448});let o=join(t,`${e.receiptId}.json`);if(existsSync(o))return e.receiptId;let r=`${o}.${process.pid}.tmp`;writeFileSync(r,JSON.stringify(e),{mode:384});try{renameSync(r,o);}catch(i){try{unlinkSync(r);}catch{}if(!existsSync(o))throw i}return e.receiptId}function Le(n){return join(_(n),"session-finalize-pending")}var We=512*1024,Be=500;var Ge=["\u5DE5\u5177\u53D1\u73B0","\u6A21\u578B\u5047\u8BBE","\u9700\u8981\u8FD0\u884C\u65F6\u9A8C\u8BC1"];function ie(n){let e=n.runtimeStore??new h(n.projectRoot),t=e.listEvidenceObligations(n.sessionId);if(t.length===0)return Ke(n,e),null;let o=M(n.transcriptPath,t);if(!o.answer){let s=o.degradationReason??"transcript_answer_unavailable";for(let a of t)e.degradeEvidenceObligation(n.sessionId,a.obligationId,s);return null}let r=o.fingerprint;if(!r){for(let s of t)e.degradeEvidenceObligation(n.sessionId,s.obligationId,"transcript_identity_unavailable");return null}let i=[];for(let s of t){let a=se(o.answer,[s]);if(a.length===0){e.resolveEvidenceObligation(n.sessionId,s.obligationId),k(n,s,"satisfied",r);continue}if(!s.correctionFingerprint){e.markEvidenceCorrection(n.sessionId,s.obligationId,a,r),i.push({obligation:s,violations:a}),k(n,s,"correction_requested",r,a);continue}if(s.correctionFingerprint===r){i.push({obligation:s,violations:a});continue}e.degradeEvidenceObligation(n.sessionId,s.obligationId,"evidence_contract_unresolved"),k(n,s,"degraded",r,a);}return i.length===0?null:Ve(i)}function Ke(n,e){let t=(e.get(n.sessionId)?.evidenceDegradations??[]).filter(i=>i.contract).slice(-8);if(t.length===0)return;let o=t.map(i=>({obligationId:i.obligationId,contractId:i.contractId,contract:i.contract,promptedAt:i.degradedAt,attempt:i.attempt,correctionRequested:true,violations:[]})),r=M(n.transcriptPath,o);if(!(!r.answer||!r.fingerprint))for(let i of o)se(r.answer,[i]).length>0||e.resolveDegradedEvidence(n.sessionId,i.obligationId)&&k(n,i,"satisfied",r.fingerprint);}function k(n,e,t,o,r=[]){emitSemanticControlLog({event:"verification.completed",identity:{projectRoot:n.projectRoot,sessionId:n.sessionId},level:t==="satisfied"?"info":t==="degraded"?"error":"warn",timestamp:Date.now(),data:{stage:"performance_evidence_transition",status:t,contractId:e.contractId,obligationId:e.obligationId,attempt:e.attempt,answerFingerprint:o,violations:r,supersedesDegradation:t==="satisfied"&&e.attempt>0}});}function Ve(n){let e=[...new Set(n.flatMap(o=>o.violations))],t=[...new Map(n.map(o=>[o.obligation.contractId,o.obligation.contract.canonicalReport])).values()];return {decision:"block",reason:["DevFlow evidence contract violation. Correct the final performance answer once before stopping.",`Violations: ${e.join("; ")}`,"Use this canonical report (you may add clearly labeled hypotheses or runtime verification steps, but no unsupported measured claims):",t.join(`
3
3
 
4
4
  ---
5
5
 
6
6
  `)].join(`
7
7
 
8
- `)}}function Ge(t,e){let n=new Set,r=new Set(e.flatMap(c=>c.contract.requiredSections)),o=oe(t.split(/\r?\n/)),i=se(o.headingLines);for(let c of r)i.found.has(c)||n.add(`missing_section:${c}`);if(e.every(c=>c.contract.runtimeProfilingOccurred))return [...n];let a=e.every(c=>c.contract.samplingEvidenceOccurred);for(let c=0;c<o.claimLines.length;c++){let l=o.claimLines[c].trim();if(!l||Ve(l))continue;let d=i.byLine.get(c);for(let u of et(l))Ye(u,d,a,n);}return [...n]}function oe(t){let e=false,n=[],r=[];for(let o of t){if(/^\s*```/.test(o)){e=!e,n.push(""),r.push(o.replace(/^\s*```+[^\s`]*/,"").replace(/```+\s*$/,"").trim());continue}n.push(e?"":o.replace(/`[^`]*`/g,"").trim()),r.push(o.replace(/`([^`]*)`/g,(i,s)=>Ke(s)?"":s).trim());}return {headingLines:n,claimLines:r}}function Ke(t){let e=t.trim().slice(0,256);return !e||/\s/.test(e)||t.trim().length>256?false:/^[A-Za-z_$][\w$.-]*$/.test(e)||/^(['"])[^'"`]*\1$/.test(e)}function Ve(t){if(t.length>2048)return false;let e=t.replace(/^\s*(?:[-*+]|\d+[.)])\s+/,"").trim();return e?Xe(e)||/^(?:\/\/|\/\*|\*\/|\*\s|#!)/.test(e)||/^(?:import|export|const|let|var|function|class|type|interface|enum|namespace|declare)\b/.test(e)||/^(?:async\s+)?(?:function\s+)?[A-Za-z_$][\w$]*\s*=\s*/.test(e)||/^[A-Za-z_$][\w$.[\]'"-]*\s*(?:=|\+=|-=|\*=|\/=|\?\?=|&&=|\|\|=)\s*/.test(e)||/^[A-Za-z_$'"-][\w$.'"-]*\s*:\s*[^:]+[,}]?$/.test(e)||/=>/.test(e)||/^(?:await\s+|return\s+|throw\s+|new\s+)?[A-Za-z_$][\w$.]*\s*\([^)]*\)\s*;?$/.test(e)||/^(['"])[\s\S]*\1[;,]?$/.test(e)?true:/[{}()[\]=<>]\s*;?$/.test(e)&&/(?:;|=>|\b(?:return|new|await)\b)/.test(e):false}function Xe(t){if(t.length>1024)return false;let e="(?:--[A-Za-z0-9_-]+|(?:-webkit-|-moz-|-ms-)?(?:animation(?:-[a-z-]+)?|transition(?:-[a-z-]+)?|opacity|transform|will-change|contain|content-visibility|display|position|top|right|bottom|left|width|height|min-(?:width|height)|max-(?:width|height)|margin(?:-[a-z]+)?|padding(?:-[a-z]+)?|color|background(?:-[a-z-]+)?|border(?:-[a-z-]+)?|font(?:-[a-z-]+)?|line-height|z-index|overflow(?:-[xy])?))";return new RegExp(`^${e}\\s*:\\s*\\S[^;]{0,960};$`,"i").test(t)}function Ye(t,e,n,r){let o=/\bP0\b/gi;for(let g of t.matchAll(o))ne(t,g.index??0,g[0],"p0")||r.add("unsupported_p0_severity");let i=/(?:中高|高)(?:风险|优先级)|严重(?:问题|风险)|\bhigh[- ](?:risk|severity|priority)\b/gi;for(let g of t.matchAll(i))ne(t,g.index??0,g[0],"high")||r.add("unsupported_high_severity");let s=/(?:性能)?瓶颈|卡顿|掉帧|CPU\s*(?:热点|尖峰)|\bbottleneck\b|\bjank\b|\bdropped frames?\b|\bCPU hotspot\b/gi;for(let g of t.matchAll(s))Qe(t,g.index??0,g[0])||(/(?:瓶颈|bottleneck)/i.test(g[0])?r.add("unsupported_confirmed_bottleneck"):r.add("unsupported_runtime_effect"));let a=/\b\d{1,3}(?:\.\d+)?\s*%/.test(t),c=/(?:预计|预期|估计|提升|降低|减少|节省|改善|收益|加速|improve|reduce|faster|gain|benefit|speedup|expected|estimated)/i.test(t),l=/\b\d+(?:\.\d+)?\s*[x×]\b/i.test(t);(a||l)&&c&&r.add(a?"unsupported_benefit_percentage":"unsupported_performance_number");let d=/\b\d+(?:\.\d+)?(?:\s*[-–~]\s*\d+(?:\.\d+)?)?\s*(?:ms|fps|hz)\b/i.test(t)||/\d+(?:\.\d+)?(?:\s*[-–~]\s*\d+(?:\.\d+)?)?\s*(?:毫秒|次\s*\/\s*秒|帧)/.test(t),u=e==="\u9700\u8981\u8FD0\u884C\u65F6\u9A8C\u8BC1"&&/(?:采集|记录|测量|收集|collect|measure|record)/i.test(t)&&!/(?:预计|预期|估计|约|大约|通常|平均|每(?:隔)?|达到|提升|降低|减少|节省|改善|improve|reduce|faster|expected|estimated|average|typically|every)/i.test(t);a&&!c&&!u&&r.add("unsupported_benefit_percentage"),d&&!u&&r.add("unsupported_performance_number");let m=/(?:requestAnimationFrame|\bRAF\b)/i.test(t),y=/(?:建议|应该|应当|使用|添加|采用|切换|包裹|优化|节流|\buse\b|\badopt\b|\brecommend\b|\bswitch\b|\bwrap\b|\bthrottl(?:e|ing)\b)/i.test(t),p=/(?:不要|不得|不能|不应|避免|不建议|不推荐).{0,16}(?:使用|采用|添加|切换|包裹|节流)?.{0,8}(?:requestAnimationFrame|\bRAF\b)|\b(?:do\s+not|don't|never|avoid)\s+(?:use|adopt|recommend|switch|wrap|throttle)?.{0,8}(?:requestAnimationFrame|RAF)\b/i.test(t);m&&y&&!p&&!n&&r.add("raf_without_sampling_evidence");}function ne(t,e,n,r){let o=t.slice(Math.max(0,e-64),e),i=t.slice(e+n.length,e+n.length+28),s=Ze(o),a=/^(?:\s+)?(?:未发现|不存在|并不存在|未被发现)/.test(i)||/^(?:\s+)?(?:was\s+|is\s+)?not found\b/i.test(i);return s||a?true:r==="high"?/(?:未发现|没有发现|不存在|无证据(?:表明|证明)?)\s*(?:任何|明确的)?\s*P0\s*(?:或|和|及|、)\s*$/i.test(o)||/\b(?:no evidence (?:of|for)|no)\s+P0\s+(?:or|and)\s+$/i.test(o):false}function Ze(t){if(/(?:未发现|没有发现|不存在|无证据(?:表明|证明)?|不是|并非|未被)\s*(?:任何|明确的)?\s*(?:(?:问题|发现|证据|项|内容)\s*)?(?:(?:属于|(?:被)?(?:评|判定|认定|标记|列|视|定|归(?:类)?)为)\s*)?$/i.test(t)||/\b(?:no evidence (?:of|for)|no|not|isn't|is\s+not)\s+(?:an?\s+)?(?:(?:issues?|findings?|evidence|items?)\s+)?(?:(?:classified|rated|marked|labelled|labeled)(?:\s+as)?\s+)?$/i.test(t))return true;let n=/(?:不得|不能|不应|不宜|不要)\s*(?:被\s*)?(?:(?:直接|轻易|简单|明确|正式|合理|据此|当前|目前)\s*){0,2}(?:(?:评|判定|认定|标记|列|视|定|归(?:类)?)为|属于)\s*$/i,r=/\b(?:cannot|can't|must not|should not|shouldn't|do not|don't)\s+(?:(?:reasonably|directly|formally|currently)\s+){0,2}(?:be\s+)?(?:classified|labeled|labelled|rated|marked)(?:\s+as)?\s+$/i;return n.test(t)||r.test(t)}function Qe(t,e,n){let r=t.slice(Math.max(0,e-40),e),o=t.slice(e+n.length,e+n.length+32),i=/(?:是否|待验证|候选|可能|潜在|未观察到|没有观察到|未发现|不存在|无证据(?:表明)?|不能(?:据此)?确认|尚未(?:确认|证明)|验证(?:是否)?|测量(?:是否)?|采集|记录|收集).{0,16}$/i.test(r)||/\b(?:whether|measure|validate|candidate|potential|possible|may|might|no|no evidence(?: of| for)?|not observed|unobserved|collect|record).{0,18}$/i.test(r),s=/^(?:是否|有待验证|待验证|候选|可能|潜在|指标|需要(?:验证|测量)|需(?:验证|测量))/.test(o)||/^(?:\s+)?(?:candidate|potential|possible|metric|metrics|to (?:measure|validate)|needs? (?:measurement|validation)|is (?:a )?(?:candidate|potential))/i.test(o);return i||s}function et(t){return t.split(/(?:[。!?;;,,]|\b(?:but|however|yet|nevertheless|nonetheless)\b|但是|但|然而|却|不过|可是)/i).map(e=>e.trim()).filter(Boolean)}function ie(t,e){if(!t||t.length>4096)return {degradationReason:"transcript_path_missing"};let n;try{let r=lstatSync(t);if(!r.isFile()||r.isSymbolicLink())return {degradationReason:"transcript_path_unsafe"};n=openSync(t,constants.O_RDONLY|(constants.O_NOFOLLOW??0));let o=fstatSync(n);if(!o.isFile()||o.dev!==r.dev||o.ino!==r.ino)return {degradationReason:"transcript_path_changed"};let i=Math.min(o.size,Ue),s=Buffer.alloc(i),a=0;for(;a<i;){let p=readSync(n,s,a,i-a,o.size-i+a);if(p===0)break;a+=p;}let c=s.subarray(0,a).toString("utf8");o.size>i&&(c=c.slice(Math.max(0,c.indexOf(`
9
- `)+1)));let l=c.split(/\r?\n/).slice(-Je),d=e.length>0?Math.min(...e.map(p=>p.promptedAt)):0,u=nt(l,d),y=[...u].reverse().find(p=>tt(p.text,e))??u.at(-1);return y?.text?{answer:y.text,fingerprint:y.fingerprint}:{degradationReason:"transcript_answer_unavailable"}}catch{return {degradationReason:"transcript_unreadable"}}finally{n!==void 0&&closeSync(n);}}function tt(t,e){let n=new Set(e.flatMap(o=>o.contract.requiredSections)),r=se(oe(t.split(/\r?\n/u)).headingLines);return [...n].every(o=>r.found.has(o))}function M(t){return ie(t,[]).answer}function nt(t,e){let n=[];for(let r=0;r<t.length;r++){let o=t[r];if(o.trim())try{let i=JSON.parse(o),s=i.message;if(!s||typeof s!="object"||s.role!=="assistant")continue;let a=s,c=rt(i.timestamp);if(c>0&&c+5e3<e)continue;let l=s.content,d=typeof l=="string"?l:Array.isArray(l)?l.filter(u=>u&&typeof u=="object"&&u.type==="text").map(u=>u.text).filter(u=>typeof u=="string").join(`
10
- `):"";if(d.trim()){let u=d.trim(),m=typeof a.id=="string"&&a.id?`message:${a.id}`:typeof i.uuid=="string"&&i.uuid?`uuid:${i.uuid}`:`record:${String(i.timestamp??"")}:${r}:${createHash("sha256").update(o).digest("hex")}`,y=createHash("sha256").update(u).digest("hex"),p=createHash("sha256").update(`${m}\0${y}`).digest("hex");n.push({text:u,timestamp:c,fingerprint:p});}}catch{continue}}return n}function rt(t){if(typeof t=="number"&&Number.isFinite(t))return t;if(typeof t!="string")return 0;let e=Date.parse(t);return Number.isFinite(e)?e:0}function se(t){let e=new Set,n=new Map,r;for(let o=0;o<t.length;o++){let i=t[o].trim().replace(/^#{1,6}\s*/,"").replace(/^\*\*(.*)\*\*$/,"$1").replace(/^(?:[一二三123][、..]\s*)/,"").replace(/[::]\s*$/,"").trim(),s=Be.find(a=>i===a);s&&(r=s,e.add(s)),n.set(o,r);}return {found:e,byLine:n}}var ae={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:["memory_decided","memory_quarantined"],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 D(t){let e=openGlobalDevFlowDatabase(void 0,{busyTimeoutMs:250});try{let n=e.getLatestTerminalTransition(t.artifact.projectRoot,t.artifact.sessionId,t.artifact.turnId);if(!n)throw new Error(`TERMINAL_INTENT_STATE_MISSING:${t.artifact.turnId}`);let r=t.memoryStatus==="pending"?t.retryOwned?"closed_with_retry_work":"closed_with_degradation":"closed";for(let o of st(n.toState,r,t.memoryStatus)){let i=n.sequence+1,s=`terminal:${createHash("sha256").update(`${t.artifact.artifactHash}\0${i}\0${o}`).digest("hex").slice(0,24)}`;n=e.appendTerminalTransition({projectRoot:t.artifact.projectRoot,projectId:t.artifact.projectId,hostId:t.artifact.hostId,sessionId:t.artifact.sessionId,turnId:t.artifact.turnId,requestId:t.artifact.requestId,executionId:t.artifact.executionId,sequence:i,fromState:n.toState,toState:o,receiptId:s,sourceReceiptId:t.memoryReceiptId??n.receiptId,reason:at(o,t),payload:{memoryStatus:t.memoryStatus,retryOwned:t.retryOwned??!1,sourceIntentHash:t.artifact.artifactHash},createdAt:Date.now()}),emitSemanticControlLog({event:"terminal.state.transitioned",identity:{projectRoot:t.artifact.projectRoot,projectId:t.artifact.projectId,hostId:t.artifact.hostId,sessionId:t.artifact.sessionId,turnId:t.artifact.turnId,requestId:t.artifact.requestId,...t.artifact.executionId?{executionId:t.artifact.executionId}:{}},level:o==="closed"?"info":o.includes("degradation")||o.includes("retry")?"warn":"info",timestamp:Date.now(),data:{fromState:n.fromState,nextState:o,receiptId:s,reason:n.reason}});}return n}finally{e.close();}}function st(t,e,n){if(t===e||ae[t].length===0)return [];let r=n==="pending"?["context_degraded","action_not_required","action_degraded","memory_quarantined",e]:["context_degraded","action_not_required","action_degraded","memory_decided",e],o=[],i=t;for(let s of r)i!==s&&ae[i].includes(s)&&(o.push(s),i=s);if(i!==e)throw new Error(`TERMINAL_PATH_UNAVAILABLE:${t}->${e}`);return o}function at(t,e){return t==="context_degraded"?"terminal_reconciliation_without_context_transition":t==="action_not_required"?"no_outstanding_canonical_action_receipt":t==="memory_decided"?`canonical_memory_${e.memoryStatus}`:t==="memory_quarantined"?e.reason:t==="closed_with_retry_work"?"durable_retry_owner_confirmed":t==="closed_with_degradation"?"terminal_obligation_unowned":e.reason}function ce(t){let e={committed:0,skipped:0,pending:0},n=[];for(let r of t)e[r.status]+=1,r.receiptId&&n.push(r.receiptId);return {memoryReceiptIds:[...new Set(n)],missingMemoryDecisionCount:e.pending,memoryTurnOutcomes:e}}function lt(t){return (t instanceof Error?t.message:String(t)).trim().slice(0,240)||"memory_lifecycle_unavailable"}function ut(t,e=_(),n=true,r,o=true){let i;try{i=JSON.parse(t);}catch{return null}let s=i.session_id?.trim();if(!s)return null;let a=`session-close:${createHash("sha256").update(`${e}\0${s}`).digest("hex").slice(0,24)}`,c={inputJson:t,sessionId:s,cleanupSharedState:n,executionId:r},l;try{l=openGlobalDevFlowDatabase(void 0,{busyTimeoutMs:50});let d=l.requestSessionClosure({receiptId:a,projectRoot:e,sessionId:s,payload:c}),u=l.getWorkByIdempotencyKey(a),m={status:d.state==="closed"||d.state==="closed_with_pending_work"?"completed":"accepted",receiptId:a,workState:u?.state??"pending",closureState:d.state,pendingWorkCount:d.pendingWorkCount};return emitSemanticControlLog({event:"hook.session_end.completed",identity:{projectRoot:e,sessionId:s,executionId:r,terminalReceipt:a},level:m.status==="completed"?"info":"debug",timestamp:Date.now(),data:{stage:"enqueue",...m}}),m}catch(d){if(!o)throw d;return ee(e,{receiptId:a,...c}),emitSemanticControlLog({event:"hook.session_end.degraded",identity:{projectRoot:e,sessionId:s,executionId:r,terminalReceipt:a},level:"warn",timestamp:Date.now(),data:{stage:"enqueue",reason:lt(d),fallback:"durable_spool"}}),{status:"accepted",receiptId:a,workState:"spooled",closureState:"closing",pendingWorkCount:1}}finally{l?.close();}}if(process.argv[1]?.endsWith("session-end")||process.argv[1]?.endsWith("session-end.js")){let t=console.log.bind(console);console.log=console.error.bind(console),console.info=console.error.bind(console);let e="";process.stdin.setEncoding("utf8"),process.stdin.on("data",n=>{e+=n;}),process.stdin.on("end",async()=>{let n=ut(e.trim()||process.argv[2]||"");n&&t(JSON.stringify(n)),process.exit(0);}),process.stdin.on("error",()=>process.exit(0)),setTimeout(()=>process.exit(0),1e4).unref();}var R=1,bt="memory-snapshot-v1.json",vt=512*1024,me=256*1024,pe=2e3,_t=500,It=10,St=240,wt=300*1e3,kt=720*60*60*1e3,Rt=2147483647;function xt(t){return t.currentUid===void 0?{ownerSafe:true,modeSafe:true}:{ownerSafe:t.ownerUid===t.currentUid,modeSafe:(t.mode&18)===0}}function v(t){return resolve(t)}function S(t){return createHash("sha256").update(v(t)).digest("hex").slice(0,16)}function Et(t,e={}){let n=S(t),r=e.stateRoot?join(e.stateRoot,n):getProjectStateDir(v(t));return join(r,bt)}function Ct(t,e){let r=(t instanceof Error?t.message:"").replace(/[\r\n\t]+/gu," ").trim().slice(0,160);return r?`${e}:${r}`:e}function $(t,e){return Array.isArray(t)&&t.length<=e&&t.every(n=>typeof n=="string"&&n.length>0&&n.length<=512)}function At(t){if(!t||typeof t!="object"||Array.isArray(t))return false;let e=t;return typeof e.id=="string"&&e.id.length>0&&e.id.length<=512&&typeof e.kind=="string"&&e.kind.length>0&&e.kind.length<=128&&(e.family===void 0||typeof e.family=="string"&&e.family.length>0&&e.family.length<=256)&&(e.entity===void 0||typeof e.entity=="string"&&e.entity.length>0&&e.entity.length<=256)&&$(e.memoryIds,100)&&(e.status==="withheld"||e.status==="resolved")&&(e.summary===void 0||typeof e.summary=="string"&&e.summary.length<=2e3)}function Tt(t){if(!t||typeof t!="object"||Array.isArray(t))return false;let e=t;return typeof e.reason=="string"&&e.reason.length>0&&e.reason.length<=512&&(e.stale===void 0||typeof e.stale=="boolean")}function fe(t,e,n){if(!t||typeof t!="object"||Array.isArray(t))return null;let r=t,o=v(e),i=S(o),s=r.generation===void 0?0:r.generation;return r.version!==R||r.projectRoot!==o||r.projectHash!==i||typeof r.markdown!="string"||Buffer.byteLength(r.markdown,"utf8")>me||!$(r.memoryIds,pe)||!Array.isArray(r.conflicts)||r.conflicts.length>_t||!r.conflicts.every(At)||typeof r.generatedAt!="number"||!Number.isFinite(r.generatedAt)||r.generatedAt<0||r.generatedAt>n+wt||!Number.isInteger(s)||s<0||s>Rt||!["ready","pending","degraded","disabled"].includes(String(r.status))||r.degradation!==void 0&&!Tt(r.degradation)?null:{...r,generation:s}}function Mt(t,e,n,r,o=0){let i=v(t);return {version:R,projectRoot:i,projectHash:S(i),markdown:"",memoryIds:[],conflicts:[],generatedAt:r,generation:o,status:e,degradation:{reason:n}}}function Dt(t,e={}){let n=e.now??Date.now(),r=Et(t,e),o;try{o=openSync(r,constants.O_RDONLY|constants.O_NOFOLLOW);let i=fstatSync(o);if(!i.isFile()||i.size<=0||i.size>vt)throw new Error("cache_size_invalid");let s=xt({...typeof process.getuid=="function"?{currentUid:process.getuid()}:{},ownerUid:i.uid,mode:i.mode});if(!s.ownerSafe)throw new Error("cache_owner_invalid");if(!s.modeSafe)throw new Error("cache_permissions_unsafe");let a=JSON.parse(readFileSync(o,"utf8")),c=fe(a,t,n);if(!c)throw new Error("cache_schema_invalid");return c.status==="ready"&&n-c.generatedAt>kt?{snapshot:{...c,status:"degraded",degradation:{reason:"cache_stale",stale:!0}},source:"cache",valid:!0,stale:!0}:{snapshot:c,source:"cache",valid:!0,stale:!1}}catch(i){let a=i.code==="ENOENT";return {snapshot:Mt(t,a?"pending":"degraded",a?"cache_missing":Ct(i,"cache_invalid"),n),source:"none",valid:false,stale:false}}finally{if(o!==void 0)try{closeSync(o);}catch{}}}function Ot(t){if(!t)return true;try{return JSON.parse(readFileSync(t,"utf8")).sessionStart?.injectMemories??!0}catch{return true}}function $t(t,e,n){if(!e.trim())return null;try{let r=JSON.parse(e);if(r.status!=="ok"&&r.status!=="degraded")return null;if(r.enabled===!1){let i=v(t);return {version:R,projectRoot:i,projectHash:S(i),markdown:"",memoryIds:[],conflicts:[],generatedAt:n,generation:0,status:"disabled"}}let o=fe(r.snapshot,t,n);if(o)return o;if(r.status==="ok"&&typeof r.markdown=="string"&&r.markdown.length>0&&Buffer.byteLength(r.markdown,"utf8")<=me){let i=v(t);return {version:R,projectRoot:i,projectHash:S(i),markdown:r.markdown,memoryIds:$(r.memoryIds,pe)?r.memoryIds:[],conflicts:[],generatedAt:n,generation:0,status:"ready"}}}catch{}return null}function O(t,e){return [...(t??e).replace(/[\r\n\t|]+/gu," ").trim()||e].slice(0,St).join("")}function Pt(t){if(t.length===0)return "";let e=t.slice(0,It),n=e.map(r=>{let o=O(r.family,"unknown"),i=O(r.entity,"unknown"),s=O(r.summary,"Explicit choice required.");return `- family=${o}; entity=${i}; status=${r.status}; summary=${s}`});return t.length>e.length&&n.push(`- ${t.length-e.length} additional conflict(s) omitted from SessionStart output.`),`## Withheld preference conflicts (${t.length})
11
- ${n.join(`
12
- `)}`}function jt(t){let e=t.now??Date.now();if(Ot(t.configPath)===false)return "";let n=$t(t.projectRoot,t.daemonResponse??"",e),r=n?{snapshot:n,source:"daemon"}:Dt(t.projectRoot,{...t.cacheOptions,now:e}),{snapshot:o}=r;if(o.status==="disabled")return `## Project memory
13
- DevFlow memory snapshot=pending; source=${r.source}; reason=previous_snapshot_disabled. Memory availability is not yet known; do not conclude that the project has no memories.`;let i=new Date(o.generatedAt).toISOString(),s=o.degradation?.reason?`; reason=${o.degradation.reason}`:"",a=`DevFlow memory snapshot=${o.status}; source=${r.source}; generatedAt=${i}${s}.`,c=Pt(o.conflicts);return o.markdown?[o.markdown,c,a].filter(Boolean).join(`
8
+ `)}}function se(n,e){let t=new Set,o=new Set(e.flatMap(c=>c.contract.requiredSections)),r=ae(n.split(/\r?\n/)),i=ce(r.headingLines);for(let c of o)i.found.has(c)||t.add(`missing_section:${c}`);if(e.every(c=>c.contract.runtimeProfilingOccurred))return [...t];let a=e.every(c=>c.contract.samplingEvidenceOccurred);for(let c=0;c<r.claimLines.length;c++){let u=r.claimLines[c].trim();if(!u||Ye(u))continue;let d=i.byLine.get(c);for(let l of nt(u))Qe(l,d,a,t);}return [...t]}function ae(n){let e=false,t=[],o=[];for(let r of n){if(/^\s*```/.test(r)){e=!e,t.push(""),o.push(r.replace(/^\s*```+[^\s`]*/,"").replace(/```+\s*$/,"").trim());continue}t.push(e?"":r.replace(/`[^`]*`/g,"").trim()),o.push(r.replace(/`([^`]*)`/g,(i,s)=>Xe(s)?"":s).trim());}return {headingLines:t,claimLines:o}}function Xe(n){let e=n.trim().slice(0,256);return !e||/\s/.test(e)||n.trim().length>256?false:/^[A-Za-z_$][\w$.-]*$/.test(e)||/^(['"])[^'"`]*\1$/.test(e)}function Ye(n){if(n.length>2048)return false;let e=n.replace(/^\s*(?:[-*+]|\d+[.)])\s+/,"").trim();return e?Ze(e)||/^(?:\/\/|\/\*|\*\/|\*\s|#!)/.test(e)||/^(?:import|export|const|let|var|function|class|type|interface|enum|namespace|declare)\b/.test(e)||/^(?:async\s+)?(?:function\s+)?[A-Za-z_$][\w$]*\s*=\s*/.test(e)||/^[A-Za-z_$][\w$.[\]'"-]*\s*(?:=|\+=|-=|\*=|\/=|\?\?=|&&=|\|\|=)\s*/.test(e)||/^[A-Za-z_$'"-][\w$.'"-]*\s*:\s*[^:]+[,}]?$/.test(e)||/=>/.test(e)||/^(?:await\s+|return\s+|throw\s+|new\s+)?[A-Za-z_$][\w$.]*\s*\([^)]*\)\s*;?$/.test(e)||/^(['"])[\s\S]*\1[;,]?$/.test(e)?true:/[{}()[\]=<>]\s*;?$/.test(e)&&/(?:;|=>|\b(?:return|new|await)\b)/.test(e):false}function Ze(n){if(n.length>1024)return false;let e="(?:--[A-Za-z0-9_-]+|(?:-webkit-|-moz-|-ms-)?(?:animation(?:-[a-z-]+)?|transition(?:-[a-z-]+)?|opacity|transform|will-change|contain|content-visibility|display|position|top|right|bottom|left|width|height|min-(?:width|height)|max-(?:width|height)|margin(?:-[a-z]+)?|padding(?:-[a-z]+)?|color|background(?:-[a-z-]+)?|border(?:-[a-z-]+)?|font(?:-[a-z-]+)?|line-height|z-index|overflow(?:-[xy])?))";return new RegExp(`^${e}\\s*:\\s*\\S[^;]{0,960};$`,"i").test(n)}function Qe(n,e,t,o){let r=/\bP0\b/gi;for(let g of n.matchAll(r))re(n,g.index??0,g[0],"p0")||o.add("unsupported_p0_severity");let i=/(?:中高|高)(?:风险|优先级)|严重(?:问题|风险)|\bhigh[- ](?:risk|severity|priority)\b/gi;for(let g of n.matchAll(i))re(n,g.index??0,g[0],"high")||o.add("unsupported_high_severity");let s=/(?:性能)?瓶颈|卡顿|掉帧|CPU\s*(?:热点|尖峰)|\bbottleneck\b|\bjank\b|\bdropped frames?\b|\bCPU hotspot\b/gi;for(let g of n.matchAll(s))tt(n,g.index??0,g[0])||(/(?:瓶颈|bottleneck)/i.test(g[0])?o.add("unsupported_confirmed_bottleneck"):o.add("unsupported_runtime_effect"));let a=/\b\d{1,3}(?:\.\d+)?\s*%/.test(n),c=/(?:预计|预期|估计|提升|降低|减少|节省|改善|收益|加速|improve|reduce|faster|gain|benefit|speedup|expected|estimated)/i.test(n),u=/\b\d+(?:\.\d+)?\s*[x×]\b/i.test(n);(a||u)&&c&&o.add(a?"unsupported_benefit_percentage":"unsupported_performance_number");let d=/\b\d+(?:\.\d+)?(?:\s*[-–~]\s*\d+(?:\.\d+)?)?\s*(?:ms|fps|hz)\b/i.test(n)||/\d+(?:\.\d+)?(?:\s*[-–~]\s*\d+(?:\.\d+)?)?\s*(?:毫秒|次\s*\/\s*秒|帧)/.test(n),l=e==="\u9700\u8981\u8FD0\u884C\u65F6\u9A8C\u8BC1"&&/(?:采集|记录|测量|收集|collect|measure|record)/i.test(n)&&!/(?:预计|预期|估计|约|大约|通常|平均|每(?:隔)?|达到|提升|降低|减少|节省|改善|improve|reduce|faster|expected|estimated|average|typically|every)/i.test(n);a&&!c&&!l&&o.add("unsupported_benefit_percentage"),d&&!l&&o.add("unsupported_performance_number");let m=/(?:requestAnimationFrame|\bRAF\b)/i.test(n),y=/(?:建议|应该|应当|使用|添加|采用|切换|包裹|优化|节流|\buse\b|\badopt\b|\brecommend\b|\bswitch\b|\bwrap\b|\bthrottl(?:e|ing)\b)/i.test(n),f=/(?:不要|不得|不能|不应|避免|不建议|不推荐).{0,16}(?:使用|采用|添加|切换|包裹|节流)?.{0,8}(?:requestAnimationFrame|\bRAF\b)|\b(?:do\s+not|don't|never|avoid)\s+(?:use|adopt|recommend|switch|wrap|throttle)?.{0,8}(?:requestAnimationFrame|RAF)\b/i.test(n);m&&y&&!f&&!t&&o.add("raf_without_sampling_evidence");}function re(n,e,t,o){let r=n.slice(Math.max(0,e-64),e),i=n.slice(e+t.length,e+t.length+28),s=et(r),a=/^(?:\s+)?(?:未发现|不存在|并不存在|未被发现)/.test(i)||/^(?:\s+)?(?:was\s+|is\s+)?not found\b/i.test(i);return s||a?true:o==="high"?/(?:未发现|没有发现|不存在|无证据(?:表明|证明)?)\s*(?:任何|明确的)?\s*P0\s*(?:或|和|及|、)\s*$/i.test(r)||/\b(?:no evidence (?:of|for)|no)\s+P0\s+(?:or|and)\s+$/i.test(r):false}function et(n){if(/(?:未发现|没有发现|不存在|无证据(?:表明|证明)?|不是|并非|未被)\s*(?:任何|明确的)?\s*(?:(?:问题|发现|证据|项|内容)\s*)?(?:(?:属于|(?:被)?(?:评|判定|认定|标记|列|视|定|归(?:类)?)为)\s*)?$/i.test(n)||/\b(?:no evidence (?:of|for)|no|not|isn't|is\s+not)\s+(?:an?\s+)?(?:(?:issues?|findings?|evidence|items?)\s+)?(?:(?:classified|rated|marked|labelled|labeled)(?:\s+as)?\s+)?$/i.test(n))return true;let t=/(?:不得|不能|不应|不宜|不要)\s*(?:被\s*)?(?:(?:直接|轻易|简单|明确|正式|合理|据此|当前|目前)\s*){0,2}(?:(?:评|判定|认定|标记|列|视|定|归(?:类)?)为|属于)\s*$/i,o=/\b(?:cannot|can't|must not|should not|shouldn't|do not|don't)\s+(?:(?:reasonably|directly|formally|currently)\s+){0,2}(?:be\s+)?(?:classified|labeled|labelled|rated|marked)(?:\s+as)?\s+$/i;return t.test(n)||o.test(n)}function tt(n,e,t){let o=n.slice(Math.max(0,e-40),e),r=n.slice(e+t.length,e+t.length+32),i=/(?:是否|待验证|候选|可能|潜在|未观察到|没有观察到|未发现|不存在|无证据(?:表明)?|不能(?:据此)?确认|尚未(?:确认|证明)|验证(?:是否)?|测量(?:是否)?|采集|记录|收集).{0,16}$/i.test(o)||/\b(?:whether|measure|validate|candidate|potential|possible|may|might|no|no evidence(?: of| for)?|not observed|unobserved|collect|record).{0,18}$/i.test(o),s=/^(?:是否|有待验证|待验证|候选|可能|潜在|指标|需要(?:验证|测量)|需(?:验证|测量))/.test(r)||/^(?:\s+)?(?:candidate|potential|possible|metric|metrics|to (?:measure|validate)|needs? (?:measurement|validation)|is (?:a )?(?:candidate|potential))/i.test(r);return i||s}function nt(n){return n.split(/(?:[。!?;;,,]|\b(?:but|however|yet|nevertheless|nonetheless)\b|但是|但|然而|却|不过|可是)/i).map(e=>e.trim()).filter(Boolean)}function M(n,e){if(!n||n.length>4096)return {degradationReason:"transcript_path_missing"};let t;try{let o=lstatSync(n);if(!o.isFile()||o.isSymbolicLink())return {degradationReason:"transcript_path_unsafe"};t=openSync(n,constants.O_RDONLY|(constants.O_NOFOLLOW??0));let r=fstatSync(t);if(!r.isFile()||r.dev!==o.dev||r.ino!==o.ino)return {degradationReason:"transcript_path_changed"};let i=Math.min(r.size,We),s=Buffer.alloc(i),a=0;for(;a<i;){let f=readSync(t,s,a,i-a,r.size-i+a);if(f===0)break;a+=f;}let c=s.subarray(0,a).toString("utf8");r.size>i&&(c=c.slice(Math.max(0,c.indexOf(`
9
+ `)+1)));let u=c.split(/\r?\n/).slice(-Be),d=e.length>0?Math.min(...e.map(f=>f.promptedAt)):0,l=rt(u,d),y=[...l].reverse().find(f=>ot(f.text,e))??l.at(-1);return y?.text?{answer:y.text,fingerprint:y.fingerprint}:{degradationReason:"transcript_answer_unavailable"}}catch{return {degradationReason:"transcript_unreadable"}}finally{t!==void 0&&closeSync(t);}}function ot(n,e){let t=new Set(e.flatMap(r=>r.contract.requiredSections)),o=ce(ae(n.split(/\r?\n/u)).headingLines);return [...t].every(r=>o.found.has(r))}function O(n){return M(n,[]).answer}function rt(n,e){let t=[];for(let o=0;o<n.length;o++){let r=n[o];if(r.trim())try{let i=JSON.parse(r),s=i.message;if(!s||typeof s!="object"||s.role!=="assistant")continue;let a=s,c=it(i.timestamp);if(c>0&&c+5e3<e)continue;let u=s.content,d=typeof u=="string"?u:Array.isArray(u)?u.filter(l=>l&&typeof l=="object"&&l.type==="text").map(l=>l.text).filter(l=>typeof l=="string").join(`
10
+ `):"";if(d.trim()){let l=d.trim(),m=typeof a.id=="string"&&a.id?`message:${a.id}`:typeof i.uuid=="string"&&i.uuid?`uuid:${i.uuid}`:`record:${String(i.timestamp??"")}:${o}:${createHash("sha256").update(r).digest("hex")}`,y=createHash("sha256").update(l).digest("hex"),f=createHash("sha256").update(`${m}\0${y}`).digest("hex");t.push({text:l,timestamp:c,fingerprint:f});}}catch{continue}}return t}function it(n){if(typeof n=="number"&&Number.isFinite(n))return n;if(typeof n!="string")return 0;let e=Date.parse(n);return Number.isFinite(e)?e:0}function ce(n){let e=new Set,t=new Map,o;for(let r=0;r<n.length;r++){let i=n[r].trim().replace(/^#{1,6}\s*/,"").replace(/^\*\*(.*)\*\*$/,"$1").replace(/^(?:[一二三123][、..]\s*)/,"").replace(/[::]\s*$/,"").trim(),s=Ge.find(a=>i===a);s&&(o=s,e.add(s)),t.set(r,o);}return {found:e,byLine:t}}var de={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:["memory_decided","memory_quarantined"],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 $(n){let e=openGlobalDevFlowDatabase(void 0,{busyTimeoutMs:250});try{let t=e.getLatestTerminalTransition(n.artifact.projectRoot,n.artifact.sessionId,n.artifact.turnId);if(!t)throw new Error(`TERMINAL_INTENT_STATE_MISSING:${n.artifact.turnId}`);let o=n.memoryStatus==="pending"?n.retryOwned?"closed_with_retry_work":"closed_with_degradation":"closed";for(let r of ct(t.toState,o,n.memoryStatus)){let i=t.sequence+1,s=`terminal:${createHash("sha256").update(`${n.artifact.artifactHash}\0${i}\0${r}`).digest("hex").slice(0,24)}`;t=e.appendTerminalTransition({projectRoot:n.artifact.projectRoot,projectId:n.artifact.projectId,hostId:n.artifact.hostId,sessionId:n.artifact.sessionId,turnId:n.artifact.turnId,requestId:n.artifact.requestId,executionId:n.artifact.executionId,sequence:i,fromState:t.toState,toState:r,receiptId:s,sourceReceiptId:n.memoryReceiptId??t.receiptId,reason:dt(r,n),payload:{memoryStatus:n.memoryStatus,retryOwned:n.retryOwned??!1,sourceIntentHash:n.artifact.artifactHash},createdAt:Date.now()}),emitSemanticControlLog({event:"terminal.state.transitioned",identity:{projectRoot:n.artifact.projectRoot,projectId:n.artifact.projectId,hostId:n.artifact.hostId,sessionId:n.artifact.sessionId,turnId:n.artifact.turnId,requestId:n.artifact.requestId,...n.artifact.executionId?{executionId:n.artifact.executionId}:{}},level:r==="closed"?"info":r.includes("degradation")||r.includes("retry")?"warn":"info",timestamp:Date.now(),data:{fromState:t.fromState,nextState:r,receiptId:s,reason:t.reason}});}return t}finally{e.close();}}function ct(n,e,t){if(n===e||de[n].length===0)return [];let o=t==="pending"?["context_degraded","action_not_required","action_degraded","memory_quarantined",e]:["context_degraded","action_not_required","action_degraded","memory_decided",e],r=[],i=n;for(let s of o)i!==s&&de[i].includes(s)&&(r.push(s),i=s);if(i!==e)throw new Error(`TERMINAL_PATH_UNAVAILABLE:${n}->${e}`);return r}function dt(n,e){return n==="context_degraded"?"terminal_reconciliation_without_context_transition":n==="action_not_required"?"no_outstanding_canonical_action_receipt":n==="memory_decided"?`canonical_memory_${e.memoryStatus}`:n==="memory_quarantined"?e.reason:n==="closed_with_retry_work"?"durable_retry_owner_confirmed":n==="closed_with_degradation"?"terminal_obligation_unowned":e.reason}function le(n){let e={committed:0,skipped:0,pending:0},t=[];for(let o of n)e[o.status]+=1,o.receiptId&&t.push(o.receiptId);return {memoryReceiptIds:[...new Set(t)],missingMemoryDecisionCount:e.pending,memoryTurnOutcomes:e}}function mt(n){return (n instanceof Error?n.message:String(n)).trim().slice(0,240)||"memory_lifecycle_unavailable"}function pt(n,e=I(),t=true,o,r=true){let i;try{i=JSON.parse(n);}catch{return null}let s=i.session_id?.trim();if(!s)return null;let a=`session-close:${createHash("sha256").update(`${e}\0${s}`).digest("hex").slice(0,24)}`,c={inputJson:n,sessionId:s,cleanupSharedState:t,executionId:o},u;try{u=openGlobalDevFlowDatabase(void 0,{busyTimeoutMs:50});let d=u.requestSessionClosure({receiptId:a,projectRoot:e,sessionId:s,payload:c}),l=u.getWorkByIdempotencyKey(a),m={status:d.state==="closed"||d.state==="closed_with_pending_work"?"completed":"accepted",receiptId:a,workState:l?.state??"pending",closureState:d.state,pendingWorkCount:d.pendingWorkCount,...l?.id?{workItemId:l.id}:{}};return emitSemanticControlLog({event:"hook.session_end.completed",identity:{projectRoot:e,sessionId:s,executionId:o,terminalReceipt:a},level:m.status==="completed"?"info":"debug",timestamp:Date.now(),data:{stage:"enqueue",...m}}),m}catch(d){if(!r)throw d;return ne(e,{receiptId:a,...c}),emitSemanticControlLog({event:"hook.session_end.degraded",identity:{projectRoot:e,sessionId:s,executionId:o,terminalReceipt:a},level:"warn",timestamp:Date.now(),data:{stage:"enqueue",reason:mt(d),fallback:"durable_spool"}}),{status:"accepted",receiptId:a,workState:"spooled",closureState:"closing",pendingWorkCount:1}}finally{u?.close();}}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 e="";process.stdin.setEncoding("utf8"),process.stdin.on("data",t=>{e+=t;}),process.stdin.on("end",async()=>{let t=pt(e.trim()||process.argv[2]||"");t&&n(JSON.stringify(t)),process.exit(0);}),process.stdin.on("error",()=>process.exit(0)),setTimeout(()=>process.exit(0),1e4).unref();}var x=1,It="memory-snapshot-v1.json",_t=512*1024,fe=256*1024,ge=2e3,St=500,wt=10,Rt=240,kt=300*1e3,xt=720*60*60*1e3,Et=2147483647;function At(n){return n.currentUid===void 0?{ownerSafe:true,modeSafe:true}:{ownerSafe:n.ownerUid===n.currentUid,modeSafe:(n.mode&18)===0}}function v(n){return resolve(n)}function S(n){return createHash("sha256").update(v(n)).digest("hex").slice(0,16)}function Ct(n,e={}){let t=S(n),o=e.stateRoot?join(e.stateRoot,t):getProjectStateDir(v(n));return join(o,It)}function Tt(n,e){let o=(n instanceof Error?n.message:"").replace(/[\r\n\t]+/gu," ").trim().slice(0,160);return o?`${e}:${o}`:e}function j(n,e){return Array.isArray(n)&&n.length<=e&&n.every(t=>typeof t=="string"&&t.length>0&&t.length<=512)}function Dt(n){if(!n||typeof n!="object"||Array.isArray(n))return false;let e=n;return typeof e.id=="string"&&e.id.length>0&&e.id.length<=512&&typeof e.kind=="string"&&e.kind.length>0&&e.kind.length<=128&&(e.family===void 0||typeof e.family=="string"&&e.family.length>0&&e.family.length<=256)&&(e.entity===void 0||typeof e.entity=="string"&&e.entity.length>0&&e.entity.length<=256)&&j(e.memoryIds,100)&&(e.status==="withheld"||e.status==="resolved")&&(e.summary===void 0||typeof e.summary=="string"&&e.summary.length<=2e3)}function Mt(n){if(!n||typeof n!="object"||Array.isArray(n))return false;let e=n;return typeof e.reason=="string"&&e.reason.length>0&&e.reason.length<=512&&(e.stale===void 0||typeof e.stale=="boolean")}function ye(n,e,t){if(!n||typeof n!="object"||Array.isArray(n))return null;let o=n,r=v(e),i=S(r),s=o.generation===void 0?0:o.generation;return o.version!==x||o.projectRoot!==r||o.projectHash!==i||typeof o.markdown!="string"||Buffer.byteLength(o.markdown,"utf8")>fe||!j(o.memoryIds,ge)||!Array.isArray(o.conflicts)||o.conflicts.length>St||!o.conflicts.every(Dt)||typeof o.generatedAt!="number"||!Number.isFinite(o.generatedAt)||o.generatedAt<0||o.generatedAt>t+kt||!Number.isInteger(s)||s<0||s>Et||!["ready","pending","degraded","disabled"].includes(String(o.status))||o.degradation!==void 0&&!Mt(o.degradation)?null:{...o,generation:s}}function Ot(n,e,t,o,r=0){let i=v(n);return {version:x,projectRoot:i,projectHash:S(i),markdown:"",memoryIds:[],conflicts:[],generatedAt:o,generation:r,status:e,degradation:{reason:t}}}function $t(n,e={}){let t=e.now??Date.now(),o=Ct(n,e),r;try{r=openSync(o,constants.O_RDONLY|constants.O_NOFOLLOW);let i=fstatSync(r);if(!i.isFile()||i.size<=0||i.size>_t)throw new Error("cache_size_invalid");let s=At({...typeof process.getuid=="function"?{currentUid:process.getuid()}:{},ownerUid:i.uid,mode:i.mode});if(!s.ownerSafe)throw new Error("cache_owner_invalid");if(!s.modeSafe)throw new Error("cache_permissions_unsafe");let a=JSON.parse(readFileSync(r,"utf8")),c=ye(a,n,t);if(!c)throw new Error("cache_schema_invalid");return c.status==="ready"&&t-c.generatedAt>xt?{snapshot:{...c,status:"degraded",degradation:{reason:"cache_stale",stale:!0}},source:"cache",valid:!0,stale:!0}:{snapshot:c,source:"cache",valid:!0,stale:!1}}catch(i){let a=i.code==="ENOENT";return {snapshot:Ot(n,a?"pending":"degraded",a?"cache_missing":Tt(i,"cache_invalid"),t),source:"none",valid:false,stale:false}}finally{if(r!==void 0)try{closeSync(r);}catch{}}}function Pt(n){if(!n)return true;try{return JSON.parse(readFileSync(n,"utf8")).sessionStart?.injectMemories??!0}catch{return true}}function jt(n,e,t){if(!e.trim())return null;try{let o=JSON.parse(e);if(o.status!=="ok"&&o.status!=="degraded")return null;if(o.enabled===!1){let i=v(n);return {version:x,projectRoot:i,projectHash:S(i),markdown:"",memoryIds:[],conflicts:[],generatedAt:t,generation:0,status:"disabled"}}let r=ye(o.snapshot,n,t);if(r)return r;if(o.status==="ok"&&typeof o.markdown=="string"&&o.markdown.length>0&&Buffer.byteLength(o.markdown,"utf8")<=fe){let i=v(n);return {version:x,projectRoot:i,projectHash:S(i),markdown:o.markdown,memoryIds:j(o.memoryIds,ge)?o.memoryIds:[],conflicts:[],generatedAt:t,generation:0,status:"ready"}}}catch{}return null}function P(n,e){return [...(n??e).replace(/[\r\n\t|]+/gu," ").trim()||e].slice(0,Rt).join("")}function Ft(n){if(n.length===0)return "";let e=n.slice(0,wt),t=e.map(o=>{let r=P(o.family,"unknown"),i=P(o.entity,"unknown"),s=P(o.summary,"Explicit choice required.");return `- family=${r}; entity=${i}; status=${o.status}; summary=${s}`});return n.length>e.length&&t.push(`- ${n.length-e.length} additional conflict(s) omitted from SessionStart output.`),`## Withheld preference conflicts (${n.length})
11
+ ${t.join(`
12
+ `)}`}function Nt(n){let e=n.now??Date.now();if(Pt(n.configPath)===false)return "";let t=jt(n.projectRoot,n.daemonResponse??"",e),o=t?{snapshot:t,source:"daemon"}:$t(n.projectRoot,{...n.cacheOptions,now:e}),{snapshot:r}=o;if(r.status==="disabled")return `## Project memory
13
+ DevFlow memory snapshot=pending; source=${o.source}; reason=previous_snapshot_disabled. Memory availability is not yet known; do not conclude that the project has no memories.`;let i=new Date(r.generatedAt).toISOString(),s=r.degradation?.reason?`; reason=${r.degradation.reason}`:"",a=`DevFlow memory snapshot=${r.status}; source=${o.source}; generatedAt=${i}${s}.`,c=Ft(r.conflicts);return r.markdown?[r.markdown,c,a].filter(Boolean).join(`
14
14
  `):["## Project memory",c,`${a} Memory availability is not yet known; do not conclude that the project has no memories.`].filter(Boolean).join(`
15
- `)}if(process.env.DEVFLOW_MEMORY_SNAPSHOT_CLI==="1"){let[,,t,e,n]=process.argv;t!=="session-start"||!e?process.exitCode=2:process.stdout.write(jt({projectRoot:e,configPath:n,daemonResponse:process.env.DEVFLOW_MEMORY_RESPONSE}));}function ge(t){return `DevFlow memory decision required for ${t.turnId}. Before the final response, semantically decide whether this turn contains durable project knowledge. Call mcp__devflow__memory_commit_turn with evidence-bound candidates, or mcp__devflow__memory_skip_turn with a concrete reason. Do not claim memory success without a canonical receipt. For candidates, copy exact evidenceSpans from this user prompt, preserve package names, flags, versions, paths, and identifiers, and provide subject, predicate, value, polarity, and entities when known. Do not save assistant echoes, task narration, retries, or unverified guesses. Express a change from an old choice as the new durable value. If the decision tool remains unavailable, explicitly state that the memory was not saved.`}function ye(t){let e=re({projectRoot:t.projectRoot,sessionId:t.sessionId,transcriptPath:t.transcriptPath,runtimeStore:t.runtimeStore}),n=openGlobalDevFlowDatabase(void 0,{busyTimeoutMs:50});try{qt(t.runtimeStore,t.sessionId,n);let r=n.getPendingMemoryTurn(t.projectRoot,t.sessionId),o=r?n.markMemoryTurnStopPrompted(r.turnId):!1,i=[];e&&i.push(e.reason),r&&o&&i.push(ge(r)),r&&!o&&Nt(n,r.turnId)&&Lt(M(t.transcriptPath))&&i.push(`DevFlow explicit memory ${r.turnId} still has no canonical receipt. Remove the memory-success claim and tell the user that the memory was not saved, or complete the pending turn.`);let a=n.listSessionObligations(t.projectRoot,t.sessionId,["open"]).map(c=>({obligationId:c.obligationId,kind:c.kind,action:c.kind==="memory_decision"?"Call mcp__devflow__memory_decide_turn using the canonical turn ID.":c.kind==="evidence_contract"?c.payload.subtype==="policy_verification"?`Complete the required project verification: ${String(c.payload.command??c.payload.verificationKind??"unknown command")}.`:"Return a final answer that satisfies the canonical evidence contract.":"Allow SessionEnd durable finalization to complete.",canonicalInput:c.kind==="memory_decision"&&c.turnId?{turnId:c.turnId}:void 0}));return i.length>0?{decision:"block_once",unresolved:a,additionalContext:["DevFlow has unresolved terminal obligations. Complete all actions below before stopping.",...i].join(`
15
+ `)}if(process.env.DEVFLOW_MEMORY_SNAPSHOT_CLI==="1"){let[,,n,e,t]=process.argv;n!=="session-start"||!e?process.exitCode=2:process.stdout.write(Nt({projectRoot:e,configPath:t,daemonResponse:process.env.DEVFLOW_MEMORY_RESPONSE}));}function he(n){return `DevFlow memory decision required for ${n.turnId}. Before the final response, semantically decide whether this turn contains durable project knowledge. Call mcp__devflow__memory_commit_turn with evidence-bound candidates, or mcp__devflow__memory_skip_turn with a concrete reason. Do not claim memory success without a canonical receipt. For candidates, copy exact evidenceSpans from this user prompt, preserve package names, flags, versions, paths, and identifiers, and provide subject, predicate, value, polarity, and entities when known. Do not save assistant echoes, task narration, retries, or unverified guesses. Express a change from an old choice as the new durable value. If the decision tool remains unavailable, explicitly state that the memory was not saved.`}function be(n){let e=ie({projectRoot:n.projectRoot,sessionId:n.sessionId,transcriptPath:n.transcriptPath,runtimeStore:n.runtimeStore}),t=openGlobalDevFlowDatabase(void 0,{busyTimeoutMs:50});try{zt(n.runtimeStore,n.sessionId,t);let o=t.getPendingMemoryTurn(n.projectRoot,n.sessionId),r=o?t.markMemoryTurnStopPrompted(o.turnId):!1,i=[];e&&i.push(e.reason),o&&r&&i.push(he(o)),o&&!r&&Ht(t,o.turnId)&&Ut(O(n.transcriptPath))&&i.push(`DevFlow explicit memory ${o.turnId} still has no canonical receipt. Remove the memory-success claim and tell the user that the memory was not saved, or complete the pending turn.`);let a=t.listSessionObligations(n.projectRoot,n.sessionId,["open"]).map(c=>({obligationId:c.obligationId,kind:c.kind,action:c.kind==="memory_decision"?"Call mcp__devflow__memory_decide_turn using the canonical turn ID.":c.kind==="evidence_contract"?c.payload.subtype==="policy_verification"?`Complete the required project verification: ${String(c.payload.command??c.payload.verificationKind??"unknown command")}.`:"Return a final answer that satisfies the canonical evidence contract.":"Allow SessionEnd durable finalization to complete.",canonicalInput:c.kind==="memory_decision"&&c.turnId?{turnId:c.turnId}:void 0}));return i.length>0?{decision:"block_once",unresolved:a,additionalContext:["DevFlow has unresolved terminal obligations. Complete all actions below before stopping.",...i].join(`
16
16
 
17
- `)}:a.length>0?{decision:"degrade",unresolved:a,additionalContext:"DevFlow terminal obligations remain unresolved after their one-shot correction budget."}:{decision:"allow",unresolved:[]}}finally{n.close();}}function Nt(t,e){return !!t.getWorkByIdempotencyKey(`memory-turn:commit_explicit:${e}`)}function Lt(t){if(!t)return false;let e=t.normalize("NFKC").replace(/\s+/gu," ");return /(?:未|没有|无法|失败|暂未|尚未).{0,24}(?:记住|记下|记录|保存|持久化|回执)|(?:memory|receipt).{0,24}(?:failed|missing|pending|degraded|not saved)|status=(?:pending|degraded|rejected|failed)/iu.test(e)?false:/(?:已|已经|成功).{0,20}(?:记住|记下|记录|保存|持久化)|跨会话生效|(?:memory|preference).{0,20}(?:saved|remembered|persisted)|status=(?:accepted|committed)/iu.test(e)}function qt(t,e,n){let r=t.get(e);if(r){for(let o of r.evidenceObligations)n.upsertSessionObligation({obligationId:`evidence:${o.obligationId}`,projectRoot:r.projectRoot,sessionId:e,executionId:r.executionId,kind:"evidence_contract",state:"open",payload:{contract:o.contract,runtimeObligationId:o.obligationId},createdAt:o.promptedAt,updatedAt:r.lastActivityAt});for(let o of r.evidenceOutcomes){let i=`evidence:${o.obligationId}`,s=n.getSessionObligation(r.projectRoot,e,i);!s||s.state!=="open"||n.resolveSessionObligation({projectRoot:r.projectRoot,sessionId:e,obligationId:i,state:o.status==="resolved"?"satisfied":"degraded",reason:o.reason,resolvedAt:o.completedAt});}}}async function zt(t,e=_()){let n;try{n=JSON.parse(t);}catch{return null}let r=n.session_id?.trim();if(!r)return null;let o=new h(e),i=ye({projectRoot:e,sessionId:r,transcriptPath:n.transcript_path,stopHookActive:n.stop_hook_active===true,runtimeStore:o});if(i.decision==="block_once")return emitSemanticControlLog({event:"hook.stop.degraded",identity:{projectRoot:e,sessionId:r},level:"warn",timestamp:Date.now(),data:{decision:"block_once",unresolved:i.unresolved.map(a=>a.obligationId)}}),{decision:"block",reason:i.additionalContext};let s=o.completeExecution(r);if(s?.executionId){let a=openGlobalDevFlowDatabase();try{let c=a.listSessionMemoryTurnsForReconciliation(e,r),l=new Map(a.listLatestTaskIntentArtifacts(e,r).map(d=>[d.turnId,d]));for(let d of c){let u=l.get(d.turnId);!u||d.status==="pending"||D({artifact:u,memoryStatus:d.status,memoryReceiptId:d.receiptId,reason:"stop_obligations_satisfied"});}a.reconcileSkillExecution(s.executionId,"completed",Date.now(),{...ce(c),evidenceDegradations:s.evidenceDegradations,evidenceContractOutcomes:s.evidenceOutcomes,unresolvedObligations:i.unresolved,terminalState:i.decision}),a.deleteContextReceipt(e,r,s.executionId);}finally{a.close();}}return k(`/api/telemetry/sessions/${encodeURIComponent(r)}/tick`,{timestamp:Date.now()},{fallbackReason:"stop_tick_already_local"}),emitSemanticControlLog({event:"hook.stop.completed",identity:{projectRoot:e,sessionId:r,executionId:s?.executionId},level:"info",timestamp:Date.now(),data:{decision:i.decision,unresolvedCount:i.unresolved.length}}),null}if(process.argv[1]?.endsWith("stop")||process.argv[1]?.endsWith("stop.js")){let t=console.log.bind(console);console.log=console.error.bind(console),console.info=console.error.bind(console);let e="";process.stdin.setEncoding("utf8"),process.stdin.on("data",n=>{e+=n;}),process.stdin.on("end",async()=>{let n=await zt(e.trim()||process.argv[2]||"");n&&t(JSON.stringify(n)),process.exit(0);}),process.stdin.on("error",()=>process.exit(0)),setTimeout(()=>process.exit(0),4e3).unref();}export{zt as handleStop};
17
+ `)}:a.length>0?{decision:"degrade",unresolved:a,additionalContext:"DevFlow terminal obligations remain unresolved after their one-shot correction budget."}:{decision:"allow",unresolved:[]}}finally{t.close();}}function Ht(n,e){return !!n.getWorkByIdempotencyKey(`memory-turn:commit_explicit:${e}`)}function Ut(n){if(!n)return false;let e=n.normalize("NFKC").replace(/\s+/gu," ");return /(?:未|没有|无法|失败|暂未|尚未).{0,24}(?:记住|记下|记录|保存|持久化|回执)|(?:memory|receipt).{0,24}(?:failed|missing|pending|degraded|not saved)|status=(?:pending|degraded|rejected|failed)/iu.test(e)?false:/(?:已|已经|成功).{0,20}(?:记住|记下|记录|保存|持久化)|跨会话生效|(?:memory|preference).{0,20}(?:saved|remembered|persisted)|status=(?:accepted|committed)/iu.test(e)}function zt(n,e,t){let o=n.get(e);if(o){for(let r of o.evidenceObligations)t.upsertSessionObligation({obligationId:`evidence:${r.obligationId}`,projectRoot:o.projectRoot,sessionId:e,executionId:o.executionId,kind:"evidence_contract",state:"open",payload:{contract:r.contract,runtimeObligationId:r.obligationId},createdAt:r.promptedAt,updatedAt:o.lastActivityAt});for(let r of o.evidenceOutcomes){let i=`evidence:${r.obligationId}`,s=t.getSessionObligation(o.projectRoot,e,i);if(!s||s.state!=="open"&&!(s.state==="degraded"&&r.status==="resolved"))continue;let a=r.status==="resolved"?`evidence-receipt:${createHash("sha256").update(`${r.obligationId}\0${r.completedAt}\0${r.attempt}`).digest("hex").slice(0,24)}`:void 0;t.resolveSessionObligation({projectRoot:o.projectRoot,sessionId:e,obligationId:i,state:r.status==="resolved"?"satisfied":"degraded",receiptId:a,reason:r.reason,resolvedAt:r.completedAt});}}}async function Wt(n,e=I()){let t;try{t=JSON.parse(n);}catch{return null}let o=t.session_id?.trim();if(!o)return null;let r=new h(e),i=be({projectRoot:e,sessionId:o,transcriptPath:t.transcript_path,stopHookActive:t.stop_hook_active===true,runtimeStore:r});if(i.decision==="block_once")return emitSemanticControlLog({event:"hook.stop.degraded",identity:{projectRoot:e,sessionId:o},level:"warn",timestamp:Date.now(),data:{decision:"block_once",unresolved:i.unresolved.map(a=>a.obligationId)}}),{decision:"block",reason:i.additionalContext};let s=r.completeExecution(o);if(s?.executionId){let a=openGlobalDevFlowDatabase();try{let c=a.listSessionMemoryTurnsForReconciliation(e,o),u=new Map(a.listLatestTaskIntentArtifacts(e,o).map(d=>[d.turnId,d]));for(let d of c){let l=u.get(d.turnId);!l||d.status==="pending"||$({artifact:l,memoryStatus:d.status,memoryReceiptId:d.receiptId,reason:"stop_obligations_satisfied"});}a.reconcileSkillExecution(s.executionId,"completed",Date.now(),{...le(c),evidenceDegradations:s.evidenceDegradations,evidenceContractOutcomes:s.evidenceOutcomes,unresolvedObligations:i.unresolved,terminalState:i.decision}),a.deleteContextReceipt(e,o,s.executionId);}finally{a.close();}}return R(`/api/telemetry/sessions/${encodeURIComponent(o)}/tick`,{timestamp:Date.now()},{fallbackReason:"stop_tick_already_local"}),emitSemanticControlLog({event:"hook.stop.completed",identity:{projectRoot:e,sessionId:o,executionId:s?.executionId},level:"info",timestamp:Date.now(),data:{decision:i.decision,unresolvedCount:i.unresolved.length}}),null}if(process.argv[1]?.endsWith("stop")||process.argv[1]?.endsWith("stop.js")){let n=console.log.bind(console);console.log=console.error.bind(console),console.info=console.error.bind(console);let e="";process.stdin.setEncoding("utf8"),process.stdin.on("data",t=>{e+=t;}),process.stdin.on("end",async()=>{let t=await Wt(e.trim()||process.argv[2]||"");t&&n(JSON.stringify(t)),process.exit(0);}),process.stdin.on("error",()=>process.exit(0)),setTimeout(()=>process.exit(0),4e3).unref();}export{Wt as handleStop};
@@ -1,15 +1,10 @@
1
- import {MemoryGate}from'@devflow-tools/memory-engine';import {openGlobalDevFlowDatabase}from'@devflow-tools/database';import {existsSync,readFileSync as readFileSync$1,rmSync,mkdirSync,writeFileSync,linkSync,readdirSync,renameSync,unlinkSync}from'fs';import {join as join$1,dirname}from'path';import {randomUUID,createHash}from'crypto';import {getLocalApiKey,resolveProjectCapabilityProfile,resolveCapabilityRollout,claudeCodeRuntimeAdapter,loadConfig,formatSkillRuntimeOverlay,createSkillRuntimeOverlay,getProjectStateDir,resolveRuntimeEndpoint,acquireRuntimeHttpCircuit,registerRuntimeHttpSuccess,registerRuntimeHttpFailure}from'@devflow-tools/sdk';import {fileURLToPath}from'url';import {emitSemanticControlLog}from'@devflow-tools/telemetry';import {homedir as homedir$1}from'os';import {request}from'node:http';import {readFileSync,openSync,constants,fstatSync,closeSync,mkdirSync as mkdirSync$1,writeFileSync as writeFileSync$1,renameSync as renameSync$1,realpathSync,existsSync as existsSync$1,appendFileSync,chmodSync,fsyncSync,rmSync as rmSync$1,unlinkSync as unlinkSync$1,lstatSync}from'node:fs';import {join,resolve,dirname as dirname$1,isAbsolute,basename}from'node:path';import {homedir}from'node:os';import {createHash as createHash$1,randomUUID as randomUUID$1}from'node:crypto';import {buildRetrievalTaskPlan,parseIntent,buildChannelQueryPlan}from'@devflow-tools/context-engine';function h(e,t,n){try{let r=openGlobalDevFlowDatabase();try{r.insertEvent({kind:e,timestamp:Date.now(),duration:n,success:t.success!==!1,metadata:t});}finally{r.close();}}catch{}}var ie="WARNING: DevFlow is in degraded mode (daemon unreachable): 4-Gate enforcement and memory prefetch cache are unavailable. Run `devflow doctor` for details.";function se(){return process.env.DEVFLOW_HOOK_DEGRADED==="1"}function pt(e){return e??process.env.CLAUDE_PROJECT_DIR??process.cwd()}function R(e){return process.env.DEVFLOW_STATE_DIR??getProjectStateDir(pt(e))}function le(e){return Buffer.from(e,"utf8").toString("base64url")}function ht(e,t,n){let r=t?.trim();if(r){let o=/^[a-zA-Z0-9:._-]{1,192}$/.test(r)?r:`tool-${createHash("sha256").update(r.slice(0,1024)).digest("hex").slice(0,32)}`;return `${e}:${o}`}return `${e}:legacy-${n}-${randomUUID().slice(0,8)}`}function ye(e){return `${e}:legacy-journal`}var D=class{constructor(t){this.projectRoot=t;this.sessions=new Map;this.sessionsDir=join$1(R(t),"hook-sessions");}registerSession(t){let n=t.trim();if(!n)throw new Error("session_id_required");let r=this.get(n);if(r)return r.lastActivityAt=Date.now(),this.persist(r),r;let o=Date.now(),i={sessionId:n,projectRoot:this.projectRoot,requiredMcpTools:[],evidenceObligations:[],evidenceDegradations:[],evidenceOutcomes:[],startedAt:o,lastActivityAt:o};return this.sessions.set(n,i),this.persist(i),i}startExecution(t,n,r){let o=this.registerSession(t);return (!o.executionId||o.skillName!==n)&&(o.executionId=`exec_${Date.now()}_${randomUUID().slice(0,8)}`),o.skillName=n,o.requiredMcpTools=[...new Set(r)],o.lastActivityAt=Date.now(),this.persist(o),o}bindTaskIdentity(t,n){let r=this.registerSession(t);return r.activeTurnId=n.turnId,r.activeRequestId=n.requestId,r.intentArtifactHash=n.intentArtifactHash,r.lastActivityAt=Date.now(),this.persist(r),r}get(t){let n=t.trim();if(!n)return null;let r=this.sessions.get(n);if(r)return this.replayEvidenceJournal(r),r;let o=this.snapshotPath(n);if(!existsSync(o))return null;try{let i=JSON.parse(readFileSync$1(o,"utf8"));return i.sessionId!==n||i.projectRoot!==this.projectRoot?null:(i.requiredMcpTools=Array.isArray(i.requiredMcpTools)?i.requiredMcpTools:[],i.evidenceObligations=ue(i.evidenceObligations),i.evidenceDegradations=me(i.evidenceDegradations),i.evidenceOutcomes=pe(i.evidenceOutcomes),this.replayEvidenceJournal(i),this.sessions.set(n,i),i)}catch{return null}}completeExecution(t){let n=this.get(t);if(!n)return null;let r=structuredClone(n);return delete n.executionId,delete n.skillName,n.requiredMcpTools=[],n.lastActivityAt=Date.now(),this.persist(n),r}addEvidenceObligation(t,n,r=Date.now(),o){let i=this.registerSession(t),a=(o?void 0:i.evidenceObligations.find(u=>u.contractId===n.id))?.obligationId??ht(n.id,o,r);this.appendEvidenceEvent(t,{kind:"add",obligationId:a,contractId:n.id,at:r,contract:n},`add\0${a}`),this.replayEvidenceJournal(i);let c=i.evidenceObligations.find(u=>u.obligationId===a);return c?(i.lastActivityAt=Date.now(),this.persist(i),structuredClone(c)):null}listEvidenceObligations(t){return (this.get(t)?.evidenceObligations??[]).map(n=>structuredClone(n))}markEvidenceCorrection(t,n,r,o,i=Date.now()){let s=this.get(t),a=s?.evidenceObligations.find(l=>l.obligationId===n);if(!s||!a)return null;let c=/^[a-f0-9]{64}$/.test(o)?o:"";if(!c)return null;this.appendEvidenceEvent(t,{kind:"correction",obligationId:n,contractId:a.contractId,at:i,fingerprint:c,violations:r.slice(0,16).map(l=>l.slice(0,240))},`correction\0${n}\0${c}`),this.replayEvidenceJournal(s),s.lastActivityAt=i,this.persist(s);let u=s.evidenceObligations.find(l=>l.obligationId===n);return u?structuredClone(u):null}resolveEvidenceObligation(t,n){let r=this.get(t);if(!r)return false;let o=r.evidenceObligations.find(s=>s.obligationId===n);if(!o)return false;let i=Date.now();return this.appendEvidenceEvent(t,{kind:"resolve",obligationId:n,contractId:o.contractId,at:i},`resolve\0${n}`),this.replayEvidenceJournal(r),r.lastActivityAt=i,this.persist(r),true}degradeEvidenceObligation(t,n,r,o=Date.now()){let i=this.get(t),s=i?.evidenceObligations.find(c=>c.obligationId===n);if(!i||!s)return false;let a=r.slice(0,240);return this.appendEvidenceEvent(t,{kind:"degrade",obligationId:n,contractId:s.contractId,at:o,reason:a},`degrade\0${n}\0${a}`),this.replayEvidenceJournal(i),i.lastActivityAt=o,this.persist(i),true}removeSession(t){let n=t.trim();n&&(this.sessions.delete(n),rmSync(this.snapshotPath(n),{force:true}),rmSync(this.evidenceJournalDir(n),{recursive:true,force:true}));}list(){return [...this.sessions.values()]}snapshotPath(t){return join$1(this.sessionsDir,`${le(t)}.json`)}evidenceJournalDir(t){return join$1(this.sessionsDir,"evidence-journal",le(t))}appendEvidenceEvent(t,n,r){let o=this.evidenceJournalDir(t);mkdirSync(o,{recursive:true,mode:448});let i=createHash("sha256").update(r).digest("hex"),s=join$1(o,`${n.kind}-${i}.json`);if(existsSync(s))return;let a=join$1(o,`.${process.pid}.${randomUUID()}.tmp`);writeFileSync(a,JSON.stringify(n),{mode:384});try{linkSync(a,s);}catch(c){if(c.code!=="EEXIST")throw c}finally{rmSync(a,{force:true});}}replayEvidenceJournal(t){t.evidenceObligations=ue(t.evidenceObligations),t.evidenceDegradations=me(t.evidenceDegradations),t.evidenceOutcomes=pe(t.evidenceOutcomes);let n=this.evidenceJournalDir(t.sessionId);if(!existsSync(n))return;let r;try{r=readdirSync(n).filter(i=>/^(?:add|correction|resolve|degrade)-[a-f0-9]{64}\.json$/.test(i)).slice(0,4096);}catch{return}let o=r.flatMap(i=>{try{let s=readFileSync$1(join$1(n,i),"utf8");if(Buffer.byteLength(s,"utf8")>64*1024)return [];let a=vt(JSON.parse(s));return a?[a]:[]}catch{return []}}).sort((i,s)=>i.at-s.at||ge(i.kind)-ge(s.kind));for(let i of o)this.applyEvidenceEvent(t,i);t.evidenceObligations=t.evidenceObligations.slice(-8),t.evidenceDegradations=t.evidenceDegradations.slice(-20),t.evidenceOutcomes=t.evidenceOutcomes.slice(-20);}applyEvidenceEvent(t,n){let r=t.evidenceOutcomes.find(s=>s.obligationId===n.obligationId);if(n.kind==="add"){if(r)return;let s=t.evidenceObligations.find(a=>a.obligationId===n.obligationId);s?(s.contract=n.contract,s.promptedAt=Math.min(s.promptedAt,n.at)):t.evidenceObligations.push({obligationId:n.obligationId,contractId:n.contractId,contract:n.contract,promptedAt:n.at,attempt:0,correctionRequested:false,violations:[]});return}let o=t.evidenceObligations.find(s=>s.obligationId===n.obligationId);if(n.kind==="correction"){if(!o||r||o.correctionFingerprint===n.fingerprint)return;o.attempt+=1,o.correctionRequested=true,o.correctionRequestedAt=n.at,o.correctionFingerprint=n.fingerprint,o.violations=n.violations;return}let i=o?.attempt??0;t.evidenceObligations=t.evidenceObligations.filter(s=>s.obligationId!==n.obligationId),!r&&(n.kind==="degrade"&&t.evidenceDegradations.push({obligationId:n.obligationId,contractId:n.contractId,reason:n.reason,degradedAt:n.at,attempt:i}),t.evidenceOutcomes.push({obligationId:n.obligationId,contractId:n.contractId,status:n.kind==="resolve"?"resolved":"degraded",completedAt:n.at,attempt:i,...n.kind==="degrade"?{reason:n.reason}:{}}));}persist(t){mkdirSync(this.sessionsDir,{recursive:true,mode:448});let n=this.snapshotPath(t.sessionId),r=`${n}.${process.pid}.${randomUUID()}.tmp`;writeFileSync(r,JSON.stringify(t),{mode:384}),renameSync(r,n);}};function ue(e){return Array.isArray(e)?e.flatMap(t=>{if(!t||typeof t!="object")return [];let n=t;if(typeof n.contractId!="string"||n.contractId.length===0||n.contractId.length>128||typeof n.promptedAt!="number"||typeof n.attempt!="number"||typeof n.correctionRequested!="boolean"||!Array.isArray(n.violations)||!he(n.contract))return [];let r=typeof n.obligationId=="string"&&n.obligationId.length>0&&n.obligationId.length<=384?n.obligationId:ye(n.contractId),o=typeof n.correctionTranscriptHash=="string"?n.correctionTranscriptHash:void 0,i=n.correctionFingerprint??o;return i!==void 0&&!/^[a-f0-9]{64}$/.test(i)?[]:[{...n,obligationId:r,correctionFingerprint:i}]}).slice(-8):[]}function me(e){return Array.isArray(e)?e.filter(t=>{if(!t||typeof t!="object")return false;let n=t;return typeof n.obligationId=="string"&&typeof n.contractId=="string"&&typeof n.reason=="string"&&typeof n.degradedAt=="number"&&typeof n.attempt=="number"}).slice(-20):[]}function pe(e){return Array.isArray(e)?e.filter(t=>{if(!t||typeof t!="object")return false;let n=t;return typeof n.obligationId=="string"&&typeof n.contractId=="string"&&(n.status==="resolved"||n.status==="degraded")&&typeof n.completedAt=="number"&&typeof n.attempt=="number"&&(n.reason===void 0||typeof n.reason=="string")}).slice(-20):[]}function vt(e){if(!e||typeof e!="object")return null;let t=e,n=t.kind;if(n!=="add"&&n!=="correction"&&n!=="resolve"&&n!=="degrade"||typeof t.contractId!="string"||t.contractId.length>128||typeof t.at!="number")return null;let o={obligationId:typeof t.obligationId=="string"&&t.obligationId.length>0&&t.obligationId.length<=384?t.obligationId:ye(t.contractId),contractId:t.contractId,at:t.at};if(n==="add")return he(t.contract)?{kind:n,...o,contract:t.contract}:null;if(n==="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:n,...o,fingerprint:i,violations:t.violations}:null}return n==="resolve"?{kind:n,...o}:typeof t.reason=="string"&&t.reason.length<=240?{kind:n,...o,reason:t.reason}:null}function ge(e){return e==="add"?0:e==="correction"?1:2}function he(e){if(!e||typeof e!="object")return false;let t=e,n=t.requiredSections,r=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(n)&&n.length===3&&n[0]==="\u5DE5\u5177\u53D1\u73B0"&&n[1]==="\u6A21\u578B\u5047\u8BBE"&&n[2]==="\u9700\u8981\u8FD0\u884C\u65F6\u9A8C\u8BC1"&&Array.isArray(r)&&r.length<=16&&r.every(o=>typeof o=="string"&&o.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 bt(e){let t=e.trim().replace(/^\//,"");if(!t.startsWith("devflow:"))return null;let n=t.slice(8).replace(/^devflow-/,"");return /^[a-z0-9][a-z0-9-]*$/i.test(n)?`devflow:${n.toLowerCase()}`:null}function ve(e){let t=e.trimStart().match(/^\/(devflow:[a-z0-9][a-z0-9-]*)\b/i);if(!t)return null;let n=bt(t[1]);return n?{rawName:t[1],skillName:n}:null}var _t=2,Rt=1;function Et(){if(process.env.CLAUDE_PLUGIN_ROOT)return process.env.CLAUDE_PLUGIN_ROOT;try{return join$1(dirname(fileURLToPath(import.meta.url)),"..","..")}catch{return process.cwd()}}function be(e=Et()){let t=[join$1(e,"dist","command-registry.json"),join$1(e,"command-registry.json")];for(let n of t)try{if(!existsSync(n))continue;let r=JSON.parse(readFileSync$1(n,"utf8"));if(r.version!==_t&&r.version!==Rt||!xt(r.commands)){emitSemanticControlLog({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:n}});continue}return r.commands}catch(r){emitSemanticControlLog({event:"hook.runtime.degraded",identity:{projectRoot:process.env.CLAUDE_PROJECT_DIR||process.cwd()},level:"warn",timestamp:Date.now(),data:{stage:"command_registry",reason:r.message,fallback:"next_registry_candidate"}});}return null}function xt(e){return !e||typeof e!="object"||Array.isArray(e)?false:Object.values(e).every(t=>{if(!t||typeof t!="object"||Array.isArray(t))return false;let n=t;return M(n.mcpTools)&&M(n.blockedNative)&&(n.source===void 0||n.source==="core"||n.source==="plugin")&&(n.requiresContext===void 0||typeof n.requiresContext=="boolean")&&(n.runtimePackages===void 0||M(n.runtimePackages))&&(n.hostTools===void 0||At(n.hostTools))&&(n.evidenceMode===void 0||["static","runtime","mixed"].includes(n.evidenceMode))})}function At(e){return !!e&&typeof e=="object"&&!Array.isArray(e)&&Object.entries(e).every(([t,n])=>t.length>0&&M(n))}function M(e){return Array.isArray(e)&&e.every(t=>typeof t=="string"&&t.length>0)}function Ie(e){let t=be();return t?t[e]?.mcpTools??[]:[]}function Se(e,t,n){return formatSkillRuntimeOverlay(createSkillRuntimeOverlay(e,t,{prompt:n}))}var Nt=getLocalApiKey(),z=join(homedir(),".devflow","errors");async function Ae(e,t,n={}){let r=n.endpoint??resolveRuntimeEndpoint().url,o=n.timeout??1500,i=n.durableMirror??true,s=n.maxRetries??(i?0:2),a=n.circuitBreaker??true,c=acquireRuntimeHttpCircuit(r,e);if(a&&!c.allowed)return {delivered:false,suppressed:true,fallbackReason:c.state.fallbackReason};let u;for(let d=0;d<=s;d+=1)try{return await Ht(r,e,t,o),a&&registerRuntimeHttpSuccess(r,e).transitioned&&h("http_circuit_transition",{endpoint:r,path:new URL(e,r).pathname,previous:c.state.status,status:"closed",failures:0}),{delivered:!0,suppressed:!1}}catch(p){u=p instanceof Error?p:new Error(String(p)),d<s&&await Ft(Math.min(100*2**d,1e3));}if(!u)return {delivered:false,suppressed:false,fallbackReason:"unknown_http_failure"};if(!a)return Ee(e,u),{delivered:false,suppressed:false,fallbackReason:u.message};let l=registerRuntimeHttpFailure(r,e,n.fallbackReason??(i?"local_durable_mirror":"http_delivery_failed"));return l.transitioned&&(Ee(e,u),h("http_circuit_transition",{endpoint:r,path:new URL(e,r).pathname,previous:c.state.status,status:"open",failures:l.state.failures,openUntil:l.state.openUntil,fallbackReason:l.state.fallbackReason})),{delivered:false,suppressed:false,fallbackReason:l.state.fallbackReason}}function Ht(e,t,n,r){return new Promise((o,i)=>{let s=JSON.stringify(n),a=new URL(t,e),c=false,u=d=>{c||(c=true,d?i(d):o());},l=request({hostname:a.hostname,port:a.port,path:a.pathname+a.search,method:"POST",headers:{"Content-Type":"application/json","X-API-Key":Nt,"Content-Length":Buffer.byteLength(s)},timeout:r},d=>{d.on("error",u),d.on("end",()=>{let p=d.statusCode??0;u(p>=200&&p<300?void 0:new Error(`HTTP ${p}`));}),d.resume();});l.on("error",u),l.on("timeout",()=>l.destroy(new Error(`HTTP mirror timed out after ${r}ms`))),l.write(s),l.end();})}function Ee(e,t){try{existsSync$1(z)||mkdirSync$1(z,{recursive:!0}),appendFileSync(join(z,"http-errors.log"),`${new Date().toISOString()} | ${e} | ${t.message}
2
- `);}catch{}}function Ft(e){return new Promise(t=>setTimeout(t,e))}var Oe=1e4,zt=3e4,T=500,O=class{constructor(t){this.retryScheduled=false;this.metricAggregationScheduled=false;this.apiUrl=t?.apiUrl,this.cacheDir=t?.cacheDir??join$1(process.env.DEVFLOW_STATE_DIR??join$1(homedir$1(),".devflow","global"),"telemetry-cache"),this.legacyCacheDir=t?.legacyCacheDir??(t?.cacheDir?null:join$1(homedir$1(),".devflow","telemetry-cache")),this.database=t?.database??null,this.ownsDatabase=!t?.database;let n=t?.busyTimeoutMs??Number(process.env.DEVFLOW_TELEMETRY_DB_BUSY_TIMEOUT_MS);this.busyTimeoutMs=Number.isSafeInteger(n)&&n>=0?n:100;}async sendEvent(t){let n={...t,input:this.truncateInput(t.input)};return this.commitOrCache("tool_call",n)?(this.postHttp("/api/telemetry/tool-call",n),t.eventId):null}async sendExecutionStart(t,n,r,o,i=process.env.CLAUDE_PROJECT_DIR??process.cwd(),s=[]){let a={executionId:t,sessionId:n,skillName:r,startedAt:o,projectRoot:i,requiredMcpTools:s};this.commitOrCache("execution_start",a)&&this.postHttp("/api/telemetry/skill-execution/start",a);}async sendExecutionComplete(t,n="completed",r=Date.now(),o){let i={executionId:t,status:n,finishedAt:r,metadata:o},s=this.commitOrCache("execution_complete",i);return s&&this.postHttp("/api/telemetry/skill-execution/complete-reconciled",i),s}async sendSessionStart(t,n,r){let o={id:t,projectRoot:n,startedAt:r,label:n.split("/").pop()??"unknown"},i=this.commitOrCache("session_start",o);return i&&this.postHttp("/api/telemetry/sessions",o),i}async completeEvent(t){let n=this.commitOrCache("complete_event",t);return n&&(this.postHttp("/api/telemetry/tool-call/output",t),this.scheduleMetricAggregation()),n}async endSession(t,n=Date.now()){let r={sessionId:t,finishedAt:n},o=this.commitOrCache("session_end",r);return o&&(this.getDatabase().aggregatePendingToolMetrics(),this.postHttp(`/api/telemetry/sessions/${encodeURIComponent(t)}/close`,{finishedAt:n})),o}async flushCache(){try{let r=this.getDatabase(),o=r.listTelemetryFailures({unresolvedOnly:!0,limit:T}).reverse();for(let i of o)try{this.applyOperation(i.operation,i.payload),r.resolveTelemetryFailure(i.id);}catch{}r.trimTelemetryFailures(T);}catch{}let n=[...new Set([this.cacheDir,this.legacyCacheDir].filter(r=>!!r))].filter(r=>existsSync(r)).flatMap(r=>readdirSync(r).filter(o=>o.endsWith(".json")).map(o=>{let i=join$1(r,o);try{return {cacheFile:i,envelope:Wt(JSON.parse(readFileSync$1(i,"utf8")),o)}}catch{return null}})).filter(r=>r!==null).sort((r,o)=>r.envelope.timestamp-o.envelope.timestamp||Pe(r.envelope.operation)-Pe(o.envelope.operation));for(let{cacheFile:r,envelope:o}of n)try{let i=this.getDatabase();i.insertTelemetryFailure({id:o.id,operation:o.operation,payload:o.payload,error:o.failure,createdAt:o.timestamp}),this.applyOperation(o.operation,o.payload),i.resolveTelemetryFailure(o.id),unlinkSync(r);}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,n){try{return this.applyOperation(t,n),!0}catch(r){return this.cacheOperation(t,n,r),false}}applyOperation(t,n){let r=this.getDatabase();switch(t){case "tool_call":this.ensureParentSession(r,n),r.insertToolCallEvent(n);return;case "execution_start":this.ensureParentSession(r,n),r.insertSkillExecution({executionId:n.executionId,sessionId:n.sessionId,skillName:n.skillName,startedAt:n.startedAt,status:"running",requiredMcpTools:n.requiredMcpTools});return;case "execution_complete":r.reconcileSkillExecution(n.executionId,n.status,n.finishedAt,n.metadata);return;case "session_start":r.ensureSession(n),r.insertRun({id:je(n.id),source:"hook",tool:"session",input:{projectRoot:n.projectRoot},status:"active",startedAt:n.startedAt,tokenUsed:0,metadata:{sessionId:n.id,projectRoot:n.projectRoot}});return;case "complete_event":if(!r.updateToolCallEvent(n.eventId,{output:n.output===void 0?void 0:JSON.stringify(n.output),error:n.error,failureCategory:n.failureCategory,duration:n.duration}))throw new Error(`Tool call event ${n.eventId} is not available for completion`);return;case "session_end":r.closeSession(n.sessionId,n.finishedAt),r.updateRun(je(n.sessionId),{status:"completed",finishedAt:n.finishedAt});return}}ensureParentSession(t,n){let r=typeof n.sessionId=="string"?n.sessionId.trim():"";if(!r)throw new Error("Canonical session ID is required for telemetry");let o=typeof n.projectRoot=="string"&&n.projectRoot.trim()?n.projectRoot:typeof n.input?.projectRoot=="string"&&n.input.projectRoot.trim()?n.input.projectRoot:process.env.CLAUDE_PROJECT_DIR??"unknown";t.ensureSession({id:r,projectRoot:o,label:o==="unknown"?void 0:o.split("/").pop(),startedAt:Number(n.startedAt??n.timestamp??Date.now())});}cacheOperation(t,n,r){let o=Date.now(),i={id:`failure:${o}:${Math.random().toString(36).slice(2,11)}`,operation:t,payload:n,failure:r instanceof Error?r.message:String(r),timestamp:o};try{let s=this.getDatabase();s.insertTelemetryFailure({id:i.id,operation:t,payload:n,error:i.failure,createdAt:o}),s.trimTelemetryFailures(T),this.scheduleRetry();return}catch{}try{existsSync(this.cacheDir)||mkdirSync(this.cacheDir,{recursive:!0});let s=join$1(this.cacheDir,`${o}_${Math.random().toString(36).slice(2,11)}.json`);writeFileSync(s,JSON.stringify(i,null,2),{mode:384}),this.trimCompatibilityCache(),this.scheduleRetry();}catch{}}trimCompatibilityCache(){try{let t=readdirSync(this.cacheDir).filter(n=>n.endsWith(".json")).sort();for(let n of t.slice(0,Math.max(0,t.length-T)))unlinkSync(join$1(this.cacheDir,n));}catch{}}scheduleRetry(){this.retryScheduled||(this.retryScheduled=true,setTimeout(()=>{this.retryScheduled=false,this.flushCache();},zt).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,n){Ae(t,n,{endpoint:this.apiUrl,fallbackReason:"telemetry_already_committed_locally"});}truncateInput(t){let n=JSON.stringify(t);return n===void 0||n.length<=Oe?t:{_truncated:true,_original_size:n.length,_preview:`${n.substring(0,Oe)}...`}}};function Pe(e){return ["session_start","execution_start","tool_call","complete_event","execution_complete","session_end"].indexOf(e)}function je(e){return `hook-run:${e}`}function Wt(e,t){if(!e||typeof e!="object")throw new Error("Invalid telemetry cache envelope");let n=e;if(typeof n.operation=="string"&&n.payload!==void 0)return n;let r=n.type==="tool_call"?"tool_call":n.type==="execution_start"?"execution_start":null;if(!r)throw new Error("Unknown legacy telemetry cache operation");let o=n.payload??{},i=Number(o.timestamp??o.startedAt??Date.now());return {id:`legacy-cache:${t}`,operation:r,payload:o,failure:"Replayed legacy HTTP-first telemetry cache entry",timestamp:i}}var Gt=/^\/(?:devflow:)?[\w-]+\b\s*/iu,Bt=/\b(?:(?:do\s+not|don't|dont|never|not)(?:\s+need\s+to)?|no\s+need\s+to)\s+(?:please\s+)?(?:remember|memorize)\b|(?:不要|别|不用|无需|不必|不需要)(?:再)?(?:记住|记|记忆)/iu,Vt=/(?:^|[.!?]\s*)(?:(?:please|kindly)\s+)?(?:remember|memorize|save\s+this|store\s+this|note\s+that)(?:\s+(?:that|to))?[\s:,-]*(.+)$/iu,Kt=/(?:^|[。!?;,,]\s*)(?:(?:请|麻烦|务必|一定要|帮我|帮忙|需要)\s*)?(?:记住|记一下|记下来|记|记录一下|记录下来|保存一下|保存下来)(?:这(?:件事|一点|个信息|些内容))?[\s::,,]*(.+)$/iu;function P(e){let t=e.trim().replace(Gt,"").trim();return !t||Bt.test(t)?null:(Kt.exec(t)??Vt.exec(t))?.[1]?.trim().replace(/^[::,,\s]+/u,"")||null}var x=1,Y="memory-snapshot-v1.json",Be=512*1024,Ve=256*1024,Ke=2e3,nn=500,rn=10,on=240,sn=300*1e3,an=720*60*60*1e3,Qe=2147483647,cn=100,Fe=250,dn=3e4,ln=10,j=new Map;function Ye(e){return e.currentUid===void 0?{ownerSafe:true,modeSafe:true}:{ownerSafe:e.ownerUid===e.currentUid,modeSafe:(e.mode&18)===0}}function v(e){return resolve(e)}function k(e){return createHash$1("sha256").update(v(e)).digest("hex").slice(0,16)}function X(e,t={}){let n=k(e),r=t.stateRoot?join(t.stateRoot,n):getProjectStateDir(v(e));return join(r,Y)}function N(e,t){let r=(e instanceof Error?e.message:"").replace(/[\r\n\t]+/gu," ").trim().slice(0,160);return r?`${t}:${r}`:t}function Z(e,t){return Array.isArray(e)&&e.length<=t&&e.every(n=>typeof n=="string"&&n.length>0&&n.length<=512)}function un(e){if(!e||typeof e!="object"||Array.isArray(e))return false;let t=e;return typeof t.id=="string"&&t.id.length>0&&t.id.length<=512&&typeof t.kind=="string"&&t.kind.length>0&&t.kind.length<=128&&(t.family===void 0||typeof t.family=="string"&&t.family.length>0&&t.family.length<=256)&&(t.entity===void 0||typeof t.entity=="string"&&t.entity.length>0&&t.entity.length<=256)&&Z(t.memoryIds,100)&&(t.status==="withheld"||t.status==="resolved")&&(t.summary===void 0||typeof t.summary=="string"&&t.summary.length<=2e3)}function mn(e){if(!e||typeof e!="object"||Array.isArray(e))return false;let t=e;return typeof t.reason=="string"&&t.reason.length>0&&t.reason.length<=512&&(t.stale===void 0||typeof t.stale=="boolean")}function ee(e,t,n){if(!e||typeof e!="object"||Array.isArray(e))return null;let r=e,o=v(t),i=k(o),s=r.generation===void 0?0:r.generation;return r.version!==x||r.projectRoot!==o||r.projectHash!==i||typeof r.markdown!="string"||Buffer.byteLength(r.markdown,"utf8")>Ve||!Z(r.memoryIds,Ke)||!Array.isArray(r.conflicts)||r.conflicts.length>nn||!r.conflicts.every(un)||typeof r.generatedAt!="number"||!Number.isFinite(r.generatedAt)||r.generatedAt<0||r.generatedAt>n+sn||!Number.isInteger(s)||s<0||s>Qe||!["ready","pending","degraded","disabled"].includes(String(r.status))||r.degradation!==void 0&&!mn(r.degradation)?null:{...r,generation:s}}function te(e,t,n,r,o=0){let i=v(e);return {version:x,projectRoot:i,projectHash:k(i),markdown:"",memoryIds:[],conflicts:[],generatedAt:r,generation:o,status:t,degradation:{reason:n}}}function S(e,t={}){let n=t.now??Date.now(),r=X(e,t),o;try{o=openSync(r,constants.O_RDONLY|constants.O_NOFOLLOW);let i=fstatSync(o);if(!i.isFile()||i.size<=0||i.size>Be)throw new Error("cache_size_invalid");let s=Ye({...typeof process.getuid=="function"?{currentUid:process.getuid()}:{},ownerUid:i.uid,mode:i.mode});if(!s.ownerSafe)throw new Error("cache_owner_invalid");if(!s.modeSafe)throw new Error("cache_permissions_unsafe");let a=JSON.parse(readFileSync(o,"utf8")),c=ee(a,e,n);if(!c)throw new Error("cache_schema_invalid");return c.status==="ready"&&n-c.generatedAt>an?{snapshot:{...c,status:"degraded",degradation:{reason:"cache_stale",stale:!0}},source:"cache",valid:!0,stale:!0}:{snapshot:c,source:"cache",valid:!0,stale:!1}}catch(i){let a=i.code==="ENOENT";return {snapshot:te(e,a?"pending":"degraded",a?"cache_missing":N(i,"cache_invalid"),n),source:"none",valid:false,stale:false}}finally{if(o!==void 0)try{closeSync(o);}catch{}}}function Le(e){if(!Number.isInteger(e)||e<0||e>=Qe)throw new Error("memory_snapshot_generation_exhausted");return e+1}function pn(e){let t=dirname$1(e);mkdirSync$1(t,{recursive:true,mode:448}),chmodSync(t,448);}function gn(e){pn(e);let t=`${e}.lock`,n={pid:process.pid,createdAt:Date.now(),token:randomUUID$1()},r=JSON.stringify(n),o;try{return o=openSync(t,"wx",384),writeFileSync$1(o,r),fsyncSync(o),{fd:o,path:t,contents:r}}catch(i){if(o!==void 0){try{closeSync(o);}catch{}try{unlinkSync$1(t);}catch{}}if(i.code==="EEXIST")return null;throw i}}function fn(e){if(!e||typeof e!="object"||Array.isArray(e))return false;let t=e;return Number.isInteger(t.pid)&&Number(t.pid)>0&&typeof t.createdAt=="number"&&Number.isFinite(t.createdAt)&&typeof t.token=="string"&&t.token.length>0}function yn(e){try{return process.kill(e,0),!1}catch(t){return t.code==="ESRCH"}}function hn(e){return !e.canonicalCachePath||!e.directoryIsSafe||!e.lockIsRegularFile||!e.metadataValid||!e.contentsUnchanged||!e.ownerDead&&!e.stale?false:e.currentUid!==void 0?e.directoryUid===e.currentUid&&e.lockUid===e.currentUid:true}function vn(e){return isAbsolute(e)&&resolve(e)===e&&basename(e)===Y&&/^[a-f0-9]{16}$/u.test(basename(dirname$1(e)))}function bn(e,t){let n=`${e}.lock`;try{let r=lstatSync(dirname$1(e)),o=lstatSync(n),i=readFileSync(n,"utf8"),s=null;try{let m=JSON.parse(i);fn(m)&&(s=m);}catch{}let a=s?.createdAt??o.mtimeMs,c=Date.now()-a>t,u=s?yn(s.pid):!1,l=readFileSync(n,"utf8")===i,d=typeof process.getuid=="function"?process.getuid():void 0,p=Ye({...d!==void 0?{currentUid:d}:{},ownerUid:r.uid,mode:r.mode});return hn({canonicalCachePath:vn(e),directoryIsSafe:r.isDirectory()&&!r.isSymbolicLink()&&p.modeSafe,lockIsRegularFile:o.isFile()&&!o.isSymbolicLink(),metadataValid:s!==null,ownerDead:u,stale:c,contentsUnchanged:l,...d!==void 0?{currentUid:d}:{},directoryUid:r.uid,lockUid:o.uid})?(unlinkSync$1(n),!0):!1}catch{return false}}function In(e){try{closeSync(e.fd);}catch{}try{readFileSync(e.path,"utf8")===e.contents&&unlinkSync$1(e.path);}catch{}}function Sn(e){return new Promise(t=>setTimeout(t,e))}function W(e,t,n,r){let o=Number.isFinite(e)?Math.floor(e):t;return Math.min(r,Math.max(n,o))}async function wn(e,t){let n=W(t.lockTimeoutMs,cn,0,Fe),r=W(t.lockRetryMs,ln,1,Fe),o=W(t.lockStaleMs,dn,0,Number.MAX_SAFE_INTEGER),i=Date.now()+n;for(;;){let s=gn(e);if(s)return s;if(bn(e,o))continue;let a=i-Date.now();if(a<=0)throw new Error("memory_snapshot_cache_lock_timeout");await Sn(Math.min(r,a));}}async function qe(e,t,n){let r=await wn(e,t);try{return await n()}finally{In(r);}}function Ue(e,t,n,r){let o=r.now??Date.now(),i=v(e),s={version:x,projectRoot:i,projectHash:k(i),markdown:t.markdown,memoryIds:t.memoryIds??[],conflicts:t.conflicts??[],generatedAt:o,generation:n,status:t.status??"ready",...t.degradation?{degradation:t.degradation}:{}};if(!ee(s,e,o))throw new Error("memory_snapshot_payload_invalid");let a=JSON.stringify(s);if(Buffer.byteLength(a,"utf8")>Be)throw new Error("memory_snapshot_cache_too_large");let c=X(e,r),u=dirname$1(c);mkdirSync$1(u,{recursive:true,mode:448}),chmodSync(u,448);let l=join(u,`.${Y}.${process.pid}.${randomUUID$1()}.tmp`),d;try{d=openSync(l,"wx",384),writeFileSync$1(d,a),fsyncSync(d),closeSync(d),d=void 0,chmodSync(l,384),renameSync$1(l,c),chmodSync(c,384);let p;try{p=openSync(u,"r");try{fsyncSync(p);}catch{}}finally{p!==void 0&&closeSync(p);}return s}finally{if(d!==void 0)try{closeSync(d);}catch{}rmSync$1(l,{force:true});}}function kn(e,t){let r=(j.get(e)??Promise.resolve()).catch(()=>{}).then(t),o=r.then(()=>{},()=>{});return j.set(e,o),r.finally(()=>{j.get(e)===o&&j.delete(e);})}function G(e,t,n,r,o){return e.valid?e.snapshot.generation>o?{...e,persisted:false}:{...e,snapshot:{...e.snapshot,status:"degraded",degradation:{reason:n,stale:e.stale||void 0}},persisted:false}:{snapshot:te(t,"degraded",n,r,o),source:"none",valid:false,stale:false,persisted:false}}async function _n(e){let t=X(e.projectRoot,e.cacheOptions);return kn(t,async()=>{let n=S(e.projectRoot,e.cacheOptions),r=n.valid?n.snapshot.generation:0,o;try{o=await e.load();}catch(i){let s=N(i,`refresh_failed:${e.reason}`);try{return await qe(t,e.cacheOptions??{},()=>{let a=S(e.projectRoot,e.cacheOptions);if(a.valid)return G(a,e.projectRoot,s,e.cacheOptions?.now??Date.now(),r);let c=Le(r),u=te(e.projectRoot,"degraded",s,e.cacheOptions?.now??Date.now(),c);return {snapshot:Ue(e.projectRoot,u,c,e.cacheOptions??{}),source:"cache",valid:!0,stale:!1,persisted:!0}})}catch(a){let c=S(e.projectRoot,e.cacheOptions);return G(c,e.projectRoot,N(a,s),e.cacheOptions?.now??Date.now(),r)}}try{return await qe(t,e.cacheOptions??{},()=>{let i=S(e.projectRoot,e.cacheOptions);if(i.valid&&i.snapshot.generation>r)return {...i,persisted:!1};let s=Le(Math.max(r,i.valid?i.snapshot.generation:0));return {snapshot:Ue(e.projectRoot,o,s,e.cacheOptions??{}),source:"cache",valid:!0,stale:!1,persisted:!0}})}catch(i){let s=S(e.projectRoot,e.cacheOptions);return G(s,e.projectRoot,N(i,`refresh_commit_failed:${e.reason}`),e.cacheOptions?.now??Date.now(),r)}})}async function Xe(e){return _n({projectRoot:e.projectRoot,reason:e.reason,cacheOptions:e.cacheOptions,load:async()=>{if(e.injectConfig===false)return {status:"disabled",markdown:"",memoryIds:[],conflicts:[]};let t=typeof e.injectConfig=="object"?e.injectConfig:{},n=Number.isFinite(t.topN)?Math.max(0,Math.floor(t.topN)):10,r=Number.isFinite(t.budgetTokens)?Math.max(1,Math.floor(t.budgetTokens)):800,o=await e.memory.getAll({purpose:"session_bootstrap",budgetTokens:r,limit:n}),s=Number.isInteger(o.truncatedCount)&&o.truncatedCount>=0?o.truncatedCount:null,a=o.memories.length===0&&s!==0,c=s!==null&&s>0?"snapshot_results_truncated":"snapshot_truncation_unknown",u=(o.conflicts??[]).map(d=>({id:d.id,kind:d.kind,family:d.family,entity:d.entity,memoryIds:d.memoryIds,status:d.status,...d.summary?{summary:d.summary}:{}})),l=a?`## Project memory
3
- DevFlow memory snapshot=degraded; reason=${c}. Memory result completeness is not authoritative; do not conclude that the project has no memories.`:o.memories.length===0&&u.length>0?`## Project memory
4
- ${u.length} explicit preference conflict(s) are withheld from automatic guidance; an explicit choice is required.`:o.memories.length===0?`## Project memory
5
- \u672C\u9879\u76EE\u6682\u65E0\u8BB0\u5FC6`:`## Project memory (auto-injected, ${o.memories.length} items, ${o.tokenCount} tokens)
6
- ${o.memories.map(d=>`- **${d.title||d.type}**: ${d.content} (confidence ${d.confidence.toFixed(2)}, ${d.source})`).join(`
7
- `)}`;return {status:a?"degraded":"ready",markdown:l,memoryIds:o.memories.map(d=>d.id),conflicts:u,...a?{degradation:{reason:c}}:{}}}})}function Rn(e){if(!e)return true;try{return JSON.parse(readFileSync(e,"utf8")).sessionStart?.injectMemories??!0}catch{return true}}function En(e,t,n){if(!t.trim())return null;try{let r=JSON.parse(t);if(r.status!=="ok"&&r.status!=="degraded")return null;if(r.enabled===!1){let i=v(e);return {version:x,projectRoot:i,projectHash:k(i),markdown:"",memoryIds:[],conflicts:[],generatedAt:n,generation:0,status:"disabled"}}let o=ee(r.snapshot,e,n);if(o)return o;if(r.status==="ok"&&typeof r.markdown=="string"&&r.markdown.length>0&&Buffer.byteLength(r.markdown,"utf8")<=Ve){let i=v(e);return {version:x,projectRoot:i,projectHash:k(i),markdown:r.markdown,memoryIds:Z(r.memoryIds,Ke)?r.memoryIds:[],conflicts:[],generatedAt:n,generation:0,status:"ready"}}}catch{}return null}function B(e,t){return [...(e??t).replace(/[\r\n\t|]+/gu," ").trim()||t].slice(0,on).join("")}function xn(e){if(e.length===0)return "";let t=e.slice(0,rn),n=t.map(r=>{let o=B(r.family,"unknown"),i=B(r.entity,"unknown"),s=B(r.summary,"Explicit choice required.");return `- family=${o}; entity=${i}; status=${r.status}; summary=${s}`});return e.length>t.length&&n.push(`- ${e.length-t.length} additional conflict(s) omitted from SessionStart output.`),`## Withheld preference conflicts (${e.length})
8
- ${n.join(`
9
- `)}`}function An(e){let t=e.now??Date.now();if(Rn(e.configPath)===false)return "";let n=En(e.projectRoot,e.daemonResponse??"",t),r=n?{snapshot:n,source:"daemon"}:S(e.projectRoot,{...e.cacheOptions,now:t}),{snapshot:o}=r;if(o.status==="disabled")return `## Project memory
10
- DevFlow memory snapshot=pending; source=${r.source}; reason=previous_snapshot_disabled. Memory availability is not yet known; do not conclude that the project has no memories.`;let i=new Date(o.generatedAt).toISOString(),s=o.degradation?.reason?`; reason=${o.degradation.reason}`:"",a=`DevFlow memory snapshot=${o.status}; source=${r.source}; generatedAt=${i}${s}.`,c=xn(o.conflicts);return o.markdown?[o.markdown,c,a].filter(Boolean).join(`
11
- `):["## Project memory",c,`${a} Memory availability is not yet known; do not conclude that the project has no memories.`].filter(Boolean).join(`
12
- `)}if(process.env.DEVFLOW_MEMORY_SNAPSHOT_CLI==="1"){let[,,e,t,n]=process.argv;e!=="session-start"||!t?process.exitCode=2:process.stdout.write(An({projectRoot:t,configPath:n,daemonResponse:process.env.DEVFLOW_MEMORY_RESPONSE}));}var Dn=/^(?:ok(?:ay)?|yes|no|thanks?|thank you|continue|好的?|可以|行|是|否|谢谢|继续|收到|明白了?)[.!。!\s]*$/iu;function Mn(e){let t=e.trim();return t.length>0&&!Dn.test(t)}function Tn(e,t,n=Date.now()){let r=createHash$1("sha256").update(t.trim()).digest("hex"),o=createHash$1("sha256").update(`${e}\0${n}\0${r}`).digest("hex").slice(0,24);return {turnId:`turn:${o}`,eventId:`memory-turn:${o}`,promptHash:r,createdAt:n}}function On(e,t,n=[]){return `memory-receipt:${createHash$1("sha256").update(`${e}\0${t}\0${[...n].sort().join("\0")}`).digest("hex").slice(0,24)}`}function et(e){return `DevFlow memory decision required for ${e.turnId}. Before the final response, semantically decide whether this turn contains durable project knowledge. Call mcp__devflow__memory_commit_turn with evidence-bound candidates, or mcp__devflow__memory_skip_turn with a concrete reason. Do not claim memory success without a canonical receipt. For candidates, copy exact evidenceSpans from this user prompt, preserve package names, flags, versions, paths, and identifiers, and provide subject, predicate, value, polarity, and entities when known. Do not save assistant echoes, task narration, retries, or unverified guesses. Express a change from an old choice as the new durable value. If the decision tool remains unavailable, explicitly state that the memory was not saved.`}function ne(e){let t=e.memoryIds.length>0?e.memoryIds.join(","):"none",n=e.status==="committed"?"accepted":e.status,r=e.status==="committed"?"; indexStatus=pending":"",o=e.status==="committed"&&e.source==="explicit_intent"?"; memoryOnlyCompleted=true; skipProjectContext=true; hostRefinementRequired=true":"",i=e.status==="committed"&&e.source==="explicit_intent"?` The deterministic explicit-memory save is complete and remains authoritative if refinement fails. Before the final response, call mcp__devflow__memory_commit_turn once with turnId=${e.turnId} and semantic candidates. Split every distinct reusable fact into a durable_memory candidate, classify instructions that apply only to this turn as turn_constraint, and include evidenceSpans copied verbatim from the user prompt for every candidate. Preserve exact flags, package names, versions, paths, and identifiers. Keep narrative and value in the user prompt language; do not translate evidence into a different surface form. The tool refines the existing receipt idempotently; it must not create native Claude memory. If refinement is unavailable, return the existing canonical receipt without claiming refinement.`:"";return `DevFlow canonical memory receipt: status=${n}; receiptId=${e.receiptId??"missing"}; turnId=${e.turnId}; memoryIds=${t}; source=${e.source??"unknown"}${r}${o}.`+i}function tt(e){if(!Mn(e.prompt))return null;let t=openGlobalDevFlowDatabase(void 0,{busyTimeoutMs:50});try{let n=e.prompt.trim().slice(0,4e3),r=createHash$1("sha256").update(n).digest("hex"),o=t.listMemoryTurns(e.projectRoot,e.sessionId,5).find(u=>u.promptHash===r&&Date.now()-u.createdAt<1e4),i=o?{turnId:o.turnId,eventId:o.eventId,promptHash:o.promptHash,createdAt:o.createdAt}:e.identity??Tn(e.sessionId,n),s=o??t.beginMemoryTurn({...i,projectRoot:e.projectRoot,sessionId:e.sessionId});if(s.status!=="pending")return {turn:s,additionalContext:ne(s),skipSkillRouting:s.source==="explicit_intent"};let a=P(n)??void 0,c=a?"commit_explicit":"capture_prompt";return t.enqueueWork({idempotencyKey:`memory-turn:${c}:${s.turnId}`,kind:a?"memory.explicit_commit":"memory.turn_capture",projectRoot:e.projectRoot,sessionId:e.sessionId,turnId:s.turnId,payload:{operation:c,turnId:s.turnId,eventId:s.eventId,sessionId:e.sessionId,prompt:n,explicitContent:a,createdAt:s.createdAt}}),{turn:s,explicitContent:a,additionalContext:a?`DevFlow explicit memory is durably queued for ${s.turnId}, but no canonical receipt exists yet. Do not claim that it was remembered.`:et(s),skipSkillRouting:!!a}}finally{t.close();}}async function nt(e){let{payload:t,memory:n,projectRoot:r}=e,o=openGlobalDevFlowDatabase();try{let i=o.getMemoryTurn(t.turnId);if(!i)throw new Error(`Memory turn ${t.turnId} does not exist`);if(i.status!=="pending"){if(i.receiptId&&typeof n.reconcileTurnObservationLineage=="function")try{await n.reconcileTurnObservationLineage([i]);}catch{}return {turn:i,additionalContext:ne(i),skipSkillRouting:i.source==="explicit_intent"}}if(await n.recordUserMessage(t.prompt,t.sessionId,t.prompt.slice(0,200)),await n.recordEvent({id:t.eventId,sessionId:t.sessionId,tool:"UserPromptSubmit",kind:"user_message",payload:{prompt:t.prompt,turnId:t.turnId},createdAt:t.createdAt}),t.operation==="capture_prompt"||!t.explicitContent)return {turn:i,additionalContext:et(i),skipSkillRouting:!1};let s=await n.saveExplicitMemoryIntent(t.explicitContent,t.sessionId,t.eventId),a=[...new Set([s.id,...s.relatedMemoryIds??[]])];emitSemanticControlLog({event:"memory.semantic.decided",identity:{projectRoot:r,sessionId:i.sessionId,turnId:i.turnId},level:s.semanticDecision?.status==="semantic_ready"?"info":"warn",timestamp:Date.now(),data:{status:s.semanticDecision?.status??"semantic_unavailable",operations:s.semanticDecision?.operations??["add"],memoryIds:a,rejectedCount:s.semanticDecision?.rejectedCount??0,durable:s.durable,lexicallyReady:s.lexicallyReady,policyReady:s.policyReady,vectorStatus:s.vectorStatus}});let c=On(i.turnId,"committed",a),u=o.commitMemoryTurn({turnId:i.turnId,receiptId:c,memoryIds:a,source:"explicit_intent",reason:"explicit_user_request"});try{typeof n.finalizeTurnDecision=="function"&&await n.finalizeTurnDecision({turnEventId:i.eventId,sessionId:i.sessionId,turnId:i.turnId,receiptId:c,status:"committed",memoryIds:a,reason:"explicit_user_request"});}catch(l){emitSemanticControlLog({event:"memory.write.degraded",identity:{projectRoot:r,sessionId:t.sessionId,turnId:i.turnId},level:"warn",timestamp:Date.now(),data:{stage:"lineage_finalize",reason:l.message,fallback:"session_end_reconciliation"}});}try{await n.enrichExplicitMemoryObservation(s.id);}catch(l){emitSemanticControlLog({event:"memory.write.degraded",identity:{projectRoot:r,sessionId:t.sessionId,turnId:i.turnId},level:"warn",timestamp:Date.now(),data:{stage:"explicit_enrichment",memoryId:s.id,reason:l.message,fallback:"durable_work_queue"}}),o.enqueueWork({idempotencyKey:`explicit-enrichment:${r}:${s.id}`,kind:"memory.explicit_enrichment",projectRoot:r,sessionId:t.sessionId,turnId:u.turnId,payload:{observationId:s.id},maxAttempts:20});}o.enqueueWork({idempotencyKey:`vector:${r}:${s.id}`,kind:"memory.vector_backfill",projectRoot:r,sessionId:t.sessionId,turnId:u.turnId,payload:{observationId:s.id},maxAttempts:20});try{await Xe({projectRoot:r,memory:n,injectConfig:loadConfig(r).sessionStart?.injectMemories,reason:"explicit_memory_commit"});}catch(l){emitSemanticControlLog({event:"memory.write.degraded",identity:{projectRoot:r,sessionId:t.sessionId,turnId:i.turnId},level:"warn",timestamp:Date.now(),data:{stage:"snapshot_refresh",reason:l.message,fallback:"durable_memory_authoritative"}});}return {turn:u,explicitContent:t.explicitContent,additionalContext:ne(u),skipSkillRouting:!0}}finally{o.close();}}function ot(e,t){let n=Hn(e);mkdirSync$1(n,{recursive:true,mode:448});let r=`memory-turn-spool-${Date.now()}-${process.pid}-${randomUUID$1()}`,o=join(n,`${r}.json`),i=`${o}.tmp`;return writeFileSync$1(i,JSON.stringify({...t,prompt:t.prompt.trim().slice(0,4e3)}),{mode:384}),renameSync$1(i,o),r}function Hn(e){return join(R(e),"memory-turn-pending")}function it(e){let t=Date.now();try{let n=openGlobalDevFlowDatabase(void 0,{busyTimeoutMs:100});try{let r=`context-prefetch:${createHash$1("sha256").update(`${e.projectRoot}\0${e.sessionId}\0${e.executionId}\0${qn(e.prompt)}\0${e.profileFingerprint}`).digest("hex")}`,o=n.enqueueWork({idempotencyKey:r,kind:"context.prefetch",projectRoot:e.projectRoot,sessionId:e.sessionId,payload:e,maxAttempts:3});return h("prefetch_queue",{projectRoot:e.projectRoot,skillName:e.skillName,accepted:!0,workState:o.state,latencyMs:Date.now()-t}),{accepted:!0,workItemId:o.id}}finally{n.close();}}catch(n){let r=n instanceof Error?n.message:String(n);return h("prefetch_queue",{projectRoot:e.projectRoot,skillName:e.skillName,accepted:false,reason:r,latencyMs:Date.now()-t}),{accepted:false,reason:r}}}function qn(e){return e.trim().toLowerCase().replace(/\s+/g," ").slice(0,4e3)}function at(e){let t=ir(e.projectRoot),n=claudeCodeRuntimeAdapter.normalizePrompt(e.hostEvent??{session_id:e.sessionId,prompt:e.prompt},{projectRoot:t}),r=n.sourceHash,o=openGlobalDevFlowDatabase(void 0,{busyTimeoutMs:100});try{let i=o.getTaskIntentArtifactBySource({projectRoot:t,sessionId:e.sessionId,sourceHash:r});if(i){let _=Kn(o,i);return {artifact:Zn(i),queryPlan:er(_),memoryIdentity:st(i),reused:!0}}let s=rr(n.rawPrompt,n.command),a=buildRetrievalTaskPlan({query:s,parsedIntent:parseIntent(s),targetAnchors:tr(n.rawPrompt),activeSkill:n.activeSkill,command:n.command}),c=`turn:${A(`${e.sessionId}\0${r}`)}`,u=`request:${A(`${t}\0${e.sessionId}\0${c}`)}`,l={projectRoot:t,projectId:`project:${A(t)}`,hostId:n.hostId,sessionId:e.sessionId,turnId:c,requestId:u},d=[{source:"deterministic_parser",field:"intent",value:a.intent,reason:a.classification.intentReason,confidence:a.classification.intentSource==="semantic_override"?.95:.75},{source:n.command?"slash_command":"deterministic_parser",field:"action",value:a.action,reason:a.classification.actionReason,confidence:n.command||a.action!=="analyze"?.95:.65},...a.targetAnchors.map(_=>({source:"target_anchor",field:"target",value:_,reason:"explicit_prompt_target",confidence:1}))],p={identity:l,version:1,rawPrompt:n.rawPrompt,normalizedPrompt:or(n.rawPrompt),...n.command?{command:n.command}:{},slashArgs:n.slashArgs,...n.activeSkill?{activeSkill:n.activeSkill}:{},intent:a.intent,action:a.action,entities:a.entities,targetAnchors:a.targetAnchors,policyConstraints:nr(n.rawPrompt),classificationEvidence:d,sourceEventIds:[n.sourceEventId??`host-event:${r.slice(0,24)}`],sourceHash:r,createdAt:n.timestamp},m={...p,artifactHash:sr(p)},y=buildChannelQueryPlan({artifact:m,taskPlan:a,expandedTerms:e.expandedTerms});o.appendTaskIntentArtifact(Yn(m)),o.appendChannelQueryPlan(Xn(y));let lt=Qn(o,m);return emitSemanticControlLog({event:"host.prompt.normalized",identity:l,level:"info",timestamp:Date.now(),data:{sourceHash:r,command:m.command,activeSkill:m.activeSkill,rawPromptBytes:Buffer.byteLength(m.rawPrompt)}}),emitSemanticControlLog({event:"intent.artifact.created",identity:l,level:"info",timestamp:Date.now(),data:{artifactHash:m.artifactHash,intent:m.intent,action:m.action,evidence:m.classificationEvidence,entityCount:m.entities.length,targetCount:m.targetAnchors.length}}),emitSemanticControlLog({event:"intent.artifact.persisted",identity:l,level:"info",timestamp:Date.now(),data:{artifactHash:m.artifactHash,version:m.version,sourceHash:m.sourceHash}}),emitSemanticControlLog({event:"query.plan.created",identity:l,level:"info",timestamp:Date.now(),data:{planHash:y.planHash,sourceIntentHash:y.sourceIntentHash,generatedBy:y.generatedBy,codeQueries:y.code.length,memoryQueries:y.memory.length,knowledgeQueries:y.knowledge.length,knowledgeDisposition:y.knowledge.map(_=>_.requirement)}}),emitSemanticControlLog({event:"terminal.transition.persisted",identity:l,level:"info",timestamp:Date.now(),data:{state:"intent_bound",receiptId:lt,sourceIntentHash:m.artifactHash}}),{artifact:m,queryPlan:y,memoryIdentity:st(m),reused:!1}}finally{o.close();}}function Kn(e,t){let n=e.getChannelQueryPlanForIntent({projectRoot:t.projectRoot,sessionId:t.sessionId,turnId:t.turnId,sourceIntentHash:t.artifactHash});if(!n)throw new Error(`QUERY_PLAN_NOT_FOUND:${t.artifactHash}`);return n}function Qn(e,t){let n=e.getLatestTerminalTransition(t.identity.projectRoot,t.identity.sessionId,t.identity.turnId);if(n)return n.receiptId;let r=`terminal:${A(`${t.artifactHash}\0open`)}`;return e.appendTerminalTransition({...t.identity,sequence:1,toState:"open",receiptId:r,reason:"host_prompt_accepted",payload:{sourceHash:t.sourceHash},createdAt:t.createdAt}),e.appendTerminalTransition({...t.identity,sequence:2,fromState:"open",toState:"intent_bound",receiptId:`terminal:${A(`${t.artifactHash}\0intent_bound`)}`,sourceReceiptId:r,reason:"immutable_intent_persisted",payload:{intentArtifactHash:t.artifactHash},createdAt:Math.max(t.createdAt,Date.now())}).receiptId}function Yn(e){return {...e.identity,version:e.version,supersedesHash:e.supersedesHash,rawPrompt:e.rawPrompt,normalizedPrompt:e.normalizedPrompt,command:e.command,slashArgs:e.slashArgs,activeSkill:e.activeSkill,intent:e.intent,action:e.action,entities:e.entities,targetAnchors:e.targetAnchors,policyConstraints:e.policyConstraints,classificationEvidence:e.classificationEvidence.map(t=>({...t})),sourceEventIds:e.sourceEventIds,sourceHash:e.sourceHash,artifactHash:e.artifactHash,createdAt:e.createdAt}}function Xn(e){return {...e.identity,sourceIntentHash:e.sourceIntentHash,planHash:e.planHash,code:e.code.map(t=>({...t})),memory:e.memory.map(t=>({...t})),knowledge:e.knowledge.map(t=>({...t})),generatedBy:e.generatedBy,degradation:e.degradation?{...e.degradation}:void 0,createdAt:e.createdAt}}function Zn(e){return {identity:ct(e),version:e.version,...e.supersedesHash?{supersedesHash:e.supersedesHash}:{},rawPrompt:e.rawPrompt,normalizedPrompt:e.normalizedPrompt,...e.command?{command:e.command}:{},slashArgs:e.slashArgs,...e.activeSkill?{activeSkill:e.activeSkill}:{},intent:e.intent,action:e.action,entities:e.entities,targetAnchors:e.targetAnchors,policyConstraints:e.policyConstraints,classificationEvidence:e.classificationEvidence,sourceEventIds:e.sourceEventIds,sourceHash:e.sourceHash,artifactHash:e.artifactHash,createdAt:e.createdAt}}function er(e){return {identity:ct(e),sourceIntentHash:e.sourceIntentHash,planHash:e.planHash,code:e.code,memory:e.memory,knowledge:e.knowledge,generatedBy:e.generatedBy,...e.degradation?{degradation:e.degradation}:{},createdAt:e.createdAt}}function ct(e){return {projectRoot:e.projectRoot,projectId:e.projectId,hostId:e.hostId,sessionId:e.sessionId,turnId:e.turnId,requestId:e.requestId,...e.executionId?{executionId:e.executionId}:{}}}function st(e){let t=e.rawPrompt.trim().slice(0,4e3);return {turnId:e.identity?e.identity.turnId:e.turnId,eventId:`memory-turn:${(e.identity?e.identity.turnId:e.turnId).replace(/^turn:/u,"")}`,promptHash:createHash$1("sha256").update(t).digest("hex"),createdAt:e.createdAt}}function tr(e){let t=e.match(/(?:^|[\s`'"(])((?:\.{0,2}\/)?(?:[A-Za-z0-9_@.-]+\/)+[A-Za-z0-9_@.-]+(?:\.[A-Za-z0-9]+)?)/gu)??[];return dt(t.map(n=>n.trim().replace(/^[`'"(]+|[`'"),.;:,。;:]+$/gu,"")).filter(n=>!n.startsWith("/")||/\.[A-Za-z0-9]+$/u.test(n))).slice(0,16)}function nr(e){let t=e.match(/--[a-z0-9][a-z0-9-]*(?:=[^\s,。;;]+)?/giu)??[];return dt(t.map(n=>n.normalize("NFKC"))).slice(0,16)}function rr(e,t){return t&&e.trimStart().replace(new RegExp(`^\\/${ar(t)}\\b`,"iu"),"").trim()||e.trim()}function or(e){return e.normalize("NFKC").replace(/\s+/gu," ").trim().slice(0,4e3)}function dt(e){return [...new Set(e.filter(Boolean))]}function ir(e){let t=resolve(e);try{return realpathSync(t)}catch{return t}}function sr(e){return createHash$1("sha256").update(re(e)).digest("hex")}function A(e){return createHash$1("sha256").update(e).digest("hex").slice(0,24)}function re(e){if(e===null||typeof e=="string"||typeof e=="boolean")return JSON.stringify(e);if(typeof e=="number")return Number.isFinite(e)?JSON.stringify(e):"null";if(Array.isArray(e))return `[${e.map(re).join(",")}]`;if(!e||typeof e!="object")return JSON.stringify(String(e));let t=e;return `{${Object.keys(t).sort().map(n=>`${JSON.stringify(n)}:${re(t[n])}`).join(",")}}`}function ar(e){return e.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&")}var f=process.env.CLAUDE_PROJECT_DIR||process.cwd();async function ur(e){let t=se()?[ie]:[],n;try{n=JSON.parse(e);}catch{return {hookSpecificOutput:{hookEventName:"UserPromptSubmit",permissionDecision:"allow",...t.length?{additionalContext:t.join(`
13
- `)}:{}}}}let r=n.prompt||"";if(!r.trim())return {hookSpecificOutput:{hookEventName:"UserPromptSubmit",permissionDecision:"allow",...t.length?{additionalContext:t.join(`
14
- `)}:{}}};let o=n.session_id?.trim(),i=ve(r),s=false,a,c,u=o?new D(f):void 0;if(o){try{c=at({projectRoot:f,sessionId:o,prompt:r,hostEvent:n}),u.bindTaskIdentity(o,{turnId:c.artifact.identity.turnId,requestId:c.artifact.identity.requestId,intentArtifactHash:c.artifact.artifactHash}),t.push(`DevFlow immutable task identity: turnId=${c.artifact.identity.turnId}; requestId=${c.artifact.identity.requestId}; intent=${c.artifact.intent}; action=${c.artifact.action}; intentArtifactHash=${c.artifact.artifactHash}. Retrieval query expansion must not replace this original intent.`);}catch(l){t.push("DevFlow task intent persistence degraded; preserve the original user command and do not claim canonical context binding."),emitSemanticControlLog({event:"intent.artifact.failed",identity:{projectRoot:f,sessionId:o},level:"error",timestamp:Date.now(),data:{stage:"user_prompt_submit",category:"intent_persistence_unavailable",error:l instanceof Error?l.message:String(l)}});}try{let l=tt({projectRoot:f,sessionId:o,prompt:r,...c?{identity:c.memoryIdentity}:{}});if(l){let d=l;if(l.explicitContent&&l.turn.status==="pending"){let p=new MemoryGate(f);try{d=await nt({projectRoot:f,payload:{operation:"commit_explicit",turnId:l.turn.turnId,eventId:l.turn.eventId,sessionId:o,prompt:r.trim().slice(0,4e3),explicitContent:l.explicitContent,createdAt:l.turn.createdAt},memory:p});}catch(m){emitSemanticControlLog({event:"memory.write.degraded",identity:{projectRoot:f,sessionId:o,turnId:l.turn.turnId},level:"warn",timestamp:Date.now(),data:{stage:"explicit_commit",reason:m.message,fallback:"durable_work_queue"}});}finally{p.close();}}t.push(d.additionalContext),s=d.skipSkillRouting;}}catch(l){s=!!P(r);try{let d=ot(f,{sessionId:o,prompt:r,createdAt:Date.now()});t.push(`DevFlow memory turn status=accepted; durable=true; receiptId=${d}; canonicalMemory=false; SQLite queue replay pending. Do not claim memory success without a canonical receipt.`),emitSemanticControlLog({event:"memory.write.degraded",identity:{projectRoot:f,sessionId:o},level:"warn",timestamp:Date.now(),data:{stage:"turn_capture",reason:l.message,fallback:"durable_spool",receiptId:d}});}catch(d){t.push("DevFlow memory turn status=degraded; durable=false; no canonical receipt exists. Do not claim memory success."),emitSemanticControlLog({event:"memory.write.degraded",identity:{projectRoot:f,sessionId:o},level:"error",timestamp:Date.now(),data:{stage:"turn_capture",reason:d.message,fallback:"none"}});}}}if(o&&i&&!s){let l=u.get(o)?.executionId,d=u.startExecution(o,i.skillName,Ie(i.skillName));if(a=d.executionId,d.executionId&&d.executionId!==l){let m=new O;try{await m.sendSessionStart(o,f,d.startedAt),await m.sendExecutionStart(d.executionId,o,i.skillName,d.lastActivityAt,f,d.requiredMcpTools);}finally{m.close();}}let p=Se(i.skillName,f,r);p&&t.push(p);}if(o&&i&&a&&!s){let l=resolveProjectCapabilityProfile(f),d=resolveCapabilityRollout(f).config.retrievalSessions;it({prompt:r.trimStart().replace(/^\/devflow:[a-z0-9][a-z0-9-]*\b/i,"").trim()||r,projectRoot:f,sessionId:o,executionId:a,skillName:i.skillName,profileFingerprint:l.fingerprint,rolloutMode:d,retrievalVersion:"r2.v1",createdAt:Date.now()});}return {hookSpecificOutput:{hookEventName:"UserPromptSubmit",permissionDecision:"allow",...t.length?{additionalContext:t.join(`
15
- `)}:{}}}}if(process.argv[1]?.endsWith("user-prompt-submit")||process.argv[1]?.endsWith("user-prompt-submit.js")){let e=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",n=>{t+=n;}),process.stdin.on("end",async()=>{let n=await ur(t.trim()||process.argv[2]||"");e(JSON.stringify(n)),process.exit(0);}),process.stdin.on("error",()=>{e(JSON.stringify({hookSpecificOutput:{hookEventName:"UserPromptSubmit",permissionDecision:"allow"}})),process.exit(0);}),setTimeout(()=>{e(JSON.stringify({hookSpecificOutput:{hookEventName:"UserPromptSubmit",permissionDecision:"allow"}})),process.exit(0);},3e4).unref();}export{ur as handleUserPromptSubmit};
1
+ import {openGlobalDevFlowDatabase}from'@devflow-tools/database';import {existsSync,readFileSync as readFileSync$1,rmSync,mkdirSync,writeFileSync,linkSync,readdirSync,renameSync,unlinkSync}from'fs';import {join as join$1,dirname}from'path';import {randomUUID,createHash}from'crypto';import {getLocalApiKey,resolveProjectCapabilityProfile,resolveCapabilityRollout,claudeCodeRuntimeAdapter,formatSkillRuntimeOverlay,createSkillRuntimeOverlay,getProjectStateDir,resolveRuntimeEndpoint,acquireRuntimeHttpCircuit,registerRuntimeHttpSuccess,registerRuntimeHttpFailure}from'@devflow-tools/sdk';import {fileURLToPath}from'url';import {emitSemanticControlLog}from'@devflow-tools/telemetry';import {homedir as homedir$1}from'os';import {request}from'node:http';import {readFileSync,openSync,constants,fstatSync,closeSync,mkdirSync as mkdirSync$1,writeFileSync as writeFileSync$1,renameSync as renameSync$1,realpathSync,existsSync as existsSync$1,appendFileSync}from'node:fs';import {join,resolve}from'node:path';import {homedir}from'node:os';import {createHash as createHash$1,randomUUID as randomUUID$1}from'node:crypto';import {buildRetrievalTaskPlan,parseIntent,buildChannelQueryPlan}from'@devflow-tools/context-engine';function h(n,t,e){try{let r=openGlobalDevFlowDatabase();try{r.insertEvent({kind:n,timestamp:Date.now(),duration:e,success:t.success!==!1,metadata:t});}finally{r.close();}}catch{}}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 J(){return process.env.DEVFLOW_HOOK_DEGRADED==="1"}function Ne(n){return n??process.env.CLAUDE_PROJECT_DIR??process.cwd()}function k(n){return process.env.DEVFLOW_STATE_DIR??getProjectStateDir(Ne(n))}function B(n){return Buffer.from(n,"utf8").toString("base64url")}function qe(n,t,e){let r=t?.trim();if(r){let o=/^[a-zA-Z0-9:._-]{1,192}$/.test(r)?r:`tool-${createHash("sha256").update(r.slice(0,1024)).digest("hex").slice(0,32)}`;return `${n}:${o}`}return `${n}:legacy-${e}-${randomUUID().slice(0,8)}`}function Z(n){return `${n}:legacy-journal`}var D=class{constructor(t){this.projectRoot=t;this.sessions=new Map;this.sessionsDir=join$1(k(t),"hook-sessions");}registerSession(t){let e=t.trim();if(!e)throw new Error("session_id_required");let r=this.get(e);if(r)return r.lastActivityAt=Date.now(),this.persist(r),r;let o=Date.now(),i={sessionId:e,projectRoot:this.projectRoot,requiredMcpTools:[],evidenceObligations:[],evidenceDegradations:[],evidenceOutcomes:[],startedAt:o,lastActivityAt:o};return this.sessions.set(e,i),this.persist(i),i}startExecution(t,e,r){let o=this.registerSession(t);return (!o.executionId||o.skillName!==e)&&(o.executionId=`exec_${Date.now()}_${randomUUID().slice(0,8)}`),o.skillName=e,o.requiredMcpTools=[...new Set(r)],o.lastActivityAt=Date.now(),this.persist(o),o}bindTaskIdentity(t,e){let r=this.registerSession(t);return r.activeTurnId=e.turnId,r.activeRequestId=e.requestId,r.intentArtifactHash=e.intentArtifactHash,r.lastActivityAt=Date.now(),this.persist(r),r}get(t){let e=t.trim();if(!e)return null;let r=this.sessions.get(e);if(r)return this.replayEvidenceJournal(r),r;let o=this.snapshotPath(e);if(!existsSync(o))return null;try{let i=JSON.parse(readFileSync$1(o,"utf8"));return i.sessionId!==e||i.projectRoot!==this.projectRoot?null:(i.requiredMcpTools=Array.isArray(i.requiredMcpTools)?i.requiredMcpTools:[],i.evidenceObligations=V(i.evidenceObligations),i.evidenceDegradations=K(i.evidenceDegradations),i.evidenceOutcomes=Q(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 r=structuredClone(e);return delete e.executionId,delete e.skillName,e.requiredMcpTools=[],e.lastActivityAt=Date.now(),this.persist(e),r}addEvidenceObligation(t,e,r=Date.now(),o){let i=this.registerSession(t),c=(o?void 0:i.evidenceObligations.find(u=>u.contractId===e.id))?.obligationId??qe(e.id,o,r);this.appendEvidenceEvent(t,{kind:"add",obligationId:c,contractId:e.id,at:r,contract:e},`add\0${c}`),this.replayEvidenceJournal(i);let a=i.evidenceObligations.find(u=>u.obligationId===c);return a?(i.lastActivityAt=Date.now(),this.persist(i),structuredClone(a)):null}listEvidenceObligations(t){return (this.get(t)?.evidenceObligations??[]).map(e=>structuredClone(e))}markEvidenceCorrection(t,e,r,o,i=Date.now()){let s=this.get(t),c=s?.evidenceObligations.find(l=>l.obligationId===e);if(!s||!c)return null;let a=/^[a-f0-9]{64}$/.test(o)?o:"";if(!a)return null;this.appendEvidenceEvent(t,{kind:"correction",obligationId:e,contractId:c.contractId,at:i,fingerprint:a,violations:r.slice(0,16).map(l=>l.slice(0,240))},`correction\0${e}\0${a}`),this.replayEvidenceJournal(s),s.lastActivityAt=i,this.persist(s);let u=s.evidenceObligations.find(l=>l.obligationId===e);return u?structuredClone(u):null}resolveEvidenceObligation(t,e){let r=this.get(t);if(!r)return false;let o=r.evidenceObligations.find(s=>s.obligationId===e);if(!o)return false;let i=Date.now();return this.appendEvidenceEvent(t,{kind:"resolve",obligationId:e,contractId:o.contractId,at:i},`resolve\0${e}`),this.replayEvidenceJournal(r),r.lastActivityAt=i,this.persist(r),true}resolveDegradedEvidence(t,e){let r=this.get(t),o=r?.evidenceDegradations.find(s=>s.obligationId===e);if(!r||!o)return false;let i=Date.now();return this.appendEvidenceEvent(t,{kind:"resolve",obligationId:e,contractId:o.contractId,at:i},`resolve-degraded\0${e}\0${i}`),this.replayEvidenceJournal(r),r.lastActivityAt=i,this.persist(r),true}degradeEvidenceObligation(t,e,r,o=Date.now()){let i=this.get(t),s=i?.evidenceObligations.find(a=>a.obligationId===e);if(!i||!s)return false;let c=r.slice(0,240);return this.appendEvidenceEvent(t,{kind:"degrade",obligationId:e,contractId:s.contractId,at:o,reason:c},`degrade\0${e}\0${c}`),this.replayEvidenceJournal(i),i.lastActivityAt=o,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,`${B(t)}.json`)}evidenceJournalDir(t){return join$1(this.sessionsDir,"evidence-journal",B(t))}appendEvidenceEvent(t,e,r){let o=this.evidenceJournalDir(t);mkdirSync(o,{recursive:true,mode:448});let i=createHash("sha256").update(r).digest("hex"),s=join$1(o,`${e.kind}-${i}.json`);if(existsSync(s))return;let c=join$1(o,`.${process.pid}.${randomUUID()}.tmp`);writeFileSync(c,JSON.stringify(e),{mode:384});try{linkSync(c,s);}catch(a){if(a.code!=="EEXIST")throw a}finally{rmSync(c,{force:true});}}replayEvidenceJournal(t){t.evidenceObligations=V(t.evidenceObligations),t.evidenceDegradations=K(t.evidenceDegradations),t.evidenceOutcomes=Q(t.evidenceOutcomes);let e=this.evidenceJournalDir(t.sessionId);if(!existsSync(e))return;let r;try{r=readdirSync(e).filter(i=>/^(?:add|correction|resolve|degrade)-[a-f0-9]{64}\.json$/.test(i)).slice(0,4096);}catch{return}let o=r.flatMap(i=>{try{let s=readFileSync$1(join$1(e,i),"utf8");if(Buffer.byteLength(s,"utf8")>64*1024)return [];let c=Ue(JSON.parse(s));return c?[c]:[]}catch{return []}}).sort((i,s)=>i.at-s.at||Y(i.kind)-Y(s.kind));for(let i of o)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 r=t.evidenceOutcomes.find(s=>s.obligationId===e.obligationId);if(e.kind==="add"){if(r)return;let s=t.evidenceObligations.find(c=>c.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 o=t.evidenceObligations.find(s=>s.obligationId===e.obligationId);if(e.kind==="correction"){if(!o||r||o.correctionFingerprint===e.fingerprint)return;o.attempt+=1,o.correctionRequested=true,o.correctionRequestedAt=e.at,o.correctionFingerprint=e.fingerprint,o.violations=e.violations;return}let i=o?.attempt??r?.attempt??0;if(e.kind==="resolve"&&r?.status==="degraded")t.evidenceOutcomes=t.evidenceOutcomes.filter(s=>s.obligationId!==e.obligationId),t.evidenceDegradations=t.evidenceDegradations.filter(s=>s.obligationId!==e.obligationId);else if(r)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:o?.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),r=`${e}.${process.pid}.${randomUUID()}.tmp`;writeFileSync(r,JSON.stringify(t),{mode:384}),renameSync(r,e);}};function V(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)||!ee(e.contract))return [];let r=typeof e.obligationId=="string"&&e.obligationId.length>0&&e.obligationId.length<=384?e.obligationId:Z(e.contractId),o=typeof e.correctionTranscriptHash=="string"?e.correctionTranscriptHash:void 0,i=e.correctionFingerprint??o;return i!==void 0&&!/^[a-f0-9]{64}$/.test(i)?[]:[{...e,obligationId:r,correctionFingerprint:i}]}).slice(-8):[]}function K(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 Q(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 Ue(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 o={obligationId:typeof t.obligationId=="string"&&t.obligationId.length>0&&t.obligationId.length<=384?t.obligationId:Z(t.contractId),contractId:t.contractId,at:t.at};if(e==="add")return ee(t.contract)?{kind:e,...o,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,...o,fingerprint:i,violations:t.violations}:null}return e==="resolve"?{kind:e,...o}:typeof t.reason=="string"&&t.reason.length<=240?{kind:e,...o,reason:t.reason}:null}function Y(n){return n==="add"?0:n==="correction"?1:2}function ee(n){if(!n||typeof n!="object")return false;let t=n,e=t.requiredSections,r=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(r)&&r.length<=16&&r.every(o=>typeof o=="string"&&o.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 Je(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 te(n){let t=n.trimStart().match(/^\/(devflow:[a-z0-9][a-z0-9-]*)\b/i);if(!t)return null;let e=Je(t[1]);return e?{rawName:t[1],skillName:e}:null}var Ve=2,Ke=1;function Qe(){if(process.env.CLAUDE_PLUGIN_ROOT)return process.env.CLAUDE_PLUGIN_ROOT;try{return join$1(dirname(fileURLToPath(import.meta.url)),"..","..")}catch{return process.cwd()}}function ne(n=Qe()){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 r=JSON.parse(readFileSync$1(e,"utf8"));if(r.version!==Ve&&r.version!==Ke||!Ye(r.commands)){emitSemanticControlLog({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 r.commands}catch(r){emitSemanticControlLog({event:"hook.runtime.degraded",identity:{projectRoot:process.env.CLAUDE_PROJECT_DIR||process.cwd()},level:"warn",timestamp:Date.now(),data:{stage:"command_registry",reason:r.message,fallback:"next_registry_candidate"}});}return null}function Ye(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||Xe(e.hostTools))&&(e.evidenceMode===void 0||["static","runtime","mixed"].includes(e.evidenceMode))})}function Xe(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 re(n){let t=ne();return t?t[n]?.mcpTools??[]:[]}function oe(n,t,e){return formatSkillRuntimeOverlay(createSkillRuntimeOverlay(n,t,{prompt:e}))}var at=getLocalApiKey(),N=join(homedir(),".devflow","errors");async function ue(n,t,e={}){let r=e.endpoint??resolveRuntimeEndpoint().url,o=e.timeout??1500,i=e.durableMirror??true,s=e.maxRetries??(i?0:2),c=e.circuitBreaker??true,a=acquireRuntimeHttpCircuit(r,n);if(c&&!a.allowed)return {delivered:false,suppressed:true,fallbackReason:a.state.fallbackReason};let u;for(let d=0;d<=s;d+=1)try{return await ct(r,n,t,o),c&&registerRuntimeHttpSuccess(r,n).transitioned&&h("http_circuit_transition",{endpoint:r,path:new URL(n,r).pathname,previous:a.state.status,status:"closed",failures:0}),{delivered:!0,suppressed:!1}}catch(g){u=g instanceof Error?g:new Error(String(g)),d<s&&await dt(Math.min(100*2**d,1e3));}if(!u)return {delivered:false,suppressed:false,fallbackReason:"unknown_http_failure"};if(!c)return de(n,u),{delivered:false,suppressed:false,fallbackReason:u.message};let l=registerRuntimeHttpFailure(r,n,e.fallbackReason??(i?"local_durable_mirror":"http_delivery_failed"));return l.transitioned&&(de(n,u),h("http_circuit_transition",{endpoint:r,path:new URL(n,r).pathname,previous:a.state.status,status:"open",failures:l.state.failures,openUntil:l.state.openUntil,fallbackReason:l.state.fallbackReason})),{delivered:false,suppressed:false,fallbackReason:l.state.fallbackReason}}function ct(n,t,e,r){return new Promise((o,i)=>{let s=JSON.stringify(e),c=new URL(t,n),a=false,u=d=>{a||(a=true,d?i(d):o());},l=request({hostname:c.hostname,port:c.port,path:c.pathname+c.search,method:"POST",headers:{"Content-Type":"application/json","X-API-Key":at,"Content-Length":Buffer.byteLength(s)},timeout:r},d=>{d.on("error",u),d.on("end",()=>{let g=d.statusCode??0;u(g>=200&&g<300?void 0:new Error(`HTTP ${g}`));}),d.resume();});l.on("error",u),l.on("timeout",()=>l.destroy(new Error(`HTTP mirror timed out after ${r}ms`))),l.write(s),l.end();})}function de(n,t){try{existsSync$1(N)||mkdirSync$1(N,{recursive:!0}),appendFileSync(join(N,"http-errors.log"),`${new Date().toISOString()} | ${n} | ${t.message}
2
+ `);}catch{}}function dt(n){return new Promise(t=>setTimeout(t,n))}var ye=1e4,gt=3e4,C=500,M=class{constructor(t){this.retryScheduled=false;this.metricAggregationScheduled=false;this.apiUrl=t?.apiUrl,this.cacheDir=t?.cacheDir??join$1(process.env.DEVFLOW_STATE_DIR??join$1(homedir$1(),".devflow","global"),"telemetry-cache"),this.legacyCacheDir=t?.legacyCacheDir??(t?.cacheDir?null:join$1(homedir$1(),".devflow","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,r,o,i=process.env.CLAUDE_PROJECT_DIR??process.cwd(),s=[]){let c={executionId:t,sessionId:e,skillName:r,startedAt:o,projectRoot:i,requiredMcpTools:s};this.commitOrCache("execution_start",c)&&this.postHttp("/api/telemetry/skill-execution/start",c);}async sendExecutionComplete(t,e="completed",r=Date.now(),o){let i={executionId:t,status:e,finishedAt:r,metadata:o},s=this.commitOrCache("execution_complete",i);return s&&this.postHttp("/api/telemetry/skill-execution/complete-reconciled",i),s}async sendSessionStart(t,e,r){let o={id:t,projectRoot:e,startedAt:r,label:e.split("/").pop()??"unknown"},i=this.commitOrCache("session_start",o);return i&&this.postHttp("/api/telemetry/sessions",o),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 r={sessionId:t,finishedAt:e},o=this.commitOrCache("session_end",r);return o&&(this.getDatabase().aggregatePendingToolMetrics(),this.postHttp(`/api/telemetry/sessions/${encodeURIComponent(t)}/close`,{finishedAt:e})),o}async flushCache(){try{let r=this.getDatabase(),o=r.listTelemetryFailures({unresolvedOnly:!0,limit:C}).reverse();for(let i of o)try{this.applyOperation(i.operation,i.payload),r.resolveTelemetryFailure(i.id);}catch{}r.trimTelemetryFailures(C);}catch{}let e=[...new Set([this.cacheDir,this.legacyCacheDir].filter(r=>!!r))].filter(r=>existsSync(r)).flatMap(r=>readdirSync(r).filter(o=>o.endsWith(".json")).map(o=>{let i=join$1(r,o);try{return {cacheFile:i,envelope:ft(JSON.parse(readFileSync$1(i,"utf8")),o)}}catch{return null}})).filter(r=>r!==null).sort((r,o)=>r.envelope.timestamp-o.envelope.timestamp||he(r.envelope.operation)-he(o.envelope.operation));for(let{cacheFile:r,envelope:o}of e)try{let i=this.getDatabase();i.insertTelemetryFailure({id:o.id,operation:o.operation,payload:o.payload,error:o.failure,createdAt:o.timestamp}),this.applyOperation(o.operation,o.payload),i.resolveTelemetryFailure(o.id),unlinkSync(r);}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(r){return this.cacheOperation(t,e,r),false}}applyOperation(t,e){let r=this.getDatabase();switch(t){case "tool_call":this.ensureParentSession(r,e),r.insertToolCallEvent(e);return;case "execution_start":this.ensureParentSession(r,e),r.insertSkillExecution({executionId:e.executionId,sessionId:e.sessionId,skillName:e.skillName,startedAt:e.startedAt,status:"running",requiredMcpTools:e.requiredMcpTools});return;case "execution_complete":r.reconcileSkillExecution(e.executionId,e.status,e.finishedAt,e.metadata);return;case "session_start":r.ensureSession(e),r.insertRun({id:ve(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(!r.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":r.closeSession(e.sessionId,e.finishedAt),r.updateRun(ve(e.sessionId),{status:"completed",finishedAt:e.finishedAt});return}}ensureParentSession(t,e){let r=typeof e.sessionId=="string"?e.sessionId.trim():"";if(!r)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";t.ensureSession({id:r,projectRoot:o,label:o==="unknown"?void 0:o.split("/").pop(),startedAt:Number(e.startedAt??e.timestamp??Date.now())});}cacheOperation(t,e,r){let o=Date.now(),i={id:`failure:${o}:${Math.random().toString(36).slice(2,11)}`,operation:t,payload:e,failure:r instanceof Error?r.message:String(r),timestamp:o};try{let s=this.getDatabase();s.insertTelemetryFailure({id:i.id,operation:t,payload:e,error:i.failure,createdAt:o}),s.trimTelemetryFailures(C),this.scheduleRetry();return}catch{}try{existsSync(this.cacheDir)||mkdirSync(this.cacheDir,{recursive:!0});let s=join$1(this.cacheDir,`${o}_${Math.random().toString(36).slice(2,11)}.json`);writeFileSync(s,JSON.stringify(i,null,2),{mode:384}),this.trimCompatibilityCache(),this.scheduleRetry();}catch{}}trimCompatibilityCache(){try{let t=readdirSync(this.cacheDir).filter(e=>e.endsWith(".json")).sort();for(let e of t.slice(0,Math.max(0,t.length-C)))unlinkSync(join$1(this.cacheDir,e));}catch{}}scheduleRetry(){this.retryScheduled||(this.retryScheduled=true,setTimeout(()=>{this.retryScheduled=false,this.flushCache();},gt).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){ue(t,e,{endpoint:this.apiUrl,fallbackReason:"telemetry_already_committed_locally"});}truncateInput(t){let e=JSON.stringify(t);return e===void 0||e.length<=ye?t:{_truncated:true,_original_size:e.length,_preview:`${e.substring(0,ye)}...`}}};function he(n){return ["session_start","execution_start","tool_call","complete_event","execution_complete","session_end"].indexOf(n)}function ve(n){return `hook-run:${n}`}function ft(n,t){if(!n||typeof n!="object")throw new Error("Invalid telemetry cache envelope");let e=n;if(typeof e.operation=="string"&&e.payload!==void 0)return e;let r=e.type==="tool_call"?"tool_call":e.type==="execution_start"?"execution_start":null;if(!r)throw new Error("Unknown legacy telemetry cache operation");let o=e.payload??{},i=Number(o.timestamp??o.startedAt??Date.now());return {id:`legacy-cache:${t}`,operation:r,payload:o,failure:"Replayed legacy HTTP-first telemetry cache entry",timestamp:i}}var yt=/^\/(?:devflow:)?[\w-]+\b\s*/iu,ht=/\b(?:(?:do\s+not|don't|dont|never|not)(?:\s+need\s+to)?|no\s+need\s+to)\s+(?:please\s+)?(?:remember|memorize)\b|(?:不要|别|不用|无需|不必|不需要)(?:再)?(?:记住|记|记忆)/iu,vt=/(?:^|[.!?]\s*)(?:(?:please|kindly)\s+)?(?:remember|memorize|save\s+this|store\s+this|note\s+that)(?:\s+(?:that|to))?[\s:,-]*(.+)$/iu,It=/(?:^|[。!?;,,]\s*)(?:(?:请|麻烦|务必|一定要|帮我|帮忙|需要)\s*)?(?:记住|记一下|记下来|记|记录一下|记录下来|保存一下|保存下来)(?:这(?:件事|一点|个信息|些内容))?[\s::,,]*(.+)$/iu;function T(n){let t=n.trim().replace(yt,"").trim();return !t||ht.test(t)?null:(It.exec(t)??vt.exec(t))?.[1]?.trim().replace(/^[::,,\s]+/u,"")||null}var O=1,Et="memory-snapshot-v1.json",xt=512*1024,we=256*1024,ke=2e3,Dt=500,At=10,Ct=240,Mt=300*1e3,Tt=720*60*60*1e3,Ot=2147483647;function Pt(n){return n.currentUid===void 0?{ownerSafe:true,modeSafe:true}:{ownerSafe:n.ownerUid===n.currentUid,modeSafe:(n.mode&18)===0}}function S(n){return resolve(n)}function _(n){return createHash$1("sha256").update(S(n)).digest("hex").slice(0,16)}function jt(n,t={}){let e=_(n),r=t.stateRoot?join(t.stateRoot,e):getProjectStateDir(S(n));return join(r,Et)}function $t(n,t){let r=(n instanceof Error?n.message:"").replace(/[\r\n\t]+/gu," ").trim().slice(0,160);return r?`${t}:${r}`:t}function F(n,t){return Array.isArray(n)&&n.length<=t&&n.every(e=>typeof e=="string"&&e.length>0&&e.length<=512)}function Nt(n){if(!n||typeof n!="object"||Array.isArray(n))return false;let t=n;return typeof t.id=="string"&&t.id.length>0&&t.id.length<=512&&typeof t.kind=="string"&&t.kind.length>0&&t.kind.length<=128&&(t.family===void 0||typeof t.family=="string"&&t.family.length>0&&t.family.length<=256)&&(t.entity===void 0||typeof t.entity=="string"&&t.entity.length>0&&t.entity.length<=256)&&F(t.memoryIds,100)&&(t.status==="withheld"||t.status==="resolved")&&(t.summary===void 0||typeof t.summary=="string"&&t.summary.length<=2e3)}function Ht(n){if(!n||typeof n!="object"||Array.isArray(n))return false;let t=n;return typeof t.reason=="string"&&t.reason.length>0&&t.reason.length<=512&&(t.stale===void 0||typeof t.stale=="boolean")}function _e(n,t,e){if(!n||typeof n!="object"||Array.isArray(n))return null;let r=n,o=S(t),i=_(o),s=r.generation===void 0?0:r.generation;return r.version!==O||r.projectRoot!==o||r.projectHash!==i||typeof r.markdown!="string"||Buffer.byteLength(r.markdown,"utf8")>we||!F(r.memoryIds,ke)||!Array.isArray(r.conflicts)||r.conflicts.length>Dt||!r.conflicts.every(Nt)||typeof r.generatedAt!="number"||!Number.isFinite(r.generatedAt)||r.generatedAt<0||r.generatedAt>e+Mt||!Number.isInteger(s)||s<0||s>Ot||!["ready","pending","degraded","disabled"].includes(String(r.status))||r.degradation!==void 0&&!Ht(r.degradation)?null:{...r,generation:s}}function Ft(n,t,e,r,o=0){let i=S(n);return {version:O,projectRoot:i,projectHash:_(i),markdown:"",memoryIds:[],conflicts:[],generatedAt:r,generation:o,status:t,degradation:{reason:e}}}function Lt(n,t={}){let e=t.now??Date.now(),r=jt(n,t),o;try{o=openSync(r,constants.O_RDONLY|constants.O_NOFOLLOW);let i=fstatSync(o);if(!i.isFile()||i.size<=0||i.size>xt)throw new Error("cache_size_invalid");let s=Pt({...typeof process.getuid=="function"?{currentUid:process.getuid()}:{},ownerUid:i.uid,mode:i.mode});if(!s.ownerSafe)throw new Error("cache_owner_invalid");if(!s.modeSafe)throw new Error("cache_permissions_unsafe");let c=JSON.parse(readFileSync(o,"utf8")),a=_e(c,n,e);if(!a)throw new Error("cache_schema_invalid");return a.status==="ready"&&e-a.generatedAt>Tt?{snapshot:{...a,status:"degraded",degradation:{reason:"cache_stale",stale:!0}},source:"cache",valid:!0,stale:!0}:{snapshot:a,source:"cache",valid:!0,stale:!1}}catch(i){let c=i.code==="ENOENT";return {snapshot:Ft(n,c?"pending":"degraded",c?"cache_missing":$t(i,"cache_invalid"),e),source:"none",valid:false,stale:false}}finally{if(o!==void 0)try{closeSync(o);}catch{}}}function qt(n){if(!n)return true;try{return JSON.parse(readFileSync(n,"utf8")).sessionStart?.injectMemories??!0}catch{return true}}function Ut(n,t,e){if(!t.trim())return null;try{let r=JSON.parse(t);if(r.status!=="ok"&&r.status!=="degraded")return null;if(r.enabled===!1){let i=S(n);return {version:O,projectRoot:i,projectHash:_(i),markdown:"",memoryIds:[],conflicts:[],generatedAt:e,generation:0,status:"disabled"}}let o=_e(r.snapshot,n,e);if(o)return o;if(r.status==="ok"&&typeof r.markdown=="string"&&r.markdown.length>0&&Buffer.byteLength(r.markdown,"utf8")<=we){let i=S(n);return {version:O,projectRoot:i,projectHash:_(i),markdown:r.markdown,memoryIds:F(r.memoryIds,ke)?r.memoryIds:[],conflicts:[],generatedAt:e,generation:0,status:"ready"}}}catch{}return null}function H(n,t){return [...(n??t).replace(/[\r\n\t|]+/gu," ").trim()||t].slice(0,Ct).join("")}function Jt(n){if(n.length===0)return "";let t=n.slice(0,At),e=t.map(r=>{let o=H(r.family,"unknown"),i=H(r.entity,"unknown"),s=H(r.summary,"Explicit choice required.");return `- family=${o}; entity=${i}; status=${r.status}; summary=${s}`});return n.length>t.length&&e.push(`- ${n.length-t.length} additional conflict(s) omitted from SessionStart output.`),`## Withheld preference conflicts (${n.length})
3
+ ${e.join(`
4
+ `)}`}function zt(n){let t=n.now??Date.now();if(qt(n.configPath)===false)return "";let e=Ut(n.projectRoot,n.daemonResponse??"",t),r=e?{snapshot:e,source:"daemon"}:Lt(n.projectRoot,{...n.cacheOptions,now:t}),{snapshot:o}=r;if(o.status==="disabled")return `## Project memory
5
+ DevFlow memory snapshot=pending; source=${r.source}; reason=previous_snapshot_disabled. Memory availability is not yet known; do not conclude that the project has no memories.`;let i=new Date(o.generatedAt).toISOString(),s=o.degradation?.reason?`; reason=${o.degradation.reason}`:"",c=`DevFlow memory snapshot=${o.status}; source=${r.source}; generatedAt=${i}${s}.`,a=Jt(o.conflicts);return o.markdown?[o.markdown,a,c].filter(Boolean).join(`
6
+ `):["## Project memory",a,`${c} Memory availability is not yet known; do not conclude that the project has no memories.`].filter(Boolean).join(`
7
+ `)}if(process.env.DEVFLOW_MEMORY_SNAPSHOT_CLI==="1"){let[,,n,t,e]=process.argv;n!=="session-start"||!t?process.exitCode=2:process.stdout.write(zt({projectRoot:t,configPath:e,daemonResponse:process.env.DEVFLOW_MEMORY_RESPONSE}));}var Gt=/^(?:ok(?:ay)?|yes|no|thanks?|thank you|continue|好的?|可以|行|是|否|谢谢|继续|收到|明白了?)[.!。!\s]*$/iu;function Bt(n){let t=n.trim();return t.length>0&&!Gt.test(t)}function Vt(n,t,e=Date.now()){let r=createHash$1("sha256").update(t.trim()).digest("hex"),o=createHash$1("sha256").update(`${n}\0${e}\0${r}`).digest("hex").slice(0,24);return {turnId:`turn:${o}`,eventId:`memory-turn:${o}`,promptHash:r,createdAt:e}}function Kt(n,t,e=[]){return `memory-receipt:${createHash$1("sha256").update(`${n}\0${t}\0${[...e].sort().join("\0")}`).digest("hex").slice(0,24)}`}function Qt(n){return `DevFlow memory decision required for ${n.turnId}. Before the final response, semantically decide whether this turn contains durable project knowledge. Call mcp__devflow__memory_commit_turn with evidence-bound candidates, or mcp__devflow__memory_skip_turn with a concrete reason. Do not claim memory success without a canonical receipt. For candidates, copy exact evidenceSpans from this user prompt, preserve package names, flags, versions, paths, and identifiers, and provide subject, predicate, value, polarity, and entities when known. Do not save assistant echoes, task narration, retries, or unverified guesses. Express a change from an old choice as the new durable value. If the decision tool remains unavailable, explicitly state that the memory was not saved.`}function Re(n){let t=n.memoryIds.length>0?n.memoryIds.join(","):"none",e=n.status==="committed"?"accepted":n.status,r=n.status==="committed"?"; indexStatus=pending":"",o=n.memoryIds.some(c=>c.startsWith("raw-memory:")),i=n.status==="committed"&&n.source==="explicit_intent"&&!o?"; memoryOnlyCompleted=true; skipProjectContext=true; hostRefinementRequired=true":n.status==="committed"&&n.source==="explicit_intent"?"; asyncReadiness=queued; hostRefinementRequired=true":"",s=n.status==="committed"&&n.source==="explicit_intent"?` The deterministic explicit-memory save is complete and remains authoritative if refinement fails. Before the final response, call mcp__devflow__memory_commit_turn once with turnId=${n.turnId} and semantic candidates. Split every distinct reusable fact into a durable_memory candidate, classify instructions that apply only to this turn as turn_constraint, and include evidenceSpans copied verbatim from the user prompt for every candidate. Preserve exact flags, package names, versions, paths, and identifiers. Keep narrative and value in the user prompt language; do not translate evidence into a different surface form. The tool refines the existing receipt idempotently; it must not create native Claude memory. If refinement is unavailable, return the existing canonical receipt without claiming refinement.`:"";return `DevFlow canonical memory receipt: status=${e}; receiptId=${n.receiptId??"missing"}; turnId=${n.turnId}; memoryIds=${t}; source=${n.source??"unknown"}${r}${i}.`+s}function Ee(n){if(!Bt(n.prompt))return null;let t=openGlobalDevFlowDatabase(void 0,{busyTimeoutMs:50});try{let e=n.prompt.trim().slice(0,4e3),r=createHash$1("sha256").update(e).digest("hex"),o=t.listMemoryTurns(n.projectRoot,n.sessionId,5).find(u=>u.promptHash===r&&Date.now()-u.createdAt<1e4),i=o?{turnId:o.turnId,eventId:o.eventId,promptHash:o.promptHash,createdAt:o.createdAt}:n.identity??Vt(n.sessionId,e),s=o??t.beginMemoryTurn({...i,projectRoot:n.projectRoot,sessionId:n.sessionId});if(s.status!=="pending")return {turn:s,additionalContext:Re(s),skipSkillRouting:s.source==="explicit_intent"};let c=T(e)??void 0,a=c?"commit_explicit":"capture_prompt";if(t.enqueueWork({idempotencyKey:`memory-turn:${a}:${s.turnId}`,kind:c?"memory.explicit_commit":"memory.turn_capture",projectRoot:n.projectRoot,sessionId:n.sessionId,turnId:s.turnId,payload:{operation:a,turnId:s.turnId,eventId:s.eventId,sessionId:n.sessionId,prompt:e,explicitContent:c,createdAt:s.createdAt}}),c){let u=`raw-memory:${createHash$1("sha256").update(`${n.projectRoot}\0${i.turnId}\0${c}`).digest("hex").slice(0,24)}`,l=Kt(s.turnId,"committed",[u]),d=t.commitMemoryTurn({turnId:s.turnId,receiptId:l,memoryIds:[u],source:"explicit_intent",reason:"explicit_raw_queued",decidedAt:Date.now()});return emitSemanticControlLog({event:"memory.write.completed",identity:{projectRoot:n.projectRoot,sessionId:n.sessionId,turnId:s.turnId,actionReceipt:l},level:"info",timestamp:Date.now(),data:{stage:"explicit_fast_ack",durable:!0,rawMemoryId:u,receiptLatencyMs:Date.now()-i.createdAt,asyncReadiness:"queued"}}),{turn:d,explicitContent:c,additionalContext:Re(d),skipSkillRouting:!0}}return {turn:s,explicitContent:c,additionalContext:Qt(s),skipSkillRouting:!1}}finally{t.close();}}function De(n,t){let e=tn(n);mkdirSync$1(e,{recursive:true,mode:448});let r=`memory-turn-spool-${Date.now()}-${process.pid}-${randomUUID$1()}`,o=join(e,`${r}.json`),i=`${o}.tmp`;return writeFileSync$1(i,JSON.stringify({...t,prompt:t.prompt.trim().slice(0,4e3)}),{mode:384}),renameSync$1(i,o),r}function tn(n){return join(k(n),"memory-turn-pending")}function Ae(n){let t=Date.now();try{let e=openGlobalDevFlowDatabase(void 0,{busyTimeoutMs:100});try{let r=`context-prefetch:${createHash$1("sha256").update(`${n.projectRoot}\0${n.sessionId}\0${n.executionId}\0${on(n.prompt)}\0${n.profileFingerprint}`).digest("hex")}`,o=e.enqueueWork({idempotencyKey:r,kind:"context.prefetch",projectRoot:n.projectRoot,sessionId:n.sessionId,payload:n,maxAttempts:3});return h("prefetch_queue",{projectRoot:n.projectRoot,skillName:n.skillName,accepted:!0,workState:o.state,latencyMs:Date.now()-t}),{accepted:!0,workItemId:o.id}}finally{e.close();}}catch(e){let r=e instanceof Error?e.message:String(e);return h("prefetch_queue",{projectRoot:n.projectRoot,skillName:n.skillName,accepted:false,reason:r,latencyMs:Date.now()-t}),{accepted:false,reason:r}}}function on(n){return n.trim().toLowerCase().replace(/\s+/g," ").slice(0,4e3)}function Me(n){let t=Date.now(),e=kn(n.projectRoot),r=claudeCodeRuntimeAdapter.normalizePrompt(n.hostEvent??{session_id:n.sessionId,prompt:n.prompt},{projectRoot:e}),o=r.sourceHash,i=openGlobalDevFlowDatabase(void 0,{busyTimeoutMs:100});try{let s=i.getTaskIntentArtifactBySource({projectRoot:e,sessionId:n.sessionId,sourceHash:o});if(s){let w=pn(i,s);return {artifact:hn(s),queryPlan:vn(w),memoryIdentity:Ce(s),reused:!0}}let c=Sn(r.rawPrompt,r.command),a=buildRetrievalTaskPlan({query:c,parsedIntent:parseIntent(c,{segmentation:"regex"}),targetAnchors:In(r.rawPrompt),activeSkill:r.activeSkill,command:r.command}),u=`turn:${E(`${n.sessionId}\0${o}`)}`,l=`request:${E(`${e}\0${n.sessionId}\0${u}`)}`,d={projectRoot:e,projectId:`project:${E(e)}`,hostId:r.hostId,sessionId:n.sessionId,turnId:u,requestId:l},g=[{source:"deterministic_parser",field:"intent",value:a.intent,reason:a.classification.intentReason,confidence:a.classification.intentSource==="semantic_override"?.95:.75},{source:r.command?"slash_command":"deterministic_parser",field:"action",value:a.action,reason:a.classification.actionReason,confidence:r.command||a.action!=="analyze"?.95:.65},...a.targetAnchors.map(w=>({source:"target_anchor",field:"target",value:w,reason:"explicit_prompt_target",confidence:1}))],v={identity:d,version:1,rawPrompt:r.rawPrompt,normalizedPrompt:wn(r.rawPrompt),...r.command?{command:r.command}:{},slashArgs:r.slashArgs,...r.activeSkill?{activeSkill:r.activeSkill}:{},intent:a.intent,action:a.action,entities:a.entities,targetAnchors:a.targetAnchors,policyConstraints:bn(r.rawPrompt),classificationEvidence:g,sourceEventIds:[r.sourceEventId??`host-event:${o.slice(0,24)}`],sourceHash:o,createdAt:r.timestamp},m={...v,artifactHash:_n(v)},y=buildChannelQueryPlan({artifact:m,taskPlan:a,expandedTerms:n.expandedTerms});i.appendTaskIntentArtifact(fn(m)),i.appendChannelQueryPlan(yn(y));let Pe=gn(i,m);return emitSemanticControlLog({event:"host.prompt.normalized",identity:d,level:"info",timestamp:Date.now(),data:{sourceHash:o,command:m.command,activeSkill:m.activeSkill,rawPromptBytes:Buffer.byteLength(m.rawPrompt)}}),emitSemanticControlLog({event:"intent.artifact.created",identity:d,level:"info",timestamp:Date.now(),data:{artifactHash:m.artifactHash,intent:m.intent,action:m.action,evidence:m.classificationEvidence,entityCount:m.entities.length,targetCount:m.targetAnchors.length}}),emitSemanticControlLog({event:"intent.artifact.persisted",identity:d,level:"info",timestamp:Date.now(),data:{artifactHash:m.artifactHash,version:m.version,sourceHash:m.sourceHash,parserMode:"regex",captureLatencyMs:Date.now()-t}}),emitSemanticControlLog({event:"query.plan.created",identity:d,level:"info",timestamp:Date.now(),data:{planHash:y.planHash,sourceIntentHash:y.sourceIntentHash,generatedBy:y.generatedBy,codeQueries:y.code.length,memoryQueries:y.memory.length,knowledgeQueries:y.knowledge.length,knowledgeDisposition:y.knowledge.map(w=>w.requirement)}}),emitSemanticControlLog({event:"terminal.transition.persisted",identity:d,level:"info",timestamp:Date.now(),data:{state:"intent_bound",receiptId:Pe,sourceIntentHash:m.artifactHash}}),{artifact:m,queryPlan:y,memoryIdentity:Ce(m),reused:!1}}finally{i.close();}}function pn(n,t){let e=n.getChannelQueryPlanForIntent({projectRoot:t.projectRoot,sessionId:t.sessionId,turnId:t.turnId,sourceIntentHash:t.artifactHash});if(!e)throw new Error(`QUERY_PLAN_NOT_FOUND:${t.artifactHash}`);return e}function gn(n,t){let e=n.getLatestTerminalTransition(t.identity.projectRoot,t.identity.sessionId,t.identity.turnId);if(e)return e.receiptId;let r=`terminal:${E(`${t.artifactHash}\0open`)}`;return n.appendTerminalTransition({...t.identity,sequence:1,toState:"open",receiptId:r,reason:"host_prompt_accepted",payload:{sourceHash:t.sourceHash},createdAt:t.createdAt}),n.appendTerminalTransition({...t.identity,sequence:2,fromState:"open",toState:"intent_bound",receiptId:`terminal:${E(`${t.artifactHash}\0intent_bound`)}`,sourceReceiptId:r,reason:"immutable_intent_persisted",payload:{intentArtifactHash:t.artifactHash},createdAt:Math.max(t.createdAt,Date.now())}).receiptId}function fn(n){return {...n.identity,version:n.version,supersedesHash:n.supersedesHash,rawPrompt:n.rawPrompt,normalizedPrompt:n.normalizedPrompt,command:n.command,slashArgs:n.slashArgs,activeSkill:n.activeSkill,intent:n.intent,action:n.action,entities:n.entities,targetAnchors:n.targetAnchors,policyConstraints:n.policyConstraints,classificationEvidence:n.classificationEvidence.map(t=>({...t})),sourceEventIds:n.sourceEventIds,sourceHash:n.sourceHash,artifactHash:n.artifactHash,createdAt:n.createdAt}}function yn(n){return {...n.identity,sourceIntentHash:n.sourceIntentHash,planHash:n.planHash,code:n.code.map(t=>({...t})),memory:n.memory.map(t=>({...t})),knowledge:n.knowledge.map(t=>({...t})),generatedBy:n.generatedBy,degradation:n.degradation?{...n.degradation}:void 0,createdAt:n.createdAt}}function hn(n){return {identity:Te(n),version:n.version,...n.supersedesHash?{supersedesHash:n.supersedesHash}:{},rawPrompt:n.rawPrompt,normalizedPrompt:n.normalizedPrompt,...n.command?{command:n.command}:{},slashArgs:n.slashArgs,...n.activeSkill?{activeSkill:n.activeSkill}:{},intent:n.intent,action:n.action,entities:n.entities,targetAnchors:n.targetAnchors,policyConstraints:n.policyConstraints,classificationEvidence:n.classificationEvidence,sourceEventIds:n.sourceEventIds,sourceHash:n.sourceHash,artifactHash:n.artifactHash,createdAt:n.createdAt}}function vn(n){return {identity:Te(n),sourceIntentHash:n.sourceIntentHash,planHash:n.planHash,code:n.code,memory:n.memory,knowledge:n.knowledge,generatedBy:n.generatedBy,...n.degradation?{degradation:n.degradation}:{},createdAt:n.createdAt}}function Te(n){return {projectRoot:n.projectRoot,projectId:n.projectId,hostId:n.hostId,sessionId:n.sessionId,turnId:n.turnId,requestId:n.requestId,...n.executionId?{executionId:n.executionId}:{}}}function Ce(n){let t=n.rawPrompt.trim().slice(0,4e3);return {turnId:n.identity?n.identity.turnId:n.turnId,eventId:`memory-turn:${(n.identity?n.identity.turnId:n.turnId).replace(/^turn:/u,"")}`,promptHash:createHash$1("sha256").update(t).digest("hex"),createdAt:n.createdAt}}function In(n){let t=n.match(/(?:^|[\s`'"(])((?:\.{0,2}\/)?(?:[A-Za-z0-9_@.-]+\/)+[A-Za-z0-9_@.-]+(?:\.[A-Za-z0-9]+)?)/gu)??[];return Oe(t.map(e=>e.trim().replace(/^[`'"(]+|[`'"),.;:,。;:]+$/gu,"")).filter(e=>!e.startsWith("/")||/\.[A-Za-z0-9]+$/u.test(e))).slice(0,16)}function bn(n){let t=n.match(/--[a-z0-9][a-z0-9-]*(?:=[^\s,。;;]+)?/giu)??[];return Oe(t.map(e=>e.normalize("NFKC"))).slice(0,16)}function Sn(n,t){return t&&n.trimStart().replace(new RegExp(`^\\/${Rn(t)}\\b`,"iu"),"").trim()||n.trim()}function wn(n){return n.normalize("NFKC").replace(/\s+/gu," ").trim().slice(0,4e3)}function Oe(n){return [...new Set(n.filter(Boolean))]}function kn(n){let t=resolve(n);try{return realpathSync(t)}catch{return t}}function _n(n){return createHash$1("sha256").update(L(n)).digest("hex")}function E(n){return createHash$1("sha256").update(n).digest("hex").slice(0,24)}function L(n){if(n===null||typeof n=="string"||typeof n=="boolean")return JSON.stringify(n);if(typeof n=="number")return Number.isFinite(n)?JSON.stringify(n):"null";if(Array.isArray(n))return `[${n.map(L).join(",")}]`;if(!n||typeof n!="object")return JSON.stringify(String(n));let t=n;return `{${Object.keys(t).sort().map(e=>`${JSON.stringify(e)}:${L(t[e])}`).join(",")}}`}function Rn(n){return n.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&")}var f=process.env.CLAUDE_PROJECT_DIR||process.cwd();async function Dn(n){let t=J()?[U]:[],e;try{e=JSON.parse(n);}catch{return {hookSpecificOutput:{hookEventName:"UserPromptSubmit",permissionDecision:"allow",...t.length?{additionalContext:t.join(`
8
+ `)}:{}}}}let r=e.prompt||"";if(!r.trim())return {hookSpecificOutput:{hookEventName:"UserPromptSubmit",permissionDecision:"allow",...t.length?{additionalContext:t.join(`
9
+ `)}:{}}};let o=e.session_id?.trim(),i=te(r),s=false,c,a,u=o?new D(f):void 0;if(o){try{a=Me({projectRoot:f,sessionId:o,prompt:r,hostEvent:e}),u.bindTaskIdentity(o,{turnId:a.artifact.identity.turnId,requestId:a.artifact.identity.requestId,intentArtifactHash:a.artifact.artifactHash}),t.push(`DevFlow immutable task identity: turnId=${a.artifact.identity.turnId}; requestId=${a.artifact.identity.requestId}; intent=${a.artifact.intent}; action=${a.artifact.action}; intentArtifactHash=${a.artifact.artifactHash}. Retrieval query expansion must not replace this original intent.`);}catch(l){t.push("DevFlow task intent persistence degraded; preserve the original user command and do not claim canonical context binding."),emitSemanticControlLog({event:"intent.artifact.failed",identity:{projectRoot:f,sessionId:o},level:"error",timestamp:Date.now(),data:{stage:"user_prompt_submit",category:"intent_persistence_unavailable",error:l instanceof Error?l.message:String(l)}});}try{let l=Ee({projectRoot:f,sessionId:o,prompt:r,...a?{identity:a.memoryIdentity}:{}});l&&(t.push(l.additionalContext),s=l.skipSkillRouting);}catch(l){s=!!T(r);try{let d=De(f,{sessionId:o,prompt:r,createdAt:Date.now()});t.push(`DevFlow memory turn status=accepted; durable=true; receiptId=${d}; canonicalMemory=false; SQLite queue replay pending. Do not claim memory success without a canonical receipt.`),emitSemanticControlLog({event:"memory.write.degraded",identity:{projectRoot:f,sessionId:o},level:"warn",timestamp:Date.now(),data:{stage:"turn_capture",reason:l.message,fallback:"durable_spool",receiptId:d}});}catch(d){t.push("DevFlow memory turn status=degraded; durable=false; no canonical receipt exists. Do not claim memory success."),emitSemanticControlLog({event:"memory.write.degraded",identity:{projectRoot:f,sessionId:o},level:"error",timestamp:Date.now(),data:{stage:"turn_capture",reason:d.message,fallback:"none"}});}}}if(o&&i&&!s){let l=u.get(o)?.executionId,d=u.startExecution(o,i.skillName,re(i.skillName));if(c=d.executionId,d.executionId&&d.executionId!==l){let v=new M;try{await v.sendSessionStart(o,f,d.startedAt),await v.sendExecutionStart(d.executionId,o,i.skillName,d.lastActivityAt,f,d.requiredMcpTools);}finally{v.close();}}let g=oe(i.skillName,f,r);g&&t.push(g);}if(o&&i&&c&&!s){let l=resolveProjectCapabilityProfile(f),d=resolveCapabilityRollout(f).config.retrievalSessions;Ae({prompt:r.trimStart().replace(/^\/devflow:[a-z0-9][a-z0-9-]*\b/i,"").trim()||r,projectRoot:f,sessionId:o,executionId:c,skillName:i.skillName,profileFingerprint:l.fingerprint,rolloutMode:d,retrievalVersion:"r2.v1",createdAt:Date.now()});}return {hookSpecificOutput:{hookEventName:"UserPromptSubmit",permissionDecision:"allow",...t.length?{additionalContext:t.join(`
10
+ `)}:{}}}}if(process.argv[1]?.endsWith("user-prompt-submit")||process.argv[1]?.endsWith("user-prompt-submit.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 Dn(t.trim()||process.argv[2]||"");n(JSON.stringify(e)),process.exit(0);}),process.stdin.on("error",()=>{n(JSON.stringify({hookSpecificOutput:{hookEventName:"UserPromptSubmit",permissionDecision:"allow"}})),process.exit(0);}),setTimeout(()=>{n(JSON.stringify({hookSpecificOutput:{hookEventName:"UserPromptSubmit",permissionDecision:"allow"}})),process.exit(0);},3e4).unref();}export{Dn as handleUserPromptSubmit};
@@ -189,6 +189,19 @@ run_lifecycle() {
189
189
  DAEMON_PID=$!
190
190
  DEVFLOW_DAEMON_LAUNCHING=1
191
191
  echo "[devflow] Hook daemon started for ${PROJECT_ROOT} (PID ${DAEMON_PID})" >&2 || true
192
+
193
+ # Close the startup race between SessionStart and the first user prompt.
194
+ # Registration is idempotent and the durable spool remains authoritative if
195
+ # the bounded readiness window expires on a slow host.
196
+ if [ -n "$SESSION_START_INPUT" ]; then
197
+ for _ in 1 2 3 4 5 6 7 8; do
198
+ if register_session 1; then
199
+ DEVFLOW_DAEMON_LAUNCHING=0
200
+ break
201
+ fi
202
+ sleep 0.05
203
+ done
204
+ fi
192
205
  fi
193
206
 
194
207
  if [ -n "$SESSION_START_INPUT" ] \