@devflow-tools/cli 0.17.7 → 0.18.0

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.
Files changed (49) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +2 -2
  3. package/dist/commands/context.d.ts +1 -1
  4. package/dist/commands/context.d.ts.map +1 -1
  5. package/dist/commands/context.js +8 -2
  6. package/dist/commands/context.js.map +1 -1
  7. package/dist/commands/db.js +1 -1
  8. package/dist/commands/db.js.map +1 -1
  9. package/dist/commands/docs.d.ts.map +1 -1
  10. package/dist/commands/docs.js +2 -0
  11. package/dist/commands/docs.js.map +1 -1
  12. package/dist/commands/doctor.d.ts.map +1 -1
  13. package/dist/commands/doctor.js +34 -44
  14. package/dist/commands/doctor.js.map +1 -1
  15. package/dist/commands/graph.js +1 -1
  16. package/dist/commands/graph.js.map +1 -1
  17. package/dist/commands/index-cmd.js +1 -1
  18. package/dist/commands/index-cmd.js.map +1 -1
  19. package/dist/commands/init.d.ts.map +1 -1
  20. package/dist/commands/init.js +2 -1
  21. package/dist/commands/init.js.map +1 -1
  22. package/dist/commands/knowledge.d.ts +1 -1
  23. package/dist/commands/knowledge.d.ts.map +1 -1
  24. package/dist/commands/knowledge.js +21 -5
  25. package/dist/commands/knowledge.js.map +1 -1
  26. package/dist/commands/memory.d.ts.map +1 -1
  27. package/dist/commands/memory.js +3 -2
  28. package/dist/commands/memory.js.map +1 -1
  29. package/dist/commands/plugin-memory-hints.js +3 -0
  30. package/dist/commands/plugin-memory-hints.js.map +1 -1
  31. package/dist/commands/workflow.js +1 -1
  32. package/dist/commands/workflow.js.map +1 -1
  33. package/dist/index.js +1 -2
  34. package/dist/index.js.map +1 -1
  35. package/dist/plugin-files/.claude-plugin/plugin.json +1 -1
  36. package/dist/plugin-files/dist/command-registry.json +5 -5
  37. package/dist/plugin-files/dist/hooks/enforcer-summary.js +3 -3
  38. package/dist/plugin-files/dist/hooks/hook-client.js +3 -3
  39. package/dist/plugin-files/dist/hooks/hook-daemon.js +27 -25
  40. package/dist/plugin-files/dist/hooks/post-tool-use-failure.js +2 -2
  41. package/dist/plugin-files/dist/hooks/post-tool-use.js +6 -6
  42. package/dist/plugin-files/dist/hooks/pre-compact.js +2 -2
  43. package/dist/plugin-files/dist/hooks/pre-tool-use.js +4 -4
  44. package/dist/plugin-files/dist/hooks/server-bootstrap.js +22 -22
  45. package/dist/plugin-files/dist/hooks/session-end.js +6 -6
  46. package/dist/plugin-files/dist/hooks/stop.js +10 -10
  47. package/dist/plugin-files/dist/hooks/user-prompt-submit.js +11 -9
  48. package/dist/plugin-files/package.json +28 -19
  49. package/package.json +39 -29
