@devflow-tools/devflow 0.17.8 → 0.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (203) hide show
  1. package/LICENSE +21 -0
  2. package/acceptance-manifest.json +3 -3
  3. package/dist/cli.js +75 -75
  4. package/dist/dashboard/404.html +1 -1
  5. package/dist/dashboard/__next.__PAGE__.txt +22 -0
  6. package/dist/dashboard/__next._full.txt +17 -0
  7. package/dist/dashboard/__next._tree.txt +2 -0
  8. package/dist/dashboard/_next/static/chunks/136-c55134e877048a37.js +1 -0
  9. package/dist/dashboard/_next/static/chunks/240-8f45a6db4f75278b.js +1 -0
  10. package/dist/dashboard/_next/static/chunks/426-5d356f119312b4e9.js +1 -0
  11. package/dist/dashboard/_next/static/chunks/567-65014d15b90b623c.js +1 -0
  12. package/dist/dashboard/_next/static/chunks/6b3bb038-e03941413841e57b.js +2 -0
  13. package/dist/dashboard/_next/static/chunks/722-001c96b6723e043d.js +1 -0
  14. package/dist/dashboard/_next/static/chunks/73-0fe34a8ce87c82ea.js +1 -0
  15. package/dist/dashboard/_next/static/chunks/820-9606b69ff6f7f9b9.js +1 -0
  16. package/dist/dashboard/_next/static/chunks/87c73c54-5c63d5698583b654.js +1 -0
  17. package/dist/dashboard/_next/static/chunks/90-63c7687fddbb45ce.js +1 -0
  18. package/dist/dashboard/_next/static/chunks/914-7e538089692b7d1b.js +1 -0
  19. package/dist/dashboard/_next/static/chunks/968-13e9b4b491d5e8de.js +52 -0
  20. package/dist/dashboard/_next/static/chunks/993-01834e67bc353d44.js +1 -0
  21. package/dist/dashboard/_next/static/chunks/app/_global-error/page-d786ba6306178164.js +1 -0
  22. package/dist/dashboard/_next/static/chunks/app/_not-found/page-d0b590a9f2ad206d.js +1 -0
  23. package/dist/dashboard/_next/static/chunks/app/accuracy/page-72ef9620a52e345e.js +1 -0
  24. package/dist/dashboard/_next/static/chunks/app/benchmark/page-a6005345a1d9a286.js +1 -0
  25. package/dist/dashboard/_next/static/chunks/app/context/page-070c5ebfffb71f1b.js +1 -0
  26. package/dist/dashboard/_next/static/chunks/app/doctor/page-973e0f84ace610ac.js +1 -0
  27. package/dist/dashboard/_next/static/chunks/app/executions/page-52f9a045f91548cc.js +1 -0
  28. package/dist/dashboard/_next/static/chunks/app/graph/page-c3487fe2482e734e.js +1 -0
  29. package/dist/dashboard/_next/static/chunks/app/knowledge/page-e184866ed2e92ef1.js +1 -0
  30. package/dist/dashboard/_next/static/chunks/app/layout-a28c30513212e363.js +1 -0
  31. package/dist/dashboard/_next/static/chunks/app/memory/page-36e047153bedfce2.js +1 -0
  32. package/dist/dashboard/_next/static/chunks/app/page-1daa0024f1e5dd18.js +1 -0
  33. package/dist/dashboard/_next/static/chunks/app/replay/page-7a6293c77eafe8b4.js +1 -0
  34. package/dist/dashboard/_next/static/chunks/app/runs/[id]/page-7a92db57d7fb2265.js +1 -0
  35. package/dist/dashboard/_next/static/chunks/app/runs/page-36baf64267e36b28.js +1 -0
  36. package/dist/dashboard/_next/static/chunks/app/settings/page-90b4b80e939f76e3.js +1 -0
  37. package/dist/dashboard/_next/static/chunks/app/timeline/page-c1f1b6c081532456.js +1 -0
  38. package/dist/dashboard/_next/static/chunks/app/tool-metrics/page-1c5ddf6239cf1734.js +1 -0
  39. package/dist/dashboard/_next/static/chunks/app/workflows/page-e2ed74df546c3568.js +1 -0
  40. package/dist/dashboard/_next/static/chunks/framework-3b2aca1ee87fa7ee.js +1 -0
  41. package/dist/dashboard/_next/static/chunks/main-9bbdbe1dbba0ab29.js +5 -0
  42. package/dist/dashboard/_next/static/chunks/main-app-44f3d55a6e6befbb.js +1 -0
  43. package/dist/dashboard/_next/static/chunks/next/dist/client/components/builtin/app-error-d786ba6306178164.js +1 -0
  44. package/dist/dashboard/_next/static/chunks/next/dist/client/components/builtin/forbidden-d786ba6306178164.js +1 -0
  45. package/dist/dashboard/_next/static/chunks/next/dist/client/components/builtin/global-error-39f976c070691d89.js +1 -0
  46. package/dist/dashboard/_next/static/chunks/next/dist/client/components/builtin/not-found-d786ba6306178164.js +1 -0
  47. package/dist/dashboard/_next/static/chunks/next/dist/client/components/builtin/unauthorized-d786ba6306178164.js +1 -0
  48. package/dist/dashboard/_next/static/chunks/webpack-5f4649c40b052b9f.js +1 -0
  49. package/dist/dashboard/_next/static/css/6912a202a7d0c151.css +3 -0
  50. package/dist/dashboard/_next/static/css/e07f2bf4fa519943.css +31 -0
  51. package/dist/dashboard/_next/static/vYfa_ZByuhX4CBoOEYkDT/_buildManifest.js +1 -0
  52. package/dist/dashboard/_not-found/__next._full.txt +18 -0
  53. package/dist/dashboard/_not-found/__next._not-found.__PAGE__.txt +24 -0
  54. package/dist/dashboard/_not-found/__next._tree.txt +2 -0
  55. package/dist/dashboard/_not-found.html +1 -0
  56. package/dist/dashboard/_not-found.txt +18 -0
  57. package/dist/dashboard/accuracy/__next._full.txt +19 -0
  58. package/dist/dashboard/accuracy/__next._tree.txt +2 -0
  59. package/dist/dashboard/accuracy/__next.accuracy.__PAGE__.txt +25 -0
  60. package/dist/dashboard/accuracy.html +1 -1
  61. package/dist/dashboard/accuracy.txt +19 -7
  62. package/dist/dashboard/benchmark/__next._full.txt +19 -0
  63. package/dist/dashboard/benchmark/__next._tree.txt +2 -0
  64. package/dist/dashboard/benchmark/__next.benchmark.__PAGE__.txt +25 -0
  65. package/dist/dashboard/benchmark.html +1 -1
  66. package/dist/dashboard/benchmark.txt +19 -7
  67. package/dist/dashboard/context/__next._full.txt +19 -0
  68. package/dist/dashboard/context/__next._tree.txt +2 -0
  69. package/dist/dashboard/context/__next.context.__PAGE__.txt +25 -0
  70. package/dist/dashboard/context.html +1 -1
  71. package/dist/dashboard/context.txt +19 -7
  72. package/dist/dashboard/doctor/__next._full.txt +19 -0
  73. package/dist/dashboard/doctor/__next._tree.txt +2 -0
  74. package/dist/dashboard/doctor/__next.doctor.__PAGE__.txt +25 -0
  75. package/dist/dashboard/doctor.html +1 -1
  76. package/dist/dashboard/doctor.txt +19 -7
  77. package/dist/dashboard/executions/__next._full.txt +19 -0
  78. package/dist/dashboard/executions/__next._tree.txt +2 -0
  79. package/dist/dashboard/executions/__next.executions.__PAGE__.txt +25 -0
  80. package/dist/dashboard/executions.html +1 -1
  81. package/dist/dashboard/executions.txt +19 -7
  82. package/dist/dashboard/graph/__next._full.txt +20 -0
  83. package/dist/dashboard/graph/__next._tree.txt +3 -0
  84. package/dist/dashboard/graph/__next.graph.__PAGE__.txt +26 -0
  85. package/dist/dashboard/graph.html +1 -1
  86. package/dist/dashboard/graph.txt +20 -7
  87. package/dist/dashboard/index.html +1 -1
  88. package/dist/dashboard/index.txt +17 -7
  89. package/dist/dashboard/knowledge/__next._full.txt +19 -0
  90. package/dist/dashboard/knowledge/__next._tree.txt +2 -0
  91. package/dist/dashboard/knowledge/__next.knowledge.__PAGE__.txt +25 -0
  92. package/dist/dashboard/knowledge.html +1 -1
  93. package/dist/dashboard/knowledge.txt +19 -7
  94. package/dist/dashboard/memory/__next._full.txt +19 -0
  95. package/dist/dashboard/memory/__next._tree.txt +2 -0
  96. package/dist/dashboard/memory/__next.memory.__PAGE__.txt +25 -0
  97. package/dist/dashboard/memory.html +1 -1
  98. package/dist/dashboard/memory.txt +19 -7
  99. package/dist/dashboard/replay/__next._full.txt +19 -0
  100. package/dist/dashboard/replay/__next._tree.txt +2 -0
  101. package/dist/dashboard/replay/__next.replay.__PAGE__.txt +25 -0
  102. package/dist/dashboard/replay.html +1 -1
  103. package/dist/dashboard/replay.txt +19 -7
  104. package/dist/dashboard/runs/_/__next._full.txt +19 -0
  105. package/dist/dashboard/runs/_/__next._tree.txt +2 -0
  106. package/dist/dashboard/runs/_/__next.runs.$d$id.__PAGE__.txt +26 -0
  107. package/dist/dashboard/runs/_.html +1 -1
  108. package/dist/dashboard/runs/_.txt +19 -8
  109. package/dist/dashboard/runs/__next._full.txt +19 -0
  110. package/dist/dashboard/runs/__next._tree.txt +2 -0
  111. package/dist/dashboard/runs/__next.runs.__PAGE__.txt +25 -0
  112. package/dist/dashboard/runs.html +1 -1
  113. package/dist/dashboard/runs.txt +19 -7
  114. package/dist/dashboard/settings/__next._full.txt +19 -0
  115. package/dist/dashboard/settings/__next._tree.txt +2 -0
  116. package/dist/dashboard/settings/__next.settings.__PAGE__.txt +25 -0
  117. package/dist/dashboard/settings.html +1 -1
  118. package/dist/dashboard/settings.txt +19 -7
  119. package/dist/dashboard/timeline/__next._full.txt +19 -0
  120. package/dist/dashboard/timeline/__next._tree.txt +2 -0
  121. package/dist/dashboard/timeline/__next.timeline.__PAGE__.txt +25 -0
  122. package/dist/dashboard/timeline.html +1 -1
  123. package/dist/dashboard/timeline.txt +19 -7
  124. package/dist/dashboard/tool-metrics/__next._full.txt +19 -0
  125. package/dist/dashboard/tool-metrics/__next._tree.txt +2 -0
  126. package/dist/dashboard/tool-metrics/__next.tool-metrics.__PAGE__.txt +25 -0
  127. package/dist/dashboard/tool-metrics.html +1 -1
  128. package/dist/dashboard/tool-metrics.txt +19 -7
  129. package/dist/dashboard/workflows/__next._full.txt +19 -0
  130. package/dist/dashboard/workflows/__next._tree.txt +2 -0
  131. package/dist/dashboard/workflows/__next.workflows.__PAGE__.txt +25 -0
  132. package/dist/dashboard/workflows.html +1 -1
  133. package/dist/dashboard/workflows.txt +19 -7
  134. package/dist/hooks/enforcer-summary.js +3 -3
  135. package/dist/hooks/hook-client.js +3 -3
  136. package/dist/hooks/hook-daemon.js +27 -25
  137. package/dist/hooks/post-tool-use-failure.js +2 -2
  138. package/dist/hooks/post-tool-use.js +6 -6
  139. package/dist/hooks/pre-compact.js +2 -2
  140. package/dist/hooks/pre-tool-use.js +4 -4
  141. package/dist/hooks/server-bootstrap.js +22 -22
  142. package/dist/hooks/session-end.js +6 -6
  143. package/dist/hooks/stop.js +10 -10
  144. package/dist/hooks/user-prompt-submit.js +11 -9
  145. package/dist/plugin/.claude-plugin/plugin.json +1 -1
  146. package/dist/plugin/dist/command-registry.json +5 -5
  147. package/dist/plugin/dist/hooks/enforcer-summary.js +3 -3
  148. package/dist/plugin/dist/hooks/hook-client.js +3 -3
  149. package/dist/plugin/dist/hooks/hook-daemon.js +27 -25
  150. package/dist/plugin/dist/hooks/post-tool-use-failure.js +2 -2
  151. package/dist/plugin/dist/hooks/post-tool-use.js +6 -6
  152. package/dist/plugin/dist/hooks/pre-compact.js +2 -2
  153. package/dist/plugin/dist/hooks/pre-tool-use.js +4 -4
  154. package/dist/plugin/dist/hooks/server-bootstrap.js +22 -22
  155. package/dist/plugin/dist/hooks/session-end.js +6 -6
  156. package/dist/plugin/dist/hooks/stop.js +10 -10
  157. package/dist/plugin/dist/hooks/user-prompt-submit.js +11 -9
  158. package/dist/plugin/package.json +28 -19
  159. package/dist/scripts/audit-session-data.js +5 -5
  160. package/dist/scripts/semantic-reliability-maintenance.js +3 -3
  161. package/package.json +31 -22
  162. package/plugin-registry.json +57 -57
  163. package/dist/dashboard/_next/static/TCuEOFM92HCewQsicwfte/_buildManifest.js +0 -1
  164. package/dist/dashboard/_next/static/chunks/1dd3208c-f3e84932bdc53383.js +0 -1
  165. package/dist/dashboard/_next/static/chunks/221-893fab1a7d7d9317.js +0 -1
  166. package/dist/dashboard/_next/static/chunks/249-e04c1de6240fd78a.js +0 -1
  167. package/dist/dashboard/_next/static/chunks/343-09a7e255220705c5.js +0 -1
  168. package/dist/dashboard/_next/static/chunks/402-a2e4eb98bb6a524c.js +0 -1
  169. package/dist/dashboard/_next/static/chunks/429-39f42ebb1ac959d6.js +0 -1
  170. package/dist/dashboard/_next/static/chunks/458-75822399a849befa.js +0 -1
  171. package/dist/dashboard/_next/static/chunks/528-7d4fc14903647f1e.js +0 -2
  172. package/dist/dashboard/_next/static/chunks/568-50487ea5e93fe11f.js +0 -1
  173. package/dist/dashboard/_next/static/chunks/697-05cf55b6c667773f.js +0 -1
  174. package/dist/dashboard/_next/static/chunks/6b3bb038-34d5cf36bd0210d6.js +0 -1
  175. package/dist/dashboard/_next/static/chunks/736-db1a009357c222d2.js +0 -1
  176. package/dist/dashboard/_next/static/chunks/806-195d4d5cc6c28f6c.js +0 -1
  177. package/dist/dashboard/_next/static/chunks/app/_not-found/page-5252c260804ee1ce.js +0 -1
  178. package/dist/dashboard/_next/static/chunks/app/accuracy/page-7b4f3c728a0e880f.js +0 -1
  179. package/dist/dashboard/_next/static/chunks/app/benchmark/page-6c6d0acbcde4eb85.js +0 -1
  180. package/dist/dashboard/_next/static/chunks/app/context/page-1874ae1050524cb6.js +0 -1
  181. package/dist/dashboard/_next/static/chunks/app/doctor/page-d542f2ab8d6a1c59.js +0 -1
  182. package/dist/dashboard/_next/static/chunks/app/executions/page-9c836597c951abbb.js +0 -1
  183. package/dist/dashboard/_next/static/chunks/app/graph/page-f0e7e15288791e9c.js +0 -1
  184. package/dist/dashboard/_next/static/chunks/app/knowledge/page-86808abd0d47c026.js +0 -1
  185. package/dist/dashboard/_next/static/chunks/app/layout-4b78776412bd4fee.js +0 -1
  186. package/dist/dashboard/_next/static/chunks/app/memory/page-e05a76b696041097.js +0 -1
  187. package/dist/dashboard/_next/static/chunks/app/page-c3e980fb2621470c.js +0 -1
  188. package/dist/dashboard/_next/static/chunks/app/replay/page-a8a465ed885df0cf.js +0 -1
  189. package/dist/dashboard/_next/static/chunks/app/runs/[id]/page-cc1d5182707fca5b.js +0 -1
  190. package/dist/dashboard/_next/static/chunks/app/runs/page-bbf0a58abd70430c.js +0 -1
  191. package/dist/dashboard/_next/static/chunks/app/settings/page-9602ff45892e7910.js +0 -1
  192. package/dist/dashboard/_next/static/chunks/app/timeline/page-44541ee3e74cee0e.js +0 -1
  193. package/dist/dashboard/_next/static/chunks/app/tool-metrics/page-ece550f2f4328dfe.js +0 -1
  194. package/dist/dashboard/_next/static/chunks/app/workflows/page-228bcb475c39c1ec.js +0 -1
  195. package/dist/dashboard/_next/static/chunks/framework-58c3457e28c4602f.js +0 -1
  196. package/dist/dashboard/_next/static/chunks/main-3175faffdbfc3051.js +0 -1
  197. package/dist/dashboard/_next/static/chunks/main-app-202a5f91ead17fa7.js +0 -1
  198. package/dist/dashboard/_next/static/chunks/pages/_app-58c3f1a8a070bd35.js +0 -1
  199. package/dist/dashboard/_next/static/chunks/pages/_error-312a564ec7e2663f.js +0 -1
  200. package/dist/dashboard/_next/static/chunks/webpack-d6388c5dcd85b0c5.js +0 -1
  201. package/dist/dashboard/_next/static/css/322e14d06135256b.css +0 -31
  202. package/dist/dashboard/_next/static/css/7d4d1db5aa137b5a.css +0 -3
  203. /package/dist/dashboard/_next/static/{TCuEOFM92HCewQsicwfte → 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&&registerRuntimeHttpSuccess(r,e).transitioned&&b("http_circuit_transition",{endpoint:r,path:new URL(e,r).pathname,previous:a.state.status,status:"closed",failures:0}),{delivered:!0,suppressed:!1}}catch(p){m=p instanceof Error?p:new Error(String(p)),c<s&&await yt(Math.min(100*2**c,1e3));}if(!m)return {delivered:false,suppressed:false,fallbackReason:"unknown_http_failure"};if(!d)return pe(e,m),{delivered:false,suppressed:false,fallbackReason:m.message};let l=registerRuntimeHttpFailure(r,e,t.fallbackReason??(i?"local_durable_mirror":"http_delivery_failed"));return l.transitioned&&(pe(e,m),b("http_circuit_transition",{endpoint:r,path:new URL(e,r).pathname,previous:a.state.status,status:"open",failures:l.state.failures,openUntil:l.state.openUntil,fallbackReason:l.state.fallbackReason})),{delivered:false,suppressed:false,fallbackReason:l.state.fallbackReason}}function gt(e,n,t,r){return new Promise((o,i)=>{let s=JSON.stringify(t),d=new URL(n,e),a=false,m=c=>{a||(a=true,c?i(c):o());},l=request({hostname:d.hostname,port:d.port,path:d.pathname+d.search,method:"POST",headers:{"Content-Type":"application/json","X-API-Key":ft,"Content-Length":Buffer.byteLength(s)},timeout:r},c=>{c.on("error",m),c.on("end",()=>{let p=c.statusCode??0;m(p>=200&&p<300?void 0:new Error(`HTTP ${p}`));}),c.resume();});l.on("error",m),l.on("timeout",()=>l.destroy(new Error(`HTTP mirror timed out after ${r}ms`))),l.write(s),l.end();})}function pe(e,n){try{existsSync$1(F)||mkdirSync$1(F,{recursive:!0}),appendFileSync(join(F,"http-errors.log"),`${new Date().toISOString()} | ${e} | ${n.message}
2
- `);}catch{}}function yt(e){return new Promise(n=>setTimeout(n,e))}var be=1e4,wt=3e4,O=500,j=class{constructor(n){this.retryScheduled=false;this.metricAggregationScheduled=false;this.apiUrl=n?.apiUrl,this.cacheDir=n?.cacheDir??join$1(process.env.DEVFLOW_STATE_DIR??join$1(homedir$1(),".devflow","global"),"telemetry-cache"),this.legacyCacheDir=n?.legacyCacheDir??(n?.cacheDir?null:join$1(homedir$1(),".devflow","telemetry-cache")),this.database=n?.database??null,this.ownsDatabase=!n?.database;let t=n?.busyTimeoutMs??Number(process.env.DEVFLOW_TELEMETRY_DB_BUSY_TIMEOUT_MS);this.busyTimeoutMs=Number.isSafeInteger(t)&&t>=0?t:100;}async sendEvent(n){let t={...n,input:this.truncateInput(n.input)};return this.commitOrCache("tool_call",t)?(this.postHttp("/api/telemetry/tool-call",t),n.eventId):null}async sendExecutionStart(n,t,r,o,i=process.env.CLAUDE_PROJECT_DIR??process.cwd(),s=[]){let d={executionId:n,sessionId:t,skillName:r,startedAt:o,projectRoot:i,requiredMcpTools:s};this.commitOrCache("execution_start",d)&&this.postHttp("/api/telemetry/skill-execution/start",d);}async sendExecutionComplete(n,t="completed",r=Date.now(),o){let i={executionId:n,status:t,finishedAt:r,metadata:o},s=this.commitOrCache("execution_complete",i);return s&&this.postHttp("/api/telemetry/skill-execution/complete-reconciled",i),s}async sendSessionStart(n,t,r){let o={id:n,projectRoot:t,startedAt:r,label:t.split("/").pop()??"unknown"},i=this.commitOrCache("session_start",o);return i&&this.postHttp("/api/telemetry/sessions",o),i}async completeEvent(n){let t=this.commitOrCache("complete_event",n);return t&&(this.postHttp("/api/telemetry/tool-call/output",n),this.scheduleMetricAggregation()),t}async endSession(n,t=Date.now()){let r={sessionId:n,finishedAt:t},o=this.commitOrCache("session_end",r);return o&&(this.getDatabase().aggregatePendingToolMetrics(),this.postHttp(`/api/telemetry/sessions/${encodeURIComponent(n)}/close`,{finishedAt:t})),o}async flushCache(){try{let r=this.getDatabase(),o=r.listTelemetryFailures({unresolvedOnly:!0,limit:O}).reverse();for(let i of o)try{this.applyOperation(i.operation,i.payload),r.resolveTelemetryFailure(i.id);}catch{}r.trimTelemetryFailures(O);}catch{}let t=[...new Set([this.cacheDir,this.legacyCacheDir].filter(r=>!!r))].filter(r=>existsSync(r)).flatMap(r=>readdirSync(r).filter(o=>o.endsWith(".json")).map(o=>{let i=join$1(r,o);try{return {cacheFile:i,envelope:kt(JSON.parse(readFileSync$1(i,"utf8")),o)}}catch{return null}})).filter(r=>r!==null).sort((r,o)=>r.envelope.timestamp-o.envelope.timestamp||we(r.envelope.operation)-we(o.envelope.operation));for(let{cacheFile:r,envelope:o}of t)try{let i=this.getDatabase();i.insertTelemetryFailure({id:o.id,operation:o.operation,payload:o.payload,error:o.failure,createdAt:o.timestamp}),this.applyOperation(o.operation,o.payload),i.resolveTelemetryFailure(o.id),unlinkSync(r);}catch{}this.database?.aggregatePendingToolMetrics();}aggregateMetrics(){return this.getDatabase().aggregatePendingToolMetrics()}async flushAndAggregate(){await this.flushCache(),this.aggregateMetrics();}close(){this.ownsDatabase&&this.database?.close(),this.database=null;}getDatabase(){return this.database??=openGlobalDevFlowDatabase(void 0,{busyTimeoutMs:this.busyTimeoutMs}),this.database}commitOrCache(n,t){try{return this.applyOperation(n,t),!0}catch(r){return this.cacheOperation(n,t,r),false}}applyOperation(n,t){let r=this.getDatabase();switch(n){case "tool_call":this.ensureParentSession(r,t),r.insertToolCallEvent(t);return;case "execution_start":this.ensureParentSession(r,t),r.insertSkillExecution({executionId:t.executionId,sessionId:t.sessionId,skillName:t.skillName,startedAt:t.startedAt,status:"running",requiredMcpTools:t.requiredMcpTools});return;case "execution_complete":r.reconcileSkillExecution(t.executionId,t.status,t.finishedAt,t.metadata);return;case "session_start":r.ensureSession(t),r.insertRun({id:ke(t.id),source:"hook",tool:"session",input:{projectRoot:t.projectRoot},status:"active",startedAt:t.startedAt,tokenUsed:0,metadata:{sessionId:t.id,projectRoot:t.projectRoot}});return;case "complete_event":if(!r.updateToolCallEvent(t.eventId,{output:t.output===void 0?void 0:JSON.stringify(t.output),error:t.error,failureCategory:t.failureCategory,duration:t.duration}))throw new Error(`Tool call event ${t.eventId} is not available for completion`);return;case "session_end":r.closeSession(t.sessionId,t.finishedAt),r.updateRun(ke(t.sessionId),{status:"completed",finishedAt:t.finishedAt});return}}ensureParentSession(n,t){let r=typeof t.sessionId=="string"?t.sessionId.trim():"";if(!r)throw new Error("Canonical session ID is required for telemetry");let o=typeof t.projectRoot=="string"&&t.projectRoot.trim()?t.projectRoot:typeof t.input?.projectRoot=="string"&&t.input.projectRoot.trim()?t.input.projectRoot:process.env.CLAUDE_PROJECT_DIR??"unknown";n.ensureSession({id:r,projectRoot:o,label:o==="unknown"?void 0:o.split("/").pop(),startedAt:Number(t.startedAt??t.timestamp??Date.now())});}cacheOperation(n,t,r){let o=Date.now(),i={id:`failure:${o}:${Math.random().toString(36).slice(2,11)}`,operation:n,payload:t,failure:r instanceof Error?r.message:String(r),timestamp:o};try{let s=this.getDatabase();s.insertTelemetryFailure({id:i.id,operation:n,payload:t,error:i.failure,createdAt:o}),s.trimTelemetryFailures(O),this.scheduleRetry();return}catch{}try{existsSync(this.cacheDir)||mkdirSync(this.cacheDir,{recursive:!0});let s=join$1(this.cacheDir,`${o}_${Math.random().toString(36).slice(2,11)}.json`);writeFileSync(s,JSON.stringify(i,null,2),{mode:384}),this.trimCompatibilityCache(),this.scheduleRetry();}catch{}}trimCompatibilityCache(){try{let n=readdirSync(this.cacheDir).filter(t=>t.endsWith(".json")).sort();for(let t of n.slice(0,Math.max(0,n.length-O)))unlinkSync(join$1(this.cacheDir,t));}catch{}}scheduleRetry(){this.retryScheduled||(this.retryScheduled=true,setTimeout(()=>{this.retryScheduled=false,this.flushCache();},wt).unref());}scheduleMetricAggregation(){if(this.metricAggregationScheduled||process.env.DEVFLOW_HOOK_DEGRADED==="1")return;this.metricAggregationScheduled=true,setTimeout(()=>{this.metricAggregationScheduled=false;try{this.getDatabase().aggregatePendingToolMetrics(50)===50&&this.scheduleMetricAggregation();}catch{}},25).unref();}postHttp(n,t){ge(n,t,{endpoint:this.apiUrl,fallbackReason:"telemetry_already_committed_locally"});}truncateInput(n){let t=JSON.stringify(n);return t===void 0||t.length<=be?n:{_truncated:true,_original_size:t.length,_preview:`${t.substring(0,be)}...`}}};function we(e){return ["session_start","execution_start","tool_call","complete_event","execution_complete","session_end"].indexOf(e)}function ke(e){return `hook-run:${e}`}function kt(e,n){if(!e||typeof e!="object")throw new Error("Invalid telemetry cache envelope");let t=e;if(typeof t.operation=="string"&&t.payload!==void 0)return t;let r=t.type==="tool_call"?"tool_call":t.type==="execution_start"?"execution_start":null;if(!r)throw new Error("Unknown legacy telemetry cache operation");let o=t.payload??{},i=Number(o.timestamp??o.startedAt??Date.now());return {id:`legacy-cache:${n}`,operation:r,payload:o,failure:"Replayed legacy HTTP-first telemetry cache entry",timestamp:i}}var St=/^\/(?:devflow:)?[\w-]+\b\s*/iu,_t=/\b(?:(?:do\s+not|don't|dont|never|not)(?:\s+need\s+to)?|no\s+need\s+to)\s+(?:please\s+)?(?:remember|memorize)\b|(?:不要|别|不用|无需|不必|不需要)(?:再)?(?:记住|记|记忆)/iu,Rt=/(?:^|[.!?]\s*)(?:(?:please|kindly)\s+)?(?:remember|memorize|save\s+this|store\s+this|note\s+that)(?:\s+(?:that|to))?[\s:,-]*(.+)$/iu,Et=/(?:^|[。!?;,,]\s*)(?:(?:请|麻烦|务必|一定要|帮我|帮忙|需要)\s*)?(?:记住|记一下|记下来|记|记录一下|记录下来|保存一下|保存下来)(?:这(?:件事|一点|个信息|些内容))?[\s::,,]*(.+)$/iu;function E(e){let n=e.trim().replace(St,"").trim();return !n||_t.test(n)?null:(Et.exec(n)??Rt.exec(n))?.[1]?.trim().replace(/^[::,,\s]+/u,"")||null}var P=1,Ot="memory-snapshot-v1.json",jt=512*1024,Ee=256*1024,Ae=2e3,Pt=500,$t=10,Ht=240,Nt=300*1e3,Ft=720*60*60*1e3,Lt=2147483647;function qt(e){return e.currentUid===void 0?{ownerSafe:true,modeSafe:true}:{ownerSafe:e.ownerUid===e.currentUid,modeSafe:(e.mode&18)===0}}function S(e){return resolve(e)}function A(e){return createHash$1("sha256").update(S(e)).digest("hex").slice(0,16)}function Ut(e,n={}){let t=A(e),r=n.stateRoot?join(n.stateRoot,t):getProjectStateDir(S(e));return join(r,Ot)}function Jt(e,n){let r=(e instanceof Error?e.message:"").replace(/[\r\n\t]+/gu," ").trim().slice(0,160);return r?`${n}:${r}`:n}function q(e,n){return Array.isArray(e)&&e.length<=n&&e.every(t=>typeof t=="string"&&t.length>0&&t.length<=512)}function zt(e){if(!e||typeof e!="object"||Array.isArray(e))return false;let n=e;return typeof n.id=="string"&&n.id.length>0&&n.id.length<=512&&typeof n.kind=="string"&&n.kind.length>0&&n.kind.length<=128&&(n.family===void 0||typeof n.family=="string"&&n.family.length>0&&n.family.length<=256)&&(n.entity===void 0||typeof n.entity=="string"&&n.entity.length>0&&n.entity.length<=256)&&q(n.memoryIds,100)&&(n.status==="withheld"||n.status==="resolved")&&(n.summary===void 0||typeof n.summary=="string"&&n.summary.length<=2e3)}function Wt(e){if(!e||typeof e!="object"||Array.isArray(e))return false;let n=e;return typeof n.reason=="string"&&n.reason.length>0&&n.reason.length<=512&&(n.stale===void 0||typeof n.stale=="boolean")}function xe(e,n,t){if(!e||typeof e!="object"||Array.isArray(e))return null;let r=e,o=S(n),i=A(o),s=r.generation===void 0?0:r.generation;return r.version!==P||r.projectRoot!==o||r.projectHash!==i||typeof r.markdown!="string"||Buffer.byteLength(r.markdown,"utf8")>Ee||!q(r.memoryIds,Ae)||!Array.isArray(r.conflicts)||r.conflicts.length>Pt||!r.conflicts.every(zt)||typeof r.generatedAt!="number"||!Number.isFinite(r.generatedAt)||r.generatedAt<0||r.generatedAt>t+Nt||!Number.isInteger(s)||s<0||s>Lt||!["ready","pending","degraded","disabled"].includes(String(r.status))||r.degradation!==void 0&&!Wt(r.degradation)?null:{...r,generation:s}}function Gt(e,n,t,r,o=0){let i=S(e);return {version:P,projectRoot:i,projectHash:A(i),markdown:"",memoryIds:[],conflicts:[],generatedAt:r,generation:o,status:n,degradation:{reason:t}}}function Kt(e,n={}){let t=n.now??Date.now(),r=Ut(e,n),o;try{o=openSync(r,constants.O_RDONLY|constants.O_NOFOLLOW);let i=fstatSync(o);if(!i.isFile()||i.size<=0||i.size>jt)throw new Error("cache_size_invalid");let s=qt({...typeof process.getuid=="function"?{currentUid:process.getuid()}:{},ownerUid:i.uid,mode:i.mode});if(!s.ownerSafe)throw new Error("cache_owner_invalid");if(!s.modeSafe)throw new Error("cache_permissions_unsafe");let d=JSON.parse(readFileSync(o,"utf8")),a=xe(d,e,t);if(!a)throw new Error("cache_schema_invalid");return a.status==="ready"&&t-a.generatedAt>Ft?{snapshot:{...a,status:"degraded",degradation:{reason:"cache_stale",stale:!0}},source:"cache",valid:!0,stale:!0}:{snapshot:a,source:"cache",valid:!0,stale:!1}}catch(i){let d=i.code==="ENOENT";return {snapshot:Gt(e,d?"pending":"degraded",d?"cache_missing":Jt(i,"cache_invalid"),t),source:"none",valid:false,stale:false}}finally{if(o!==void 0)try{closeSync(o);}catch{}}}function Bt(e){if(!e)return true;try{return JSON.parse(readFileSync(e,"utf8")).sessionStart?.injectMemories??!0}catch{return true}}function Vt(e,n,t){if(!n.trim())return null;try{let r=JSON.parse(n);if(r.status!=="ok"&&r.status!=="degraded")return null;if(r.enabled===!1){let i=S(e);return {version:P,projectRoot:i,projectHash:A(i),markdown:"",memoryIds:[],conflicts:[],generatedAt:t,generation:0,status:"disabled"}}let o=xe(r.snapshot,e,t);if(o)return o;if(r.status==="ok"&&typeof r.markdown=="string"&&r.markdown.length>0&&Buffer.byteLength(r.markdown,"utf8")<=Ee){let i=S(e);return {version:P,projectRoot:i,projectHash:A(i),markdown:r.markdown,memoryIds:q(r.memoryIds,Ae)?r.memoryIds:[],conflicts:[],generatedAt:t,generation:0,status:"ready"}}}catch{}return null}function L(e,n){return [...(e??n).replace(/[\r\n\t|]+/gu," ").trim()||n].slice(0,Ht).join("")}function Qt(e){if(e.length===0)return "";let n=e.slice(0,$t),t=n.map(r=>{let o=L(r.family,"unknown"),i=L(r.entity,"unknown"),s=L(r.summary,"Explicit choice required.");return `- family=${o}; entity=${i}; status=${r.status}; summary=${s}`});return e.length>n.length&&t.push(`- ${e.length-n.length} additional conflict(s) omitted from SessionStart output.`),`## Withheld preference conflicts (${e.length})
1
+ import {openGlobalDevFlowDatabase}from'@devflow-tools/database';import {getLocalApiKey,getDevFlowStateRoot,resolveProjectCapabilityProfile,resolveCapabilityRollout,claudeCodeRuntimeAdapter,semanticTextHash,stableRuntimeHash,resolveRuntimeActivationSnapshot,getProjectStateDir,resolveRuntimeEndpoint,acquireRuntimeHttpCircuit,registerRuntimeHttpSuccess,registerRuntimeHttpFailure}from'@devflow-tools/sdk';import {existsSync,readFileSync as readFileSync$1,rmSync,mkdirSync,writeFileSync,linkSync,readdirSync,renameSync,unlinkSync}from'fs';import {join as join$1,dirname}from'path';import {randomUUID,createHash}from'crypto';import {fileURLToPath}from'url';import {emitSemanticControlLog,SemanticRuntimeEventProjector}from'@devflow-tools/telemetry';import {readFileSync,openSync,constants,fstatSync,closeSync,mkdirSync as mkdirSync$1,writeFileSync as writeFileSync$1,renameSync as renameSync$1,realpathSync,existsSync as existsSync$1,appendFileSync}from'node:fs';import {join,resolve,relative}from'node:path';import {request}from'node:http';import {createHash as createHash$1,randomUUID as randomUUID$1}from'node:crypto';import {TaskKernel,TaskEventStore}from'@devflow-tools/task-runtime';function h(n,e,t){try{let r=openGlobalDevFlowDatabase();try{r.insertEvent({kind:n,timestamp:Date.now(),duration:t,success:e.success!==!1,metadata:e});}finally{r.close();}}catch{}}var K="WARNING: DevFlow is in degraded mode (daemon unreachable): 4-Gate enforcement and memory prefetch cache are unavailable. Run `devflow doctor` for details.";function W(){return process.env.DEVFLOW_HOOK_DEGRADED==="1"}function We(n){return n??process.env.CLAUDE_PROJECT_DIR??process.cwd()}function k(n){return getProjectStateDir(We(n))}function X(n){return Buffer.from(n,"utf8").toString("base64url")}function Xe(n,e,t){let r=e?.trim();if(r){let o=/^[a-zA-Z0-9:._-]{1,192}$/.test(r)?r:`tool-${createHash("sha256").update(r.slice(0,1024)).digest("hex").slice(0,32)}`;return `${n}:${o}`}return `${n}:legacy-${t}-${randomUUID().slice(0,8)}`}function re(n){return `${n}:legacy-journal`}var E=class{constructor(e){this.projectRoot=e;this.sessions=new Map;this.sessionsDir=join$1(k(e),"hook-sessions");}registerSession(e){let t=e.trim();if(!t)throw new Error("session_id_required");let r=this.get(t);if(r)return r.lastActivityAt=Date.now(),this.persist(r),r;let o=Date.now(),i={sessionId:t,projectRoot:this.projectRoot,requiredMcpTools:[],evidenceObligations:[],evidenceDegradations:[],evidenceOutcomes:[],startedAt:o,lastActivityAt:o};return this.sessions.set(t,i),this.persist(i),i}startExecution(e,t,r){let o=this.registerSession(e);return (!o.executionId||o.skillName!==t)&&(o.executionId=`exec_${Date.now()}_${randomUUID().slice(0,8)}`),o.skillName=t,o.requiredMcpTools=[...new Set(r)],o.lastActivityAt=Date.now(),this.persist(o),o}bindTaskIdentity(e,t){let r=this.registerSession(e);return r.activeTurnId=t.turnId,r.activeRequestId=t.requestId,r.intentArtifactHash=t.intentArtifactHash,r.lastActivityAt=Date.now(),this.persist(r),r}get(e){let t=e.trim();if(!t)return null;let r=this.sessions.get(t);if(r)return this.replayEvidenceJournal(r),r;let o=this.snapshotPath(t);if(!existsSync(o))return null;try{let i=JSON.parse(readFileSync$1(o,"utf8"));return i.sessionId!==t||i.projectRoot!==this.projectRoot?null:(i.requiredMcpTools=Array.isArray(i.requiredMcpTools)?i.requiredMcpTools:[],i.evidenceObligations=Z(i.evidenceObligations),i.evidenceDegradations=Q(i.evidenceDegradations),i.evidenceOutcomes=ee(i.evidenceOutcomes),this.replayEvidenceJournal(i),this.sessions.set(t,i),i)}catch{return null}}completeExecution(e){let t=this.get(e);if(!t)return null;let r=structuredClone(t);return delete t.executionId,delete t.skillName,t.requiredMcpTools=[],t.lastActivityAt=Date.now(),this.persist(t),r}addEvidenceObligation(e,t,r=Date.now(),o){let i=this.registerSession(e),a=(o?void 0:i.evidenceObligations.find(m=>m.contractId===t.id))?.obligationId??Xe(t.id,o,r);this.appendEvidenceEvent(e,{kind:"add",obligationId:a,contractId:t.id,at:r,contract:t},`add\0${a}`),this.replayEvidenceJournal(i);let d=i.evidenceObligations.find(m=>m.obligationId===a);return d?(i.lastActivityAt=Date.now(),this.persist(i),structuredClone(d)):null}listEvidenceObligations(e){return (this.get(e)?.evidenceObligations??[]).map(t=>structuredClone(t))}markEvidenceCorrection(e,t,r,o,i=Date.now()){let s=this.get(e),a=s?.evidenceObligations.find(l=>l.obligationId===t);if(!s||!a)return null;let d=/^[a-f0-9]{64}$/.test(o)?o:"";if(!d)return null;this.appendEvidenceEvent(e,{kind:"correction",obligationId:t,contractId:a.contractId,at:i,fingerprint:d,violations:r.slice(0,16).map(l=>l.slice(0,240))},`correction\0${t}\0${d}`),this.replayEvidenceJournal(s),s.lastActivityAt=i,this.persist(s);let m=s.evidenceObligations.find(l=>l.obligationId===t);return m?structuredClone(m):null}resolveEvidenceObligation(e,t){let r=this.get(e);if(!r)return false;let o=r.evidenceObligations.find(s=>s.obligationId===t);if(!o)return false;let i=Date.now();return this.appendEvidenceEvent(e,{kind:"resolve",obligationId:t,contractId:o.contractId,at:i},`resolve\0${t}`),this.replayEvidenceJournal(r),r.lastActivityAt=i,this.persist(r),true}resolveDegradedEvidence(e,t){let r=this.get(e),o=r?.evidenceDegradations.find(s=>s.obligationId===t);if(!r||!o)return false;let i=Date.now();return this.appendEvidenceEvent(e,{kind:"resolve",obligationId:t,contractId:o.contractId,at:i},`resolve-degraded\0${t}\0${i}`),this.replayEvidenceJournal(r),r.lastActivityAt=i,this.persist(r),true}degradeEvidenceObligation(e,t,r,o=Date.now()){let i=this.get(e),s=i?.evidenceObligations.find(d=>d.obligationId===t);if(!i||!s)return false;let a=r.slice(0,240);return this.appendEvidenceEvent(e,{kind:"degrade",obligationId:t,contractId:s.contractId,at:o,reason:a},`degrade\0${t}\0${a}`),this.replayEvidenceJournal(i),i.lastActivityAt=o,this.persist(i),true}removeSession(e){let t=e.trim();t&&(this.sessions.delete(t),rmSync(this.snapshotPath(t),{force:true}),rmSync(this.evidenceJournalDir(t),{recursive:true,force:true}));}list(){return [...this.sessions.values()]}snapshotPath(e){return join$1(this.sessionsDir,`${X(e)}.json`)}evidenceJournalDir(e){return join$1(this.sessionsDir,"evidence-journal",X(e))}appendEvidenceEvent(e,t,r){let o=this.evidenceJournalDir(e);mkdirSync(o,{recursive:true,mode:448});let i=createHash("sha256").update(r).digest("hex"),s=join$1(o,`${t.kind}-${i}.json`);if(existsSync(s))return;let a=join$1(o,`.${process.pid}.${randomUUID()}.tmp`);writeFileSync(a,JSON.stringify(t),{mode:384});try{linkSync(a,s);}catch(d){if(d.code!=="EEXIST")throw d}finally{rmSync(a,{force:true});}}replayEvidenceJournal(e){e.evidenceObligations=Z(e.evidenceObligations),e.evidenceDegradations=Q(e.evidenceDegradations),e.evidenceOutcomes=ee(e.evidenceOutcomes);let t=this.evidenceJournalDir(e.sessionId);if(!existsSync(t))return;let r;try{r=readdirSync(t).filter(i=>/^(?:add|correction|resolve|degrade)-[a-f0-9]{64}\.json$/.test(i)).slice(0,4096);}catch{return}let o=r.flatMap(i=>{try{let s=readFileSync$1(join$1(t,i),"utf8");if(Buffer.byteLength(s,"utf8")>64*1024)return [];let a=Ze(JSON.parse(s));return a?[a]:[]}catch{return []}}).sort((i,s)=>i.at-s.at||te(i.kind)-te(s.kind));for(let i of o)this.applyEvidenceEvent(e,i);e.evidenceObligations=e.evidenceObligations.slice(-8),e.evidenceDegradations=e.evidenceDegradations.slice(-20),e.evidenceOutcomes=e.evidenceOutcomes.slice(-20);}applyEvidenceEvent(e,t){let r=e.evidenceOutcomes.find(s=>s.obligationId===t.obligationId);if(t.kind==="add"){if(r)return;let s=e.evidenceObligations.find(a=>a.obligationId===t.obligationId);s?(s.contract=t.contract,s.promptedAt=Math.min(s.promptedAt,t.at)):e.evidenceObligations.push({obligationId:t.obligationId,contractId:t.contractId,contract:t.contract,promptedAt:t.at,attempt:0,correctionRequested:false,violations:[]});return}let o=e.evidenceObligations.find(s=>s.obligationId===t.obligationId);if(t.kind==="correction"){if(!o||r||o.correctionFingerprint===t.fingerprint)return;o.attempt+=1,o.correctionRequested=true,o.correctionRequestedAt=t.at,o.correctionFingerprint=t.fingerprint,o.violations=t.violations;return}let i=o?.attempt??r?.attempt??0;if(t.kind==="resolve"&&r?.status==="degraded")e.evidenceOutcomes=e.evidenceOutcomes.filter(s=>s.obligationId!==t.obligationId),e.evidenceDegradations=e.evidenceDegradations.filter(s=>s.obligationId!==t.obligationId);else if(r)return;t.kind==="degrade"?(e.evidenceObligations=e.evidenceObligations.filter(s=>s.obligationId!==t.obligationId),e.evidenceDegradations.push({obligationId:t.obligationId,contractId:t.contractId,reason:t.reason,degradedAt:t.at,attempt:i,contract:o?.contract})):e.evidenceObligations=e.evidenceObligations.filter(s=>s.obligationId!==t.obligationId),e.evidenceOutcomes.push({obligationId:t.obligationId,contractId:t.contractId,status:t.kind==="resolve"?"resolved":"degraded",completedAt:t.at,attempt:i,...t.kind==="degrade"?{reason:t.reason}:{}});}persist(e){mkdirSync(this.sessionsDir,{recursive:true,mode:448});let t=this.snapshotPath(e.sessionId),r=`${t}.${process.pid}.${randomUUID()}.tmp`;writeFileSync(r,JSON.stringify(e),{mode:384}),renameSync(r,t);}};function Z(n){return Array.isArray(n)?n.flatMap(e=>{if(!e||typeof e!="object")return [];let t=e;if(typeof t.contractId!="string"||t.contractId.length===0||t.contractId.length>128||typeof t.promptedAt!="number"||typeof t.attempt!="number"||typeof t.correctionRequested!="boolean"||!Array.isArray(t.violations)||!oe(t.contract))return [];let r=typeof t.obligationId=="string"&&t.obligationId.length>0&&t.obligationId.length<=384?t.obligationId:re(t.contractId),o=typeof t.correctionTranscriptHash=="string"?t.correctionTranscriptHash:void 0,i=t.correctionFingerprint??o;return i!==void 0&&!/^[a-f0-9]{64}$/.test(i)?[]:[{...t,obligationId:r,correctionFingerprint:i}]}).slice(-8):[]}function Q(n){return Array.isArray(n)?n.filter(e=>{if(!e||typeof e!="object")return false;let t=e;return typeof t.obligationId=="string"&&typeof t.contractId=="string"&&typeof t.reason=="string"&&typeof t.degradedAt=="number"&&typeof t.attempt=="number"}).slice(-20):[]}function ee(n){return Array.isArray(n)?n.filter(e=>{if(!e||typeof e!="object")return false;let t=e;return typeof t.obligationId=="string"&&typeof t.contractId=="string"&&(t.status==="resolved"||t.status==="degraded")&&typeof t.completedAt=="number"&&typeof t.attempt=="number"&&(t.reason===void 0||typeof t.reason=="string")}).slice(-20):[]}function Ze(n){if(!n||typeof n!="object")return null;let e=n,t=e.kind;if(t!=="add"&&t!=="correction"&&t!=="resolve"&&t!=="degrade"||typeof e.contractId!="string"||e.contractId.length>128||typeof e.at!="number")return null;let o={obligationId:typeof e.obligationId=="string"&&e.obligationId.length>0&&e.obligationId.length<=384?e.obligationId:re(e.contractId),contractId:e.contractId,at:e.at};if(t==="add")return oe(e.contract)?{kind:t,...o,contract:e.contract}:null;if(t==="correction"){let i=typeof e.fingerprint=="string"?e.fingerprint:e.transcriptHash;return typeof i=="string"&&/^[a-f0-9]{64}$/.test(i)&&Array.isArray(e.violations)&&e.violations.every(s=>typeof s=="string"&&s.length<=240)?{kind:t,...o,fingerprint:i,violations:e.violations}:null}return t==="resolve"?{kind:t,...o}:typeof e.reason=="string"&&e.reason.length<=240?{kind:t,...o,reason:e.reason}:null}function te(n){return n==="add"?0:n==="correction"?1:2}function oe(n){if(!n||typeof n!="object")return false;let e=n,t=e.requiredSections,r=e.prohibitedClaims;return e.version==="1.0"&&typeof e.id=="string"&&/^[a-zA-Z0-9][a-zA-Z0-9:._-]{0,127}$/.test(e.id)&&typeof e.runtimeProfilingOccurred=="boolean"&&typeof e.samplingEvidenceOccurred=="boolean"&&Array.isArray(t)&&t.length===3&&t[0]==="\u5DE5\u5177\u53D1\u73B0"&&t[1]==="\u6A21\u578B\u5047\u8BBE"&&t[2]==="\u9700\u8981\u8FD0\u884C\u65F6\u9A8C\u8BC1"&&Array.isArray(r)&&r.length<=16&&r.every(o=>typeof o=="string"&&o.length<=128)&&typeof e.canonicalReport=="string"&&Buffer.byteLength(e.canonicalReport,"utf8")<=48*1024&&!!e.correctionPolicy&&e.correctionPolicy.maxAttempts===1&&e.correctionPolicy.repeatedViolation==="fail_open"}function Qe(n){let e=n.trim().replace(/^\//,"");if(!e.startsWith("devflow:"))return null;let t=e.slice(8).replace(/^devflow-/,"");return /^[a-z0-9][a-z0-9-]*$/i.test(t)?`devflow:${t.toLowerCase()}`:null}function ie(n){let e=n.trimStart().match(/^\/(devflow:[a-z0-9][a-z0-9-]*)\b/i);if(!e)return null;let t=Qe(e[1]);return t?{rawName:e[1],skillName:t}:null}var p=emitSemanticControlLog;var it=2,st=1;function at(){if(process.env.CLAUDE_PLUGIN_ROOT)return process.env.CLAUDE_PLUGIN_ROOT;try{return join$1(dirname(fileURLToPath(import.meta.url)),"..","..")}catch{return process.cwd()}}function se(n=at()){let e=[join$1(n,"dist","command-registry.json"),join$1(n,"command-registry.json")];for(let t of e)try{if(!existsSync(t))continue;let r=JSON.parse(readFileSync$1(t,"utf8"));if(r.version!==it&&r.version!==st||!ct(r.commands)){p({event:"hook.runtime.degraded",identity:{projectRoot:process.env.CLAUDE_PROJECT_DIR||process.cwd()},level:"warn",timestamp:Date.now(),data:{stage:"command_registry",reason:"contract_mismatch",registryPath:t}});continue}return r.commands}catch(r){p({event:"hook.runtime.degraded",identity:{projectRoot:process.env.CLAUDE_PROJECT_DIR||process.cwd()},level:"warn",timestamp:Date.now(),data:{stage:"command_registry",reason:r.message,fallback:"next_registry_candidate"}});}return null}function ct(n){return !n||typeof n!="object"||Array.isArray(n)?false:Object.values(n).every(e=>{if(!e||typeof e!="object"||Array.isArray(e))return false;let t=e;return x(t.mcpTools)&&x(t.blockedNative)&&(t.source===void 0||t.source==="core"||t.source==="plugin")&&(t.requiresContext===void 0||typeof t.requiresContext=="boolean")&&(t.runtimePackages===void 0||x(t.runtimePackages))&&(t.hostTools===void 0||dt(t.hostTools))&&(t.evidenceMode===void 0||["static","runtime","mixed"].includes(t.evidenceMode))})}function dt(n){return !!n&&typeof n=="object"&&!Array.isArray(n)&&Object.entries(n).every(([e,t])=>e.length>0&&x(t))}function x(n){return Array.isArray(n)&&n.every(e=>typeof e=="string"&&e.length>0)}var ft={react:["react","react-dom"],nextjs:["next","react"],vue:["vue"],nest:["@nestjs/core"],tailwind:["tailwindcss"],taro:["@tarojs/taro"],electron:["electron"],graphql:["graphql"]};function gt(n,e){let t=join(n,"package.json"),r=ue(t),o=kt(r,e),i=join(n,"package-lock.json"),s=ue(i),a=wt(s,e);return a?{packageName:e,...o?{declaredRange:o}:{},resolvedVersion:a,evidencePath:relative(n,i)||"package-lock.json",confidence:"high"}:o?{packageName:e,declaredRange:o,evidencePath:relative(n,t)||"package.json",confidence:"medium"}:{packageName:e,confidence:"unknown"}}function le(n,e,t={}){let r=n.replace(/^devflow:/,"").split(":").pop()??n,o=(ft[r]??[]).map(a=>gt(e,a)),i=t.rolloutMode??resolveCapabilityRollout(e).config.learningOverlays;if(i==="off")return {skillName:n,projectRoot:e,packages:o,learned:[],shadowEligible:[],rolloutMode:i};let s=t.database??openGlobalDevFlowDatabase(void 0,{busyTimeoutMs:50});try{let d=s.listLearningCandidates({projectRoot:e,states:["shadow","evaluated","active"],limit:100}).filter(c=>c.projectRoot===e||c.scope==="global").filter(c=>!c.expiresAt||c.expiresAt>(t.now??Date.now())).filter(c=>vt(c,n,t)).sort((c,f)=>f.confidence-c.confidence||f.updatedAt-c.updatedAt),m=ht(d.map(c=>yt(c,c.state==="active"?"active":"shadow")),t),l=i==="on"?m.filter(c=>c.state==="active"):[],u=m.filter(c=>c.state==="shadow"||i==="shadow");try{s.insertEvent({kind:"learning_overlay_match",timestamp:Date.now(),success:!0,metadata:{projectRoot:e,skillName:n,rolloutMode:i,eligible:m.map(c=>`${c.candidateId}@${c.version}`),injected:l.map(c=>`${c.candidateId}@${c.version}`)}});}catch{}return {skillName:n,projectRoot:e,packages:o,learned:l,shadowEligible:u,rolloutMode:i}}finally{t.database||s.close();}}function me(n){let e=[],t=n.packages.map(r=>{let o=r.resolvedVersion??r.declaredRange??"unknown";return `${r.packageName}=${o} (confidence=${r.confidence}${r.evidencePath?`, source=${r.evidencePath}`:""})`}).join("; ");return t&&e.push(`DevFlow runtime project-version evidence for ${n.skillName}: ${t}. Treat target-project evidence as authoritative; do not apply a hardcoded framework version.`),n.learned.length>0&&e.push([`DevFlow governed project instructions for ${n.skillName}:`,...n.learned.map(r=>`- ${r.instruction}`),"Apply only to this request and keep canonical Skill/MCP requirements unchanged."].join(`
2
+ `)),e.join(`
3
+ `)}function yt(n,e){return {candidateId:n.id,version:n.overlayVersion,state:e,instruction:n.instruction,trigger:n.trigger,confidence:n.confidence,evidenceReceipt:n.graderReceipt??`candidate:${n.id}:v${n.overlayVersion}`,expiresAt:n.expiresAt}}function ht(n,e){let t=Math.max(0,Math.min(e.maxLearnedEntries??3,3)),r=Math.max(0,Math.min(e.learnedCharacterBudget??1600,4e3)),o=[],i=0;for(let s of n){if(o.length>=t)break;let a=s.instruction.length+4;i+a>r||(o.push(s),i+=a);}return o}function vt(n,e,t){let r=n.trigger,o=e.replace(/^devflow:/,"").split(":").pop()??e,i=A(r.skills);if(i.length>0&&!i.some(c=>c===e||c===o||c.endsWith(`:${o}`)))return false;let s=(t.prompt??"").normalize("NFKC").toLocaleLowerCase("en-US"),a=(t.command??"").normalize("NFKC").toLocaleLowerCase("en-US"),d=[...t.files??[],...It(t.prompt??"")].map(c=>c.replaceAll("\\","/").toLocaleLowerCase("en-US")),m=A(r.commands).map(de);if(m.length>0&&!m.some(c=>a.includes(c)||s.includes(c)))return false;let l=A(r.entities).map(de);if(l.length>0&&!l.some(c=>s.includes(c)||a.includes(c)))return false;let u=A(r.files).map(c=>c.replaceAll("\\","/").toLocaleLowerCase("en-US"));return !(u.length>0&&!u.some(c=>d.some(f=>bt(f,c))))}function It(n){return n.match(/(?:^|\s)((?:src|app|apps|packages|plugins|lib|test|tests)\/[A-Za-z0-9_./@-]+)/gu)?.map(e=>e.trim())??[]}function bt(n,e){if(!e.includes("*"))return n===e||n.includes(e);let t=e.replace(/[.+?^${}()|[\]\\]/gu,"\\$&").replaceAll("*",".*");return new RegExp(`^${t}$`,"u").test(n)}function A(n){return Array.isArray(n)?n.filter(e=>typeof e=="string"&&e.trim().length>0):[]}function de(n){return n.normalize("NFKC").trim().toLocaleLowerCase("en-US")}function ue(n){if(!existsSync$1(n))return null;try{let e=JSON.parse(readFileSync(n,"utf8"));return e&&typeof e=="object"&&!Array.isArray(e)?e:null}catch{return null}}function kt(n,e){for(let t of ["dependencies","devDependencies","peerDependencies","optionalDependencies"]){let r=n?.[t];if(!r||typeof r!="object"||Array.isArray(r))continue;let o=r[e];if(typeof o=="string"&&o.trim())return o.trim()}}function wt(n,e){let t=n?.packages;if(t&&typeof t=="object"&&!Array.isArray(t)){let o=t[`node_modules/${e}`];if(o&&typeof o=="object"&&!Array.isArray(o)){let i=o.version;if(typeof i=="string"&&i.trim())return i.trim()}}let r=n?.dependencies;if(r&&typeof r=="object"&&!Array.isArray(r)){let o=r[e];if(o&&typeof o=="object"&&!Array.isArray(o)){let i=o.version;if(typeof i=="string"&&i.trim())return i.trim()}}}function pe(n){let e=se();return e?e[n]?.mcpTools??[]:[]}function fe(n,e,t){return me(le(n,e,{prompt:t}))}var Mt=getLocalApiKey(),L=join(getDevFlowStateRoot(),"errors");async function ke(n,e,t={}){let r=t.endpoint??resolveRuntimeEndpoint().url,o=t.timeout??1500,i=t.durableMirror??true,s=t.maxRetries??(i?0:2),a=t.circuitBreaker??true,d=acquireRuntimeHttpCircuit(r,n);if(a&&!d.allowed)return {delivered:false,suppressed:true,fallbackReason:d.state.fallbackReason};let m;for(let u=0;u<=s;u+=1)try{return await Dt(r,n,e,o),a&&registerRuntimeHttpSuccess(r,n).transitioned&&h("http_circuit_transition",{endpoint:r,path:new URL(n,r).pathname,previous:d.state.status,status:"closed",failures:0}),{delivered:!0,suppressed:!1}}catch(c){m=c instanceof Error?c:new Error(String(c)),u<s&&await Ct(Math.min(100*2**u,1e3));}if(!m)return {delivered:false,suppressed:false,fallbackReason:"unknown_http_failure"};if(!a)return Ie(n,m),{delivered:false,suppressed:false,fallbackReason:m.message};let l=registerRuntimeHttpFailure(r,n,t.fallbackReason??(i?"local_durable_mirror":"http_delivery_failed"));return l.transitioned&&(Ie(n,m),h("http_circuit_transition",{endpoint:r,path:new URL(n,r).pathname,previous:d.state.status,status:"open",failures:l.state.failures,openUntil:l.state.openUntil,fallbackReason:l.state.fallbackReason})),{delivered:false,suppressed:false,fallbackReason:l.state.fallbackReason}}function Dt(n,e,t,r){return new Promise((o,i)=>{let s=JSON.stringify(t),a=new URL(e,n),d=false,m=u=>{d||(d=true,u?i(u):o());},l=request({hostname:a.hostname,port:a.port,path:a.pathname+a.search,method:"POST",headers:{"Content-Type":"application/json","X-API-Key":Mt,"Content-Length":Buffer.byteLength(s)},timeout:r},u=>{u.on("error",m),u.on("end",()=>{let c=u.statusCode??0;m(c>=200&&c<300?void 0:new Error(`HTTP ${c}`));}),u.resume();});l.on("error",m),l.on("timeout",()=>l.destroy(new Error(`HTTP mirror timed out after ${r}ms`))),l.write(s),l.end();})}function Ie(n,e){try{existsSync$1(L)||mkdirSync$1(L,{recursive:!0}),appendFileSync(join(L,"http-errors.log"),`${new Date().toISOString()} | ${n} | ${e.message}
4
+ `);}catch{}}function Ct(n){return new Promise(e=>setTimeout(e,n))}var _e=1e4,Nt=3e4,D=500,C=class{constructor(e){this.retryScheduled=false;this.metricAggregationScheduled=false;this.apiUrl=e?.apiUrl,this.cacheDir=e?.cacheDir??join$1(getDevFlowStateRoot(),"global","telemetry-cache"),this.database=e?.database??null,this.ownsDatabase=!e?.database;let t=e?.busyTimeoutMs??Number(process.env.DEVFLOW_TELEMETRY_DB_BUSY_TIMEOUT_MS);this.busyTimeoutMs=Number.isSafeInteger(t)&&t>=0?t:100;}async sendEvent(e){let t={...e,input:this.truncateInput(e.input)};return this.commitOrCache("tool_call",t)?(this.postHttp("/api/telemetry/tool-call",t),e.eventId):null}async sendExecutionStart(e,t,r,o,i=process.env.CLAUDE_PROJECT_DIR??process.cwd(),s=[]){let a={executionId:e,sessionId:t,skillName:r,startedAt:o,projectRoot:i,requiredMcpTools:s};this.commitOrCache("execution_start",a)&&this.postHttp("/api/telemetry/skill-execution/start",a);}async sendExecutionComplete(e,t="completed",r=Date.now(),o){let i={executionId:e,status:t,finishedAt:r,metadata:o},s=this.commitOrCache("execution_complete",i);return s&&this.postHttp("/api/telemetry/skill-execution/complete-reconciled",i),s}async sendSessionStart(e,t,r){let o={id:e,projectRoot:t,startedAt:r,label:t.split("/").pop()??"unknown"},i=this.commitOrCache("session_start",o);return i&&this.postHttp("/api/telemetry/sessions",o),i}async completeEvent(e){let t=this.commitOrCache("complete_event",e);return t&&(this.postHttp("/api/telemetry/tool-call/output",e),this.scheduleMetricAggregation()),t}async endSession(e,t=Date.now()){let r={sessionId:e,finishedAt:t},o=this.commitOrCache("session_end",r);return o&&(this.getDatabase().aggregatePendingToolMetrics(),this.postHttp(`/api/telemetry/sessions/${encodeURIComponent(e)}/close`,{finishedAt:t})),o}async flushCache(){try{let t=this.getDatabase(),r=t.listTelemetryFailures({unresolvedOnly:!0,limit:D}).reverse();for(let o of r)try{this.applyOperation(o.operation,o.payload),t.resolveTelemetryFailure(o.id);}catch{}t.trimTelemetryFailures(D);}catch{}let e=(existsSync(this.cacheDir)?readdirSync(this.cacheDir):[]).filter(t=>t.endsWith(".json")).map(t=>{let r=join$1(this.cacheDir,t);try{return {cacheFile:r,envelope:Lt(JSON.parse(readFileSync$1(r,"utf8")))}}catch{return null}}).filter(t=>t!==null).sort((t,r)=>t.envelope.timestamp-r.envelope.timestamp||Ee(t.envelope.operation)-Ee(r.envelope.operation));for(let{cacheFile:t,envelope:r}of e)try{let o=this.getDatabase();o.insertTelemetryFailure({id:r.id,operation:r.operation,payload:r.payload,error:r.failure,createdAt:r.timestamp}),this.applyOperation(r.operation,r.payload),o.resolveTelemetryFailure(r.id),unlinkSync(t);}catch{}this.database?.aggregatePendingToolMetrics();}aggregateMetrics(){return this.getDatabase().aggregatePendingToolMetrics()}async flushAndAggregate(){await this.flushCache(),this.aggregateMetrics();}close(){this.ownsDatabase&&this.database?.close(),this.database=null;}getDatabase(){return this.database??=openGlobalDevFlowDatabase(void 0,{busyTimeoutMs:this.busyTimeoutMs}),this.database}commitOrCache(e,t){try{return this.applyOperation(e,t),!0}catch(r){return this.cacheOperation(e,t,r),false}}applyOperation(e,t){let r=this.getDatabase();switch(e){case "tool_call":this.ensureParentSession(r,t),r.insertToolCallEvent(t);return;case "execution_start":this.ensureParentSession(r,t),r.insertSkillExecution({executionId:t.executionId,sessionId:t.sessionId,skillName:t.skillName,startedAt:t.startedAt,status:"running",requiredMcpTools:t.requiredMcpTools});return;case "execution_complete":r.reconcileSkillExecution(t.executionId,t.status,t.finishedAt,t.metadata);return;case "session_start":r.ensureSession(t),r.insertRun({id:xe(t.id),source:"hook",tool:"session",input:{projectRoot:t.projectRoot},status:"active",startedAt:t.startedAt,tokenUsed:0,metadata:{sessionId:t.id,projectRoot:t.projectRoot}});return;case "complete_event":if(!r.updateToolCallEvent(t.eventId,{output:t.output===void 0?void 0:JSON.stringify(t.output),error:t.error,failureCategory:t.failureCategory,duration:t.duration}))throw new Error(`Tool call event ${t.eventId} is not available for completion`);return;case "session_end":r.closeSession(t.sessionId,t.finishedAt),r.updateRun(xe(t.sessionId),{status:"completed",finishedAt:t.finishedAt});return}}ensureParentSession(e,t){let r=typeof t.sessionId=="string"?t.sessionId.trim():"";if(!r)throw new Error("Canonical session ID is required for telemetry");let o=typeof t.projectRoot=="string"&&t.projectRoot.trim()?t.projectRoot:typeof t.input?.projectRoot=="string"&&t.input.projectRoot.trim()?t.input.projectRoot:process.env.CLAUDE_PROJECT_DIR??"unknown";e.ensureSession({id:r,projectRoot:o,label:o==="unknown"?void 0:o.split("/").pop(),startedAt:Number(t.startedAt??t.timestamp??Date.now())});}cacheOperation(e,t,r){let o=Date.now(),i={id:`failure:${o}:${Math.random().toString(36).slice(2,11)}`,operation:e,payload:t,failure:r instanceof Error?r.message:String(r),timestamp:o};try{let s=this.getDatabase();s.insertTelemetryFailure({id:i.id,operation:e,payload:t,error:i.failure,createdAt:o}),s.trimTelemetryFailures(D),this.scheduleRetry();return}catch{}try{existsSync(this.cacheDir)||mkdirSync(this.cacheDir,{recursive:!0});let s=join$1(this.cacheDir,`${o}_${Math.random().toString(36).slice(2,11)}.json`);writeFileSync(s,JSON.stringify(i,null,2),{mode:384}),this.trimRetryCache(),this.scheduleRetry();}catch{}}trimRetryCache(){try{let e=readdirSync(this.cacheDir).filter(t=>t.endsWith(".json")).sort();for(let t of e.slice(0,Math.max(0,e.length-D)))unlinkSync(join$1(this.cacheDir,t));}catch{}}scheduleRetry(){this.retryScheduled||(this.retryScheduled=true,setTimeout(()=>{this.retryScheduled=false,this.flushCache();},Nt).unref());}scheduleMetricAggregation(){if(this.metricAggregationScheduled||process.env.DEVFLOW_HOOK_DEGRADED==="1")return;this.metricAggregationScheduled=true,setTimeout(()=>{this.metricAggregationScheduled=false;try{this.getDatabase().aggregatePendingToolMetrics(50)===50&&this.scheduleMetricAggregation();}catch{}},25).unref();}postHttp(e,t){ke(e,t,{endpoint:this.apiUrl,fallbackReason:"telemetry_already_committed_locally"});}truncateInput(e){let t=JSON.stringify(e);return t===void 0||t.length<=_e?e:{_truncated:true,_original_size:t.length,_preview:`${t.substring(0,_e)}...`}}};function Ee(n){return ["session_start","execution_start","tool_call","complete_event","execution_complete","session_end"].indexOf(n)}function xe(n){return `hook-run:${n}`}function Lt(n){if(!n||typeof n!="object")throw new Error("Invalid telemetry cache envelope");let e=n;if(typeof e.id!="string"||typeof e.operation!="string"||e.payload===void 0||typeof e.failure!="string"||typeof e.timestamp!="number")throw new Error("Invalid telemetry cache envelope");return e}var Ht=/^\/(?:devflow:)?[\w-]+\b\s*/iu,Ft=/\b(?:(?:do\s+not|don't|dont|never|not)(?:\s+need\s+to)?|no\s+need\s+to)\s+(?:please\s+)?(?:remember|memorize)\b|(?:不要|别|不用|无需|不必|不需要)(?:再)?(?:记住|记|记忆)/iu,qt=/(?:^|[.!?]\s*)(?:(?:please|kindly)\s+)?(?:remember|memorize|save\s+this|store\s+this|note\s+that)(?:\s+(?:that|to))?[\s:,-]*(.+)$/iu,Ut=/(?:^|[。!?;,,]\s*)(?:(?:请|麻烦|务必|一定要|帮我|帮忙|需要)\s*)?(?:记住|记一下|记下来|记|记录一下|记录下来|保存一下|保存下来)(?:这(?:件事|一点|个信息|些内容))?[\s::,,]*(.+)$/iu;function w(n){let e=n.trim().replace(Ht,"").trim();return !e||Ft.test(e)?null:(Ut.exec(e)??qt.exec(e))?.[1]?.trim().replace(/^[::,,\s]+/u,"")||null}var T=1,Bt="memory-snapshot-v1.json",Yt=512*1024,Ce=256*1024,Te=2e3,Xt=500,Zt=10,Qt=240,en=300*1e3,tn=720*60*60*1e3,nn=2147483647;function rn(n){return n.currentUid===void 0?{ownerSafe:true,modeSafe:true}:{ownerSafe:n.ownerUid===n.currentUid,modeSafe:(n.mode&18)===0}}function I(n){return resolve(n)}function S(n){return createHash$1("sha256").update(I(n)).digest("hex").slice(0,16)}function on(n,e={}){let t=S(n),r=e.stateRoot?join(e.stateRoot,t):getProjectStateDir(I(n));return join(r,Bt)}function sn(n,e){let r=(n instanceof Error?n.message:"").replace(/[\r\n\t]+/gu," ").trim().slice(0,160);return r?`${e}:${r}`:e}function F(n,e){return Array.isArray(n)&&n.length<=e&&n.every(t=>typeof t=="string"&&t.length>0&&t.length<=512)}function an(n){if(!n||typeof n!="object"||Array.isArray(n))return false;let e=n;return typeof e.id=="string"&&e.id.length>0&&e.id.length<=512&&typeof e.kind=="string"&&e.kind.length>0&&e.kind.length<=128&&(e.family===void 0||typeof e.family=="string"&&e.family.length>0&&e.family.length<=256)&&(e.entity===void 0||typeof e.entity=="string"&&e.entity.length>0&&e.entity.length<=256)&&F(e.memoryIds,100)&&(e.status==="withheld"||e.status==="resolved")&&(e.summary===void 0||typeof e.summary=="string"&&e.summary.length<=2e3)}function cn(n){if(!n||typeof n!="object"||Array.isArray(n))return false;let e=n;return typeof e.reason=="string"&&e.reason.length>0&&e.reason.length<=512&&(e.stale===void 0||typeof e.stale=="boolean")}function Oe(n,e,t){if(!n||typeof n!="object"||Array.isArray(n))return null;let r=n,o=I(e),i=S(o),s=r.generation===void 0?0:r.generation;return r.version!==T||r.projectRoot!==o||r.projectHash!==i||typeof r.markdown!="string"||Buffer.byteLength(r.markdown,"utf8")>Ce||!F(r.memoryIds,Te)||!Array.isArray(r.conflicts)||r.conflicts.length>Xt||!r.conflicts.every(an)||typeof r.generatedAt!="number"||!Number.isFinite(r.generatedAt)||r.generatedAt<0||r.generatedAt>t+en||!Number.isInteger(s)||s<0||s>nn||!["ready","pending","degraded","disabled"].includes(String(r.status))||r.degradation!==void 0&&!cn(r.degradation)?null:{...r,generation:s}}function dn(n,e,t,r,o=0){let i=I(n);return {version:T,projectRoot:i,projectHash:S(i),markdown:"",memoryIds:[],conflicts:[],generatedAt:r,generation:o,status:e,degradation:{reason:t}}}function un(n,e={}){let t=e.now??Date.now(),r=on(n,e),o;try{o=openSync(r,constants.O_RDONLY|constants.O_NOFOLLOW);let i=fstatSync(o);if(!i.isFile()||i.size<=0||i.size>Yt)throw new Error("cache_size_invalid");let s=rn({...typeof process.getuid=="function"?{currentUid:process.getuid()}:{},ownerUid:i.uid,mode:i.mode});if(!s.ownerSafe)throw new Error("cache_owner_invalid");if(!s.modeSafe)throw new Error("cache_permissions_unsafe");let a=JSON.parse(readFileSync(o,"utf8")),d=Oe(a,n,t);if(!d)throw new Error("cache_schema_invalid");return d.status==="ready"&&t-d.generatedAt>tn?{snapshot:{...d,status:"degraded",degradation:{reason:"cache_stale",stale:!0}},source:"cache",valid:!0,stale:!0}:{snapshot:d,source:"cache",valid:!0,stale:!1}}catch(i){let a=i.code==="ENOENT";return {snapshot:dn(n,a?"pending":"degraded",a?"cache_missing":sn(i,"cache_invalid"),t),source:"none",valid:false,stale:false}}finally{if(o!==void 0)try{closeSync(o);}catch{}}}function ln(n){if(!n)return true;try{return JSON.parse(readFileSync(n,"utf8")).sessionStart?.injectMemories??!0}catch{return true}}function mn(n,e,t){if(!e.trim())return null;try{let r=JSON.parse(e);if(r.status!=="ok"&&r.status!=="degraded")return null;if(r.enabled===!1){let i=I(n);return {version:T,projectRoot:i,projectHash:S(i),markdown:"",memoryIds:[],conflicts:[],generatedAt:t,generation:0,status:"disabled"}}let o=Oe(r.snapshot,n,t);if(o)return o;if(r.status==="ok"&&typeof r.markdown=="string"&&r.markdown.length>0&&Buffer.byteLength(r.markdown,"utf8")<=Ce){let i=I(n);return {version:T,projectRoot:i,projectHash:S(i),markdown:r.markdown,memoryIds:F(r.memoryIds,Te)?r.memoryIds:[],conflicts:[],generatedAt:t,generation:0,status:"ready"}}}catch{}return null}function H(n,e){return [...(n??e).replace(/[\r\n\t|]+/gu," ").trim()||e].slice(0,Qt).join("")}function pn(n){if(n.length===0)return "";let e=n.slice(0,Zt),t=e.map(r=>{let o=H(r.family,"unknown"),i=H(r.entity,"unknown"),s=H(r.summary,"Explicit choice required.");return `- family=${o}; entity=${i}; status=${r.status}; summary=${s}`});return n.length>e.length&&t.push(`- ${n.length-e.length} additional conflict(s) omitted from SessionStart output.`),`## Withheld preference conflicts (${n.length})
3
5
  ${t.join(`
4
- `)}`}function Yt(e){let n=e.now??Date.now();if(Bt(e.configPath)===false)return "";let t=Vt(e.projectRoot,e.daemonResponse??"",n),r=t?{snapshot:t,source:"daemon"}:Kt(e.projectRoot,{...e.cacheOptions,now:n}),{snapshot:o}=r;if(o.status==="disabled")return `## Project memory
5
- DevFlow memory snapshot=pending; source=${r.source}; reason=previous_snapshot_disabled. Memory availability is not yet known; do not conclude that the project has no memories.`;let i=new Date(o.generatedAt).toISOString(),s=o.degradation?.reason?`; reason=${o.degradation.reason}`:"",d=`DevFlow memory snapshot=${o.status}; source=${r.source}; generatedAt=${i}${s}.`,a=Qt(o.conflicts);return o.markdown?[o.markdown,a,d].filter(Boolean).join(`
6
- `):["## Project memory",a,`${d} Memory availability is not yet known; do not conclude that the project has no memories.`].filter(Boolean).join(`
7
- `)}if(process.env.DEVFLOW_MEMORY_SNAPSHOT_CLI==="1"){let[,,e,n,t]=process.argv;e!=="session-start"||!n?process.exitCode=2:process.stdout.write(Yt({projectRoot:n,configPath:t,daemonResponse:process.env.DEVFLOW_MEMORY_RESPONSE}));}function _(e){let n=nn(e.projectRoot),t=openGlobalDevFlowDatabase(void 0,{busyTimeoutMs:250});try{let r=rn(t,{...e,projectRoot:n});return r?appendTaskRuntimeBoundary({projectRoot:r.projectRoot,taskSpec:taskSpecFromImmutableIntent(on(r)),kind:e.kind,payload:e.payload,dedupeKey:e.dedupeKey,producer:e.producer,database:t})?.snapshot??null:null}catch(r){return emitSemanticControlLog({event:"task.runtime.shadow_mismatch",identity:{projectRoot:n,sessionId:e.sessionId,...e.turnId?{turnId:e.turnId}:{},...e.requestId?{requestId:e.requestId}:{}},level:"warn",timestamp:Date.now(),data:{stage:e.kind,reason:an(r),authority:"legacy"}}),null}finally{t.close();}}function nn(e){try{return realpathSync(e)}catch{return e}}function rn(e,n){return e.listLatestTaskIntentArtifacts(n.projectRoot,n.sessionId).find(t=>n.turnId?t.turnId===n.turnId:n.requestId?t.requestId===n.requestId:true)}function on(e){return {identity:sn(e),version:e.version,...e.supersedesHash?{supersedesHash:e.supersedesHash}:{},rawPrompt:e.rawPrompt,normalizedPrompt:e.normalizedPrompt,...e.command?{command:e.command}:{},slashArgs:e.slashArgs,...e.activeSkill?{activeSkill:e.activeSkill}:{},intent:e.intent,action:e.action,entities:e.entities,targetAnchors:e.targetAnchors,policyConstraints:e.policyConstraints,classificationEvidence:e.classificationEvidence,sourceEventIds:e.sourceEventIds,sourceHash:e.sourceHash,artifactHash:e.artifactHash,createdAt:e.createdAt}}function sn(e){return {projectRoot:e.projectRoot,projectId:e.projectId,hostId:e.hostId,sessionId:e.sessionId,turnId:e.turnId,requestId:e.requestId,...e.executionId?{executionId:e.executionId}:{}}}function an(e){return e instanceof Error?e.message:String(e)}var ln=/^(?:ok(?:ay)?|yes|no|thanks?|thank you|continue|好的?|可以|行|是|否|谢谢|继续|收到|明白了?)[.!。!\s]*$/iu,un=/(?:记住|记下|保存|持久化|跨会话|以后|始终|永远|统一使用|项目约定|团队约定|偏好|决定采用|保留可复用|提炼结论|沉淀|记录(?:下来|为|成)?(?:架构|规则|约定|知识|结论))|\b(?:remember|memorize|persist|across sessions|from now on|always|project convention|team convention|preference|we use|adopt|retain reusable|distill)\b/iu,mn=/(?:分析|审查|检查|评估|性能|生成|创建|新建|添加|编写|实现|开发|设计|撰写|总结|修改|重构|修复|调试|解释|查看)|\b(?:analy[sz]e|review|inspect|audit|performance|generate|create|add|build|implement|develop|design|write|summarize|modify|refactor|fix|debug|explain)\b/iu;function pn(e){let n=e.trim();return n.length>0&&!ln.test(n)}function fn(e){let n=e.normalize("NFKC").trim();return n.length>=4&&mn.test(n)&&!un.test(n)&&E(n)===null}function gn(e,n,t=Date.now()){let r=createHash$1("sha256").update(n.trim()).digest("hex"),o=createHash$1("sha256").update(`${e}\0${t}\0${r}`).digest("hex").slice(0,24);return {turnId:`turn:${o}`,eventId:`memory-turn:${o}`,promptHash:r,createdAt:t}}function De(e,n,t=[]){return `memory-receipt:${createHash$1("sha256").update(`${e}\0${n}\0${[...t].sort().join("\0")}`).digest("hex").slice(0,24)}`}function yn(e){return `DevFlow memory decision required for ${e.turnId}. Before the final response, semantically decide whether this turn contains durable project knowledge. Call mcp__devflow__memory_commit_turn with evidence-bound candidates, or mcp__devflow__memory_skip_turn with a concrete reason. Do not claim memory success without a canonical receipt. For candidates, copy exact evidenceSpans from this user prompt, preserve package names, flags, versions, paths, and identifiers, and provide subject, predicate, value, polarity, and entities when known. Do not save assistant echoes, task narration, retries, or unverified guesses. Express a change from an old choice as the new durable value. If the decision tool remains unavailable, explicitly state that the memory was not saved.`}function U(e){let n=e.memoryIds.length>0?e.memoryIds.join(","):"none",t=e.status==="committed"?"accepted":e.status,r=e.status==="committed"?"; indexStatus=pending":"",o=e.memoryIds.some(d=>d.startsWith("raw-memory:")),i=e.status==="committed"&&e.source==="explicit_intent"&&!o?"; memoryOnlyCompleted=true; skipProjectContext=true; hostRefinementRequired=true":e.status==="committed"&&e.source==="explicit_intent"?"; asyncReadiness=queued; hostRefinementRequired=true":"",s=e.status==="committed"&&e.source==="explicit_intent"?` The deterministic explicit-memory save is complete and remains authoritative if refinement fails. Before the final response, call mcp__devflow__memory_commit_turn once with turnId=${e.turnId} and semantic candidates. Split every distinct reusable fact into a durable_memory candidate, classify instructions that apply only to this turn as turn_constraint, and include evidenceSpans copied verbatim from the user prompt for every candidate. Preserve exact flags, package names, versions, paths, and identifiers. Keep narrative and value in the user prompt language; do not translate evidence into a different surface form. The tool refines the existing receipt idempotently; it must not create native Claude memory. If refinement is unavailable, return the existing canonical receipt without claiming refinement.`:"";return `DevFlow canonical memory receipt: status=${t}; receiptId=${e.receiptId??"missing"}; turnId=${e.turnId}; memoryIds=${n}; source=${e.source??"unknown"}${r}${i}.`+s}function Ce(e){if(!pn(e.prompt))return null;let n=openGlobalDevFlowDatabase(void 0,{busyTimeoutMs:50});try{let t=e.prompt.trim().slice(0,4e3),r=createHash$1("sha256").update(t).digest("hex"),o=n.listMemoryTurns(e.projectRoot,e.sessionId,5).find(c=>c.promptHash===r&&Date.now()-c.createdAt<1e4),i=o?{turnId:o.turnId,eventId:o.eventId,promptHash:o.promptHash,createdAt:o.createdAt}:e.identity??gn(e.sessionId,t),s=o??n.beginMemoryTurn({...i,projectRoot:e.projectRoot,sessionId:e.sessionId});if(s.status!=="pending")return {turn:s,additionalContext:U(s),skipSkillRouting:s.source==="explicit_intent"};let d=resolveSemanticResolutionMode(e.projectRoot),a=d==="off"||d==="shadow"?E(t)??void 0:void 0;if(!a&&fn(t)){let c=De(s.turnId,"skipped"),p=n.skipMemoryTurn({turnId:s.turnId,receiptId:c,source:"automatic_transient_skip",reason:"high_confidence_transient_task"});return _({projectRoot:e.projectRoot,sessionId:e.sessionId,turnId:s.turnId,kind:"memory.skipped",payload:{receiptId:c,reasonCode:"high_confidence_transient_task"},dedupeKey:c,producer:"devflow-memory-turn"}),emitSemanticControlLog({event:"memory.semantic.decided",identity:{projectRoot:e.projectRoot,sessionId:e.sessionId,turnId:s.turnId},level:"info",timestamp:Date.now(),data:{status:"semantic_empty",operation:"none",reason:"high_confidence_transient_task"}}),{turn:p,additionalContext:U(p),skipSkillRouting:!1}}let m=a?"commit_explicit":"capture_prompt",l=n.enqueueWork({idempotencyKey:`memory-turn:${m}:${s.turnId}`,kind:a?"memory.explicit_commit":"memory.turn_capture",projectRoot:e.projectRoot,sessionId:e.sessionId,turnId:s.turnId,payload:{operation:m,turnId:s.turnId,eventId:s.eventId,sessionId:e.sessionId,prompt:t,explicitContent:a,createdAt:s.createdAt}});if(a){let c=`raw-memory:${createHash$1("sha256").update(`${e.projectRoot}\0${i.turnId}\0${a}`).digest("hex").slice(0,24)}`,p=De(s.turnId,"committed",[c]),v=n.commitMemoryTurn({turnId:s.turnId,receiptId:p,memoryIds:[c],source:"explicit_intent",reason:"explicit_raw_queued",decidedAt:Date.now()});return _({projectRoot:e.projectRoot,sessionId:e.sessionId,turnId:s.turnId,kind:"durable_work.owned",payload:{workId:l.id,obligation:"memory"},dedupeKey:`${l.id}:owned`,producer:"devflow-memory-turn"}),_({projectRoot:e.projectRoot,sessionId:e.sessionId,turnId:s.turnId,kind:"memory.committed",payload:{receiptId:p,reasonCode:"explicit_raw_queued"},dedupeKey:p,producer:"devflow-memory-turn"}),emitSemanticControlLog({event:"memory.write.completed",identity:{projectRoot:e.projectRoot,sessionId:e.sessionId,turnId:s.turnId,actionReceipt:p},level:"info",timestamp:Date.now(),data:{stage:"explicit_fast_ack",durable:!0,rawMemoryId:c,receiptLatencyMs:Date.now()-i.createdAt,asyncReadiness:"queued"}}),{turn:v,explicitContent:a,additionalContext:U(v),skipSkillRouting:!0}}return _({projectRoot:e.projectRoot,sessionId:e.sessionId,turnId:s.turnId,kind:"memory.pending",payload:{reasonCode:"semantic_decision_queued"},dedupeKey:`${s.turnId}:pending`,producer:"devflow-memory-turn"}),_({projectRoot:e.projectRoot,sessionId:e.sessionId,turnId:s.turnId,kind:"durable_work.owned",payload:{workId:l.id,obligation:"memory"},dedupeKey:`${l.id}:owned`,producer:"devflow-memory-turn"}),{turn:s,explicitContent:a,additionalContext:yn(s),skipSkillRouting:!1}}finally{n.close();}}function Me(e,n){let t=wn(e);mkdirSync$1(t,{recursive:true,mode:448});let r=`memory-turn-spool-${Date.now()}-${process.pid}-${randomUUID$1()}`,o=join(t,`${r}.json`),i=`${o}.tmp`;return writeFileSync$1(i,JSON.stringify({...n,prompt:n.prompt.trim().slice(0,4e3)}),{mode:384}),renameSync$1(i,o),r}function wn(e){return join(R(e),"memory-turn-pending")}function Oe(e){let n=Date.now();try{let t=openGlobalDevFlowDatabase(void 0,{busyTimeoutMs:100});try{let r=`context-prefetch:${createHash$1("sha256").update(`${e.projectRoot}\0${e.sessionId}\0${e.executionId}\0${_n(e.prompt)}\0${e.profileFingerprint}`).digest("hex")}`,o=t.enqueueWork({idempotencyKey:r,kind:"context.prefetch",projectRoot:e.projectRoot,sessionId:e.sessionId,payload:e,maxAttempts:3});return b("prefetch_queue",{projectRoot:e.projectRoot,skillName:e.skillName,accepted:!0,workState:o.state,latencyMs:Date.now()-n}),{accepted:!0,workItemId:o.id}}finally{t.close();}}catch(t){let r=t instanceof Error?t.message:String(t);return b("prefetch_queue",{projectRoot:e.projectRoot,skillName:e.skillName,accepted:false,reason:r,latencyMs:Date.now()-n}),{accepted:false,reason:r}}}function _n(e){return e.trim().toLowerCase().replace(/\s+/g," ").slice(0,4e3)}function He(e){let n=Date.now(),t=Gn(e.projectRoot),r=claudeCodeRuntimeAdapter.normalizePrompt(e.hostEvent??{session_id:e.sessionId,prompt:e.prompt},{projectRoot:t}),o=r.sourceHash,i=openGlobalDevFlowDatabase(void 0,{busyTimeoutMs:100});try{let s=i.getTaskIntentArtifactBySource({projectRoot:t,sessionId:e.sessionId,sourceHash:o});if(s){let g=Nn(i,s);return {artifact:Un(s),queryPlan:Jn(g),memoryIdentity:je(s),reused:!0}}let d=Wn(r.rawPrompt,r.command),a=buildRetrievalTaskPlan({query:d,parsedIntent:parseIntent(d,{segmentation:"regex"}),targetAnchors:Pe(r.rawPrompt),activeSkill:r.activeSkill,command:r.command}),m=resolveSemanticResolutionMode(t),l=m==="off"?null:extractStructuralSemanticEvidence({prompt:$e(r.rawPrompt),command:r.command,targetAnchors:Pe(r.rawPrompt)}),c=l?createProvisionalSemanticFrame({normalizedPrompt:l.normalizedPrompt,sourceHash:o,structural:l,now:r.timestamp}):null,p=`turn:${D(`${e.sessionId}\0${o}`)}`,v=`request:${D(`${t}\0${e.sessionId}\0${p}`)}`,h={projectRoot:t,projectId:`project:${D(t)}`,hostId:r.hostId,sessionId:e.sessionId,turnId:p,requestId:v},Le=[{source:"deterministic_parser",field:"intent",value:a.intent,reason:a.classification.intentReason,confidence:a.classification.intentSource==="semantic_override"?.95:.75},{source:r.command?"slash_command":"deterministic_parser",field:"action",value:a.action,reason:a.classification.actionReason,confidence:r.command||a.action!=="analyze"?.95:.65},...a.targetAnchors.map(g=>({source:"target_anchor",field:"target",value:g,reason:"explicit_prompt_target",confidence:1}))],W={identity:h,version:1,rawPrompt:r.rawPrompt,normalizedPrompt:$e(r.rawPrompt),...r.command?{command:r.command}:{},slashArgs:r.slashArgs,...r.activeSkill?{activeSkill:r.activeSkill}:{},intent:a.intent,action:a.action,entities:a.entities,targetAnchors:a.targetAnchors,policyConstraints:zn(r.rawPrompt),classificationEvidence:Le,sourceEventIds:[r.sourceEventId??`host-event:${o.slice(0,24)}`],sourceHash:o,createdAt:r.timestamp},u={...W,artifactHash:Kn(W)},I=buildChannelQueryPlan({artifact:u,taskPlan:a,expandedTerms:e.expandedTerms});if(i.appendTaskIntentArtifact(Ln(u)),i.appendChannelQueryPlan(qn(I)),c){i.appendSemanticResolution({frameHash:c.frameHash,...h,sourceHash:o,artifactHash:u.artifactHash,artifactRevision:u.version,state:c.state,generatedBy:c.resolver.generatedBy,modelId:c.resolver.modelId,modelRevision:c.resolver.modelRevision,routeCatalogVersion:c.resolver.routeCatalogVersion,thresholdVersion:c.resolver.thresholdVersion,route:{status:"unavailable",reason:"prompt_hook_bounded"},sampling:{attempted:!1,status:"not_needed"},conflicts:[],frame:c,durationMs:0,createdAt:c.createdAt});let g=projectSemanticFrameToLegacyIntent(c);(g.intent!==u.intent||g.action!==u.action)&&emitSemanticControlLog({event:"semantic.regex.shadow_mismatch",identity:h,level:"info",timestamp:Date.now(),data:{mode:m,frameHash:c.frameHash,legacyIntent:u.intent,legacyAction:u.action,semanticIntent:g.intent,semanticAction:g.action}});}let qe=Fn(i,u);try{appendTaskRuntimeBoundary({projectRoot:t,taskSpec:taskSpecFromImmutableIntent(u),kind:"task.spec.bound",payload:{intentArtifactHash:u.artifactHash},dedupeKey:u.artifactHash,producer:"devflow-task-intent",createdAt:u.createdAt,database:i});}catch(g){emitSemanticControlLog({event:"task.runtime.shadow_mismatch",identity:h,level:"warn",timestamp:Date.now(),data:{stage:"task.spec.bound",reason:g instanceof Error?g.message:String(g),authority:"legacy"}});}return emitSemanticControlLog({event:"host.prompt.normalized",identity:h,level:"info",timestamp:Date.now(),data:{sourceHash:o,command:u.command,activeSkill:u.activeSkill,rawPromptBytes:Buffer.byteLength(u.rawPrompt)}}),emitSemanticControlLog({event:"intent.artifact.created",identity:h,level:"info",timestamp:Date.now(),data:{artifactHash:u.artifactHash,intent:u.intent,action:u.action,evidence:u.classificationEvidence,entityCount:u.entities.length,targetCount:u.targetAnchors.length}}),emitSemanticControlLog({event:"intent.artifact.persisted",identity:h,level:"info",timestamp:Date.now(),data:{artifactHash:u.artifactHash,version:u.version,sourceHash:u.sourceHash,parserMode:"regex",captureLatencyMs:Date.now()-n}}),emitSemanticControlLog({event:"query.plan.created",identity:h,level:"info",timestamp:Date.now(),data:{planHash:I.planHash,sourceIntentHash:I.sourceIntentHash,generatedBy:I.generatedBy,codeQueries:I.code.length,memoryQueries:I.memory.length,knowledgeQueries:I.knowledge.length,knowledgeDisposition:I.knowledge.map(g=>g.requirement)}}),emitSemanticControlLog({event:"terminal.transition.persisted",identity:h,level:"info",timestamp:Date.now(),data:{state:"intent_bound",receiptId:qe,sourceIntentHash:u.artifactHash}}),{artifact:u,queryPlan:I,memoryIdentity:je(u),reused:!1}}finally{i.close();}}function Nn(e,n){let t=e.getChannelQueryPlanForIntent({projectRoot:n.projectRoot,sessionId:n.sessionId,turnId:n.turnId,sourceIntentHash:n.artifactHash});if(!t)throw new Error(`QUERY_PLAN_NOT_FOUND:${n.artifactHash}`);return t}function Fn(e,n){let t=e.getLatestTerminalTransition(n.identity.projectRoot,n.identity.sessionId,n.identity.turnId);if(t)return t.receiptId;let r=`terminal:${D(`${n.artifactHash}\0open`)}`;return e.appendTerminalTransition({...n.identity,sequence:1,toState:"open",receiptId:r,reason:"host_prompt_accepted",payload:{sourceHash:n.sourceHash},createdAt:n.createdAt}),e.appendTerminalTransition({...n.identity,sequence:2,fromState:"open",toState:"intent_bound",receiptId:`terminal:${D(`${n.artifactHash}\0intent_bound`)}`,sourceReceiptId:r,reason:"immutable_intent_persisted",payload:{intentArtifactHash:n.artifactHash},createdAt:Math.max(n.createdAt,Date.now())}).receiptId}function Ln(e){return {...e.identity,version:e.version,supersedesHash:e.supersedesHash,rawPrompt:e.rawPrompt,normalizedPrompt:e.normalizedPrompt,command:e.command,slashArgs:e.slashArgs,activeSkill:e.activeSkill,intent:e.intent,action:e.action,entities:e.entities,targetAnchors:e.targetAnchors,policyConstraints:e.policyConstraints,classificationEvidence:e.classificationEvidence.map(n=>({...n})),sourceEventIds:e.sourceEventIds,sourceHash:e.sourceHash,artifactHash:e.artifactHash,createdAt:e.createdAt}}function qn(e){return {...e.identity,sourceIntentHash:e.sourceIntentHash,planHash:e.planHash,code:e.code.map(n=>({...n})),memory:e.memory.map(n=>({...n})),knowledge:e.knowledge.map(n=>({...n})),generatedBy:e.generatedBy,degradation:e.degradation?{...e.degradation}:void 0,createdAt:e.createdAt}}function Un(e){return {identity:Ne(e),version:e.version,...e.supersedesHash?{supersedesHash:e.supersedesHash}:{},rawPrompt:e.rawPrompt,normalizedPrompt:e.normalizedPrompt,...e.command?{command:e.command}:{},slashArgs:e.slashArgs,...e.activeSkill?{activeSkill:e.activeSkill}:{},intent:e.intent,action:e.action,entities:e.entities,targetAnchors:e.targetAnchors,policyConstraints:e.policyConstraints,classificationEvidence:e.classificationEvidence,sourceEventIds:e.sourceEventIds,sourceHash:e.sourceHash,artifactHash:e.artifactHash,createdAt:e.createdAt}}function Jn(e){return {identity:Ne(e),sourceIntentHash:e.sourceIntentHash,planHash:e.planHash,code:e.code,memory:e.memory,knowledge:e.knowledge,generatedBy:e.generatedBy,...e.degradation?{degradation:e.degradation}:{},createdAt:e.createdAt}}function Ne(e){return {projectRoot:e.projectRoot,projectId:e.projectId,hostId:e.hostId,sessionId:e.sessionId,turnId:e.turnId,requestId:e.requestId,...e.executionId?{executionId:e.executionId}:{}}}function je(e){let n=e.rawPrompt.trim().slice(0,4e3);return {turnId:e.identity?e.identity.turnId:e.turnId,eventId:`memory-turn:${(e.identity?e.identity.turnId:e.turnId).replace(/^turn:/u,"")}`,promptHash:createHash$1("sha256").update(n).digest("hex"),createdAt:e.createdAt}}function Pe(e){let n=e.match(/(?:^|[\s`'"(])((?:\.{0,2}\/)?(?:[A-Za-z0-9_@.-]+\/)+[A-Za-z0-9_@.-]+(?:\.[A-Za-z0-9]+)?)/gu)??[];return Fe(n.map(t=>t.trim().replace(/^[`'"(]+|[`'"),.;:,。;:]+$/gu,"")).filter(t=>!t.startsWith("/")||/\.[A-Za-z0-9]+$/u.test(t))).slice(0,16)}function zn(e){let n=e.match(/--[a-z0-9][a-z0-9-]*(?:=[^\s,。;;]+)?/giu)??[];return Fe(n.map(t=>t.normalize("NFKC"))).slice(0,16)}function Wn(e,n){return n&&e.trimStart().replace(new RegExp(`^\\/${Bn(n)}\\b`,"iu"),"").trim()||e.trim()}function $e(e){return e.normalize("NFKC").replace(/\s+/gu," ").trim().slice(0,4e3)}function Fe(e){return [...new Set(e.filter(Boolean))]}function Gn(e){let n=resolve(e);try{return realpathSync(n)}catch{return n}}function Kn(e){return createHash$1("sha256").update(J(e)).digest("hex")}function D(e){return createHash$1("sha256").update(e).digest("hex").slice(0,24)}function J(e){if(e===null||typeof e=="string"||typeof e=="boolean")return JSON.stringify(e);if(typeof e=="number")return Number.isFinite(e)?JSON.stringify(e):"null";if(Array.isArray(e))return `[${e.map(J).join(",")}]`;if(!e||typeof e!="object")return JSON.stringify(String(e));let n=e;return `{${Object.keys(n).sort().map(t=>`${JSON.stringify(t)}:${J(n[t])}`).join(",")}}`}function Bn(e){return e.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&")}var y=process.env.CLAUDE_PROJECT_DIR||process.cwd();async function Yn(e){let n=K()?[G]:[],t;try{t=JSON.parse(e);}catch{return {hookSpecificOutput:{hookEventName:"UserPromptSubmit",permissionDecision:"allow",...n.length?{additionalContext:n.join(`
8
- `)}:{}}}}let r=t.prompt||"";if(!r.trim())return {hookSpecificOutput:{hookEventName:"UserPromptSubmit",permissionDecision:"allow",...n.length?{additionalContext:n.join(`
9
- `)}:{}}};let o=t.session_id?.trim(),i=ie(r),s=false,d,a,m=o?new T(y):void 0;if(o){try{a=He({projectRoot:y,sessionId:o,prompt:r,hostEvent:t}),m.bindTaskIdentity(o,{turnId:a.artifact.identity.turnId,requestId:a.artifact.identity.requestId,intentArtifactHash:a.artifact.artifactHash}),n.push(`DevFlow immutable task identity: turnId=${a.artifact.identity.turnId}; requestId=${a.artifact.identity.requestId}; intent=${a.artifact.intent}; action=${a.artifact.action}; intentArtifactHash=${a.artifact.artifactHash}. Retrieval query expansion must not replace this original intent.`);}catch(l){n.push("DevFlow task intent persistence degraded; preserve the original user command and do not claim canonical context binding."),emitSemanticControlLog({event:"intent.artifact.failed",identity:{projectRoot:y,sessionId:o},level:"error",timestamp:Date.now(),data:{stage:"user_prompt_submit",category:"intent_persistence_unavailable",error:l instanceof Error?l.message:String(l)}});}try{let l=Ce({projectRoot:y,sessionId:o,prompt:r,...a?{identity:a.memoryIdentity}:{}});l&&(n.push(l.additionalContext),s=l.skipSkillRouting);}catch(l){s=!!E(r);try{let c=Me(y,{sessionId:o,prompt:r,createdAt:Date.now()});n.push(`DevFlow memory turn status=accepted; durable=true; receiptId=${c}; canonicalMemory=false; SQLite queue replay pending. Do not claim memory success without a canonical receipt.`),emitSemanticControlLog({event:"memory.write.degraded",identity:{projectRoot:y,sessionId:o},level:"warn",timestamp:Date.now(),data:{stage:"turn_capture",reason:l.message,fallback:"durable_spool",receiptId:c}});}catch(c){n.push("DevFlow memory turn status=degraded; durable=false; no canonical receipt exists. Do not claim memory success."),emitSemanticControlLog({event:"memory.write.degraded",identity:{projectRoot:y,sessionId:o},level:"error",timestamp:Date.now(),data:{stage:"turn_capture",reason:c.message,fallback:"none"}});}}}if(o&&i&&!s){let l=m.get(o)?.executionId,c=m.startExecution(o,i.skillName,ae(i.skillName));if(d=c.executionId,c.executionId&&c.executionId!==l){let v=new j;try{await v.sendSessionStart(o,y,c.startedAt),await v.sendExecutionStart(c.executionId,o,i.skillName,c.lastActivityAt,y,c.requiredMcpTools);}finally{v.close();}}let p=ce(i.skillName,y,r);p&&n.push(p);}if(o&&i&&d&&!s){let l=resolveProjectCapabilityProfile(y),c=resolveCapabilityRollout(y).config.retrievalSessions;Oe({prompt:r.trimStart().replace(/^\/devflow:[a-z0-9][a-z0-9-]*\b/i,"").trim()||r,projectRoot:y,sessionId:o,executionId:d,skillName:i.skillName,profileFingerprint:l.fingerprint,rolloutMode:c,retrievalVersion:"r2.v1",createdAt:Date.now()});}return {hookSpecificOutput:{hookEventName:"UserPromptSubmit",permissionDecision:"allow",...n.length?{additionalContext:n.join(`
10
- `)}:{}}}}if(process.argv[1]?.endsWith("user-prompt-submit")||process.argv[1]?.endsWith("user-prompt-submit.js")){let e=console.log.bind(console);console.log=console.error.bind(console),console.info=console.error.bind(console);let n="";process.stdin.setEncoding("utf8"),process.stdin.on("data",t=>{n+=t;}),process.stdin.on("end",async()=>{let t=await Yn(n.trim()||process.argv[2]||"");e(JSON.stringify(t)),process.exit(0);}),process.stdin.on("error",()=>{e(JSON.stringify({hookSpecificOutput:{hookEventName:"UserPromptSubmit",permissionDecision:"allow"}})),process.exit(0);}),setTimeout(()=>{e(JSON.stringify({hookSpecificOutput:{hookEventName:"UserPromptSubmit",permissionDecision:"allow"}})),process.exit(0);},3e4).unref();}export{Yn as handleUserPromptSubmit};
6
+ `)}`}function fn(n){let e=n.now??Date.now();if(ln(n.configPath)===false)return "";let t=mn(n.projectRoot,n.daemonResponse??"",e),r=t?{snapshot:t,source:"daemon"}:un(n.projectRoot,{...n.cacheOptions,now:e}),{snapshot:o}=r;if(o.status==="disabled")return `## Project memory
7
+ DevFlow memory snapshot=pending; source=${r.source}; reason=previous_snapshot_disabled. Memory availability is not yet known; do not conclude that the project has no memories.`;let i=new Date(o.generatedAt).toISOString(),s=o.degradation?.reason?`; reason=${o.degradation.reason}`:"",a=`DevFlow memory snapshot=${o.status}; source=${r.source}; generatedAt=${i}${s}.`,d=pn(o.conflicts);return o.markdown?[o.markdown,d,a].filter(Boolean).join(`
8
+ `):["## Project memory",d,`${a} Memory availability is not yet known; do not conclude that the project has no memories.`].filter(Boolean).join(`
9
+ `)}if(process.env.DEVFLOW_MEMORY_SNAPSHOT_CLI==="1"){let[,,n,e,t]=process.argv;n!=="session-start"||!e?process.exitCode=2:process.stdout.write(fn({projectRoot:e,configPath:t,daemonResponse:process.env.DEVFLOW_MEMORY_RESPONSE}));}function b(n){let{projectRoot:e,...t}=n;try{return new q(e).dispatchBoundary(t).snapshot??null}catch(r){return p({event:"hook.runtime.degraded",identity:{projectRoot:e,sessionId:n.sessionId,...n.turnId?{turnId:n.turnId}:{},...n.requestId?{requestId:n.requestId}:{},...n.executionId?{executionId:n.executionId}:{}},level:"error",timestamp:Date.now(),data:{stage:n.kind,reason:r instanceof Error?r.message:String(r),tool:n.producer}}),null}}var q=class{constructor(e){this.projectRoot=e;}dispatchBoundary(e){let t=In(e.kind,e.payload??{});if(!t)return {handled:false};let r=openGlobalDevFlowDatabase(void 0,{busyTimeoutMs:250});try{let o=vn(r,{projectRoot:this.projectRoot,sessionId:e.sessionId,...e.turnId?{turnId:e.turnId}:{},...e.requestId?{requestId:e.requestId}:{},...e.executionId?{executionId:e.executionId}:{}});return o?{handled:!0,snapshot:new TaskKernel(new TaskEventStore(r),new SemanticRuntimeEventProjector).dispatch({definition:o.definition,kind:t.kind,payload:t.payload,idempotencyKey:`host:${o.definition.definitionHash}:${e.dedupeKey}`,producer:e.producer}).snapshot}:{handled:!1}}finally{r.close();}}};function vn(n,e){let t=e.executionId?n.getActiveContextReceipt(e.projectRoot,e.sessionId,e.executionId):null,r=e.turnId??t?.canonicalAction?.binding.turnId,o=e.requestId??t?.requestId;if(!r&&!o)return null;let i=n.listLatestTaskIntentArtifacts(e.projectRoot,e.sessionId).find(s=>r?s.turnId===r:s.requestId===o);if(!i)return null;for(let s of [...new Set([i.version,2,1])]){let a=n.getTaskAggregateSnapshot(e.projectRoot,e.sessionId,i.turnId,s);if(!a)continue;let d=n.getTaskDefinitionV2(a.taskDefinitionHash);if(d)return {definition:d,snapshot:a}}return null}function In(n,e){switch(n){case "action.lease.issued":return {kind:"action_lease_issued",payload:e};case "action.succeeded":return {kind:"action_completed",payload:e};case "action.failed":return {kind:"action_failed",payload:e};case "verification.succeeded":return {kind:"verification_completed",payload:e};case "verification.failed":return {kind:"verification_failed",payload:e};case "memory.committed":return {kind:"memory_episode_persisted",payload:e};case "memory.skipped":return {kind:"memory_decision_completed",payload:e};case "memory.pending":return {kind:"memory_extraction_queued",payload:e};case "memory.failed":return {kind:"memory_extraction_failed",payload:e};case "durable_work.owned":return {kind:"durable_work_leased",payload:{...e,fencingToken:Number.isSafeInteger(e.fencingToken)?e.fencingToken:0}};case "durable_work.completed":return {kind:"durable_work_completed",payload:e};case "durable_work.dead_lettered":return {kind:"durable_work_dead_lettered",payload:e};default:return null}}var kn=/^(?:ok(?:ay)?|yes|no|thanks?|thank you|continue|好的?|可以|行|是|否|谢谢|继续|收到|明白了?)[.!。!\s]*$/iu,wn=/(?:记住|记下|保存|持久化|跨会话|以后|始终|永远|统一使用|项目约定|团队约定|偏好|决定采用|保留可复用|提炼结论|沉淀|记录(?:下来|为|成)?(?:架构|规则|约定|知识|结论))|\b(?:remember|memorize|persist|across sessions|from now on|always|project convention|team convention|preference|we use|adopt|retain reusable|distill)\b/iu,Sn=/(?:分析|审查|检查|评估|性能|生成|创建|新建|添加|编写|实现|开发|设计|撰写|总结|修改|重构|修复|调试|解释|查看)|\b(?:analy[sz]e|review|inspect|audit|performance|generate|create|add|build|implement|develop|design|write|summarize|modify|refactor|fix|debug|explain)\b/iu,Rn=/(?:召回|查询|检索|查找|定位|询问|什么|如何|是否|哪里|哪个)|\b(?:recall|query|search|find|locate|ask|what|how|whether|where|which)\b/iu;function _n(n){let e=n.trim();return e.length>0&&!kn.test(e)}function En(n){let e=n.normalize("NFKC").trim(),t=Rn.test(e);return e.length>=4&&(Sn.test(e)||t)&&(!wn.test(e)||t)&&w(e)===null}function xn(n,e,t=Date.now()){let r=createHash$1("sha256").update(e.trim()).digest("hex"),o=createHash$1("sha256").update(`${n}\0${t}\0${r}`).digest("hex").slice(0,24);return {turnId:`turn:${o}`,eventId:`memory-turn:${o}`,promptHash:r,createdAt:t}}function Pe(n,e,t=[]){return `memory-receipt:${createHash$1("sha256").update(`${n}\0${e}\0${[...t].sort().join("\0")}`).digest("hex").slice(0,24)}`}function An(n){return `DevFlow memory decision required for ${n.turnId}. Before the final response, semantically decide whether this turn contains durable project knowledge. Call mcp__devflow__memory_commit_turn with evidence-bound candidates, or mcp__devflow__memory_skip_turn with a concrete reason. Do not claim memory success without a canonical receipt. For candidates, copy exact evidenceSpans from this user prompt, preserve package names, flags, versions, paths, and identifiers, and provide subject, predicate, value, polarity, and entities when known. To replace or retire an existing fact, provide operation=supersede or operation=retire plus referencedFactIds from the canonical memory receipt; aliases and entity names are not fact identity. Do not save assistant echoes, task narration, retries, or unverified guesses. Express a change from an old choice as the new durable value. If the decision tool remains unavailable, explicitly state that the memory was not saved.`}function U(n){let e=n.memoryIds.length>0?n.memoryIds.join(","):"none",t=n.status==="committed"?"accepted":n.status,r=n.status==="committed"?"; indexStatus=pending":"",o=n.memoryIds.some(a=>a.startsWith("raw-memory:")),i=n.status==="committed"&&n.source==="explicit_intent"&&!o?"; memoryOnlyCompleted=true; skipProjectContext=true; hostRefinementRequired=true":n.status==="committed"&&n.source==="explicit_intent"?"; asyncReadiness=queued; hostRefinementRequired=true":"",s=n.status==="committed"&&n.source==="explicit_intent"?` The deterministic explicit-memory save is complete and remains authoritative if refinement fails. Before the final response, call mcp__devflow__memory_commit_turn once with turnId=${n.turnId} and semantic candidates. Split every distinct reusable fact into a durable_memory candidate, classify instructions that apply only to this turn as turn_constraint, and include evidenceSpans copied verbatim from the user prompt for every candidate. Preserve exact flags, package names, versions, paths, and identifiers. Keep narrative and value in the user prompt language; do not translate evidence into a different surface form. The tool refines the existing receipt idempotently; it must not create native Claude memory. If refinement is unavailable, return the existing canonical receipt without claiming refinement.`:"";return `DevFlow canonical memory receipt: status=${t}; receiptId=${n.receiptId??"missing"}; turnId=${n.turnId}; memoryIds=${e}; source=${n.source??"unknown"}${r}${i}.`+s}function $e(n){if(!_n(n.prompt))return null;let e=openGlobalDevFlowDatabase(void 0,{busyTimeoutMs:50});try{let t=n.prompt.trim().slice(0,4e3),r=createHash$1("sha256").update(t).digest("hex"),o=e.listMemoryTurns(n.projectRoot,n.sessionId,5).find(u=>u.promptHash===r&&Date.now()-u.createdAt<1e4),i=o?{turnId:o.turnId,eventId:o.eventId,promptHash:o.promptHash,createdAt:o.createdAt}:n.identity??xn(n.sessionId,t),s=o??e.beginMemoryTurn({...i,projectRoot:n.projectRoot,sessionId:n.sessionId});if(s.status!=="pending")return {turn:s,additionalContext:U(s),skipSkillRouting:s.source==="explicit_intent"};let d=(n.activation?.semantic??"degraded_structural")==="degraded_structural"?w(t)??void 0:void 0;if(!d&&En(t)){let u=Pe(s.turnId,"skipped"),c=e.skipMemoryTurn({turnId:s.turnId,receiptId:u,source:"automatic_transient_skip",reason:"high_confidence_transient_task"});return b({projectRoot:n.projectRoot,sessionId:n.sessionId,turnId:s.turnId,kind:"memory.skipped",payload:{receiptId:u,reasonCode:"high_confidence_transient_task"},dedupeKey:u,producer:"devflow-memory-turn"}),p({event:"memory.semantic.decided",identity:{projectRoot:n.projectRoot,sessionId:n.sessionId,turnId:s.turnId},level:"info",timestamp:Date.now(),data:{status:"semantic_empty",operation:"none",reason:"high_confidence_transient_task"}}),{turn:c,additionalContext:U(c),skipSkillRouting:!1}}let m=d?"commit_explicit":"capture_prompt",l=e.enqueueWork({idempotencyKey:`memory-turn:${m}:${s.turnId}`,kind:d?"memory.explicit_commit":"memory.turn_capture",projectRoot:n.projectRoot,sessionId:n.sessionId,turnId:s.turnId,payload:{operation:m,turnId:s.turnId,eventId:s.eventId,sessionId:n.sessionId,prompt:t,explicitContent:d,createdAt:s.createdAt}});if(d){let u=`raw-memory:${createHash$1("sha256").update(`${n.projectRoot}\0${i.turnId}\0${d}`).digest("hex").slice(0,24)}`,c=Pe(s.turnId,"committed",[u]),f=e.commitMemoryTurn({turnId:s.turnId,receiptId:c,memoryIds:[u],source:"explicit_intent",reason:"explicit_raw_queued",decidedAt:Date.now()});return b({projectRoot:n.projectRoot,sessionId:n.sessionId,turnId:s.turnId,kind:"durable_work.owned",payload:{workId:l.id,obligation:"memory"},dedupeKey:`${l.id}:owned`,producer:"devflow-memory-turn"}),b({projectRoot:n.projectRoot,sessionId:n.sessionId,turnId:s.turnId,kind:"memory.committed",payload:{receiptId:c,reasonCode:"explicit_raw_queued"},dedupeKey:c,producer:"devflow-memory-turn"}),p({event:"memory.write.completed",identity:{projectRoot:n.projectRoot,sessionId:n.sessionId,turnId:s.turnId,actionReceipt:c},level:"info",timestamp:Date.now(),data:{stage:"explicit_fast_ack",durable:!0,rawMemoryId:u,receiptLatencyMs:Date.now()-i.createdAt,asyncReadiness:"queued"}}),{turn:f,explicitContent:d,additionalContext:U(f),skipSkillRouting:!0}}return b({projectRoot:n.projectRoot,sessionId:n.sessionId,turnId:s.turnId,kind:"memory.pending",payload:{reasonCode:"semantic_decision_queued"},dedupeKey:`${s.turnId}:pending`,producer:"devflow-memory-turn"}),b({projectRoot:n.projectRoot,sessionId:n.sessionId,turnId:s.turnId,kind:"durable_work.owned",payload:{workId:l.id,obligation:"memory"},dedupeKey:`${l.id}:owned`,producer:"devflow-memory-turn"}),{turn:s,explicitContent:d,additionalContext:An(s),skipSkillRouting:!1}}finally{e.close();}}function Le(n,e){let t=On(n);mkdirSync$1(t,{recursive:true,mode:448});let r=`memory-turn-spool-${Date.now()}-${process.pid}-${randomUUID$1()}`,o=join(t,`${r}.json`),i=`${o}.tmp`;return writeFileSync$1(i,JSON.stringify({...e,prompt:e.prompt.trim().slice(0,4e3)}),{mode:384}),renameSync$1(i,o),r}function On(n){return join(k(n),"memory-turn-pending")}function He(n){let e=Date.now();try{let t=openGlobalDevFlowDatabase(void 0,{busyTimeoutMs:100});try{let r=`context-prefetch:${createHash$1("sha256").update(`${n.projectRoot}\0${n.sessionId}\0${n.executionId}\0${$n(n.prompt)}\0${n.profileFingerprint}`).digest("hex")}`,o=t.enqueueWork({idempotencyKey:r,kind:"context.prefetch",projectRoot:n.projectRoot,sessionId:n.sessionId,payload:n,maxAttempts:3});return h("prefetch_queue",{projectRoot:n.projectRoot,skillName:n.skillName,accepted:!0,workState:o.state,latencyMs:Date.now()-e}),{accepted:!0,workItemId:o.id}}finally{t.close();}}catch(t){let r=t instanceof Error?t.message:String(t);return h("prefetch_queue",{projectRoot:n.projectRoot,skillName:n.skillName,accepted:false,reason:r,latencyMs:Date.now()-e}),{accepted:false,reason:r}}}function $n(n){return n.trim().toLowerCase().replace(/\s+/g," ").slice(0,4e3)}async function Je(n){let e=Date.now(),t=Bn(n.projectRoot),r=claudeCodeRuntimeAdapter.normalizePrompt(n.hostEvent??{session_id:n.sessionId,prompt:n.prompt},{projectRoot:t}),o=semanticTextHash(Ue(r.rawPrompt)),i=openGlobalDevFlowDatabase(void 0,{busyTimeoutMs:100});try{let s=i.getTaskIntentArtifactBySource({projectRoot:t,sessionId:n.sessionId,sourceHash:o});if(s){let j=Fe(s).identity,V=i.getRuntimeActivation(j.projectRoot,j.sessionId,j.turnId,s.version);if(!V)throw new Error(`RUNTIME_ACTIVATION_MISSING:${s.artifactHash}`);return {artifact:Fe(s),memoryIdentity:qe(s),activation:V,reused:!0}}let a=`turn:${O(`${n.sessionId}\0${o}`)}`,d=`request:${O(`${t}\0${n.sessionId}\0${a}`)}`,m={projectRoot:t,projectId:`project:${stableRuntimeHash(t).slice(0,20)}`,hostId:r.hostId,sessionId:n.sessionId,executionId:n.sessionId,turnId:a,requestId:d},l=1,u=resolveRuntimeActivationSnapshot({projectRoot:t,createdAt:r.timestamp}),c=Wn(r.rawPrompt),f={identity:m,version:l,rawPrompt:r.rawPrompt,normalizedPrompt:Ue(r.rawPrompt),...r.command?{command:r.command}:{},slashArgs:r.slashArgs,...r.activeSkill?{activeSkill:r.activeSkill}:{},intent:"unknown",action:"unknown",entities:[],targetAnchors:c,policyConstraints:[],classificationEvidence:[],sourceEventIds:[r.sourceEventId??`host-event:${o.slice(0,24)}`],sourceHash:o,createdAt:r.timestamp},y={...f,artifactHash:Yn(f)};i.appendTaskIntentArtifact(Vn(y)),i.bindRuntimeActivation({identity:m,revision:l,snapshot:u});let ze=zn(i,y);return p({event:"host.prompt.normalized",identity:m,level:"info",timestamp:Date.now(),data:{sourceHash:o,command:y.command,activeSkill:y.activeSkill,rawPromptBytes:Buffer.byteLength(y.rawPrompt)}}),p({event:"intent.artifact.created",identity:m,level:"info",timestamp:Date.now(),data:{artifactHash:y.artifactHash,targetCount:c.length}}),p({event:"intent.artifact.persisted",identity:m,level:"info",timestamp:Date.now(),data:{artifactHash:y.artifactHash,version:y.version,sourceHash:y.sourceHash,authority:"immutable-intent",captureLatencyMs:Date.now()-e}}),p({event:"terminal.transition.persisted",identity:m,level:"info",timestamp:Date.now(),data:{state:"intent_bound",receiptId:ze,sourceIntentHash:y.artifactHash}}),{artifact:y,memoryIdentity:qe(y),activation:u,reused:!1}}finally{i.close();}}function zn(n,e){let t=n.getLatestTerminalTransition(e.identity.projectRoot,e.identity.sessionId,e.identity.turnId);if(t)return t.receiptId;let r=`terminal:${O(`${e.artifactHash}\0open`)}`;return n.appendTerminalTransition({...e.identity,sequence:1,toState:"open",receiptId:r,reason:"host_prompt_accepted",payload:{sourceHash:e.sourceHash},createdAt:e.createdAt}),n.appendTerminalTransition({...e.identity,sequence:2,fromState:"open",toState:"intent_bound",receiptId:`terminal:${O(`${e.artifactHash}\0intent_bound`)}`,sourceReceiptId:r,reason:"immutable_intent_persisted",payload:{intentArtifactHash:e.artifactHash},createdAt:Math.max(e.createdAt,Date.now())}).receiptId}function Vn(n){return {...n.identity,version:n.version,supersedesHash:n.supersedesHash,rawPrompt:n.rawPrompt,normalizedPrompt:n.normalizedPrompt,command:n.command,slashArgs:n.slashArgs,activeSkill:n.activeSkill,intent:n.intent,action:n.action,entities:n.entities,targetAnchors:n.targetAnchors,policyConstraints:n.policyConstraints,classificationEvidence:n.classificationEvidence.map(e=>({...e})),sourceEventIds:n.sourceEventIds,sourceHash:n.sourceHash,artifactHash:n.artifactHash,createdAt:n.createdAt}}function Fe(n){return {identity:Kn(n),version:n.version,...n.supersedesHash?{supersedesHash:n.supersedesHash}:{},rawPrompt:n.rawPrompt,normalizedPrompt:n.normalizedPrompt,...n.command?{command:n.command}:{},slashArgs:n.slashArgs,...n.activeSkill?{activeSkill:n.activeSkill}:{},intent:n.intent,action:n.action,entities:n.entities,targetAnchors:n.targetAnchors,policyConstraints:n.policyConstraints,classificationEvidence:n.classificationEvidence,sourceEventIds:n.sourceEventIds,sourceHash:n.sourceHash,artifactHash:n.artifactHash,createdAt:n.createdAt}}function Kn(n){return {projectRoot:n.projectRoot,projectId:n.projectId,hostId:n.hostId,sessionId:n.sessionId,turnId:n.turnId,requestId:n.requestId,...n.executionId?{executionId:n.executionId}:{}}}function qe(n){let e=n.rawPrompt.trim().slice(0,4e3),t="identity"in n?n.identity.turnId:n.turnId;return {turnId:t,eventId:`memory-turn:${t.replace(/^turn:/u,"")}`,promptHash:createHash$1("sha256").update(e).digest("hex"),createdAt:n.createdAt}}function Wn(n){let e=n.match(/(?:^|[\s`'"(])((?:\.{0,2}\/)?(?:[A-Za-z0-9_@.-]+\/)+[A-Za-z0-9_@.-]+(?:\.[A-Za-z0-9]+)?)/gu)??[];return Gn(e.map(t=>t.trim().replace(/^[`'"(]+|[`'"),.;:,。;:]+$/gu,"")).filter(t=>!t.startsWith("/")||/\.[A-Za-z0-9]+$/u.test(t))).slice(0,16)}function Ue(n){return n.normalize("NFKC").replace(/\s+/gu," ").trim().slice(0,4e3)}function Gn(n){return [...new Set(n.filter(Boolean))]}function Bn(n){let e=resolve(n);try{return realpathSync(e)}catch{return e}}function Yn(n){return createHash$1("sha256").update(J(n)).digest("hex")}function O(n){return createHash$1("sha256").update(n).digest("hex").slice(0,24)}function J(n){if(n===null||typeof n=="string"||typeof n=="boolean")return JSON.stringify(n);if(typeof n=="number")return Number.isFinite(n)?JSON.stringify(n):"null";if(Array.isArray(n))return `[${n.map(J).join(",")}]`;if(!n||typeof n!="object")return JSON.stringify(String(n));let e=n;return `{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${J(e[t])}`).join(",")}}`}var g=process.env.CLAUDE_PROJECT_DIR||process.cwd();async function Qn(n){let e=W()?[K]:[],t;try{t=JSON.parse(n);}catch{return {hookSpecificOutput:{hookEventName:"UserPromptSubmit",permissionDecision:"allow",...e.length?{additionalContext:e.join(`
10
+ `)}:{}}}}let r=t.prompt||"";if(!r.trim())return {hookSpecificOutput:{hookEventName:"UserPromptSubmit",permissionDecision:"allow",...e.length?{additionalContext:e.join(`
11
+ `)}:{}}};let o=t.session_id?.trim(),i=ie(r),s=false,a,d,m=o?new E(g):void 0;if(o){try{d=await Je({projectRoot:g,sessionId:o,prompt:r,hostEvent:t}),m.bindTaskIdentity(o,{turnId:d.artifact.identity.turnId,requestId:d.artifact.identity.requestId,intentArtifactHash:d.artifact.artifactHash}),e.push(`DevFlow immutable task identity: turnId=${d.artifact.identity.turnId}; requestId=${d.artifact.identity.requestId}; intentArtifactHash=${d.artifact.artifactHash}. Retrieval query expansion must not replace this original intent.`);}catch(l){e.push("DevFlow task intent persistence degraded; preserve the original user command and do not claim canonical context binding."),p({event:"intent.artifact.failed",identity:{projectRoot:g,sessionId:o},level:"error",timestamp:Date.now(),data:{stage:"user_prompt_submit",category:"intent_persistence_unavailable",error:l instanceof Error?l.message:String(l)}});}try{let l=$e({projectRoot:g,sessionId:o,prompt:r,...d?{identity:d.memoryIdentity}:{},...d?{activation:d.activation}:{}});l&&(e.push(l.additionalContext),s=l.skipSkillRouting);}catch(l){s=!!w(r);try{let u=Le(g,{sessionId:o,prompt:r,createdAt:Date.now()});e.push(`DevFlow memory turn status=accepted; durable=true; receiptId=${u}; canonicalMemory=false; SQLite queue replay pending. Do not claim memory success without a canonical receipt.`),p({event:"memory.write.degraded",identity:{projectRoot:g,sessionId:o},level:"warn",timestamp:Date.now(),data:{stage:"turn_capture",reason:l.message,fallback:"durable_spool",receiptId:u}});}catch(u){e.push("DevFlow memory turn status=degraded; durable=false; no canonical receipt exists. Do not claim memory success."),p({event:"memory.write.degraded",identity:{projectRoot:g,sessionId:o},level:"error",timestamp:Date.now(),data:{stage:"turn_capture",reason:u.message,fallback:"none"}});}}}if(o&&i&&!s){let l=m.get(o)?.executionId,u=m.startExecution(o,i.skillName,pe(i.skillName));if(a=u.executionId,u.executionId&&u.executionId!==l){let f=new C;try{await f.sendSessionStart(o,g,u.startedAt),await f.sendExecutionStart(u.executionId,o,i.skillName,u.lastActivityAt,g,u.requiredMcpTools);}finally{f.close();}}let c=fe(i.skillName,g,r);c&&e.push(c);}if(o&&i&&a&&!s){let l=resolveProjectCapabilityProfile(g),u=resolveCapabilityRollout(g).config.retrievalSessions;He({prompt:r.trimStart().replace(/^\/devflow:[a-z0-9][a-z0-9-]*\b/i,"").trim()||r,projectRoot:g,sessionId:o,executionId:a,skillName:i.skillName,profileFingerprint:l.fingerprint,rolloutMode:u,retrievalVersion:"r2.v1",createdAt:Date.now()});}return {hookSpecificOutput:{hookEventName:"UserPromptSubmit",permissionDecision:"allow",...e.length?{additionalContext:e.join(`
12
+ `)}:{}}}}if(process.argv[1]?.endsWith("user-prompt-submit")||process.argv[1]?.endsWith("user-prompt-submit.js")){let n=console.log.bind(console);console.log=console.error.bind(console),console.info=console.error.bind(console);let e="";process.stdin.setEncoding("utf8"),process.stdin.on("data",t=>{e+=t;}),process.stdin.on("end",async()=>{let t=await Qn(e.trim()||process.argv[2]||"");n(JSON.stringify(t)),process.exit(0);}),process.stdin.on("error",()=>{n(JSON.stringify({hookSpecificOutput:{hookEventName:"UserPromptSubmit",permissionDecision:"allow"}})),process.exit(0);}),setTimeout(()=>{n(JSON.stringify({hookSpecificOutput:{hookEventName:"UserPromptSubmit",permissionDecision:"allow"}})),process.exit(0);},3e4).unref();}export{Qn as handleUserPromptSubmit};
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "devflow",
3
3
  "description": "DevFlow — Developer Intelligence Platform: project context, code graph, knowledge base, memory engine, and workflow automation with 14 domain plugins",
4
- "version": "0.17.7",
4
+ "version": "0.18.0",
5
5
  "author": {
6
6
  "name": "DevFlow"
7
7
  },
@@ -19,7 +19,7 @@
19
19
  "WebFetch"
20
20
  ],
21
21
  "source": "core",
22
- "sourceVersion": "0.17.7",
22
+ "sourceVersion": "0.18.0",
23
23
  "requiresContext": true,
24
24
  "evidenceMode": "mixed",
25
25
  "skillPath": "skills/devflow:context/SKILL.md",
@@ -44,7 +44,7 @@
44
44
  "Explore"
45
45
  ],
46
46
  "source": "core",
47
- "sourceVersion": "0.17.7",
47
+ "sourceVersion": "0.18.0",
48
48
  "requiresContext": true,
49
49
  "evidenceMode": "mixed",
50
50
  "skillPath": "skills/devflow:graph/SKILL.md",
@@ -63,7 +63,7 @@
63
63
  "WebFetch"
64
64
  ],
65
65
  "source": "core",
66
- "sourceVersion": "0.17.7",
66
+ "sourceVersion": "0.18.0",
67
67
  "requiresContext": true,
68
68
  "evidenceMode": "mixed",
69
69
  "skillPath": "skills/devflow:knowledge/SKILL.md",
@@ -87,7 +87,7 @@
87
87
  "Explore"
88
88
  ],
89
89
  "source": "core",
90
- "sourceVersion": "0.17.7",
90
+ "sourceVersion": "0.18.0",
91
91
  "requiresContext": true,
92
92
  "evidenceMode": "mixed",
93
93
  "skillPath": "skills/devflow:memory/SKILL.md",
@@ -103,7 +103,7 @@
103
103
  ],
104
104
  "blockedNative": [],
105
105
  "source": "core",
106
- "sourceVersion": "0.17.7",
106
+ "sourceVersion": "0.18.0",
107
107
  "requiresContext": true,
108
108
  "evidenceMode": "mixed",
109
109
  "skillPath": "skills/devflow:workflow/SKILL.md",
@@ -1,6 +1,6 @@
1
- import {existsSync}from'node:fs';import {homedir}from'node:os';import {resolve,join}from'node:path';import {fileURLToPath}from'node:url';async function m(n=homedir()){let a=process.env.DEVFLOW_STATE_DIR??join(n,".devflow","global"),r=join(a,"devflow.db");if(!existsSync(r))return {gateCount:4,ruleCount:null,source:"fallback"};let e;try{let{DatabaseSync:u}=await import('node:sqlite');e=new u(r,{readOnly:!0});let t=e.prepare(`
1
+ import {existsSync}from'node:fs';import {homedir}from'node:os';import {resolve,join}from'node:path';import {fileURLToPath}from'node:url';import {getDevFlowStateRoot}from'@devflow-tools/sdk';async function f(n=homedir()){let a=join(getDevFlowStateRoot({homeDir:n}),"global"),r=join(a,"devflow.db");if(!existsSync(r))return {gateCount:4,ruleCount:null,source:"fallback"};let e;try{let{DatabaseSync:u}=await import('node:sqlite');e=new u(r,{readOnly:!0});let t=e.prepare(`
2
2
  SELECT COUNT(*) AS rule_count, COUNT(DISTINCT gate) AS gate_count
3
3
  FROM devflow_rules
4
4
  WHERE enabled = 1
5
- `).get();return {gateCount:Number(t?.gate_count??0),ruleCount:Number(t?.rule_count??0),source:"database"}}catch{return {gateCount:4,ruleCount:null,source:"fallback"}}finally{e?.close();}}process.argv[1]&&fileURLToPath(import.meta.url)===resolve(process.argv[1])&&process.stdout.write(`${JSON.stringify(await m())}
6
- `);export{m as readEnforcerSummary};
5
+ `).get();return {gateCount:Number(t?.gate_count??0),ruleCount:Number(t?.rule_count??0),source:"database"}}catch{return {gateCount:4,ruleCount:null,source:"fallback"}}finally{e?.close();}}process.argv[1]&&fileURLToPath(import.meta.url)===resolve(process.argv[1])&&process.stdout.write(`${JSON.stringify(await f())}
6
+ `);export{f as readEnforcerSummary};
@@ -1,6 +1,6 @@
1
- import {createConnection}from'node:net';import {getDaemonSocketPath}from'@devflow-tools/sdk';import {mkdirSync,appendFileSync}from'node:fs';import {homedir}from'node:os';import {join,dirname}from'node:path';import {openGlobalDevFlowDatabase}from'@devflow-tools/database';import {createHash}from'node:crypto';function b(e,t,n){try{let o=openGlobalDevFlowDatabase();try{o.insertEvent({kind:e,timestamp:Date.now(),duration:n,success:t.success!==!1,metadata:t});}finally{o.close();}}catch{}}var S=["4-Gate enforcement","memory prefetch cache","daemon-shared hook state"];function m(e){let t=N(e.input)??e.requestType;if(b("hook_daemon_request",{success:e.success,projectRoot:e.projectRoot,requestType:e.requestType,tool:t,attempts:e.attempts},e.durationMs),e.success)return;let n=Date.now(),o=v(e.input);try{let r=openGlobalDevFlowDatabase(void 0,{busyTimeoutMs:250});try{r.insertHookFallback({id:`hook-fallback:${createHash("sha256").update(`${e.projectRoot}\0${o.sessionId??""}\0${o.toolUseId??""}\0${e.requestType}\0${n}`).digest("hex").slice(0,24)}`,projectRoot:e.projectRoot,sessionId:o.sessionId,toolUseId:o.toolUseId,requestType:e.requestType,tool:t,reason:e.reason??"unknown",durationMs:e.durationMs,attempts:e.attempts,createdAt:n});}finally{r.close();}}catch{}try{let r=join(homedir(),".devflow","logs","hook-fallback",`${new Date(n).toISOString().slice(0,10)}.log`);mkdirSync(dirname(r),{recursive:!0,mode:448}),appendFileSync(r,`${JSON.stringify({ts:n,tool:t,requestType:e.requestType,projectRoot:e.projectRoot,reason:`daemon-${e.reason??"unknown"}`,durationMs:e.durationMs,attempts:e.attempts,bypassCountLost:!0,disabledFeatures:S})}
2
- `,{mode:384});}catch{}}function v(e){try{let t=JSON.parse(e);return {sessionId:typeof t.session_id=="string"?t.session_id:void 0,toolUseId:typeof t.tool_use_id=="string"?t.tool_use_id:void 0}}catch{return {}}}function N(e){try{let t=JSON.parse(e);return typeof t.tool_name=="string"&&t.tool_name?t.tool_name:null}catch{return null}}var d=process.env.CLAUDE_PROJECT_DIR||process.cwd(),q=getDaemonSocketPath(d),u=process.argv[2],h=process.argv[3],p=Number(process.env.DEVFLOW_HOOK_CLIENT_TIMEOUT_MS),F=Number.isFinite(p)&&p>0?p:1e3,f=Number(process.env.DEVFLOW_HOOK_CLIENT_RETRY_DELAY_MS),P=Number.isFinite(f)&&f>=0?f:100,g=2*1024*1024,y=u==="memory-snapshot"?2:1;async function L(){let e=h!==void 0?H(h):u==="memory-snapshot"?{input:"",truncated:false}:await j(),{input:t,truncated:n}=e,o=Date.now(),r="unknown";for(let a=0;a<y;a+=1){let s=await B(t,n);if(s.response!==null){if(x(s.response)){r="protocol";break}return m({projectRoot:d,requestType:u,input:t,durationMs:Date.now()-o,success:true,attempts:a+1}),process.stdout.write(`${s.response}
3
- `),0}r=s.reason??"unknown",a<y-1&&await G(P);}return process.env.DEVFLOW_HOOK_CLIENT_SUPPRESS_FALLBACK_LOG!=="1"&&m({projectRoot:d,requestType:u,input:t,durationMs:Date.now()-o,success:false,attempts:y,reason:r}),1}function x(e){try{let t=JSON.parse(e);return !!(t&&typeof t=="object"&&!Array.isArray(t)&&typeof t.error=="string")}catch{return true}}function B(e,t){return new Promise(n=>{let o=createConnection(q),r=false,a="",s=(c,l)=>{r||(r=true,clearTimeout(i),o.destroy(),n({response:c,reason:l}));},i=setTimeout(()=>s(null,"timeout"),F);o.setEncoding("utf8"),o.on("connect",()=>{o.write(`${JSON.stringify({type:"hello",rootPath:d})}
1
+ import {createConnection}from'node:net';import {getDaemonSocketPath,getDevFlowStateRoot}from'@devflow-tools/sdk';import {mkdirSync,appendFileSync}from'node:fs';import {join,dirname}from'node:path';import {openGlobalDevFlowDatabase}from'@devflow-tools/database';import {createHash}from'node:crypto';function b(e,t,n){try{let o=openGlobalDevFlowDatabase();try{o.insertEvent({kind:e,timestamp:Date.now(),duration:n,success:t.success!==!1,metadata:t});}finally{o.close();}}catch{}}var I=["4-Gate enforcement","memory prefetch cache","daemon-shared hook state"];function p(e){let t=N(e.input)??e.requestType;if(b("hook_daemon_request",{success:e.success,projectRoot:e.projectRoot,requestType:e.requestType,tool:t,attempts:e.attempts},e.durationMs),e.success)return;let n=Date.now(),o=v(e.input);try{let r=openGlobalDevFlowDatabase(void 0,{busyTimeoutMs:250});try{r.insertHookFallback({id:`hook-fallback:${createHash("sha256").update(`${e.projectRoot}\0${o.sessionId??""}\0${o.toolUseId??""}\0${e.requestType}\0${n}`).digest("hex").slice(0,24)}`,projectRoot:e.projectRoot,sessionId:o.sessionId,toolUseId:o.toolUseId,requestType:e.requestType,tool:t,reason:e.reason??"unknown",durationMs:e.durationMs,attempts:e.attempts,createdAt:n});}finally{r.close();}}catch{}try{let r=join(getDevFlowStateRoot(),"logs","hook-fallback",`${new Date(n).toISOString().slice(0,10)}.log`);mkdirSync(dirname(r),{recursive:!0,mode:448}),appendFileSync(r,`${JSON.stringify({ts:n,tool:t,requestType:e.requestType,projectRoot:e.projectRoot,reason:`daemon-${e.reason??"unknown"}`,durationMs:e.durationMs,attempts:e.attempts,bypassCountLost:!0,disabledFeatures:I})}
2
+ `,{mode:384});}catch{}}function v(e){try{let t=JSON.parse(e);return {sessionId:typeof t.session_id=="string"?t.session_id:void 0,toolUseId:typeof t.tool_use_id=="string"?t.tool_use_id:void 0}}catch{return {}}}function N(e){try{let t=JSON.parse(e);return typeof t.tool_name=="string"&&t.tool_name?t.tool_name:null}catch{return null}}var d=process.env.CLAUDE_PROJECT_DIR||process.cwd(),q=getDaemonSocketPath(d),u=process.argv[2],h=process.argv[3],m=Number(process.env.DEVFLOW_HOOK_CLIENT_TIMEOUT_MS),F=Number.isFinite(m)&&m>0?m:1e3,f=Number(process.env.DEVFLOW_HOOK_CLIENT_RETRY_DELAY_MS),P=Number.isFinite(f)&&f>=0?f:100,g=2*1024*1024,y=u==="memory-snapshot"?2:1;async function L(){let e=h!==void 0?H(h):u==="memory-snapshot"?{input:"",truncated:false}:await j(),{input:t,truncated:n}=e,o=Date.now(),r="unknown";for(let a=0;a<y;a+=1){let s=await B(t,n);if(s.response!==null){if(x(s.response)){r="protocol";break}return p({projectRoot:d,requestType:u,input:t,durationMs:Date.now()-o,success:true,attempts:a+1}),process.stdout.write(`${s.response}
3
+ `),0}r=s.reason??"unknown",a<y-1&&await G(P);}return process.env.DEVFLOW_HOOK_CLIENT_SUPPRESS_FALLBACK_LOG!=="1"&&p({projectRoot:d,requestType:u,input:t,durationMs:Date.now()-o,success:false,attempts:y,reason:r}),1}function x(e){try{let t=JSON.parse(e);return !!(t&&typeof t=="object"&&!Array.isArray(t)&&typeof t.error=="string")}catch{return true}}function B(e,t){return new Promise(n=>{let o=createConnection(q),r=false,a="",s=(c,l)=>{r||(r=true,clearTimeout(i),o.destroy(),n({response:c,reason:l}));},i=setTimeout(()=>s(null,"timeout"),F);o.setEncoding("utf8"),o.on("connect",()=>{o.write(`${JSON.stringify({type:"hello",rootPath:d})}
4
4
  `);let c=$(e,t);if(!c){s(null,"protocol");return}o.write(`${JSON.stringify(c)}
5
5
  `);}),o.on("data",c=>{a+=c;let l=a.indexOf(`
6
6
  `);if(l<0)return;let _=a.slice(0,l).trim();s(_||null);}),o.on("error",()=>s(null,"unreachable")),o.on("close",()=>s(null,"unreachable"));})}function $(e,t){let n=t?{truncated:true}:{};return u==="stop"?{type:"stop",input:e,...n}:u==="memory-snapshot"?{type:"memory-snapshot"}:["session-start","session-end","post-tool-use","post-tool-use-failure","pre-tool-use","user-prompt-submit","pre-compact"].includes(u)?{type:u,input:e,...n}:null}function j(){return new Promise(e=>{let t=[],n=0,o=false;process.stdin.on("data",r=>{let a=Buffer.isBuffer(r)?r:Buffer.from(r),s=g-n;if(s>0){let i=a.subarray(0,s);t.push(i),n+=i.length;}a.length>s&&(o=true);}),process.stdin.on("end",()=>e({input:Buffer.concat(t).toString("utf8"),truncated:o})),process.stdin.on("error",()=>e({input:"",truncated:false}));})}function H(e){let t=Buffer.from(e);return t.length<=g?{input:e,truncated:false}:{input:t.subarray(0,g).toString("utf8"),truncated:true}}function G(e){return new Promise(t=>setTimeout(t,e))}L().then(e=>process.exit(e)).catch(()=>process.exit(1));