@devflow-tools/devflow 0.17.1 → 0.17.3
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.
- package/dist/dashboard/404.html +1 -1
- package/dist/dashboard/accuracy.html +1 -1
- package/dist/dashboard/accuracy.txt +1 -1
- package/dist/dashboard/benchmark.html +1 -1
- package/dist/dashboard/benchmark.txt +1 -1
- package/dist/dashboard/context.html +1 -1
- package/dist/dashboard/context.txt +1 -1
- package/dist/dashboard/doctor.html +1 -1
- package/dist/dashboard/doctor.txt +1 -1
- package/dist/dashboard/executions.html +1 -1
- package/dist/dashboard/executions.txt +1 -1
- package/dist/dashboard/graph.html +1 -1
- package/dist/dashboard/graph.txt +1 -1
- package/dist/dashboard/index.html +1 -1
- package/dist/dashboard/index.txt +1 -1
- package/dist/dashboard/knowledge.html +1 -1
- package/dist/dashboard/knowledge.txt +1 -1
- package/dist/dashboard/memory.html +1 -1
- package/dist/dashboard/memory.txt +1 -1
- package/dist/dashboard/replay.html +1 -1
- package/dist/dashboard/replay.txt +1 -1
- package/dist/dashboard/runs/_.html +1 -1
- package/dist/dashboard/runs/_.txt +1 -1
- package/dist/dashboard/runs.html +1 -1
- package/dist/dashboard/runs.txt +1 -1
- package/dist/dashboard/settings.html +1 -1
- package/dist/dashboard/settings.txt +1 -1
- package/dist/dashboard/timeline.html +1 -1
- package/dist/dashboard/timeline.txt +1 -1
- package/dist/dashboard/tool-metrics.html +1 -1
- package/dist/dashboard/tool-metrics.txt +1 -1
- package/dist/dashboard/workflows.html +1 -1
- package/dist/dashboard/workflows.txt +1 -1
- package/dist/hooks/hook-daemon.js +25 -25
- package/dist/hooks/memory-snapshot-cache.js +1 -1
- package/dist/hooks/post-tool-use-failure.js +2 -2
- package/dist/hooks/post-tool-use.js +6 -5
- package/dist/hooks/pre-tool-use.js +4 -3
- package/dist/hooks/session-end.js +6 -6
- package/dist/hooks/stop.js +9 -9
- package/dist/hooks/user-prompt-submit.js +9 -14
- package/dist/plugin/.claude-plugin/plugin.json +1 -1
- package/dist/plugin/dist/command-registry.json +5 -5
- package/dist/plugin/dist/hooks/hook-daemon.js +25 -25
- package/dist/plugin/dist/hooks/memory-snapshot-cache.js +1 -1
- package/dist/plugin/dist/hooks/post-tool-use-failure.js +2 -2
- package/dist/plugin/dist/hooks/post-tool-use.js +6 -5
- package/dist/plugin/dist/hooks/pre-tool-use.js +4 -3
- package/dist/plugin/dist/hooks/session-end.js +6 -6
- package/dist/plugin/dist/hooks/stop.js +9 -9
- package/dist/plugin/dist/hooks/user-prompt-submit.js +9 -14
- package/dist/plugin/hooks/session-start +13 -0
- package/dist/plugin/package.json +10 -10
- package/dist/scripts/audit-session-data.js +7 -7
- package/dist/scripts/semantic-reliability-maintenance.js +4 -0
- package/package.json +13 -12
- package/plugin-registry.json +29 -29
- /package/dist/dashboard/_next/static/{vLBS6YwOIH800-9cFmHU7 → nrMrl2fUXZy8i6dKAxj0P}/_buildManifest.js +0 -0
- /package/dist/dashboard/_next/static/{vLBS6YwOIH800-9cFmHU7 → nrMrl2fUXZy8i6dKAxj0P}/_ssgManifest.js +0 -0
|
@@ -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&®isterRuntimeHttpSuccess(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
|
|
1
|
+
import {getLocalApiKey,resolveRuntimeEndpoint,acquireRuntimeHttpCircuit,registerRuntimeHttpSuccess,registerRuntimeHttpFailure,getProjectStateDir,appendTaskRuntimeBoundary,taskSpecFromImmutableIntent}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,realpathSync}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 w(t){return process.env.DEVFLOW_STATE_DIR??getProjectStateDir(_(t))}function z(t){return Buffer.from(t,"utf8").toString("base64url")}function Ae(t,e,n){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 `${t}:${r}`}return `${t}:legacy-${n}-${randomUUID().slice(0,8)}`}function K(t){return `${t}:legacy-journal`}var I=class{constructor(e){this.projectRoot=e;this.sessions=new Map;this.sessionsDir=join$1(w(e),"hook-sessions");}registerSession(e){let n=e.trim();if(!n)throw new Error("session_id_required");let o=this.get(n);if(o)return o.lastActivityAt=Date.now(),this.persist(o),o;let r=Date.now(),i={sessionId:n,projectRoot:this.projectRoot,requiredMcpTools:[],evidenceObligations:[],evidenceDegradations:[],evidenceOutcomes:[],startedAt:r,lastActivityAt:r};return this.sessions.set(n,i),this.persist(i),i}startExecution(e,n,o){let r=this.registerSession(e);return (!r.executionId||r.skillName!==n)&&(r.executionId=`exec_${Date.now()}_${randomUUID().slice(0,8)}`),r.skillName=n,r.requiredMcpTools=[...new Set(o)],r.lastActivityAt=Date.now(),this.persist(r),r}bindTaskIdentity(e,n){let o=this.registerSession(e);return o.activeTurnId=n.turnId,o.activeRequestId=n.requestId,o.intentArtifactHash=n.intentArtifactHash,o.lastActivityAt=Date.now(),this.persist(o),o}get(e){let n=e.trim();if(!n)return null;let o=this.sessions.get(n);if(o)return this.replayEvidenceJournal(o),o;let r=this.snapshotPath(n);if(!existsSync$1(r))return null;try{let i=JSON.parse(readFileSync$1(r,"utf8"));return i.sessionId!==n||i.projectRoot!==this.projectRoot?null:(i.requiredMcpTools=Array.isArray(i.requiredMcpTools)?i.requiredMcpTools:[],i.evidenceObligations=U(i.evidenceObligations),i.evidenceDegradations=J(i.evidenceDegradations),i.evidenceOutcomes=W(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 o=structuredClone(n);return delete n.executionId,delete n.skillName,n.requiredMcpTools=[],n.lastActivityAt=Date.now(),this.persist(n),o}addEvidenceObligation(e,n,o=Date.now(),r){let i=this.registerSession(e),a=(r?void 0:i.evidenceObligations.find(u=>u.contractId===n.id))?.obligationId??Ae(n.id,r,o);this.appendEvidenceEvent(e,{kind:"add",obligationId:a,contractId:n.id,at:o,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(e){return (this.get(e)?.evidenceObligations??[]).map(n=>structuredClone(n))}markEvidenceCorrection(e,n,o,r,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(r)?r:"";if(!c)return null;this.appendEvidenceEvent(e,{kind:"correction",obligationId:n,contractId:a.contractId,at:i,fingerprint:c,violations:o.slice(0,16).map(d=>d.slice(0,240))},`correction\0${n}\0${c}`),this.replayEvidenceJournal(s),s.lastActivityAt=i,this.persist(s);let u=s.evidenceObligations.find(d=>d.obligationId===n);return u?structuredClone(u):null}resolveEvidenceObligation(e,n){let o=this.get(e);if(!o)return false;let r=o.evidenceObligations.find(s=>s.obligationId===n);if(!r)return false;let i=Date.now();return this.appendEvidenceEvent(e,{kind:"resolve",obligationId:n,contractId:r.contractId,at:i},`resolve\0${n}`),this.replayEvidenceJournal(o),o.lastActivityAt=i,this.persist(o),true}resolveDegradedEvidence(e,n){let o=this.get(e),r=o?.evidenceDegradations.find(s=>s.obligationId===n);if(!o||!r)return false;let i=Date.now();return this.appendEvidenceEvent(e,{kind:"resolve",obligationId:n,contractId:r.contractId,at:i},`resolve-degraded\0${n}\0${i}`),this.replayEvidenceJournal(o),o.lastActivityAt=i,this.persist(o),true}degradeEvidenceObligation(e,n,o,r=Date.now()){let i=this.get(e),s=i?.evidenceObligations.find(c=>c.obligationId===n);if(!i||!s)return false;let a=o.slice(0,240);return this.appendEvidenceEvent(e,{kind:"degrade",obligationId:n,contractId:s.contractId,at:r,reason:a},`degrade\0${n}\0${a}`),this.replayEvidenceJournal(i),i.lastActivityAt=r,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,`${z(e)}.json`)}evidenceJournalDir(e){return join$1(this.sessionsDir,"evidence-journal",z(e))}appendEvidenceEvent(e,n,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,`${n.kind}-${i}.json`);if(existsSync$1(s))return;let a=join$1(r,`.${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=U(e.evidenceObligations),e.evidenceDegradations=J(e.evidenceDegradations),e.evidenceOutcomes=W(e.evidenceOutcomes);let n=this.evidenceJournalDir(e.sessionId);if(!existsSync$1(n))return;let o;try{o=readdirSync(n).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(n,i),"utf8");if(Buffer.byteLength(s,"utf8")>64*1024)return [];let a=Ee(JSON.parse(s));return a?[a]:[]}catch{return []}}).sort((i,s)=>i.at-s.at||B(i.kind)-B(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,n){let o=e.evidenceOutcomes.find(s=>s.obligationId===n.obligationId);if(n.kind==="add"){if(o)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 r=e.evidenceObligations.find(s=>s.obligationId===n.obligationId);if(n.kind==="correction"){if(!r||o||r.correctionFingerprint===n.fingerprint)return;r.attempt+=1,r.correctionRequested=true,r.correctionRequestedAt=n.at,r.correctionFingerprint=n.fingerprint,r.violations=n.violations;return}let i=r?.attempt??o?.attempt??0;if(n.kind==="resolve"&&o?.status==="degraded")e.evidenceOutcomes=e.evidenceOutcomes.filter(s=>s.obligationId!==n.obligationId),e.evidenceDegradations=e.evidenceDegradations.filter(s=>s.obligationId!==n.obligationId);else if(o)return;n.kind==="degrade"?(e.evidenceObligations=e.evidenceObligations.filter(s=>s.obligationId!==n.obligationId),e.evidenceDegradations.push({obligationId:n.obligationId,contractId:n.contractId,reason:n.reason,degradedAt:n.at,attempt:i,contract:r?.contract})):e.evidenceObligations=e.evidenceObligations.filter(s=>s.obligationId!==n.obligationId),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),o=`${n}.${process.pid}.${randomUUID()}.tmp`;writeFileSync$1(o,JSON.stringify(e),{mode:384}),renameSync$1(o,n);}};function U(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)||!V(n.contract))return [];let o=typeof n.obligationId=="string"&&n.obligationId.length>0&&n.obligationId.length<=384?n.obligationId:K(n.contractId),r=typeof n.correctionTranscriptHash=="string"?n.correctionTranscriptHash:void 0,i=n.correctionFingerprint??r;return i!==void 0&&!/^[a-f0-9]{64}$/.test(i)?[]:[{...n,obligationId:o,correctionFingerprint:i}]}).slice(-8):[]}function J(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 W(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 Ee(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 r={obligationId:typeof e.obligationId=="string"&&e.obligationId.length>0&&e.obligationId.length<=384?e.obligationId:K(e.contractId),contractId:e.contractId,at:e.at};if(n==="add")return V(e.contract)?{kind:n,...r,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,...r,fingerprint:i,violations:e.violations}:null}return n==="resolve"?{kind:n,...r}:typeof e.reason=="string"&&e.reason.length<=240?{kind:n,...r,reason:e.reason}:null}function B(t){return t==="add"?0:t==="correction"?1:2}function V(t){if(!t||typeof t!="object")return false;let e=t,n=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(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(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 T(t,e,n){try{let o=openGlobalDevFlowDatabase();try{o.insertEvent({kind:t,timestamp:Date.now(),duration:n,success:e.success!==!1,metadata:e});}finally{o.close();}}catch{}}var Pe=getLocalApiKey(),D=join(homedir(),".devflow","errors");async function k(t,e,n={}){let o=n.endpoint??resolveRuntimeEndpoint().url,r=n.timeout??1500,i=n.durableMirror??true,s=n.maxRetries??(i?0:2),a=n.circuitBreaker??true,c=acquireRuntimeHttpCircuit(o,t);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 Fe(o,t,e,r),a&®isterRuntimeHttpSuccess(o,t).transitioned&&T("http_circuit_transition",{endpoint:o,path:new URL(t,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 qe(Math.min(100*2**l,1e3));}if(!u)return {delivered:false,suppressed:false,fallbackReason:"unknown_http_failure"};if(!a)return ee(t,u),{delivered:false,suppressed:false,fallbackReason:u.message};let d=registerRuntimeHttpFailure(o,t,n.fallbackReason??(i?"local_durable_mirror":"http_delivery_failed"));return d.transitioned&&(ee(t,u),T("http_circuit_transition",{endpoint:o,path:new URL(t,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 Fe(t,e,n,o){return new Promise((r,i)=>{let s=JSON.stringify(n),a=new URL(e,t),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":Pe,"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 ee(t,e){try{existsSync(D)||mkdirSync(D,{recursive:!0}),appendFileSync(join(D,"http-errors.log"),`${new Date().toISOString()} | ${t} | ${e.message}
|
|
2
|
+
`);}catch{}}function qe(t){return new Promise(e=>setTimeout(e,t))}function re(t,e){let n=Ue(t);mkdirSync(n,{recursive:true,mode:448});let o=join(n,`${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 Ue(t){return join(w(t),"session-finalize-pending")}function M(t){let e=Ge(t.projectRoot),n=openGlobalDevFlowDatabase(void 0,{busyTimeoutMs:250});try{let o=Ke(n,{...t,projectRoot:e});return o?appendTaskRuntimeBoundary({projectRoot:o.projectRoot,taskSpec:taskSpecFromImmutableIntent(Ve(o)),kind:t.kind,payload:t.payload,dedupeKey:t.dedupeKey,producer:t.producer,database:n})?.snapshot??null:null}catch(o){return emitSemanticControlLog({event:"task.runtime.shadow_mismatch",identity:{projectRoot:e,sessionId:t.sessionId,...t.turnId?{turnId:t.turnId}:{},...t.requestId?{requestId:t.requestId}:{}},level:"warn",timestamp:Date.now(),data:{stage:t.kind,reason:Ze(o),authority:"legacy"}}),null}finally{n.close();}}function Ge(t){try{return realpathSync(t)}catch{return t}}function se(t){if(!Xe(t.legacyState))return;let e=openGlobalDevFlowDatabase(void 0,{busyTimeoutMs:100});try{let n=e.getTaskRuntimeSnapshot(t.artifact.projectRoot,t.artifact.sessionId,t.artifact.turnId);if(!n)return;let o=Ye(t.legacyState);if(n.terminal===o)return;emitSemanticControlLog({event:"task.runtime.shadow_mismatch",identity:ae(t.artifact),level:"warn",timestamp:Date.now(),data:{stage:"terminal_projection",legacyState:t.legacyState,shadowTerminal:n.terminal,expectedTerminal:o,authority:"legacy"}});}catch{}finally{e.close();}}function Ke(t,e){return t.listLatestTaskIntentArtifacts(e.projectRoot,e.sessionId).find(n=>e.turnId?n.turnId===e.turnId:e.requestId?n.requestId===e.requestId:true)}function Ve(t){return {identity:ae(t),version:t.version,...t.supersedesHash?{supersedesHash:t.supersedesHash}:{},rawPrompt:t.rawPrompt,normalizedPrompt:t.normalizedPrompt,...t.command?{command:t.command}:{},slashArgs:t.slashArgs,...t.activeSkill?{activeSkill:t.activeSkill}:{},intent:t.intent,action:t.action,entities:t.entities,targetAnchors:t.targetAnchors,policyConstraints:t.policyConstraints,classificationEvidence:t.classificationEvidence,sourceEventIds:t.sourceEventIds,sourceHash:t.sourceHash,artifactHash:t.artifactHash,createdAt:t.createdAt}}function ae(t){return {projectRoot:t.projectRoot,projectId:t.projectId,hostId:t.hostId,sessionId:t.sessionId,turnId:t.turnId,requestId:t.requestId,...t.executionId?{executionId:t.executionId}:{}}}function Xe(t){return t==="action_failed"||t==="closed"||t==="closed_with_degradation"||t==="closed_with_retry_work"}function Ye(t){return t==="closed"?"completed":t==="closed_with_degradation"?"completed_with_degradation":t==="closed_with_retry_work"?"retry_pending":"failed"}function Ze(t){return t instanceof Error?t.message:String(t)}var rt=512*1024,it=500;var st=["\u5DE5\u5177\u53D1\u73B0","\u6A21\u578B\u5047\u8BBE","\u9700\u8981\u8FD0\u884C\u65F6\u9A8C\u8BC1"];function le(t){let e=t.runtimeStore??new I(t.projectRoot),n=e.listEvidenceObligations(t.sessionId);if(n.length===0)return at(t,e),null;let o=j(t.transcriptPath,n);if(!o.answer){let s=o.degradationReason??"transcript_answer_unavailable";for(let a of n)e.degradeEvidenceObligation(t.sessionId,a.obligationId,s);return null}let r=o.fingerprint;if(!r){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=ue(o.answer,[s]);if(a.length===0){e.resolveEvidenceObligation(t.sessionId,s.obligationId),x(t,s,"satisfied",r);continue}if(!s.correctionFingerprint){e.markEvidenceCorrection(t.sessionId,s.obligationId,a,r),i.push({obligation:s,violations:a}),x(t,s,"correction_requested",r,a);continue}if(s.correctionFingerprint===r){i.push({obligation:s,violations:a});continue}e.degradeEvidenceObligation(t.sessionId,s.obligationId,"evidence_contract_unresolved"),x(t,s,"degraded",r,a);}return i.length===0?null:ct(i)}function at(t,e){let n=(e.get(t.sessionId)?.evidenceDegradations??[]).filter(i=>i.contract).slice(-8);if(n.length===0)return;let o=n.map(i=>({obligationId:i.obligationId,contractId:i.contractId,contract:i.contract,promptedAt:i.degradedAt,attempt:i.attempt,correctionRequested:true,violations:[]})),r=j(t.transcriptPath,o);if(!(!r.answer||!r.fingerprint))for(let i of o)ue(r.answer,[i]).length>0||e.resolveDegradedEvidence(t.sessionId,i.obligationId)&&x(t,i,"satisfied",r.fingerprint);}function x(t,e,n,o,r=[]){n!=="correction_requested"&&M({projectRoot:t.projectRoot,sessionId:t.sessionId,kind:n==="satisfied"?"verification.succeeded":"verification.failed",payload:{receiptId:e.obligationId,reasonCode:n==="satisfied"?"performance_evidence_satisfied":"performance_evidence_unresolved"},dedupeKey:`${e.obligationId}:${n}:${e.attempt}`,producer:"devflow-evidence-contract"}),emitSemanticControlLog({event:"verification.completed",identity:{projectRoot:t.projectRoot,sessionId:t.sessionId},level:n==="satisfied"?"info":n==="degraded"?"error":"warn",timestamp:Date.now(),data:{stage:"performance_evidence_transition",status:n,contractId:e.contractId,obligationId:e.obligationId,attempt:e.attempt,answerFingerprint:o,violations:r,supersedesDegradation:n==="satisfied"&&e.attempt>0}});}function ct(t){let e=[...new Set(t.flatMap(o=>o.violations))],n=[...new Map(t.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):",n.join(`
|
|
3
3
|
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
`)].join(`
|
|
7
7
|
|
|
8
|
-
`)}}function
|
|
9
|
-
`)+1)));let
|
|
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})
|
|
8
|
+
`)}}function ue(t,e){let n=new Set,o=new Set(e.flatMap(c=>c.contract.requiredSections)),r=me(t.split(/\r?\n/)),i=pe(r.headingLines);for(let c of o)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<r.claimLines.length;c++){let u=r.claimLines[c].trim();if(!u||lt(u))continue;let d=i.byLine.get(c);for(let l of gt(u))mt(l,d,a,n);}return [...n]}function me(t){let e=false,n=[],o=[];for(let r of t){if(/^\s*```/.test(r)){e=!e,n.push(""),o.push(r.replace(/^\s*```+[^\s`]*/,"").replace(/```+\s*$/,"").trim());continue}n.push(e?"":r.replace(/`[^`]*`/g,"").trim()),o.push(r.replace(/`([^`]*)`/g,(i,s)=>dt(s)?"":s).trim());}return {headingLines:n,claimLines:o}}function dt(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 lt(t){if(t.length>2048)return false;let e=t.replace(/^\s*(?:[-*+]|\d+[.)])\s+/,"").trim();return e?ut(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 ut(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 mt(t,e,n,o){let r=/\bP0\b/gi;for(let y of t.matchAll(r))de(t,y.index??0,y[0],"p0")||o.add("unsupported_p0_severity");let i=/(?:中高|高)(?:风险|优先级)|严重(?:问题|风险)|\bhigh[- ](?:risk|severity|priority)\b/gi;for(let y of t.matchAll(i))de(t,y.index??0,y[0],"high")||o.add("unsupported_high_severity");let s=/(?:性能)?瓶颈|卡顿|掉帧|CPU\s*(?:热点|尖峰)|\bbottleneck\b|\bjank\b|\bdropped frames?\b|\bCPU hotspot\b/gi;for(let y of t.matchAll(s))ft(t,y.index??0,y[0])||(/(?:瓶颈|bottleneck)/i.test(y[0])?o.add("unsupported_confirmed_bottleneck"):o.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),u=/\b\d+(?:\.\d+)?\s*[x×]\b/i.test(t);(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(t)||/\d+(?:\.\d+)?(?:\s*[-–~]\s*\d+(?:\.\d+)?)?\s*(?:毫秒|次\s*\/\s*秒|帧)/.test(t),l=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&&!l&&o.add("unsupported_benefit_percentage"),d&&!l&&o.add("unsupported_performance_number");let m=/(?:requestAnimationFrame|\bRAF\b)/i.test(t),h=/(?:建议|应该|应当|使用|添加|采用|切换|包裹|优化|节流|\buse\b|\badopt\b|\brecommend\b|\bswitch\b|\bwrap\b|\bthrottl(?:e|ing)\b)/i.test(t),g=/(?:不要|不得|不能|不应|避免|不建议|不推荐).{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&&h&&!g&&!n&&o.add("raf_without_sampling_evidence");}function de(t,e,n,o){let r=t.slice(Math.max(0,e-64),e),i=t.slice(e+n.length,e+n.length+28),s=pt(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 pt(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,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 n.test(t)||o.test(t)}function ft(t,e,n){let o=t.slice(Math.max(0,e-40),e),r=t.slice(e+n.length,e+n.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 gt(t){return t.split(/(?:[。!?;;,,]|\b(?:but|however|yet|nevertheless|nonetheless)\b|但是|但|然而|却|不过|可是)/i).map(e=>e.trim()).filter(Boolean)}function j(t,e){if(!t||t.length>4096)return {degradationReason:"transcript_path_missing"};let n;try{let o=lstatSync(t);if(!o.isFile()||o.isSymbolicLink())return {degradationReason:"transcript_path_unsafe"};n=openSync(t,constants.O_RDONLY|(constants.O_NOFOLLOW??0));let r=fstatSync(n);if(!r.isFile()||r.dev!==o.dev||r.ino!==o.ino)return {degradationReason:"transcript_path_changed"};let i=Math.min(r.size,rt),s=Buffer.alloc(i),a=0;for(;a<i;){let g=readSync(n,s,a,i-a,r.size-i+a);if(g===0)break;a+=g;}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(-it),d=e.length>0?Math.min(...e.map(g=>g.promptedAt)):0,l=ht(u,d),h=[...l].reverse().find(g=>yt(g.text,e))??l.at(-1);return h?.text?{answer:h.text,fingerprint:h.fingerprint}:{degradationReason:"transcript_answer_unavailable"}}catch{return {degradationReason:"transcript_unreadable"}}finally{n!==void 0&&closeSync(n);}}function yt(t,e){let n=new Set(e.flatMap(r=>r.contract.requiredSections)),o=pe(me(t.split(/\r?\n/u)).headingLines);return [...n].every(r=>o.found.has(r))}function $(t){return j(t,[]).answer}function ht(t,e){let n=[];for(let o=0;o<t.length;o++){let r=t[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")}`,h=createHash("sha256").update(l).digest("hex"),g=createHash("sha256").update(`${m}\0${h}`).digest("hex");n.push({text:l,timestamp:c,fingerprint:g});}}catch{continue}}return n}function It(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 pe(t){let e=new Set,n=new Map,o;for(let r=0;r<t.length;r++){let i=t[r].trim().replace(/^#{1,6}\s*/,"").replace(/^\*\*(.*)\*\*$/,"$1").replace(/^(?:[一二三123][、..]\s*)/,"").replace(/[::]\s*$/,"").trim(),s=st.find(a=>i===a);s&&(o=s,e.add(s)),n.set(r,o);}return {found:e,byLine:n}}var _t={open:["intent_bound"],intent_bound:["context_ready","context_degraded"],context_ready:["action_required","action_not_required"],context_degraded:["action_required","action_not_required"],action_required:["action_satisfied","action_degraded","action_failed"],action_not_required:["memory_decided","memory_quarantined"],action_satisfied:["memory_decided","memory_quarantined"],action_degraded:["memory_decided","memory_quarantined"],action_failed:["action_satisfied","action_degraded"],memory_decided:["closed","closed_with_degradation","closed_with_retry_work"],memory_quarantined:["closed_with_degradation","closed_with_retry_work"],closed:[],closed_with_degradation:[],closed_with_retry_work:[]};function P(t){let e=wt(t);return se({artifact:t.artifact,legacyState:e.toState}),e}function wt(t){let e=openGlobalDevFlowDatabase(void 0,{busyTimeoutMs:250});try{let n=xt(e,t.artifact);if(At(n.toState))return n;let o=e.getContextReceiptForRequest(t.artifact.projectRoot,t.artifact.sessionId,t.artifact.requestId),r=t.artifact.intent==="memory";if(!o&&!r)return n;let i=o?St(t.artifact,o):"context_ready";n.toState==="intent_bound"&&(n=f(e,n,t,i,r?"task_context_not_required":i==="context_ready"?"canonical_context_receipt_ready":"canonical_context_receipt_degraded"));let s=o?Rt(t.artifact,o):"action_not_required";if((n.toState==="context_ready"||n.toState==="context_degraded")&&(s==="action_not_required"?n=f(e,n,t,"action_not_required","task_action_not_required"):n=f(e,n,t,"action_required","canonical_action_obligation_present")),n.toState==="action_required"){if(s==="action_required")return n;if(s==="action_failed")return f(e,n,t,"action_failed","canonical_action_attempt_failed");s==="action_degraded"?n=f(e,n,t,"action_degraded","canonical_action_unavailable_or_degraded"):s==="action_satisfied"&&(n=f(e,n,t,"action_satisfied","canonical_action_succeeded"));}if(n.toState==="action_failed")if(s==="action_satisfied")n=f(e,n,t,"action_satisfied","canonical_action_retry_succeeded");else if(s==="action_degraded")n=f(e,n,t,"action_degraded","canonical_action_retry_degraded");else return n;let a=i==="context_degraded"||s==="action_degraded";return ["action_not_required","action_satisfied","action_degraded"].includes(n.toState)&&(n=f(e,n,t,t.memoryStatus==="pending"?"memory_quarantined":"memory_decided",t.memoryStatus==="pending"?t.reason:`canonical_memory_${t.memoryStatus}`)),n.toState==="memory_decided"?f(e,n,t,a?"closed_with_degradation":"closed",t.reason):n.toState==="memory_quarantined"?f(e,n,t,t.retryOwned?"closed_with_retry_work":"closed_with_degradation",t.retryOwned?"durable_retry_owner_confirmed":"terminal_obligation_unowned"):n}finally{e.close();}}function St(t,e){return t.intent==="memory"||t.intent==="knowledge"||(e.selectedFiles?.length??0)>0?"context_ready":"context_degraded"}function Rt(t,e){let n=e.canonicalAction,r=(n?(e.actionAttempts??[]).filter(i=>i.tool===n.tool):[]).at(-1);return e.actionSatisfiedAt||r?.status==="succeeded"?"action_satisfied":r&&["failed","timeout","unavailable"].includes(r.status)?"action_failed":e.actionDegradation||n?.status==="degraded"||n?.status==="unsupported"?"action_degraded":n?.required||kt(t)?"action_required":"action_not_required"}function kt(t){return ["create","modify","debug","test","format"].includes(t.action)||["feature","refactor","performance"].includes(t.intent)}function xt(t,e){let n=t.getLatestTerminalTransition(e.projectRoot,e.sessionId,e.turnId);if(!n)throw new Error(`TERMINAL_INTENT_STATE_MISSING:${e.turnId}`);return n}function f(t,e,n,o,r){if(!_t[e.toState]?.includes(o))throw new Error(`TERMINAL_PATH_UNAVAILABLE:${e.toState}->${o}`);let i=e.sequence+1,s=`terminal:${createHash("sha256").update(`${n.artifact.artifactHash}\0${i}\0${o}`).digest("hex").slice(0,24)}`,a=t.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:e.toState,toState:o,receiptId:s,sourceReceiptId:n.memoryReceiptId??e.receiptId,reason:r,payload:{memoryStatus:n.memoryStatus,retryOwned:n.retryOwned??false,sourceIntentHash:n.artifact.artifactHash},createdAt:Date.now()});return 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:o==="closed"?"info":o.includes("degradation")||o.includes("retry")||o==="action_failed"?"warn":"info",timestamp:Date.now(),data:{fromState:e.toState,nextState:o,receiptId:s,reason:r}}),a}function At(t){return t==="closed"||t==="closed_with_degradation"||t==="closed_with_retry_work"}function fe(t){let e={committed:0,skipped:0,pending:0},n=[];for(let o of t)e[o.status]+=1,o.receiptId&&n.push(o.receiptId);return {memoryReceiptIds:[...new Set(n)],missingMemoryDecisionCount:e.pending,memoryTurnOutcomes:e}}function Tt(t){return (t instanceof Error?t.message:String(t)).trim().slice(0,240)||"memory_lifecycle_unavailable"}function Dt(t,e=_(),n=true,o,r=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: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 re(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:Tt(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 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=Dt(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 A=1,qt="memory-snapshot-v1.json",Nt=512*1024,Ie=256*1024,be=2e3,Lt=500,Ht=10,zt=240,Ut=300*1e3,Jt=720*60*60*1e3,Wt=2147483647;function Bt(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 Gt(t,e={}){let n=S(t),o=e.stateRoot?join(e.stateRoot,n):getProjectStateDir(v(t));return join(o,qt)}function Kt(t,e){let o=(t instanceof Error?t.message:"").replace(/[\r\n\t]+/gu," ").trim().slice(0,160);return o?`${e}:${o}`:e}function q(t,e){return Array.isArray(t)&&t.length<=e&&t.every(n=>typeof n=="string"&&n.length>0&&n.length<=512)}function Vt(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)&&q(e.memoryIds,100)&&(e.status==="withheld"||e.status==="resolved")&&(e.summary===void 0||typeof e.summary=="string"&&e.summary.length<=2e3)}function Xt(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 ve(t,e,n){if(!t||typeof t!="object"||Array.isArray(t))return null;let o=t,r=v(e),i=S(r),s=o.generation===void 0?0:o.generation;return o.version!==A||o.projectRoot!==r||o.projectHash!==i||typeof o.markdown!="string"||Buffer.byteLength(o.markdown,"utf8")>Ie||!q(o.memoryIds,be)||!Array.isArray(o.conflicts)||o.conflicts.length>Lt||!o.conflicts.every(Vt)||typeof o.generatedAt!="number"||!Number.isFinite(o.generatedAt)||o.generatedAt<0||o.generatedAt>n+Ut||!Number.isInteger(s)||s<0||s>Wt||!["ready","pending","degraded","disabled"].includes(String(o.status))||o.degradation!==void 0&&!Xt(o.degradation)?null:{...o,generation:s}}function Yt(t,e,n,o,r=0){let i=v(t);return {version:A,projectRoot:i,projectHash:S(i),markdown:"",memoryIds:[],conflicts:[],generatedAt:o,generation:r,status:e,degradation:{reason:n}}}function Zt(t,e={}){let n=e.now??Date.now(),o=Gt(t,e),r;try{r=openSync(o,constants.O_RDONLY|constants.O_NOFOLLOW);let i=fstatSync(r);if(!i.isFile()||i.size<=0||i.size>Nt)throw new Error("cache_size_invalid");let s=Bt({...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=ve(a,t,n);if(!c)throw new Error("cache_schema_invalid");return c.status==="ready"&&n-c.generatedAt>Jt?{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:Yt(t,a?"pending":"degraded",a?"cache_missing":Kt(i,"cache_invalid"),n),source:"none",valid:false,stale:false}}finally{if(r!==void 0)try{closeSync(r);}catch{}}}function Qt(t){if(!t)return true;try{return JSON.parse(readFileSync(t,"utf8")).sessionStart?.injectMemories??!0}catch{return true}}function en(t,e,n){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(t);return {version:A,projectRoot:i,projectHash:S(i),markdown:"",memoryIds:[],conflicts:[],generatedAt:n,generation:0,status:"disabled"}}let r=ve(o.snapshot,t,n);if(r)return r;if(o.status==="ok"&&typeof o.markdown=="string"&&o.markdown.length>0&&Buffer.byteLength(o.markdown,"utf8")<=Ie){let i=v(t);return {version:A,projectRoot:i,projectHash:S(i),markdown:o.markdown,memoryIds:q(o.memoryIds,be)?o.memoryIds:[],conflicts:[],generatedAt:n,generation:0,status:"ready"}}}catch{}return null}function F(t,e){return [...(t??e).replace(/[\r\n\t|]+/gu," ").trim()||e].slice(0,zt).join("")}function tn(t){if(t.length===0)return "";let e=t.slice(0,Ht),n=e.map(o=>{let r=F(o.family,"unknown"),i=F(o.entity,"unknown"),s=F(o.summary,"Explicit choice required.");return `- family=${r}; entity=${i}; status=${o.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
11
|
${n.join(`
|
|
12
|
-
`)}`}function
|
|
13
|
-
DevFlow memory snapshot=pending; source=${
|
|
12
|
+
`)}`}function nn(t){let e=t.now??Date.now();if(Qt(t.configPath)===false)return "";let n=en(t.projectRoot,t.daemonResponse??"",e),o=n?{snapshot:n,source:"daemon"}:Zt(t.projectRoot,{...t.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=tn(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(
|
|
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(nn({projectRoot:e,configPath:n,daemonResponse:process.env.DEVFLOW_MEMORY_RESPONSE}));}function _e(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 we(t){let e=le({projectRoot:t.projectRoot,sessionId:t.sessionId,transcriptPath:t.transcriptPath,runtimeStore:t.runtimeStore}),n=openGlobalDevFlowDatabase(void 0,{busyTimeoutMs:50});try{cn(t.runtimeStore,t.sessionId,n);let o=n.getPendingMemoryTurn(t.projectRoot,t.sessionId),r=o?n.markMemoryTurnStopPrompted(o.turnId):!1,i=[];e&&i.push(e.reason),o&&r&&i.push(_e(o)),o&&!r&&sn(n,o.turnId)&&an($(t.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=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(`
|
|
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
|
|
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 sn(t,e){return !!t.getWorkByIdempotencyKey(`memory-turn:commit_explicit:${e}`)}function an(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 cn(t,e,n){let o=t.get(e);if(o){for(let r of o.evidenceObligations)n.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=n.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;n.resolveSessionObligation({projectRoot:o.projectRoot,sessionId:e,obligationId:i,state:r.status==="resolved"?"satisfied":"degraded",receiptId:a,reason:r.reason,resolvedAt:r.completedAt});}}}async function ln(t,e=_()){let n;try{n=JSON.parse(t);}catch{return null}let o=n.session_id?.trim();if(!o)return null;let r=new I(e),i=we({projectRoot:e,sessionId:o,transcriptPath:n.transcript_path,stopHookActive:n.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"||P({artifact:l,memoryStatus:d.status,memoryReceiptId:d.receiptId,reason:"stop_obligations_satisfied"});}a.reconcileSkillExecution(s.executionId,"completed",Date.now(),{...fe(c),evidenceDegradations:s.evidenceDegradations,evidenceContractOutcomes:s.evidenceOutcomes,unresolvedObligations:i.unresolved,terminalState:i.decision}),a.deleteContextReceipt(e,o,s.executionId);}finally{a.close();}}return k(`/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 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 ln(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{ln 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&®isterRuntimeHttpSuccess(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
|
-
|
|
4
|
-
|
|
5
|
-
|
|
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(`
|
|
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,appendTaskRuntimeBoundary,taskSpecFromImmutableIntent,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 I(e,n,t){try{let r=openGlobalDevFlowDatabase();try{r.insertEvent({kind:e,timestamp:Date.now(),duration:t,success:n.success!==!1,metadata:n});}finally{r.close();}}catch{}}var z="WARNING: DevFlow is in degraded mode (daemon unreachable): 4-Gate enforcement and memory prefetch cache are unavailable. Run `devflow doctor` for details.";function W(){return process.env.DEVFLOW_HOOK_DEGRADED==="1"}function Fe(e){return e??process.env.CLAUDE_PROJECT_DIR??process.cwd()}function _(e){return process.env.DEVFLOW_STATE_DIR??getProjectStateDir(Fe(e))}function V(e){return Buffer.from(e,"utf8").toString("base64url")}function Je(e,n,t){let r=n?.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-${t}-${randomUUID().slice(0,8)}`}function te(e){return `${e}:legacy-journal`}var C=class{constructor(n){this.projectRoot=n;this.sessions=new Map;this.sessionsDir=join$1(_(n),"hook-sessions");}registerSession(n){let t=n.trim();if(!t)throw new Error("session_id_required");let r=this.get(t);if(r)return r.lastActivityAt=Date.now(),this.persist(r),r;let o=Date.now(),i={sessionId:t,projectRoot:this.projectRoot,requiredMcpTools:[],evidenceObligations:[],evidenceDegradations:[],evidenceOutcomes:[],startedAt:o,lastActivityAt:o};return this.sessions.set(t,i),this.persist(i),i}startExecution(n,t,r){let o=this.registerSession(n);return (!o.executionId||o.skillName!==t)&&(o.executionId=`exec_${Date.now()}_${randomUUID().slice(0,8)}`),o.skillName=t,o.requiredMcpTools=[...new Set(r)],o.lastActivityAt=Date.now(),this.persist(o),o}bindTaskIdentity(n,t){let r=this.registerSession(n);return r.activeTurnId=t.turnId,r.activeRequestId=t.requestId,r.intentArtifactHash=t.intentArtifactHash,r.lastActivityAt=Date.now(),this.persist(r),r}get(n){let t=n.trim();if(!t)return null;let r=this.sessions.get(t);if(r)return this.replayEvidenceJournal(r),r;let o=this.snapshotPath(t);if(!existsSync(o))return null;try{let i=JSON.parse(readFileSync$1(o,"utf8"));return i.sessionId!==t||i.projectRoot!==this.projectRoot?null:(i.requiredMcpTools=Array.isArray(i.requiredMcpTools)?i.requiredMcpTools:[],i.evidenceObligations=Q(i.evidenceObligations),i.evidenceDegradations=Y(i.evidenceDegradations),i.evidenceOutcomes=X(i.evidenceOutcomes),this.replayEvidenceJournal(i),this.sessions.set(t,i),i)}catch{return null}}completeExecution(n){let t=this.get(n);if(!t)return null;let r=structuredClone(t);return delete t.executionId,delete t.skillName,t.requiredMcpTools=[],t.lastActivityAt=Date.now(),this.persist(t),r}addEvidenceObligation(n,t,r=Date.now(),o){let i=this.registerSession(n),a=(o?void 0:i.evidenceObligations.find(u=>u.contractId===t.id))?.obligationId??Je(t.id,o,r);this.appendEvidenceEvent(n,{kind:"add",obligationId:a,contractId:t.id,at:r,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(n){return (this.get(n)?.evidenceObligations??[]).map(t=>structuredClone(t))}markEvidenceCorrection(n,t,r,o,i=Date.now()){let s=this.get(n),a=s?.evidenceObligations.find(d=>d.obligationId===t);if(!s||!a)return null;let c=/^[a-f0-9]{64}$/.test(o)?o:"";if(!c)return null;this.appendEvidenceEvent(n,{kind:"correction",obligationId:t,contractId:a.contractId,at:i,fingerprint:c,violations:r.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(n,t){let r=this.get(n);if(!r)return false;let o=r.evidenceObligations.find(s=>s.obligationId===t);if(!o)return false;let i=Date.now();return this.appendEvidenceEvent(n,{kind:"resolve",obligationId:t,contractId:o.contractId,at:i},`resolve\0${t}`),this.replayEvidenceJournal(r),r.lastActivityAt=i,this.persist(r),true}resolveDegradedEvidence(n,t){let r=this.get(n),o=r?.evidenceDegradations.find(s=>s.obligationId===t);if(!r||!o)return false;let i=Date.now();return this.appendEvidenceEvent(n,{kind:"resolve",obligationId:t,contractId:o.contractId,at:i},`resolve-degraded\0${t}\0${i}`),this.replayEvidenceJournal(r),r.lastActivityAt=i,this.persist(r),true}degradeEvidenceObligation(n,t,r,o=Date.now()){let i=this.get(n),s=i?.evidenceObligations.find(c=>c.obligationId===t);if(!i||!s)return false;let a=r.slice(0,240);return this.appendEvidenceEvent(n,{kind:"degrade",obligationId:t,contractId:s.contractId,at:o,reason:a},`degrade\0${t}\0${a}`),this.replayEvidenceJournal(i),i.lastActivityAt=o,this.persist(i),true}removeSession(n){let t=n.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(n){return join$1(this.sessionsDir,`${V(n)}.json`)}evidenceJournalDir(n){return join$1(this.sessionsDir,"evidence-journal",V(n))}appendEvidenceEvent(n,t,r){let o=this.evidenceJournalDir(n);mkdirSync(o,{recursive:true,mode:448});let i=createHash("sha256").update(r).digest("hex"),s=join$1(o,`${t.kind}-${i}.json`);if(existsSync(s))return;let a=join$1(o,`.${process.pid}.${randomUUID()}.tmp`);writeFileSync(a,JSON.stringify(t),{mode:384});try{linkSync(a,s);}catch(c){if(c.code!=="EEXIST")throw c}finally{rmSync(a,{force:true});}}replayEvidenceJournal(n){n.evidenceObligations=Q(n.evidenceObligations),n.evidenceDegradations=Y(n.evidenceDegradations),n.evidenceOutcomes=X(n.evidenceOutcomes);let t=this.evidenceJournalDir(n.sessionId);if(!existsSync(t))return;let r;try{r=readdirSync(t).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(t,i),"utf8");if(Buffer.byteLength(s,"utf8")>64*1024)return [];let a=ze(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(n,i);n.evidenceObligations=n.evidenceObligations.slice(-8),n.evidenceDegradations=n.evidenceDegradations.slice(-20),n.evidenceOutcomes=n.evidenceOutcomes.slice(-20);}applyEvidenceEvent(n,t){let r=n.evidenceOutcomes.find(s=>s.obligationId===t.obligationId);if(t.kind==="add"){if(r)return;let s=n.evidenceObligations.find(a=>a.obligationId===t.obligationId);s?(s.contract=t.contract,s.promptedAt=Math.min(s.promptedAt,t.at)):n.evidenceObligations.push({obligationId:t.obligationId,contractId:t.contractId,contract:t.contract,promptedAt:t.at,attempt:0,correctionRequested:false,violations:[]});return}let o=n.evidenceObligations.find(s=>s.obligationId===t.obligationId);if(t.kind==="correction"){if(!o||r||o.correctionFingerprint===t.fingerprint)return;o.attempt+=1,o.correctionRequested=true,o.correctionRequestedAt=t.at,o.correctionFingerprint=t.fingerprint,o.violations=t.violations;return}let i=o?.attempt??r?.attempt??0;if(t.kind==="resolve"&&r?.status==="degraded")n.evidenceOutcomes=n.evidenceOutcomes.filter(s=>s.obligationId!==t.obligationId),n.evidenceDegradations=n.evidenceDegradations.filter(s=>s.obligationId!==t.obligationId);else if(r)return;t.kind==="degrade"?(n.evidenceObligations=n.evidenceObligations.filter(s=>s.obligationId!==t.obligationId),n.evidenceDegradations.push({obligationId:t.obligationId,contractId:t.contractId,reason:t.reason,degradedAt:t.at,attempt:i,contract:o?.contract})):n.evidenceObligations=n.evidenceObligations.filter(s=>s.obligationId!==t.obligationId),n.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(n){mkdirSync(this.sessionsDir,{recursive:true,mode:448});let t=this.snapshotPath(n.sessionId),r=`${t}.${process.pid}.${randomUUID()}.tmp`;writeFileSync(r,JSON.stringify(n),{mode:384}),renameSync(r,t);}};function Q(e){return Array.isArray(e)?e.flatMap(n=>{if(!n||typeof n!="object")return [];let t=n;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)||!ne(t.contract))return [];let r=typeof t.obligationId=="string"&&t.obligationId.length>0&&t.obligationId.length<=384?t.obligationId:te(t.contractId),o=typeof t.correctionTranscriptHash=="string"?t.correctionTranscriptHash:void 0,i=t.correctionFingerprint??o;return i!==void 0&&!/^[a-f0-9]{64}$/.test(i)?[]:[{...t,obligationId:r,correctionFingerprint:i}]}).slice(-8):[]}function Y(e){return Array.isArray(e)?e.filter(n=>{if(!n||typeof n!="object")return false;let t=n;return typeof t.obligationId=="string"&&typeof t.contractId=="string"&&typeof t.reason=="string"&&typeof t.degradedAt=="number"&&typeof t.attempt=="number"}).slice(-20):[]}function X(e){return Array.isArray(e)?e.filter(n=>{if(!n||typeof n!="object")return false;let t=n;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 ze(e){if(!e||typeof e!="object")return null;let n=e,t=n.kind;if(t!=="add"&&t!=="correction"&&t!=="resolve"&&t!=="degrade"||typeof n.contractId!="string"||n.contractId.length>128||typeof n.at!="number")return null;let o={obligationId:typeof n.obligationId=="string"&&n.obligationId.length>0&&n.obligationId.length<=384?n.obligationId:te(n.contractId),contractId:n.contractId,at:n.at};if(t==="add")return ne(n.contract)?{kind:t,...o,contract:n.contract}:null;if(t==="correction"){let i=typeof n.fingerprint=="string"?n.fingerprint:n.transcriptHash;return typeof i=="string"&&/^[a-f0-9]{64}$/.test(i)&&Array.isArray(n.violations)&&n.violations.every(s=>typeof s=="string"&&s.length<=240)?{kind:t,...o,fingerprint:i,violations:n.violations}:null}return t==="resolve"?{kind:t,...o}:typeof n.reason=="string"&&n.reason.length<=240?{kind:t,...o,reason:n.reason}:null}function Z(e){return e==="add"?0:e==="correction"?1:2}function ne(e){if(!e||typeof e!="object")return false;let n=e,t=n.requiredSections,r=n.prohibitedClaims;return n.version==="1.0"&&typeof n.id=="string"&&/^[a-zA-Z0-9][a-zA-Z0-9:._-]{0,127}$/.test(n.id)&&typeof n.runtimeProfilingOccurred=="boolean"&&typeof n.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(r)&&r.length<=16&&r.every(o=>typeof o=="string"&&o.length<=128)&&typeof n.canonicalReport=="string"&&Buffer.byteLength(n.canonicalReport,"utf8")<=48*1024&&!!n.correctionPolicy&&n.correctionPolicy.maxAttempts===1&&n.correctionPolicy.repeatedViolation==="fail_open"}function We(e){let n=e.trim().replace(/^\//,"");if(!n.startsWith("devflow:"))return null;let t=n.slice(8).replace(/^devflow-/,"");return /^[a-z0-9][a-z0-9-]*$/i.test(t)?`devflow:${t.toLowerCase()}`:null}function re(e){let n=e.trimStart().match(/^\/(devflow:[a-z0-9][a-z0-9-]*)\b/i);if(!n)return null;let t=We(n[1]);return t?{rawName:n[1],skillName:t}:null}var Qe=2,Ye=1;function Xe(){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 oe(e=Xe()){let n=[join$1(e,"dist","command-registry.json"),join$1(e,"command-registry.json")];for(let t of n)try{if(!existsSync(t))continue;let r=JSON.parse(readFileSync$1(t,"utf8"));if(r.version!==Qe&&r.version!==Ye||!Ze(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:t}});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 Ze(e){return !e||typeof e!="object"||Array.isArray(e)?false:Object.values(e).every(n=>{if(!n||typeof n!="object"||Array.isArray(n))return false;let t=n;return T(t.mcpTools)&&T(t.blockedNative)&&(t.source===void 0||t.source==="core"||t.source==="plugin")&&(t.requiresContext===void 0||typeof t.requiresContext=="boolean")&&(t.runtimePackages===void 0||T(t.runtimePackages))&&(t.hostTools===void 0||et(t.hostTools))&&(t.evidenceMode===void 0||["static","runtime","mixed"].includes(t.evidenceMode))})}function et(e){return !!e&&typeof e=="object"&&!Array.isArray(e)&&Object.entries(e).every(([n,t])=>n.length>0&&T(t))}function T(e){return Array.isArray(e)&&e.every(n=>typeof n=="string"&&n.length>0)}function ie(e){let n=oe();return n?n[e]?.mcpTools??[]:[]}function se(e,n,t){return formatSkillRuntimeOverlay(createSkillRuntimeOverlay(e,n,{prompt:t}))}var dt=getLocalApiKey(),H=join(homedir(),".devflow","errors");async function pe(e,n,t={}){let r=t.endpoint??resolveRuntimeEndpoint().url,o=t.timeout??1500,i=t.durableMirror??true,s=t.maxRetries??(i?0:2),a=t.circuitBreaker??true,c=acquireRuntimeHttpCircuit(r,e);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 lt(r,e,n,o),a&®isterRuntimeHttpSuccess(r,e).transitioned&&I("http_circuit_transition",{endpoint:r,path:new URL(e,r).pathname,previous:c.state.status,status:"closed",failures:0}),{delivered:!0,suppressed:!1}}catch(f){u=f instanceof Error?f:new Error(String(f)),l<s&&await ut(Math.min(100*2**l,1e3));}if(!u)return {delivered:false,suppressed:false,fallbackReason:"unknown_http_failure"};if(!a)return ue(e,u),{delivered:false,suppressed:false,fallbackReason:u.message};let d=registerRuntimeHttpFailure(r,e,t.fallbackReason??(i?"local_durable_mirror":"http_delivery_failed"));return d.transitioned&&(ue(e,u),I("http_circuit_transition",{endpoint:r,path:new URL(e,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 lt(e,n,t,r){return new Promise((o,i)=>{let s=JSON.stringify(t),a=new URL(n,e),c=false,u=l=>{c||(c=true,l?i(l):o());},d=request({hostname:a.hostname,port:a.port,path:a.pathname+a.search,method:"POST",headers:{"Content-Type":"application/json","X-API-Key":dt,"Content-Length":Buffer.byteLength(s)},timeout:r},l=>{l.on("error",u),l.on("end",()=>{let f=l.statusCode??0;u(f>=200&&f<300?void 0:new Error(`HTTP ${f}`));}),l.resume();});d.on("error",u),d.on("timeout",()=>d.destroy(new Error(`HTTP mirror timed out after ${r}ms`))),d.write(s),d.end();})}function ue(e,n){try{existsSync$1(H)||mkdirSync$1(H,{recursive:!0}),appendFileSync(join(H,"http-errors.log"),`${new Date().toISOString()} | ${e} | ${n.message}
|
|
2
|
+
`);}catch{}}function ut(e){return new Promise(n=>setTimeout(n,e))}var Ie=1e4,yt=3e4,M=500,O=class{constructor(n){this.retryScheduled=false;this.metricAggregationScheduled=false;this.apiUrl=n?.apiUrl,this.cacheDir=n?.cacheDir??join$1(process.env.DEVFLOW_STATE_DIR??join$1(homedir$1(),".devflow","global"),"telemetry-cache"),this.legacyCacheDir=n?.legacyCacheDir??(n?.cacheDir?null:join$1(homedir$1(),".devflow","telemetry-cache")),this.database=n?.database??null,this.ownsDatabase=!n?.database;let t=n?.busyTimeoutMs??Number(process.env.DEVFLOW_TELEMETRY_DB_BUSY_TIMEOUT_MS);this.busyTimeoutMs=Number.isSafeInteger(t)&&t>=0?t:100;}async sendEvent(n){let t={...n,input:this.truncateInput(n.input)};return this.commitOrCache("tool_call",t)?(this.postHttp("/api/telemetry/tool-call",t),n.eventId):null}async sendExecutionStart(n,t,r,o,i=process.env.CLAUDE_PROJECT_DIR??process.cwd(),s=[]){let a={executionId:n,sessionId:t,skillName:r,startedAt:o,projectRoot:i,requiredMcpTools:s};this.commitOrCache("execution_start",a)&&this.postHttp("/api/telemetry/skill-execution/start",a);}async sendExecutionComplete(n,t="completed",r=Date.now(),o){let i={executionId:n,status:t,finishedAt:r,metadata:o},s=this.commitOrCache("execution_complete",i);return s&&this.postHttp("/api/telemetry/skill-execution/complete-reconciled",i),s}async sendSessionStart(n,t,r){let o={id:n,projectRoot:t,startedAt:r,label:t.split("/").pop()??"unknown"},i=this.commitOrCache("session_start",o);return i&&this.postHttp("/api/telemetry/sessions",o),i}async completeEvent(n){let t=this.commitOrCache("complete_event",n);return t&&(this.postHttp("/api/telemetry/tool-call/output",n),this.scheduleMetricAggregation()),t}async endSession(n,t=Date.now()){let r={sessionId:n,finishedAt:t},o=this.commitOrCache("session_end",r);return o&&(this.getDatabase().aggregatePendingToolMetrics(),this.postHttp(`/api/telemetry/sessions/${encodeURIComponent(n)}/close`,{finishedAt:t})),o}async flushCache(){try{let r=this.getDatabase(),o=r.listTelemetryFailures({unresolvedOnly:!0,limit:M}).reverse();for(let i of o)try{this.applyOperation(i.operation,i.payload),r.resolveTelemetryFailure(i.id);}catch{}r.trimTelemetryFailures(M);}catch{}let t=[...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:ht(JSON.parse(readFileSync$1(i,"utf8")),o)}}catch{return null}})).filter(r=>r!==null).sort((r,o)=>r.envelope.timestamp-o.envelope.timestamp||ve(r.envelope.operation)-ve(o.envelope.operation));for(let{cacheFile:r,envelope:o}of t)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(n,t){try{return this.applyOperation(n,t),!0}catch(r){return this.cacheOperation(n,t,r),false}}applyOperation(n,t){let r=this.getDatabase();switch(n){case "tool_call":this.ensureParentSession(r,t),r.insertToolCallEvent(t);return;case "execution_start":this.ensureParentSession(r,t),r.insertSkillExecution({executionId:t.executionId,sessionId:t.sessionId,skillName:t.skillName,startedAt:t.startedAt,status:"running",requiredMcpTools:t.requiredMcpTools});return;case "execution_complete":r.reconcileSkillExecution(t.executionId,t.status,t.finishedAt,t.metadata);return;case "session_start":r.ensureSession(t),r.insertRun({id:be(t.id),source:"hook",tool:"session",input:{projectRoot:t.projectRoot},status:"active",startedAt:t.startedAt,tokenUsed:0,metadata:{sessionId:t.id,projectRoot:t.projectRoot}});return;case "complete_event":if(!r.updateToolCallEvent(t.eventId,{output:t.output===void 0?void 0:JSON.stringify(t.output),error:t.error,failureCategory:t.failureCategory,duration:t.duration}))throw new Error(`Tool call event ${t.eventId} is not available for completion`);return;case "session_end":r.closeSession(t.sessionId,t.finishedAt),r.updateRun(be(t.sessionId),{status:"completed",finishedAt:t.finishedAt});return}}ensureParentSession(n,t){let r=typeof t.sessionId=="string"?t.sessionId.trim():"";if(!r)throw new Error("Canonical session ID is required for telemetry");let o=typeof t.projectRoot=="string"&&t.projectRoot.trim()?t.projectRoot:typeof t.input?.projectRoot=="string"&&t.input.projectRoot.trim()?t.input.projectRoot:process.env.CLAUDE_PROJECT_DIR??"unknown";n.ensureSession({id:r,projectRoot:o,label:o==="unknown"?void 0:o.split("/").pop(),startedAt:Number(t.startedAt??t.timestamp??Date.now())});}cacheOperation(n,t,r){let o=Date.now(),i={id:`failure:${o}:${Math.random().toString(36).slice(2,11)}`,operation:n,payload:t,failure:r instanceof Error?r.message:String(r),timestamp:o};try{let s=this.getDatabase();s.insertTelemetryFailure({id:i.id,operation:n,payload:t,error:i.failure,createdAt:o}),s.trimTelemetryFailures(M),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 n=readdirSync(this.cacheDir).filter(t=>t.endsWith(".json")).sort();for(let t of n.slice(0,Math.max(0,n.length-M)))unlinkSync(join$1(this.cacheDir,t));}catch{}}scheduleRetry(){this.retryScheduled||(this.retryScheduled=true,setTimeout(()=>{this.retryScheduled=false,this.flushCache();},yt).unref());}scheduleMetricAggregation(){if(this.metricAggregationScheduled||process.env.DEVFLOW_HOOK_DEGRADED==="1")return;this.metricAggregationScheduled=true,setTimeout(()=>{this.metricAggregationScheduled=false;try{this.getDatabase().aggregatePendingToolMetrics(50)===50&&this.scheduleMetricAggregation();}catch{}},25).unref();}postHttp(n,t){pe(n,t,{endpoint:this.apiUrl,fallbackReason:"telemetry_already_committed_locally"});}truncateInput(n){let t=JSON.stringify(n);return t===void 0||t.length<=Ie?n:{_truncated:true,_original_size:t.length,_preview:`${t.substring(0,Ie)}...`}}};function ve(e){return ["session_start","execution_start","tool_call","complete_event","execution_complete","session_end"].indexOf(e)}function be(e){return `hook-run:${e}`}function ht(e,n){if(!e||typeof e!="object")throw new Error("Invalid telemetry cache envelope");let t=e;if(typeof t.operation=="string"&&t.payload!==void 0)return t;let r=t.type==="tool_call"?"tool_call":t.type==="execution_start"?"execution_start":null;if(!r)throw new Error("Unknown legacy telemetry cache operation");let o=t.payload??{},i=Number(o.timestamp??o.startedAt??Date.now());return {id:`legacy-cache:${n}`,operation:r,payload:o,failure:"Replayed legacy HTTP-first telemetry cache entry",timestamp:i}}var It=/^\/(?:devflow:)?[\w-]+\b\s*/iu,vt=/\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,bt=/(?:^|[.!?]\s*)(?:(?:please|kindly)\s+)?(?:remember|memorize|save\s+this|store\s+this|note\s+that)(?:\s+(?:that|to))?[\s:,-]*(.+)$/iu,wt=/(?:^|[。!?;,,]\s*)(?:(?:请|麻烦|务必|一定要|帮我|帮忙|需要)\s*)?(?:记住|记一下|记下来|记|记录一下|记录下来|保存一下|保存下来)(?:这(?:件事|一点|个信息|些内容))?[\s::,,]*(.+)$/iu;function R(e){let n=e.trim().replace(It,"").trim();return !n||vt.test(n)?null:(wt.exec(n)??bt.exec(n))?.[1]?.trim().replace(/^[::,,\s]+/u,"")||null}var j=1,xt="memory-snapshot-v1.json",Dt=512*1024,_e=256*1024,Re=2e3,Ct=500,Tt=10,Mt=240,Ot=300*1e3,jt=720*60*60*1e3,Pt=2147483647;function $t(e){return e.currentUid===void 0?{ownerSafe:true,modeSafe:true}:{ownerSafe:e.ownerUid===e.currentUid,modeSafe:(e.mode&18)===0}}function k(e){return resolve(e)}function E(e){return createHash$1("sha256").update(k(e)).digest("hex").slice(0,16)}function Nt(e,n={}){let t=E(e),r=n.stateRoot?join(n.stateRoot,t):getProjectStateDir(k(e));return join(r,xt)}function Ht(e,n){let r=(e instanceof Error?e.message:"").replace(/[\r\n\t]+/gu," ").trim().slice(0,160);return r?`${n}:${r}`:n}function L(e,n){return Array.isArray(e)&&e.length<=n&&e.every(t=>typeof t=="string"&&t.length>0&&t.length<=512)}function Ft(e){if(!e||typeof e!="object"||Array.isArray(e))return false;let n=e;return typeof n.id=="string"&&n.id.length>0&&n.id.length<=512&&typeof n.kind=="string"&&n.kind.length>0&&n.kind.length<=128&&(n.family===void 0||typeof n.family=="string"&&n.family.length>0&&n.family.length<=256)&&(n.entity===void 0||typeof n.entity=="string"&&n.entity.length>0&&n.entity.length<=256)&&L(n.memoryIds,100)&&(n.status==="withheld"||n.status==="resolved")&&(n.summary===void 0||typeof n.summary=="string"&&n.summary.length<=2e3)}function Lt(e){if(!e||typeof e!="object"||Array.isArray(e))return false;let n=e;return typeof n.reason=="string"&&n.reason.length>0&&n.reason.length<=512&&(n.stale===void 0||typeof n.stale=="boolean")}function Ee(e,n,t){if(!e||typeof e!="object"||Array.isArray(e))return null;let r=e,o=k(n),i=E(o),s=r.generation===void 0?0:r.generation;return r.version!==j||r.projectRoot!==o||r.projectHash!==i||typeof r.markdown!="string"||Buffer.byteLength(r.markdown,"utf8")>_e||!L(r.memoryIds,Re)||!Array.isArray(r.conflicts)||r.conflicts.length>Ct||!r.conflicts.every(Ft)||typeof r.generatedAt!="number"||!Number.isFinite(r.generatedAt)||r.generatedAt<0||r.generatedAt>t+Ot||!Number.isInteger(s)||s<0||s>Pt||!["ready","pending","degraded","disabled"].includes(String(r.status))||r.degradation!==void 0&&!Lt(r.degradation)?null:{...r,generation:s}}function qt(e,n,t,r,o=0){let i=k(e);return {version:j,projectRoot:i,projectHash:E(i),markdown:"",memoryIds:[],conflicts:[],generatedAt:r,generation:o,status:n,degradation:{reason:t}}}function Ut(e,n={}){let t=n.now??Date.now(),r=Nt(e,n),o;try{o=openSync(r,constants.O_RDONLY|constants.O_NOFOLLOW);let i=fstatSync(o);if(!i.isFile()||i.size<=0||i.size>Dt)throw new Error("cache_size_invalid");let s=$t({...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,t);if(!c)throw new Error("cache_schema_invalid");return c.status==="ready"&&t-c.generatedAt>jt?{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:qt(e,a?"pending":"degraded",a?"cache_missing":Ht(i,"cache_invalid"),t),source:"none",valid:false,stale:false}}finally{if(o!==void 0)try{closeSync(o);}catch{}}}function Jt(e){if(!e)return true;try{return JSON.parse(readFileSync(e,"utf8")).sessionStart?.injectMemories??!0}catch{return true}}function zt(e,n,t){if(!n.trim())return null;try{let r=JSON.parse(n);if(r.status!=="ok"&&r.status!=="degraded")return null;if(r.enabled===!1){let i=k(e);return {version:j,projectRoot:i,projectHash:E(i),markdown:"",memoryIds:[],conflicts:[],generatedAt:t,generation:0,status:"disabled"}}let o=Ee(r.snapshot,e,t);if(o)return o;if(r.status==="ok"&&typeof r.markdown=="string"&&r.markdown.length>0&&Buffer.byteLength(r.markdown,"utf8")<=_e){let i=k(e);return {version:j,projectRoot:i,projectHash:E(i),markdown:r.markdown,memoryIds:L(r.memoryIds,Re)?r.memoryIds:[],conflicts:[],generatedAt:t,generation:0,status:"ready"}}}catch{}return null}function F(e,n){return [...(e??n).replace(/[\r\n\t|]+/gu," ").trim()||n].slice(0,Mt).join("")}function Wt(e){if(e.length===0)return "";let n=e.slice(0,Tt),t=n.map(r=>{let o=F(r.family,"unknown"),i=F(r.entity,"unknown"),s=F(r.summary,"Explicit choice required.");return `- family=${o}; entity=${i}; status=${r.status}; summary=${s}`});return e.length>n.length&&t.push(`- ${e.length-n.length} additional conflict(s) omitted from SessionStart output.`),`## Withheld preference conflicts (${e.length})
|
|
3
|
+
${t.join(`
|
|
4
|
+
`)}`}function Gt(e){let n=e.now??Date.now();if(Jt(e.configPath)===false)return "";let t=zt(e.projectRoot,e.daemonResponse??"",n),r=t?{snapshot:t,source:"daemon"}:Ut(e.projectRoot,{...e.cacheOptions,now:n}),{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}`:"",a=`DevFlow memory snapshot=${o.status}; source=${r.source}; generatedAt=${i}${s}.`,c=Wt(o.conflicts);return o.markdown?[o.markdown,c,a].filter(Boolean).join(`
|
|
11
6
|
`):["## 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=
|
|
14
|
-
`)}:{}}};let o=
|
|
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
|
|
7
|
+
`)}if(process.env.DEVFLOW_MEMORY_SNAPSHOT_CLI==="1"){let[,,e,n,t]=process.argv;e!=="session-start"||!n?process.exitCode=2:process.stdout.write(Gt({projectRoot:n,configPath:t,daemonResponse:process.env.DEVFLOW_MEMORY_RESPONSE}));}function S(e){let n=Yt(e.projectRoot),t=openGlobalDevFlowDatabase(void 0,{busyTimeoutMs:250});try{let r=Xt(t,{...e,projectRoot:n});return r?appendTaskRuntimeBoundary({projectRoot:r.projectRoot,taskSpec:taskSpecFromImmutableIntent(Zt(r)),kind:e.kind,payload:e.payload,dedupeKey:e.dedupeKey,producer:e.producer,database:t})?.snapshot??null:null}catch(r){return emitSemanticControlLog({event:"task.runtime.shadow_mismatch",identity:{projectRoot:n,sessionId:e.sessionId,...e.turnId?{turnId:e.turnId}:{},...e.requestId?{requestId:e.requestId}:{}},level:"warn",timestamp:Date.now(),data:{stage:e.kind,reason:tn(r),authority:"legacy"}}),null}finally{t.close();}}function Yt(e){try{return realpathSync(e)}catch{return e}}function Xt(e,n){return e.listLatestTaskIntentArtifacts(n.projectRoot,n.sessionId).find(t=>n.turnId?t.turnId===n.turnId:n.requestId?t.requestId===n.requestId:true)}function Zt(e){return {identity:en(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 en(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 tn(e){return e instanceof Error?e.message:String(e)}var rn=/^(?:ok(?:ay)?|yes|no|thanks?|thank you|continue|好的?|可以|行|是|否|谢谢|继续|收到|明白了?)[.!。!\s]*$/iu,on=/(?:记住|记下|保存|持久化|跨会话|以后|始终|永远|统一使用|项目约定|团队约定|偏好|决定采用|保留可复用|提炼结论|沉淀|记录(?:下来|为|成)?(?:架构|规则|约定|知识|结论))|\b(?:remember|memorize|persist|across sessions|from now on|always|project convention|team convention|preference|we use|adopt|retain reusable|distill)\b/iu,sn=/(?:分析|审查|检查|评估|性能|生成|创建|新建|添加|编写|实现|开发|设计|撰写|总结|修改|重构|修复|调试|解释|查看)|\b(?:analy[sz]e|review|inspect|audit|performance|generate|create|add|build|implement|develop|design|write|summarize|modify|refactor|fix|debug|explain)\b/iu;function an(e){let n=e.trim();return n.length>0&&!rn.test(n)}function cn(e){let n=e.normalize("NFKC").trim();return n.length>=4&&sn.test(n)&&!on.test(n)&&R(n)===null}function dn(e,n,t=Date.now()){let r=createHash$1("sha256").update(n.trim()).digest("hex"),o=createHash$1("sha256").update(`${e}\0${t}\0${r}`).digest("hex").slice(0,24);return {turnId:`turn:${o}`,eventId:`memory-turn:${o}`,promptHash:r,createdAt:t}}function Ae(e,n,t=[]){return `memory-receipt:${createHash$1("sha256").update(`${e}\0${n}\0${[...t].sort().join("\0")}`).digest("hex").slice(0,24)}`}function ln(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 q(e){let n=e.memoryIds.length>0?e.memoryIds.join(","):"none",t=e.status==="committed"?"accepted":e.status,r=e.status==="committed"?"; indexStatus=pending":"",o=e.memoryIds.some(a=>a.startsWith("raw-memory:")),i=e.status==="committed"&&e.source==="explicit_intent"&&!o?"; memoryOnlyCompleted=true; skipProjectContext=true; hostRefinementRequired=true":e.status==="committed"&&e.source==="explicit_intent"?"; asyncReadiness=queued; hostRefinementRequired=true":"",s=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=${t}; receiptId=${e.receiptId??"missing"}; turnId=${e.turnId}; memoryIds=${n}; source=${e.source??"unknown"}${r}${i}.`+s}function xe(e){if(!an(e.prompt))return null;let n=openGlobalDevFlowDatabase(void 0,{busyTimeoutMs:50});try{let t=e.prompt.trim().slice(0,4e3),r=createHash$1("sha256").update(t).digest("hex"),o=n.listMemoryTurns(e.projectRoot,e.sessionId,5).find(d=>d.promptHash===r&&Date.now()-d.createdAt<1e4),i=o?{turnId:o.turnId,eventId:o.eventId,promptHash:o.promptHash,createdAt:o.createdAt}:e.identity??dn(e.sessionId,t),s=o??n.beginMemoryTurn({...i,projectRoot:e.projectRoot,sessionId:e.sessionId});if(s.status!=="pending")return {turn:s,additionalContext:q(s),skipSkillRouting:s.source==="explicit_intent"};let a=R(t)??void 0;if(!a&&cn(t)){let d=Ae(s.turnId,"skipped"),l=n.skipMemoryTurn({turnId:s.turnId,receiptId:d,source:"automatic_transient_skip",reason:"high_confidence_transient_task"});return S({projectRoot:e.projectRoot,sessionId:e.sessionId,turnId:s.turnId,kind:"memory.skipped",payload:{receiptId:d,reasonCode:"high_confidence_transient_task"},dedupeKey:d,producer:"devflow-memory-turn"}),emitSemanticControlLog({event:"memory.semantic.decided",identity:{projectRoot:e.projectRoot,sessionId:e.sessionId,turnId:s.turnId},level:"info",timestamp:Date.now(),data:{status:"semantic_empty",operation:"none",reason:"high_confidence_transient_task"}}),{turn:l,additionalContext:q(l),skipSkillRouting:!1}}let c=a?"commit_explicit":"capture_prompt",u=n.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:t,explicitContent:a,createdAt:s.createdAt}});if(a){let d=`raw-memory:${createHash$1("sha256").update(`${e.projectRoot}\0${i.turnId}\0${a}`).digest("hex").slice(0,24)}`,l=Ae(s.turnId,"committed",[d]),f=n.commitMemoryTurn({turnId:s.turnId,receiptId:l,memoryIds:[d],source:"explicit_intent",reason:"explicit_raw_queued",decidedAt:Date.now()});return S({projectRoot:e.projectRoot,sessionId:e.sessionId,turnId:s.turnId,kind:"durable_work.owned",payload:{workId:u.id,obligation:"memory"},dedupeKey:`${u.id}:owned`,producer:"devflow-memory-turn"}),S({projectRoot:e.projectRoot,sessionId:e.sessionId,turnId:s.turnId,kind:"memory.committed",payload:{receiptId:l,reasonCode:"explicit_raw_queued"},dedupeKey:l,producer:"devflow-memory-turn"}),emitSemanticControlLog({event:"memory.write.completed",identity:{projectRoot:e.projectRoot,sessionId:e.sessionId,turnId:s.turnId,actionReceipt:l},level:"info",timestamp:Date.now(),data:{stage:"explicit_fast_ack",durable:!0,rawMemoryId:d,receiptLatencyMs:Date.now()-i.createdAt,asyncReadiness:"queued"}}),{turn:f,explicitContent:a,additionalContext:q(f),skipSkillRouting:!0}}return S({projectRoot:e.projectRoot,sessionId:e.sessionId,turnId:s.turnId,kind:"memory.pending",payload:{reasonCode:"semantic_decision_queued"},dedupeKey:`${s.turnId}:pending`,producer:"devflow-memory-turn"}),S({projectRoot:e.projectRoot,sessionId:e.sessionId,turnId:s.turnId,kind:"durable_work.owned",payload:{workId:u.id,obligation:"memory"},dedupeKey:`${u.id}:owned`,producer:"devflow-memory-turn"}),{turn:s,explicitContent:a,additionalContext:ln(s),skipSkillRouting:!1}}finally{n.close();}}function Ce(e,n){let t=gn(e);mkdirSync$1(t,{recursive:true,mode:448});let r=`memory-turn-spool-${Date.now()}-${process.pid}-${randomUUID$1()}`,o=join(t,`${r}.json`),i=`${o}.tmp`;return writeFileSync$1(i,JSON.stringify({...n,prompt:n.prompt.trim().slice(0,4e3)}),{mode:384}),renameSync$1(i,o),r}function gn(e){return join(_(e),"memory-turn-pending")}function Te(e){let n=Date.now();try{let t=openGlobalDevFlowDatabase(void 0,{busyTimeoutMs:100});try{let r=`context-prefetch:${createHash$1("sha256").update(`${e.projectRoot}\0${e.sessionId}\0${e.executionId}\0${In(e.prompt)}\0${e.profileFingerprint}`).digest("hex")}`,o=t.enqueueWork({idempotencyKey:r,kind:"context.prefetch",projectRoot:e.projectRoot,sessionId:e.sessionId,payload:e,maxAttempts:3});return I("prefetch_queue",{projectRoot:e.projectRoot,skillName:e.skillName,accepted:!0,workState:o.state,latencyMs:Date.now()-n}),{accepted:!0,workItemId:o.id}}finally{t.close();}}catch(t){let r=t instanceof Error?t.message:String(t);return I("prefetch_queue",{projectRoot:e.projectRoot,skillName:e.skillName,accepted:false,reason:r,latencyMs:Date.now()-n}),{accepted:false,reason:r}}}function In(e){return e.trim().toLowerCase().replace(/\s+/g," ").slice(0,4e3)}function Oe(e){let n=Date.now(),t=Hn(e.projectRoot),r=claudeCodeRuntimeAdapter.normalizePrompt(e.hostEvent??{session_id:e.sessionId,prompt:e.prompt},{projectRoot:t}),o=r.sourceHash,i=openGlobalDevFlowDatabase(void 0,{busyTimeoutMs:100});try{let s=i.getTaskIntentArtifactBySource({projectRoot:t,sessionId:e.sessionId,sourceHash:o});if(s){let h=xn(i,s);return {artifact:Mn(s),queryPlan:On(h),memoryIdentity:Me(s),reused:!0}}let a=$n(r.rawPrompt,r.command),c=buildRetrievalTaskPlan({query:a,parsedIntent:parseIntent(a,{segmentation:"regex"}),targetAnchors:jn(r.rawPrompt),activeSkill:r.activeSkill,command:r.command}),u=`turn:${x(`${e.sessionId}\0${o}`)}`,d=`request:${x(`${t}\0${e.sessionId}\0${u}`)}`,l={projectRoot:t,projectId:`project:${x(t)}`,hostId:r.hostId,sessionId:e.sessionId,turnId:u,requestId:d},f=[{source:"deterministic_parser",field:"intent",value:c.intent,reason:c.classification.intentReason,confidence:c.classification.intentSource==="semantic_override"?.95:.75},{source:r.command?"slash_command":"deterministic_parser",field:"action",value:c.action,reason:c.classification.actionReason,confidence:r.command||c.action!=="analyze"?.95:.65},...c.targetAnchors.map(h=>({source:"target_anchor",field:"target",value:h,reason:"explicit_prompt_target",confidence:1}))],v={identity:l,version:1,rawPrompt:r.rawPrompt,normalizedPrompt:Nn(r.rawPrompt),...r.command?{command:r.command}:{},slashArgs:r.slashArgs,...r.activeSkill?{activeSkill:r.activeSkill}:{},intent:c.intent,action:c.action,entities:c.entities,targetAnchors:c.targetAnchors,policyConstraints:Pn(r.rawPrompt),classificationEvidence:f,sourceEventIds:[r.sourceEventId??`host-event:${o.slice(0,24)}`],sourceHash:o,createdAt:r.timestamp},m={...v,artifactHash:Fn(v)},y=buildChannelQueryPlan({artifact:m,taskPlan:c,expandedTerms:e.expandedTerms});i.appendTaskIntentArtifact(Cn(m)),i.appendChannelQueryPlan(Tn(y));let $e=Dn(i,m);try{appendTaskRuntimeBoundary({projectRoot:t,taskSpec:taskSpecFromImmutableIntent(m),kind:"task.spec.bound",payload:{intentArtifactHash:m.artifactHash},dedupeKey:m.artifactHash,producer:"devflow-task-intent",createdAt:m.createdAt,database:i});}catch(h){emitSemanticControlLog({event:"task.runtime.shadow_mismatch",identity:l,level:"warn",timestamp:Date.now(),data:{stage:"task.spec.bound",reason:h instanceof Error?h.message:String(h),authority:"legacy"}});}return emitSemanticControlLog({event:"host.prompt.normalized",identity:l,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: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,parserMode:"regex",captureLatencyMs:Date.now()-n}}),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(h=>h.requirement)}}),emitSemanticControlLog({event:"terminal.transition.persisted",identity:l,level:"info",timestamp:Date.now(),data:{state:"intent_bound",receiptId:$e,sourceIntentHash:m.artifactHash}}),{artifact:m,queryPlan:y,memoryIdentity:Me(m),reused:!1}}finally{i.close();}}function xn(e,n){let t=e.getChannelQueryPlanForIntent({projectRoot:n.projectRoot,sessionId:n.sessionId,turnId:n.turnId,sourceIntentHash:n.artifactHash});if(!t)throw new Error(`QUERY_PLAN_NOT_FOUND:${n.artifactHash}`);return t}function Dn(e,n){let t=e.getLatestTerminalTransition(n.identity.projectRoot,n.identity.sessionId,n.identity.turnId);if(t)return t.receiptId;let r=`terminal:${x(`${n.artifactHash}\0open`)}`;return e.appendTerminalTransition({...n.identity,sequence:1,toState:"open",receiptId:r,reason:"host_prompt_accepted",payload:{sourceHash:n.sourceHash},createdAt:n.createdAt}),e.appendTerminalTransition({...n.identity,sequence:2,fromState:"open",toState:"intent_bound",receiptId:`terminal:${x(`${n.artifactHash}\0intent_bound`)}`,sourceReceiptId:r,reason:"immutable_intent_persisted",payload:{intentArtifactHash:n.artifactHash},createdAt:Math.max(n.createdAt,Date.now())}).receiptId}function Cn(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(n=>({...n})),sourceEventIds:e.sourceEventIds,sourceHash:e.sourceHash,artifactHash:e.artifactHash,createdAt:e.createdAt}}function Tn(e){return {...e.identity,sourceIntentHash:e.sourceIntentHash,planHash:e.planHash,code:e.code.map(n=>({...n})),memory:e.memory.map(n=>({...n})),knowledge:e.knowledge.map(n=>({...n})),generatedBy:e.generatedBy,degradation:e.degradation?{...e.degradation}:void 0,createdAt:e.createdAt}}function Mn(e){return {identity:je(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 On(e){return {identity:je(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 je(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 Me(e){let n=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(n).digest("hex"),createdAt:e.createdAt}}function jn(e){let n=e.match(/(?:^|[\s`'"(])((?:\.{0,2}\/)?(?:[A-Za-z0-9_@.-]+\/)+[A-Za-z0-9_@.-]+(?:\.[A-Za-z0-9]+)?)/gu)??[];return Pe(n.map(t=>t.trim().replace(/^[`'"(]+|[`'"),.;:,。;:]+$/gu,"")).filter(t=>!t.startsWith("/")||/\.[A-Za-z0-9]+$/u.test(t))).slice(0,16)}function Pn(e){let n=e.match(/--[a-z0-9][a-z0-9-]*(?:=[^\s,。;;]+)?/giu)??[];return Pe(n.map(t=>t.normalize("NFKC"))).slice(0,16)}function $n(e,n){return n&&e.trimStart().replace(new RegExp(`^\\/${Ln(n)}\\b`,"iu"),"").trim()||e.trim()}function Nn(e){return e.normalize("NFKC").replace(/\s+/gu," ").trim().slice(0,4e3)}function Pe(e){return [...new Set(e.filter(Boolean))]}function Hn(e){let n=resolve(e);try{return realpathSync(n)}catch{return n}}function Fn(e){return createHash$1("sha256").update(U(e)).digest("hex")}function x(e){return createHash$1("sha256").update(e).digest("hex").slice(0,24)}function U(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(U).join(",")}]`;if(!e||typeof e!="object")return JSON.stringify(String(e));let n=e;return `{${Object.keys(n).sort().map(t=>`${JSON.stringify(t)}:${U(n[t])}`).join(",")}}`}function Ln(e){return e.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&")}var g=process.env.CLAUDE_PROJECT_DIR||process.cwd();async function Jn(e){let n=W()?[z]:[],t;try{t=JSON.parse(e);}catch{return {hookSpecificOutput:{hookEventName:"UserPromptSubmit",permissionDecision:"allow",...n.length?{additionalContext:n.join(`
|
|
8
|
+
`)}:{}}}}let r=t.prompt||"";if(!r.trim())return {hookSpecificOutput:{hookEventName:"UserPromptSubmit",permissionDecision:"allow",...n.length?{additionalContext:n.join(`
|
|
9
|
+
`)}:{}}};let o=t.session_id?.trim(),i=re(r),s=false,a,c,u=o?new C(g):void 0;if(o){try{c=Oe({projectRoot:g,sessionId:o,prompt:r,hostEvent:t}),u.bindTaskIdentity(o,{turnId:c.artifact.identity.turnId,requestId:c.artifact.identity.requestId,intentArtifactHash:c.artifact.artifactHash}),n.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(d){n.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:g,sessionId:o},level:"error",timestamp:Date.now(),data:{stage:"user_prompt_submit",category:"intent_persistence_unavailable",error:d instanceof Error?d.message:String(d)}});}try{let d=xe({projectRoot:g,sessionId:o,prompt:r,...c?{identity:c.memoryIdentity}:{}});d&&(n.push(d.additionalContext),s=d.skipSkillRouting);}catch(d){s=!!R(r);try{let l=Ce(g,{sessionId:o,prompt:r,createdAt:Date.now()});n.push(`DevFlow memory turn status=accepted; durable=true; receiptId=${l}; canonicalMemory=false; SQLite queue replay pending. Do not claim memory success without a canonical receipt.`),emitSemanticControlLog({event:"memory.write.degraded",identity:{projectRoot:g,sessionId:o},level:"warn",timestamp:Date.now(),data:{stage:"turn_capture",reason:d.message,fallback:"durable_spool",receiptId:l}});}catch(l){n.push("DevFlow memory turn status=degraded; durable=false; no canonical receipt exists. Do not claim memory success."),emitSemanticControlLog({event:"memory.write.degraded",identity:{projectRoot:g,sessionId:o},level:"error",timestamp:Date.now(),data:{stage:"turn_capture",reason:l.message,fallback:"none"}});}}}if(o&&i&&!s){let d=u.get(o)?.executionId,l=u.startExecution(o,i.skillName,ie(i.skillName));if(a=l.executionId,l.executionId&&l.executionId!==d){let v=new O;try{await v.sendSessionStart(o,g,l.startedAt),await v.sendExecutionStart(l.executionId,o,i.skillName,l.lastActivityAt,g,l.requiredMcpTools);}finally{v.close();}}let f=se(i.skillName,g,r);f&&n.push(f);}if(o&&i&&a&&!s){let d=resolveProjectCapabilityProfile(g),l=resolveCapabilityRollout(g).config.retrievalSessions;Te({prompt:r.trimStart().replace(/^\/devflow:[a-z0-9][a-z0-9-]*\b/i,"").trim()||r,projectRoot:g,sessionId:o,executionId:a,skillName:i.skillName,profileFingerprint:d.fingerprint,rolloutMode:l,retrievalVersion:"r2.v1",createdAt:Date.now()});}return {hookSpecificOutput:{hookEventName:"UserPromptSubmit",permissionDecision:"allow",...n.length?{additionalContext:n.join(`
|
|
10
|
+
`)}:{}}}}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 n="";process.stdin.setEncoding("utf8"),process.stdin.on("data",t=>{n+=t;}),process.stdin.on("end",async()=>{let t=await Jn(n.trim()||process.argv[2]||"");e(JSON.stringify(t)),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{Jn 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" ] \
|