@@ -1,10 +1,12 @@
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,resolveSemanticResolutionMode,projectSemanticFrameToLegacyIntent,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,extractStructuralSemanticEvidence,createProvisionalSemanticFrame,buildChannelQueryPlan}from'@devflow-tools/context-engine';function b(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 G="WARNING: DevFlow is in degraded mode (daemon unreachable): 4-Gate enforcement and memory prefetch cache are unavailable. Run `devflow doctor` for details.";function K(){return process.env.DEVFLOW_HOOK_DEGRADED==="1"}function ze(e){return e??process.env.CLAUDE_PROJECT_DIR??process.cwd()}function R(e){return process.env.DEVFLOW_STATE_DIR??getProjectStateDir(ze(e))}function Y(e){return Buffer.from(e,"utf8").toString("base64url")}function Be(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 re(e){return `${e}:legacy-journal`}var T=class{constructor(n){this.projectRoot=n;this.sessions=new Map;this.sessionsDir=join$1(R(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=X(i.evidenceObligations),i.evidenceDegradations=Z(i.evidenceDegradations),i.evidenceOutcomes=ee(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),d=(o?void 0:i.evidenceObligations.find(m=>m.contractId===t.id))?.obligationId??Be(t.id,o,r);this.appendEvidenceEvent(n,{kind:"add",obligationId:d,contractId:t.id,at:r,contract:t},`add\0${d}`),this.replayEvidenceJournal(i);let a=i.evidenceObligations.find(m=>m.obligationId===d);return a?(i.lastActivityAt=Date.now(),this.persist(i),structuredClone(a)):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),d=s?.evidenceObligations.find(l=>l.obligationId===t);if(!s||!d)return null;let a=/^[a-f0-9]{64}$/.test(o)?o:"";if(!a)return null;this.appendEvidenceEvent(n,{kind:"correction",obligationId:t,contractId:d.contractId,at:i,fingerprint:a,violations:r.slice(0,16).map(l=>l.slice(0,240))},`correction\0${t}\0${a}`),this.replayEvidenceJournal(s),s.lastActivityAt=i,this.persist(s);let m=s.evidenceObligations.find(l=>l.obligationId===t);return m?structuredClone(m):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(a=>a.obligationId===t);if(!i||!s)return false;let d=r.slice(0,240);return this.appendEvidenceEvent(n,{kind:"degrade",obligationId:t,contractId:s.contractId,at:o,reason:d},`degrade\0${t}\0${d}`),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,`${Y(n)}.json`)}evidenceJournalDir(n){return join$1(this.sessionsDir,"evidence-journal",Y(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 d=join$1(o,`.${process.pid}.${randomUUID()}.tmp`);writeFileSync(d,JSON.stringify(t),{mode:384});try{linkSync(d,s);}catch(a){if(a.code!=="EEXIST")throw a}finally{rmSync(d,{force:true});}}replayEvidenceJournal(n){n.evidenceObligations=X(n.evidenceObligations),n.evidenceDegradations=Z(n.evidenceDegradations),n.evidenceOutcomes=ee(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 d=Ve(JSON.parse(s));return d?[d]:[]}catch{return []}}).sort((i,s)=>i.at-s.at||te(i.kind)-te(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(d=>d.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 X(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)||!oe(t.contract))return [];let r=typeof t.obligationId=="string"&&t.obligationId.length>0&&t.obligationId.length<=384?t.obligationId:re(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 Z(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 ee(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 Ve(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:re(n.contractId),contractId:n.contractId,at:n.at};if(t==="add")return oe(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 te(e){return e==="add"?0:e==="correction"?1:2}function oe(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 Qe(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 ie(e){let n=e.trimStart().match(/^\/(devflow:[a-z0-9][a-z0-9-]*)\b/i);if(!n)return null;let t=Qe(n[1]);return t?{rawName:n[1],skillName:t}:null}var tt=2,nt=1;function rt(){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 se(e=rt()){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!==tt&&r.version!==nt||!ot(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 ot(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 M(t.mcpTools)&&M(t.blockedNative)&&(t.source===void 0||t.source==="core"||t.source==="plugin")&&(t.requiresContext===void 0||typeof t.requiresContext=="boolean")&&(t.runtimePackages===void 0||M(t.runtimePackages))&&(t.hostTools===void 0||it(t.hostTools))&&(t.evidenceMode===void 0||["static","runtime","mixed"].includes(t.evidenceMode))})}function it(e){return !!e&&typeof e=="object"&&!Array.isArray(e)&&Object.entries(e).every(([n,t])=>n.length>0&&M(t))}function M(e){return Array.isArray(e)&&e.every(n=>typeof n=="string"&&n.length>0)}function ae(e){let n=se();return n?n[e]?.mcpTools??[]:[]}function ce(e,n,t){return formatSkillRuntimeOverlay(createSkillRuntimeOverlay(e,n,{prompt:t}))}var ft=getLocalApiKey(),F=join(homedir(),".devflow","errors");async function ge(e,n,t={}){let r=t.endpoint??resolveRuntimeEndpoint().url,o=t.timeout??1500,i=t.durableMirror??true,s=t.maxRetries??(i?0:2),d=t.circuitBreaker??true,a=acquireRuntimeHttpCircuit(r,e);if(d&&!a.allowed)return {delivered:false,suppressed:true,fallbackReason:a.state.fallbackReason};let m;for(let c=0;c<=s;c+=1)try{return await gt(r,e,n,o),d&&registerRuntimeHttpSuccess(r,e).transitioned&&b("http_circuit_transition",{endpoint:r,path:new URL(e,r).pathname,previous:a.state.status,status:"closed",failures:0}),{delivered:!0,suppressed:!1}}catch(p){m=p instanceof Error?p:new Error(String(p)),c<s&&await yt(Math.min(100*2**c,1e3));}if(!m)return {delivered:false,suppressed:false,fallbackReason:"unknown_http_failure"};if(!d)return pe(e,m),{delivered:false,suppressed:false,fallbackReason:m.message};let l=registerRuntimeHttpFailure(r,e,t.fallbackReason??(i?"local_durable_mirror":"http_delivery_failed"));return l.transitioned&&(pe(e,m),b("http_circuit_transition",{endpoint:r,path:new URL(e,r).pathname,previous:a.state.status,status:"open",failures:l.state.failures,openUntil:l.state.openUntil,fallbackReason:l.state.fallbackReason})),{delivered:false,suppressed:false,fallbackReason:l.state.fallbackReason}}function gt(e,n,t,r){return new Promise((o,i)=>{let s=JSON.stringify(t),d=new URL(n,e),a=false,m=c=>{a||(a=true,c?i(c):o());},l=request({hostname:d.hostname,port:d.port,path:d.pathname+d.search,method:"POST",headers:{"Content-Type":"application/json","X-API-Key":ft,"Content-Length":Buffer.byteLength(s)},timeout:r},c=>{c.on("error",m),c.on("end",()=>{let p=c.statusCode??0;m(p>=200&&p<300?void 0:new Error(`HTTP ${p}`));}),c.resume();});l.on("error",m),l.on("timeout",()=>l.destroy(new Error(`HTTP mirror timed out after ${r}ms`))),l.write(s),l.end();})}function pe(e,n){try{existsSync$1(F)||mkdirSync$1(F,{recursive:!0}),appendFileSync(join(F,"http-errors.log"),`${new Date().toISOString()} | ${e} | ${n.message}
2
- `);}catch{}}function yt(e){return new Promise(n=>setTimeout(n,e))}var be=1e4,wt=3e4,O=500,j=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 d={executionId:n,sessionId:t,skillName:r,startedAt:o,projectRoot:i,requiredMcpTools:s};this.commitOrCache("execution_start",d)&&this.postHttp("/api/telemetry/skill-execution/start",d);}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:O}).reverse();for(let i of o)try{this.applyOperation(i.operation,i.payload),r.resolveTelemetryFailure(i.id);}catch{}r.trimTelemetryFailures(O);}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:kt(JSON.parse(readFileSync$1(i,"utf8")),o)}}catch{return null}})).filter(r=>r!==null).sort((r,o)=>r.envelope.timestamp-o.envelope.timestamp||we(r.envelope.operation)-we(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:ke(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(ke(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(O),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-O)))unlinkSync(join$1(this.cacheDir,t));}catch{}}scheduleRetry(){this.retryScheduled||(this.retryScheduled=true,setTimeout(()=>{this.retryScheduled=false,this.flushCache();},wt).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){ge(n,t,{endpoint:this.apiUrl,fallbackReason:"telemetry_already_committed_locally"});}truncateInput(n){let t=JSON.stringify(n);return t===void 0||t.length<=be?n:{_truncated:true,_original_size:t.length,_preview:`${t.substring(0,be)}...`}}};function we(e){return ["session_start","execution_start","tool_call","complete_event","execution_complete","session_end"].indexOf(e)}function ke(e){return `hook-run:${e}`}function kt(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 St=/^\/(?:devflow:)?[\w-]+\b\s*/iu,_t=/\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,Rt=/(?:^|[.!?]\s*)(?:(?:please|kindly)\s+)?(?:remember|memorize|save\s+this|store\s+this|note\s+that)(?:\s+(?:that|to))?[\s:,-]*(.+)$/iu,Et=/(?:^|[。!?;,,]\s*)(?:(?:请|麻烦|务必|一定要|帮我|帮忙|需要)\s*)?(?:记住|记一下|记下来|记|记录一下|记录下来|保存一下|保存下来)(?:这(?:件事|一点|个信息|些内容))?[\s::,,]*(.+)$/iu;function E(e){let n=e.trim().replace(St,"").trim();return !n||_t.test(n)?null:(Et.exec(n)??Rt.exec(n))?.[1]?.trim().replace(/^[::,,\s]+/u,"")||null}var P=1,Ot="memory-snapshot-v1.json",jt=512*1024,Ee=256*1024,Ae=2e3,Pt=500,$t=10,Ht=240,Nt=300*1e3,Ft=720*60*60*1e3,Lt=2147483647;function qt(e){return e.currentUid===void 0?{ownerSafe:true,modeSafe:true}:{ownerSafe:e.ownerUid===e.currentUid,modeSafe:(e.mode&18)===0}}function S(e){return resolve(e)}function A(e){return createHash$1("sha256").update(S(e)).digest("hex").slice(0,16)}function Ut(e,n={}){let t=A(e),r=n.stateRoot?join(n.stateRoot,t):getProjectStateDir(S(e));return join(r,Ot)}function Jt(e,n){let r=(e instanceof Error?e.message:"").replace(/[\r\n\t]+/gu," ").trim().slice(0,160);return r?`${n}:${r}`:n}function q(e,n){return Array.isArray(e)&&e.length<=n&&e.every(t=>typeof t=="string"&&t.length>0&&t.length<=512)}function zt(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)&&q(n.memoryIds,100)&&(n.status==="withheld"||n.status==="resolved")&&(n.summary===void 0||typeof n.summary=="string"&&n.summary.length<=2e3)}function Wt(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 xe(e,n,t){if(!e||typeof e!="object"||Array.isArray(e))return null;let r=e,o=S(n),i=A(o),s=r.generation===void 0?0:r.generation;return r.version!==P||r.projectRoot!==o||r.projectHash!==i||typeof r.markdown!="string"||Buffer.byteLength(r.markdown,"utf8")>Ee||!q(r.memoryIds,Ae)||!Array.isArray(r.conflicts)||r.conflicts.length>Pt||!r.conflicts.every(zt)||typeof r.generatedAt!="number"||!Number.isFinite(r.generatedAt)||r.generatedAt<0||r.generatedAt>t+Nt||!Number.isInteger(s)||s<0||s>Lt||!["ready","pending","degraded","disabled"].includes(String(r.status))||r.degradation!==void 0&&!Wt(r.degradation)?null:{...r,generation:s}}function Gt(e,n,t,r,o=0){let i=S(e);return {version:P,projectRoot:i,projectHash:A(i),markdown:"",memoryIds:[],conflicts:[],generatedAt:r,generation:o,status:n,degradation:{reason:t}}}function Kt(e,n={}){let t=n.now??Date.now(),r=Ut(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>jt)throw new Error("cache_size_invalid");let s=qt({...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 d=JSON.parse(readFileSync(o,"utf8")),a=xe(d,e,t);if(!a)throw new Error("cache_schema_invalid");return a.status==="ready"&&t-a.generatedAt>Ft?{snapshot:{...a,status:"degraded",degradation:{reason:"cache_stale",stale:!0}},source:"cache",valid:!0,stale:!0}:{snapshot:a,source:"cache",valid:!0,stale:!1}}catch(i){let d=i.code==="ENOENT";return {snapshot:Gt(e,d?"pending":"degraded",d?"cache_missing":Jt(i,"cache_invalid"),t),source:"none",valid:false,stale:false}}finally{if(o!==void 0)try{closeSync(o);}catch{}}}function Bt(e){if(!e)return true;try{return JSON.parse(readFileSync(e,"utf8")).sessionStart?.injectMemories??!0}catch{return true}}function Vt(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=S(e);return {version:P,projectRoot:i,projectHash:A(i),markdown:"",memoryIds:[],conflicts:[],generatedAt:t,generation:0,status:"disabled"}}let o=xe(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")<=Ee){let i=S(e);return {version:P,projectRoot:i,projectHash:A(i),markdown:r.markdown,memoryIds:q(r.memoryIds,Ae)?r.memoryIds:[],conflicts:[],generatedAt:t,generation:0,status:"ready"}}}catch{}return null}function L(e,n){return [...(e??n).replace(/[\r\n\t|]+/gu," ").trim()||n].slice(0,Ht).join("")}function Qt(e){if(e.length===0)return "";let n=e.slice(0,$t),t=n.map(r=>{let o=L(r.family,"unknown"),i=L(r.entity,"unknown"),s=L(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})
1
+ import {openGlobalDevFlowDatabase}from'@devflow-tools/database';import {getLocalApiKey,getDevFlowStateRoot,resolveProjectCapabilityProfile,resolveCapabilityRollout,claudeCodeRuntimeAdapter,semanticTextHash,stableRuntimeHash,resolveRuntimeActivationSnapshot,getProjectStateDir,resolveRuntimeEndpoint,acquireRuntimeHttpCircuit,registerRuntimeHttpSuccess,registerRuntimeHttpFailure}from'@devflow-tools/sdk';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 {fileURLToPath}from'url';import {emitSemanticControlLog,SemanticRuntimeEventProjector}from'@devflow-tools/telemetry';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,relative}from'node:path';import {request}from'node:http';import {createHash as createHash$1,randomUUID as randomUUID$1}from'node:crypto';import {TaskKernel,TaskEventStore}from'@devflow-tools/task-runtime';function h(n,e,t){try{let r=openGlobalDevFlowDatabase();try{r.insertEvent({kind:n,timestamp:Date.now(),duration:t,success:e.success!==!1,metadata:e});}finally{r.close();}}catch{}}var K="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 We(n){return n??process.env.CLAUDE_PROJECT_DIR??process.cwd()}function k(n){return getProjectStateDir(We(n))}function X(n){return Buffer.from(n,"utf8").toString("base64url")}function Xe(n,e,t){let r=e?.trim();if(r){let o=/^[a-zA-Z0-9:._-]{1,192}$/.test(r)?r:`tool-${createHash("sha256").update(r.slice(0,1024)).digest("hex").slice(0,32)}`;return `${n}:${o}`}return `${n}:legacy-${t}-${randomUUID().slice(0,8)}`}function re(n){return `${n}:legacy-journal`}var E=class{constructor(e){this.projectRoot=e;this.sessions=new Map;this.sessionsDir=join$1(k(e),"hook-sessions");}registerSession(e){let t=e.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(e,t,r){let o=this.registerSession(e);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(e,t){let r=this.registerSession(e);return r.activeTurnId=t.turnId,r.activeRequestId=t.requestId,r.intentArtifactHash=t.intentArtifactHash,r.lastActivityAt=Date.now(),this.persist(r),r}get(e){let t=e.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=Z(i.evidenceObligations),i.evidenceDegradations=Q(i.evidenceDegradations),i.evidenceOutcomes=ee(i.evidenceOutcomes),this.replayEvidenceJournal(i),this.sessions.set(t,i),i)}catch{return null}}completeExecution(e){let t=this.get(e);if(!t)return null;let r=structuredClone(t);return delete t.executionId,delete t.skillName,t.requiredMcpTools=[],t.lastActivityAt=Date.now(),this.persist(t),r}addEvidenceObligation(e,t,r=Date.now(),o){let i=this.registerSession(e),a=(o?void 0:i.evidenceObligations.find(m=>m.contractId===t.id))?.obligationId??Xe(t.id,o,r);this.appendEvidenceEvent(e,{kind:"add",obligationId:a,contractId:t.id,at:r,contract:t},`add\0${a}`),this.replayEvidenceJournal(i);let d=i.evidenceObligations.find(m=>m.obligationId===a);return d?(i.lastActivityAt=Date.now(),this.persist(i),structuredClone(d)):null}listEvidenceObligations(e){return (this.get(e)?.evidenceObligations??[]).map(t=>structuredClone(t))}markEvidenceCorrection(e,t,r,o,i=Date.now()){let s=this.get(e),a=s?.evidenceObligations.find(l=>l.obligationId===t);if(!s||!a)return null;let d=/^[a-f0-9]{64}$/.test(o)?o:"";if(!d)return null;this.appendEvidenceEvent(e,{kind:"correction",obligationId:t,contractId:a.contractId,at:i,fingerprint:d,violations:r.slice(0,16).map(l=>l.slice(0,240))},`correction\0${t}\0${d}`),this.replayEvidenceJournal(s),s.lastActivityAt=i,this.persist(s);let m=s.evidenceObligations.find(l=>l.obligationId===t);return m?structuredClone(m):null}resolveEvidenceObligation(e,t){let r=this.get(e);if(!r)return false;let o=r.evidenceObligations.find(s=>s.obligationId===t);if(!o)return false;let i=Date.now();return this.appendEvidenceEvent(e,{kind:"resolve",obligationId:t,contractId:o.contractId,at:i},`resolve\0${t}`),this.replayEvidenceJournal(r),r.lastActivityAt=i,this.persist(r),true}resolveDegradedEvidence(e,t){let r=this.get(e),o=r?.evidenceDegradations.find(s=>s.obligationId===t);if(!r||!o)return false;let i=Date.now();return this.appendEvidenceEvent(e,{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(e,t,r,o=Date.now()){let i=this.get(e),s=i?.evidenceObligations.find(d=>d.obligationId===t);if(!i||!s)return false;let a=r.slice(0,240);return this.appendEvidenceEvent(e,{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(e){let t=e.trim();t&&(this.sessions.delete(t),rmSync(this.snapshotPath(t),{force:true}),rmSync(this.evidenceJournalDir(t),{recursive:true,force:true}));}list(){return [...this.sessions.values()]}snapshotPath(e){return join$1(this.sessionsDir,`${X(e)}.json`)}evidenceJournalDir(e){return join$1(this.sessionsDir,"evidence-journal",X(e))}appendEvidenceEvent(e,t,r){let o=this.evidenceJournalDir(e);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(d){if(d.code!=="EEXIST")throw d}finally{rmSync(a,{force:true});}}replayEvidenceJournal(e){e.evidenceObligations=Z(e.evidenceObligations),e.evidenceDegradations=Q(e.evidenceDegradations),e.evidenceOutcomes=ee(e.evidenceOutcomes);let t=this.evidenceJournalDir(e.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||te(i.kind)-te(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,t){let r=e.evidenceOutcomes.find(s=>s.obligationId===t.obligationId);if(t.kind==="add"){if(r)return;let s=e.evidenceObligations.find(a=>a.obligationId===t.obligationId);s?(s.contract=t.contract,s.promptedAt=Math.min(s.promptedAt,t.at)):e.evidenceObligations.push({obligationId:t.obligationId,contractId:t.contractId,contract:t.contract,promptedAt:t.at,attempt:0,correctionRequested:false,violations:[]});return}let o=e.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")e.evidenceOutcomes=e.evidenceOutcomes.filter(s=>s.obligationId!==t.obligationId),e.evidenceDegradations=e.evidenceDegradations.filter(s=>s.obligationId!==t.obligationId);else if(r)return;t.kind==="degrade"?(e.evidenceObligations=e.evidenceObligations.filter(s=>s.obligationId!==t.obligationId),e.evidenceDegradations.push({obligationId:t.obligationId,contractId:t.contractId,reason:t.reason,degradedAt:t.at,attempt:i,contract:o?.contract})):e.evidenceObligations=e.evidenceObligations.filter(s=>s.obligationId!==t.obligationId),e.evidenceOutcomes.push({obligationId:t.obligationId,contractId:t.contractId,status:t.kind==="resolve"?"resolved":"degraded",completedAt:t.at,attempt:i,...t.kind==="degrade"?{reason:t.reason}:{}});}persist(e){mkdirSync(this.sessionsDir,{recursive:true,mode:448});let t=this.snapshotPath(e.sessionId),r=`${t}.${process.pid}.${randomUUID()}.tmp`;writeFileSync(r,JSON.stringify(e),{mode:384}),renameSync(r,t);}};function Z(n){return Array.isArray(n)?n.flatMap(e=>{if(!e||typeof e!="object")return [];let t=e;if(typeof t.contractId!="string"||t.contractId.length===0||t.contractId.length>128||typeof t.promptedAt!="number"||typeof t.attempt!="number"||typeof t.correctionRequested!="boolean"||!Array.isArray(t.violations)||!oe(t.contract))return [];let r=typeof t.obligationId=="string"&&t.obligationId.length>0&&t.obligationId.length<=384?t.obligationId:re(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 Q(n){return Array.isArray(n)?n.filter(e=>{if(!e||typeof e!="object")return false;let t=e;return typeof t.obligationId=="string"&&typeof t.contractId=="string"&&typeof t.reason=="string"&&typeof t.degradedAt=="number"&&typeof t.attempt=="number"}).slice(-20):[]}function ee(n){return Array.isArray(n)?n.filter(e=>{if(!e||typeof e!="object")return false;let t=e;return typeof t.obligationId=="string"&&typeof t.contractId=="string"&&(t.status==="resolved"||t.status==="degraded")&&typeof t.completedAt=="number"&&typeof t.attempt=="number"&&(t.reason===void 0||typeof t.reason=="string")}).slice(-20):[]}function Ze(n){if(!n||typeof n!="object")return null;let e=n,t=e.kind;if(t!=="add"&&t!=="correction"&&t!=="resolve"&&t!=="degrade"||typeof e.contractId!="string"||e.contractId.length>128||typeof e.at!="number")return null;let o={obligationId:typeof e.obligationId=="string"&&e.obligationId.length>0&&e.obligationId.length<=384?e.obligationId:re(e.contractId),contractId:e.contractId,at:e.at};if(t==="add")return oe(e.contract)?{kind:t,...o,contract:e.contract}:null;if(t==="correction"){let i=typeof e.fingerprint=="string"?e.fingerprint:e.transcriptHash;return typeof i=="string"&&/^[a-f0-9]{64}$/.test(i)&&Array.isArray(e.violations)&&e.violations.every(s=>typeof s=="string"&&s.length<=240)?{kind:t,...o,fingerprint:i,violations:e.violations}:null}return t==="resolve"?{kind:t,...o}:typeof e.reason=="string"&&e.reason.length<=240?{kind:t,...o,reason:e.reason}:null}function te(n){return n==="add"?0:n==="correction"?1:2}function oe(n){if(!n||typeof n!="object")return false;let e=n,t=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(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 e.canonicalReport=="string"&&Buffer.byteLength(e.canonicalReport,"utf8")<=48*1024&&!!e.correctionPolicy&&e.correctionPolicy.maxAttempts===1&&e.correctionPolicy.repeatedViolation==="fail_open"}function Qe(n){let e=n.trim().replace(/^\//,"");if(!e.startsWith("devflow:"))return null;let t=e.slice(8).replace(/^devflow-/,"");return /^[a-z0-9][a-z0-9-]*$/i.test(t)?`devflow:${t.toLowerCase()}`:null}function ie(n){let e=n.trimStart().match(/^\/(devflow:[a-z0-9][a-z0-9-]*)\b/i);if(!e)return null;let t=Qe(e[1]);return t?{rawName:e[1],skillName:t}:null}var p=emitSemanticControlLog;var it=2,st=1;function at(){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 se(n=at()){let e=[join$1(n,"dist","command-registry.json"),join$1(n,"command-registry.json")];for(let t of e)try{if(!existsSync(t))continue;let r=JSON.parse(readFileSync$1(t,"utf8"));if(r.version!==it&&r.version!==st||!ct(r.commands)){p({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){p({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 ct(n){return !n||typeof n!="object"||Array.isArray(n)?false:Object.values(n).every(e=>{if(!e||typeof e!="object"||Array.isArray(e))return false;let t=e;return x(t.mcpTools)&&x(t.blockedNative)&&(t.source===void 0||t.source==="core"||t.source==="plugin")&&(t.requiresContext===void 0||typeof t.requiresContext=="boolean")&&(t.runtimePackages===void 0||x(t.runtimePackages))&&(t.hostTools===void 0||dt(t.hostTools))&&(t.evidenceMode===void 0||["static","runtime","mixed"].includes(t.evidenceMode))})}function dt(n){return !!n&&typeof n=="object"&&!Array.isArray(n)&&Object.entries(n).every(([e,t])=>e.length>0&&x(t))}function x(n){return Array.isArray(n)&&n.every(e=>typeof e=="string"&&e.length>0)}var ft={react:["react","react-dom"],nextjs:["next","react"],vue:["vue"],nest:["@nestjs/core"],tailwind:["tailwindcss"],taro:["@tarojs/taro"],electron:["electron"],graphql:["graphql"]};function gt(n,e){let t=join(n,"package.json"),r=ue(t),o=kt(r,e),i=join(n,"package-lock.json"),s=ue(i),a=wt(s,e);return a?{packageName:e,...o?{declaredRange:o}:{},resolvedVersion:a,evidencePath:relative(n,i)||"package-lock.json",confidence:"high"}:o?{packageName:e,declaredRange:o,evidencePath:relative(n,t)||"package.json",confidence:"medium"}:{packageName:e,confidence:"unknown"}}function le(n,e,t={}){let r=n.replace(/^devflow:/,"").split(":").pop()??n,o=(ft[r]??[]).map(a=>gt(e,a)),i=t.rolloutMode??resolveCapabilityRollout(e).config.learningOverlays;if(i==="off")return {skillName:n,projectRoot:e,packages:o,learned:[],shadowEligible:[],rolloutMode:i};let s=t.database??openGlobalDevFlowDatabase(void 0,{busyTimeoutMs:50});try{let d=s.listLearningCandidates({projectRoot:e,states:["shadow","evaluated","active"],limit:100}).filter(c=>c.projectRoot===e||c.scope==="global").filter(c=>!c.expiresAt||c.expiresAt>(t.now??Date.now())).filter(c=>vt(c,n,t)).sort((c,f)=>f.confidence-c.confidence||f.updatedAt-c.updatedAt),m=ht(d.map(c=>yt(c,c.state==="active"?"active":"shadow")),t),l=i==="on"?m.filter(c=>c.state==="active"):[],u=m.filter(c=>c.state==="shadow"||i==="shadow");try{s.insertEvent({kind:"learning_overlay_match",timestamp:Date.now(),success:!0,metadata:{projectRoot:e,skillName:n,rolloutMode:i,eligible:m.map(c=>`${c.candidateId}@${c.version}`),injected:l.map(c=>`${c.candidateId}@${c.version}`)}});}catch{}return {skillName:n,projectRoot:e,packages:o,learned:l,shadowEligible:u,rolloutMode:i}}finally{t.database||s.close();}}function me(n){let e=[],t=n.packages.map(r=>{let o=r.resolvedVersion??r.declaredRange??"unknown";return `${r.packageName}=${o} (confidence=${r.confidence}${r.evidencePath?`, source=${r.evidencePath}`:""})`}).join("; ");return t&&e.push(`DevFlow runtime project-version evidence for ${n.skillName}: ${t}. Treat target-project evidence as authoritative; do not apply a hardcoded framework version.`),n.learned.length>0&&e.push([`DevFlow governed project instructions for ${n.skillName}:`,...n.learned.map(r=>`- ${r.instruction}`),"Apply only to this request and keep canonical Skill/MCP requirements unchanged."].join(`
2
+ `)),e.join(`
3
+ `)}function yt(n,e){return {candidateId:n.id,version:n.overlayVersion,state:e,instruction:n.instruction,trigger:n.trigger,confidence:n.confidence,evidenceReceipt:n.graderReceipt??`candidate:${n.id}:v${n.overlayVersion}`,expiresAt:n.expiresAt}}function ht(n,e){let t=Math.max(0,Math.min(e.maxLearnedEntries??3,3)),r=Math.max(0,Math.min(e.learnedCharacterBudget??1600,4e3)),o=[],i=0;for(let s of n){if(o.length>=t)break;let a=s.instruction.length+4;i+a>r||(o.push(s),i+=a);}return o}function vt(n,e,t){let r=n.trigger,o=e.replace(/^devflow:/,"").split(":").pop()??e,i=A(r.skills);if(i.length>0&&!i.some(c=>c===e||c===o||c.endsWith(`:${o}`)))return false;let s=(t.prompt??"").normalize("NFKC").toLocaleLowerCase("en-US"),a=(t.command??"").normalize("NFKC").toLocaleLowerCase("en-US"),d=[...t.files??[],...It(t.prompt??"")].map(c=>c.replaceAll("\\","/").toLocaleLowerCase("en-US")),m=A(r.commands).map(de);if(m.length>0&&!m.some(c=>a.includes(c)||s.includes(c)))return false;let l=A(r.entities).map(de);if(l.length>0&&!l.some(c=>s.includes(c)||a.includes(c)))return false;let u=A(r.files).map(c=>c.replaceAll("\\","/").toLocaleLowerCase("en-US"));return !(u.length>0&&!u.some(c=>d.some(f=>bt(f,c))))}function It(n){return n.match(/(?:^|\s)((?:src|app|apps|packages|plugins|lib|test|tests)\/[A-Za-z0-9_./@-]+)/gu)?.map(e=>e.trim())??[]}function bt(n,e){if(!e.includes("*"))return n===e||n.includes(e);let t=e.replace(/[.+?^${}()|[\]\\]/gu,"\\$&").replaceAll("*",".*");return new RegExp(`^${t}$`,"u").test(n)}function A(n){return Array.isArray(n)?n.filter(e=>typeof e=="string"&&e.trim().length>0):[]}function de(n){return n.normalize("NFKC").trim().toLocaleLowerCase("en-US")}function ue(n){if(!existsSync$1(n))return null;try{let e=JSON.parse(readFileSync(n,"utf8"));return e&&typeof e=="object"&&!Array.isArray(e)?e:null}catch{return null}}function kt(n,e){for(let t of ["dependencies","devDependencies","peerDependencies","optionalDependencies"]){let r=n?.[t];if(!r||typeof r!="object"||Array.isArray(r))continue;let o=r[e];if(typeof o=="string"&&o.trim())return o.trim()}}function wt(n,e){let t=n?.packages;if(t&&typeof t=="object"&&!Array.isArray(t)){let o=t[`node_modules/${e}`];if(o&&typeof o=="object"&&!Array.isArray(o)){let i=o.version;if(typeof i=="string"&&i.trim())return i.trim()}}let r=n?.dependencies;if(r&&typeof r=="object"&&!Array.isArray(r)){let o=r[e];if(o&&typeof o=="object"&&!Array.isArray(o)){let i=o.version;if(typeof i=="string"&&i.trim())return i.trim()}}}function pe(n){let e=se();return e?e[n]?.mcpTools??[]:[]}function fe(n,e,t){return me(le(n,e,{prompt:t}))}var Mt=getLocalApiKey(),L=join(getDevFlowStateRoot(),"errors");async function ke(n,e,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,d=acquireRuntimeHttpCircuit(r,n);if(a&&!d.allowed)return {delivered:false,suppressed:true,fallbackReason:d.state.fallbackReason};let m;for(let u=0;u<=s;u+=1)try{return await Dt(r,n,e,o),a&&registerRuntimeHttpSuccess(r,n).transitioned&&h("http_circuit_transition",{endpoint:r,path:new URL(n,r).pathname,previous:d.state.status,status:"closed",failures:0}),{delivered:!0,suppressed:!1}}catch(c){m=c instanceof Error?c:new Error(String(c)),u<s&&await Ct(Math.min(100*2**u,1e3));}if(!m)return {delivered:false,suppressed:false,fallbackReason:"unknown_http_failure"};if(!a)return Ie(n,m),{delivered:false,suppressed:false,fallbackReason:m.message};let l=registerRuntimeHttpFailure(r,n,t.fallbackReason??(i?"local_durable_mirror":"http_delivery_failed"));return l.transitioned&&(Ie(n,m),h("http_circuit_transition",{endpoint:r,path:new URL(n,r).pathname,previous:d.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 Dt(n,e,t,r){return new Promise((o,i)=>{let s=JSON.stringify(t),a=new URL(e,n),d=false,m=u=>{d||(d=true,u?i(u):o());},l=request({hostname:a.hostname,port:a.port,path:a.pathname+a.search,method:"POST",headers:{"Content-Type":"application/json","X-API-Key":Mt,"Content-Length":Buffer.byteLength(s)},timeout:r},u=>{u.on("error",m),u.on("end",()=>{let c=u.statusCode??0;m(c>=200&&c<300?void 0:new Error(`HTTP ${c}`));}),u.resume();});l.on("error",m),l.on("timeout",()=>l.destroy(new Error(`HTTP mirror timed out after ${r}ms`))),l.write(s),l.end();})}function Ie(n,e){try{existsSync$1(L)||mkdirSync$1(L,{recursive:!0}),appendFileSync(join(L,"http-errors.log"),`${new Date().toISOString()} | ${n} | ${e.message}
4
+ `);}catch{}}function Ct(n){return new Promise(e=>setTimeout(e,n))}var _e=1e4,Nt=3e4,D=500,C=class{constructor(e){this.retryScheduled=false;this.metricAggregationScheduled=false;this.apiUrl=e?.apiUrl,this.cacheDir=e?.cacheDir??join$1(getDevFlowStateRoot(),"global","telemetry-cache"),this.database=e?.database??null,this.ownsDatabase=!e?.database;let t=e?.busyTimeoutMs??Number(process.env.DEVFLOW_TELEMETRY_DB_BUSY_TIMEOUT_MS);this.busyTimeoutMs=Number.isSafeInteger(t)&&t>=0?t:100;}async sendEvent(e){let t={...e,input:this.truncateInput(e.input)};return this.commitOrCache("tool_call",t)?(this.postHttp("/api/telemetry/tool-call",t),e.eventId):null}async sendExecutionStart(e,t,r,o,i=process.env.CLAUDE_PROJECT_DIR??process.cwd(),s=[]){let a={executionId:e,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(e,t="completed",r=Date.now(),o){let i={executionId:e,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(e,t,r){let o={id:e,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(e){let t=this.commitOrCache("complete_event",e);return t&&(this.postHttp("/api/telemetry/tool-call/output",e),this.scheduleMetricAggregation()),t}async endSession(e,t=Date.now()){let r={sessionId:e,finishedAt:t},o=this.commitOrCache("session_end",r);return o&&(this.getDatabase().aggregatePendingToolMetrics(),this.postHttp(`/api/telemetry/sessions/${encodeURIComponent(e)}/close`,{finishedAt:t})),o}async flushCache(){try{let t=this.getDatabase(),r=t.listTelemetryFailures({unresolvedOnly:!0,limit:D}).reverse();for(let o of r)try{this.applyOperation(o.operation,o.payload),t.resolveTelemetryFailure(o.id);}catch{}t.trimTelemetryFailures(D);}catch{}let e=(existsSync(this.cacheDir)?readdirSync(this.cacheDir):[]).filter(t=>t.endsWith(".json")).map(t=>{let r=join$1(this.cacheDir,t);try{return {cacheFile:r,envelope:Lt(JSON.parse(readFileSync$1(r,"utf8")))}}catch{return null}}).filter(t=>t!==null).sort((t,r)=>t.envelope.timestamp-r.envelope.timestamp||Ee(t.envelope.operation)-Ee(r.envelope.operation));for(let{cacheFile:t,envelope:r}of e)try{let o=this.getDatabase();o.insertTelemetryFailure({id:r.id,operation:r.operation,payload:r.payload,error:r.failure,createdAt:r.timestamp}),this.applyOperation(r.operation,r.payload),o.resolveTelemetryFailure(r.id),unlinkSync(t);}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(e,t){try{return this.applyOperation(e,t),!0}catch(r){return this.cacheOperation(e,t,r),false}}applyOperation(e,t){let r=this.getDatabase();switch(e){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:xe(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(xe(t.sessionId),{status:"completed",finishedAt:t.finishedAt});return}}ensureParentSession(e,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";e.ensureSession({id:r,projectRoot:o,label:o==="unknown"?void 0:o.split("/").pop(),startedAt:Number(t.startedAt??t.timestamp??Date.now())});}cacheOperation(e,t,r){let o=Date.now(),i={id:`failure:${o}:${Math.random().toString(36).slice(2,11)}`,operation:e,payload:t,failure:r instanceof Error?r.message:String(r),timestamp:o};try{let s=this.getDatabase();s.insertTelemetryFailure({id:i.id,operation:e,payload:t,error:i.failure,createdAt:o}),s.trimTelemetryFailures(D),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.trimRetryCache(),this.scheduleRetry();}catch{}}trimRetryCache(){try{let e=readdirSync(this.cacheDir).filter(t=>t.endsWith(".json")).sort();for(let t of e.slice(0,Math.max(0,e.length-D)))unlinkSync(join$1(this.cacheDir,t));}catch{}}scheduleRetry(){this.retryScheduled||(this.retryScheduled=true,setTimeout(()=>{this.retryScheduled=false,this.flushCache();},Nt).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(e,t){ke(e,t,{endpoint:this.apiUrl,fallbackReason:"telemetry_already_committed_locally"});}truncateInput(e){let t=JSON.stringify(e);return t===void 0||t.length<=_e?e:{_truncated:true,_original_size:t.length,_preview:`${t.substring(0,_e)}...`}}};function Ee(n){return ["session_start","execution_start","tool_call","complete_event","execution_complete","session_end"].indexOf(n)}function xe(n){return `hook-run:${n}`}function Lt(n){if(!n||typeof n!="object")throw new Error("Invalid telemetry cache envelope");let e=n;if(typeof e.id!="string"||typeof e.operation!="string"||e.payload===void 0||typeof e.failure!="string"||typeof e.timestamp!="number")throw new Error("Invalid telemetry cache envelope");return e}var Ht=/^\/(?:devflow:)?[\w-]+\b\s*/iu,Ft=/\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,qt=/(?:^|[.!?]\s*)(?:(?:please|kindly)\s+)?(?:remember|memorize|save\s+this|store\s+this|note\s+that)(?:\s+(?:that|to))?[\s:,-]*(.+)$/iu,Ut=/(?:^|[。!?;,,]\s*)(?:(?:请|麻烦|务必|一定要|帮我|帮忙|需要)\s*)?(?:记住|记一下|记下来|记|记录一下|记录下来|保存一下|保存下来)(?:这(?:件事|一点|个信息|些内容))?[\s::,,]*(.+)$/iu;function w(n){let e=n.trim().replace(Ht,"").trim();return !e||Ft.test(e)?null:(Ut.exec(e)??qt.exec(e))?.[1]?.trim().replace(/^[::,,\s]+/u,"")||null}var T=1,Bt="memory-snapshot-v1.json",Yt=512*1024,Ce=256*1024,Te=2e3,Xt=500,Zt=10,Qt=240,en=300*1e3,tn=720*60*60*1e3,nn=2147483647;function rn(n){return n.currentUid===void 0?{ownerSafe:true,modeSafe:true}:{ownerSafe:n.ownerUid===n.currentUid,modeSafe:(n.mode&18)===0}}function I(n){return resolve(n)}function S(n){return createHash$1("sha256").update(I(n)).digest("hex").slice(0,16)}function on(n,e={}){let t=S(n),r=e.stateRoot?join(e.stateRoot,t):getProjectStateDir(I(n));return join(r,Bt)}function sn(n,e){let r=(n instanceof Error?n.message:"").replace(/[\r\n\t]+/gu," ").trim().slice(0,160);return r?`${e}:${r}`:e}function F(n,e){return Array.isArray(n)&&n.length<=e&&n.every(t=>typeof t=="string"&&t.length>0&&t.length<=512)}function an(n){if(!n||typeof n!="object"||Array.isArray(n))return false;let e=n;return typeof e.id=="string"&&e.id.length>0&&e.id.length<=512&&typeof e.kind=="string"&&e.kind.length>0&&e.kind.length<=128&&(e.family===void 0||typeof e.family=="string"&&e.family.length>0&&e.family.length<=256)&&(e.entity===void 0||typeof e.entity=="string"&&e.entity.length>0&&e.entity.length<=256)&&F(e.memoryIds,100)&&(e.status==="withheld"||e.status==="resolved")&&(e.summary===void 0||typeof e.summary=="string"&&e.summary.length<=2e3)}function cn(n){if(!n||typeof n!="object"||Array.isArray(n))return false;let e=n;return typeof e.reason=="string"&&e.reason.length>0&&e.reason.length<=512&&(e.stale===void 0||typeof e.stale=="boolean")}function Oe(n,e,t){if(!n||typeof n!="object"||Array.isArray(n))return null;let r=n,o=I(e),i=S(o),s=r.generation===void 0?0:r.generation;return r.version!==T||r.projectRoot!==o||r.projectHash!==i||typeof r.markdown!="string"||Buffer.byteLength(r.markdown,"utf8")>Ce||!F(r.memoryIds,Te)||!Array.isArray(r.conflicts)||r.conflicts.length>Xt||!r.conflicts.every(an)||typeof r.generatedAt!="number"||!Number.isFinite(r.generatedAt)||r.generatedAt<0||r.generatedAt>t+en||!Number.isInteger(s)||s<0||s>nn||!["ready","pending","degraded","disabled"].includes(String(r.status))||r.degradation!==void 0&&!cn(r.degradation)?null:{...r,generation:s}}function dn(n,e,t,r,o=0){let i=I(n);return {version:T,projectRoot:i,projectHash:S(i),markdown:"",memoryIds:[],conflicts:[],generatedAt:r,generation:o,status:e,degradation:{reason:t}}}function un(n,e={}){let t=e.now??Date.now(),r=on(n,e),o;try{o=openSync(r,constants.O_RDONLY|constants.O_NOFOLLOW);let i=fstatSync(o);if(!i.isFile()||i.size<=0||i.size>Yt)throw new Error("cache_size_invalid");let s=rn({...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")),d=Oe(a,n,t);if(!d)throw new Error("cache_schema_invalid");return d.status==="ready"&&t-d.generatedAt>tn?{snapshot:{...d,status:"degraded",degradation:{reason:"cache_stale",stale:!0}},source:"cache",valid:!0,stale:!0}:{snapshot:d,source:"cache",valid:!0,stale:!1}}catch(i){let a=i.code==="ENOENT";return {snapshot:dn(n,a?"pending":"degraded",a?"cache_missing":sn(i,"cache_invalid"),t),source:"none",valid:false,stale:false}}finally{if(o!==void 0)try{closeSync(o);}catch{}}}function ln(n){if(!n)return true;try{return JSON.parse(readFileSync(n,"utf8")).sessionStart?.injectMemories??!0}catch{return true}}function mn(n,e,t){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=I(n);return {version:T,projectRoot:i,projectHash:S(i),markdown:"",memoryIds:[],conflicts:[],generatedAt:t,generation:0,status:"disabled"}}let o=Oe(r.snapshot,n,t);if(o)return o;if(r.status==="ok"&&typeof r.markdown=="string"&&r.markdown.length>0&&Buffer.byteLength(r.markdown,"utf8")<=Ce){let i=I(n);return {version:T,projectRoot:i,projectHash:S(i),markdown:r.markdown,memoryIds:F(r.memoryIds,Te)?r.memoryIds:[],conflicts:[],generatedAt:t,generation:0,status:"ready"}}}catch{}return null}function H(n,e){return [...(n??e).replace(/[\r\n\t|]+/gu," ").trim()||e].slice(0,Qt).join("")}function pn(n){if(n.length===0)return "";let e=n.slice(0,Zt),t=e.map(r=>{let o=H(r.family,"unknown"),i=H(r.entity,"unknown"),s=H(r.summary,"Explicit choice required.");return `- family=${o}; entity=${i}; status=${r.status}; summary=${s}`});return n.length>e.length&&t.push(`- ${n.length-e.length} additional conflict(s) omitted from SessionStart output.`),`## Withheld preference conflicts (${n.length})
3
5
  ${t.join(`
4
- `)}`}function Yt(e){let n=e.now??Date.now();if(Bt(e.configPath)===false)return "";let t=Vt(e.projectRoot,e.daemonResponse??"",n),r=t?{snapshot:t,source:"daemon"}:Kt(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}`:"",d=`DevFlow memory snapshot=${o.status}; source=${r.source}; generatedAt=${i}${s}.`,a=Qt(o.conflicts);return o.markdown?[o.markdown,a,d].filter(Boolean).join(`
6
- `):["## Project memory",a,`${d} Memory availability is not yet known; do not conclude that the project has no memories.`].filter(Boolean).join(`
7
- `)}if(process.env.DEVFLOW_MEMORY_SNAPSHOT_CLI==="1"){let[,,e,n,t]=process.argv;e!=="session-start"||!n?process.exitCode=2:process.stdout.write(Yt({projectRoot:n,configPath:t,daemonResponse:process.env.DEVFLOW_MEMORY_RESPONSE}));}function _(e){let n=nn(e.projectRoot),t=openGlobalDevFlowDatabase(void 0,{busyTimeoutMs:250});try{let r=rn(t,{...e,projectRoot:n});return r?appendTaskRuntimeBoundary({projectRoot:r.projectRoot,taskSpec:taskSpecFromImmutableIntent(on(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:an(r),authority:"legacy"}}),null}finally{t.close();}}function nn(e){try{return realpathSync(e)}catch{return e}}function rn(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 on(e){return {identity:sn(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 sn(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 an(e){return e instanceof Error?e.message:String(e)}var ln=/^(?:ok(?:ay)?|yes|no|thanks?|thank you|continue|好的?|可以|行|是|否|谢谢|继续|收到|明白了?)[.!。!\s]*$/iu,un=/(?:记住|记下|保存|持久化|跨会话|以后|始终|永远|统一使用|项目约定|团队约定|偏好|决定采用|保留可复用|提炼结论|沉淀|记录(?:下来|为|成)?(?:架构|规则|约定|知识|结论))|\b(?:remember|memorize|persist|across sessions|from now on|always|project convention|team convention|preference|we use|adopt|retain reusable|distill)\b/iu,mn=/(?:分析|审查|检查|评估|性能|生成|创建|新建|添加|编写|实现|开发|设计|撰写|总结|修改|重构|修复|调试|解释|查看)|\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 pn(e){let n=e.trim();return n.length>0&&!ln.test(n)}function fn(e){let n=e.normalize("NFKC").trim();return n.length>=4&&mn.test(n)&&!un.test(n)&&E(n)===null}function gn(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 De(e,n,t=[]){return `memory-receipt:${createHash$1("sha256").update(`${e}\0${n}\0${[...t].sort().join("\0")}`).digest("hex").slice(0,24)}`}function yn(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 U(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(d=>d.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 Ce(e){if(!pn(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(c=>c.promptHash===r&&Date.now()-c.createdAt<1e4),i=o?{turnId:o.turnId,eventId:o.eventId,promptHash:o.promptHash,createdAt:o.createdAt}:e.identity??gn(e.sessionId,t),s=o??n.beginMemoryTurn({...i,projectRoot:e.projectRoot,sessionId:e.sessionId});if(s.status!=="pending")return {turn:s,additionalContext:U(s),skipSkillRouting:s.source==="explicit_intent"};let d=resolveSemanticResolutionMode(e.projectRoot),a=d==="off"||d==="shadow"?E(t)??void 0:void 0;if(!a&&fn(t)){let c=De(s.turnId,"skipped"),p=n.skipMemoryTurn({turnId:s.turnId,receiptId:c,source:"automatic_transient_skip",reason:"high_confidence_transient_task"});return _({projectRoot:e.projectRoot,sessionId:e.sessionId,turnId:s.turnId,kind:"memory.skipped",payload:{receiptId:c,reasonCode:"high_confidence_transient_task"},dedupeKey:c,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:p,additionalContext:U(p),skipSkillRouting:!1}}let m=a?"commit_explicit":"capture_prompt",l=n.enqueueWork({idempotencyKey:`memory-turn:${m}:${s.turnId}`,kind:a?"memory.explicit_commit":"memory.turn_capture",projectRoot:e.projectRoot,sessionId:e.sessionId,turnId:s.turnId,payload:{operation:m,turnId:s.turnId,eventId:s.eventId,sessionId:e.sessionId,prompt:t,explicitContent:a,createdAt:s.createdAt}});if(a){let c=`raw-memory:${createHash$1("sha256").update(`${e.projectRoot}\0${i.turnId}\0${a}`).digest("hex").slice(0,24)}`,p=De(s.turnId,"committed",[c]),v=n.commitMemoryTurn({turnId:s.turnId,receiptId:p,memoryIds:[c],source:"explicit_intent",reason:"explicit_raw_queued",decidedAt:Date.now()});return _({projectRoot:e.projectRoot,sessionId:e.sessionId,turnId:s.turnId,kind:"durable_work.owned",payload:{workId:l.id,obligation:"memory"},dedupeKey:`${l.id}:owned`,producer:"devflow-memory-turn"}),_({projectRoot:e.projectRoot,sessionId:e.sessionId,turnId:s.turnId,kind:"memory.committed",payload:{receiptId:p,reasonCode:"explicit_raw_queued"},dedupeKey:p,producer:"devflow-memory-turn"}),emitSemanticControlLog({event:"memory.write.completed",identity:{projectRoot:e.projectRoot,sessionId:e.sessionId,turnId:s.turnId,actionReceipt:p},level:"info",timestamp:Date.now(),data:{stage:"explicit_fast_ack",durable:!0,rawMemoryId:c,receiptLatencyMs:Date.now()-i.createdAt,asyncReadiness:"queued"}}),{turn:v,explicitContent:a,additionalContext:U(v),skipSkillRouting:!0}}return _({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"}),_({projectRoot:e.projectRoot,sessionId:e.sessionId,turnId:s.turnId,kind:"durable_work.owned",payload:{workId:l.id,obligation:"memory"},dedupeKey:`${l.id}:owned`,producer:"devflow-memory-turn"}),{turn:s,explicitContent:a,additionalContext:yn(s),skipSkillRouting:!1}}finally{n.close();}}function Me(e,n){let t=wn(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 wn(e){return join(R(e),"memory-turn-pending")}function Oe(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${_n(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 b("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 b("prefetch_queue",{projectRoot:e.projectRoot,skillName:e.skillName,accepted:false,reason:r,latencyMs:Date.now()-n}),{accepted:false,reason:r}}}function _n(e){return e.trim().toLowerCase().replace(/\s+/g," ").slice(0,4e3)}function He(e){let n=Date.now(),t=Gn(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 g=Nn(i,s);return {artifact:Un(s),queryPlan:Jn(g),memoryIdentity:je(s),reused:!0}}let d=Wn(r.rawPrompt,r.command),a=buildRetrievalTaskPlan({query:d,parsedIntent:parseIntent(d,{segmentation:"regex"}),targetAnchors:Pe(r.rawPrompt),activeSkill:r.activeSkill,command:r.command}),m=resolveSemanticResolutionMode(t),l=m==="off"?null:extractStructuralSemanticEvidence({prompt:$e(r.rawPrompt),command:r.command,targetAnchors:Pe(r.rawPrompt)}),c=l?createProvisionalSemanticFrame({normalizedPrompt:l.normalizedPrompt,sourceHash:o,structural:l,now:r.timestamp}):null,p=`turn:${D(`${e.sessionId}\0${o}`)}`,v=`request:${D(`${t}\0${e.sessionId}\0${p}`)}`,h={projectRoot:t,projectId:`project:${D(t)}`,hostId:r.hostId,sessionId:e.sessionId,turnId:p,requestId:v},Le=[{source:"deterministic_parser",field:"intent",value:a.intent,reason:a.classification.intentReason,confidence:a.classification.intentSource==="semantic_override"?.95:.75},{source:r.command?"slash_command":"deterministic_parser",field:"action",value:a.action,reason:a.classification.actionReason,confidence:r.command||a.action!=="analyze"?.95:.65},...a.targetAnchors.map(g=>({source:"target_anchor",field:"target",value:g,reason:"explicit_prompt_target",confidence:1}))],W={identity:h,version:1,rawPrompt:r.rawPrompt,normalizedPrompt:$e(r.rawPrompt),...r.command?{command:r.command}:{},slashArgs:r.slashArgs,...r.activeSkill?{activeSkill:r.activeSkill}:{},intent:a.intent,action:a.action,entities:a.entities,targetAnchors:a.targetAnchors,policyConstraints:zn(r.rawPrompt),classificationEvidence:Le,sourceEventIds:[r.sourceEventId??`host-event:${o.slice(0,24)}`],sourceHash:o,createdAt:r.timestamp},u={...W,artifactHash:Kn(W)},I=buildChannelQueryPlan({artifact:u,taskPlan:a,expandedTerms:e.expandedTerms});if(i.appendTaskIntentArtifact(Ln(u)),i.appendChannelQueryPlan(qn(I)),c){i.appendSemanticResolution({frameHash:c.frameHash,...h,sourceHash:o,artifactHash:u.artifactHash,artifactRevision:u.version,state:c.state,generatedBy:c.resolver.generatedBy,modelId:c.resolver.modelId,modelRevision:c.resolver.modelRevision,routeCatalogVersion:c.resolver.routeCatalogVersion,thresholdVersion:c.resolver.thresholdVersion,route:{status:"unavailable",reason:"prompt_hook_bounded"},sampling:{attempted:!1,status:"not_needed"},conflicts:[],frame:c,durationMs:0,createdAt:c.createdAt});let g=projectSemanticFrameToLegacyIntent(c);(g.intent!==u.intent||g.action!==u.action)&&emitSemanticControlLog({event:"semantic.regex.shadow_mismatch",identity:h,level:"info",timestamp:Date.now(),data:{mode:m,frameHash:c.frameHash,legacyIntent:u.intent,legacyAction:u.action,semanticIntent:g.intent,semanticAction:g.action}});}let qe=Fn(i,u);try{appendTaskRuntimeBoundary({projectRoot:t,taskSpec:taskSpecFromImmutableIntent(u),kind:"task.spec.bound",payload:{intentArtifactHash:u.artifactHash},dedupeKey:u.artifactHash,producer:"devflow-task-intent",createdAt:u.createdAt,database:i});}catch(g){emitSemanticControlLog({event:"task.runtime.shadow_mismatch",identity:h,level:"warn",timestamp:Date.now(),data:{stage:"task.spec.bound",reason:g instanceof Error?g.message:String(g),authority:"legacy"}});}return emitSemanticControlLog({event:"host.prompt.normalized",identity:h,level:"info",timestamp:Date.now(),data:{sourceHash:o,command:u.command,activeSkill:u.activeSkill,rawPromptBytes:Buffer.byteLength(u.rawPrompt)}}),emitSemanticControlLog({event:"intent.artifact.created",identity:h,level:"info",timestamp:Date.now(),data:{artifactHash:u.artifactHash,intent:u.intent,action:u.action,evidence:u.classificationEvidence,entityCount:u.entities.length,targetCount:u.targetAnchors.length}}),emitSemanticControlLog({event:"intent.artifact.persisted",identity:h,level:"info",timestamp:Date.now(),data:{artifactHash:u.artifactHash,version:u.version,sourceHash:u.sourceHash,parserMode:"regex",captureLatencyMs:Date.now()-n}}),emitSemanticControlLog({event:"query.plan.created",identity:h,level:"info",timestamp:Date.now(),data:{planHash:I.planHash,sourceIntentHash:I.sourceIntentHash,generatedBy:I.generatedBy,codeQueries:I.code.length,memoryQueries:I.memory.length,knowledgeQueries:I.knowledge.length,knowledgeDisposition:I.knowledge.map(g=>g.requirement)}}),emitSemanticControlLog({event:"terminal.transition.persisted",identity:h,level:"info",timestamp:Date.now(),data:{state:"intent_bound",receiptId:qe,sourceIntentHash:u.artifactHash}}),{artifact:u,queryPlan:I,memoryIdentity:je(u),reused:!1}}finally{i.close();}}function Nn(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 Fn(e,n){let t=e.getLatestTerminalTransition(n.identity.projectRoot,n.identity.sessionId,n.identity.turnId);if(t)return t.receiptId;let r=`terminal:${D(`${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:${D(`${n.artifactHash}\0intent_bound`)}`,sourceReceiptId:r,reason:"immutable_intent_persisted",payload:{intentArtifactHash:n.artifactHash},createdAt:Math.max(n.createdAt,Date.now())}).receiptId}function Ln(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 qn(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 Un(e){return {identity:Ne(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 Jn(e){return {identity:Ne(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 Ne(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 je(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 Pe(e){let n=e.match(/(?:^|[\s`'"(])((?:\.{0,2}\/)?(?:[A-Za-z0-9_@.-]+\/)+[A-Za-z0-9_@.-]+(?:\.[A-Za-z0-9]+)?)/gu)??[];return Fe(n.map(t=>t.trim().replace(/^[`'"(]+|[`'"),.;:,。;:]+$/gu,"")).filter(t=>!t.startsWith("/")||/\.[A-Za-z0-9]+$/u.test(t))).slice(0,16)}function zn(e){let n=e.match(/--[a-z0-9][a-z0-9-]*(?:=[^\s,。;;]+)?/giu)??[];return Fe(n.map(t=>t.normalize("NFKC"))).slice(0,16)}function Wn(e,n){return n&&e.trimStart().replace(new RegExp(`^\\/${Bn(n)}\\b`,"iu"),"").trim()||e.trim()}function $e(e){return e.normalize("NFKC").replace(/\s+/gu," ").trim().slice(0,4e3)}function Fe(e){return [...new Set(e.filter(Boolean))]}function Gn(e){let n=resolve(e);try{return realpathSync(n)}catch{return n}}function Kn(e){return createHash$1("sha256").update(J(e)).digest("hex")}function D(e){return createHash$1("sha256").update(e).digest("hex").slice(0,24)}function J(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(J).join(",")}]`;if(!e||typeof e!="object")return JSON.stringify(String(e));let n=e;return `{${Object.keys(n).sort().map(t=>`${JSON.stringify(t)}:${J(n[t])}`).join(",")}}`}function Bn(e){return e.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&")}var y=process.env.CLAUDE_PROJECT_DIR||process.cwd();async function Yn(e){let n=K()?[G]:[],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=ie(r),s=false,d,a,m=o?new T(y):void 0;if(o){try{a=He({projectRoot:y,sessionId:o,prompt:r,hostEvent:t}),m.bindTaskIdentity(o,{turnId:a.artifact.identity.turnId,requestId:a.artifact.identity.requestId,intentArtifactHash:a.artifact.artifactHash}),n.push(`DevFlow immutable task identity: turnId=${a.artifact.identity.turnId}; requestId=${a.artifact.identity.requestId}; intent=${a.artifact.intent}; action=${a.artifact.action}; intentArtifactHash=${a.artifact.artifactHash}. Retrieval query expansion must not replace this original intent.`);}catch(l){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:y,sessionId:o},level:"error",timestamp:Date.now(),data:{stage:"user_prompt_submit",category:"intent_persistence_unavailable",error:l instanceof Error?l.message:String(l)}});}try{let l=Ce({projectRoot:y,sessionId:o,prompt:r,...a?{identity:a.memoryIdentity}:{}});l&&(n.push(l.additionalContext),s=l.skipSkillRouting);}catch(l){s=!!E(r);try{let c=Me(y,{sessionId:o,prompt:r,createdAt:Date.now()});n.push(`DevFlow memory turn status=accepted; durable=true; receiptId=${c}; canonicalMemory=false; SQLite queue replay pending. Do not claim memory success without a canonical receipt.`),emitSemanticControlLog({event:"memory.write.degraded",identity:{projectRoot:y,sessionId:o},level:"warn",timestamp:Date.now(),data:{stage:"turn_capture",reason:l.message,fallback:"durable_spool",receiptId:c}});}catch(c){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:y,sessionId:o},level:"error",timestamp:Date.now(),data:{stage:"turn_capture",reason:c.message,fallback:"none"}});}}}if(o&&i&&!s){let l=m.get(o)?.executionId,c=m.startExecution(o,i.skillName,ae(i.skillName));if(d=c.executionId,c.executionId&&c.executionId!==l){let v=new j;try{await v.sendSessionStart(o,y,c.startedAt),await v.sendExecutionStart(c.executionId,o,i.skillName,c.lastActivityAt,y,c.requiredMcpTools);}finally{v.close();}}let p=ce(i.skillName,y,r);p&&n.push(p);}if(o&&i&&d&&!s){let l=resolveProjectCapabilityProfile(y),c=resolveCapabilityRollout(y).config.retrievalSessions;Oe({prompt:r.trimStart().replace(/^\/devflow:[a-z0-9][a-z0-9-]*\b/i,"").trim()||r,projectRoot:y,sessionId:o,executionId:d,skillName:i.skillName,profileFingerprint:l.fingerprint,rolloutMode:c,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 Yn(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{Yn as handleUserPromptSubmit};
6
+ `)}`}function fn(n){let e=n.now??Date.now();if(ln(n.configPath)===false)return "";let t=mn(n.projectRoot,n.daemonResponse??"",e),r=t?{snapshot:t,source:"daemon"}:un(n.projectRoot,{...n.cacheOptions,now:e}),{snapshot:o}=r;if(o.status==="disabled")return `## Project memory
7
+ DevFlow memory snapshot=pending; source=${r.source}; reason=previous_snapshot_disabled. Memory availability is not yet known; do not conclude that the project has no memories.`;let i=new Date(o.generatedAt).toISOString(),s=o.degradation?.reason?`; reason=${o.degradation.reason}`:"",a=`DevFlow memory snapshot=${o.status}; source=${r.source}; generatedAt=${i}${s}.`,d=pn(o.conflicts);return o.markdown?[o.markdown,d,a].filter(Boolean).join(`
8
+ `):["## Project memory",d,`${a} Memory availability is not yet known; do not conclude that the project has no memories.`].filter(Boolean).join(`
9
+ `)}if(process.env.DEVFLOW_MEMORY_SNAPSHOT_CLI==="1"){let[,,n,e,t]=process.argv;n!=="session-start"||!e?process.exitCode=2:process.stdout.write(fn({projectRoot:e,configPath:t,daemonResponse:process.env.DEVFLOW_MEMORY_RESPONSE}));}function b(n){let{projectRoot:e,...t}=n;try{return new q(e).dispatchBoundary(t).snapshot??null}catch(r){return p({event:"hook.runtime.degraded",identity:{projectRoot:e,sessionId:n.sessionId,...n.turnId?{turnId:n.turnId}:{},...n.requestId?{requestId:n.requestId}:{},...n.executionId?{executionId:n.executionId}:{}},level:"error",timestamp:Date.now(),data:{stage:n.kind,reason:r instanceof Error?r.message:String(r),tool:n.producer}}),null}}var q=class{constructor(e){this.projectRoot=e;}dispatchBoundary(e){let t=In(e.kind,e.payload??{});if(!t)return {handled:false};let r=openGlobalDevFlowDatabase(void 0,{busyTimeoutMs:250});try{let o=vn(r,{projectRoot:this.projectRoot,sessionId:e.sessionId,...e.turnId?{turnId:e.turnId}:{},...e.requestId?{requestId:e.requestId}:{},...e.executionId?{executionId:e.executionId}:{}});return o?{handled:!0,snapshot:new TaskKernel(new TaskEventStore(r),new SemanticRuntimeEventProjector).dispatch({definition:o.definition,kind:t.kind,payload:t.payload,idempotencyKey:`host:${o.definition.definitionHash}:${e.dedupeKey}`,producer:e.producer}).snapshot}:{handled:!1}}finally{r.close();}}};function vn(n,e){let t=e.executionId?n.getActiveContextReceipt(e.projectRoot,e.sessionId,e.executionId):null,r=e.turnId??t?.canonicalAction?.binding.turnId,o=e.requestId??t?.requestId;if(!r&&!o)return null;let i=n.listLatestTaskIntentArtifacts(e.projectRoot,e.sessionId).find(s=>r?s.turnId===r:s.requestId===o);if(!i)return null;for(let s of [...new Set([i.version,2,1])]){let a=n.getTaskAggregateSnapshot(e.projectRoot,e.sessionId,i.turnId,s);if(!a)continue;let d=n.getTaskDefinitionV2(a.taskDefinitionHash);if(d)return {definition:d,snapshot:a}}return null}function In(n,e){switch(n){case "action.lease.issued":return {kind:"action_lease_issued",payload:e};case "action.succeeded":return {kind:"action_completed",payload:e};case "action.failed":return {kind:"action_failed",payload:e};case "verification.succeeded":return {kind:"verification_completed",payload:e};case "verification.failed":return {kind:"verification_failed",payload:e};case "memory.committed":return {kind:"memory_episode_persisted",payload:e};case "memory.skipped":return {kind:"memory_decision_completed",payload:e};case "memory.pending":return {kind:"memory_extraction_queued",payload:e};case "memory.failed":return {kind:"memory_extraction_failed",payload:e};case "durable_work.owned":return {kind:"durable_work_leased",payload:{...e,fencingToken:Number.isSafeInteger(e.fencingToken)?e.fencingToken:0}};case "durable_work.completed":return {kind:"durable_work_completed",payload:e};case "durable_work.dead_lettered":return {kind:"durable_work_dead_lettered",payload:e};default:return null}}var kn=/^(?:ok(?:ay)?|yes|no|thanks?|thank you|continue|好的?|可以|行|是|否|谢谢|继续|收到|明白了?)[.!。!\s]*$/iu,wn=/(?:记住|记下|保存|持久化|跨会话|以后|始终|永远|统一使用|项目约定|团队约定|偏好|决定采用|保留可复用|提炼结论|沉淀|记录(?:下来|为|成)?(?:架构|规则|约定|知识|结论))|\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,Rn=/(?:召回|查询|检索|查找|定位|询问|什么|如何|是否|哪里|哪个)|\b(?:recall|query|search|find|locate|ask|what|how|whether|where|which)\b/iu;function _n(n){let e=n.trim();return e.length>0&&!kn.test(e)}function En(n){let e=n.normalize("NFKC").trim(),t=Rn.test(e);return e.length>=4&&(Sn.test(e)||t)&&(!wn.test(e)||t)&&w(e)===null}function xn(n,e,t=Date.now()){let r=createHash$1("sha256").update(e.trim()).digest("hex"),o=createHash$1("sha256").update(`${n}\0${t}\0${r}`).digest("hex").slice(0,24);return {turnId:`turn:${o}`,eventId:`memory-turn:${o}`,promptHash:r,createdAt:t}}function Pe(n,e,t=[]){return `memory-receipt:${createHash$1("sha256").update(`${n}\0${e}\0${[...t].sort().join("\0")}`).digest("hex").slice(0,24)}`}function An(n){return `DevFlow memory decision required for ${n.turnId}. Before the final response, semantically decide whether this turn contains durable project knowledge. Call mcp__devflow__memory_commit_turn with evidence-bound candidates, or mcp__devflow__memory_skip_turn with a concrete reason. Do not claim memory success without a canonical receipt. For candidates, copy exact evidenceSpans from this user prompt, preserve package names, flags, versions, paths, and identifiers, and provide subject, predicate, value, polarity, and entities when known. To replace or retire an existing fact, provide operation=supersede or operation=retire plus referencedFactIds from the canonical memory receipt; aliases and entity names are not fact identity. Do not save assistant echoes, task narration, retries, or unverified guesses. Express a change from an old choice as the new durable value. If the decision tool remains unavailable, explicitly state that the memory was not saved.`}function U(n){let e=n.memoryIds.length>0?n.memoryIds.join(","):"none",t=n.status==="committed"?"accepted":n.status,r=n.status==="committed"?"; indexStatus=pending":"",o=n.memoryIds.some(a=>a.startsWith("raw-memory:")),i=n.status==="committed"&&n.source==="explicit_intent"&&!o?"; memoryOnlyCompleted=true; skipProjectContext=true; hostRefinementRequired=true":n.status==="committed"&&n.source==="explicit_intent"?"; asyncReadiness=queued; hostRefinementRequired=true":"",s=n.status==="committed"&&n.source==="explicit_intent"?` The deterministic explicit-memory save is complete and remains authoritative if refinement fails. Before the final response, call mcp__devflow__memory_commit_turn once with turnId=${n.turnId} and semantic candidates. Split every distinct reusable fact into a durable_memory candidate, classify instructions that apply only to this turn as turn_constraint, and include evidenceSpans copied verbatim from the user prompt for every candidate. Preserve exact flags, package names, versions, paths, and identifiers. Keep narrative and value in the user prompt language; do not translate evidence into a different surface form. The tool refines the existing receipt idempotently; it must not create native Claude memory. If refinement is unavailable, return the existing canonical receipt without claiming refinement.`:"";return `DevFlow canonical memory receipt: status=${t}; receiptId=${n.receiptId??"missing"}; turnId=${n.turnId}; memoryIds=${e}; source=${n.source??"unknown"}${r}${i}.`+s}function $e(n){if(!_n(n.prompt))return null;let e=openGlobalDevFlowDatabase(void 0,{busyTimeoutMs:50});try{let t=n.prompt.trim().slice(0,4e3),r=createHash$1("sha256").update(t).digest("hex"),o=e.listMemoryTurns(n.projectRoot,n.sessionId,5).find(u=>u.promptHash===r&&Date.now()-u.createdAt<1e4),i=o?{turnId:o.turnId,eventId:o.eventId,promptHash:o.promptHash,createdAt:o.createdAt}:n.identity??xn(n.sessionId,t),s=o??e.beginMemoryTurn({...i,projectRoot:n.projectRoot,sessionId:n.sessionId});if(s.status!=="pending")return {turn:s,additionalContext:U(s),skipSkillRouting:s.source==="explicit_intent"};let d=(n.activation?.semantic??"degraded_structural")==="degraded_structural"?w(t)??void 0:void 0;if(!d&&En(t)){let u=Pe(s.turnId,"skipped"),c=e.skipMemoryTurn({turnId:s.turnId,receiptId:u,source:"automatic_transient_skip",reason:"high_confidence_transient_task"});return b({projectRoot:n.projectRoot,sessionId:n.sessionId,turnId:s.turnId,kind:"memory.skipped",payload:{receiptId:u,reasonCode:"high_confidence_transient_task"},dedupeKey:u,producer:"devflow-memory-turn"}),p({event:"memory.semantic.decided",identity:{projectRoot:n.projectRoot,sessionId:n.sessionId,turnId:s.turnId},level:"info",timestamp:Date.now(),data:{status:"semantic_empty",operation:"none",reason:"high_confidence_transient_task"}}),{turn:c,additionalContext:U(c),skipSkillRouting:!1}}let m=d?"commit_explicit":"capture_prompt",l=e.enqueueWork({idempotencyKey:`memory-turn:${m}:${s.turnId}`,kind:d?"memory.explicit_commit":"memory.turn_capture",projectRoot:n.projectRoot,sessionId:n.sessionId,turnId:s.turnId,payload:{operation:m,turnId:s.turnId,eventId:s.eventId,sessionId:n.sessionId,prompt:t,explicitContent:d,createdAt:s.createdAt}});if(d){let u=`raw-memory:${createHash$1("sha256").update(`${n.projectRoot}\0${i.turnId}\0${d}`).digest("hex").slice(0,24)}`,c=Pe(s.turnId,"committed",[u]),f=e.commitMemoryTurn({turnId:s.turnId,receiptId:c,memoryIds:[u],source:"explicit_intent",reason:"explicit_raw_queued",decidedAt:Date.now()});return b({projectRoot:n.projectRoot,sessionId:n.sessionId,turnId:s.turnId,kind:"durable_work.owned",payload:{workId:l.id,obligation:"memory"},dedupeKey:`${l.id}:owned`,producer:"devflow-memory-turn"}),b({projectRoot:n.projectRoot,sessionId:n.sessionId,turnId:s.turnId,kind:"memory.committed",payload:{receiptId:c,reasonCode:"explicit_raw_queued"},dedupeKey:c,producer:"devflow-memory-turn"}),p({event:"memory.write.completed",identity:{projectRoot:n.projectRoot,sessionId:n.sessionId,turnId:s.turnId,actionReceipt:c},level:"info",timestamp:Date.now(),data:{stage:"explicit_fast_ack",durable:!0,rawMemoryId:u,receiptLatencyMs:Date.now()-i.createdAt,asyncReadiness:"queued"}}),{turn:f,explicitContent:d,additionalContext:U(f),skipSkillRouting:!0}}return b({projectRoot:n.projectRoot,sessionId:n.sessionId,turnId:s.turnId,kind:"memory.pending",payload:{reasonCode:"semantic_decision_queued"},dedupeKey:`${s.turnId}:pending`,producer:"devflow-memory-turn"}),b({projectRoot:n.projectRoot,sessionId:n.sessionId,turnId:s.turnId,kind:"durable_work.owned",payload:{workId:l.id,obligation:"memory"},dedupeKey:`${l.id}:owned`,producer:"devflow-memory-turn"}),{turn:s,explicitContent:d,additionalContext:An(s),skipSkillRouting:!1}}finally{e.close();}}function Le(n,e){let t=On(n);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({...e,prompt:e.prompt.trim().slice(0,4e3)}),{mode:384}),renameSync$1(i,o),r}function On(n){return join(k(n),"memory-turn-pending")}function He(n){let e=Date.now();try{let t=openGlobalDevFlowDatabase(void 0,{busyTimeoutMs:100});try{let r=`context-prefetch:${createHash$1("sha256").update(`${n.projectRoot}\0${n.sessionId}\0${n.executionId}\0${$n(n.prompt)}\0${n.profileFingerprint}`).digest("hex")}`,o=t.enqueueWork({idempotencyKey:r,kind:"context.prefetch",projectRoot:n.projectRoot,sessionId:n.sessionId,payload:n,maxAttempts:3});return h("prefetch_queue",{projectRoot:n.projectRoot,skillName:n.skillName,accepted:!0,workState:o.state,latencyMs:Date.now()-e}),{accepted:!0,workItemId:o.id}}finally{t.close();}}catch(t){let r=t instanceof Error?t.message:String(t);return h("prefetch_queue",{projectRoot:n.projectRoot,skillName:n.skillName,accepted:false,reason:r,latencyMs:Date.now()-e}),{accepted:false,reason:r}}}function $n(n){return n.trim().toLowerCase().replace(/\s+/g," ").slice(0,4e3)}async function Je(n){let e=Date.now(),t=Bn(n.projectRoot),r=claudeCodeRuntimeAdapter.normalizePrompt(n.hostEvent??{session_id:n.sessionId,prompt:n.prompt},{projectRoot:t}),o=semanticTextHash(Ue(r.rawPrompt)),i=openGlobalDevFlowDatabase(void 0,{busyTimeoutMs:100});try{let s=i.getTaskIntentArtifactBySource({projectRoot:t,sessionId:n.sessionId,sourceHash:o});if(s){let j=Fe(s).identity,V=i.getRuntimeActivation(j.projectRoot,j.sessionId,j.turnId,s.version);if(!V)throw new Error(`RUNTIME_ACTIVATION_MISSING:${s.artifactHash}`);return {artifact:Fe(s),memoryIdentity:qe(s),activation:V,reused:!0}}let a=`turn:${O(`${n.sessionId}\0${o}`)}`,d=`request:${O(`${t}\0${n.sessionId}\0${a}`)}`,m={projectRoot:t,projectId:`project:${stableRuntimeHash(t).slice(0,20)}`,hostId:r.hostId,sessionId:n.sessionId,executionId:n.sessionId,turnId:a,requestId:d},l=1,u=resolveRuntimeActivationSnapshot({projectRoot:t,createdAt:r.timestamp}),c=Wn(r.rawPrompt),f={identity:m,version:l,rawPrompt:r.rawPrompt,normalizedPrompt:Ue(r.rawPrompt),...r.command?{command:r.command}:{},slashArgs:r.slashArgs,...r.activeSkill?{activeSkill:r.activeSkill}:{},intent:"unknown",action:"unknown",entities:[],targetAnchors:c,policyConstraints:[],classificationEvidence:[],sourceEventIds:[r.sourceEventId??`host-event:${o.slice(0,24)}`],sourceHash:o,createdAt:r.timestamp},y={...f,artifactHash:Yn(f)};i.appendTaskIntentArtifact(Vn(y)),i.bindRuntimeActivation({identity:m,revision:l,snapshot:u});let ze=zn(i,y);return p({event:"host.prompt.normalized",identity:m,level:"info",timestamp:Date.now(),data:{sourceHash:o,command:y.command,activeSkill:y.activeSkill,rawPromptBytes:Buffer.byteLength(y.rawPrompt)}}),p({event:"intent.artifact.created",identity:m,level:"info",timestamp:Date.now(),data:{artifactHash:y.artifactHash,targetCount:c.length}}),p({event:"intent.artifact.persisted",identity:m,level:"info",timestamp:Date.now(),data:{artifactHash:y.artifactHash,version:y.version,sourceHash:y.sourceHash,authority:"immutable-intent",captureLatencyMs:Date.now()-e}}),p({event:"terminal.transition.persisted",identity:m,level:"info",timestamp:Date.now(),data:{state:"intent_bound",receiptId:ze,sourceIntentHash:y.artifactHash}}),{artifact:y,memoryIdentity:qe(y),activation:u,reused:!1}}finally{i.close();}}function zn(n,e){let t=n.getLatestTerminalTransition(e.identity.projectRoot,e.identity.sessionId,e.identity.turnId);if(t)return t.receiptId;let r=`terminal:${O(`${e.artifactHash}\0open`)}`;return n.appendTerminalTransition({...e.identity,sequence:1,toState:"open",receiptId:r,reason:"host_prompt_accepted",payload:{sourceHash:e.sourceHash},createdAt:e.createdAt}),n.appendTerminalTransition({...e.identity,sequence:2,fromState:"open",toState:"intent_bound",receiptId:`terminal:${O(`${e.artifactHash}\0intent_bound`)}`,sourceReceiptId:r,reason:"immutable_intent_persisted",payload:{intentArtifactHash:e.artifactHash},createdAt:Math.max(e.createdAt,Date.now())}).receiptId}function Vn(n){return {...n.identity,version:n.version,supersedesHash:n.supersedesHash,rawPrompt:n.rawPrompt,normalizedPrompt:n.normalizedPrompt,command:n.command,slashArgs:n.slashArgs,activeSkill:n.activeSkill,intent:n.intent,action:n.action,entities:n.entities,targetAnchors:n.targetAnchors,policyConstraints:n.policyConstraints,classificationEvidence:n.classificationEvidence.map(e=>({...e})),sourceEventIds:n.sourceEventIds,sourceHash:n.sourceHash,artifactHash:n.artifactHash,createdAt:n.createdAt}}function Fe(n){return {identity:Kn(n),version:n.version,...n.supersedesHash?{supersedesHash:n.supersedesHash}:{},rawPrompt:n.rawPrompt,normalizedPrompt:n.normalizedPrompt,...n.command?{command:n.command}:{},slashArgs:n.slashArgs,...n.activeSkill?{activeSkill:n.activeSkill}:{},intent:n.intent,action:n.action,entities:n.entities,targetAnchors:n.targetAnchors,policyConstraints:n.policyConstraints,classificationEvidence:n.classificationEvidence,sourceEventIds:n.sourceEventIds,sourceHash:n.sourceHash,artifactHash:n.artifactHash,createdAt:n.createdAt}}function Kn(n){return {projectRoot:n.projectRoot,projectId:n.projectId,hostId:n.hostId,sessionId:n.sessionId,turnId:n.turnId,requestId:n.requestId,...n.executionId?{executionId:n.executionId}:{}}}function qe(n){let e=n.rawPrompt.trim().slice(0,4e3),t="identity"in n?n.identity.turnId:n.turnId;return {turnId:t,eventId:`memory-turn:${t.replace(/^turn:/u,"")}`,promptHash:createHash$1("sha256").update(e).digest("hex"),createdAt:n.createdAt}}function Wn(n){let e=n.match(/(?:^|[\s`'"(])((?:\.{0,2}\/)?(?:[A-Za-z0-9_@.-]+\/)+[A-Za-z0-9_@.-]+(?:\.[A-Za-z0-9]+)?)/gu)??[];return Gn(e.map(t=>t.trim().replace(/^[`'"(]+|[`'"),.;:,。;:]+$/gu,"")).filter(t=>!t.startsWith("/")||/\.[A-Za-z0-9]+$/u.test(t))).slice(0,16)}function Ue(n){return n.normalize("NFKC").replace(/\s+/gu," ").trim().slice(0,4e3)}function Gn(n){return [...new Set(n.filter(Boolean))]}function Bn(n){let e=resolve(n);try{return realpathSync(e)}catch{return e}}function Yn(n){return createHash$1("sha256").update(J(n)).digest("hex")}function O(n){return createHash$1("sha256").update(n).digest("hex").slice(0,24)}function J(n){if(n===null||typeof n=="string"||typeof n=="boolean")return JSON.stringify(n);if(typeof n=="number")return Number.isFinite(n)?JSON.stringify(n):"null";if(Array.isArray(n))return `[${n.map(J).join(",")}]`;if(!n||typeof n!="object")return JSON.stringify(String(n));let e=n;return `{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${J(e[t])}`).join(",")}}`}var g=process.env.CLAUDE_PROJECT_DIR||process.cwd();async function Qn(n){let e=W()?[K]:[],t;try{t=JSON.parse(n);}catch{return {hookSpecificOutput:{hookEventName:"UserPromptSubmit",permissionDecision:"allow",...e.length?{additionalContext:e.join(`
10
+ `)}:{}}}}let r=t.prompt||"";if(!r.trim())return {hookSpecificOutput:{hookEventName:"UserPromptSubmit",permissionDecision:"allow",...e.length?{additionalContext:e.join(`
11
+ `)}:{}}};let o=t.session_id?.trim(),i=ie(r),s=false,a,d,m=o?new E(g):void 0;if(o){try{d=await Je({projectRoot:g,sessionId:o,prompt:r,hostEvent:t}),m.bindTaskIdentity(o,{turnId:d.artifact.identity.turnId,requestId:d.artifact.identity.requestId,intentArtifactHash:d.artifact.artifactHash}),e.push(`DevFlow immutable task identity: turnId=${d.artifact.identity.turnId}; requestId=${d.artifact.identity.requestId}; intentArtifactHash=${d.artifact.artifactHash}. Retrieval query expansion must not replace this original intent.`);}catch(l){e.push("DevFlow task intent persistence degraded; preserve the original user command and do not claim canonical context binding."),p({event:"intent.artifact.failed",identity:{projectRoot:g,sessionId:o},level:"error",timestamp:Date.now(),data:{stage:"user_prompt_submit",category:"intent_persistence_unavailable",error:l instanceof Error?l.message:String(l)}});}try{let l=$e({projectRoot:g,sessionId:o,prompt:r,...d?{identity:d.memoryIdentity}:{},...d?{activation:d.activation}:{}});l&&(e.push(l.additionalContext),s=l.skipSkillRouting);}catch(l){s=!!w(r);try{let u=Le(g,{sessionId:o,prompt:r,createdAt:Date.now()});e.push(`DevFlow memory turn status=accepted; durable=true; receiptId=${u}; canonicalMemory=false; SQLite queue replay pending. Do not claim memory success without a canonical receipt.`),p({event:"memory.write.degraded",identity:{projectRoot:g,sessionId:o},level:"warn",timestamp:Date.now(),data:{stage:"turn_capture",reason:l.message,fallback:"durable_spool",receiptId:u}});}catch(u){e.push("DevFlow memory turn status=degraded; durable=false; no canonical receipt exists. Do not claim memory success."),p({event:"memory.write.degraded",identity:{projectRoot:g,sessionId:o},level:"error",timestamp:Date.now(),data:{stage:"turn_capture",reason:u.message,fallback:"none"}});}}}if(o&&i&&!s){let l=m.get(o)?.executionId,u=m.startExecution(o,i.skillName,pe(i.skillName));if(a=u.executionId,u.executionId&&u.executionId!==l){let f=new C;try{await f.sendSessionStart(o,g,u.startedAt),await f.sendExecutionStart(u.executionId,o,i.skillName,u.lastActivityAt,g,u.requiredMcpTools);}finally{f.close();}}let c=fe(i.skillName,g,r);c&&e.push(c);}if(o&&i&&a&&!s){let l=resolveProjectCapabilityProfile(g),u=resolveCapabilityRollout(g).config.retrievalSessions;He({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:l.fingerprint,rolloutMode:u,retrievalVersion:"r2.v1",createdAt:Date.now()});}return {hookSpecificOutput:{hookEventName:"UserPromptSubmit",permissionDecision:"allow",...e.length?{additionalContext:e.join(`
12
+ `)}:{}}}}if(process.argv[1]?.endsWith("user-prompt-submit")||process.argv[1]?.endsWith("user-prompt-submit.js")){let n=console.log.bind(console);console.log=console.error.bind(console),console.info=console.error.bind(console);let e="";process.stdin.setEncoding("utf8"),process.stdin.on("data",t=>{e+=t;}),process.stdin.on("end",async()=>{let t=await Qn(e.trim()||process.argv[2]||"");n(JSON.stringify(t)),process.exit(0);}),process.stdin.on("error",()=>{n(JSON.stringify({hookSpecificOutput:{hookEventName:"UserPromptSubmit",permissionDecision:"allow"}})),process.exit(0);}),setTimeout(()=>{n(JSON.stringify({hookSpecificOutput:{hookEventName:"UserPromptSubmit",permissionDecision:"allow"}})),process.exit(0);},3e4).unref();}export{Qn as handleUserPromptSubmit};
@@ -1,33 +1,36 @@
1
1
  {
2
2
  "name": "@devflow-tools/claude-code-plugin",
3
- "version": "0.17.5",
4
- "description": "DevFlow Developer Intelligence Platform for Claude Code",
3
+ "version": "0.18.0",
4
+ "description": "Claude Code hooks and skills for the DevFlow development intelligence runtime.",
5
5
  "type": "module",
6
6
  "scripts": {
7
- "sync:manifest": "npx tsx scripts/sync-plugin-manifest.ts",
8
- "verify:manifest": "npx tsx scripts/sync-plugin-manifest.ts --check",
9
- "build": "npm run sync:manifest && npx tsx scripts/inject-gates.ts",
10
- "deploy": "npm run sync:manifest && npx tsx scripts/inject-gates.ts --deploy",
7
+ "sync:manifest": "node --import tsx scripts/sync-plugin-manifest.ts",
8
+ "verify:manifest": "node --import tsx scripts/sync-plugin-manifest.ts --check",
9
+ "build": "npm run sync:manifest && node --import tsx scripts/inject-gates.ts",
10
+ "deploy": "npm run sync:manifest && node --import tsx scripts/inject-gates.ts --deploy",
11
11
  "prepack": "npm run verify:manifest && npm run verify:runtime-dependencies",
12
- "verify:runtime-dependencies": "npx tsx scripts/verify-runtime-dependencies.ts"
12
+ "verify:runtime-dependencies": "node --import tsx scripts/verify-runtime-dependencies.ts"
13
13
  },
14
14
  "dependencies": {
15
- "@devflow-tools/benchmark": "0.17.5",
16
- "@devflow-tools/context-engine": "0.17.5",
17
- "@devflow-tools/database": "0.17.4",
18
- "@devflow-tools/memory-engine": "0.17.5",
19
- "@devflow-tools/sdk": "0.17.5",
20
- "@devflow-tools/server": "0.17.5",
21
- "@devflow-tools/telemetry": "0.17.5",
22
- "@devflow-tools/workflow-engine": "0.17.5"
15
+ "@devflow-tools/benchmark": "0.18.0",
16
+ "@devflow-tools/context-engine": "0.18.0",
17
+ "@devflow-tools/database": "0.18.0",
18
+ "@devflow-tools/mcp-server": "0.18.0",
19
+ "@devflow-tools/memory-engine": "0.18.0",
20
+ "@devflow-tools/sdk": "0.18.0",
21
+ "@devflow-tools/semantic-engine": "0.18.0",
22
+ "@devflow-tools/server": "0.18.0",
23
+ "@devflow-tools/task-runtime": "0.18.0",
24
+ "@devflow-tools/telemetry": "0.18.0",
25
+ "@devflow-tools/workflow-engine": "0.18.0"
26
+ },
27
+ "devDependencies": {
28
+ "@devflow-tools/devflow": "0.18.0"
23
29
  },
24
30
  "allowScripts": {
25
31
  "better-sqlite3@12.11.1": true,
26
32
  "sharp@0.32.6": true
27
33
  },
28
- "devDependencies": {
29
- "@devflow-tools/mcp-server": "0.17.5"
30
- },
31
34
  "keywords": [
32
35
  "pi-package",
33
36
  "skills",
@@ -47,5 +50,11 @@
47
50
  "hooks",
48
51
  "skills"
49
52
  ],
50
- "gitHead": "964af33767bf232606e63d973b3a29d7d53c8119"
53
+ "gitHead": "940c6c004c0ebb59abad3da9bc67137fa2d2a666",
54
+ "license": "MIT",
55
+ "repository": {
56
+ "type": "git",
57
+ "url": "git+https://github.com/shilongfeicool/dev-flow.git"
58
+ },
59
+ "homepage": "https://github.com/shilongfeicool/dev-flow#readme"
51
60
  }
package/package.json CHANGED
@@ -1,47 +1,50 @@
1
1
  {
2
2
  "name": "@devflow-tools/cli",
3
- "version": "0.17.7",
3
+ "version": "0.18.0",
4
4
  "type": "module",
5
- "main": "./dist/index.js",
5
+ "bin": {
6
+ "devflow": "./bin/devflow.cjs"
7
+ },
6
8
  "scripts": {
7
9
  "build": "tsc -b",
8
- "postbuild": "npx tsx scripts/build-plugin-files.ts",
10
+ "postbuild": "node --import tsx scripts/build-plugin-files.ts",
9
11
  "test": "node ../../node_modules/.bin/vitest run",
10
12
  "typecheck": "tsc --noEmit",
11
13
  "clean": "rm -rf dist"
12
14
  },
13
15
  "dependencies": {
14
16
  "@colbymchenry/codegraph": "^1.1.1",
15
- "@devflow-tools/adapters": "0.17.7",
16
- "@devflow-tools/benchmark": "0.17.7",
17
- "@devflow-tools/context-engine": "0.17.7",
18
- "@devflow-tools/database": "0.17.7",
19
- "@devflow-tools/knowledge-engine": "0.17.7",
20
- "@devflow-tools/mcp-server": "0.17.7",
21
- "@devflow-tools/memory-engine": "0.17.7",
22
- "@devflow-tools/plugin-animation": "0.17.7",
23
- "@devflow-tools/plugin-css": "0.17.7",
24
- "@devflow-tools/plugin-docker": "0.17.7",
25
- "@devflow-tools/plugin-electron": "0.17.7",
26
- "@devflow-tools/plugin-git": "0.17.7",
27
- "@devflow-tools/plugin-graphql": "0.17.7",
28
- "@devflow-tools/plugin-nest": "0.17.7",
29
- "@devflow-tools/plugin-nextjs": "0.17.7",
30
- "@devflow-tools/plugin-performance": "0.17.7",
31
- "@devflow-tools/plugin-react": "0.17.7",
32
- "@devflow-tools/plugin-tailwind": "0.17.7",
33
- "@devflow-tools/plugin-taro": "0.17.7",
34
- "@devflow-tools/plugin-ui-layout": "0.17.7",
35
- "@devflow-tools/plugin-vue": "0.17.7",
36
- "@devflow-tools/sdk": "0.17.7",
37
- "@devflow-tools/server": "0.17.7",
38
- "@devflow-tools/telemetry": "0.17.7",
39
- "@devflow-tools/workflow-engine": "0.17.7",
17
+ "@devflow-tools/adapters": "0.18.0",
18
+ "@devflow-tools/benchmark": "0.18.0",
19
+ "@devflow-tools/context-engine": "0.18.0",
20
+ "@devflow-tools/database": "0.18.0",
21
+ "@devflow-tools/knowledge-engine": "0.18.0",
22
+ "@devflow-tools/mcp-server": "0.18.0",
23
+ "@devflow-tools/memory-engine": "0.18.0",
24
+ "@devflow-tools/plugin-animation": "0.18.0",
25
+ "@devflow-tools/plugin-css": "0.18.0",
26
+ "@devflow-tools/plugin-docker": "0.18.0",
27
+ "@devflow-tools/plugin-electron": "0.18.0",
28
+ "@devflow-tools/plugin-git": "0.18.0",
29
+ "@devflow-tools/plugin-graphql": "0.18.0",
30
+ "@devflow-tools/plugin-nest": "0.18.0",
31
+ "@devflow-tools/plugin-nextjs": "0.18.0",
32
+ "@devflow-tools/plugin-performance": "0.18.0",
33
+ "@devflow-tools/plugin-react": "0.18.0",
34
+ "@devflow-tools/plugin-tailwind": "0.18.0",
35
+ "@devflow-tools/plugin-taro": "0.18.0",
36
+ "@devflow-tools/plugin-ui-layout": "0.18.0",
37
+ "@devflow-tools/plugin-vue": "0.18.0",
38
+ "@devflow-tools/sdk": "0.18.0",
39
+ "@devflow-tools/server": "0.18.0",
40
+ "@devflow-tools/telemetry": "0.18.0",
41
+ "@devflow-tools/workflow-engine": "0.18.0",
40
42
  "@inquirer/prompts": "^7.10.1",
41
43
  "chalk": "^5.3.0",
42
44
  "commander": "^12.0.0"
43
45
  },
44
46
  "devDependencies": {
47
+ "@devflow-tools/devflow": "0.18.0",
45
48
  "typescript": "^5.5.0",
46
49
  "vitest": "^2.0.0"
47
50
  },
@@ -49,5 +52,12 @@
49
52
  "dist",
50
53
  "bin"
51
54
  ],
52
- "gitHead": "560fe8a097aa9d398fdcfec409134cc94d26f92f"
55
+ "gitHead": "940c6c004c0ebb59abad3da9bc67137fa2d2a666",
56
+ "description": "Command-line interface for DevFlow development intelligence and diagnostics.",
57
+ "license": "MIT",
58
+ "repository": {
59
+ "type": "git",
60
+ "url": "git+https://github.com/shilongfeicool/dev-flow.git"
61
+ },
62
+ "homepage": "https://github.com/shilongfeicool/dev-flow#readme"
53
63
  }