@devflow-tools/devflow 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.
- package/LICENSE +21 -0
- package/README.md +2 -2
- package/acceptance-manifest.json +3 -3
- package/dist/cli.js +75 -75
- package/dist/dashboard/404.html +1 -1
- package/dist/dashboard/__next.__PAGE__.txt +22 -0
- package/dist/dashboard/__next._full.txt +17 -0
- package/dist/dashboard/__next._tree.txt +2 -0
- package/dist/dashboard/_next/static/chunks/136-c55134e877048a37.js +1 -0
- package/dist/dashboard/_next/static/chunks/240-8f45a6db4f75278b.js +1 -0
- package/dist/dashboard/_next/static/chunks/426-5d356f119312b4e9.js +1 -0
- package/dist/dashboard/_next/static/chunks/567-65014d15b90b623c.js +1 -0
- package/dist/dashboard/_next/static/chunks/6b3bb038-e03941413841e57b.js +2 -0
- package/dist/dashboard/_next/static/chunks/722-001c96b6723e043d.js +1 -0
- package/dist/dashboard/_next/static/chunks/73-0fe34a8ce87c82ea.js +1 -0
- package/dist/dashboard/_next/static/chunks/820-9606b69ff6f7f9b9.js +1 -0
- package/dist/dashboard/_next/static/chunks/87c73c54-5c63d5698583b654.js +1 -0
- package/dist/dashboard/_next/static/chunks/90-63c7687fddbb45ce.js +1 -0
- package/dist/dashboard/_next/static/chunks/914-7e538089692b7d1b.js +1 -0
- package/dist/dashboard/_next/static/chunks/968-13e9b4b491d5e8de.js +52 -0
- package/dist/dashboard/_next/static/chunks/993-01834e67bc353d44.js +1 -0
- package/dist/dashboard/_next/static/chunks/app/_global-error/page-d786ba6306178164.js +1 -0
- package/dist/dashboard/_next/static/chunks/app/_not-found/page-d0b590a9f2ad206d.js +1 -0
- package/dist/dashboard/_next/static/chunks/app/accuracy/page-72ef9620a52e345e.js +1 -0
- package/dist/dashboard/_next/static/chunks/app/benchmark/page-a6005345a1d9a286.js +1 -0
- package/dist/dashboard/_next/static/chunks/app/context/page-070c5ebfffb71f1b.js +1 -0
- package/dist/dashboard/_next/static/chunks/app/doctor/page-973e0f84ace610ac.js +1 -0
- package/dist/dashboard/_next/static/chunks/app/executions/page-52f9a045f91548cc.js +1 -0
- package/dist/dashboard/_next/static/chunks/app/graph/page-c3487fe2482e734e.js +1 -0
- package/dist/dashboard/_next/static/chunks/app/knowledge/page-e184866ed2e92ef1.js +1 -0
- package/dist/dashboard/_next/static/chunks/app/layout-a28c30513212e363.js +1 -0
- package/dist/dashboard/_next/static/chunks/app/memory/page-36e047153bedfce2.js +1 -0
- package/dist/dashboard/_next/static/chunks/app/page-1daa0024f1e5dd18.js +1 -0
- package/dist/dashboard/_next/static/chunks/app/replay/page-7a6293c77eafe8b4.js +1 -0
- package/dist/dashboard/_next/static/chunks/app/runs/[id]/page-7a92db57d7fb2265.js +1 -0
- package/dist/dashboard/_next/static/chunks/app/runs/page-36baf64267e36b28.js +1 -0
- package/dist/dashboard/_next/static/chunks/app/settings/page-90b4b80e939f76e3.js +1 -0
- package/dist/dashboard/_next/static/chunks/app/timeline/page-c1f1b6c081532456.js +1 -0
- package/dist/dashboard/_next/static/chunks/app/tool-metrics/page-1c5ddf6239cf1734.js +1 -0
- package/dist/dashboard/_next/static/chunks/app/workflows/page-e2ed74df546c3568.js +1 -0
- package/dist/dashboard/_next/static/chunks/framework-3b2aca1ee87fa7ee.js +1 -0
- package/dist/dashboard/_next/static/chunks/main-9bbdbe1dbba0ab29.js +5 -0
- package/dist/dashboard/_next/static/chunks/main-app-44f3d55a6e6befbb.js +1 -0
- package/dist/dashboard/_next/static/chunks/next/dist/client/components/builtin/app-error-d786ba6306178164.js +1 -0
- package/dist/dashboard/_next/static/chunks/next/dist/client/components/builtin/forbidden-d786ba6306178164.js +1 -0
- package/dist/dashboard/_next/static/chunks/next/dist/client/components/builtin/global-error-39f976c070691d89.js +1 -0
- package/dist/dashboard/_next/static/chunks/next/dist/client/components/builtin/not-found-d786ba6306178164.js +1 -0
- package/dist/dashboard/_next/static/chunks/next/dist/client/components/builtin/unauthorized-d786ba6306178164.js +1 -0
- package/dist/dashboard/_next/static/chunks/webpack-5f4649c40b052b9f.js +1 -0
- package/dist/dashboard/_next/static/css/6912a202a7d0c151.css +3 -0
- package/dist/dashboard/_next/static/css/e07f2bf4fa519943.css +31 -0
- package/dist/dashboard/_next/static/vYfa_ZByuhX4CBoOEYkDT/_buildManifest.js +1 -0
- package/dist/dashboard/_not-found/__next._full.txt +18 -0
- package/dist/dashboard/_not-found/__next._not-found.__PAGE__.txt +24 -0
- package/dist/dashboard/_not-found/__next._tree.txt +2 -0
- package/dist/dashboard/_not-found.html +1 -0
- package/dist/dashboard/_not-found.txt +18 -0
- package/dist/dashboard/accuracy/__next._full.txt +19 -0
- package/dist/dashboard/accuracy/__next._tree.txt +2 -0
- package/dist/dashboard/accuracy/__next.accuracy.__PAGE__.txt +25 -0
- package/dist/dashboard/accuracy.html +1 -1
- package/dist/dashboard/accuracy.txt +19 -7
- package/dist/dashboard/benchmark/__next._full.txt +19 -0
- package/dist/dashboard/benchmark/__next._tree.txt +2 -0
- package/dist/dashboard/benchmark/__next.benchmark.__PAGE__.txt +25 -0
- package/dist/dashboard/benchmark.html +1 -1
- package/dist/dashboard/benchmark.txt +19 -7
- package/dist/dashboard/context/__next._full.txt +19 -0
- package/dist/dashboard/context/__next._tree.txt +2 -0
- package/dist/dashboard/context/__next.context.__PAGE__.txt +25 -0
- package/dist/dashboard/context.html +1 -1
- package/dist/dashboard/context.txt +19 -7
- package/dist/dashboard/doctor/__next._full.txt +19 -0
- package/dist/dashboard/doctor/__next._tree.txt +2 -0
- package/dist/dashboard/doctor/__next.doctor.__PAGE__.txt +25 -0
- package/dist/dashboard/doctor.html +1 -1
- package/dist/dashboard/doctor.txt +19 -7
- package/dist/dashboard/executions/__next._full.txt +19 -0
- package/dist/dashboard/executions/__next._tree.txt +2 -0
- package/dist/dashboard/executions/__next.executions.__PAGE__.txt +25 -0
- package/dist/dashboard/executions.html +1 -1
- package/dist/dashboard/executions.txt +19 -7
- package/dist/dashboard/graph/__next._full.txt +20 -0
- package/dist/dashboard/graph/__next._tree.txt +3 -0
- package/dist/dashboard/graph/__next.graph.__PAGE__.txt +26 -0
- package/dist/dashboard/graph.html +1 -1
- package/dist/dashboard/graph.txt +20 -7
- package/dist/dashboard/index.html +1 -1
- package/dist/dashboard/index.txt +17 -7
- package/dist/dashboard/knowledge/__next._full.txt +19 -0
- package/dist/dashboard/knowledge/__next._tree.txt +2 -0
- package/dist/dashboard/knowledge/__next.knowledge.__PAGE__.txt +25 -0
- package/dist/dashboard/knowledge.html +1 -1
- package/dist/dashboard/knowledge.txt +19 -7
- package/dist/dashboard/memory/__next._full.txt +19 -0
- package/dist/dashboard/memory/__next._tree.txt +2 -0
- package/dist/dashboard/memory/__next.memory.__PAGE__.txt +25 -0
- package/dist/dashboard/memory.html +1 -1
- package/dist/dashboard/memory.txt +19 -7
- package/dist/dashboard/replay/__next._full.txt +19 -0
- package/dist/dashboard/replay/__next._tree.txt +2 -0
- package/dist/dashboard/replay/__next.replay.__PAGE__.txt +25 -0
- package/dist/dashboard/replay.html +1 -1
- package/dist/dashboard/replay.txt +19 -7
- package/dist/dashboard/runs/_/__next._full.txt +19 -0
- package/dist/dashboard/runs/_/__next._tree.txt +2 -0
- package/dist/dashboard/runs/_/__next.runs.$d$id.__PAGE__.txt +26 -0
- package/dist/dashboard/runs/_.html +1 -1
- package/dist/dashboard/runs/_.txt +19 -8
- package/dist/dashboard/runs/__next._full.txt +19 -0
- package/dist/dashboard/runs/__next._tree.txt +2 -0
- package/dist/dashboard/runs/__next.runs.__PAGE__.txt +25 -0
- package/dist/dashboard/runs.html +1 -1
- package/dist/dashboard/runs.txt +19 -7
- package/dist/dashboard/settings/__next._full.txt +19 -0
- package/dist/dashboard/settings/__next._tree.txt +2 -0
- package/dist/dashboard/settings/__next.settings.__PAGE__.txt +25 -0
- package/dist/dashboard/settings.html +1 -1
- package/dist/dashboard/settings.txt +19 -7
- package/dist/dashboard/timeline/__next._full.txt +19 -0
- package/dist/dashboard/timeline/__next._tree.txt +2 -0
- package/dist/dashboard/timeline/__next.timeline.__PAGE__.txt +25 -0
- package/dist/dashboard/timeline.html +1 -1
- package/dist/dashboard/timeline.txt +19 -7
- package/dist/dashboard/tool-metrics/__next._full.txt +19 -0
- package/dist/dashboard/tool-metrics/__next._tree.txt +2 -0
- package/dist/dashboard/tool-metrics/__next.tool-metrics.__PAGE__.txt +25 -0
- package/dist/dashboard/tool-metrics.html +1 -1
- package/dist/dashboard/tool-metrics.txt +19 -7
- package/dist/dashboard/workflows/__next._full.txt +19 -0
- package/dist/dashboard/workflows/__next._tree.txt +2 -0
- package/dist/dashboard/workflows/__next.workflows.__PAGE__.txt +25 -0
- package/dist/dashboard/workflows.html +1 -1
- package/dist/dashboard/workflows.txt +19 -7
- package/dist/hooks/enforcer-summary.js +3 -3
- package/dist/hooks/hook-client.js +3 -3
- package/dist/hooks/hook-daemon.js +27 -25
- package/dist/hooks/post-tool-use-failure.js +2 -2
- package/dist/hooks/post-tool-use.js +6 -6
- package/dist/hooks/pre-compact.js +2 -2
- package/dist/hooks/pre-tool-use.js +4 -4
- package/dist/hooks/server-bootstrap.js +22 -22
- package/dist/hooks/session-end.js +6 -6
- package/dist/hooks/stop.js +10 -10
- package/dist/hooks/user-prompt-submit.js +11 -9
- package/dist/plugin/.claude-plugin/plugin.json +1 -1
- package/dist/plugin/dist/command-registry.json +5 -5
- package/dist/plugin/dist/hooks/enforcer-summary.js +3 -3
- package/dist/plugin/dist/hooks/hook-client.js +3 -3
- package/dist/plugin/dist/hooks/hook-daemon.js +27 -25
- package/dist/plugin/dist/hooks/post-tool-use-failure.js +2 -2
- package/dist/plugin/dist/hooks/post-tool-use.js +6 -6
- package/dist/plugin/dist/hooks/pre-compact.js +2 -2
- package/dist/plugin/dist/hooks/pre-tool-use.js +4 -4
- package/dist/plugin/dist/hooks/server-bootstrap.js +22 -22
- package/dist/plugin/dist/hooks/session-end.js +6 -6
- package/dist/plugin/dist/hooks/stop.js +10 -10
- package/dist/plugin/dist/hooks/user-prompt-submit.js +11 -9
- package/dist/plugin/package.json +28 -19
- package/dist/scripts/audit-session-data.js +5 -5
- package/dist/scripts/semantic-reliability-maintenance.js +3 -3
- package/package.json +31 -22
- package/plugin-registry.json +57 -57
- package/dist/dashboard/_next/static/chunks/1dd3208c-f3e84932bdc53383.js +0 -1
- package/dist/dashboard/_next/static/chunks/221-893fab1a7d7d9317.js +0 -1
- package/dist/dashboard/_next/static/chunks/249-e04c1de6240fd78a.js +0 -1
- package/dist/dashboard/_next/static/chunks/343-09a7e255220705c5.js +0 -1
- package/dist/dashboard/_next/static/chunks/402-a2e4eb98bb6a524c.js +0 -1
- package/dist/dashboard/_next/static/chunks/429-39f42ebb1ac959d6.js +0 -1
- package/dist/dashboard/_next/static/chunks/458-75822399a849befa.js +0 -1
- package/dist/dashboard/_next/static/chunks/528-7d4fc14903647f1e.js +0 -2
- package/dist/dashboard/_next/static/chunks/568-50487ea5e93fe11f.js +0 -1
- package/dist/dashboard/_next/static/chunks/697-05cf55b6c667773f.js +0 -1
- package/dist/dashboard/_next/static/chunks/6b3bb038-34d5cf36bd0210d6.js +0 -1
- package/dist/dashboard/_next/static/chunks/736-db1a009357c222d2.js +0 -1
- package/dist/dashboard/_next/static/chunks/806-195d4d5cc6c28f6c.js +0 -1
- package/dist/dashboard/_next/static/chunks/app/_not-found/page-5252c260804ee1ce.js +0 -1
- package/dist/dashboard/_next/static/chunks/app/accuracy/page-7b4f3c728a0e880f.js +0 -1
- package/dist/dashboard/_next/static/chunks/app/benchmark/page-6c6d0acbcde4eb85.js +0 -1
- package/dist/dashboard/_next/static/chunks/app/context/page-1874ae1050524cb6.js +0 -1
- package/dist/dashboard/_next/static/chunks/app/doctor/page-d542f2ab8d6a1c59.js +0 -1
- package/dist/dashboard/_next/static/chunks/app/executions/page-9c836597c951abbb.js +0 -1
- package/dist/dashboard/_next/static/chunks/app/graph/page-f0e7e15288791e9c.js +0 -1
- package/dist/dashboard/_next/static/chunks/app/knowledge/page-86808abd0d47c026.js +0 -1
- package/dist/dashboard/_next/static/chunks/app/layout-4b78776412bd4fee.js +0 -1
- package/dist/dashboard/_next/static/chunks/app/memory/page-e05a76b696041097.js +0 -1
- package/dist/dashboard/_next/static/chunks/app/page-c3e980fb2621470c.js +0 -1
- package/dist/dashboard/_next/static/chunks/app/replay/page-a8a465ed885df0cf.js +0 -1
- package/dist/dashboard/_next/static/chunks/app/runs/[id]/page-cc1d5182707fca5b.js +0 -1
- package/dist/dashboard/_next/static/chunks/app/runs/page-bbf0a58abd70430c.js +0 -1
- package/dist/dashboard/_next/static/chunks/app/settings/page-9602ff45892e7910.js +0 -1
- package/dist/dashboard/_next/static/chunks/app/timeline/page-44541ee3e74cee0e.js +0 -1
- package/dist/dashboard/_next/static/chunks/app/tool-metrics/page-ece550f2f4328dfe.js +0 -1
- package/dist/dashboard/_next/static/chunks/app/workflows/page-228bcb475c39c1ec.js +0 -1
- package/dist/dashboard/_next/static/chunks/framework-58c3457e28c4602f.js +0 -1
- package/dist/dashboard/_next/static/chunks/main-3175faffdbfc3051.js +0 -1
- package/dist/dashboard/_next/static/chunks/main-app-202a5f91ead17fa7.js +0 -1
- package/dist/dashboard/_next/static/chunks/pages/_app-58c3f1a8a070bd35.js +0 -1
- package/dist/dashboard/_next/static/chunks/pages/_error-312a564ec7e2663f.js +0 -1
- package/dist/dashboard/_next/static/chunks/webpack-d6388c5dcd85b0c5.js +0 -1
- package/dist/dashboard/_next/static/css/322e14d06135256b.css +0 -31
- package/dist/dashboard/_next/static/css/7d4d1db5aa137b5a.css +0 -3
- package/dist/dashboard/_next/static/dvQJYEWITN-ZJs8MHQwvz/_buildManifest.js +0 -1
- /package/dist/dashboard/_next/static/{dvQJYEWITN-ZJs8MHQwvz → vYfa_ZByuhX4CBoOEYkDT}/_ssgManifest.js +0 -0
|
@@ -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&®isterRuntimeHttpSuccess(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&®isterRuntimeHttpSuccess(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
|
|
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}`:"",
|
|
6
|
-
`):["## Project memory",
|
|
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",...
|
|
9
|
-
`)}:{}}};let o=t.session_id?.trim(),i=ie(r),s=false,d,
|
|
10
|
-
`)}:{}}}}if(process.argv[1]?.endsWith("user-prompt-submit")||process.argv[1]?.endsWith("user-prompt-submit.js")){let
|
|
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};
|
package/dist/plugin/package.json
CHANGED
|
@@ -1,33 +1,36 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@devflow-tools/claude-code-plugin",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "
|
|
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": "
|
|
8
|
-
"verify:manifest": "
|
|
9
|
-
"build": "npm run sync:manifest &&
|
|
10
|
-
"deploy": "npm run sync:manifest &&
|
|
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": "
|
|
12
|
+
"verify:runtime-dependencies": "node --import tsx scripts/verify-runtime-dependencies.ts"
|
|
13
13
|
},
|
|
14
14
|
"dependencies": {
|
|
15
|
-
"@devflow-tools/benchmark": "0.
|
|
16
|
-
"@devflow-tools/context-engine": "0.
|
|
17
|
-
"@devflow-tools/database": "0.
|
|
18
|
-
"@devflow-tools/
|
|
19
|
-
"@devflow-tools/
|
|
20
|
-
"@devflow-tools/
|
|
21
|
-
"@devflow-tools/
|
|
22
|
-
"@devflow-tools/
|
|
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": "
|
|
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
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {execFileSync}from'node:child_process';import {createRequire}from'node:module';import {existsSync,readdirSync,readFileSync}from'node:fs';import {homedir}from'node:os';import {join}from'node:path';var
|
|
1
|
+
import {execFileSync}from'node:child_process';import {createRequire}from'node:module';import {existsSync,readdirSync,readFileSync}from'node:fs';import {homedir}from'node:os';import {join}from'node:path';import {getDevFlowStateRoot}from'@devflow-tools/sdk';var ue=6e4,F;function de(){if(F)return F;let e=createRequire(import.meta.url)("node:sqlite");if(typeof e.DatabaseSync!="function")throw new Error("audit-session-data requires Node.js with node:sqlite (Node.js >=22.13.0)");return F=e.DatabaseSync,F}function me(e){let t,n,s=false,i=false;for(let c=0;c<e.length;c+=1){let u=e[c];if(u==="--json")s=true;else if(u==="--strict")i=true;else if(u==="--project")t=e[++c];else if(u==="--session")n=e[++c];else throw new Error(`Unknown argument: ${u}`)}if(!t)throw new Error("--project is required");if(!n)throw new Error("--session is required");return {project:t,session:n,json:s,strict:i}}function r(e){return typeof e=="string"&&e.length>0?e:null}function A(e){return typeof e=="number"&&Number.isFinite(e)?e:null}function I(e){return e===true||e===1}function b(e,t){return !!e.prepare("SELECT 1 FROM sqlite_master WHERE type IN ('table', 'view') AND name = ?").get(t)}function q(e,t,n){return b(e,t)?e.prepare(`PRAGMA table_info(${t})`).all().some(s=>s.name===n):false}function x(e,t,n=[]){let s=e.prepare(t).get(...n);return Number(s?.count??0)}function U(e){if(typeof e!="string"||e.length===0)return e??null;try{return JSON.parse(e)}catch{return e}}function se(e){let t=U(e);return Array.isArray(t)?t.filter(n=>typeof n=="string"):[]}function P(e){return e===null||typeof e!="object"?JSON.stringify(e)??String(e):Array.isArray(e)?`[${e.map(P).join(",")}]`:`{${Object.entries(e).sort(([t],[n])=>t.localeCompare(n)).map(([t,n])=>`${JSON.stringify(t)}:${P(n)}`).join(",")}}`}function ge(e){return P({tool:e.tool,command:e.command,kind:e.kind,input:e.input})}function H(e){let t=new Map;for(let n of e){if(n.toolUseId){let c=`tool_use_id:${n.toolUseId}`,u=t.get(c)??{reason:"canonical_tool_use_id",events:[]};u.events.push(n),t.set(c,u);continue}let s=`payload:${ge(n)}`,i=t.get(s)??{reason:"normalized_payload",events:[]};i.events.push(n),t.set(s,i);}return [...t.entries()].map(([n,s])=>{let i=s.events.map(u=>u.timestamp).filter(u=>u!==null),c=i.length>1?Math.max(...i)-Math.min(...i):null;return {key:n,reason:s.reason,count:s.events.length,eventIds:s.events.map(u=>u.id),timeSpanMs:c,tool:s.events[0]?.tool??null}}).filter(n=>n.count>1&&(n.reason==="canonical_tool_use_id"||n.timeSpanMs===null||n.timeSpanMs<=ue)).sort((n,s)=>s.count-n.count||n.key.localeCompare(s.key))}function Y(e){return existsSync(e)?new(de())(e,{readOnly:true,timeout:1e3}):null}function B(e,t,n){return {path:e,exists:t,sessions:[],executions:[],events:[],duplicateCandidates:[],hookFallbacks:[],memoryTurns:[],intentArtifacts:[],queryPlans:[],toolNameResolutions:[],terminalTransitions:[],transcriptCheckpoints:[],retrievalLedger:[],...n?{error:n}:{}}}function fe(e,t,n){if(!existsSync(e))return B(e,false);let s=null;try{if(s=Y(e),!s)return B(e,!1);let i=b(s,"sessions")?s.prepare("SELECT * FROM sessions WHERE id = ?").all(n):[],c=q(s,"skill_executions","session_id"),u=b(s,"skill_executions")?s.prepare(c?"SELECT * FROM skill_executions WHERE session_id = ? OR execution_id = ? ORDER BY started_at":"SELECT * FROM skill_executions WHERE execution_id = ? ORDER BY started_at").all(...c?[n,n]:[n]):[],f=u.map(d=>r(d.execution_id)).filter(d=>d!==null),y=q(s,"tool_call_events","tool_use_id"),h=q(s,"tool_call_events","session_id"),g=q(s,"tool_call_events","kind"),m=f.length>0?`execution_id IN (${f.map(()=>"?").join(",")})`:"execution_id = ?",w=f.length>0?f:[n],l=(b(s,"tool_call_events")?s.prepare(`SELECT * FROM tool_call_events WHERE ${h?"session_id = ? OR ":""}${m} ORDER BY timestamp`).all(...h?[n,...w]:w):[]).map(d=>({id:r(d.event_id)??"unknown",sessionId:r(d.session_id),executionId:r(d.execution_id),timestamp:A(d.timestamp),tool:r(d.tool_name),toolType:r(d.tool_type),toolUseId:y?r(d.tool_use_id):null,input:U(d.input),command:null,kind:g?r(d.kind):null,fallback:I(d.mcp_fallback),failed:r(d.error)!==null&&!I(d.blocked),blocked:I(d.blocked),processed:!1})),k=b(s,"devflow_hook_fallbacks")?s.prepare("SELECT * FROM devflow_hook_fallbacks WHERE session_id = ? ORDER BY created_at").all(n):[],C=b(s,"devflow_memory_turns")?s.prepare("SELECT * FROM devflow_memory_turns WHERE session_id = ? ORDER BY created_at").all(n):[],E=(d,a)=>b(s,d)?s.prepare(`SELECT * FROM ${d} WHERE project_root = ? AND session_id = ? ORDER BY ${a}`).all(t,n):[];return {path:e,exists:!0,sessions:i,executions:u,events:l,duplicateCandidates:H(l),hookFallbacks:k,memoryTurns:C,intentArtifacts:E("devflow_task_intent_artifacts","created_at"),queryPlans:E("devflow_channel_query_plans","created_at"),toolNameResolutions:E("devflow_tool_name_resolutions","created_at"),terminalTransitions:E("devflow_terminal_transitions","created_at"),transcriptCheckpoints:E("devflow_transcript_checkpoints","created_at"),retrievalLedger:E("devflow_retrieval_ledger","created_at")}}catch(i){return B(e,true,i instanceof Error?i.message:String(i))}finally{s?.close();}}function pe(e,t){let n=join(e,".devflow","memory","memories.db"),s={databasePath:n,session:null,eventCount:0,processedEventCount:0,pendingEventCount:0,eventsByTool:[],duplicateCandidates:[],projectObservationCount:0,quarantinedObservationCount:0,supersededObservationCount:0,sessionObservationCount:0,sessionObservationVectorCount:0,projectObservationVectorCount:0,pendingLeaseCount:0,distillReceiptIds:[],activeSessionCount:0};if(!existsSync(n))return s;let i=null;try{if(i=Y(n),!i)return s;let u=(b(i,"session_events")?i.prepare("SELECT * FROM session_events WHERE session_id = ? ORDER BY created_at").all(t):[]).map(l=>({id:r(l.id)??"unknown",sessionId:r(l.session_id),executionId:null,timestamp:A(l.created_at),tool:r(l.tool),toolType:null,toolUseId:null,input:U(l.payload),command:r(l.command),kind:r(l.kind),fallback:!1,failed:!1,blocked:!1,processed:I(l.processed)})),f=b(i,"observations")?i.prepare(`
|
|
2
2
|
SELECT session_id, embedding, quality_status, resolution_state
|
|
3
3
|
FROM observations
|
|
4
4
|
`).all():[],y=b(i,"sessions")?i.prepare("SELECT * FROM sessions WHERE id = ?").get(t)??null:null,h=new Map;for(let l of u){let k=`${l.tool??""}\0${l.kind??""}`,C=h.get(k)??{tool:l.tool,kind:l.kind,count:0};C.count+=1,h.set(k,C);}let g=f.filter(l=>r(l.quality_status)!=="quarantined"&&r(l.resolution_state)!=="superseded"),m=g.filter(l=>l.session_id===t),w=b(i,"distill_receipts")&&b(i,"distill_leases")?i.prepare(`
|
|
@@ -6,9 +6,9 @@ import {execFileSync}from'node:child_process';import {createRequire}from'node:mo
|
|
|
6
6
|
FROM distill_receipts r
|
|
7
7
|
JOIN distill_leases l ON l.batch_id = r.batch_id
|
|
8
8
|
ORDER BY r.created_at
|
|
9
|
-
`).all().filter(l=>se(l.session_ids).includes(t)).map(l=>r(l.receipt_id)).filter(l=>l!==null):[],
|
|
10
|
-
`).filter(t=>t.trim().length>0).length}catch{return null}}function
|
|
11
|
-
`)}function
|
|
9
|
+
`).all().filter(l=>se(l.session_ids).includes(t)).map(l=>r(l.receipt_id)).filter(l=>l!==null):[],S=l=>l.embedding!==null&&l.embedding!==void 0;return {databasePath:n,session:y,eventCount:u.length,processedEventCount:u.filter(l=>l.processed).length,pendingEventCount:u.filter(l=>!l.processed).length,eventsByTool:[...h.values()].sort((l,k)=>k.count-l.count),duplicateCandidates:H(u),projectObservationCount:g.length,quarantinedObservationCount:f.filter(l=>r(l.quality_status)==="quarantined").length,supersededObservationCount:f.filter(l=>r(l.resolution_state)==="superseded").length,sessionObservationCount:m.length,sessionObservationVectorCount:m.filter(S).length,projectObservationVectorCount:g.filter(S).length,pendingLeaseCount:b(i,"distill_leases")?x(i,"SELECT COUNT(*) AS count FROM distill_leases WHERE status = 'pending'"):0,distillReceiptIds:w,activeSessionCount:b(i,"sessions")?x(i,"SELECT COUNT(*) AS count FROM sessions WHERE status = 'active'"):0}}catch(c){return {...s,error:c instanceof Error?c.message:String(c)}}finally{i?.close();}}function be(e){let t=join(e,".devflow","knowledge","knowledge.db"),n={databasePath:t,documentCount:0,chunkCount:0,emptyTitleCount:0,vectorRowCount:0,sourceCounts:[]};if(!existsSync(t))return n;let s=null;try{if(s=Y(t),!s)return n;let i=b(s,"knowledge_docs")?x(s,"SELECT COUNT(*) AS count FROM knowledge_docs"):0,c=b(s,"knowledge_chunks")?x(s,"SELECT COUNT(*) AS count FROM knowledge_chunks"):0,u=b(s,"knowledge_docs")?x(s,"SELECT COUNT(*) AS count FROM knowledge_docs WHERE TRIM(COALESCE(title, '')) = ''"):0,f=b(s,"knowledge_docs")?s.prepare("SELECT source, COUNT(*) AS count FROM knowledge_docs GROUP BY source ORDER BY count DESC").all().map(y=>({source:r(y.source),count:Number(y.count??0)})):[];return {databasePath:t,documentCount:i,chunkCount:c,emptyTitleCount:u,vectorRowCount:b(s,"knowledge_vec_rowids")?x(s,"SELECT COUNT(*) AS count FROM knowledge_vec_rowids"):0,sourceCounts:f}}catch(i){return {...n,error:i instanceof Error?i.message:String(i)}}finally{s?.close();}}function ye(){let e=join(homedir(),".claude","plugins","cache","devflow-local","devflow");if(!existsSync(e))return null;let t=readdirSync(e,{withFileTypes:true}).filter(n=>n.isDirectory()).map(n=>n.name).sort();return t.length>0?join(e,t[t.length-1]):null}function Z(e){if(!e)return null;try{let t=JSON.parse(readFileSync(join(e,".claude-plugin","plugin.json"),"utf8"));return r(t.version)}catch{return null}}function he(e,t){try{return execFileSync(e,t,{encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim()||null}catch{return null}}function _e(e,t,n){let s=join(e,".devflow","logs","traces");if(!existsSync(s))return null;let i=[];for(let c of readdirSync(s,{withFileTypes:true})){if(!c.isDirectory())continue;for(let f of t){let y=join(s,c.name,`${f}.jsonl`);existsSync(y)&&i.push(y);}let u=join(s,c.name,`${n}.jsonl`);existsSync(u)&&i.push(u);}return i[0]??null}function Ce(e){if(!e)return null;try{return readFileSync(e,"utf8").split(`
|
|
10
|
+
`).filter(t=>t.trim().length>0).length}catch{return null}}function ve(e,t){let n=join(e,".devflow","logs","sessions");if(!existsSync(n))return [];let s=[],i=readdirSync(n).filter(c=>c.endsWith(".jsonl")).sort().slice(-32);for(let c of i){let u=join(n,c),f;try{f=readFileSync(u,"utf8").split(/\r?\n/u).filter(Boolean);}catch{continue}for(let y of f){let h;try{h=JSON.parse(y);}catch{continue}let g=ee(h.data),m=ee(g.identity);if((r(m.sessionId)??r(g.sessionId))!==t)continue;let S=r(h.event);S&&s.push({event:S,level:r(h.level),identity:m,data:g,timestamp:A(h.ts)??A(g.timestamp),sourcePath:u});}}return s}function ee(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:{}}function ke(e){let t=ve(e.project,e.sessionId),n=new Map;for(let o of t)n.set(o.event,(n.get(o.event)??0)+1);let s=o=>n.has(o),i=j(e.databases.flatMap(o=>o.intentArtifacts),"artifact_hash"),c=j(e.databases.flatMap(o=>o.queryPlans),"plan_hash"),u=j(e.databases.flatMap(o=>o.terminalTransitions),"receipt_id"),f=j(e.databases.flatMap(o=>o.transcriptCheckpoints),"id"),y=e.events.filter(o=>o.toolType==="mcp"),h=y.some(o=>L(o.tool)==="get_project_context"),g=[],m=o=>{g.includes(o)||g.push(o);};i.length>0&&["host.prompt.normalized","intent.artifact.created","intent.artifact.persisted","query.plan.created","terminal.state.transitioned"].forEach(m),y.length>0&&(m("canonical.tool.resolved"),m("mcp.action.started"),m("mcp.action.{completed|degraded|failed}")),h&&(m("retrieval.channel.completed"),m("codegraph.selection.completed"),y.some(p=>L(p.tool)==="get_memory")&&m("memory.{search.completed|candidates.gated|search.degraded}"),m("knowledge.{search.completed|search.degraded|abstained}"));let w=e.memoryTurns.filter(o=>r(o.status)!=="pending"),S=e.memoryTurns.filter(o=>r(o.status)==="committed");w.length>0&&m("memory.semantic.decided"),S.length>0&&m("memory.{write.completed|write.degraded}"),f.length>0&&m("session.reconciled"),t.some(o=>o.event==="hook.stop.completed"||o.event==="hook.stop.degraded")&&m("hook.stop.{completed|degraded}"),e.executionCompleted&&m("hook.session_end.{completed|degraded}");let k=g.filter(o=>!Re(o,s)),C=[];for(let o of i){let p=r(o.artifact_hash),v=r(o.turn_id),$=r(o.request_id);if(!p||!v||!$){C.push(`intent_artifact_missing_identity:${p??"unknown"}`);continue}let D=c.find(O=>r(O.source_intent_hash)===p);D?(r(D.turn_id)!==v||r(D.request_id)!==$)&&C.push(`query_plan_identity_mismatch:${v}`):C.push(`intent_without_query_plan:${v}`),u.filter(O=>r(O.turn_id)===v).some(O=>r(O.request_id)!==$)&&C.push(`terminal_identity_mismatch:${v}`);let Q=t.filter(O=>r(O.identity.turnId)===v);Q.length>0&&Q.some(O=>{let X=r(O.identity.requestId);return X!==null&&X!==$})&&C.push(`semantic_log_request_mismatch:${v}`);}let E=new Set(["closed","closed_with_degradation","closed_with_retry_work"]),d=0,a=0,T=new Set(t.filter(o=>(o.event==="mcp.action.failed"||o.event==="host.tool.result.reconciled")&&r(o.identity.turnId)&&(o.event==="mcp.action.failed"||r(o.data.failureCategory)!==null)).map(o=>r(o.identity.turnId)));for(let o of i){let p=r(o.turn_id),v=u.filter($=>r($.turn_id)===p).sort(($,D)=>Number(D.sequence??0)-Number($.sequence??0))[0];(!v||!E.has(r(v.to_state)??""))&&(d+=1),v&&r(v.to_state)==="closed"&&p&&T.has(p)&&(a+=1);}let oe=new Set(["terminal_reconciliation_without_context_transition","no_outstanding_canonical_action_receipt"]),J=u.filter(o=>oe.has(r(o.reason)??"")).length,M=t.filter(o=>o.event==="knowledge.query.executed"&&(o.data.expectedRelevant===true||Array.isArray(o.data.relevantSourceIds)&&o.data.relevantSourceIds.length>0)),K=M.filter(o=>A(o.data.selected)!==null&&Number(o.data.selected)>0).length,ie={numerator:K,denominator:M.length,value:M.length===0?null:K/M.length},N=[],re=new Set(t.filter(o=>o.event==="mcp.action.failed").map(o=>L(r(o.data.tool))).filter(o=>o!==null));for(let o of e.events.filter(p=>p.failed)){let p=L(o.tool);p&&!re.has(p)&&N.push(`tool_failure_without_semantic_log:${p}:${o.id}`);}e.hookFallbacks.length>0&&!s("hook.runtime.degraded")&&!s("hook.session_end.degraded")&&N.push(`hook_fallback_without_semantic_log:${e.hookFallbacks.length}`);let z=[...new Set(C)],G=[...new Set(N)],ae={criticalEventsPresent:k.length===0,identityChainsComplete:z.length===0,noConsoleOnlyBusinessFailures:G.length===0,noTerminalOrphans:d===0,noTerminalFalseSuccesses:a===0,noSyntheticSuccessTransitions:J===0};return {logEventCount:t.length,eventClasses:[...n.entries()].map(([o,p])=>({event:o,count:p})).sort((o,p)=>o.event.localeCompare(p.event)),requiredEventClasses:g,missingCriticalEventClasses:k,brokenIdentityChains:z,consoleOnlyBusinessFailures:G,terminalOrphanCount:d,knowledgeRecall:ie,terminalFalseSuccessCount:a,syntheticSuccessTransitionCount:J,gates:ae}}function Re(e,t){let n=e.match(/^(.*?)\.\{(.+)\}$/u);return n?n[2].split("|").some(s=>t(`${n[1]}.${s}`)):t(e)}function j(e,t){let n=new Map;for(let s of e)n.set(r(s[t])??P(s),s);return [...n.values()]}function L(e){return e?e.replace(/^mcp__[^_]+__/u,""):null}function we(e){try{return execFileSync("git",["-C",e,"status","--short","--branch"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim()}catch{return "unavailable"}}function Se(e,t){let n=join(getDevFlowStateRoot(),"global"),s=[join(n,"devflow.db"),join(e,".devflow","devflow.db")],i=s.filter((a,T)=>s.indexOf(a)===T).map(a=>fe(a,e,t)),c=i.flatMap(a=>a.events),u=i.flatMap(a=>a.hookFallbacks),f=i.flatMap(a=>a.memoryTurns),y=[...new Set(i.flatMap(a=>a.executions).map(a=>r(a.execution_id)).filter(a=>a!==null))],h=new Map;for(let a of c)h.set(a.tool,(h.get(a.tool)??0)+1);let g=ye(),m=_e(e,y,t),w=pe(e,t),S=be(e),l=join(homedir(),".claude","skills","devflow:react","SKILL.md"),k=i.find(a=>a.executions.length>0)??i.find(a=>a.sessions.length>0),C=k?.executions.at(-1)??null,E=k?.sessions.at(-1)??null,d=ke({project:e,sessionId:t,databases:i,events:c,hookFallbacks:u,memoryTurns:f,executionCompleted:["completed","failed"].includes(r(C?.status)??"")});return {schemaVersion:1,readOnly:true,generatedAt:new Date().toISOString(),project:{root:e,gitStatus:we(e)},query:{sessionId:t,executionIds:y},runtime:{nodeVersion:process.version,claudeVersion:he("claude",["--version"]),devflowVersion:Z(g),activePluginPath:g,activePluginVersion:Z(g),activeReactSkillPath:g?join(g,"skills","react","SKILL.md"):null,activeReactSkillExists:g?existsSync(join(g,"skills","react","SKILL.md")):false,legacyReactSkillPath:l,legacyReactSkillExists:existsSync(l),tracePath:m,traceEventCount:Ce(m)},telemetry:{databases:i,eventCount:c.length,mcpEventCount:c.filter(a=>a.toolType==="mcp").length,fallbackCount:c.filter(a=>a.fallback).length+u.length,fallbackReasons:[...new Set([...c.filter(a=>a.fallback).map(()=>"direct_tool_during_context"),...u.map(a=>`daemon_${r(a.reason)??"unknown"}`)])],actualFailureCount:c.filter(a=>a.failed).length,missedTools:se(C?.missed_mcp_tools),memoryReceiptIds:[...new Set(f.map(a=>r(a.receipt_id)).filter(a=>a!==null))],missingMemoryDecisionCount:f.filter(a=>r(a.status)==="pending").length,blockedCount:c.filter(a=>a.blocked).length,duplicateCandidates:H(c),byTool:[...h.entries()].map(([a,T])=>({tool:a,count:T})).sort((a,T)=>T.count-a.count||String(a.tool).localeCompare(String(T.tool)))},memory:w,knowledge:S,lifecycle:{telemetrySession:E,telemetryExecution:C,memorySession:w.session},semantic:d}}function Ee(e){let t=e.telemetry,n=e.memory,s=e.lifecycle;return [`Session audit: ${e.query.sessionId}`,`Project: ${e.project.root}`,`Git: ${e.project.gitStatus||"(clean)"}`,`Telemetry: ${t.eventCount} events (${t.mcpEventCount} MCP, ${t.fallbackCount} fallback, ${t.actualFailureCount} failed, ${t.blockedCount} blocked)`,`Compliance: missed tools ${t.missedTools.join(", ")||"none"}; fallback reasons ${t.fallbackReasons.join(", ")||"none"}`,`Memory decisions: ${t.memoryReceiptIds.length} receipts, ${t.missingMemoryDecisionCount} pending; distill receipts ${e.memory.distillReceiptIds.length}`,`Memory events: ${n.eventCount} (${n.processedEventCount} processed, ${n.pendingEventCount} pending)`,`Observations: ${n.sessionObservationCount} eligible for session / ${n.projectObservationCount} eligible for project; embedding coverage ${n.sessionObservationVectorCount}/${n.sessionObservationCount} for session, ${n.projectObservationVectorCount}/${n.projectObservationCount} for project`,`Observation exclusions: ${n.quarantinedObservationCount} quarantined, ${n.supersededObservationCount} superseded`,`Duplicates: ${t.duplicateCandidates.length} telemetry candidate groups, ${n.duplicateCandidates.length} Memory candidate groups`,`Lifecycle: telemetry ${r(s.telemetrySession?.status)??"missing"}, execution ${r(s.telemetryExecution?.status)??"missing"}, memory ${r(s.memorySession?.status)??"missing"}`,`Knowledge: ${e.knowledge.documentCount} docs, ${e.knowledge.chunkCount} chunks, ${e.knowledge.vectorRowCount} vectors, ${e.knowledge.emptyTitleCount} empty titles`,`Runtime: Claude ${e.runtime.claudeVersion??"unknown"}, DevFlow ${e.runtime.devflowVersion??"unknown"}, trace events ${e.runtime.traceEventCount??"unknown"}`,`Semantic logs: ${e.semantic.logEventCount} events; missing ${e.semantic.missingCriticalEventClasses.join(", ")||"none"}; broken identity ${e.semantic.brokenIdentityChains.length}; console-only failures ${e.semantic.consoleOnlyBusinessFailures.length}; terminal orphans ${e.semantic.terminalOrphanCount}; false success ${e.semantic.terminalFalseSuccessCount}; synthetic success transitions ${e.semantic.syntheticSuccessTransitionCount}`,`Knowledge recall: ${e.semantic.knowledgeRecall.value===null?"not measurable":e.semantic.knowledgeRecall.value} (${e.semantic.knowledgeRecall.numerator}/${e.semantic.knowledgeRecall.denominator})`,`Semantic gates: ${Object.entries(e.semantic.gates).filter(([,i])=>!i).map(([i])=>i).join(", ")||"passed"}`].join(`
|
|
11
|
+
`)}function Oe(){try{let e=me(process.argv.slice(2)),t=Se(e.project,e.session);process.stdout.write(e.json?`${JSON.stringify(t,null,2)}
|
|
12
12
|
`:`${Ee(t)}
|
|
13
13
|
`),e.strict&&!Object.values(t.semantic.gates).every(Boolean)&&(process.exitCode=1);}catch(e){process.stderr.write(`${e instanceof Error?e.message:String(e)}
|
|
14
|
-
`),process.exitCode=1;}}
|
|
14
|
+
`),process.exitCode=1;}}Oe();
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
`,{mode:384}),emitSemanticControlLog({event:"hook.runtime.completed",identity:{projectRoot:e.projectRoot},level:
|
|
3
|
-
`);}function
|
|
1
|
+
import {mkdirSync,writeFileSync}from'node:fs';import {join,resolve}from'node:path';import {createEngines}from'@devflow-tools/mcp-server/composition';import {runKnowledgeMaintenance,KnowledgeEngine}from'@devflow-tools/knowledge-engine';import {MemoryMaintenance,MEMORY_MAINTENANCE_ACTIONS,EmbeddingProvider}from'@devflow-tools/memory-engine';import {emitSemanticControlLog}from'@devflow-tools/telemetry';import {resolveStableProjectIdentity}from'@devflow-tools/sdk';function k(e){let o,r=false,n=false;for(let s=0;s<e.length;s+=1){let t=e[s];if(t==="--project")o=e[++s];else if(t==="--apply")r=true;else if(t==="--reprocess-pending")n=true;else if(t!=="--dry-run")throw new Error(`Unknown argument: ${t}`)}if(!o)throw new Error("--project is required");return {projectRoot:resolve(o),apply:r,reprocessPending:n}}async function P(){let e=k(process.argv.slice(2)),o=Date.now(),r=await new MemoryMaintenance(e.projectRoot).run({actions:MEMORY_MAINTENANCE_ACTIONS.filter(p=>p!=="reprocess-pending"||e.reprocessPending),apply:e.apply}),n=await runKnowledgeMaintenance({projectRoot:e.projectRoot,apply:e.apply}),s=await M(e.projectRoot,e.apply),t=await S(e.projectRoot,e.apply),i={schemaVersion:1,projectRoot:e.projectRoot,mode:e.apply?"apply":"dry-run",generatedAt:o,memory:r,knowledge:n,knowledgeReadiness:s,codegraph:t},c=join(e.projectRoot,".devflow","maintenance");mkdirSync(c,{recursive:true});let a=join(c,`semantic-reliability-${o}.json`);writeFileSync(a,`${JSON.stringify(i,null,2)}
|
|
2
|
+
`,{mode:384}),emitSemanticControlLog({event:"hook.runtime.completed",identity:{projectRoot:e.projectRoot},level:s.error||t.error?"warn":"info",timestamp:Date.now(),data:{stage:"semantic_reliability_maintenance",mode:i.mode,manifestPath:a,knowledgeReadiness:s,codegraph:t,memoryBackupPath:r.backupPath,knowledgeBackupPath:n.backupPath}}),process.stdout.write(`${JSON.stringify({manifestPath:a,...i},null,2)}
|
|
3
|
+
`);}async function M(e,o){if(!o)return {refreshed:false};let r=new KnowledgeEngine({projectRoot:e,projectId:resolveStableProjectIdentity(e).projectId,embedder:new EmbeddingProvider});try{return await r.backfillVectors({batchSize:32}),{refreshed:!0}}catch(n){return {refreshed:false,error:n instanceof Error?n.message:String(n)}}finally{r.close();}}async function S(e,o){if(!o)return {refreshed:false,files:0,symbols:0};try{let r=await createEngines(e);o&&await r.indexer.reconcile();let n=await r.indexer.getStatus();return {refreshed:o,files:n.totalFiles,symbols:n.totalSymbols}}catch(r){return {refreshed:false,files:0,symbols:0,error:r instanceof Error?r.message:String(r)}}}P().catch(e=>{process.stderr.write(`${e instanceof Error?e.stack??e.message:String(e)}
|
|
4
4
|
`),process.exitCode=1;});
|
package/package.json
CHANGED
|
@@ -1,43 +1,46 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@devflow-tools/devflow",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.18.0",
|
|
4
4
|
"type": "module",
|
|
5
|
-
"description": "DevFlow
|
|
5
|
+
"description": "Installable DevFlow distribution containing the CLI, runtime hooks, and Claude plugin.",
|
|
6
6
|
"bin": {
|
|
7
7
|
"devflow": "./bin/devflow"
|
|
8
8
|
},
|
|
9
9
|
"scripts": {
|
|
10
10
|
"build": "tsup",
|
|
11
|
-
"audit-session-data": "tsx scripts/audit-session-data.ts",
|
|
12
|
-
"maintain:semantic-reliability": "tsx scripts/semantic-reliability-maintenance.ts",
|
|
11
|
+
"audit-session-data": "node --import tsx scripts/audit-session-data.ts",
|
|
12
|
+
"maintain:semantic-reliability": "node --import tsx scripts/semantic-reliability-maintenance.ts",
|
|
13
13
|
"build:watch": "tsup --watch",
|
|
14
14
|
"clean": "rm -rf dist",
|
|
15
|
-
"postbuild": "cp ../../apps/server/public/fallback.html dist/fallback.html &&
|
|
15
|
+
"postbuild": "cp ../../apps/server/public/fallback.html dist/fallback.html && node --import tsx scripts/bundle-plugin.ts",
|
|
16
16
|
"postinstall": "node scripts/postinstall.js"
|
|
17
17
|
},
|
|
18
18
|
"dependencies": {
|
|
19
19
|
"@colbymchenry/codegraph": "^1.1.1",
|
|
20
|
-
"@devflow-tools/adapters": "0.
|
|
21
|
-
"@devflow-tools/benchmark": "0.
|
|
22
|
-
"@devflow-tools/context-engine": "0.
|
|
23
|
-
"@devflow-tools/database": "0.
|
|
24
|
-
"@devflow-tools/knowledge-engine": "0.
|
|
25
|
-
"@devflow-tools/mcp-server": "0.
|
|
26
|
-
"@devflow-tools/memory-engine": "0.
|
|
27
|
-
"@devflow-tools/
|
|
28
|
-
"@devflow-tools/
|
|
29
|
-
"@devflow-tools/
|
|
30
|
-
"@devflow-tools/
|
|
20
|
+
"@devflow-tools/adapters": "0.18.0",
|
|
21
|
+
"@devflow-tools/benchmark": "0.18.0",
|
|
22
|
+
"@devflow-tools/context-engine": "0.18.0",
|
|
23
|
+
"@devflow-tools/database": "0.18.0",
|
|
24
|
+
"@devflow-tools/knowledge-engine": "0.18.0",
|
|
25
|
+
"@devflow-tools/mcp-server": "0.18.0",
|
|
26
|
+
"@devflow-tools/memory-engine": "0.18.0",
|
|
27
|
+
"@devflow-tools/retrieval-engine": "0.18.0",
|
|
28
|
+
"@devflow-tools/sdk": "0.18.0",
|
|
29
|
+
"@devflow-tools/semantic-engine": "0.18.0",
|
|
30
|
+
"@devflow-tools/task-runtime": "0.18.0",
|
|
31
|
+
"@devflow-tools/server": "0.18.0",
|
|
32
|
+
"@devflow-tools/telemetry": "0.18.0",
|
|
33
|
+
"@devflow-tools/workflow-engine": "0.18.0",
|
|
31
34
|
"@inquirer/prompts": "^7.10.1",
|
|
32
|
-
"@modelcontextprotocol/sdk": "^1.
|
|
33
|
-
"@nestjs/common": "^
|
|
34
|
-
"@nestjs/core": "^
|
|
35
|
-
"@nestjs/platform-fastify": "^
|
|
35
|
+
"@modelcontextprotocol/sdk": "^1.30.0",
|
|
36
|
+
"@nestjs/common": "^11.1.28",
|
|
37
|
+
"@nestjs/core": "^11.1.28",
|
|
38
|
+
"@nestjs/platform-fastify": "^11.1.29",
|
|
36
39
|
"chalk": "^5.3.0",
|
|
37
40
|
"class-transformer": "^0.5.1",
|
|
38
41
|
"class-validator": "^0.14.0",
|
|
39
42
|
"commander": "^12.0.0",
|
|
40
|
-
"fastify": "^
|
|
43
|
+
"fastify": "^5.11.3",
|
|
41
44
|
"reflect-metadata": "^0.2.0",
|
|
42
45
|
"rxjs": "^7.8.0"
|
|
43
46
|
},
|
|
@@ -55,5 +58,11 @@
|
|
|
55
58
|
"plugin-registry.json",
|
|
56
59
|
"scripts/postinstall.js"
|
|
57
60
|
],
|
|
58
|
-
"gitHead": "
|
|
61
|
+
"gitHead": "940c6c004c0ebb59abad3da9bc67137fa2d2a666",
|
|
62
|
+
"license": "MIT",
|
|
63
|
+
"repository": {
|
|
64
|
+
"type": "git",
|
|
65
|
+
"url": "git+https://github.com/shilongfeicool/dev-flow.git"
|
|
66
|
+
},
|
|
67
|
+
"homepage": "https://github.com/shilongfeicool/dev-flow#readme"
|
|
59
68
|
}
|