@kodax-ai/kodax 0.7.78 → 0.7.80

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 (126) hide show
  1. package/CHANGELOG.md +3556 -3197
  2. package/README.md +371 -277
  3. package/README_CN.md +295 -215
  4. package/config-templates/config.example.jsonc +24 -2
  5. package/config-templates/integrations/a2a.example.jsonc +23 -7
  6. package/dist/builtin/skill-creator/scripts/aggregate-benchmark.js +2 -1
  7. package/dist/builtin/skill-creator/scripts/analyze-benchmark.d.ts +1 -0
  8. package/dist/builtin/skill-creator/scripts/analyze-benchmark.js +4 -3
  9. package/dist/builtin/skill-creator/scripts/compare-runs.d.ts +1 -0
  10. package/dist/builtin/skill-creator/scripts/compare-runs.js +4 -3
  11. package/dist/builtin/skill-creator/scripts/generate-review.js +2 -1
  12. package/dist/builtin/skill-creator/scripts/grade-evals.d.ts +1 -0
  13. package/dist/builtin/skill-creator/scripts/grade-evals.js +4 -3
  14. package/dist/builtin/skill-creator/scripts/improve-description.js +2 -1
  15. package/dist/builtin/skill-creator/scripts/init-skill.d.ts +1 -0
  16. package/dist/builtin/skill-creator/scripts/init-skill.js +4 -3
  17. package/dist/builtin/skill-creator/scripts/install-skill.d.ts +1 -0
  18. package/dist/builtin/skill-creator/scripts/install-skill.js +4 -3
  19. package/dist/builtin/skill-creator/scripts/package-skill.d.ts +1 -0
  20. package/dist/builtin/skill-creator/scripts/package-skill.js +4 -3
  21. package/dist/builtin/skill-creator/scripts/quick-validate.d.ts +1 -0
  22. package/dist/builtin/skill-creator/scripts/quick-validate.js +4 -3
  23. package/dist/builtin/skill-creator/scripts/run-eval.d.ts +1 -0
  24. package/dist/builtin/skill-creator/scripts/run-eval.js +4 -3
  25. package/dist/builtin/skill-creator/scripts/run-loop.js +2 -1
  26. package/dist/builtin/skill-creator/scripts/run-trigger-eval.js +2 -1
  27. package/dist/builtin/skill-creator/scripts/utils.d.ts +3 -0
  28. package/dist/builtin/skill-creator/scripts/utils.js +5 -1
  29. package/dist/chunks/agent-5PHGNFW3.js +2 -0
  30. package/dist/chunks/argument-completer-FXRZFMTC.js +2 -0
  31. package/dist/chunks/chunk-6UENDY33.js +89 -0
  32. package/dist/chunks/{chunk-6FOJVETH.js → chunk-BWX4YZX3.js} +7 -7
  33. package/dist/chunks/chunk-CDCCTM5I.js +278 -0
  34. package/dist/chunks/chunk-CEB5FDND.js +810 -0
  35. package/dist/chunks/{chunk-2CFHBKRE.js → chunk-E7C4DRD2.js} +2 -2
  36. package/dist/chunks/chunk-EVXIJPZ6.js +218 -0
  37. package/dist/chunks/chunk-FQ7NVMSU.js +319 -0
  38. package/dist/chunks/chunk-GC4JBMBS.js +385 -0
  39. package/dist/chunks/{chunk-Z3KFRTSB.js → chunk-HTVLCHWH.js} +1 -1
  40. package/dist/chunks/chunk-IHPH3444.js +655 -0
  41. package/dist/chunks/{chunk-YAZQTC2L.js → chunk-KHEFUT6O.js} +1 -1
  42. package/dist/chunks/{chunk-7OEBJGHK.js → chunk-PMKAG4SZ.js} +1 -1
  43. package/dist/chunks/chunk-RPF5RGWZ.js +479 -0
  44. package/dist/chunks/{chunk-UID7BLAB.js → chunk-RXXKDR6Y.js} +1 -1
  45. package/dist/chunks/chunk-T5U4OP2N.js +292 -0
  46. package/dist/chunks/chunk-TRNAWSXP.js +123 -0
  47. package/dist/chunks/chunk-UZSHBQER.js +30 -0
  48. package/dist/chunks/{chunk-TQDBTTIM.js → chunk-VECRQTSD.js} +44 -44
  49. package/dist/chunks/compaction-config-6J6XCBJS.js +2 -0
  50. package/dist/chunks/{construction-bootstrap-VQLQGWPY.js → construction-bootstrap-KPCAE3VN.js} +1 -1
  51. package/dist/chunks/dist-RWEVZOFK.js +2 -0
  52. package/dist/chunks/{dist-BFT5YIGU.js → dist-WWL2DNIJ.js} +1 -1
  53. package/dist/chunks/host-OGS2R5J4.js +2 -0
  54. package/dist/chunks/run-manager-2YMM3BOT.js +2 -0
  55. package/dist/chunks/{utils-SID4HW2Q.js → utils-2YHRUZYC.js} +1 -1
  56. package/dist/index.d.ts +21 -20
  57. package/dist/index.js +4 -4
  58. package/dist/kodax_bootstrap.js +2 -1
  59. package/dist/kodax_cli.js +1850 -1476
  60. package/dist/kodax_resume.js +570 -34
  61. package/dist/provider-capabilities.json +85 -50
  62. package/dist/runtime-worker.js +1737 -1369
  63. package/dist/sandbox-workspace-session.js +285 -19
  64. package/dist/sdk-a2a.d.ts +19 -13
  65. package/dist/sdk-a2a.js +8 -8
  66. package/dist/sdk-agent.d.ts +80 -150
  67. package/dist/sdk-agent.js +1 -1
  68. package/dist/sdk-coding.d.ts +186 -66
  69. package/dist/sdk-coding.js +1 -1
  70. package/dist/sdk-experimental-memory.d.ts +3 -3
  71. package/dist/sdk-experimental-memory.js +1 -1
  72. package/dist/sdk-llm.d.ts +7 -7
  73. package/dist/sdk-llm.js +1 -1
  74. package/dist/sdk-mcp.d.ts +1 -1
  75. package/dist/sdk-mcp.js +1 -1
  76. package/dist/sdk-media.d.ts +1 -1
  77. package/dist/sdk-media.js +1 -1
  78. package/dist/sdk-repl.d.ts +31 -213
  79. package/dist/sdk-repl.js +2 -2
  80. package/dist/sdk-runtime.d.ts +230 -31
  81. package/dist/sdk-runtime.js +1 -1
  82. package/dist/sdk-sandbox.js +1 -1
  83. package/dist/sdk-session.d.ts +8 -8
  84. package/dist/sdk-session.js +1 -1
  85. package/dist/sdk-skills.js +1 -1
  86. package/dist/semantic-worker.js +283 -18
  87. package/dist/types-chunks/{base.d-4e74xDdy.d.ts → base.d-DxG0m09Z.d.ts} +1 -1
  88. package/dist/types-chunks/{bash-prefix-extractor.d-uAe2Oqda.d.ts → bash-prefix-extractor.d-DStqKIlu.d.ts} +31 -8
  89. package/dist/types-chunks/{capability-learning.d-CVsdHw4j.d.ts → capability-learning.d-iPSiAmc_.d.ts} +1 -1
  90. package/dist/types-chunks/{capsule.d-BlSv9l3V.d.ts → capsule.d-BuFJaYxA.d.ts} +14 -21
  91. package/dist/types-chunks/{types.d-BA-Jwpfs.d.ts → controller.d-C2aHqzHj.d.ts} +344 -11
  92. package/dist/types-chunks/{guardrail.d-CXDYRgZ3.d.ts → guardrail.d-DM-OK0m3.d.ts} +187 -116
  93. package/dist/types-chunks/{history-retrieval.d-DtCy7x64.d.ts → history-retrieval.d-DImTKgO6.d.ts} +16 -3
  94. package/dist/types-chunks/{oauth-login.d-Bgb4rdLN.d.ts → oauth-login.d-6i-vidxv.d.ts} +6 -2
  95. package/dist/types-chunks/{public-api.d-B3AohsxN.d.ts → public-api.d-CewTvUKV.d.ts} +335 -38
  96. package/dist/types-chunks/{repl.d-Ie_ZXb_U.d.ts → repl.d-DvXQtgr7.d.ts} +5 -5
  97. package/dist/types-chunks/{resolver.d-iAQ9ocLB.d.ts → resolver.d-C9IW4fmU.d.ts} +5 -2
  98. package/dist/types-chunks/{run-manager.d-D1twIhF9.d.ts → run-manager.d-C6ahvZqK.d.ts} +1 -1
  99. package/dist/types-chunks/{sdk-session-DB9KksIx.d.ts → sdk-session-C59RUrri.d.ts} +3 -3
  100. package/dist/types-chunks/shell-command-sets.d-Dp4UvPLL.d.ts +297 -0
  101. package/dist/types-chunks/{side-query.d-DTuLPcC5.d.ts → side-query.d-CP1LiRiH.d.ts} +8 -2
  102. package/dist/types-chunks/{types-D3g6XUQr.d.ts → types-Bf3Y3mW-.d.ts} +1 -1
  103. package/dist/types-chunks/{types.d-BH0ZkTGf.d.ts → types.d-BzpPDBPV.d.ts} +2 -2
  104. package/dist/types-chunks/{types.d-DIpZJKUl.d.ts → types.d-CgrXrFrq.d.ts} +16 -2
  105. package/dist/types-chunks/{types.d-DVDTIfB_.d.ts → types.d-yuJzE82x.d.ts} +4 -4
  106. package/dist/types-chunks/{utils.d-CVp6bFl9.d.ts → utils.d-BpACJmzt.d.ts} +24 -6
  107. package/docs/SDK_EMBEDDER_GUIDE.md +1148 -598
  108. package/package.json +6 -3
  109. package/dist/chunks/agent-ASP4MS3X.js +0 -2
  110. package/dist/chunks/argument-completer-JYQ7FX3W.js +0 -2
  111. package/dist/chunks/chunk-35PPHOQ2.js +0 -292
  112. package/dist/chunks/chunk-43QNNDHR.js +0 -29
  113. package/dist/chunks/chunk-5GO6FH7L.js +0 -458
  114. package/dist/chunks/chunk-5NDCSFOP.js +0 -78
  115. package/dist/chunks/chunk-6XM4B6K2.js +0 -48
  116. package/dist/chunks/chunk-6YZUE6NC.js +0 -240
  117. package/dist/chunks/chunk-KQLQYHWU.js +0 -386
  118. package/dist/chunks/chunk-NXO6GWSY.js +0 -46
  119. package/dist/chunks/chunk-T2XZTLYE.js +0 -316
  120. package/dist/chunks/chunk-VAT2QYXM.js +0 -765
  121. package/dist/chunks/chunk-YVRYHC4C.js +0 -655
  122. package/dist/chunks/compaction-config-BQSSIWK5.js +0 -2
  123. package/dist/chunks/dist-PCFE24YP.js +0 -2
  124. package/dist/chunks/host-UTFXCYYM.js +0 -2
  125. package/dist/chunks/run-manager-PJU3WIFJ.js +0 -2
  126. package/dist/types-chunks/guardrail.d-BRE_ErEj.d.ts +0 -156
@@ -0,0 +1,218 @@
1
+ // @kodax-ai/kodax — bundled distribution. See docs/ADR.md ADR-022 + ADR-024.
2
+ import{a as Bn}from"./chunk-6UENDY33.js";import{a as o}from"./chunk-ONUPGMER.js";function Ic(e){let t=0;for(let n=0;n<e.length;n+=1){let r=e.charCodeAt(n);if(t=r>=48&&r<=57||r>=65&&r<=90||r>=97&&r<=122||r===43||r===45||r===47||r===61||r===95?t+1:0,t>=512)return!0}return!1}o(Ic,"looksLikeDenseEncodedData");function Sc(e){if(!e)return 0;let t=e.length,n=Buffer.byteLength(e,"utf8");return Math.ceil((3*n-t)/8)}o(Sc,"estimateMultilingualTokens");function ge(e){if(!e)return 0;let t=Sc(e),n=Ic(e)?e.length*.75:0;return Math.ceil(Math.max(t,n))}o(ge,"countTextTokens");function _c(e){let t=4;if(typeof e.content=="string")t+=ge(e.content);else for(let n of e.content)n.type==="text"?t+=ge(n.text):n.type==="tool_use"?(t+=ge(n.name),t+=ge(JSON.stringify(n.input))):n.type==="tool_result"?(t+=4,t+=typeof n.content=="string"?ge(n.content):n.content.reduce((r,i)=>r+(i.type==="text"?ge(i.text):1500),0)):n.type==="thinking"?t+=ge(n.thinking):n.type==="image"&&(t+=1500);return t}o(_c,"countMessageTokens");var Ki=new WeakMap;function jw(e){let t=0;for(let n of e){let r=Ki.get(n);if(r!==void 0){t+=r;continue}let i=_c(n);Ki.set(n,i),t+=i}return t}o(jw,"estimateTokens");function Pw(e){return ge(e)}o(Pw,"countTokens");var Dt=[];function Fw(e){let t={id:Symbol("kodax-diagnostic-sink"),sink:e};Dt.push(t);let n=!1;return()=>{if(n)return;n=!0;let r=Dt.findIndex(i=>i.id===t.id);r>=0&&Dt.splice(r,1)}}o(Fw,"setKodaXDiagnosticSink");function H(e){let t=Bn(e),n=Dt.at(-1)?.sink;if(n){try{n(t)}catch{}return}if(process.env.KODAX_DIAGNOSTICS_STDERR==="1")try{process.stderr.write(`${Rc(t)}
3
+ `)}catch{}}o(H,"emitKodaXDiagnostic");function Rc(e){let t=Bn(e),n=xc(t.detail);return`[${t.source}] ${t.level}: ${t.message}${n?` ${n}`:""}`}o(Rc,"formatKodaXDiagnostic");function xc(e){if(e===void 0)return"";if(e instanceof Error)return e.stack??e.message;if(typeof e=="string")return e;try{return JSON.stringify(e)}catch{return String(e)}}o(xc,"formatDiagnosticDetail");import{mkdirSync as Ec}from"node:fs";import{homedir as Hn}from"node:os";import{isAbsolute as Ac,normalize as jc,resolve as qn,sep as Ui}from"node:path";import{join as Tt}from"node:path";var Pc=".kodax",$c="KODAX_HOME",zn;function Uw(e){zn=e}o(Uw,"setAgentConfigHome");function Bi(){if(zn)return zn;let e=process.env[$c];return e&&e.length>0?e:Tt(Hn(),Pc)}o(Bi,"getAgentConfigHome");function O(...e){return Tt(Bi(),...e)}o(O,"getAgentConfigPath");function Bw(e,t){let n=o(a=>{let c=jc(qn(a));return process.platform==="win32"?c.toLowerCase():c},"comparable"),r=n(e),i=n(t),s=i.endsWith(Ui)?i:`${i}${Ui}`;return r===i||r.startsWith(s)}o(Bw,"isPathInsideDirectory");function Hw(e,t){let n=e==="~"?Hn():e.startsWith("~/")||e.startsWith("~\\")?Tt(Hn(),e.slice(2)):e;return Ac(n)?qn(n):qn(t,n)}o(Hw,"resolveExecutionPath");function qw(e){if(typeof e!="string"||!/^[a-z][a-z0-9-]{1,31}$/.test(e))throw new Error(`getAppDataDir: invalid appId ${JSON.stringify(e)}. Must match /^[a-z][a-z0-9-]{1,31}$/ (lowercase kebab, 2\u201332 chars).`);if(e==="kodax"||e.startsWith("kodax-"))throw new Error(`getAppDataDir: appId ${JSON.stringify(e)} is reserved (the 'kodax' / 'kodax-*' prefix is reserved for first-party use).`);let t=Tt(Bi(),"apps",e);return Ec(t,{recursive:!0}),t}o(qw,"getAppDataDir");import{createHash as Hi}from"node:crypto";var qi=["tenantId","workspaceId","userId","agentId","projectId","sessionId"];function Mt(e,t){return qi.every(n=>t[n]===void 0||t[n]===e[n])}o(Mt,"matchesMemoryApplicability");function x(e,t){if(t.length===0)throw new Error(`${e} identity must not be empty`);return Hi("sha256").update(`${e}\0${t}`).digest("hex")}o(x,"hashMemoryIdentityComponent");function Wn(e){let t=qi.filter(n=>e[n]!==void 0).map(n=>`${n}=${e[n]}`).join("\0");return Hi("sha256").update(t).digest("hex")}o(Wn,"memoryApplicabilityFingerprint");var Ot="f275-v0.7.77.1";import{createHash as Cc}from"node:crypto";import{execSync as Lc}from"node:child_process";import*as q from"node:path";function Ne(e){return Fc(e).trim().replace(/^ssh:\/\//,"").replace(/^https?:\/\//,"").replace(/^git@/,"").replace(/\.git$/,"").replace(/[:@/\\]+/g,"-").replace(/^-+|-+$/g,"").toLowerCase()}o(Ne,"sanitizeProjectKey");function Fc(e){let t=e.trim();if(!/^[a-z][a-z0-9+.-]*:\/\//i.test(t))return t;try{let n=new URL(t);return`${n.hostname}${n.port.length>0?`:${n.port}`:""}${n.pathname}`}catch{return t.replace(/^([a-z][a-z0-9+.-]*:\/\/)[^/@]+@/i,"$1").replace(/[?#].*$/,"")}}o(Fc,"remoteWithoutCredentials");function De(e){let t=q.resolve(e).toLowerCase();return Cc("sha256").update(t).digest("hex").slice(0,16)}o(De,"hashCwd");function Te(e){try{let n=Lc("git config --get remote.origin.url",{cwd:e,encoding:"utf-8",stdio:["ignore","pipe","ignore"],timeout:1e3,windowsHide:!0}).trim();return n.length>0?n:void 0}catch{return}}o(Te,"tryGitRemote");function Kt(e){let t=Te(e),n=t?Ne(t):`local-${De(e)}`;return O("projects",n,"memory")}o(Kt,"resolveMemoryRoot");function Nc(e){return q.join(Kt(e),"MEMORY.md")}o(Nc,"resolveMemoryEntrypoint");function _e(e,t){let n=t==="project"?"projectId":t==="workspace"?"workspaceId":t==="user"?"userId":"agentId",r=e[n];if(r===void 0||r.length===0)throw new Error(`${n} is required for ${t} memory`);let i=["memory-scopes",x("tenant",e.tenantId),t,x(t,r)];return e.configHome===void 0?O(...i):q.join(e.configHome,...i)}o(_e,"resolveScopedMemoryRoot");function Dc(e){let t=Jn(e),n=Jn(O("memory-scopes"));if(t.startsWith(n+q.sep)){let a=t.slice(n.length+1).split(q.sep);return a.length>=4&&/^[0-9a-f]{64}$/.test(a[0]??"")&&["project","workspace","agent","user"].includes(a[1]??"")&&/^[0-9a-f]{64}$/.test(a[2]??"")}let r=Jn(O("projects"));if(!t.startsWith(r+q.sep))return!1;let s=t.slice(r.length+1).split(q.sep);return s.length>=3&&s[1]==="memory"}o(Dc,"isAutoManagedMemoryFile");function Jn(e){let t=q.resolve(e);return process.platform==="win32"?t.toLowerCase():t}o(Jn,"comparablePath");function Tc(e){let t=q.basename(e,".md").toLowerCase();if(t.startsWith("user_")||t==="user")return"user";if(t.startsWith("feedback_")||t==="feedback")return"feedback";if(t.startsWith("project_")||t==="project")return"project";if(t.startsWith("reference_")||t==="reference")return"reference"}o(Tc,"parseMemoryTypeFromFilename");var Mc=/^---\r?\n([\s\S]*?)\r?\n---\r?\n?/;function zi(e){if(e==="user"||e==="feedback"||e==="project"||e==="reference")return e}o(zi,"parseMemoryType");function we(e){let t=Mc.exec(e);if(!t)return{frontmatter:{name:void 0,description:void 0,type:void 0},body:e};let n=t[1],r=e.slice(t[0].length).replace(/^\r?\n+/,""),i=Wi(n);return{frontmatter:{name:typeof i.name=="string"?i.name:void 0,description:typeof i.description=="string"?i.description:void 0,type:zi(i.type)},body:r}}o(we,"parseMemoryFile");function Wi(e){let t={},n=e.split(/\r?\n/);for(let r of n){if(!r.trim()||r.trim().startsWith("#"))continue;let i=r.indexOf(":");if(i===-1)continue;let s=r.slice(0,i).trim();if(!/^[A-Za-z_][A-Za-z0-9_-]*$/.test(s))continue;let a=r.slice(i+1).trim(),c=Oc(a);c!==void 0&&(t[s]=c)}return t}o(Wi,"parseScalarFields");function Oc(e){if(e.length!==0){if(e.length>=2){let t=e.charAt(0),n=e.charAt(e.length-1);if(t==='"'&&n==='"'||t==="'"&&n==="'")return e.slice(1,-1)}return e}}o(Oc,"unquote");var Kc=200,Uc=25e3;function Bc(e){let t=e.trim(),n=t.length===0?[]:t.split(`
4
+ `),r=n.length,i=Buffer.byteLength(t,"utf-8"),s=r>200,a=i>25e3;if(!s&&!a)return{content:t,lineCount:r,byteCount:i,wasLineTruncated:s,wasByteTruncated:a};let c=s?n.slice(0,200).join(`
5
+ `):t;return Buffer.byteLength(c,"utf-8")>25e3&&(c=qc(c,25e3)),{content:c+`
6
+
7
+ `+Hc({lineCount:r,byteCount:i,wasLineTruncated:s,wasByteTruncated:a}),lineCount:r,byteCount:i,wasLineTruncated:s,wasByteTruncated:a}}o(Bc,"truncateEntrypointContent");function Hc(e){let{lineCount:t,byteCount:n,wasLineTruncated:r,wasByteTruncated:i}=e;return`> WARNING: MEMORY.md is ${i&&!r?`${Vn(n)} (limit: ${Vn(25e3)}) \u2014 index entries are too long`:r&&!i?`${t} lines (limit: 200)`:`${t} lines and ${Vn(n)}`}. Only part of it was loaded. Keep index entries to one line under ~200 chars; move detail into topic files.`}o(Hc,"formatTruncationWarning");function qc(e,t){let n=Buffer.from(e,"utf-8");if(n.length<=t)return e;let r=10,i=-1;for(let s=t-1;s>=0;s--)if(n[s]===r){i=s;break}return i>0?n.subarray(0,i).toString("utf-8"):n.subarray(0,t).toString("utf-8")}o(qc,"sliceToByteCap");function Vn(e){return e<1e3?`${e} B`:`${(e/1e3).toFixed(1)} KB`}o(Vn,"formatFileSize");import zc from"path";var et=new Set;function Ji(e){let t=e.trim();if(!t)throw new Error("Plugin skill path cannot be empty.");return zc.resolve(t)}o(Ji,"normalizePluginSkillPath");function Wc(e){let t=Ji(e);return et.add(t),()=>{et.delete(t)}}o(Wc,"registerPluginSkillPath");function Jc(e){return et.delete(Ji(e))}o(Jc,"unregisterPluginSkillPath");function Yn(){return Array.from(et.values())}o(Yn,"listPluginSkillPaths");function Vc(){et.clear()}o(Vc,"clearPluginSkillPaths");import{homedir as Yc}from"os";import Me from"path";import{fileURLToPath as Gc}from"url";import{dirname as Xc}from"path";var Qc=Gc(import.meta.url),Zc=Xc(Qc);function ed(){return process.env.KODAX_BUNDLED==="true"?Me.join(Me.dirname(process.execPath),"builtin"):Me.join(Zc,"builtin")}o(ed,"resolveBuiltinPath");function Gn(e){let t=Yc();return{projectPaths:e?[Me.join(e,".kodax","skills")]:[],userPaths:[Me.join(t,".kodax","skills"),Me.join(t,".agents","skills")],pluginPaths:Yn(),builtinPath:ed()}}o(Gn,"getDefaultSkillPaths");function Xn(e){let t=[];for(let n of e.projectPaths)t.push({path:n,source:"project"});for(let n of e.userPaths)t.push({path:n,source:"user"});for(let n of e.pluginPaths)t.push({path:n,source:"plugin"});return t.push({path:e.builtinPath,source:"builtin"}),t}o(Xn,"getSkillPathsFlat");import{readFile as Qn,readdir as od}from"fs/promises";import{join as ye,relative as sd}from"path";import Vi from"yaml";var td=["SessionStart","UserPromptSubmit","PreToolUse","PostToolUse","Stop","SubagentStop","Notification"];function nd(e){let t=e.split(`
8
+ `),n=[];for(let r of t){let i=r.indexOf(":");if(i>0){let s=r.slice(0,i).trim(),a=r.slice(i+1).trim();if(a.includes(":")&&!a.startsWith('"')&&!a.startsWith("'")&&!a.startsWith("[")&&!a.startsWith("|")&&!a.startsWith(">")){n.push(`${s}: |-`),n.push(` ${a}`);continue}}n.push(r)}return n.join(`
9
+ `)}o(nd,"sanitizeYaml");function Yi(e,t={}){let n=e.replace(/^/,"").replace(/\r\n/g,`
10
+ `).replace(/\r/g,`
11
+ `).trimStart();if(!n.startsWith(`---
12
+ `)){if(t.throwOnMissing)throw new Error("Invalid markdown: missing YAML frontmatter");return[null,e]}let r=n.indexOf(`
13
+ ---
14
+ `,4);if(r===-1){let c=n.indexOf(`
15
+ ---`,4);c!==-1&&c===n.length-4&&(r=c)}if(r===-1){if(t.throwOnMissing)throw new Error("Invalid markdown: unclosed YAML frontmatter");return[null,e]}let i=n.slice(4,r),s=n.slice(r+5).trim(),a;try{a=Vi.parse(i)??{}}catch{a=Vi.parse(nd(i))??{}}if(a==null||typeof a!="object"||Array.isArray(a)){if(t.throwOnMissing)throw new Error("Invalid markdown: YAML frontmatter must be an object");return[null,s]}return[a,s]}o(Yi,"parseYamlFrontmatter");function Gi(e){if(typeof e=="string"){let t=e.trim();return t.length>0?t:void 0}if(Array.isArray(e)){let t=e.map(n=>String(n).trim()).filter(n=>n.length>0);return t.length>0?t.join(", "):void 0}}o(Gi,"normalizeAllowedToolsString");function rd(e){if(typeof e=="string"){let t=e.trim();return t?{command:t}:void 0}if(e&&typeof e=="object"&&!Array.isArray(e)){let t=e,n=typeof t.command=="string"?t.command.trim():"";if(!n)return;let r=typeof t.matcher=="string"&&t.matcher.trim()?t.matcher.trim():void 0;return{command:n,matcher:r}}}o(rd,"normalizeYamlHookEntry");function id(e){if(e==null)return;let n=(Array.isArray(e)?e:[e]).map(r=>rd(r)).filter(r=>r!==void 0);return n.length>0?n:void 0}o(id,"normalizeYamlHookEntryList");function Xi(e){if(!e||typeof e!="object"||Array.isArray(e))return;let t=e,n={};for(let r of td){let i=id(t[r]);i&&(n[r]=i)}return Object.keys(n).length>0?n:void 0}o(Xi,"normalizeYamlHookMap");function Zn(e){let[t,n]=Yi(e,{throwOnMissing:!0});if(!t)throw new Error("Invalid SKILL.md: YAML frontmatter must be an object");if(!t.name||typeof t.name!="string")throw new Error('Invalid SKILL.md: missing required "name" field');if(!t.description||typeof t.description!="string")throw new Error('Invalid SKILL.md: missing required "description" field');return{frontmatter:{name:t.name,description:t.description,disableModelInvocation:t["disable-model-invocation"]===!0,userInvocable:t["user-invocable"]!==!1,allowedTools:Gi(t["allowed-tools"]),context:t.context==="fork"?"fork":void 0,agent:typeof t.agent=="string"?t.agent:void 0,argumentHint:typeof t["argument-hint"]=="string"?t["argument-hint"]:void 0,model:typeof t.model=="string"?t.model:void 0,hooks:Xi(t.hooks),license:typeof t.license=="string"?t.license:void 0,compatibility:typeof t.compatibility=="string"?t.compatibility:void 0,metadata:t.metadata&&typeof t.metadata=="object"&&!Array.isArray(t.metadata)?t.metadata:void 0},body:n}}o(Zn,"parseSkillMarkdown");async function Ut(e,t){let n=ye(e,"SKILL.md");try{let r=await Qn(n,"utf-8"),{frontmatter:i}=Zn(r);return{name:i.name,description:i.description,userInvocable:i.userInvocable??!0,argumentHint:i.argumentHint,path:e,source:t,disableModelInvocation:i.disableModelInvocation??!1}}catch(r){return H({source:"agent:skills",level:"error",message:`Failed to load skill metadata from ${e}.`,detail:r}),null}}o(Ut,"loadSkillMetadata");async function tt(e,t){let n=ye(e,"SKILL.md");try{let r=await Qn(n,"utf-8"),{frontmatter:i,body:s}=Zn(r),[a,c,d,l,u]=await Promise.all([Oe(ye(e,"scripts")),Oe(ye(e,"references")),Oe(ye(e,"assets")),Oe(ye(e,"templates")),Oe(ye(e,"resources"))]);return{...i,path:e,skillFilePath:n,content:s,rawContent:s,loaded:!0,source:t,...a.length>0&&{scripts:a},...c.length>0&&{references:c},...d.length>0&&{assets:d},...l.length>0&&{templates:l},...u.length>0&&{resources:u}}}catch(r){return H({source:"agent:skills",level:"error",message:`Failed to load skill from ${e}.`,detail:r}),null}}o(tt,"loadFullSkill");async function Oe(e,t=e){let n=[];try{let r=await od(e,{withFileTypes:!0});r.sort((i,s)=>i.name.localeCompare(s.name));for(let i of r){let s=ye(e,i.name);if(i.isDirectory()){n.push(...await Oe(s,t));continue}i.isFile()&&n.push({name:i.name,path:s,relativePath:sd(t,s).replace(/\\/g,"/")})}}catch{}return n}o(Oe,"loadSkillFiles");async function ad(e){if(e.content)return e.content;let t=await Qn(e.path,"utf-8");return e.content=t,t}o(ad,"loadSkillFileContent");var cd="KODAX_LEARNING_DEFAULT_CONFIDENCE",dd="KODAX_LEARNING_CONFIDENCE_FLOOR";function Qi(e,t){let n=process.env[e];if(n===void 0||n.trim()==="")return t;let r=Number(n);return!Number.isFinite(r)||r<0||r>1?t:r}o(Qi,"readConfidenceEnv");function ld(){return Qi(cd,.5)}o(ld,"defaultConfidence");function ud(){return Qi(dd,.3)}o(ud,"activeSuggestionConfidenceFloor");function er(e,t){return{destination:"discard",proposalId:e,reason:t}}o(er,"discard");function fd(e){let t=e.candidate;if(t.kind!=="skill_patch"&&t.kind!=="skill_create")throw new Error("skillProposal requires a skill learning candidate");return{destination:t.kind,proposalId:e.proposalId,origin:e.origin,userLabel:"method_guide",skillName:t.skillName,whyDurable:t.whyDurable,trigger:t.trigger,changeSummary:t.changeSummary,sourceTraceIds:e.sourceRefs,confidence:t.confidence??ld()}}o(fd,"skillProposal");function tr(e){if(!e.completedTurn)return er(e.proposalId,"procedural learning requires a completed turn");let t=e.candidate;if("confidence"in t&&typeof t.confidence=="number"&&t.confidence<ud())return{destination:"trace_only",proposalId:e.proposalId,userLabel:"trace_only",reason:"candidate confidence is too low for an active suggestion",sourceTraceIds:e.sourceRefs};switch(t.kind){case"skill_patch":case"skill_create":return fd(e);case"workflow_handoff":return t.workflowStatus!=="completed"?er(e.proposalId,"workflow handoffs require a completed workflow run"):{destination:"workflow_handoff",proposalId:e.proposalId,origin:e.origin,userLabel:"runnable_workflow",evidenceRunIds:[t.workflowRunId],sourceTraceIds:e.sourceRefs,suggestedAction:t.suggestedAction,whyWorkflowNotSkill:t.whyWorkflowNotSkill,requiredWorkflowEvidence:t.requiredWorkflowEvidence,risk:t.risk,consumerImpact:t.consumerImpact,appliedByF224:!1};case"memdir_handoff":return t.metadata.completedTurn?{destination:"memdir_handoff",proposalId:e.proposalId,origin:e.origin,userLabel:"context_note",memoryKind:t.memoryKind,body:t.body,metadata:t.metadata}:er(e.proposalId,"memory handoffs require completed-turn metadata");case"reasoning_handoff":return{destination:"reasoning_handoff",proposalId:e.proposalId,origin:e.origin,userLabel:"reasoning_report",title:t.title,body:t.body,sourceTraceIds:t.sourceRefs};case"trace_only":return{destination:"trace_only",proposalId:e.proposalId,userLabel:"trace_only",reason:t.reason,sourceTraceIds:e.sourceRefs}}}o(tr,"triageProceduralLearning");var pd=new Set(["builtin","plugin","learned","external"]),md=new Set(["archive","quarantine","delete","consolidate"]);function Zi(e){return e==="background_learning"}o(Zi,"canMarkCreatedByAgent");function nr(e){return e.action==="record_usage"?{allowed:!0,mode:"telemetry",reason:"usage telemetry is best-effort and source-independent"}:e.pinned&&md.has(e.action)?{allowed:!1,mode:"blocked",reason:"pinned skills cannot be archived, quarantined, deleted, or consolidated"}:e.action==="direct_mutation"?{allowed:!1,mode:"blocked",reason:"F224 only applies explicit approved proposals, not direct skill mutation"}:e.action==="delete"?{allowed:!1,mode:"blocked",reason:"delete is outside the F224 learning loop"}:pd.has(e.source)?e.action==="patch"?{allowed:!0,mode:"overlay_proposal",reason:"readonly skill sources can receive overlay proposals only"}:{allowed:!1,mode:"blocked",reason:"readonly skill sources cannot be curated by F224"}:e.action==="create"?e.origin!=="background_learning"?{allowed:!1,mode:"blocked",reason:"learning-created skills require background_learning origin"}:e.ownership!=="background_created"?{allowed:!1,mode:"blocked",reason:"learning-created skills must be marked as background-created"}:{allowed:!0,mode:"proposal",reason:"background learning can create reviewable project or user skill proposals"}:e.action==="patch"?{allowed:!0,mode:"proposal",reason:"project and user skills can receive reviewable patch proposals"}:e.ownership!=="background_created"?{allowed:!1,mode:"blocked",reason:"only background-created skills are eligible for automatic curation proposals"}:Zi(e.origin)?{allowed:!0,mode:"proposal",reason:"background-created project or user skill is eligible for reviewable curation"}:{allowed:!1,mode:"blocked",reason:"automatic curation requires background_learning origin"}}o(nr,"decideSkillGovernance");import{copyFile as hd,lstat as rr,mkdir as Bt,realpath as ir,rename as gd,rm as wd,writeFile as to}from"fs/promises";import{basename as yd,dirname as or,isAbsolute as no,join as Ke,relative as vd,resolve as Ht}from"path";var ro=64*1024,io=256*1024,kd=new Set(["references","templates","scripts","assets"]);async function bd(e){try{return{root:await ir(e.skillRoot),existed:!0}}catch(t){if(t.code!=="ENOENT"||e.createSkillRoot!==!0)throw t;return{root:Ht(e.skillRoot),existed:!1}}}o(bd,"resolveSkillRootForValidation");function oo(e,t){let n=vd(e,t);return n===""||!n.startsWith("..")&&!no(n)}o(oo,"isInside");function nt(e){return typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT"}o(nt,"isMissingFile");function Id(e){return e.replace(/[^a-zA-Z0-9._-]/g,"_").slice(0,96)||"proposal"}o(Id,"sanitizeProposalId");async function Sd(e){try{return await ir(e)}catch(t){if(!nt(t))throw t;return Ht(e)}}o(Sd,"resolveSnapshotSkillRoot");async function qt(e){let t=await Sd(e.skillRoot);return{snapshotBase:Ht(e.snapshotRoot??Ke(or(t),".kodax-learning-snapshots")),proposalPrefix:`${Id(e.proposalId)}-`}}o(qt,"resolveSkillSnapshotLocation");function _d(e){if(e.includes("\0"))throw new Error("skill proposal path contains a null byte");if(no(e))throw new Error("skill proposal path resolves outside skill root");let n=e.replace(/\\/g,"/").split("/");if(n.length===0||n.some(r=>r.length===0||r==="."||r===".."))throw new Error("skill proposal path resolves outside skill root");return n.join("/")}o(_d,"normalizeRelativePath");function Rd(e,t){if(t==="SKILL.md")return;let[n,r]=t.split("/");if(!n||!kd.has(n))throw new Error("skill proposal support directory must be references, templates, scripts, or assets");if(!r&&e.kind==="write")throw new Error("skill proposal support directory writes must target a file")}o(Rd,"assertSupportedPath");function xd(e,t){if(e.kind!=="write")return;if(Buffer.byteLength(e.content,"utf8")>(t==="SKILL.md"?ro:io))throw new Error(`skill proposal file is too large: ${t}`)}o(xd,"assertContentSize");async function Ed(e,t){let n;try{n=await rr(t)}catch(r){if(nt(r)&&e.kind==="delete")throw new Error(`skill proposal delete target does not exist: ${e.relativePath}`);if(!nt(r))throw r;return}if(n.isSymbolicLink())throw new Error("skill proposal refuses to mutate symlink targets");if(n.isDirectory())throw new Error("F224 skill proposal apply supports file deletes and file writes only")}o(Ed,"assertExistingTargetSafe");async function Ad(e,t){let n=t.split("/").slice(0,-1),r=e;for(let i of n){r=Ke(r,i);let s;try{s=await rr(r)}catch(a){if(!nt(a))throw a;return}if(s.isSymbolicLink())throw new Error("skill proposal refuses paths through symlink directories");if(!s.isDirectory())throw new Error("skill proposal parent path is not a directory")}}o(Ad,"assertExistingAncestorsSafe");async function eo(e){if(e.changes.length===0)throw new Error("skill proposal must contain at least one change");let t=await bd(e),n=t.root,r=[];for(let i of e.changes){if(i.kind==="delete")throw new Error("skill proposal delete is outside the F224 learning loop");let s=_d(i.relativePath);Rd(i,s),xd(i,s);let a=Ht(n,...s.split("/"));if(!oo(n,a))throw new Error("skill proposal path resolves outside skill root");t.existed&&(await Ad(n,s),await Ed(i,a)),r.push({change:i,absolutePath:a,normalizedRelativePath:s})}return{root:n,rootExisted:t.existed,changes:r}}o(eo,"validateSkillMutationPlan");async function jd(e,t,n){let r=await qt({proposalId:e.proposalId,skillRoot:t,...e.snapshotRoot!==void 0?{snapshotRoot:e.snapshotRoot}:{}}),i=Ke(r.snapshotBase,`${r.proposalPrefix}${Date.now().toString(36)}`);await Bt(i,{recursive:!0});for(let s of n){try{await rr(s.absolutePath)}catch(c){if(!nt(c))throw c;continue}let a=Ke(i,s.normalizedRelativePath);await Bt(or(a),{recursive:!0}),await hd(s.absolutePath,a)}return await to(Ke(i,"manifest.json"),`${JSON.stringify({proposalId:e.proposalId,createdAt:new Date().toISOString(),changedPaths:n.map(s=>s.normalizedRelativePath)},null,2)}
16
+ `,"utf8"),i}o(jd,"createSnapshot");async function Pd(e,t,n,r){let i=or(t);await Bt(i,{recursive:!0});let s=await ir(i);if(!oo(e,s))throw new Error("skill proposal parent directory resolves outside skill root");let a=Ke(i,`.${yd(t)}.kodax-${process.pid}-${Date.now().toString(36)}-${r}.tmp`);try{await to(a,n,"utf8"),await gd(a,t)}catch(c){throw await wd(a,{force:!0}),c}}o(Pd,"atomicWriteFile");async function $d(e,t){for(let[n,r]of t.entries()){if(r.change.kind==="write"){await Pd(e,r.absolutePath,r.change.content,n);continue}throw new Error("skill proposal delete is outside the F224 learning loop")}}o($d,"applyValidatedChanges");async function so(e){let t=await eo(e),n=t.changes.map(s=>s.normalizedRelativePath);if(e.dryRun)return{proposalId:e.proposalId,validated:!0,applied:!1,changedPaths:n};if(!e.approved)throw new Error("skill proposal apply requires explicit approval");!t.rootExisted&&e.createSkillRoot===!0&&await Bt(e.skillRoot,{recursive:!0});let r=await eo(e),i=await jd(e,r.root,r.changes);return await $d(r.root,r.changes),{proposalId:e.proposalId,validated:!0,applied:!0,changedPaths:r.changes.map(s=>s.normalizedRelativePath),...i!==void 0?{snapshotPath:i}:{}}}o(so,"applySkillMutationProposal");import{randomUUID as lo}from"node:crypto";import{mkdir as uo,open as fo,readFile as xe,readdir as ar,rm as Cd,stat as Vt,writeFile as po}from"node:fs/promises";import{dirname as Ld,join as sr}from"node:path";var Fd=5e3,Wt=10,mo=3e4,Nd=16,ao=8;async function F(e,t,n=Fd){await uo(Ld(e),{recursive:!0});let r=await Dd(e,n);try{return await t()}finally{try{await r.handle.close()}finally{await wo(e,r.token)}}}o(F,"withLearningFileLock");async function Dd(e,t){let n=Date.now()+t,r=await Td(e),i,s=!1;try{for(await Md(r,n,e);;){await ho(r);try{return i=await Hd(e),i}catch(a){let c=await Wd(a,e);if(c==="retry_missing"){if(s)throw a;s=!0,await Jt(Wt);continue}if(c==="not_contended")throw a;s=!1;let d=await qd(e);if(d!==void 0&&await zd(e,d))continue;if(Date.now()>=n)throw ko(e);await Jt(Wt)}}}finally{try{await yo(r.path,r.raw)}catch(a){if(i===void 0)throw a;let c=[a];try{await i.handle.close()}catch(d){c.push(d)}try{await wo(e,i.token)}catch(d){c.push(d)}throw c.length===1?a:new AggregateError(c,"learning lock acquisition cleanup failed")}}}o(Dd,"acquireLock");async function Td(e){let t=`${e}.queue`,n=lo(),r=`${process.pid} ${n}
17
+ `,i=sr(t,`choosing-${n}.lock`);await uo(t,{recursive:!0}),await co(i,r);try{await go(t);let s=await Od(t),a=Math.max(0,...s.map(l=>l.number))+1;if(!Number.isSafeInteger(a))throw new Error("learning lock ticket overflow");let c=`ticket-${String(a).padStart(Nd,"0")}-${n}.lock`,d=sr(t,c);return await co(d,r),{queuePath:t,path:d,name:c,raw:r}}finally{await yo(i,r)}}o(Td,"createLockTicket");async function Md(e,t,n){for(;;){await go(e.queuePath),await ho(e);let r=await ar(e.queuePath),i=r.some(a=>a.startsWith("choosing-")),s=r.map(cr).filter(a=>a!==void 0).sort(Kd)[0];if(!i&&s?.name===e.name)return;if(Date.now()>=t)throw ko(n);await Jt(Wt)}}o(Md,"waitForTicketTurn");async function co(e,t){let n=await fo(e,"wx");try{try{await n.writeFile(t,"utf8")}finally{await n.close()}}catch(r){throw await Re(e),r}}o(co,"createOwnerFile");async function ho(e){try{if(await xe(e.path,"utf8")!==e.raw)throw new Error(`learning store lock ticket lost: ${e.path}`)}catch(t){throw D(t,"ENOENT")?new Error(`learning store lock ticket lost: ${e.path}`):t}}o(ho,"assertTicketOwned");async function Od(e){return(await ar(e)).map(cr).filter(t=>t!==void 0)}o(Od,"listQueueTickets");function cr(e){let t=/^ticket-(\d{16})-[0-9a-f-]+\.lock$/i.exec(e);if(t===null)return;let n=Number(t[1]);return Number.isSafeInteger(n)?{name:e,number:n}:void 0}o(cr,"parseQueueTicket");function Kd(e,t){return e.number-t.number||e.name.localeCompare(t.name)}o(Kd,"compareQueueTickets");async function go(e){let t=await ar(e);await Promise.all(t.filter(Ud).map(async n=>{let r=sr(e,n);await Bd(r)&&await Re(r)}))}o(go,"cleanupAbandonedQueueEntries");function Ud(e){return/^choosing-[0-9a-f-]+\.lock$/i.test(e)||cr(e)!==void 0}o(Ud,"isQueueEntryName");async function Bd(e){try{let t=await Vt(e),n=dr(await xe(e,"utf8"));return n?.released===!0?!0:Date.now()-t.mtimeMs<=mo?!1:n===void 0||!vo(n.pid)}catch(t){if(D(t,"ENOENT")||["EPERM","EACCES","EBUSY"].some(n=>D(t,n)))return!1;throw t}}o(Bd,"isAbandonedQueueEntry");async function Hd(e){let t=await fo(e,"wx"),n=lo();try{return await t.writeFile(`${process.pid} ${n}
18
+ `,"utf8"),{handle:t,token:n}}catch(r){throw await t.close(),await Re(e),r}}o(Hd,"createLock");async function qd(e){try{let t=await Vt(e),n=await xe(e,"utf8"),r=dr(n),i=r?.token!==void 0&&await Jd(e,r.token);return!i&&Date.now()-t.mtimeMs<=mo?void 0:i||r!==void 0&&!vo(r.pid)?{raw:n,mtimeMs:t.mtimeMs,size:t.size}:void 0}catch(t){if(["ENOENT","EPERM","EACCES","EBUSY"].some(n=>D(t,n)))return;throw t}}o(qd,"observeStaleLock");async function zd(e,t){try{let n=await Vt(e);return n.mtimeMs!==t.mtimeMs||n.size!==t.size||await xe(e,"utf8")!==t.raw?!1:(await Re(e),!0)}catch(n){if(D(n,"ENOENT"))return!0;if(["EPERM","EACCES","EBUSY"].some(r=>D(n,r)))return!1;throw n}}o(zd,"removeObservedStaleLock");async function Wd(e,t){if(D(e,"EEXIST"))return"contended";if(!["EPERM","EACCES","EBUSY"].some(n=>D(e,n)))return"not_contended";try{return(await Vt(t)).isFile()?"contended":"not_contended"}catch(n){if(D(n,"ENOENT"))return"retry_missing";throw e}}o(Wd,"classifyExistingLockContention");async function wo(e,t){try{if(dr(await xe(e,"utf8"))?.token!==t)return;let r;try{await po(zt(e,t),`${t}
19
+ `,"utf8")}catch(i){r=i}try{await Re(e)}catch(i){if(r===void 0&&lr(i))return;throw r===void 0?i:new AggregateError([r,i],"learning lock release marker and owner cleanup both failed")}try{await Re(zt(e,t))}catch(i){H({source:"learning.store-lock",level:"warn",message:"Released learning lock left a harmless cleanup marker.",detail:{filePath:zt(e,t),error:i instanceof Error?i.message:String(i)}})}}catch(n){if(!D(n,"ENOENT"))throw n}}o(wo,"releaseLock");async function yo(e,t){let n;try{if(await xe(e,"utf8")!==t)throw new Error(`learning store lock queue entry lost: ${e}`);await po(e,`${t.trimEnd()} released
20
+ `,"utf8")}catch(r){if(D(r,"ENOENT"))return;n=r}try{await Re(e)}catch(r){if(n===void 0&&lr(r))return;throw n===void 0?r:new AggregateError([n,r],"learning lock queue marker and cleanup both failed")}}o(yo,"releaseQueueEntry");async function Jd(e,t){try{return(await xe(zt(e,t),"utf8")).trim()===t}catch(n){if(["ENOENT","EPERM","EACCES","EBUSY"].some(r=>D(n,r)))return!1;throw n}}o(Jd,"hasReleaseMarker");function zt(e,t){return`${e}.${t}.released`}o(zt,"releaseMarkerPath");function dr(e){let t=/^(\d+)(?: ([0-9a-f-]+))?(?: (released))?\s*$/i.exec(e);if(!t)return;let n=Number(t[1]);if(!(!Number.isSafeInteger(n)||n<=0))return t[2]===void 0?{pid:n,released:t[3]!==void 0}:{pid:n,token:t[2],released:t[3]!==void 0}}o(dr,"parseOwner");function vo(e){try{return process.kill(e,0),!0}catch(t){return!D(t,"ESRCH")}}o(vo,"isProcessAlive");function D(e,t){return typeof e=="object"&&e!==null&&"code"in e&&e.code===t}o(D,"isFileError");function lr(e){return["EPERM","EACCES","EBUSY"].some(t=>D(e,t))}o(lr,"isTransientFileContention");async function Re(e){for(let t=1;t<=ao;t+=1)try{await Cd(e,{force:!0});return}catch(n){if(D(n,"ENOENT"))return;if(!lr(n)||t===ao)throw n;await Jt(Wt)}}o(Re,"removeFileWithTransientRetry");function ko(e){return new Error(`learning store lock timed out: ${e}`)}o(ko,"lockTimeout");async function Jt(e){await new Promise(t=>setTimeout(t,e))}o(Jt,"delay");import{mkdir as bo,readFile as Vd,rename as Yd,rm as Gd,writeFile as Xd}from"fs/promises";import{basename as Qd,dirname as Io,join as So}from"path";var _o=1;function ee(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}o(ee,"isRecord");function Zd(e){return e==="pending"||e==="approved"||e==="rejected"}o(Zd,"isReviewStatus");function Ro(e){return e==="foreground_user"||e==="assistant_tool"||e==="background_learning"}o(Ro,"isSkillWriteOrigin");function z(e){return Array.isArray(e)&&e.every(t=>typeof t=="string")}o(z,"isStringArray");function Yt(e){return ee(e)&&Object.values(e).every(t=>typeof t=="string")}o(Yt,"isStringRecord");function el(e){return e==="record_usage"||e==="create"||e==="patch"||e==="archive"||e==="quarantine"||e==="delete"||e==="consolidate"||e==="direct_mutation"}o(el,"isSkillGovernanceAction");function tl(e){return e==="save_from_run"||e==="revise_capsule"||e==="add_skill_reference"||e==="report_only"}o(tl,"isWorkflowSuggestedAction");function nl(e){return e==="low"||e==="medium"||e==="high"}o(nl,"isLearningRisk");function rl(e){return e==="user"||e==="feedback"||e==="project"||e==="reference"||e==="semantic_memory"}o(rl,"isMemoryKind");function il(e){return e==="foreground_user"||e==="assistant_tool"||e==="background_learning"||e==="external_provider"}o(il,"isMemoryWriteOrigin");function ol(e){return e==="primary"||e==="subagent"||e==="workflow_child"||e==="cron"||e==="flush"||e==="compression"}o(ol,"isMemoryExecutionContext");function sl(e){return ee(e)&&z(e.workflowCapsules)&&z(e.savedWorkflows)&&z(e.constructedAgents)&&z(e.promptReferences)&&(e.action==="none"||e.action==="rewrite_proposal"||e.action==="block_until_manual_review")}o(sl,"isConsumerImpact");function al(e){return ee(e)&&il(e.writeOrigin)&&ol(e.executionContext)&&typeof e.sessionId=="string"&&(e.parentSessionId===void 0||typeof e.parentSessionId=="string")&&(e.platform===void 0||typeof e.platform=="string")&&(e.sourceTool===void 0||typeof e.sourceTool=="string")&&z(e.sourceRefs)&&typeof e.completedTurn=="boolean"&&(e.claimKind===void 0||cl(e.claimKind))&&(e.claimKey===void 0||typeof e.claimKey=="string")&&(e.actionSignature===void 0||typeof e.actionSignature=="string")&&(e.persistenceKind===void 0||e.persistenceKind==="create"||e.persistenceKind==="evidence_update"||e.persistenceKind==="condition_refinement")&&(e.targetRefId===void 0||typeof e.targetRefId=="string")&&(e.targetStorageUri===void 0||typeof e.targetStorageUri=="string")&&(e.preconditions===void 0||typeof e.preconditions=="string")&&(e.applicability===void 0||dl(e.applicability))&&(e.requestedLifecycle===void 0||e.requestedLifecycle==="active"||e.requestedLifecycle==="provisional")&&(e.episodeOutcome===void 0||e.episodeOutcome==="succeeded"||e.episodeOutcome==="failed"||e.episodeOutcome==="cancelled")&&(e.verifiedEvidence===void 0||typeof e.verifiedEvidence=="boolean")&&(e.evidenceProjectId===void 0||typeof e.evidenceProjectId=="string")}o(al,"isMemoryMetadata");function cl(e){return e==="fact"||e==="policy"||e==="preference"||e==="procedure"||e==="episode"}o(cl,"isMemoryClaimKind");function dl(e){return!ee(e)||typeof e.tenantId!="string"?!1:["workspaceId","userId","agentId","projectId","sessionId"].every(t=>e[t]===void 0||typeof e[t]=="string")}o(dl,"isMemoryApplicability");function ll(e){if(!ee(e))return!1;let t=e.destination;return typeof e.proposalId!="string"||!Ro(e.origin)?!1:t==="skill_patch"||t==="skill_create"?e.userLabel==="method_guide"&&typeof e.skillName=="string"&&typeof e.whyDurable=="string"&&typeof e.trigger=="string"&&typeof e.changeSummary=="string"&&z(e.sourceTraceIds)&&typeof e.confidence=="number":t==="workflow_handoff"?e.userLabel==="runnable_workflow"&&z(e.evidenceRunIds)&&z(e.sourceTraceIds)&&tl(e.suggestedAction)&&typeof e.whyWorkflowNotSkill=="string"&&z(e.requiredWorkflowEvidence)&&nl(e.risk)&&sl(e.consumerImpact)&&e.appliedByF224===!1:t==="memdir_handoff"?e.userLabel==="context_note"&&rl(e.memoryKind)&&typeof e.body=="string"&&al(e.metadata):t==="reasoning_handoff"?e.userLabel==="reasoning_report"&&typeof e.title=="string"&&typeof e.body=="string"&&z(e.sourceTraceIds):!1}o(ll,"isReviewableProposal");function ul(e){return ee(e)?e.kind==="write"?typeof e.relativePath=="string"&&typeof e.content=="string":e.kind==="delete"?typeof e.relativePath=="string":!1:!1}o(ul,"isSkillMutationChange");function fl(e){if(!ee(e)||e.kind!=="skill"||typeof e.skillRoot!="string"||e.skillRoot.length===0||!Array.isArray(e.changes)||!e.changes.every(ul))return!1;let t=e.governance;return!(!ee(t)||!el(t.action)||t.source!=="project"&&t.source!=="user"&&t.source!=="plugin"&&t.source!=="builtin"&&t.source!=="external"||t.ownership!=="system"&&t.ownership!=="human"&&t.ownership!=="background_created"||!Ro(t.origin)||t.pinned!==void 0&&typeof t.pinned!="boolean"||e.snapshotRoot!==void 0&&typeof e.snapshotRoot!="string")}o(fl,"isStoredLearningApplyPlan");function pl(e,t,n){if(!ee(e)){n.push(`proposal entry ${t} is not an object`);return}let r=e.proposalId,i=e.status,s=e.proposal,a=e.applyPlan,c=e.createdAt,d=e.updatedAt,l=e.appliedAt,u=e.appliedChangedPaths,f=e.appliedSnapshotPath,p=e.approvedBy,h=e.approvedAt,g=e.approvalPolicyId,y=e.approvalPolicyReason,v=e.approvalExpectedFingerprints,k=e.approvalResultingFingerprints,I=e.rejectedReason;if(typeof r!="string"||r.length===0){n.push(`proposal entry ${t} has no proposalId`);return}if(!Zd(i)){n.push(`proposal entry ${r} has invalid status`);return}if(!ll(s)){n.push(`proposal entry ${r} has invalid proposal payload`);return}if(s.proposalId!==r){n.push(`proposal entry ${r} has mismatched proposal payload id`);return}if(typeof c!="string"||typeof d!="string"){n.push(`proposal entry ${r} has invalid timestamps`);return}if(a!==void 0&&!fl(a)){n.push(`proposal entry ${r} has invalid apply plan`);return}if(l!==void 0&&typeof l!="string"){n.push(`proposal entry ${r} has invalid appliedAt`);return}if(u!==void 0&&!z(u)){n.push(`proposal entry ${r} has invalid applied changed paths`);return}if(p!==void 0&&p!=="user"&&p!=="host"){n.push(`proposal entry ${r} has invalid approvedBy`);return}if(h!==void 0&&typeof h!="string"){n.push(`proposal entry ${r} has invalid approvedAt`);return}if(g!==void 0&&typeof g!="string"){n.push(`proposal entry ${r} has invalid approvalPolicyId`);return}if(y!==void 0&&typeof y!="string"){n.push(`proposal entry ${r} has invalid approvalPolicyReason`);return}if(v!==void 0&&!Yt(v)){n.push(`proposal entry ${r} has invalid approvalExpectedFingerprints`);return}if(k!==void 0&&!Yt(k)){n.push(`proposal entry ${r} has invalid approvalResultingFingerprints`);return}if(f!==void 0&&typeof f!="string"){n.push(`proposal entry ${r} has invalid applied snapshot path`);return}return{proposalId:r,status:i,proposal:s,...a!==void 0?{applyPlan:a}:{},createdAt:c,updatedAt:d,...typeof l=="string"?{appliedAt:l}:{},...z(u)?{appliedChangedPaths:u}:{},...p==="user"||p==="host"?{approvedBy:p}:{},...typeof h=="string"?{approvedAt:h}:{},...typeof g=="string"?{approvalPolicyId:g}:{},...typeof y=="string"?{approvalPolicyReason:y}:{},...Yt(v)?{approvalExpectedFingerprints:v}:{},...Yt(k)?{approvalResultingFingerprints:k}:{},...typeof f=="string"?{appliedSnapshotPath:f}:{},...typeof I=="string"?{rejectedReason:I}:{}}}o(pl,"parseStoredProposal");function ml(e){let t;try{t=JSON.parse(e)}catch(s){let a=s instanceof Error?s.message:String(s);return{proposals:[],warnings:[`learning proposal store is not valid JSON: ${a}`]}}if(!ee(t))return{proposals:[],warnings:["learning proposal store root is not an object"]};if(t.version!==_o)return{proposals:[],warnings:["learning proposal store version is unsupported"]};if(!Array.isArray(t.proposals))return{proposals:[],warnings:["learning proposal store has no proposals array"]};let n=[];return{proposals:t.proposals.map((s,a)=>pl(s,a,n)).filter(s=>s!==void 0),warnings:n}}o(ml,"parseStoreDocument");async function xo(e,t){let n={version:_o,proposals:t},r=Io(e);await bo(r,{recursive:!0});let i=So(r,`.${Qd(e)}.kodax-${process.pid}-${Date.now().toString(36)}.tmp`);try{await Xd(i,`${JSON.stringify(n,null,2)}
21
+ `,"utf8"),await Yd(i,e)}catch(s){throw await Gd(i,{force:!0}),s}}o(xo,"writeStoreDocument");async function P(e){let t;try{t=await Vd(e,"utf8")}catch(n){if(n.code==="ENOENT")return{proposals:[],warnings:[]};throw n}return ml(t)}o(P,"readLearningProposalStore");async function rt(e,t,n={}){return Eo(e,async()=>{await n.revalidateAuthority?.();let r=await P(e);if(r.warnings.length>0)throw new Error(`refusing to write corrupt learning proposal store: ${r.warnings.join("; ")}`);let s=(n.now??(()=>new Date().toISOString()))(),a=r.proposals.find(l=>l.proposalId===t.proposalId),c=a?{...a,proposal:t,...n.applyPlan!==void 0?{applyPlan:n.applyPlan}:{},updatedAt:s}:{proposalId:t.proposalId,status:"pending",proposal:t,...n.applyPlan!==void 0?{applyPlan:n.applyPlan}:{},createdAt:s,updatedAt:s},d=a?r.proposals.map(l=>l.proposalId===t.proposalId?c:l):[...r.proposals,c];return await n.revalidateAuthority?.(),await xo(e,d),c})}o(rt,"upsertLearningProposal");function ur(e,t){let n=Te(e),r=n?Ne(n):`local-${De(e)}`;return t===void 0?O("projects",r,"learning","proposals.json"):So(t,"projects",r,"learning","proposals.json")}o(ur,"resolveLearningProposalStore");async function de(e,t,n,r={}){return Eo(e,async()=>{await r.revalidateAuthority?.();let i=await P(e);if(i.warnings.length>0)throw new Error(`refusing to write corrupt learning proposal store: ${i.warnings.join("; ")}`);let s=i.proposals.find(d=>d.proposalId===t);if(!s)throw new Error(`learning proposal not found: ${t}`);let a=r.now??(()=>new Date().toISOString()),c={...s,status:n,updatedAt:a(),...n==="approved"&&r.appliedAt!==void 0?{appliedAt:r.appliedAt}:{},...n==="approved"&&r.appliedChangedPaths!==void 0?{appliedChangedPaths:r.appliedChangedPaths}:{},...n==="approved"&&r.appliedSnapshotPath!==void 0?{appliedSnapshotPath:r.appliedSnapshotPath}:{},...n==="approved"&&r.approvedBy!==void 0?{approvedBy:r.approvedBy}:{},...n==="approved"&&r.approvedAt!==void 0?{approvedAt:r.approvedAt}:{},...n==="approved"&&r.approvalPolicyId!==void 0?{approvalPolicyId:r.approvalPolicyId}:{},...n==="approved"&&r.approvalPolicyReason!==void 0?{approvalPolicyReason:r.approvalPolicyReason}:{},...n==="approved"&&r.approvalExpectedFingerprints!==void 0?{approvalExpectedFingerprints:r.approvalExpectedFingerprints}:{},...n==="approved"&&r.approvalResultingFingerprints!==void 0?{approvalResultingFingerprints:r.approvalResultingFingerprints}:{},...n==="rejected"&&r.rejectedReason!==void 0?{rejectedReason:r.rejectedReason}:{rejectedReason:void 0}};return await r.revalidateAuthority?.(),await xo(e,i.proposals.map(d=>d.proposalId===t?c:d)),c})}o(de,"updateLearningProposalStatus");async function Eo(e,t){return await bo(Io(e),{recursive:!0}),F(`${e}.lock`,t)}o(Eo,"withStoreWriteLock");function hl(e){let t=e.proposal.destination;if(t!=="skill_patch"&&t!=="skill_create")throw new Error("F224 apply path supports only skill proposals");return t}o(hl,"ensureSkillProposal");function gl(e,t){let n=t==="skill_create"?"create":"patch";if(e.governance.action!==n)throw new Error(`skill ${t} requires governance action ${n}`)}o(gl,"ensureGovernanceMatchesProposal");function wl(e){if(e.proposal.destination!=="skill_create")return;if(!e.changes.some(n=>n.kind==="write"&&n.relativePath.replace(/\\/g,"/")==="SKILL.md"))throw new Error("skill_create proposals must include SKILL.md")}o(wl,"ensureCreatePlanIncludesSkillFile");async function fr(e){let t=hl(e);gl(e,t),wl(e);let n=nr(e.governance);if(!n.allowed)throw new Error(`skill proposal blocked by governance: ${n.reason}`);if(n.mode==="overlay_proposal")throw new Error("readonly skill sources require an overlay proposal; F224 will not mutate the source skill");if(n.mode!=="proposal")throw new Error(`skill proposal requires a mutable proposal path; got ${n.mode}`);return so({proposalId:e.proposal.proposalId,skillRoot:e.skillRoot,approved:e.approved,changes:e.changes,...e.dryRun!==void 0?{dryRun:e.dryRun}:{},...e.snapshotRoot!==void 0?{snapshotRoot:e.snapshotRoot}:{},createSkillRoot:t==="skill_create"})}o(fr,"applySkillLearningProposal");import{readdir as yl,readFile as vl,stat as kl}from"fs/promises";import{isAbsolute as jo,join as Po,relative as bl,resolve as Ao}from"path";function $o(e){return typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT"}o($o,"isMissingFile");function Co(e){if(e.includes("\0")||jo(e))return;let n=e.replace(/\\/g,"/").split("/");if(!(n.length===0||n.some(r=>r.length===0||r==="."||r==="..")))return n.join("/")}o(Co,"normalizePlanRelativePath");function Il(e,t){let n=bl(e,t);return n===""||!n.startsWith("..")&&!jo(n)}o(Il,"isInside");function Lo(e,t){let n=Co(t);if(n===void 0)return;let r=Ao(e),i=Ao(r,...n.split("/"));if(Il(r,i))return{absolutePath:i,normalizedRelativePath:n}}o(Lo,"resolvePlanTarget");async function mr(e){try{return{exists:!0,content:await vl(e,"utf8")}}catch(t){if($o(t))return{exists:!1};throw t}}o(mr,"readUtf8IfExists");function Sl(e){let t=e.applyPlan;return t?.kind!=="skill"?[]:t.changes.map(n=>Co(n.relativePath)??n.relativePath)}o(Sl,"plannedSkillChangedPaths");async function _l(e){let t=e.applyPlan;if(t?.kind!=="skill"||t.changes.length===0)return!1;for(let n of t.changes){if(n.kind!=="write")return!1;let r=Lo(t.skillRoot,n.relativePath);if(r===void 0)return!1;let i=await mr(r.absolutePath);if(!i.exists||i.content!==n.content)return!1}return!0}o(_l,"skillFilesAlreadyMatchPlan");async function Fo(e){let t=e.applyPlan;if(t?.kind!=="skill")return;let n=await qt({proposalId:e.proposalId,skillRoot:t.skillRoot,...t.snapshotRoot!==void 0?{snapshotRoot:t.snapshotRoot}:{}}),r;try{r=await yl(n.snapshotBase,{withFileTypes:!0})}catch(s){if($o(s))return;throw s}let i=[];for(let s of r){if(!s.isDirectory()||!s.name.startsWith(n.proposalPrefix))continue;let a=Po(n.snapshotBase,s.name),c=await kl(a);i.push({path:a,mtimeMs:c.mtimeMs})}return i.sort((s,a)=>a.mtimeMs-s.mtimeMs),i[0]?.path}o(Fo,"findLatestSnapshotPath");async function Rl(e){let t=e.applyPlan;if(t?.kind!=="skill")return;let n=await Fo(e);if(n!==void 0)for(let r of t.changes){if(r.kind!=="write")continue;let i=Lo(t.skillRoot,r.relativePath);if(i===void 0)return;let s=await mr(i.absolutePath);if(s.exists&&s.content===r.content)continue;let a=Po(n,...i.normalizedRelativePath.split("/")),c=await mr(a);if(!(!s.exists&&!c.exists)&&!(s.exists&&c.exists&&s.content===c.content))return{relativePath:i.normalizedRelativePath,snapshotPath:n}}}o(Rl,"findSnapshotConflict");function No(e){if(e.proposal.destination==="workflow_handoff")return e.proposal.consumerImpact}o(No,"getWorkflowConsumerImpact");function xl(e){return No(e)?.action==="block_until_manual_review"}o(xl,"requiresConsumerImpactAck");async function El(e,t){let n=await P(e);if(n.warnings.length>0)throw new Error(`refusing to approve corrupt learning proposal store: ${n.warnings.join("; ")}`);let r=n.proposals.find(i=>i.proposalId===t);if(r===void 0)throw new Error(`learning proposal not found: ${t}`);return r}o(El,"readCurrentStoredProposal");async function pr(e,t,n={}){let i=(n.now??(()=>new Date().toISOString()))(),s=n.appliedChangedPaths!==void 0||n.appliedSnapshotPath!==void 0;return de(e,t.proposalId,"approved",{now:o(()=>i,"now"),...s?{appliedAt:i}:{},...n.appliedChangedPaths!==void 0?{appliedChangedPaths:n.appliedChangedPaths}:{},...n.appliedSnapshotPath!==void 0?{appliedSnapshotPath:n.appliedSnapshotPath}:{}})}o(pr,"markApproved");async function hr(e,t,n={}){let r=await El(e,t.proposalId);if(r.status!=="pending")return{status:"blocked_not_pending",reviewStatus:r.status};if(t=r,t.applyPlan?.kind==="skill"){if(await _l(t)){let c=await Fo(t),d=Sl(t);return{status:"approved_already_applied",proposal:await pr(e,t,{appliedChangedPaths:d,...c!==void 0?{appliedSnapshotPath:c}:{},now:n.now}),changedPaths:d,...c!==void 0?{snapshotPath:c}:{}}}let i=await Rl(t);if(i!==void 0)return{status:"blocked_snapshot_conflict",...i};let s=await fr({proposal:t.proposal,governance:t.applyPlan.governance,skillRoot:t.applyPlan.skillRoot,changes:t.applyPlan.changes,approved:!0,...t.applyPlan.snapshotRoot!==void 0?{snapshotRoot:t.applyPlan.snapshotRoot}:{}});return{status:"approved_applied",proposal:await pr(e,t,{appliedChangedPaths:s.changedPaths,...s.snapshotPath!==void 0?{appliedSnapshotPath:s.snapshotPath}:{},now:n.now}),changedPaths:s.changedPaths,...s.snapshotPath!==void 0?{snapshotPath:s.snapshotPath}:{}}}if(t.proposal.destination==="skill_patch"||t.proposal.destination==="skill_create")return{status:"blocked_missing_apply_plan"};if(xl(t)&&n.acknowledgeImpact!==!0){let i=No(t);return i===void 0?{status:"blocked_missing_apply_plan"}:{status:"blocked_consumer_impact",impact:i}}return{status:"approved_handoff",proposal:await pr(e,t,{now:n.now})}}o(hr,"approveStoredLearningProposal");function Al(e){if(!e.applyPlan)return;let t=e.learning.candidate.kind;if(t!=="skill_patch"&&t!=="skill_create")throw new Error("learning apply plans can only be attached to skill proposals")}o(Al,"ensureApplyPlanMatchesResult");async function gr(e){Al(e);let t=tr(e.learning);if(t.destination==="discard"||t.destination==="trace_only")return{stored:!1,result:t};let n=await rt(e.storePath,t,{...e.now!==void 0?{now:e.now}:{},...e.applyPlan!==void 0?{applyPlan:e.applyPlan}:{}});return{stored:!0,result:t,proposal:n}}o(gr,"recordProceduralLearning");import{mkdir as jl,readFile as Pl,rename as $l,rm as Cl,writeFile as Ll}from"fs/promises";import{basename as Fl,dirname as Nl,join as Dl}from"path";var Gt=1;function Do(e,t){let n=Te(e),r=n?Ne(n):`local-${De(e)}`;return O("projects",r,"learning",t)}o(Do,"projectLearningPath");function Tl(e){return Do(e,"skill-usage.json")}o(Tl,"resolveSkillUsageLedger");function Ml(e){return Do(e,"skill-trust.json")}o(Ml,"resolveSkillTrustLedger");function Xt(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}o(Xt,"isRecord");function Ol(e){return e==="project"||e==="user"||e==="plugin"||e==="builtin"||e==="learned"||e==="external"}o(Ol,"isGovernedSkillSource");function Kl(e){return e==="provisional"||e==="trusted"||e==="quarantined"||e==="archived"}o(Kl,"isSkillTrustState");function Ul(e){return Xt(e)&&typeof e.skillName=="string"&&Ol(e.source)&&typeof e.views=="number"&&typeof e.invokes=="number"&&typeof e.patchProposals=="number"&&typeof e.patchApplies=="number"&&typeof e.firstEventAt=="string"&&typeof e.lastEventAt=="string"}o(Ul,"isUsageRecord");function Bl(e){return Xt(e)&&typeof e.skillName=="string"&&(e.source==="project"||e.source==="user")&&e.ownership==="background_created"&&Kl(e.state)&&e.createdByAgent===!0&&typeof e.updatedAt=="string"&&(e.reason===void 0||typeof e.reason=="string")}o(Bl,"isTrustRecord");async function To(e,t){let n=Nl(e);await jl(n,{recursive:!0});let r=Dl(n,`.${Fl(e)}.kodax-${process.pid}-${Date.now().toString(36)}.tmp`);try{await Ll(r,t,"utf8"),await $l(r,e)}catch(i){throw await Cl(r,{force:!0}),i}}o(To,"writeAtomic");async function Mo(e){let t;try{t=await Pl(e,"utf8")}catch(n){if(n.code==="ENOENT")return{warnings:[]};throw n}try{return{parsed:JSON.parse(t),warnings:[]}}catch(n){return{warnings:[`ledger is not valid JSON: ${n instanceof Error?n.message:String(n)}`]}}}o(Mo,"readJsonDocument");async function Oo(e){let t=await Mo(e);if(t.warnings.length>0)return{records:[],warnings:t.warnings};if(t.parsed===void 0)return{records:[],warnings:[]};if(!Xt(t.parsed)||t.parsed.version!==Gt||!Array.isArray(t.parsed.records))return{records:[],warnings:["skill usage ledger has unsupported shape"]};let n=[];return{records:t.parsed.records.map((i,s)=>{if(Ul(i))return i;n.push(`usage record ${s} has invalid shape`)}).filter(i=>i!==void 0),warnings:n}}o(Oo,"readSkillUsageLedger");async function Hl(e,t){try{let n=await Oo(e);if(n.warnings.length>0)return{recorded:!1,warnings:n.warnings};let r=(t.now??(()=>new Date().toISOString()))(),i=n.records.find(l=>l.skillName===t.skillName&&l.source===t.source),s=i??{skillName:t.skillName,source:t.source,views:0,invokes:0,patchProposals:0,patchApplies:0,firstEventAt:r,lastEventAt:r},a={...s,views:s.views+(t.event==="view"?1:0),invokes:s.invokes+(t.event==="invoke"?1:0),patchProposals:s.patchProposals+(t.event==="patch_proposed"?1:0),patchApplies:s.patchApplies+(t.event==="patch_applied"?1:0),lastEventAt:r},c=i?n.records.map(l=>l.skillName===t.skillName&&l.source===t.source?a:l):[...n.records,a];return await To(e,`${JSON.stringify({version:Gt,records:c},null,2)}
22
+ `),{recorded:!0,record:a,warnings:[]}}catch(n){return{recorded:!1,warnings:[`failed to record skill usage: ${n instanceof Error?n.message:String(n)}`]}}}o(Hl,"recordSkillUsage");async function Ko(e){let t=await Mo(e);if(t.warnings.length>0)return{records:[],warnings:t.warnings};if(t.parsed===void 0)return{records:[],warnings:[]};if(!Xt(t.parsed)||t.parsed.version!==Gt||!Array.isArray(t.parsed.records))return{records:[],warnings:["skill trust ledger has unsupported shape"]};let n=[];return{records:t.parsed.records.map((i,s)=>{if(Bl(i))return i;n.push(`trust record ${s} has invalid shape`)}).filter(i=>i!==void 0),warnings:n}}o(Ko,"readSkillTrustLedger");async function ql(e,t){if(t.source!=="project"&&t.source!=="user")return{updated:!1,reason:"only project or user skills can enter the F224 trust ledger"};if(t.ownership!=="background_created"||t.origin!=="background_learning")return{updated:!1,reason:"only background-created skills from background learning are curation-eligible"};if(t.pinned&&(t.state==="quarantined"||t.state==="archived"))return{updated:!1,reason:"pinned skills cannot be quarantined or archived by F224"};let n=await Ko(e);if(n.warnings.length>0)return{updated:!1,reason:`refusing to update corrupt trust ledger: ${n.warnings.join("; ")}`};let r=(t.now??(()=>new Date().toISOString()))(),i={skillName:t.skillName,source:t.source,ownership:"background_created",state:t.state,createdByAgent:!0,updatedAt:r,...t.reason!==void 0?{reason:t.reason}:{}},s=n.records.some(c=>c.skillName===t.skillName&&c.source===t.source)?n.records.map(c=>c.skillName===t.skillName&&c.source===t.source?i:c):[...n.records,i];return await To(e,`${JSON.stringify({version:Gt,records:s},null,2)}
23
+ `),{updated:!0,record:i}}o(ql,"updateSkillTrustLedger");import{readdir as zl,readFile as Wl,stat as Jl}from"fs/promises";import{join as Vl}from"path";var Yl=1024*1024,Gl=new Set([".git","node_modules","dist","build",".turbo"]),Xl=new Set([".json",".jsonl",".md",".mdx",".txt",".yml",".yaml",".js",".mjs",".cjs",".ts",".tsx"]);function Ql(e){let t=e.lastIndexOf(".");return t>=0?e.slice(t).toLowerCase():""}o(Ql,"extensionOf");function Zl(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}o(Zl,"escapeRegExp");function eu(e,t){let n=Zl(t);return new RegExp(`(^|[^a-zA-Z0-9_-])(?:/skill:|skill:|skills?["'\\s:\\[]+)?${n}([^a-zA-Z0-9_-]|$)`,"i").test(e)}o(eu,"hasSkillReference");async function tu(e,t){let n=await Jl(e);if(!n.isFile()||n.size>Yl||!Xl.has(Ql(e)))return!1;let r=await Wl(e,"utf8");return eu(r,t)}o(tu,"scanFile");async function Uo(e,t){let n;try{n=await zl(e,{withFileTypes:!0})}catch(i){if(i.code==="ENOENT")return[];throw i}let r=[];for(let i of n){let s=Vl(e,i.name);if(i.isDirectory()){Gl.has(i.name)||r.push(...await Uo(s,t));continue}i.isFile()&&await tu(s,t)&&r.push(s)}return r}o(Uo,"scanDir");async function Qt(e,t){if(!e||e.length===0)return[];let n=[];for(let r of e)n.push(...await Uo(r,t));return Array.from(new Set(n)).sort()}o(Qt,"scanDirs");async function nu(e){let t=await Qt(e.workflowCapsuleDirs,e.skillName),n=await Qt(e.savedWorkflowDirs,e.skillName),r=await Qt(e.constructedAgentDirs,e.skillName),i=await Qt(e.promptReferenceDirs,e.skillName),s=t.length>0||n.length>0||r.length>0||i.length>0;return{workflowCapsules:t,savedWorkflows:n,constructedAgents:r,promptReferences:i,action:s?"block_until_manual_review":"none"}}o(nu,"computeSkillConsumerImpact");function ru(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")||"turn"}o(ru,"safeIdPart");function iu(e,t){return{stored:!1,result:{destination:"discard",proposalId:e,reason:t}}}o(iu,"discardTurn");function ou(e){return e.completedTurn&&e.userMessage.trim().length>0&&e.assistantMessage.trim().length>0}o(ou,"hasUsableTurnEvidence");async function su(e){let t=[],n=[],r=ru(e.sessionId);if(!ou(e)){for(let i=0;i<e.candidates.length;i+=1){let s=e.candidates[i]?.proposalId??`${r}-${i}`;n.push(iu(s,"learning requires a completed turn with user and assistant evidence"))}return{stored:t,skipped:n}}for(let i=0;i<e.candidates.length;i+=1){let s=e.candidates[i],a=await gr({storePath:e.storePath,learning:{proposalId:s.proposalId??`${r}-${i}`,origin:e.origin??"background_learning",completedTurn:!0,sourceRefs:s.sourceRefs??e.sourceRefs??[`session:${e.sessionId}`],candidate:s.candidate},...s.applyPlan!==void 0?{applyPlan:s.applyPlan}:{},...e.now!==void 0?{now:e.now}:{}});a.stored?t.push(a):n.push(a)}return{stored:t,skipped:n}}o(su,"recordCompletedTurnLearning");var m=class extends Error{static{o(this,"LearningCapabilityError")}code;constructor(t,n){super(n),this.code=t,this.name="LearningCapabilityError"}},au={opportunity:["drafting","archived","rejected"],drafting:["ready","archived","rejected"],ready:["testing","active_learned","promoted_user","archived","rejected","quarantined"],testing:["active_learned","quarantined","archived"],active_learned:["testing","quarantined","archived","promoted_user"],promoted_user:[],quarantined:["ready","testing","active_learned","archived","rejected"],archived:["ready","active_learned","rejected"],rejected:[]};function Bo(e,t){return au[e].includes(t)}o(Bo,"canTransitionLearnedCapability");function Ue(e,t){if(!Bo(e,t))throw new m("invalid_transition",`learned capability cannot transition from ${e} to ${t}`)}o(Ue,"assertLearnedCapabilityTransition");function te(e){let t=e.normalize("NFKD").replace(/[\u0300-\u036f]/g,"").toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,64).replace(/-+$/g,"");if(t.length===0)throw new m("invalid_record","learned capability name must contain letters or numbers");return t}o(te,"slugifyLearnedCapabilityName");function Ho(e){return e==="active_learned"?"activated":e==="promoted_user"?"promoted":e==="quarantined"?"attention":e}o(Ho,"learningEventKindForLifecycle");function wr(e){return e.lastAction==="rollback"?"attention":Ho(e.lifecycle)}o(wr,"learningEventKindForRecord");function Zt(e){return`${e.capabilityId}-r${e.revision}-${wr(e)}`}o(Zt,"learningEventIdFor");import{mkdir as Jo,readFile as cu,readdir as Vo,rename as du,rm as lu,writeFile as uu}from"node:fs/promises";import{basename as tn,dirname as it,join as R,resolve as fu}from"node:path";function Yo(e){return{root:e,skills:R(e,"skills"),extensions:R(e,"extensions"),capabilities:R(e,"capabilities"),events:R(e,"events"),clients:R(e,"clients")}}o(Yo,"resolveLearnedAreaPaths");function Be(e,t){if(!/^[a-zA-Z0-9][a-zA-Z0-9_-]{0,127}$/.test(e))throw new m("invalid_record",`${t} is not a safe file key`)}o(Be,"assertSafeFileKey");async function yr(e,t){await Jo(it(e),{recursive:!0});let n=R(it(e),`.${tn(e)}.${process.pid}-${Date.now().toString(36)}.tmp`);try{await uu(n,`${JSON.stringify(t,null,2)}
24
+ `,"utf8"),await du(n,e)}catch(r){throw await lu(n,{force:!0}),r}}o(yr,"writeJsonAtomic");async function Ee(e){try{return JSON.parse(await cu(e,"utf8"))}catch(t){if(br(t,"ENOENT"))return;throw t instanceof SyntaxError?new m("store_integrity_error",`invalid JSON in ${e}`):t}}o(Ee,"readJson");function W(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}o(W,"isRecord");function br(e,t){return W(e)&&e.code===t}o(br,"isFileError");function en(e,t){if(!W(e)||e.schemaVersion!==1&&e.schemaVersion!==2||typeof e.capabilityId!="string"||typeof e.displayName!="string"||typeof e.slug!="string"||typeof e.revision!="number"||typeof e.createdAt!="string"||typeof e.updatedAt!="string"||!W(e.source)||e.schemaVersion===2&&!pu(e))throw new m("store_integrity_error",`invalid capability record in ${t}`);return e}o(en,"assertCapability");function pu(e){if(e.carrier!=="skill"||!W(e.scope)||!W(e.artifact)||!W(e.provenance)||!W(e.canary))return!1;let t=e.scope,n=e.artifact,r=e.provenance,i=e.canary;return[t.configHomeHash,t.tenantHash,t.projectHash].every(s=>typeof s=="string"&&/^[a-f0-9]{64}$/.test(s))&&n.kind==="skill_markdown"&&typeof n.relativePath=="string"&&typeof n.fingerprint=="string"&&/^[a-f0-9]{64}$/.test(n.fingerprint)&&Number.isSafeInteger(n.contentRevision)&&["jobId","inputHash","decisionId","actionId"].every(s=>typeof r[s]=="string")&&i.maxInvocations===3&&Number.isSafeInteger(i.invocationCount)&&Number.isSafeInteger(i.verifiedSuccesses)&&Number.isSafeInteger(i.credibleNegatives)&&(i.binding===void 0||mu(i.binding))&&Array.isArray(i.invocations)&&i.invocations.every(hu)}o(pu,"isValidV2Capability");function mu(e){return W(e)&&typeof e.bindingId=="string"&&typeof e.ownerSessionRef=="string"&&vr(e.expiresAt)}o(mu,"isValidCanaryBinding");function hu(e){return!W(e)||typeof e.invocationId!="string"||typeof e.bindingId!="string"||!["pending","verified_success","credible_negative","inconclusive"].includes(String(e.status))||!Array.isArray(e.evidenceRefs)||!e.evidenceRefs.every(t=>typeof t=="string")||!vr(e.invokedAt)||e.usageSessionHash!==void 0&&(typeof e.usageSessionHash!="string"||!/^[a-f0-9]{64}$/.test(e.usageSessionHash))||e.artifactRevision!==void 0&&!Number.isSafeInteger(e.artifactRevision)||e.artifactFingerprint!==void 0&&(typeof e.artifactFingerprint!="string"||!/^[a-f0-9]{64}$/.test(e.artifactFingerprint))?!1:e.status==="pending"?e.completedAt===void 0:vr(e.completedAt)}o(hu,"isValidCanaryInvocation");function vr(e){return typeof e=="string"&&Number.isFinite(Date.parse(e))}o(vr,"isValidTimestamp");function qo(e,t){if(!W(e)||e.schemaVersion!==1||typeof e.sequence!="number"||!Number.isSafeInteger(e.sequence)||e.sequence<1||typeof e.eventId!="string"||typeof e.capabilityId!="string"||typeof e.capabilityRevision!="number")throw new m("store_integrity_error",`invalid learning event in ${t}`);return e}o(qo,"assertEvent");function gu(e,t){if(!W(e)||e.schemaVersion!==1||e.clientIdentity!==t||!W(e.events))throw new m("store_integrity_error",`invalid learning client record for ${t}`);return e}o(gu,"assertClient");async function kr(e){try{return(await Vo(e)).filter(t=>t.endsWith(".json")).sort().map(t=>R(e,t))}catch(t){if(br(t,"ENOENT"))return[];throw t}}o(kr,"listJsonFiles");var le=class{static{o(this,"LearnedAreaStore")}paths;#e;constructor(t){let n=fu(t);this.#e=wu(n),this.paths={...Yo(n),events:R(this.#e,"events"),clients:R(this.#e,"clients")}}async initialize(){await Promise.all(Object.values(this.paths).map(t=>Jo(t,{recursive:!0}))),await this.withOwnerMutation(async()=>{for(let t of await this.listCapabilities())await this.ensureCurrentEvent(t)})}async readCapability(t){Be(t,"capabilityId");let n=R(this.paths.capabilities,`${t}.json`),r=await Ee(n);if(r!==void 0)return en(r,n);if(this.#e!==this.paths.root)return;let i=await zo(this.#e,t);if(i.length>1)throw new m("store_integrity_error",`duplicate project capabilityId: ${t}`);let s=i[0];return s===void 0?void 0:en(await Ee(s),s)}async listCapabilities(){let t=await kr(this.paths.capabilities),n=this.#e===this.paths.root?await zo(this.#e):[];return Promise.all([...t,...n].map(async r=>en(await Ee(r),r)))}async writeCapability(t){Be(t.capabilityId,"capabilityId");let n=this.#e===this.paths.root&&t.schemaVersion===2?R(this.#e,"projects",t.scope.tenantHash,t.scope.projectHash,"capabilities"):this.paths.capabilities,r=R(n,`${t.capabilityId}.json`);en(t,r),await yr(r,t)}async writeEvent(t){Be(t.eventId,"eventId"),await yr(R(this.paths.events,`${t.eventId}.json`),t)}async listEvents(){return(await Promise.all((await kr(this.paths.events)).map(async n=>qo(await Ee(n),n)))).sort((n,r)=>n.sequence-r.sequence)}async readClient(t){Be(t,"clientIdentity");let n=R(this.paths.clients,`${t}.json`),r=await Ee(n);return r===void 0?{schemaVersion:1,clientIdentity:t,events:{}}:gu(r,t)}async writeClient(t){Be(t.clientIdentity,"clientIdentity"),await yr(R(this.paths.clients,`${t.clientIdentity}.json`),t)}withOwnerMutation(t){return F(R(this.#e,".owner.lock"),t)}withClientMutation(t,n){return Be(t,"clientIdentity"),F(R(this.paths.clients,`.${t}.lock`),n)}async ensureCurrentEvent(t){let n=Zt(t),r=await Ee(R(this.paths.events,`${n}.json`));if(r!==void 0)return qo(r,n);let i=await this.listEvents(),s=nn(t,(i.at(-1)?.sequence??0)+1);return await this.writeEvent(s),s}};function wu(e){let t=tn(e),n=it(e),r=tn(n),i=it(n);return/^[a-f0-9]{64}$/.test(t)&&/^[a-f0-9]{64}$/.test(r)&&tn(i)==="projects"?it(i):e}o(wu,"globalLearnedAreaRoot");async function zo(e,t){let n=R(e,"projects"),r=[];for(let i of await Wo(n))for(let s of await Wo(R(n,i))){let a=R(n,i,s,"capabilities");if(t!==void 0){let c=R(a,`${t}.json`);await Ee(c)!==void 0&&r.push(c)}else r.push(...await kr(a))}return r.sort()}o(zo,"projectCapabilityFiles");async function Wo(e){try{return(await Vo(e,{withFileTypes:!0})).filter(t=>t.isDirectory()&&/^[a-f0-9]{64}$/.test(t.name)).map(t=>t.name).sort()}catch(t){if(br(t,"ENOENT"))return[];throw t}}o(Wo,"listDirectories");function nn(e,t){return{schemaVersion:1,sequence:t,eventId:Zt(e),capabilityId:e.capabilityId,capabilityRevision:e.revision,kind:wr(e),lifecycle:e.lifecycle,displayName:e.displayName,slug:e.slug,carrier:e.carrier,createdAt:e.updatedAt}}o(nn,"eventFromCapability");import{createHash as yu}from"node:crypto";async function ot(e){let t=await P(e);return{records:Ir(t.proposals.map(n=>ku(n,e))),warnings:t.warnings}}o(ot,"projectLearningProposals");function Ir(e,t=[]){let n=new Set(t);return e.map(r=>{let i=vu(r.slug,r.capabilityId,n);return n.add(i),i===r.slug?r:{...r,slug:i}})}o(Ir,"makeProjectedLearningSlugsUnique");function vu(e,t,n){if(!n.has(e))return e;let r=t.replace(/^lc_/,"").slice(-8),s=`${e.slice(0,Math.max(1,64-r.length-1)).replace(/-+$/g,"")}-${r}`;if(!n.has(s))return s;for(let a=2;a<1e4;a+=1){let c=`${s.slice(0,64-String(a).length-1)}-${a}`;if(!n.has(c))return c}throw new Error(`unable to allocate a unique learned capability slug for ${t}`)}o(vu,"nextAvailableSlug");function ku(e,t){let n=bu(e);return{schemaVersion:1,capabilityId:`lc_${yu("sha256").update(t).update("\0").update(e.proposalId).digest("hex").slice(0,20)}`,displayName:n,slug:te(n),carrier:Iu(e),lifecycle:e.status==="pending"?"ready":e.status==="approved"?"promoted_user":"rejected",revision:1,createdAt:e.createdAt,updatedAt:e.updatedAt,source:{kind:"f224_proposal",proposalId:e.proposalId}}}o(ku,"projectProposal");function bu(e){return"skillName"in e.proposal?e.proposal.skillName:"title"in e.proposal?e.proposal.title:"memoryKind"in e.proposal?`Memory ${e.proposal.memoryKind}`:`Workflow handoff ${e.proposalId.slice(0,8)}`}o(bu,"proposalDisplayName");function Iu(e){return e.proposal.destination==="workflow_handoff"?"workflow_handoff":"skill"}o(Iu,"proposalCarrier");var Go=new Map,Su=25;function _u(e){let t=Go.get(e);if(t)return t;let n=new Set;return Go.set(e,n),n}o(_u,"eventHubFor");var on=class{static{o(this,"FileLearningCenterService")}options;store;now;proposalStores;drivers;waiters;constructor(t){this.options=t;let n=t.rootDir??O("learned");this.store=new le(n),this.waiters=_u(this.store.paths.events),this.now=t.now??(()=>new Date().toISOString()),this.proposalStores=t.proposalStores??[],this.drivers=new Map((t.actionDrivers??[]).map(r=>[r.carrier,r]))}async initialize(){await this.store.initialize()}async list(t={}){let r=(await this.loadCapabilities()).filter(d=>Au(d,t)).sort(ju),i=Pu(t.cursor),s=Math.max(1,Math.min(t.limit??50,200)),a=r.slice(i,i+s),c=i+a.length;return{items:a,...c<r.length?{nextCursor:String(c)}:{},revision:(await this.store.listEvents()).at(-1)?.sequence??0}}async get(t){let n=t.trim().toLowerCase(),r=await this.loadCapabilities(),i=r.find(c=>c.capabilityId.toLowerCase()===n);if(i)return i;let s=r.filter(c=>c.slug.toLowerCase()===n);if(s.length>1)throw new m("ambiguous_name",`learned capability slug is ambiguous: ${t}; use capabilityId ${s.map(c=>c.capabilityId).join(", ")}`);if(s.length===1)return s[0];let a=r.filter(c=>c.displayName.toLowerCase()===n);if(a.length>1)throw new m("ambiguous_name",`learned capability name is ambiguous: ${t}; use capabilityId ${a.map(c=>c.capabilityId).join(", ")}`);if(a.length===1)return a[0];throw new m("capability_not_found",`learned capability not found: ${t}`)}async getSnapshot(){let[t,n,r]=await Promise.all([this.loadCapabilities(),this.store.listEvents(),this.store.readClient(this.options.clientIdentity)]),i=$u(t,n);return{ready:Sr(i,r,"ready",this.now()),newlyActive:Sr(i,r,"activated",this.now()),attention:Sr(i,r,"attention",this.now()),active:t.filter(s=>s.lifecycle==="active_learned").length,revision:n.at(-1)?.sequence??0}}async events(t=0){if(!Number.isSafeInteger(t)||t<0)throw new m("invalid_record","learning event revision is invalid");return(await this.store.listEvents()).filter(n=>n.sequence>t)}subscribe(t={}){return new _r(this.store,this.waiters,t.afterRevision??0)}async acknowledge(t){await this.updateNotificationState(t,"acknowledged")}async markSeen(t){await this.updateNotificationState(t,"seen")}async snooze(t,n){if(!Number.isFinite(Date.parse(n)))throw new m("invalid_record","snooze time must be an ISO timestamp");await this.updateNotificationState(t,"snoozed",n)}async reject(t,n){let r=await this.get(t);if(rn(r,n),r.source.kind==="f224_proposal"){await this.updateF224Proposal(r,"reject");return}await this.transitionByName(t,"rejected",n)}async disable(t,n){await this.transitionByName(t,"archived",n)}async rollback(t,n){await this.executeDriverAction(t,"rollback",n)}async archive(t){await this.transitionByName(t,"archived")}async restore(t){let n=await this.get(t);await this.transitionByName(t,n.previousGoodRevision===void 0?"ready":"active_learned")}async promote(t,n,r){if(n!=="user")throw new m("unsupported_action",`unsupported learned Skill promotion scope: ${String(n)}`);await this.executeDriverAction(t,"promote",r)}async review(t,n){await this.executeDriverAction(t,"review",n)}async trust(t,n){let r=await this.get(t);if(rn(r,n),r.source.kind==="f224_proposal"){await this.updateF224Proposal(r,"trust");return}await this.executeDriverAction(t,"trust",n)}async record(t){return this.store.withOwnerMutation(()=>this.recordUnlocked(t))}async recordUnlocked(t){xu(t);let n=await this.store.readCapability(t.capabilityId);if(n){if(t.revision!==n.revision+1)throw new m("invalid_record","capability revision must increase by one");if(t.lifecycle===n.lifecycle){if(t.lastAction!=="rollback"||t.lifecycle!=="active_learned")throw new m("invalid_transition","same-state revision requires an active rollback")}else Ue(n.lifecycle,t.lifecycle)}let r=(await this.store.listCapabilities()).find(a=>a.slug===t.slug&&a.capabilityId!==t.capabilityId&&Eu(a,t));if(r)throw new m("invalid_record",`learned capability slug is already owned by ${r.capabilityId}: ${t.slug}`);await this.store.writeCapability(t);let i=await this.store.listEvents(),s=nn(t,(i.at(-1)?.sequence??0)+1);return await this.store.writeEvent(s),this.emit(s),t}async transitionByName(t,n,r){return this.store.withOwnerMutation(async()=>{let i=await this.get(t);return rn(i,r),Ue(i.lifecycle,n),this.recordUnlocked({...i,lifecycle:n,revision:i.revision+1,updatedAt:this.now(),...n==="archived"&&i.lifecycle==="active_learned"?{previousGoodRevision:i.revision}:{}})})}async executeDriverAction(t,n,r){await this.store.withOwnerMutation(async()=>{let i=await this.get(t);rn(i,r);let s=this.driverFor(i,n);if(!s)throw new m("unsupported_action",`${n} is not supported for learned ${i.carrier} capabilities`);let a=await s.execute(n,i);if(a===i){if(n==="promote"&&i.lifecycle==="promoted_user")return;throw new m("invalid_record",`${n} driver did not produce a new learned capability revision`)}await this.recordUnlocked(a)})}driverFor(t,n){let r=this.drivers.get(t.carrier);return r?.actions.includes(n)?r:void 0}async loadCapabilities(){let t=await this.store.listCapabilities(),n=(await Promise.all(this.proposalStores.map(ot))).flatMap(s=>s.records),r=Ir(n,t.map(s=>s.slug)),i=new Set(t.map(s=>s.capabilityId));return[...t,...r.filter(s=>!i.has(s.capabilityId))]}async updateNotificationState(t,n,r){await this.store.withClientMutation(this.options.clientIdentity,async()=>{let i=await this.get(t),[s,a]=await Promise.all([this.store.listEvents(),this.store.readClient(this.options.clientIdentity)]),c=s.filter(l=>l.capabilityId===i.capabilityId),d={...a.events};for(let l of c)d[l.eventId]={state:n,capabilityRevision:l.capabilityRevision,updatedAt:this.now(),...r===void 0?{}:{snoozedUntil:r}};await this.store.writeClient({...a,events:d})})}emit(t){let n=[...this.waiters];this.waiters.clear();for(let r of n)r.resolve(t)}async updateF224Proposal(t,n){let r=t.source.proposalId;if(!r)throw new m("store_integrity_error","F224 projection is missing owner metadata");let i=await this.findF224ProposalStore(t,r),s=(await P(i)).proposals.find(c=>c.proposalId===r);if(!s)throw new m("capability_not_found",`F224 proposal not found: ${t.slug}`);if(n==="reject")await de(i,r,"rejected");else{let c=await hr(i,s);if(!c.status.startsWith("approved_"))throw new m("action_failed",`F224 proposal approval was blocked: ${c.status}`)}let a=(await ot(i)).records.find(c=>c.capabilityId===t.capabilityId);if(!a)throw new m("store_integrity_error","F224 projection disappeared after update");await this.record({...a,revision:t.revision+1,createdAt:t.createdAt,updatedAt:this.now()})}async findF224ProposalStore(t,n){for(let r of this.proposalStores)if((await ot(r)).records.some(s=>s.capabilityId===t.capabilityId))return r;throw new m("capability_not_found",`F224 proposal owner was not found: ${n}`)}},_r=class{static{o(this,"LearningEventSubscription")}store;waiters;cursor;closed=!1;pendingWaiter;nextQueue=Promise.resolve();constructor(t,n,r){if(this.store=t,this.waiters=n,!Number.isSafeInteger(r)||r<0)throw new m("invalid_record","learning event revision is invalid");this.cursor=r}[Symbol.asyncIterator](){return this}next(){let t=this.nextQueue.then(()=>this.readNext());return this.nextQueue=t.then(()=>{},()=>{this.closed=!0}),t}async readNext(){for(;!this.closed;){let t=(await this.store.listEvents()).find(r=>r.sequence>this.cursor);if(this.closed)break;if(t)return this.deliver(t);let n=await this.registerAndRecheck();if(this.closed||n===void 0)break;if(n!==null&&!(n.sequence<=this.cursor))return this.deliver(n)}return{done:!0,value:void 0}}async return(){this.closed=!0;let t=this.pendingWaiter;return this.pendingWaiter=void 0,t&&(this.waiters.delete(t),t.resolve(void 0)),{done:!0,value:void 0}}async registerAndRecheck(){let t,n=new Promise(r=>{t={resolve:r},this.pendingWaiter=t,this.waiters.add(t)});try{let r=(await this.store.listEvents()).find(i=>i.sequence>this.cursor);return this.closed?void 0:r||await Promise.race([n,new Promise(i=>{setTimeout(()=>i(null),Su)})])}finally{t&&this.waiters.delete(t),this.pendingWaiter===t&&(this.pendingWaiter=void 0)}}deliver(t){return this.cursor=t.sequence,{done:!1,value:t}}};function Ru(e){return new on(e)}o(Ru,"createLearningCenterService");function xu(e){if(e.schemaVersion!==1&&e.schemaVersion!==2||e.capabilityId.length===0||e.displayName.trim().length===0||e.slug!==te(e.slug)||!Number.isSafeInteger(e.revision)||e.revision<1)throw new m("invalid_record","invalid learned capability record")}o(xu,"validateRecord");function Eu(e,t){return e.schemaVersion!==2||t.schemaVersion!==2?e.schemaVersion===t.schemaVersion:e.scope.configHomeHash===t.scope.configHomeHash&&e.scope.tenantHash===t.scope.tenantHash&&e.scope.projectHash===t.scope.projectHash}o(Eu,"hasSameCapabilityOwner");function rn(e,t){if(t!==void 0&&(t.authority!=="explicit_user"||e.revision!==t.expectedRevision||t.expectedFingerprint!==void 0&&(e.schemaVersion!==2||e.artifact.fingerprint!==t.expectedFingerprint)))throw new m("invalid_record","explicit user action expected revision or fingerprint changed")}o(rn,"assertExplicitAuthority");function Au(e,t){if(t.carrier!==void 0&&e.carrier!==t.carrier||t.lifecycle!==void 0&&e.lifecycle!==t.lifecycle)return!1;if(t.search===void 0)return!0;let n=t.search.trim().toLowerCase();return e.displayName.toLowerCase().includes(n)||e.slug.includes(n)}o(Au,"matchesQuery");function ju(e,t){let n={ready:0,quarantined:1,active_learned:2,testing:3,drafting:4,opportunity:5,archived:6,rejected:7,promoted_user:8};return n[e.lifecycle]-n[t.lifecycle]||t.updatedAt.localeCompare(e.updatedAt)||e.slug.localeCompare(t.slug)}o(ju,"compareCapabilities");function Pu(e){if(e===void 0)return 0;let t=Number(e);if(!Number.isSafeInteger(t)||t<0)throw new m("invalid_record","learning query cursor is invalid");return t}o(Pu,"parseCursor");function $u(e,t){let n=new Map(e.map(r=>[r.capabilityId,r.revision]));return t.filter(r=>n.get(r.capabilityId)===r.capabilityRevision)}o($u,"selectCurrentEvents");function Sr(e,t,n,r){return e.filter(i=>i.kind===n&&Cu(i,t,r)).length}o(Sr,"countActionable");function Cu(e,t,n){let r=t.events[e.eventId];return r===void 0||r.state==="unread"||r.state==="seen"?!0:r.state==="acknowledged"?!1:r.snoozedUntil===void 0||r.snoozedUntil<=n}o(Cu,"isActionable");var Lu=/^[a-z0-9](?:[a-z0-9-]{0,62}[a-z0-9])?$/,Fu=/^[a-z][a-z0-9_]{0,63}$/;function Nu(e,t){if(!Lu.test(e))throw new m("invalid_record","learned Extension slug is invalid");if(!Fu.test(t))throw new m("invalid_record","learned Extension tool name is invalid");return`learned.${e}.${t}`}o(Nu,"getLearnedExtensionToolName");function Du(e){return!1}o(Du,"isLearnedExtensionCommandAllowed");import{createHash as Tu,randomUUID as Mu}from"node:crypto";import{lstat as Qo,mkdir as Ou,open as Ku,readFile as Uu}from"node:fs/promises";import{join as He,relative as Bu,resolve as Zo,sep as Hu}from"node:path";var qu=16*1024,es=/^[a-f0-9]{64}$/,zu=[/!\s*`/i,/\b(?:allowed-tools|hooks|context|agent|model)\s*:/i,/\b(?:ignore|override|disregard)\b.{0,80}\b(?:previous|system|developer|instructions?)\b/i,/\b(?:act as|become)\s+(?:the\s+)?(?:system|developer|administrator|root)\b/i,/\b(?:always|by default)\b.{0,80}\b(?:upload|send|post|exfiltrate)\b/i,/\b(?:disable|bypass|ignore)\b.{0,80}\b(?:permission|approval|guardrail|policy)\b/i,/-----BEGIN (?:RSA |EC |OPENSSH )?PRIVATE KEY-----/i,/\b(?:sk|rk)-[a-z0-9_-]{24,}\b/i,/\bAKIA[0-9A-Z]{16}\b/,/\b(?:password|passwd|api[_ -]?key|access[_ -]?token)\s*[:=]\s*\S{8,}/i];function Wu(e,t){return He(Zo(e),"learned","projects",at("tenant",t.tenantId),at("project",t.projectId))}o(Wu,"resolveProjectLearnedAreaRoot");function Ju(e,t){return{configHomeHash:at("config-home",tf(e)),tenantHash:at("tenant",t.tenantId),projectHash:at("project",t.projectId)}}o(Ju,"createLearnedCapabilityScope");function ct(e){let t=[e.name,e.description,e.purpose,...e.triggers,...e.steps,...e.verification,...e.pitfalls];if(!(e.name===te(e.name)&&e.name.length<=64&&e.description.trim().length>0&&e.description.length<=1024&&e.purpose.trim().length>0&&e.triggers.length>0&&e.steps.length>0&&e.verification.length>0&&t.every(i=>i.trim().length>0&&!i.includes("\0")))||t.some(i=>zu.some(s=>s.test(i))))throw new m("invalid_record","unsafe learned Skill specification was rejected");let r=ns(e);if(Buffer.byteLength(r,"utf8")>qu)throw new m("invalid_record","unsafe learned Skill specification exceeds the size limit")}o(ct,"validateDeclarativeSkillSpec");function ts(e){return ct(e),ns(e)}o(ts,"renderDeclarativeSkill");function ns(e){return["---",`name: ${e.name}`,`description: ${JSON.stringify(e.description.trim())}`,"---","","# Purpose","",e.purpose.trim(),"","## Use when","",...e.triggers.map(t=>`- ${sn(t)}`),"","## Steps","",...e.steps.map((t,n)=>`${n+1}. ${sn(t)}`),"","## Verification","",...e.verification.map(t=>`- ${sn(t)}`),"","## Pitfalls","",...e.pitfalls.map(t=>`- ${sn(t)}`),""].join(`
25
+ `)}o(ns,"renderDeclarativeSkillUnchecked");async function rs(e,t,n){ss(t);let r=ts(n),i=Er(r),s=He(e,"skills",t,"revisions",i),a=He(s,"SKILL.md");await st(e),await st(He(e,"skills")),await st(He(e,"skills",t)),await st(He(e,"skills",t,"revisions")),await st(s);try{let c=await Ku(a,"wx");try{await c.writeFile(r,"utf8")}finally{await c.close()}}catch(c){if(!nf(c,"EEXIST"))throw c;if(await Xo(a),await Uu(a,"utf8")!==r)throw new m("store_integrity_error","content-addressed learned Skill revision does not match its fingerprint")}return await Xo(a),{kind:"skill_markdown",relativePath:Bu(e,a).split(Hu).join("/"),fingerprint:i,contentRevision:1,absolutePath:a}}o(rs,"stageLearnedSkillRevision");function is(e){ss(e.capabilityId),Zu(e.artifact),Qu(e.scope);let t=e.now??new Date().toISOString(),n=e.previous;return{schemaVersion:2,capabilityId:e.capabilityId,displayName:e.displayName.trim(),slug:te(e.artifact.relativePath.split("/").at(-4)??e.displayName),carrier:"skill",lifecycle:"testing",revision:(n?.revision??0)+1,createdAt:n?.createdAt??t,updatedAt:t,source:{kind:"skill_learning_loop"},artifactPath:e.artifact.relativePath,scope:e.scope,artifact:as(e.artifact),...n===void 0?{}:{previousGoodRevision:n.lifecycle==="active_learned"?n.artifact.contentRevision:n.previousGoodRevision,previousGoodArtifact:n.lifecycle==="active_learned"?n.artifact:n.previousGoodArtifact,previousLifecycle:n.lifecycle},provenance:e.provenance,canary:{maxInvocations:3,invocationCount:0,verifiedSuccesses:0,credibleNegatives:0,invocations:[]}}}o(is,"createLearnedSkillRecord");async function Vu(e,t){ct(t.spec);let n=t.now??new Date().toISOString(),r=t.operation==="patch"?t.targetCapabilityId:ef(t.spec.name,t.scope);if(r===void 0)throw new m("invalid_record","learned Skill patch target is missing");let i=await rs(e.paths.root,r,t.spec),s=o(async a=>e.withOwnerMutation(async()=>{await a();let c=await e.readCapability(r);if(c!==void 0&&C(c)&&c.provenance.actionId===t.provenance.actionId)return c;let d;if(t.operation==="patch"){if(c===void 0||!C(c))throw new m("capability_not_found","learned Skill patch target was not found");if(c.source.kind!=="skill_learning_loop"||c.artifact.contentRevision!==t.expectedRevision||c.artifact.fingerprint!==t.expectedFingerprint)throw new m("invalid_record","learned Skill patch expected revision or fingerprint changed");d=c}else{let h=(await e.listCapabilities()).find(g=>g.slug===t.spec.name&&g.capabilityId!==r);if(c!==void 0||h!==void 0)throw new m("invalid_record","learned Skill create target already exists")}let l={...as(i),contentRevision:d===void 0?1:d.artifact.contentRevision+1},u=(t.protectedSkillNames??[]).includes(t.spec.name),f=t.disposition==="project_canary"&&!u?"testing":"ready",p={...is({capabilityId:r,displayName:t.spec.name,scope:t.scope,artifact:l,provenance:t.provenance,now:n,...d===void 0?{}:{previous:d}}),slug:t.spec.name,lifecycle:f,...u?{diagnostics:["formal Skill name collision requires explicit user review"]}:{}};return await a(),await e.writeCapability(p),await e.ensureCurrentEvent(p),p}),"commit");return t.authority===void 0?s(async()=>{}):t.authority.commit(s)}o(Vu,"commitLearnedSkillRevision");async function Rr(e,t,n){let r=n.now??new Date,i=Math.max(1e3,n.ttlMs??5*6e4);return cn(e,t,r.toISOString(),s=>{let a=Gu(s,r);if(a.lifecycle!=="testing")return{record:a,result:void 0,changed:a!==s};if(a.canary.invocationCount>=a.canary.maxInvocations)return{record:a,result:void 0,changed:a!==s};let c=a.canary.binding;if(c!==void 0&&c.bindingId!==n.bindingId&&Date.parse(c.expiresAt)>r.getTime())return{record:a,result:void 0,changed:a!==s};let d={bindingId:n.bindingId,ownerSessionRef:n.ownerSessionRef,expiresAt:new Date(r.getTime()+i).toISOString()};return{record:{...a,canary:{...a.canary,binding:d}},result:d,changed:c?.bindingId!==d.bindingId||c.expiresAt!==d.expiresAt}})}o(Rr,"admitLearnedSkillBinding");async function Yu(e,t,n,r=new Date().toISOString()){return cn(e,t,r,i=>i.canary.binding?.bindingId!==n?{record:i,result:!1,changed:!1}:{record:os(i,n,new Date(r),"released canary invocation recovered as inconclusive","host:learned-skill-binding-release"),result:!0,changed:!0})}o(Yu,"releaseLearnedSkillBinding");async function xr(e,t,n){let r=n.now??new Date,i=n.invocationId??Mu();return cn(e,t,r.toISOString(),s=>{if(s.lifecycle!=="testing")throw new m("invalid_transition","learned Skill is not in canary testing");if(n.artifactRevision!==void 0&&s.artifact.contentRevision!==n.artifactRevision||n.artifactFingerprint!==void 0&&s.artifact.fingerprint!==n.artifactFingerprint)throw new m("invalid_record","learned Skill invocation expected revision or fingerprint changed");let a=s.canary.binding;if(a?.bindingId!==n.bindingId||Date.parse(a.expiresAt)<=r.getTime())throw new m("action_failed","learned Skill canary binding is not authoritative");let c=s.canary.invocations.find(u=>u.invocationId===i);if(c!==void 0){if(c.bindingId!==n.bindingId)throw new m("store_integrity_error","learned Skill invocation identity belongs to another binding");return{record:s,result:{invocationId:i,invocationCount:s.canary.invocationCount,maxInvocations:3},changed:!1}}if(s.canary.invocationCount>=s.canary.maxInvocations)throw new m("action_failed","learned Skill canary is exhausted");let d={invocationId:i,bindingId:n.bindingId,...n.usageSessionHash===void 0?{}:{usageSessionHash:n.usageSessionHash},...n.artifactRevision===void 0?{}:{artifactRevision:n.artifactRevision},...n.artifactFingerprint===void 0?{}:{artifactFingerprint:n.artifactFingerprint},status:"pending",evidenceRefs:[],invokedAt:r.toISOString()},l=s.canary.invocationCount+1;return{record:{...s,canary:{...s.canary,invocationCount:l,invocations:[...s.canary.invocations,d]}},result:{invocationId:i,invocationCount:l,maxInvocations:3},changed:!0}})}o(xr,"invokeLearnedSkillCanary");async function an(e,t,n){let r=n.now??new Date().toISOString();return cn(e,t,r,i=>{let s=i.canary.invocations.find(h=>h.invocationId===n.invocationId);if(s===void 0)throw new m("capability_not_found","learned Skill invocation was not found");if(s.status!=="pending")return{record:i,result:i,changed:!1};if(n.evidenceRefs.length===0)throw new m("invalid_record","learned Skill outcome requires evidence");let a=i.canary.invocations.map(h=>h.invocationId===n.invocationId?{...h,status:n.outcome,evidenceRefs:[...n.evidenceRefs],completedAt:r}:h),c=i.canary.verifiedSuccesses+(n.outcome==="verified_success"?1:0),d=i.canary.credibleNegatives+(n.outcome==="credible_negative"?1:0),l=a.some(h=>h.status==="pending"),u=i.canary.invocationCount>=i.canary.maxInvocations&&!l,f=d>0?"quarantined":u&&c>0?"active_learned":u?"ready":i.lifecycle,p={...i,lifecycle:f,...f==="active_learned"&&i.previousGoodArtifact===void 0?{previousGoodRevision:i.artifact.contentRevision,previousGoodArtifact:i.artifact}:{},canary:{...i.canary,verifiedSuccesses:c,credibleNegatives:d,invocations:a}};return{record:p,result:p,changed:!0}})}o(an,"completeLearnedSkillOutcome");function Gu(e,t){let n=e.canary.binding;return n===void 0||Date.parse(n.expiresAt)>t.getTime()?e:os(e,n.bindingId,t,"expired canary invocation recovered as inconclusive","host:learned-skill-binding-expired")}o(Gu,"recoverExpiredCanary");function os(e,t,n,r,i){let s=!1,a=e.canary.invocations.map(u=>u.bindingId!==t||u.status!=="pending"?u:(s=!0,{...u,status:"inconclusive",evidenceRefs:u.evidenceRefs.length>0?u.evidenceRefs:[i],completedAt:n.toISOString()})),{binding:c,...d}=e.canary,l=d.invocationCount>=d.maxInvocations&&!a.some(u=>u.status==="pending");return{...e,lifecycle:l&&e.lifecycle==="testing"?"ready":e.lifecycle,canary:{...d,invocations:a},...s?{diagnostics:[...new Set([...e.diagnostics??[],r])]}:{}}}o(os,"settleCanaryBinding");async function Xu(e,t,n){let r=n.now??new Date().toISOString();return e.withOwnerMutation(async()=>{await n.revalidateAuthority?.();let i=await e.readCapability(t);if(i===void 0||!C(i))throw new m("capability_not_found","learned Skill record was not found");if(i.source.kind!=="skill_learning_loop"||i.artifact.contentRevision!==n.expectedRevision||i.artifact.fingerprint!==n.expectedFingerprint)throw new m("invalid_record","learned Skill quarantine expected revision or fingerprint changed");if(i.lifecycle==="quarantined")return i;let s={...i,lifecycle:"quarantined",revision:i.revision+1,updatedAt:r,diagnostics:[...new Set([...i.diagnostics??[],n.reason])]};return await n.revalidateAuthority?.(),await e.writeCapability(s),await e.ensureCurrentEvent(s),s})}o(Xu,"quarantineLearnedSkillRevision");function C(e){return e.schemaVersion===2}o(C,"isLearnedCapabilityRecordV2");async function cn(e,t,n,r){return e.withOwnerMutation(async()=>{let i=await e.readCapability(t);if(i===void 0||!C(i))throw new m("capability_not_found","learned Skill record was not found");let s=r(i);if(!s.changed)return s.result;let a={...s.record,revision:i.revision+1,updatedAt:n};return await e.writeCapability(a),await e.ensureCurrentEvent(a),s.result===s.record?a:s.result})}o(cn,"mutateLearnedSkill");function ss(e){if(!/^[a-zA-Z0-9][a-zA-Z0-9_-]{0,127}$/.test(e))throw new m("invalid_record","learned Skill capabilityId is unsafe")}o(ss,"assertSafeCapabilityId");function Qu(e){if(![e.configHomeHash,e.tenantHash,e.projectHash].every(t=>es.test(t)))throw new m("invalid_record","learned Skill project scope is invalid")}o(Qu,"assertScope");function Zu(e){if(e.kind!=="skill_markdown"||!es.test(e.fingerprint)||e.contentRevision<1||e.relativePath.startsWith("/")||e.relativePath.includes("\\")||e.relativePath.split("/").some(t=>t===".."||t==="."))throw new m("invalid_record","learned Skill artifact reference is invalid")}o(Zu,"assertArtifact");function as(e){return{kind:e.kind,relativePath:e.relativePath,fingerprint:e.fingerprint,contentRevision:e.contentRevision}}o(as,"withoutAbsolutePath");function sn(e){return e.trim().replace(/\s+/g," ")}o(sn,"oneLine");function Er(e){return Tu("sha256").update(e,"utf8").digest("hex")}o(Er,"sha256");function ef(e,t){return`lc_skill_${Er([e,t.configHomeHash,t.tenantHash,t.projectHash].join("\0")).slice(0,24)}`}o(ef,"learnedSkillCapabilityId");function at(e,t){return Er(`${e}\0${t}`)}o(at,"scopedHash");function tf(e){let t=Zo(e);return process.platform==="win32"?t.toLowerCase():t}o(tf,"normalizePath");async function st(e){await Ou(e,{recursive:!0});let t=await Qo(e);if(!t.isDirectory()||t.isSymbolicLink())throw new m("store_integrity_error",`learned Skill directory is not an owned regular directory: ${e}`)}o(st,"ensureOwnedDirectory");async function Xo(e){let t=await Qo(e);if(!t.isFile()||t.isSymbolicLink())throw new m("store_integrity_error",`learned Skill artifact is not a regular file: ${e}`)}o(Xo,"assertRegularFile");function nf(e,t){return typeof e=="object"&&e!==null&&"code"in e&&e.code===t}o(nf,"isFileError");import{createHash as rf,randomUUID as of}from"node:crypto";import{link as sf,lstat as Cr,mkdir as cs,open as af,readFile as ds,rm as cf}from"node:fs/promises";import{basename as df,dirname as lf,join as dt,relative as uf,resolve as qe,sep as jr}from"node:path";var ff=["review","trust","rollback","promote"];function pf(e){return{carrier:"skill",actions:ff,execute:o(async(t,n)=>{let r=mf(n),i=e.now?.()??new Date().toISOString();if(t==="rollback")return hf(r,i);if(t==="review")return Ar(r,"testing",i,{canary:us(),lastAction:t});if(t==="trust")return Ar(r,"active_learned",i,{previousGoodRevision:r.previousGoodRevision??r.artifact.contentRevision,previousGoodArtifact:r.previousGoodArtifact??r.artifact,lastAction:t});if(t==="promote")return await gf(e,r),r.lifecycle==="promoted_user"?r:Ar(r,"promoted_user",i,{lastAction:t});throw new m("unsupported_action",`unsupported learned Skill action: ${String(t)}`)},"execute")}}o(pf,"createLearnedSkillActionDriver");function mf(e){if(!C(e)||e.source.kind!=="skill_learning_loop")throw new m("unsupported_action","the capability is not an F263 learned Skill");return e}o(mf,"requireLearnedSkill");function Ar(e,t,n,r){return e.lifecycle!==t&&Ue(e.lifecycle,t),{...e,...r,lifecycle:t,revision:e.revision+1,updatedAt:n}}o(Ar,"transitionRecord");function hf(e,t){if(e.previousGoodArtifact===void 0||e.previousGoodRevision===void 0)throw new m("invalid_transition","learned Skill has no immutable previous good revision");let n=e.previousGoodArtifact;return{...e,lifecycle:"active_learned",revision:e.revision+1,updatedAt:t,lastAction:"rollback",artifactPath:n.relativePath,artifact:n,previousGoodRevision:n.contentRevision,previousGoodArtifact:n,previousLifecycle:e.lifecycle,canary:us()}}o(hf,"rollbackRecord");function us(){return{maxInvocations:3,invocationCount:0,verifiedSuccesses:0,credibleNegatives:0,invocations:[]}}o(us,"resetCanary");async function gf(e,t){let n=kf(e,t),r=qe(n,...t.artifact.relativePath.split("/"));$r(r,n),await vf(n,r,"learned Skill promotion source contains a symlink or non-regular path");let i=await ds(r,"utf8");if(bf(i)!==t.artifact.fingerprint)throw new m("store_integrity_error","learned Skill promotion source fingerprint changed");let s=await yf(e.userSkillsRoot,t.slug);if($r(s,e.userSkillsRoot),await wf(s,i))return;let a=await Cr(s);if(a.isSymbolicLink()||!a.isFile())throw new m("store_integrity_error","formal user Skill target is not a regular file");if(await ds(s,"utf8")!==i)throw new m("action_failed",`formal user Skill already exists with different content: ${t.slug}`)}o(gf,"promoteExactArtifact");async function wf(e,t){let n=dt(lf(e),`.${df(e)}.${process.pid}.${of()}.tmp`),r;try{r=await af(n,"wx"),await r.writeFile(t,"utf8"),await r.sync(),await r.close(),r=void 0;try{return await sf(n,e),!0}catch(i){if(fs(i,"EEXIST"))return!1;throw i}}finally{try{await r?.close()}finally{await cf(n,{force:!0})}}}o(wf,"publishFormalSkill");async function yf(e,t){let n=qe(e);await cs(n,{recursive:!0}),await Pr(n,"formal user Skill root is not a regular directory");let r=qe(n,t);$r(r,n);try{await cs(r)}catch(i){if(!fs(i,"EEXIST"))throw i}return await Pr(r,"formal user Skill path contains a symlink or non-regular directory"),dt(r,"SKILL.md")}o(yf,"preparePromotionDestination");async function vf(e,t,n){let r=qe(e);await Pr(r,n);let i=uf(r,t).split(jr),s=r;for(let[a,c]of i.entries()){s=dt(s,c);let d=await Cr(s),l=a===i.length-1;if(d.isSymbolicLink()||(l?!d.isFile():!d.isDirectory()))throw new m("store_integrity_error",n)}}o(vf,"assertRegularFileChain");async function Pr(e,t){let n=await Cr(e);if(n.isSymbolicLink()||!n.isDirectory())throw new m("store_integrity_error",t)}o(Pr,"assertRegularDirectory");function kf(e,t){let n=qe(e.learnedAreaRoot);return e.learnedAreaKind==="project"||e.learnedAreaKind===void 0&&n.endsWith(dt("projects",t.scope.tenantHash,t.scope.projectHash))?n:dt(n,"projects",t.scope.tenantHash,t.scope.projectHash)}o(kf,"capabilityAreaRoot");function $r(e,t){let n=ls(t),r=ls(e);if(r!==n&&!r.startsWith(n.endsWith(jr)?n:`${n}${jr}`))throw new m("store_integrity_error","learned Skill path escaped its configured owner root")}o($r,"assertInside");function ls(e){let t=qe(e);return process.platform==="win32"?t.toLowerCase():t}o(ls,"comparable");function bf(e){return rf("sha256").update(e,"utf8").digest("hex")}o(bf,"sha256");function If(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}o(If,"isRecord");function fs(e,t){return If(e)&&e.code===t}o(fs,"isFileError");import{createHash as Sf}from"node:crypto";import{lstat as Lr,mkdir as _f,open as Rf,readFile as xf,readdir as ps}from"node:fs/promises";import{join as ze,resolve as lt}from"node:path";var Ef=".legacy-skill-import-v1.json",Af=16*1024,jf=[/!\s*`/i,/\b(?:allowed-tools|hooks|context|agent|model)\s*:/i,/-----BEGIN (?:RSA |EC |OPENSSH )?PRIVATE KEY-----/i,/\b(?:sk|rk)-[a-z0-9_-]{24,}\b/i];async function Pf(e,t,n){let r=ze(t.paths.root,Ef);return t.withOwnerMutation(async()=>{if(await Df(r))return{migratedActive:0,recordedAttention:0,alreadyComplete:!0};let i=ze(lt(e),"learned"),s=ze(i,"skills"),a=(await new le(i).listCapabilities()).filter(l=>l.schemaVersion===1),c=0,d=0;for(let l of await Nf(s)){let u=ze(s,l,"SKILL.md"),f=await Cf(ze(s,l),u),p=a.find(y=>Lf(y,l,u)),h=f===void 0?void 0:ms(f),g=$f(n,l,p,h);await t.readCapability(g.capabilityId)===void 0&&(await t.writeCapability(g),await t.ensureCurrentEvent(g),d+=1)}return await Tf(r,{version:1,migratedActive:c,recordedAttention:d,completedAt:new Date().toISOString()}),{migratedActive:c,recordedAttention:d,alreadyComplete:!1}})}o(Pf,"migrateLegacyLearnedSkillsForProject");function $f(e,t,n,r){let i=new Date().toISOString();return{schemaVersion:1,capabilityId:Ff(e,`attention:${t}`),displayName:n?.displayName??t,slug:te(n?.slug??t),carrier:"skill",lifecycle:"ready",revision:1,createdAt:n?.createdAt??i,updatedAt:i,source:{kind:"legacy_manual"},artifactPath:ze("legacy-loose",t,"SKILL.md"),diagnostics:[r===void 0?"legacy loose Skill failed the regular-file/content safety gate and was not activated":"legacy v1 Skill had no trusted historical fingerprint and was not activated"]}}o($f,"attentionLegacyRecord");async function Cf(e,t){try{let n=await Lr(e),r=await Lr(t);if(!n.isDirectory()||n.isSymbolicLink()||!r.isFile()||r.isSymbolicLink()||(await ps(e)).some(a=>a!=="SKILL.md"))return;let s=await xf(t,"utf8");return Buffer.byteLength(s,"utf8")>Af||jf.some(a=>a.test(s))?void 0:s}catch(n){if(Fr(n,"ENOENT"))return;throw n}}o(Cf,"safeLegacyContent");function Lf(e,t,n){if(e.carrier!=="skill")return!1;let r=e.artifactPath;if(r===void 0)return e.slug===t;let i=lt(r);return i===lt(n)||i===lt(n,"..")||e.slug===t}o(Lf,"legacyRecordMatches");function Ff(e,t){return`lc_legacy_${ms([e.configHomeHash,e.tenantHash,e.projectHash,t].join("\0")).slice(0,24)}`}o(Ff,"legacyCapabilityId");async function Nf(e){try{return(await ps(e,{withFileTypes:!0})).filter(t=>t.isDirectory()&&!t.isSymbolicLink()).map(t=>t.name).sort()}catch(t){if(Fr(t,"ENOENT"))return[];throw t}}o(Nf,"directDirectories");async function Df(e){try{return await Lr(e),!0}catch(t){if(Fr(t,"ENOENT"))return!1;throw t}}o(Df,"fileExists");async function Tf(e,t){await _f(lt(e,".."),{recursive:!0});let n=await Rf(e,"wx");try{await n.writeFile(`${JSON.stringify(t,null,2)}
26
+ `,"utf8")}finally{await n.close()}}o(Tf,"writeImmutableJson");function ms(e){return Sf("sha256").update(e,"utf8").digest("hex")}o(ms,"sha256");function Mf(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}o(Mf,"isRecord");function Fr(e,t){return Mf(e)&&e.code===t}o(Fr,"isFileError");import{createHash as ys,randomUUID as Of}from"node:crypto";import{mkdir as Kf,open as Uf,readFile as ft,readdir as vs}from"node:fs/promises";import{dirname as Bf,join as Ae,resolve as ks,sep as hs}from"node:path";async function Hf(e,t){let n=ne("session",t.sessionId),r={version:1,kind:"offered",receiptId:ne("offered",`${n}\0${t.bindingId}\0${t.capabilityId}\0${t.revision}`),sessionHash:n,bindingId:t.bindingId,capabilityId:t.capabilityId,revision:t.revision,fingerprint:t.fingerprint,createdAt:t.now??new Date().toISOString()};return await ut(e,r),r}o(Hf,"recordLearnedSkillOffered");async function qf(e,t){let n=t.now??new Date,r=t.invocationId??Of(),i=ne("session",t.sessionId),s=await e.readCapability(t.capabilityId);if(s===void 0||!C(s)||s.artifact.contentRevision!==t.expectedRevision||s.artifact.fingerprint!==t.expectedFingerprint)throw new m("invalid_record","learned Skill invocation expected revision or fingerprint changed");if(s.lifecycle==="testing"){if(await Rr(e,t.capabilityId,{bindingId:t.bindingId,ownerSessionRef:t.ownerSessionRef,now:n})===void 0)throw new m("action_failed","learned Skill canary binding is owned by another root");await xr(e,t.capabilityId,{bindingId:t.bindingId,invocationId:r,usageSessionHash:i,artifactRevision:t.expectedRevision,artifactFingerprint:t.expectedFingerprint,now:n})}else if(s.lifecycle!=="active_learned")throw new m("invalid_transition","learned Skill revision is not active or in admitted testing");let a=await e.readCapability(t.capabilityId);if(a===void 0||!C(a))throw new m("capability_not_found","learned Skill record disappeared");let c={version:1,kind:"invoked",receiptId:ne("invoked",`${i}\0${r}`),sessionHash:i,bindingId:t.bindingId,invocationId:r,capabilityId:a.capabilityId,revision:t.expectedRevision,fingerprint:t.expectedFingerprint,createdAt:n.toISOString()};return await ut(e,c),c}o(qf,"admitAndRecordLearnedSkillInvocation");async function zf(e,t){if(t.evidenceRefs.length===0)return[];let n=await Nr(e,t.sessionId),r=new Set(n.filter(d=>d.kind==="outcome").map(d=>d.invocationId)),i=n.filter(d=>d.kind==="invoked"&&(t.bindingId===void 0||d.bindingId===t.bindingId)),a=new Set(i.map(d=>d.capabilityId)).size>1?"inconclusive":t.outcome,c=[];for(let d of i){if(r.has(d.invocationId))continue;let l=await e.readCapability(d.capabilityId),u=l!==void 0&&C(l)?l.canary.invocations.find(y=>y.invocationId===d.invocationId):void 0,f=u!==void 0&&u.status!=="pending"?u.status:a,p=u!==void 0&&u.status!=="pending"?u.evidenceRefs:t.evidenceRefs,h=u!==void 0&&u.status!=="pending"?u.completedAt??t.now??new Date().toISOString():t.now??new Date().toISOString();if(l!==void 0&&C(l)&&u?.status==="pending"){let v=(await an(e,d.capabilityId,{invocationId:d.invocationId,outcome:a,evidenceRefs:t.evidenceRefs,now:t.now})).canary.invocations.find(k=>k.invocationId===d.invocationId);v!==void 0&&v.status!=="pending"&&(f=v.status,p=v.evidenceRefs,h=v.completedAt??h)}let g={version:1,kind:"outcome",receiptId:ne("outcome",`${d.sessionHash}\0${d.invocationId}`),sessionHash:d.sessionHash,invocationId:d.invocationId,capabilityId:d.capabilityId,outcome:f,evidenceRefs:[...p],createdAt:h};await ut(e,g),c.push(g)}return c}o(zf,"completeLearnedSkillSessionOutcomes");async function Wf(e,t){let n=ne("session",t.sessionId),r=t.now??new Date().toISOString(),i=[],s=(await e.listCapabilities()).filter(C),a=new Map;for(let c of await Jf(e,n,t.bindingId)){let d=s.find(u=>u.capabilityId===c.capabilityId);if(d===void 0)continue;let l=d.canary.invocations.find(u=>u.invocationId===c.invocationId&&u.bindingId===c.bindingId);if(l===void 0&&(d.lifecycle!=="active_learned"||d.artifact.contentRevision!==c.revision||d.artifact.fingerprint!==c.fingerprint))throw new m("store_integrity_error","learned Skill invocation receipt does not match a current artifact");a.set(`${c.sessionHash}\0${c.invocationId}`,{invoked:c,capability:d,...l===void 0?{}:{canonicalInvocationId:c.invocationId}})}for(let c of s)for(let d of c.canary.invocations){if(d.bindingId!==t.bindingId&&d.status==="pending")continue;let l=d.usageSessionHash??(d.bindingId===t.bindingId?n:void 0);if(l===void 0)continue;let u=ne("invoked",`${l}\0${d.invocationId}`),f=await gs(e,l,u);if(f!==void 0&&f.kind!=="invoked")throw new m("store_integrity_error","learned Skill invocation receipt identity was reused");if(f?.kind==="invoked"&&(f.invocationId!==d.invocationId||f.bindingId!==d.bindingId||f.capabilityId!==c.capabilityId||f.revision!==(d.artifactRevision??c.artifact.contentRevision)||f.fingerprint!==(d.artifactFingerprint??c.artifact.fingerprint)))throw new m("store_integrity_error","learned Skill invocation receipt drifted from canonical invocation");let p=f??{version:1,kind:"invoked",receiptId:u,sessionHash:l,bindingId:d.bindingId,invocationId:d.invocationId,capabilityId:c.capabilityId,revision:d.artifactRevision??c.artifact.contentRevision,fingerprint:d.artifactFingerprint??c.artifact.fingerprint,createdAt:d.invokedAt};f===void 0&&await ut(e,p),a.set(`${p.sessionHash}\0${p.invocationId}`,{invoked:p,capability:c,canonicalInvocationId:d.invocationId})}for(let c of a.values()){let{invoked:d}=c,l=ne("outcome",`${d.sessionHash}\0${d.invocationId}`),u=await gs(e,d.sessionHash,l),f=c.canonicalInvocationId===void 0?void 0:c.capability.canary.invocations.find(y=>y.invocationId===c.canonicalInvocationId);if(u!==void 0){if(u.kind!=="outcome")throw new m("store_integrity_error","learned Skill outcome receipt identity was reused");let y=u.invocationId!==d.invocationId||u.capabilityId!==d.capabilityId,v=f!==void 0&&f.status!=="pending"&&f.completedAt===void 0,k=f!==void 0&&(f.status==="pending"||u.outcome!==f.status||JSON.stringify(u.evidenceRefs)!==JSON.stringify(f.evidenceRefs)||u.createdAt!==f.completedAt);if(y||v||k)throw new m("store_integrity_error","learned Skill outcome receipt drifted from canonical invocation");continue}let p=f?.status==="pending"?await an(e,c.capability.capabilityId,{invocationId:d.invocationId,outcome:"inconclusive",evidenceRefs:["host:learned-skill-binding-release"],now:r}):c.capability,h=f===void 0?void 0:p.canary.invocations.find(y=>y.invocationId===d.invocationId);if(h?.status==="pending")throw new m("store_integrity_error","learned Skill canary invocation did not settle during reconciliation");if(h!==void 0&&h.completedAt===void 0)throw new m("store_integrity_error","learned Skill terminal invocation has no canonical completion time");let g={version:1,kind:"outcome",receiptId:l,sessionHash:d.sessionHash,invocationId:d.invocationId,capabilityId:d.capabilityId,outcome:h?.status??"inconclusive",evidenceRefs:h!==void 0&&h.evidenceRefs.length>0?h.evidenceRefs:["host:learned-skill-binding-release"],createdAt:h?.completedAt??r};await ut(e,g),i.push(g)}return i}o(Wf,"reconcileLearnedSkillBindingOutcomes");async function Jf(e,t,n){let r=dn(e,t),i;try{i=(await vs(r)).filter(a=>a.endsWith(".json")).sort()}catch(a){if(un(a,"ENOENT"))return[];throw a}let s=[];for(let a of i){let c;try{c=JSON.parse(await ft(Ae(r,a),"utf8"))}catch(l){if(!(l instanceof SyntaxError))throw l;H({source:"learning.skill-usage",level:"warn",message:"Invalid unrelated usage receipt was skipped during binding recovery.",detail:{filePath:Ae(r,a)}});continue}if(!ln(c)){if(Dr(c)&&c.kind==="invoked"&&c.bindingId===n)throw new m("store_integrity_error","invalid target learned Skill invocation receipt");Vf(r,a);continue}if(c.kind!=="invoked"||c.bindingId!==n)continue;let d=ne("invoked",`${t}\0${c.invocationId}`);if(c.sessionHash!==t||c.receiptId!==d||a!==`${d}.json`)throw new m("store_integrity_error","target learned Skill invocation receipt identity is invalid");s.push(c)}return s}o(Jf,"listValidBindingInvocations");function Vf(e,t){H({source:"learning.skill-usage",level:"warn",message:"Invalid unrelated usage receipt was skipped during binding recovery.",detail:{filePath:Ae(e,t)}})}o(Vf,"emitInvalidSiblingReceipt");async function Nr(e,t){let n=dn(e,ne("session",t)),r;try{r=(await vs(n)).filter(s=>s.endsWith(".json")).sort()}catch(s){if(un(s,"ENOENT"))return[];throw s}let i=[];for(let s of r){let a=JSON.parse(await ft(Ae(n,s),"utf8"));if(!ln(a))throw new m("store_integrity_error","invalid learned Skill usage receipt");i.push(a)}return i.sort((s,a)=>s.createdAt.localeCompare(a.createdAt)||s.receiptId.localeCompare(a.receiptId))}o(Nr,"listLearnedSkillUsageReceipts");async function Yf(e,t,n={}){let r=(await Nr(e,t)).filter(l=>l.kind==="invoked"&&(n.bindingId===void 0||l.bindingId===n.bindingId)),i=r.at(-1);if(i===void 0||r.some(l=>l.capabilityId!==i.capabilityId))return null;let s=await e.readCapability(i.capabilityId);if(s===void 0||!C(s)||s.artifact.fingerprint!==i.fingerprint||s.artifact.contentRevision!==i.revision)return null;let a=ks(e.paths.root,...s.artifact.relativePath.split("/"));Gf(a,e.paths.root);let c=await ft(a,"utf8");return ys("sha256").update(c,"utf8").digest("hex")!==s.artifact.fingerprint?null:{capabilityId:s.capabilityId,name:s.slug,fingerprint:i.fingerprint,revision:i.revision,invocationId:i.invocationId,content:c}}o(Yf,"exactInvokedSkillSnapshotForSession");async function ut(e,t){let n=Ae(dn(e,t.sessionHash),`${t.receiptId}.json`);await Kf(Bf(n),{recursive:!0});let r=`${JSON.stringify(t,null,2)}
27
+ `;try{let i=await Uf(n,"wx");try{await i.writeFile(r,"utf8")}finally{await i.close()}}catch(i){if(!un(i,"EEXIST"))throw i;let s=JSON.parse(await ft(n,"utf8"));if(!ln(s)||JSON.stringify({...s,createdAt:""})!==JSON.stringify({...t,createdAt:""}))throw new m("store_integrity_error","learned Skill usage receipt drifted")}}o(ut,"writeImmutableReceipt");async function gs(e,t,n){try{let r=JSON.parse(await ft(Ae(dn(e,t),`${n}.json`),"utf8"));if(!ln(r)||r.receiptId!==n||r.sessionHash!==t)throw new m("store_integrity_error","invalid learned Skill usage receipt");return r}catch(r){if(un(r,"ENOENT"))return;throw r}}o(gs,"readUsageReceipt");function dn(e,t){return Ae(e.paths.root,"usage",t)}o(dn,"usageSessionRoot");function ne(e,t){return ys("sha256").update(`${e}\0${t}`,"utf8").digest("hex")}o(ne,"usageHash");function ln(e){return!Dr(e)||e.version!==1||!["offered","invoked","outcome"].includes(String(e.kind))||typeof e.receiptId!="string"||typeof e.sessionHash!="string"||typeof e.capabilityId!="string"||typeof e.createdAt!="string"?!1:e.kind==="offered"?typeof e.bindingId=="string"&&Number.isSafeInteger(e.revision)&&typeof e.fingerprint=="string":e.kind==="invoked"?typeof e.bindingId=="string"&&typeof e.invocationId=="string"&&Number.isSafeInteger(e.revision)&&typeof e.fingerprint=="string":typeof e.invocationId=="string"&&["verified_success","credible_negative","inconclusive"].includes(String(e.outcome))&&Array.isArray(e.evidenceRefs)&&e.evidenceRefs.every(t=>typeof t=="string")}o(ln,"isUsageReceipt");function Gf(e,t){let n=ws(t),r=ws(e);if(r!==n&&!r.startsWith(n.endsWith(hs)?n:`${n}${hs}`))throw new m("store_integrity_error","learned Skill artifact escaped its owner")}o(Gf,"assertInside");function ws(e){let t=ks(e);return process.platform==="win32"?t.toLowerCase():t}o(ws,"comparable");function Dr(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}o(Dr,"isRecord");function un(e,t){return Dr(e)&&e.code===t}o(un,"isFileError");import{createHash as Xf}from"node:crypto";import{lstat as bs,readFile as Qf,readdir as Zf,stat as Tr}from"fs/promises";import{join as pt,dirname as Mr,relative as ep,resolve as fn,sep as Or}from"path";async function pn(e,t){let n=new Map,r=[],s={...Gn(e),...t},a=Xn(s);for(let{path:c,source:d}of a)try{let l=await cp(c,d);for(let u of l)n.has(u.name)||n.set(u.name,u)}catch(l){r.push({path:c,error:l instanceof Error?l.message:String(l)})}if(s.learnedArea!==void 0){let c=await tp(s.learnedArea);r.push(...c.errors);for(let d of c.skills)n.has(d.name)||n.set(d.name,d)}return{skills:n,errors:r}}o(pn,"discoverSkills");async function tp(e){let t=new le(e.rootDir),n=[],r=[],i;try{i=await t.listCapabilities()}catch(s){return{skills:n,errors:[{path:e.rootDir,error:s instanceof Error?s.message:String(s)}]}}for(let s of i){if(!C(s)||!np(s,e)||!rp(s,e))continue;let a=fn(e.rootDir,...s.artifact.relativePath.split("/"));try{sp(a,e.rootDir),await op(e.rootDir,a);let c=await Qf(a,"utf8");if(ap(c)!==s.artifact.fingerprint)throw new Error("learned Skill artifact fingerprint mismatch");let d=await Ut(Mr(a),"learned");if(d===null)throw new Error("learned Skill metadata is invalid");n.push({...d,learned:{capabilityId:s.capabilityId,revision:s.artifact.contentRevision,fingerprint:s.artifact.fingerprint}})}catch(c){let d=c instanceof Error?c.message:String(c);r.push({path:a,error:d}),await ip(t,s,d)}}return{skills:n,errors:r}}o(tp,"scanRecordGatedLearnedArea");function np(e,t){return e.scope.configHomeHash===t.expectedScope.configHomeHash&&e.scope.tenantHash===t.expectedScope.tenantHash&&e.scope.projectHash===t.expectedScope.projectHash}o(np,"scopeMatches");function rp(e,t){if(e.lifecycle==="active_learned")return!0;if(e.lifecycle!=="testing")return!1;let n=t.testingBindings?.[e.capabilityId],r=e.canary.binding;return n!==void 0&&r?.bindingId===n&&Date.parse(r.expiresAt)>Date.parse(t.now??new Date().toISOString())}o(rp,"isRecordAdmitted");async function ip(e,t,n){await e.withOwnerMutation(async()=>{let r=await e.readCapability(t.capabilityId);if(r===void 0||!C(r)||r.revision!==t.revision||r.lifecycle!=="testing"&&r.lifecycle!=="active_learned")return;let i={...r,lifecycle:"quarantined",revision:r.revision+1,updatedAt:new Date().toISOString(),diagnostics:[...r.diagnostics??[],`artifact discovery rejected: ${n}`]};await e.writeCapability(i),await e.ensureCurrentEvent(i)})}o(ip,"quarantineInvalidLearnedArtifact");async function op(e,t){let r=ep(fn(e),t).split(Or),i=fn(e),s=await bs(i);if(!s.isDirectory()||s.isSymbolicLink())throw new Error("learned Skill root is not a regular directory");for(let[a,c]of r.entries()){i=pt(i,c);let d=await bs(i),l=a===r.length-1;if(d.isSymbolicLink()||(l?!d.isFile():!d.isDirectory()))throw new Error("learned Skill artifact contains a symlink or non-regular path")}}o(op,"assertRegularArtifactChain");function sp(e,t){let n=Is(t),r=Is(e);if(r!==n&&!r.startsWith(n.endsWith(Or)?n:`${n}${Or}`))throw new Error("learned Skill artifact escapes its Learned Area")}o(sp,"assertInside");function Is(e){let t=fn(e);return process.platform==="win32"?t.toLowerCase():t}o(Is,"comparablePath");function ap(e){return Xf("sha256").update(e,"utf8").digest("hex")}o(ap,"sha256");async function cp(e,t){let n=[];try{if(!(await Tr(e)).isDirectory())return n;let i=await Zf(e);for(let s of i){let a=pt(e,s);try{if((await Tr(a)).isDirectory()){let d=pt(a,"SKILL.md");try{if((await Tr(d)).isFile()){let u=await Ut(a,t);u&&n.push(u)}}catch{}}}catch{}}}catch{}return n}o(cp,"scanSkillDirectory");function Ss(e,t){let n=[],r=[".kodax/skills"],i=e,s=Mr(t);for(;i!==s&&i!=="/"&&i.length>3;){for(let c of r)n.push(pt(i,c));let a=Mr(i);if(a===i)break;i=a}return n}o(Ss,"getNestedSkillPaths");async function dp(e,t){let n=Ss(e,t),r={projectPaths:[pt(t,".kodax","skills"),...n]};return pn(t,r)}o(dp,"discoverSkillsWithMonorepo");import{execSync as lp}from"child_process";import up from"path";var fp=new Set(["ls","cat","pwd","echo","whoami","date","which","whereis","tree","dir","type","get-childitem","get-content","select-string","get-location","grep","find","awk","sed","head","tail","less","more","wc","git status","git diff","git log","git show","git branch","git remote","git ls-files","git rev-parse","git grep","node","npm","yarn","pnpm","tsc","python","pip","go","cargo","rustc"]);function _s(e){if(!e||!e.trim())return!1;let t=e.trim().replace(/\s+/g," ").toLowerCase();for(let n of fp)if(t===n||t.startsWith(`${n} `)){if(n==="sed"&&t.split(/\s+/).some(s=>s.startsWith("-i")||s==="--in-place"))return!1;if(n==="awk"){let i=t.split(/\s+/);if(i.includes("-f")||i.includes("--file"))return!1}if(["node","npm","yarn","pnpm","tsc","python","pip","go","cargo","rustc"].includes(n)){let i=t.split(/\s+/).slice(1);if(i.length>0&&!i.every(s=>/^(-v|--version|-h|--help)$/.test(s)))return!1}return!0}return!1}o(_s,"isSingleSafeDynamicContextCommand");function pp(e){if(!e||!e.trim())return!1;let t=e.trim().replace(/\\\r?\n/g," ");if(/[<>|;`]|\$\(|(?<!&)&(?!&)/.test(t)||t.includes("\\")&&up.sep!=="\\"&&t.replace(/\\ /g,"").includes("\\"))return!1;let r=t.split(/\s*&&\s*/);if(r.length===1)return _s(r[0]);for(let i of r){let s=i?.trim();if(s&&!/^cd\s+/.test(s.toLowerCase())&&!_s(s))return!1}return!0}o(pp,"isSafeDynamicContextCommand");function Rs(e){let t=[],n="",r=!1,i="";for(let s=0;s<e.length;s++){let a=e[s];r?a===i?r=!1:n+=a:a==='"'||a==="'"?(r=!0,i=a):a===" "?n&&(t.push(n),n=""):n+=a}return n&&t.push(n),t}o(Rs,"parseArguments");var mt=class{static{o(this,"VariableResolver")}context;constructor(t){this.context=t}async resolve(t,n){let r=t,i=Rs(n);return r=this.resolvePositionalArgs(r,i),r=this.resolveArguments(r,n),r=this.resolveEnvVars(r),r=await this.resolveDynamicContext(r),r}resolvePositionalArgs(t,n){return t.replace(/\$(\d+)(?![a-zA-Z0-9_])/g,(r,i)=>{let s=parseInt(i,10);return n[s]??""})}resolveArguments(t,n){return t.replace(/\$ARGUMENTS/g,n)}resolveEnvVars(t){let n={...this.context.environment,CLAUDE_SESSION_ID:this.context.sessionId??"",KODAX_SESSION_ID:this.context.sessionId??"",KODAX_WORKING_DIR:this.context.workingDirectory};return t.replace(/\$\{([A-Za-z_][A-Za-z0-9_]*)\}/g,(r,i)=>n[i]??r)}async resolveDynamicContext(t){let n=/!`([^`]+)`/g,r=[],i;for(;(i=n.exec(t))!==null;)r.push({match:i[0],command:i[1]});if(r.length===0)return t;let s=t;for(let{match:a,command:c}of r)try{let d=await this.executeDynamicCommand(c);s=s.replace(a,d)}catch(d){let l=d instanceof Error?d.message:String(d);s=s.replace(a,`[Error: ${l}]`)}return s}async executeDynamicCommand(t){if(this.context.disableDynamicContext)throw new Error("Dynamic context disabled by host. Skill `!`cmd`` blocks are not allowed in this environment.");if(this.context.executeDynamicContext){let n=await this.context.executeDynamicContext(t,this.context.workingDirectory);return typeof n=="string"?n.trim():""}if(!pp(t))throw new Error("Unsafe dynamic context command blocked. Only simple read-only commands are allowed in !`...` blocks.");try{return lp(t,{cwd:this.context.workingDirectory,encoding:"utf-8",timeout:5e3,maxBuffer:1048576,windowsHide:!0}).trim()}catch(n){throw n instanceof Error?new Error(`Command failed: ${n.message}`):n}}};function mp(e){return new mt(e)}o(mp,"createResolver");async function je(e,t,n){return new mt(n).resolve(e,t)}o(je,"resolveSkillContent");var mn=class{static{o(this,"SkillRegistry")}skillsByName=new Map;fullSkillsByName=new Map;projectRoot;customPaths;constructor(t,n){this.projectRoot=t,this.customPaths=n}async discover(){let t=await pn(this.projectRoot,this.customPaths);this.skillsByName.clear();for(let[n,r]of t.skills)this.skillsByName.set(n,r);if(t.errors.length>0)for(let{path:n,error:r}of t.errors)H({source:"agent:skills",level:"warn",message:`Error scanning ${n}.`,detail:r})}get skills(){return this.skillsByName}get(t){return this.skillsByName.get(t)}async loadFull(t){let n=this.fullSkillsByName.get(t);if(n)return n;let r=this.skillsByName.get(t);if(!r)throw new Error(`Skill not found: ${t}`);let i=await tt(r.path,r.source);if(!i)throw new Error(`Failed to load skill: ${t}`);return this.fullSkillsByName.set(t,i),i}async invoke(t,n,r){try{let i=await this.loadFull(t);return i.disableModelInvocation?{success:!1,content:"",error:`Skill "${t}" has model invocation disabled`}:{success:!0,content:await je(i.content,n,r)}}catch(i){return{success:!1,content:"",error:i instanceof Error?i.message:String(i)}}}async reload(){this.skillsByName.clear(),this.fullSkillsByName.clear(),await this.discover()}list(){return Array.from(this.skillsByName.values())}listUserInvocable(){return this.list().filter(t=>t.userInvocable)}getSystemPromptSnippet(){let t=this.list().filter(r=>!r.disableModelInvocation);if(t.length===0)return"";let n=["## Available Skills","","When users ask you to perform tasks, check if any of the available skills below match the request. Skills provide specialized capabilities and step-by-step instructions for specific workflows.","",'When users reference a "slash command" or "/<something>" (e.g. "/feature-list-tracker", "/skill:foo"), they are referring to a skill. Invoke it via the `skill` tool with the skill name.',"","**BLOCKING REQUIREMENT**: When a skill matches the user's request, you MUST invoke it via the `skill` tool BEFORE generating any other response about the task. Loading the skill is not optional and not something to defer \u2014 it is the FIRST action you take.","","NEVER mention a skill without actually calling the `skill` tool. Do not guess at skill names \u2014 only use skills listed below. Do NOT call `read` on a `SKILL.md` path to load a skill \u2014 that is the legacy path and bypasses the resolver.",""];for(let r of t){let i=r.argumentHint?` ${r.argumentHint}`:"";n.push(`- ${r.name}:${i} ${r.description}`)}return n.push(""),n.join(`
28
+ `)}has(t){return this.skillsByName.has(t)}get size(){return this.skillsByName.size}},We=null,xs;function hn(e,t){return We&&e!==void 0&&xs!==e&&(We=null),We||(We=new mn(e,t),xs=e),We}o(hn,"getSkillRegistry");async function Kr(e,t){let n=hn(e,t);return await n.discover(),n}o(Kr,"initializeSkillRegistry");function hp(){We=null}o(hp,"resetSkillRegistry");var ht=class{static{o(this,"SkillExecutor")}context;constructor(t){this.context=t}async execute(t,n,r){let i=hn();if(!i.has(t))return{success:!1,content:"",error:`Skill not found: ${t}`};try{let s=await i.loadFull(t),a=r?.mode??(s.context==="fork"?"fork":"inline"),c=await je(s.content,n,this.context);return a==="fork"?this.executeFork(s,c,r):this.executeInline(s,c,r)}catch(s){return{success:!1,content:"",error:s instanceof Error?s.message:String(s)}}}async executeInline(t,n,r){let i=this.buildPrompt(t,n);if(r?.onExecute)try{return{success:!0,content:await r.onExecute(i,t)}}catch(s){return{success:!1,content:"",error:s instanceof Error?s.message:String(s)}}return{success:!0,content:i}}async executeFork(t,n,r){return{success:!0,content:this.buildPrompt(t,n),artifacts:[{type:"text",name:"fork-config",content:JSON.stringify({agent:r?.agent??t.agent??"general-purpose",model:r?.model??t.model??"haiku",allowedTools:r?.allowedTools??this.parseAllowedTools(t.allowedTools)})}]}}buildPrompt(t,n){let r=[];return r.push(`[Using Skill: ${t.name}]`),r.push(""),t.allowedTools&&(r.push(`**Allowed Tools**: ${t.allowedTools}`),r.push("")),r.push(n),r.join(`
29
+ `)}parseAllowedTools(t){return t?t.split(",").map(n=>n.trim()).filter(Boolean):[]}};function gp(e){return new ht(e)}o(gp,"createExecutor");async function wp(e,t,n,r){return new ht(n).execute(e,t,r)}o(wp,"executeSkill");function Es(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&apos;")}o(Es,"escapeXml");var Ur=120;function gn(e){return e.replace(/\\/g,"/")}o(gn,"formatDisplayPath");function yp(e){return[...(e.references??[]).map(t=>({folder:"references",file:t})),...(e.scripts??[]).map(t=>({folder:"scripts",file:t})),...(e.assets??[]).map(t=>({folder:"assets",file:t})),...(e.templates??[]).map(t=>({folder:"templates",file:t})),...(e.resources??[]).map(t=>({folder:"resources",file:t}))]}o(yp,"collectSupportFiles");function vp(e){let t=yp(e);if(t.length===0)return[];let n=[["references",e.references],["scripts",e.scripts],["assets",e.assets],["templates",e.templates],["resources",e.resources]],r=["Skill support files are rooted at the skill root above. When the skill references `references/...`, `assets/...`, `scripts/...`, `templates/...`, or `resources/...`, read it from this skill root.","","Support roots:"];for(let[i,s]of n)s?.length&&r.push(`- ${i}/: ${gn(`${e.path}/${i}`)} (${s.length} files)`);r.push("","Support file inventory:");for(let{folder:i,file:s}of t.slice(0,Ur))r.push(`- ${i}/${s.relativePath}: ${gn(s.path)}`);return t.length>Ur&&r.push(`- ... ${t.length-Ur} more files under ${gn(e.path)}`),r}o(vp,"buildSupportFileContext");function kp(e,t,n){let r=[];r.push(`<skill name="${Es(e.name)}" location="${Es(e.path)}">`),r.push(""),r.push(`Skill root: ${gn(e.path)}`),e.source==="builtin"?r.push("This is a built-in KodaX skill."):e.source==="project"?r.push("This is a project-defined skill. Project work paths are relative to the project root; skill support files are relative to the skill root above."):e.source==="user"&&r.push("This is a user-defined skill."),r.push("");let i=vp(e);return i.length>0&&(r.push(...i),r.push("")),r.push(t),n.trim()&&(r.push(""),r.push(`User provided arguments: ${n}`)),r.push(""),r.push("</skill>"),r.join(`
30
+ `)}o(kp,"buildSkillBlock");async function Br(e,t,n){let r=await je(e.content,t,n);return{content:kp(e,r,t),disableModelInvocation:e.disableModelInvocation??!1,skill:e}}o(Br,"expandSkillForLLM");function bp(e,t){let n=`Skill activated: ${e}`;return t.trim()&&(n+=` with arguments: ${t}`),n}o(bp,"formatSkillActivationMessage");import{writeFile as Ls}from"node:fs/promises";import ke from"node:path";import{existsSync as Ip}from"node:fs";import{mkdir as Sp,readFile as Hr,readdir as _p,stat as js,writeFile as vb}from"node:fs/promises";import Rp from"node:os";import ue from"node:path";import{fileURLToPath as Ps,pathToFileURL as xp}from"node:url";import Ep from"yaml";var Pe=null;function $s(e){Pe=e}o($s,"setKodaXSDKForSkillCreator");async function ve(){if(Pe)return Pe;let e=ue.dirname(Ps(import.meta.url)),t=[],n=ue.resolve(e,"../../../index.js");if(Ip(n))return Pe=await import(xp(n).href),Pe;t.push(`relative SDK path not found: ${n}`);try{return Pe=await import(["@kodax-ai","kodax"].join("/")),Pe}catch(r){t.push(`bare-name @kodax-ai/kodax failed: ${r?.code??r?.message}`)}throw new Error(`Cannot locate KodaX SDK from helper script ${import.meta.url}.
31
+ Attempted:
32
+ - ${t.join(`
33
+ - `)}`)}o(ve,"loadKodaXSDK");function Ap(e){let t=e.replace(/^\uFEFF/,"").replace(/\r\n/g,`
34
+ `).replace(/\r/g,`
35
+ `).trimStart();if(!t.startsWith(`---
36
+ `))throw new Error("SKILL.md missing YAML frontmatter");let n=t.indexOf(`
37
+ ---
38
+ `,4);if(n===-1)throw new Error("SKILL.md has unclosed YAML frontmatter");return{yamlText:t.slice(4,n),body:t.slice(n+5).trim()}}o(Ap,"extractFrontmatter");function wn(e){let{yamlText:t,body:n}=Ap(e),r=Ep.parse(t);if(!r||typeof r!="object"||Array.isArray(r))throw new Error("Frontmatter must be a YAML object");return{frontmatter:r,body:n}}o(wn,"parseSkillMarkdown");async function wt(e){let t=ue.join(e,"SKILL.md");if(!(await js(t).catch(()=>null))?.isFile())throw new Error(`SKILL.md not found in ${e}`);let r=await Hr(t,"utf8"),{frontmatter:i,body:s}=wn(r);return{skillDir:ue.resolve(e),skillMdPath:t,rawContent:r,body:s,frontmatter:i}}o(wt,"loadSkill");async function yt(e){try{return await js(e),!0}catch{return!1}}o(yt,"pathExists");function yn(e){if(!e.length)return{mean:0,stddev:0,min:0,max:0};let t=e.reduce((r,i)=>r+i,0)/e.length,n=e.length>1?e.reduce((r,i)=>r+(i-t)**2,0)/(e.length-1):0;return{mean:gt(t),stddev:gt(Math.sqrt(n)),min:gt(Math.min(...e)),max:gt(Math.max(...e))}}o(yn,"calculateStats");function gt(e,t=4){return Number(e.toFixed(t))}o(gt,"roundNumber");function vn(e){return e>=0?`+${e.toFixed(4)}`:e.toFixed(4)}o(vn,"formatDelta");function As(e){try{return JSON.parse(e)}catch{return null}}o(As,"safeJsonParse");function Je(e){let t=As(e.trim());if(t&&typeof t=="object")return t;let n=e.indexOf("{"),r=e.lastIndexOf("}");return n===-1||r===-1||r<=n?null:As(e.slice(n,r+1))}o(Je,"extractJsonObject");async function re(e,t=null){try{return JSON.parse(await Hr(e,"utf8"))}catch{return t}}o(re,"readJsonFile");async function Ve(e,t){let n=ue.dirname(Ps(e));return Hr(ue.resolve(n,t),"utf8")}o(Ve,"loadRelativeText");function K(e,t=12e3){let n=typeof e=="string"?e:String(e??"");if(n.length<=t)return n;let r=n.length-t;return`${n.slice(0,t)}
39
+
40
+ [truncated ${r} chars]`}o(K,"truncateText");function Cs(e){let t=Array.isArray(e)?e.length:0,n=Array.isArray(e)?e.filter(i=>i?.passed===!0).length:0,r=Math.max(t-n,0);return{passed:n,failed:r,total:t,pass_rate:t>0?gt(n/t):0}}o(Cs,"computePassSummary");async function qr(e,t=e,n=[]){let r=await _p(t,{withFileTypes:!0}).catch(()=>[]);for(let i of r.sort((s,a)=>s.name.localeCompare(a.name))){let s=ue.join(t,i.name);if(i.isDirectory()){await qr(e,s,n);continue}i.isFile()&&n.push({absolutePath:s,relativePath:ue.relative(e,s).replace(/\\/g,"/")})}return n}o(qr,"collectFiles");function vt(){return ue.join(Rp.homedir(),".kodax","skills")}o(vt,"getDefaultSkillsDir");async function U(e){return await Sp(e,{recursive:!0}),e}o(U,"ensureDirectory");function jp(e){return e.split("-").filter(Boolean).map(t=>t[0]?.toUpperCase()+t.slice(1)).join(" ")}o(jp,"titleFromSlug");function Pp(e,t){let n=jp(e);return`---
41
+ name: ${e}
42
+ description: ${t}
43
+ user-invocable: true
44
+ allowed-tools: "Read, Grep, Glob"
45
+ compatibility: "Optimized for KodaX and Agent Skills style directories."
46
+ ---
47
+
48
+ # ${n}
49
+
50
+ Describe the task this skill handles, the trigger boundary, and the expected outcome.
51
+
52
+ ## When to use
53
+
54
+ - Use this skill when the user asks for ${n.toLowerCase()}.
55
+ - Do not use this skill when the request only needs a short explanation or is out of scope.
56
+
57
+ ## Workflow
58
+
59
+ 1. Restate the task boundary in one sentence.
60
+ 2. Gather the minimum context needed to do the work well.
61
+ 3. Execute the task, preferring small, verifiable steps.
62
+ 4. Summarize what changed, what was validated, and any remaining risks.
63
+
64
+ ## References
65
+
66
+ - Put deeper guidance in \`references/\`.
67
+ - Put reusable templates or static files in \`assets/\`.
68
+ - Put repeatable helper scripts in \`scripts/\`.
69
+ `}o(Pp,"renderSkillTemplate");function $p(e){return JSON.stringify({skill_name:e,evals:[{id:1,prompt:"TODO: Add a realistic user request to evaluate this skill.",expected_output:"Describe what a successful result should accomplish.",files:[],assertions:[]}]},null,2)}o($p,"renderEvalTemplate");async function Cp(e){let t=ke.resolve(e.baseDir??vt()),n=ke.join(t,e.name),r=e.description??`Describe what ${e.name} does and when it should be used.`;if(await yt(n)&&!e.force)throw new Error(`Skill directory already exists: ${n}`);return await U(n),await U(ke.join(n,"references")),await U(ke.join(n,"assets")),await U(ke.join(n,"scripts")),await Ls(ke.join(n,"SKILL.md"),Pp(e.name,r),"utf8"),e.includeEvals!==!1&&(await U(ke.join(n,"evals")),await Ls(ke.join(n,"evals","evals.json"),`${$p(e.name)}
70
+ `,"utf8")),{skillDir:n,created:["SKILL.md",...e.includeEvals!==!1?["evals/evals.json"]:[],"references/","assets/","scripts/"]}}o(Cp,"initSkill");function Lp(e){let t={name:e[2],baseDir:void 0,description:void 0,force:!1,includeEvals:!0};for(let n=3;n<e.length;n+=1){let r=e[n];(r==="--path"||r==="--dest")&&e[n+1]?t.baseDir=e[++n]:r==="--description"&&e[n+1]?t.description=e[++n]:r==="--force"?t.force=!0:r==="--no-evals"&&(t.includeEvals=!1)}return t}o(Lp,"parseArgs");async function zr(e=process.argv){let t=Lp(e);t.name||(console.error("Usage: node scripts/init-skill.js <skill-name> [--path <skills-dir>] [--description <text>] [--force] [--no-evals]"),process.exit(1));let n=await Cp(t);console.log(`Initialized ${n.skillDir}`)}o(zr,"main");var Fp=!1;Fp&&zr().catch(e=>{console.error(e instanceof Error?e.message:String(e)),process.exit(1)});import Fs from"node:path";var Np=new Set(["name","description","license","compatibility","metadata","allowed-tools","disable-model-invocation","user-invocable","argument-hint","context","agent","model","hooks"]);async function kt(e){let t={valid:!1,errors:[],warnings:[],frontmatter:null},n;try{n=await wt(e)}catch(d){return t.errors.push(d instanceof Error?d.message:String(d)),t}let{frontmatter:r,body:i}=n;t.frontmatter=r;let s=Object.keys(r).filter(d=>!Np.has(d));s.length>0&&t.errors.push(`Unexpected frontmatter keys: ${s.sort().join(", ")}`);let a=typeof r.name=="string"?r.name.trim():"",c=typeof r.description=="string"?r.description.trim():"";if(!a)t.errors.push("Missing required frontmatter field: name");else{/^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(a)||t.errors.push(`Invalid skill name "${a}". Use lowercase kebab-case and avoid consecutive hyphens.`),a.length>64&&t.errors.push(`Skill name is too long (${a.length}/64).`);let d=Fs.basename(Fs.resolve(e));d!==a&&t.warnings.push(`Skill directory name "${d}" does not match frontmatter name "${a}".`)}if(c?(c.length>1024&&t.errors.push(`Description is too long (${c.length}/1024).`),/[<>]/.test(c)&&t.errors.push("Description cannot contain angle brackets."),/[。.!?]/.test(c)||t.warnings.push("Description may be too terse; consider making the trigger conditions clearer.")):t.errors.push("Missing required frontmatter field: description"),i.trim()||t.errors.push("SKILL.md body is empty."),r.compatibility!=null&&(typeof r.compatibility!="string"?t.errors.push("compatibility must be a string if provided."):r.compatibility.length>500&&t.errors.push(`compatibility is too long (${r.compatibility.length}/500).`)),r["allowed-tools"]!=null){let d=r["allowed-tools"];typeof d=="string"||Array.isArray(d)&&d.every(u=>typeof u=="string")||t.errors.push("allowed-tools must be a string or string array.")}return r["disable-model-invocation"]!=null&&typeof r["disable-model-invocation"]!="boolean"&&t.errors.push("disable-model-invocation must be a boolean."),r["user-invocable"]!=null&&typeof r["user-invocable"]!="boolean"&&t.errors.push("user-invocable must be a boolean."),r.context!=null&&r.context!=="fork"&&t.errors.push('context must be "fork" when provided.'),r.hooks!=null&&(typeof r.hooks!="object"||Array.isArray(r.hooks))&&t.errors.push("hooks must be an object when provided."),t.valid=t.errors.length===0,t}o(kt,"validateSkillDirectory");async function Wr(e=process.argv){let t=e[2];t||(console.error("Usage: node scripts/quick-validate.js <skill-directory>"),process.exit(1));let n=await kt(t);if(n.errors.length===0)console.log("Skill is valid.");else{console.error("Skill validation failed:");for(let r of n.errors)console.error(`- ${r}`)}if(n.warnings.length>0){console.log("Warnings:");for(let r of n.warnings)console.log(`- ${r}`)}process.exit(n.valid?0:1)}o(Wr,"main");var Dp=!1;Dp&&Wr().catch(e=>{console.error(e instanceof Error?e.message:String(e)),process.exit(1)});import{readFile as Jr,writeFile as fe}from"node:fs/promises";import S from"node:path";function Tp(e){return typeof e=="string"?{text:e}:e&&typeof e=="object"&&typeof e.text=="string"?{text:e.text}:null}o(Tp,"normalizeAssertion");function Mp(e){return e.reduce((t,n)=>Array.isArray(n.content)?t+n.content.filter(r=>r?.type==="tool_use").length:t,0)}o(Mp,"countToolCalls");function Op(e){return e.reduce((t,n)=>Array.isArray(n.content)?t+n.content.filter(r=>r?.type==="tool_result"&&r.is_error===!0).length:t,0)}o(Op,"countToolErrors");function Kp(e,t){return`${["# Skill Eval Transcript","","## Eval Prompt","",e,"","## Final Response","",t.lastText||"(No final text)","","## Result Flags","",`- success: ${t.success}`,`- signal: ${t.signal??"none"}`,`- interrupted: ${t.interrupted===!0}`,`- limit_reached: ${t.limitReached===!0}`].join(`
71
+ `)}
72
+ `}o(Kp,"renderTranscript");async function Up(e,t){let n=S.dirname(S.resolve(t.evalsPath)),r=S.resolve(t.cwd??process.cwd()),i=[];for(let s of e??[]){let a=S.isAbsolute(s)?s:S.resolve(n,s),c=S.resolve(r,s),d=null,l=a;try{d=await Jr(a,"utf8")}catch{d=await Jr(c,"utf8").catch(()=>null),l=c}if(d==null)throw new Error(`Input file not found for eval: ${s}`);i.push(`### ${s}
73
+ \`\`\`
74
+ ${d}
75
+ \`\`\`
76
+ (Resolved from ${l})`)}return i.length===0?"":`## Input Files
77
+
78
+ ${i.join(`
79
+
80
+ `)}
81
+
82
+ `}o(Up,"readInputFiles");async function Bp(e,t){let n=String(e.prompt??e.query??"").trim();return`${await Up(e.files,t)}${n}`.trim()}o(Bp,"buildEvalPrompt");async function Hp(e,t){let{runKodaX:n,estimateTokens:r}=await ve(),i=Date.now(),s=await n({provider:t.provider??"anthropic",model:t.model,maxIter:t.maxIter??30,reasoningMode:t.reasoningMode??"off",thinking:t.reasoningMode?t.reasoningMode!=="off":!1,context:{gitRoot:S.resolve(t.cwd??process.cwd())}},e);return{result:s,totalTokens:r(s.messages),durationMs:Date.now()-i}}o(Hp,"defaultRunAgent");async function qp(e,t,n,r){return e==="with_skill"?(await Br(t,n,{workingDirectory:S.resolve(r.cwd??process.cwd()),projectRoot:S.resolve(r.cwd??process.cwd()),sessionId:"skill-eval",environment:{}})).content:n}o(qp,"prepareConfigPrompt");async function zp(e,t,n,r,i){let s=S.join(e,"outputs");await U(s);let a={total_tool_calls:Mp(i.result.messages),errors_encountered:Op(i.result.messages),output_chars:i.result.lastText.length};await fe(S.join(s,"result.md"),`${i.result.lastText}
83
+ `,"utf8"),await fe(S.join(s,"prompt.txt"),`${r}
84
+ `,"utf8"),await fe(S.join(e,"transcript.md"),Kp(r,i.result),"utf8"),await fe(S.join(s,"metrics.json"),`${JSON.stringify({config:t,eval_id:n.id??null,session_id:i.result.sessionId,...a},null,2)}
85
+ `,"utf8"),await fe(S.join(s,"messages.json"),`${JSON.stringify(i.result.messages,null,2)}
86
+ `,"utf8"),await fe(S.join(e,"timing.json"),`${JSON.stringify({total_tokens:i.totalTokens,duration_ms:i.durationMs,total_duration_seconds:Number((i.durationMs/1e3).toFixed(4))},null,2)}
87
+ `,"utf8"),await fe(S.join(e,"result.json"),`${JSON.stringify({success:i.result.success,signal:i.result.signal??null,signal_reason:i.result.signalReason??null,interrupted:i.result.interrupted===!0,limit_reached:i.result.limitReached===!0,session_id:i.result.sessionId,execution_metrics:a},null,2)}
88
+ `,"utf8")}o(zp,"writeRunArtifacts");async function Wp(e,t=Hp){let n=await tt(S.resolve(e.skillPath),"user");if(!n)throw new Error(`Failed to load skill from ${e.skillPath}`);let r=S.resolve(e.workspaceDir);await U(r);let i=JSON.parse(await Jr(e.evalsPath,"utf8")),s=Array.isArray(i.evals)?i.evals:[],a=e.configs?.length?e.configs:["with_skill","without_skill"],c=Number.isFinite(e.runsPerConfig)&&e.runsPerConfig>0?Math.floor(e.runsPerConfig):1,d=[];for(let l=0;l<s.length;l+=1){let u=s[l],f=S.join(r,`eval-${l}`);await U(f),await fe(S.join(f,"eval_metadata.json"),`${JSON.stringify({eval_id:u.id??l,eval_name:u.name??`eval-${l}`,prompt:u.prompt??u.query??"",expected_output:u.expected_output??"",assertions:(Array.isArray(u.assertions)?u.assertions:[]).map(Tp).filter(Boolean)},null,2)}
89
+ `,"utf8");let p=await Bp(u,e),h={};for(let g of a){let y=S.join(f,g);await U(y),h[g]=[];for(let v=1;v<=c;v+=1){let k=S.join(y,`run-${v}`);await U(k);let I=await qp(g,n,p,e),$=await t(I,{...e,configName:g,evalItem:u,runIndex:v});await zp(k,g,u,I,$),h[g].push({run_id:`run-${v}`,session_id:$.result.sessionId,success:$.result.success,total_tokens:$.totalTokens,duration_ms:$.durationMs,output_chars:$.result.lastText.length})}}d.push({eval_id:u.id??l,prompt:u.prompt??u.query??"",configs:h})}return{workspace:r,skill_name:n.name,eval_count:s.length,configs:a,runs_per_config:c,reports:d}}o(Wp,"runEvalWorkspace");function Jp(e){let t={skillPath:"",evalsPath:"",workspaceDir:"",provider:"anthropic",model:void 0,runsPerConfig:1,maxIter:30,reasoningMode:"off",cwd:process.cwd(),configs:["with_skill","without_skill"],output:void 0};for(let n=2;n<e.length;n+=1){let r=e[n];r==="--skill-path"&&e[n+1]?t.skillPath=e[++n]:r==="--evals"&&e[n+1]?t.evalsPath=e[++n]:r==="--workspace"&&e[n+1]?t.workspaceDir=e[++n]:r==="--provider"&&e[n+1]?t.provider=e[++n]:r==="--model"&&e[n+1]?t.model=e[++n]:r==="--runs"&&e[n+1]?t.runsPerConfig=Number(e[++n]):r==="--max-iter"&&e[n+1]?t.maxIter=Number(e[++n]):r==="--reasoning"&&e[n+1]?t.reasoningMode=e[++n]:r==="--cwd"&&e[n+1]?t.cwd=e[++n]:r==="--configs"&&e[n+1]?t.configs=e[++n].split(",").map(i=>i.trim()).filter(Boolean):r==="--output"&&e[n+1]&&(t.output=e[++n])}return t}o(Jp,"parseArgs");async function Vr(e=process.argv){let t=Jp(e);(!t.skillPath||!t.evalsPath||!t.workspaceDir)&&(console.error("Usage: node scripts/run-eval.js --skill-path <dir> --evals <evals.json> --workspace <dir> [--provider anthropic] [--runs 1]"),process.exit(1));let n=await Wp(t),r=`${JSON.stringify(n,null,2)}
90
+ `;t.output?(await fe(t.output,r,"utf8"),console.log(`Wrote ${S.resolve(t.output)}`)):process.stdout.write(r)}o(Vr,"main");var Vp=!1;Vp&&Vr().catch(e=>{console.error(e instanceof Error?e.message:String(e)),process.exit(1)});import{readdir as Yp,readFile as Yr,writeFile as Ds}from"node:fs/promises";import _ from"node:path";function $e(e){return String(e??"").trim()}o($e,"normalizeExpectationText");function Ts(e){let n=(Array.isArray(e?.assertions)?e.assertions:[]).map(i=>typeof i=="string"?$e(i):i&&typeof i=="object"&&typeof i.text=="string"?$e(i.text):"").filter(Boolean);if(n.length>0)return n;let r=$e(e?.expected_output);return r?[r]:[]}o(Ts,"normalizeExpectedRubric");function Gr(e){return Array.isArray(e)?e.map(t=>String(t??"").trim()).filter(Boolean):[]}o(Gr,"normalizeStringArray");function Ns(e,t){return{text:$e(e?.text??t),passed:e?.passed===!0,evidence:$e(e?.evidence)}}o(Ns,"normalizeExpectationEntry");function Gp(e,t){let n=Je(e)??{},r=Array.isArray(n.expectations)?n.expectations:[],i=[],s=new Set;for(let a of t){let c=r.findIndex((d,l)=>s.has(l)?!1:$e(d?.text).toLowerCase()===a.toLowerCase());if(c===-1){i.push({text:a,passed:!1,evidence:""});continue}s.add(c),i.push(Ns(r[c],a))}if(t.length===0)for(let a of r){let c=Ns(a,"");c.text&&i.push(c)}return{overall_summary:$e(n.overall_summary),expectations:i,user_notes_summary:{uncertainties:Gr(n.user_notes_summary?.uncertainties),needs_review:Gr(n.user_notes_summary?.needs_review),workarounds:Gr(n.user_notes_summary?.workarounds)}}}o(Gp,"normalizeParsedGrading");async function Xr(e){return(await Yp(e,{withFileTypes:!0}).catch(()=>[])).filter(n=>n.isDirectory()).map(n=>_.join(e,n.name)).sort((n,r)=>n.localeCompare(r))}o(Xr,"listDirectories");async function Xp(e){let t=_.dirname(e),n=_.dirname(t),r=_.basename(t),i=_.basename(e),s=_.join(e,"outputs"),a=await re(_.join(n,"eval_metadata.json"),{}),c=await Yr(_.join(s,"result.md"),"utf8").catch(()=>""),d=await Yr(_.join(s,"prompt.txt"),"utf8").catch(()=>""),l=await Yr(_.join(e,"transcript.md"),"utf8").catch(()=>""),u=await re(_.join(s,"metrics.json"),{}),f=await re(_.join(e,"result.json"),{}),p=await re(_.join(e,"timing.json"),{});return{evalDir:n,runDir:e,runId:i,configName:r,evalMetadata:a,outputsDir:s,resultText:c,promptText:d,transcript:l,metrics:u,result:f,timing:p}}o(Xp,"loadRunContext");function Qp(e){let t=Ts(e.evalMetadata),n=t.length>0?t.map((r,i)=>`${i+1}. ${r}`).join(`
91
+ `):"(No explicit assertions; infer one expectation from expected_output if present.)";return`${e.agentInstructions.trim()}
92
+
93
+ Return JSON with this shape:
94
+ {
95
+ "overall_summary": "short summary",
96
+ "expectations": [
97
+ {
98
+ "text": "expectation text",
99
+ "passed": true,
100
+ "evidence": "short evidence grounded in the output"
101
+ }
102
+ ],
103
+ "user_notes_summary": {
104
+ "uncertainties": [],
105
+ "needs_review": [],
106
+ "workarounds": []
107
+ }
108
+ }
109
+
110
+ ## Run Metadata
111
+ - eval_id: ${e.evalMetadata.eval_id??"unknown"}
112
+ - eval_name: ${e.evalMetadata.eval_name??"unknown"}
113
+ - config: ${e.configName}
114
+ - run_id: ${e.runId}
115
+
116
+ ## Eval Prompt
117
+ ${K(e.evalMetadata.prompt??e.promptText,4e3)}
118
+
119
+ ## Expected Outcome
120
+ ${K(e.evalMetadata.expected_output??"",2e3)}
121
+
122
+ ## Assertions
123
+ ${n}
124
+
125
+ ## Final Output
126
+ ${K(e.resultText,12e3)}
127
+
128
+ ## Result Flags
129
+ ${JSON.stringify({success:e.result.success??null,signal:e.result.signal??null,interrupted:e.result.interrupted??!1,limit_reached:e.result.limit_reached??e.result.limitReached??!1},null,2)}
130
+
131
+ ## Execution Metrics
132
+ ${JSON.stringify({total_tool_calls:e.metrics.total_tool_calls??e.result.execution_metrics?.total_tool_calls??0,errors_encountered:e.metrics.errors_encountered??e.result.execution_metrics?.errors_encountered??0,output_chars:e.metrics.output_chars??e.result.execution_metrics?.output_chars??e.resultText.length,total_tokens:e.timing.total_tokens??0,total_duration_seconds:e.timing.total_duration_seconds??0},null,2)}
133
+
134
+ ## Transcript Excerpt
135
+ ${K(e.transcript,5e3)}
136
+ `}o(Qp,"buildGradingPrompt");async function Ms(e,t){let{runKodaX:n}=await ve();return(await n({provider:t.provider??"anthropic",model:t.model,maxIter:t.maxIter??20,reasoningMode:t.reasoningMode??"balanced",thinking:t.reasoningMode?t.reasoningMode!=="off":!0,context:{gitRoot:_.resolve(t.cwd??t.workspaceDir??process.cwd())}},e)).lastText}o(Ms,"defaultRunJudge");async function Zp(e,t,n=Ms){let r=await Xp(_.resolve(e)),i=Ts(r.evalMetadata),s=await Ve(import.meta.url,"../agents/grader.md"),a=Qp({...r,agentInstructions:s}),c=await n(a,{...t,runDir:r.runDir,configName:r.configName,evalMetadata:r.evalMetadata,runId:r.runId}),d=Gp(c,i),l={total_tool_calls:r.metrics.total_tool_calls??r.result.execution_metrics?.total_tool_calls??0,errors_encountered:r.metrics.errors_encountered??r.result.execution_metrics?.errors_encountered??0,output_chars:r.metrics.output_chars??r.result.execution_metrics?.output_chars??r.resultText.length},u={summary:Cs(d.expectations),expectations:d.expectations,execution_metrics:l,user_notes_summary:d.user_notes_summary,overall_summary:d.overall_summary,timing:{total_tokens:r.timing.total_tokens??0,total_duration_seconds:r.timing.total_duration_seconds??0},meta:{generated_at:new Date().toISOString(),eval_id:r.evalMetadata.eval_id??null,eval_name:r.evalMetadata.eval_name??null,config:r.configName,run_id:r.runId}};return await Ds(_.join(r.runDir,"grading.json"),`${JSON.stringify(u,null,2)}
137
+ `,"utf8"),{runDir:r.runDir,grading:u,prompt:a,rawResponse:c}}o(Zp,"gradeRun");async function em(e,t=Ms){let n=_.resolve(e.workspaceDir);await U(n);let r=new Set((e.configs??[]).map(c=>String(c).trim()).filter(Boolean)),i=[],s=[];for(let c of await Xr(n))if(_.basename(c).startsWith("eval-"))for(let d of await Xr(c)){let l=_.basename(d);if(!(r.size>0&&!r.has(l)))for(let u of await Xr(d)){if(!_.basename(u).startsWith("run-"))continue;let f=_.join(u,"grading.json");if(await re(f,null)&&e.overwrite!==!0){s.push(_.relative(n,u).replace(/\\/g,"/"));continue}let h=await Zp(u,e,t);i.push({run:_.relative(n,u).replace(/\\/g,"/"),summary:h.grading.summary,config:h.grading.meta.config,eval_id:h.grading.meta.eval_id})}}let a={workspace:n,generated_at:new Date().toISOString(),processed:i.length,skipped:s.length,processed_runs:i,skipped_runs:s};return await Ds(_.join(n,"grading-summary.json"),`${JSON.stringify(a,null,2)}
138
+ `,"utf8"),a}o(em,"gradeWorkspace");function tm(e){let t={workspaceDir:e[2]??"",provider:"anthropic",model:void 0,reasoningMode:"balanced",maxIter:20,cwd:process.cwd(),overwrite:!1,configs:[]};for(let n=3;n<e.length;n+=1){let r=e[n];r==="--provider"&&e[n+1]?t.provider=e[++n]:r==="--model"&&e[n+1]?t.model=e[++n]:r==="--reasoning"&&e[n+1]?t.reasoningMode=e[++n]:r==="--max-iter"&&e[n+1]?t.maxIter=Number(e[++n]):r==="--cwd"&&e[n+1]?t.cwd=e[++n]:r==="--overwrite"?t.overwrite=!0:r==="--configs"&&e[n+1]&&(t.configs=e[++n].split(",").map(i=>i.trim()).filter(Boolean))}return t}o(tm,"parseArgs");async function Qr(e=process.argv){let t=tm(e);t.workspaceDir||(console.error("Usage: node scripts/grade-evals.js <workspace> [--provider anthropic] [--configs with_skill,without_skill] [--overwrite]"),process.exit(1));let n=await em(t);process.stdout.write(`${JSON.stringify(n,null,2)}
139
+ `)}o(Qr,"main");var nm=!1;nm&&Qr().catch(e=>{console.error(e instanceof Error?e.message:String(e)),process.exit(1)});import{writeFile as ni}from"node:fs/promises";import pe from"node:path";import{readFile as rm,readdir as im,stat as om,writeFile as Os}from"node:fs/promises";import B from"node:path";async function Zr(e){return JSON.parse(await rm(e,"utf8"))}o(Zr,"readJson");async function sm(e){try{return await om(e),!0}catch{return!1}}o(sm,"pathExists");async function ei(e){return(await im(e,{withFileTypes:!0}).catch(()=>[])).filter(n=>n.isDirectory()).map(n=>B.join(e,n.name)).sort((n,r)=>n.localeCompare(r))}o(ei,"listDirectories");async function kn(e){let t=await sm(B.join(e,"runs"))?B.join(e,"runs"):e,n=(await ei(t)).filter(i=>B.basename(i).startsWith("eval-")),r={};for(let i of n){let s=B.join(i,"eval_metadata.json"),c=(await Zr(s).catch(()=>({}))).eval_id??B.basename(i);for(let d of await ei(i)){let l=B.basename(d),u=(await ei(d)).filter(f=>B.basename(f).startsWith("run-"));if(u.length!==0){r[l]??=[];for(let f of u){let p=await Zr(B.join(f,"grading.json")).catch(()=>null);if(!p)continue;let h=await Zr(B.join(f,"timing.json")).catch(()=>({}));r[l].push({eval_id:c,run_id:B.basename(f),pass_rate:p.summary?.pass_rate??0,passed:p.summary?.passed??0,failed:p.summary?.failed??0,total:p.summary?.total??0,time_seconds:h.total_duration_seconds??p.timing?.total_duration_seconds??0,tokens:h.total_tokens??p.execution_metrics?.output_chars??0,tool_calls:p.execution_metrics?.total_tool_calls??0,errors:p.execution_metrics?.errors_encountered??0,expectations:Array.isArray(p.expectations)?p.expectations:[],notes:[...p.user_notes_summary?.uncertainties??[],...p.user_notes_summary?.needs_review??[],...p.user_notes_summary?.workarounds??[]]})}}}}return r}o(kn,"loadRunResults");function am(e){let t={};for(let[s,a]of Object.entries(e))t[s]={pass_rate:yn(a.map(c=>Number(c.pass_rate??0))),time_seconds:yn(a.map(c=>Number(c.time_seconds??0))),tokens:yn(a.map(c=>Number(c.tokens??0)))};let n=Object.keys(t),r=t[n[0]]??{pass_rate:{mean:0},time_seconds:{mean:0},tokens:{mean:0}},i=t[n[1]]??{pass_rate:{mean:0},time_seconds:{mean:0},tokens:{mean:0}};return{configs:t,delta:{pass_rate:vn(r.pass_rate.mean-i.pass_rate.mean),time_seconds:vn(r.time_seconds.mean-i.time_seconds.mean),tokens:vn(r.tokens.mean-i.tokens.mean)}}}o(am,"summarizeConfigs");function ti(e,t,n){let r=am(n);return{skill_name:t,generated_at:new Date().toISOString(),workspace:B.resolve(e),configs:r.configs,delta:r.delta,runs:n}}o(ti,"buildBenchmarkDocument");function cm(e){let t=[`# Benchmark: ${e.skill_name}`,"",`Generated: ${e.generated_at}`,"","| Config | Pass Rate | Time (s) | Tokens |","| --- | --- | --- | --- |"];for(let[n,r]of Object.entries(e.configs))t.push(`| ${n} | ${r.pass_rate.mean} \xB1 ${r.pass_rate.stddev} | ${r.time_seconds.mean} \xB1 ${r.time_seconds.stddev} | ${r.tokens.mean} \xB1 ${r.tokens.stddev} |`);return t.push(""),t.push("## Delta"),t.push(""),t.push(`- Pass rate: ${e.delta.pass_rate}`),t.push(`- Time (s): ${e.delta.time_seconds}`),t.push(`- Tokens: ${e.delta.tokens}`),t.join(`
140
+ `)}o(cm,"renderBenchmarkMarkdown");function dm(e){let t={iterationDir:e[2],skillName:"unknown-skill"};for(let n=3;n<e.length;n+=1)e[n]==="--skill-name"&&e[n+1]&&(t.skillName=e[n+1],n+=1);return t}o(dm,"parseArgs");async function lm(){let{iterationDir:e,skillName:t}=dm(process.argv);e||(console.error("Usage: node scripts/aggregate-benchmark.js <iteration-dir> --skill-name <name>"),process.exit(1));let n=await kn(e);Object.keys(n).length===0&&(console.error(`No benchmark runs found in ${e}`),process.exit(1));let r=ti(e,t,n),i=B.join(e,"benchmark.json"),s=B.join(e,"benchmark.md");await Os(i,JSON.stringify(r,null,2)),await Os(s,`${cm(r)}
141
+ `),console.log(`Wrote ${i}`),console.log(`Wrote ${s}`)}o(lm,"main");var um=!1;um&&lm().catch(e=>{console.error(e instanceof Error?e.message:String(e)),process.exit(1)});function bn(e){return Array.isArray(e)?e.map(t=>String(t??"").trim()).filter(Boolean):[]}o(bn,"normalizeStringArray");function fm(e){let t={};for(let[n,r]of Object.entries(e)){let i=new Map,s=[];for(let a of r){for(let c of a.expectations??[]){if(c?.passed===!0)continue;let d=String(c?.text??"").trim();d&&i.set(d,(i.get(d)??0)+1)}for(let c of a.notes??[]){let d=String(c??"").trim();d&&s.push(d)}}t[n]={repeated_failures:Array.from(i.entries()).sort((a,c)=>c[1]-a[1]).slice(0,10).map(([a,c])=>({text:a,count:c})),notes:s.slice(0,10)}}return t}o(fm,"summarizeFailureClusters");function pm(e,t,n){let r=Je(e)??{};return{skill_name:t.skill_name,generated_at:new Date().toISOString(),workspace:t.workspace,verdict:["improves","regresses","mixed","inconclusive"].includes(r.verdict)?r.verdict:"inconclusive",release_readiness:["ready","needs_iteration","needs_manual_review"].includes(r.release_readiness)?r.release_readiness:"needs_manual_review",recommendation:String(r.recommendation??"").trim(),key_findings:bn(r.key_findings),variance_hotspots:bn(r.variance_hotspots),suggested_actions:bn(r.suggested_actions),watchouts:bn(r.watchouts),supporting_metrics:{pass_rate_delta:t.delta?.pass_rate??"n/a",time_seconds_delta:t.delta?.time_seconds??"n/a",tokens_delta:t.delta?.tokens??"n/a"},failure_clusters:n}}o(pm,"normalizeAnalysisResult");function mm(e){return`${e.agentInstructions.trim()}
142
+
143
+ Return JSON with this shape:
144
+ {
145
+ "verdict": "improves | regresses | mixed | inconclusive",
146
+ "release_readiness": "ready | needs_iteration | needs_manual_review",
147
+ "recommendation": "short recommendation",
148
+ "key_findings": [],
149
+ "variance_hotspots": [],
150
+ "suggested_actions": [],
151
+ "watchouts": []
152
+ }
153
+
154
+ ## Benchmark Summary
155
+ ${K(JSON.stringify({skill_name:e.benchmark.skill_name,configs:e.benchmark.configs,delta:e.benchmark.delta},null,2),12e3)}
156
+
157
+ ## Failure Clusters
158
+ ${K(JSON.stringify(e.failureClusters,null,2),8e3)}
159
+ `}o(mm,"buildAnalysisPrompt");async function hm(e,t){let{runKodaX:n}=await ve();return(await n({provider:t.provider??"anthropic",model:t.model,maxIter:t.maxIter??20,reasoningMode:t.reasoningMode??"balanced",thinking:t.reasoningMode?t.reasoningMode!=="off":!0,context:{gitRoot:pe.resolve(t.cwd??t.workspaceDir??process.cwd())}},e)).lastText}o(hm,"defaultRunAnalyst");function gm(e){let t=[`# Benchmark Analysis: ${e.skill_name}`,"",`Generated: ${e.generated_at}`,"",`- Verdict: ${e.verdict}`,`- Release readiness: ${e.release_readiness}`,`- Recommendation: ${e.recommendation||"n/a"}`,""],n=[["key_findings","Key Findings"],["variance_hotspots","Variance Hotspots"],["suggested_actions","Suggested Actions"],["watchouts","Watchouts"]];for(let[r,i]of n){t.push(`## ${i}`),t.push("");let s=Array.isArray(e[r])?e[r]:[];if(s.length===0)t.push("- None");else for(let a of s)t.push(`- ${a}`);t.push("")}return t.push("## Supporting Metrics"),t.push(""),t.push(`- Pass rate delta: ${e.supporting_metrics.pass_rate_delta}`),t.push(`- Time delta: ${e.supporting_metrics.time_seconds_delta}`),t.push(`- Tokens delta: ${e.supporting_metrics.tokens_delta}`),`${t.join(`
160
+ `)}
161
+ `}o(gm,"renderAnalysisMarkdown");async function wm(e,t=hm){let n=pe.resolve(e.workspaceDir),r=pe.resolve(e.benchmarkPath??pe.join(n,"benchmark.json")),i=await re(r,null);if(!i){let h=await kn(n);if(Object.keys(h).length===0)throw new Error(`No benchmark data found in ${n}`);i=ti(n,e.skillName??pe.basename(n),h),await ni(r,`${JSON.stringify(i,null,2)}
162
+ `,"utf8")}let s=await kn(n),a=fm(s),c=await Ve(import.meta.url,"../agents/analyzer.md"),d=mm({agentInstructions:c,benchmark:i,failureClusters:a}),l=await t(d,{...e,workspaceDir:n,benchmarkPath:r,benchmark:i}),u=pm(l,i,a),f=pe.resolve(e.outputPath??pe.join(n,"analysis.json")),p=pe.resolve(e.markdownPath??pe.join(n,"analysis.md"));return await ni(f,`${JSON.stringify(u,null,2)}
163
+ `,"utf8"),await ni(p,gm(u),"utf8"),{analysis:u,prompt:d,rawResponse:l,analysisJsonPath:f,analysisMdPath:p}}o(wm,"analyzeBenchmark");function ym(e){let t={workspaceDir:e[2]??"",benchmarkPath:void 0,outputPath:void 0,markdownPath:void 0,skillName:void 0,provider:"anthropic",model:void 0,reasoningMode:"balanced",maxIter:20,cwd:process.cwd()};for(let n=3;n<e.length;n+=1){let r=e[n];r==="--benchmark"&&e[n+1]?t.benchmarkPath=e[++n]:r==="--output"&&e[n+1]?t.outputPath=e[++n]:r==="--markdown"&&e[n+1]?t.markdownPath=e[++n]:r==="--skill-name"&&e[n+1]?t.skillName=e[++n]:r==="--provider"&&e[n+1]?t.provider=e[++n]:r==="--model"&&e[n+1]?t.model=e[++n]:r==="--reasoning"&&e[n+1]?t.reasoningMode=e[++n]:r==="--max-iter"&&e[n+1]?t.maxIter=Number(e[++n]):r==="--cwd"&&e[n+1]&&(t.cwd=e[++n])}return t}o(ym,"parseArgs");async function ri(e=process.argv){let t=ym(e);t.workspaceDir||(console.error("Usage: node scripts/analyze-benchmark.js <workspace> [--benchmark benchmark.json] [--output analysis.json] [--markdown analysis.md]"),process.exit(1));let n=await wm(t);process.stdout.write(`${JSON.stringify({analysis:n.analysis,analysis_json:n.analysisJsonPath,analysis_md:n.analysisMdPath},null,2)}
164
+ `)}o(ri,"main");var vm=!1;vm&&ri().catch(e=>{console.error(e instanceof Error?e.message:String(e)),process.exit(1)});import{readdir as km,readFile as Ks,writeFile as Us}from"node:fs/promises";import A from"node:path";async function oi(e){return(await km(e,{withFileTypes:!0}).catch(()=>[])).filter(n=>n.isDirectory()).map(n=>A.join(e,n.name)).sort((n,r)=>n.localeCompare(r))}o(oi,"listDirectories");function ii(e){return Array.isArray(e)?e.map(t=>String(t??"").trim()).filter(Boolean):[]}o(ii,"normalizeStringArray");function bm(e){let t=Je(e)??{},n=["A","B","tie","inconclusive"].includes(t.winner)?t.winner:"inconclusive",r=Number(t.confidence);return{winner:n,confidence:Number.isFinite(r)?Math.max(0,Math.min(1,Number(r.toFixed(4)))):0,rationale:String(t.rationale??"").trim(),strengths_a:ii(t.strengths_a),strengths_b:ii(t.strengths_b),risks:ii(t.risks)}}o(bm,"normalizeComparisonResult");async function Im(e,t,n,r){let i=(await oi(A.join(e,t))).filter(f=>A.basename(f).startsWith("run-")),s=(await oi(A.join(e,n))).filter(f=>A.basename(f).startsWith("run-")),a=i[r],c=s[r];if(!a||!c)return null;let d=await re(A.join(e,"eval_metadata.json"),{}),l=await Ks(A.join(a,"outputs","result.md"),"utf8").catch(()=>""),u=await Ks(A.join(c,"outputs","result.md"),"utf8").catch(()=>"");return{evalDir:e,evalMetadata:d,runA:{runDir:a,runId:A.basename(a),configName:t,output:l},runB:{runDir:c,runId:A.basename(c),configName:n,output:u}}}o(Im,"loadComparisonPair");function Sm(e){let t=e.presentPrimaryFirst?{A:e.runA,B:e.runB}:{A:e.runB,B:e.runA};return`${e.agentInstructions.trim()}
165
+
166
+ Return JSON with this shape:
167
+ {
168
+ "winner": "A | B | tie | inconclusive",
169
+ "confidence": 0.0,
170
+ "rationale": "short explanation",
171
+ "strengths_a": [],
172
+ "strengths_b": [],
173
+ "risks": []
174
+ }
175
+
176
+ Judge only the visible outputs. Do not mention hidden config names in the rationale.
177
+
178
+ ## Eval Prompt
179
+ ${K(e.evalMetadata.prompt??"",4e3)}
180
+
181
+ ## Expected Outcome
182
+ ${K(e.evalMetadata.expected_output??"",2e3)}
183
+
184
+ ## Assertions
185
+ ${K(JSON.stringify(e.evalMetadata.assertions??[],null,2),4e3)}
186
+
187
+ ## Candidate A
188
+ ${K(t.A.output,12e3)}
189
+
190
+ ## Candidate B
191
+ ${K(t.B.output,12e3)}
192
+ `}o(Sm,"buildComparisonPrompt");async function _m(e,t){let{runKodaX:n}=await ve();return(await n({provider:t.provider??"anthropic",model:t.model,maxIter:t.maxIter??20,reasoningMode:t.reasoningMode??"balanced",thinking:t.reasoningMode?t.reasoningMode!=="off":!0,context:{gitRoot:A.resolve(t.cwd??t.workspaceDir??process.cwd())}},e)).lastText}o(_m,"defaultRunComparator");function Rm(e,t,n,r){return e==="A"?t?n:r:e==="B"?t?r:n:e}o(Rm,"mapWinnerToConfig");function xm(e){let t=[`# Blind Comparison: ${e.config_a} vs ${e.config_b}`,"",`Generated: ${e.generated_at}`,"",`- ${e.config_a} wins: ${e.summary.config_a_wins}`,`- ${e.config_b} wins: ${e.summary.config_b_wins}`,`- ties: ${e.summary.ties}`,`- inconclusive: ${e.summary.inconclusive}`,""];for(let n of e.comparisons)t.push(`## Eval ${n.eval_id??n.eval_name??n.index}`),t.push(""),t.push(`- Winner: ${n.winner_config}`),t.push(`- Confidence: ${n.confidence}`),t.push(`- Rationale: ${n.rationale||"n/a"}`),t.push("");return`${t.join(`
193
+ `)}
194
+ `}o(xm,"renderComparisonMarkdown");async function Em(e,t=_m){let n=A.resolve(e.workspaceDir),r=e.configA??"with_skill",i=e.configB??"without_skill",s=Number.isFinite(e.maxPairs)&&e.maxPairs>0?Math.floor(e.maxPairs):Number.POSITIVE_INFINITY,a=await Ve(import.meta.url,"../agents/comparator.md"),c=[];for(let f of await oi(n))if(A.basename(f).startsWith("eval-"))for(let p=0;p<s;p+=1){let h=await Im(f,r,i,p);if(!h)break;let g=c.length%2===0,y=Sm({agentInstructions:a,evalMetadata:h.evalMetadata,runA:h.runA,runB:h.runB,presentPrimaryFirst:g}),v=await t(y,{...e,workspaceDir:n,evalDir:f,pairIndex:p,configA:r,configB:i}),k=bm(v),I=Rm(k.winner,g,r,i);c.push({index:c.length+1,eval_id:h.evalMetadata.eval_id??null,eval_name:h.evalMetadata.eval_name??null,run_a:A.relative(n,h.runA.runDir).replace(/\\/g,"/"),run_b:A.relative(n,h.runB.runDir).replace(/\\/g,"/"),presented_as:g?{A:r,B:i}:{A:i,B:r},winner_label:k.winner,winner_config:I,confidence:k.confidence,rationale:k.rationale,strengths_a:k.strengths_a,strengths_b:k.strengths_b,risks:k.risks})}if(c.length===0)throw new Error(`No comparable run pairs found for ${r} vs ${i} in ${n}`);let d={workspace:n,generated_at:new Date().toISOString(),config_a:r,config_b:i,summary:{total_pairs:c.length,config_a_wins:c.filter(f=>f.winner_config===r).length,config_b_wins:c.filter(f=>f.winner_config===i).length,ties:c.filter(f=>f.winner_config==="tie").length,inconclusive:c.filter(f=>f.winner_config==="inconclusive").length},comparisons:c},l=A.resolve(e.outputPath??A.join(n,"comparison.json")),u=A.resolve(e.markdownPath??A.join(n,"comparison.md"));return await Us(l,`${JSON.stringify(d,null,2)}
195
+ `,"utf8"),await Us(u,xm(d),"utf8"),{document:d,outputPath:l,markdownPath:u}}o(Em,"compareWorkspace");function Am(e){let t={workspaceDir:e[2]??"",configA:"with_skill",configB:"without_skill",outputPath:void 0,markdownPath:void 0,provider:"anthropic",model:void 0,reasoningMode:"balanced",maxIter:20,maxPairs:void 0,cwd:process.cwd()};for(let n=3;n<e.length;n+=1){let r=e[n];r==="--config-a"&&e[n+1]?t.configA=e[++n]:r==="--config-b"&&e[n+1]?t.configB=e[++n]:r==="--output"&&e[n+1]?t.outputPath=e[++n]:r==="--markdown"&&e[n+1]?t.markdownPath=e[++n]:r==="--provider"&&e[n+1]?t.provider=e[++n]:r==="--model"&&e[n+1]?t.model=e[++n]:r==="--reasoning"&&e[n+1]?t.reasoningMode=e[++n]:r==="--max-iter"&&e[n+1]?t.maxIter=Number(e[++n]):r==="--max-pairs"&&e[n+1]?t.maxPairs=Number(e[++n]):r==="--cwd"&&e[n+1]&&(t.cwd=e[++n])}return t}o(Am,"parseArgs");async function si(e=process.argv){let t=Am(e);t.workspaceDir||(console.error("Usage: node scripts/compare-runs.js <workspace> [--config-a with_skill] [--config-b without_skill] [--output comparison.json]"),process.exit(1));let n=await Em(t);process.stdout.write(`${JSON.stringify({comparison:n.document.summary,output:n.outputPath,markdown:n.markdownPath},null,2)}
196
+ `)}o(si,"main");var jm=!1;jm&&si().catch(e=>{console.error(e instanceof Error?e.message:String(e)),process.exit(1)});import{readFile as Pm,writeFile as $m}from"node:fs/promises";import{createHash as Cm}from"node:crypto";import ai from"node:path";import{zipSync as Lm,strToU8 as Fm}from"fflate";var Nm=".kodax-package.json";function Dm(e){return e instanceof Uint8Array?e:new Uint8Array(e)}o(Dm,"toUint8Array");function Tm(e){return Cm("sha256").update(e).digest("hex")}o(Tm,"sha256");function Mm(e,t,n={}){return{format:"kodax-skill-package",version:1,created_at:n.createdAt??new Date().toISOString(),entrypoint:"SKILL.md",skill:{name:e.frontmatter.name,description:e.frontmatter.description,compatibility:e.frontmatter.compatibility??null,user_invocable:e.frontmatter["user-invocable"]??!0,disable_model_invocation:e.frontmatter["disable-model-invocation"]??!1},files:t.map(r=>({path:r.relativePath,size:r.bytes.length,sha256:r.sha256})),note:"This archive is a zip file with a .skill extension. Compatible agents can extract and install the included skill directory."}}o(Mm,"createPackageManifest");async function Om(e,t={}){let n=await kt(e);if(!n.valid)throw new Error(`Cannot package invalid skill:
197
+ - ${n.errors.join(`
198
+ - `)}`);let r=await wt(e),i=await qr(e),s=[];for(let d of i){if(d.relativePath.endsWith(".skill"))continue;let l=Dm(await Pm(d.absolutePath));s.push({...d,bytes:l,sha256:Tm(l)})}let a=Mm(r,s,t),c={[Nm]:Fm(JSON.stringify(a,null,2))};for(let d of s)c[d.relativePath]=d.bytes;return{manifest:a,bytes:Lm(c,{level:6})}}o(Om,"buildSkillPackage");async function Km(e,t,n={}){let r=await Om(e,n);return await $m(t,r.bytes),{...r,outputPath:ai.resolve(t)}}o(Km,"writeSkillPackage");function Um(e){let t={skillDir:e[2],output:void 0};for(let n=3;n<e.length;n+=1)e[n]==="--output"&&e[n+1]&&(t.output=e[++n]);return t}o(Um,"parseArgs");async function ci(e=process.argv){let t=Um(e);t.skillDir||(console.error("Usage: node scripts/package-skill.js <skill-dir> [--output <file.skill>]"),process.exit(1));let n=await wt(t.skillDir),r=t.output??ai.join(ai.dirname(t.skillDir),`${n.frontmatter.name}.skill`),i=await Km(t.skillDir,r);console.log(`Wrote ${i.outputPath}`)}o(ci,"main");var Bm=!1;Bm&&ci().catch(e=>{console.error(e instanceof Error?e.message:String(e)),process.exit(1)});import{cp as Hm,mkdir as di,readFile as qs,rm as zs,stat as qm,writeFile as zm}from"node:fs/promises";import ie from"node:path";import{strFromU8 as Bs,unzipSync as Wm}from"fflate";var Hs=".kodax-package.json";function Jm(e){return e.replace(/\\/g,"/").replace(/^\.?\//,"")}o(Jm,"normalizeArchivePath");function Vm(e){let t=Jm(e);if(!t||t.startsWith("/")||t.includes("../"))throw new Error(`Unsafe archive entry path: ${e}`);return t}o(Vm,"assertSafeArchivePath");function Ym(e){return/\.(skill|zip)$/i.test(e)}o(Ym,"isZipLike");function Gm(e){let t=Wm(e),n=Object.entries(t).map(([l,u])=>({relativePath:Vm(l),bytes:u})),r=n.find(l=>l.relativePath==="SKILL.md");if(!r)throw new Error("Archive is missing SKILL.md");let i=wn(Bs(r.bytes)),s=typeof i.frontmatter.name=="string"?i.frontmatter.name.trim():"",a=typeof i.frontmatter.description=="string"?i.frontmatter.description.trim():"";if(!s||!a)throw new Error("Archive SKILL.md is missing required frontmatter fields.");let c=n.find(l=>l.relativePath===Hs),d=c?JSON.parse(Bs(c.bytes)):null;return{skillName:s,manifest:d,entries:n.filter(l=>l.relativePath!==Hs)}}o(Gm,"readSkillPackageBuffer");async function Xm(e,t){if(await yt(e)){if(!t)throw new Error(`Target skill already exists: ${e}`);await zs(e,{recursive:!0,force:!0})}await di(e,{recursive:!0})}o(Xm,"ensureInstallTarget");async function Qm(e,t={}){let n=ie.resolve(t.skillsDir??vt()),r=Gm(await qs(e)),i=ie.join(n,r.skillName);await Xm(i,t.force===!0);for(let s of r.entries){let a=ie.join(i,s.relativePath);await di(ie.dirname(a),{recursive:!0}),await zm(a,s.bytes)}return{skillName:r.skillName,installedTo:i,source:ie.resolve(e),manifest:r.manifest}}o(Qm,"installSkillArchive");async function Zm(e,t={}){let n=await kt(e);if(!n.valid)throw new Error(`Cannot install invalid skill:
199
+ - ${n.errors.join(`
200
+ - `)}`);let r=ie.join(e,"SKILL.md"),i=wn(await qs(r,"utf8")),s=ie.resolve(t.skillsDir??vt()),a=ie.join(s,i.frontmatter.name);if(await yt(a)){if(!t.force)throw new Error(`Target skill already exists: ${a}`);await zs(a,{recursive:!0,force:!0})}return await di(s,{recursive:!0}),await Hm(e,a,{recursive:!0}),{skillName:i.frontmatter.name,installedTo:a,source:ie.resolve(e),manifest:null}}o(Zm,"installSkillDirectory");async function eh(e,t={}){let n=ie.resolve(e),r=await qm(n).catch(()=>null);if(!r)throw new Error(`Input not found: ${n}`);if(r.isDirectory())return Zm(n,t);if(r.isFile()&&Ym(n))return Qm(n,t);throw new Error("Input must be a skill directory or a .skill/.zip archive.")}o(eh,"installSkill");function th(e){let t={input:e[2],skillsDir:void 0,force:!1};for(let n=3;n<e.length;n+=1){let r=e[n];r==="--dest"&&e[n+1]?t.skillsDir=e[++n]:r==="--force"&&(t.force=!0)}return t}o(th,"parseArgs");async function li(e=process.argv){let t=th(e);t.input||(console.error("Usage: node scripts/install-skill.js <skill-dir-or-archive> [--dest <skills-dir>] [--force]"),process.exit(1));let n=await eh(t.input,t);console.log(`Installed ${n.skillName} to ${n.installedTo}`)}o(li,"main");var nh=!1;nh&&li().catch(e=>{console.error(e instanceof Error?e.message:String(e)),process.exit(1)});var rh=["init","validate","eval","grade","analyze","compare","package","install"],ih={init:zr,validate:Wr,eval:Vr,grade:Qr,analyze:ri,compare:si,package:ci,install:li};function oh(e){return e!==void 0&&rh.some(t=>t===e)}o(oh,"isSkillCreatorDispatchAction");async function sh(e,t,n){$s(n),await ih[e]([process.execPath,`skill-${e}.js`,...t])}o(sh,"dispatchSkillCreatorTool");var Ws=/(?:-----BEGIN (?:RSA |EC |OPENSSH )?PRIVATE KEY-----|authorization:\s*bearer\b|\b(?:api[_\s-]?key|password|secret|token)\b\s*(?:[:=]|->|=>))/i,ah=/\b(?:api[_\s-]?key|password|secret|token)\b\s+(?:(?:actually|currently|now|presently|really)\s+)?(?:is|was|equals?)\s+(.+)/i,ch=/\b(?:api[_\s-]?key|password|secret|token)\b\s+(?:(?:used|stored|configured|set|issued|deployed|assigned|shared|provided|required)\b(?:\s+(?:by|for|in|on|at|with|from|to)\b)?|(?:for|in|on|at)\b)(?:\s+[\p{L}\p{N}._-]+){0,3}\s+(?:is|was|equals?)\s+(.+)/iu,dh=new Set(["active","disabled","empty","expired","invalid","masked","missing","redacted","revoked","rotated","rotated today","rotated yesterday","the configured environment value","the expected environment value","the stored environment value","not available","not configured","not present","not set","unavailable","unknown","unset","valid"]),lh=/\b(?:ignore|disregard|override)\s+(?:(?:all|any|the|these|those)\s+)?(?:(?:previous|prior|earlier|above|system|developer)\s+){0,3}(?:instructions?|prompts?|rules?|directives?|guidelines?)\b/i,uh=/\bforget\s+(?:(?:all|any|the)\s+)?(?:above\b|everything\s+(?:above|before)\b|(?:(?:previous|prior|earlier|system|developer)\s+){0,3}(?:instructions?|prompts?|rules?|directives?|guidelines?)\b)/i,fh=/\byou\s+are\s+now\s+(?:in\s+)?(?:system|developer|assistant|tool)\s+mode\b/i,ph=/<\/?(?:system|developer|assistant|tool|prompt)(?=[\s/>])/i,mh=/(?:->|=>|[→⇒➔➜➝⟶⟹↦])/g,hh=/["'`*_~“”‘’«»‹›()[\]{}]+/g,Vs=/<\/?[^<>]*>/g;function Ys(e){return e.replace(/[\u0000-\u0008\u000b\u000c\u000e-\u001f\u007f]/g,"").replace(new RegExp("\\p{Cf}","gu"),"").replace(Vs," ").replace(/[<>]/g,"").replace(/\s+/g," ").trim()}o(Ys,"compactMemoryClaim");function fi(e){return e.normalize("NFKC").replace(new RegExp("\\p{Cf}","gu"),"").replace(mh," = ")}o(fi,"memoryClaimStructuralView");function Js(e,t){return Ys(fi(e).replace(Vs,t).replace(hh,t))}o(Js,"memoryClaimForDetection");function Gs(e){return[Js(e," "),Js(e,"")]}o(Gs,"memoryClaimDetectionViews");function gh(e){let n=(ah.exec(e)??ch.exec(e))?.[1]?.replace(/^["'`]+|[.!?'"`]+$/g,"").trim();return!(n===void 0||n.length===0||dh.has(n.toLowerCase()))}o(gh,"containsSentenceCredential");function wh(e){return Ws.test(fi(e))||Gs(e).some(t=>Ws.test(t)||gh(t))}o(wh,"isRestrictedMemoryContent");function ui(e){return wh(e)||ph.test(fi(e))||Gs(e).some(t=>lh.test(t)||uh.test(t)||fh.test(t))}o(ui,"containsUnsafeMemoryClaim");function T(e,t=512){let n=Ys(e);if(n.length===0)return;let r=n.slice(0,Math.max(1,t));return ui(e)||ui(n)||ui(r)?void 0:r}o(T,"sanitizePromptSafeMemoryClaim");import{createHash as Ch}from"node:crypto";import{readdir as xa,readFile as Lh,rename as Fh,rm as Ea,writeFile as Nh,mkdir as Dh}from"node:fs/promises";import{basename as oe,dirname as ca,join as M,relative as Th,resolve as wi,sep as Mh}from"node:path";import{createHmac as yh,randomBytes as vh,randomUUID as pi}from"node:crypto";import{mkdir as mi,open as kh,readFile as Ye,rename as Xs,rm as Ge,stat as bh,writeFile as hi}from"node:fs/promises";import Y from"node:path";async function Qs(e,t){let n=await oa(e);return Object.keys(n.entries).length===0?t.lifecycle:n.entries[await ia(e,t.id)]?.lifecycle??t.lifecycle}o(Qs,"resolveManagedLifecycle");async function Zs(e,t,n){await Ih(e,t.id,"archived",n)}o(Zs,"archiveManagedMemoryRef");async function ea(e,t,n){let r=t.storageUri;if(r===void 0||!Ph(e,r))throw new Error("memory ref is not stored under the managed memory root");await na(e,async()=>{await Ge(r,{force:!0}),await Eh(e,Y.basename(r)),await ta(e,t.id,"forgotten",n)})}o(ea,"forgetManagedMemoryRef");async function Ih(e,t,n,r){await na(e,async()=>{await ta(e,t,n,r)})}o(Ih,"updateLifecycle");async function ta(e,t,n,r){let i=await oa(e),s=await ia(e,t);await jh(e,{version:1,entries:{...i.entries,[s]:{lifecycle:n,updatedAt:r}}})}o(ta,"updateLifecycleUnlocked");async function na(e,t){let n=Y.join(e,".governance","lifecycle.lock");await mi(Y.dirname(n),{recursive:!0});let r=await Sh(n);try{await t()}finally{try{await r.handle.close()}finally{await Rh(n,r.token)}}}o(na,"withLifecycleLock");async function Sh(e){let t=Date.now()+5e3;for(;;)try{let n=await kh(e,"wx"),r=pi();try{return await n.writeFile(`${process.pid} ${r}
201
+ `,"utf8"),{handle:n,token:r}}catch(i){throw await n.close(),await Ge(e,{force:!0}),i}}catch(n){if(!aa(n)&&!$h(n))throw n;if(await _h(e)){await Ge(e,{force:!0});continue}if(Date.now()>=t)throw new Error(`memory lifecycle lock timed out: ${e}`);await new Promise(r=>setTimeout(r,10))}}o(Sh,"acquireLifecycleLock");async function _h(e){try{if(Date.now()-(await bh(e)).mtimeMs<=3e4)return!1;let t=ra(await Ye(e,"utf8"));return t!==void 0&&!xh(t.pid)}catch(t){if(bt(t)||be(t)&&["EPERM","EACCES","EBUSY"].includes(String(t.code)))return!1;throw t}}o(_h,"isStaleLifecycleLock");async function Rh(e,t){try{ra(await Ye(e,"utf8"))?.token===t&&await Ge(e,{force:!0})}catch(n){if(!bt(n))throw n}}o(Rh,"releaseLifecycleLock");function ra(e){let t=/^(\d+)(?: ([0-9a-f-]+))?\s*$/i.exec(e);if(t===null)return;let n=Number(t[1]);if(!(!Number.isSafeInteger(n)||n<=0))return t[2]===void 0?{pid:n}:{pid:n,token:t[2]}}o(ra,"parseLockOwner");function xh(e){try{return process.kill(e,0),!0}catch(t){return!(be(t)&&t.code==="ESRCH")}}o(xh,"isProcessAlive");async function Eh(e,t){let n=Y.join(e,"MEMORY.md"),r=`${n}.${pi()}.tmp`;try{let s=(await Ye(n,"utf8")).split(/\r?\n/).filter(a=>!a.includes(`(${t})`)).join(`
202
+ `);await hi(r,s.endsWith(`
203
+ `)||s.length===0?s:`${s}
204
+ `,"utf8"),await Xs(r,n)}catch(i){if(await Ge(r,{force:!0}),!bt(i))throw i}}o(Eh,"removeIndexLine");async function ia(e,t){return yh("sha256",await Ah(e)).update(t).digest("hex")}o(ia,"tombstoneKey");async function Ah(e){let t=Y.join(e,".governance","tombstone.key");try{return await Ye(t)}catch(r){if(!bt(r))throw r}await mi(Y.dirname(t),{recursive:!0});let n=vh(32);try{return await hi(t,n,{flag:"wx"}),n}catch(r){if(!aa(r))throw r;return Ye(t)}}o(Ah,"readOrCreateKey");async function oa(e){try{let t=JSON.parse(await Ye(sa(e),"utf8"));if(!be(t)||t.version!==1||!be(t.entries))throw new Error("invalid memory lifecycle state");let n={};for(let[r,i]of Object.entries(t.entries)){if(!/^[0-9a-f]{64}$/.test(r)||!be(i))throw new Error("invalid memory lifecycle entry");if(i.lifecycle!=="archived"&&i.lifecycle!=="forgotten"||typeof i.updatedAt!="string")throw new Error("invalid memory lifecycle entry");n[r]={lifecycle:i.lifecycle,updatedAt:i.updatedAt}}return{version:1,entries:n}}catch(t){if(bt(t))return{version:1,entries:{}};throw t}}o(oa,"readLifecycleState");async function jh(e,t){let n=sa(e);await mi(Y.dirname(n),{recursive:!0});let r=`${n}.${pi()}.tmp`;try{await hi(r,`${JSON.stringify(t,null,2)}
205
+ `,"utf8"),await Xs(r,n)}catch(i){throw await Ge(r,{force:!0}),i}}o(jh,"writeState");function sa(e){return Y.join(e,".governance","lifecycle.json")}o(sa,"statePath");function Ph(e,t){let n=Y.resolve(e);return Y.resolve(t).startsWith(`${n}${Y.sep}`)}o(Ph,"isWithin");function be(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}o(be,"isRecord");function bt(e){return be(e)&&e.code==="ENOENT"}o(bt,"isMissing");function aa(e){return be(e)&&e.code==="EEXIST"}o(aa,"isAlreadyExists");function $h(e){return be(e)?e.code==="EBUSY"?!0:process.platform==="win32"&&(e.code==="EPERM"||e.code==="EACCES"):!1}o($h,"isTransientLockContention");var _t="missing",Aa=1,Oh=1440*60*1e3,Kh=2,Uh=200;function Bh(e){return new Rn(e)}o(Bh,"createMemoryControlPlane");var Rn=class{static{o(this,"MemoryControlPlane")}cwd;learningStorePath;memoryRoot;now;onEvent;projectDocs;extraRefs;sessionId;sessionLineage;artifactLedger;discoverSkills;memoryReviewer;identity;applicability;scopedRoots;constructor(t){this.cwd=t.cwd,this.learningStorePath=t.learningStorePath??ur(t.cwd,t.identity?.configHome),this.identity=t.identity,this.applicability=t.identity?.projectId!==void 0?{tenantId:t.identity.tenantId,projectId:t.identity.projectId}:void 0,this.memoryRoot=t.memoryRoot??(t.identity?.projectId!==void 0?_e(t.identity,"project"):Kt(t.cwd)),this.scopedRoots=t.memoryRoot!==void 0||t.identity===void 0?[]:qh(t.identity),this.now=t.now??(()=>new Date().toISOString()),this.onEvent=t.onEvent,this.projectDocs=t.projectDocs??Hh(t.cwd),this.extraRefs=t.extraRefs??[],this.sessionId=t.sessionId??"current",this.sessionLineage=t.sessionLineage,this.artifactLedger=t.artifactLedger??[],this.discoverSkills=t.discoverSkills??!0,this.memoryReviewer=t.memoryReviewer}async listInbox(){let t=await P(this.learningStorePath);if(t.warnings.length>0)return[];let n=[];for(let r of t.proposals){if(r.status!=="pending")continue;let i=await this.projectLearningProposal(r);i!==void 0&&n.push(i)}return n}async showProposal(t){let n=await P(this.learningStorePath);if(n.warnings.length>0)return;let r=n.proposals.find(i=>It(i.proposalId)===t);return r===void 0?void 0:this.projectLearningProposal(r)}async listHostAppliedEpisodeProposalIds(t){if(t.length===0)return[];let n=new Set(t),r=await P(this.learningStorePath);return r.warnings.length>0?[]:r.proposals.filter(i=>n.has(i.proposalId)&&i.status==="approved"&&i.approvedBy==="host"&&i.approvalPolicyId===`${Ot}:episode-promotion`).map(i=>i.proposalId)}async approveProposal(t,n){let r=await this.showProposal(t);if(r===void 0)return G(t,"memory proposal not found");if(n===void 0)return G(t,"approval requires fingerprints from a shown proposal preview");let i={proposalId:r.id,approvedBy:"user",approvedAt:this.now(),expectedFingerprints:n},a=await this.adapterForProposal(r).applyProposal(r,i);return a.applied&&this.emit({type:"proposal.approved",proposalId:t}),a}async rejectProposal(t,n){let r=ki(t);if(r===void 0)return{proposalId:t,rejected:!1,skippedReason:`invalid memory proposal id: ${t}`,warnings:[]};let i=await this.showProposal(t);if(i===void 0)return{proposalId:t,rejected:!1,skippedReason:"memory proposal not found",warnings:[]};await de(this.learningStorePath,r,"rejected",n!==void 0&&n.trim().length>0?{rejectedReason:n}:{}),this.emit({type:"proposal.rejected",proposalId:t});let s=n?.trim(),a,c=[];if(s!==void 0&&s.length>0)try{a=await this.reviewMemoryFeedback({trigger:"proposal_rejected",userFeedback:s,sourceRefs:i.sourceRefs.map(d=>d.id),candidateRefIds:[...i.targetRefs.map(d=>d.id),...i.sourceRefs.map(d=>d.id)]}),c=a.warnings}catch(d){c=[`memory feedback review failed: ${Sa(d)}`]}return{proposalId:t,rejected:!0,...a!==void 0?{review:a}:{},warnings:c}}async listRefs(t={}){let n=[];n.push(...await this.listLearningRefs());for(let r of this.memdirAdapters())n.push(...await r.listRefs(t));return n.push(...this.listSessionTraceRefs()),n.push(...this.listArtifactLedgerRefs()),n.push(...await this.listProjectDocRefs()),n.push(...await this.listSkillRefs()),n.push(...this.extraRefs),n.filter(r=>Si(r,t))}async readRef(t){return t.kind==="learning_proposal"||t.kind==="reasoning_report"?this.readLearningRef(t):t.kind==="memdir"?this.memdirAdapter().readRef(t):t.kind==="session_trace"?this.readSessionTraceRef(t):t.kind==="artifact_ledger"?this.readArtifactLedgerRef(t):Ii(t,this.now)}async archiveRef(t){let n=(await this.listRefs()).find(r=>r.id===t);return n?.kind!=="memdir"?Ra(t,"archive"):(await Zs(this.memoryRootForRef(n),n,this.now()),{refId:t,operation:"archive",acknowledged:!0,residualSourceRefs:n.sourceRefs,warnings:[]})}async forgetRef(t){return this.removeManagedRef(t,"forget")}async purgeRef(t){return this.removeManagedRef(t,"purge")}async removeManagedRef(t,n){let r=(await this.listRefs()).find(i=>i.id===t);return r?.kind!=="memdir"?Ra(t,n):(await ea(this.memoryRootForRef(r),r,this.now()),{refId:t,operation:n,acknowledged:!0,residualSourceRefs:r.sourceRefs,warnings:n==="purge"&&r.sourceRefs.length>0?["source carriers follow their independent retention lifecycle"]:[]})}async runCurator(t={}){let n=await this.listRefs({includePrivate:t.includePrivate,includeSensitive:t.includeSensitive}),r=this.buildGovernanceReport(n);return this.emit({type:"curator.completed",reportId:r.reportId}),r}async maybeRunAutoCurator(t={}){if(t.enabled===!1)return{ran:!1,skippedReason:"disabled"};let n=this.now(),r=Math.max(0,t.intervalMs??Oh),i=Math.max(1,t.minRefs??Kh),s=ig(this.memoryRoot),a=await ag(s),c=a?.lastCheckedAt??a?.lastRunAt,d=c===void 0?void 0:ma(c,r);if(d!==void 0&&ug(d,n)>0)return{ran:!1,skippedReason:"not_due",nextEligibleAt:d};let l=(await this.listRefs({includePrivate:t.includePrivate,includeSensitive:t.includeSensitive})).filter(fg);if(l.length<i)return{ran:!1,skippedReason:"insufficient_refs"};let u=this.buildGovernanceReport(l),f=og(this.memoryRoot,u);return await En(f,`${JSON.stringify(u,null,2)}
206
+ `),await sg(this.memoryRoot,Uh),await cg(s,{version:Aa,lastCheckedAt:n,lastRunAt:n,lastInventoryFingerprint:b(ha(l)),lastReportPath:f}),this.emit({type:"curator.completed",reportId:u.reportId}),{ran:!0,report:u,reportPath:f,nextEligibleAt:ma(n,r)}}async buildMemoryPack(t){let n=this.now(),r=ka(t),i=b(r);if(t.ignoreMemory===!0||Cg(t.task))return{generatedAt:n,taskFingerprint:i,memoryRevision:b("suppressed"),candidates:[],promptHints:[],hints:[],omitted:["memory intentionally suppressed by request"],traceMetadata:{selectedRefIds:[],omittedRefIds:[],taskFingerprint:i,suppressed:!0}};let a=(await this.listRefs({includePrivate:t.includePrivate,includeSensitive:t.includeSensitive})).filter(p=>Ig(p,t)).sort((p,h)=>ba(h,t)-ba(p,t)||Sn(h,r)-Sn(p,r)||p.id.localeCompare(h.id)),c=Math.max(0,t.maxCandidates??12),d=Math.min(c,Math.max(0,t.maxHints??5)),l=a.slice(0,c),u=await this.buildPackHints(l,{...t,includeSnippets:!1}),f=await this.buildPackHints(l.slice(0,d),t);return this.emit({type:"pack.selected",refIds:f.map(p=>p.ref.id)}),{generatedAt:n,taskFingerprint:i,memoryRevision:b(ha(a)),candidates:u,promptHints:f,hints:f,omitted:a.slice(c).map(p=>p.id),traceMetadata:{selectedRefIds:f.map(p=>p.ref.id),omittedRefIds:a.slice(c).map(p=>p.id),taskFingerprint:i,suppressed:!1}}}async reviewMemoryFeedback(t){let n=this.now(),r=await this.prepareReviewInput(t),i=r.sourceRefs;if(this.memoryReviewer===void 0){let c={trigger:t.trigger,createdAt:n,sourceRefs:i,candidateRefs:r.candidateRefs,actions:[],warnings:[...r.warnings,"memory reviewer unavailable; semantic memory review was not run"],...t.episodeDigest!==void 0?{episodeDigest:t.episodeDigest}:{}};return this.emit({type:"review.completed",trigger:t.trigger,actionCount:0}),c}let s=await this.memoryReviewer(r),a=t.episodeDigest===void 0?s:{...s,episodeDigest:t.episodeDigest};return this.emit({type:"review.completed",trigger:t.trigger,actionCount:a.actions.length}),a}async prepareEpisodeReview(t){return this.prepareReviewInput({trigger:ya(t),episodeDigest:t,userFeedback:t.summary,task:t.objective,sourceRefs:t.evidenceRefs})}async prepareReviewInput(t){let n=t.sourceRefs??[],r=await this.selectReviewCandidateRefs(t);return{trigger:t.trigger,userFeedback:t.userFeedback??t.episodeDigest?.summary??"",...t.task!==void 0?{task:t.task}:{},sourceRefs:n,candidateRefs:r.candidateRefs,warnings:r.warnings}}async persistReviewPlan(t){return(await this.persistReviewPlanWithDecisions(t)).proposalIds}async persistReviewPlanWithDecisions(t,n){let r=[],i=[],s=await this.listRefs({includePrivate:!0}),a=(await P(this.learningStorePath)).proposals;for(let c=0;c<t.actions.length;c+=1){let d=t.actions[c],l=await this.consultReviewAction(t,d,c,s);if(l.kind==="conflict"||l.kind==="no_action"||l.kind==="reject"||l.kind==="quarantine"){i.push(l);continue}let u=l.existingRefId===void 0?void 0:s.find(k=>k.id===l.existingRefId),f=l.kind==="evidence_update"&&u!==void 0?Ag((await this.readRef(u)).body):d.proposedBody?.trim();if(f===void 0||f.length===0){i.push({actionIndex:c,kind:"reject",reason:"memory proposal body is empty",...l.existingRefId!==void 0?{existingRefId:l.existingRefId}:{}});continue}let p=`memory-review-${b([t.trigger,...t.sourceRefs,l.kind,l.existingRefId??"",d.summary,f].join("\0")).slice(0,24)}`,h=t.episodeDigest,g=Pg([...u?.sourceRefs??[],...h?.evidenceRefs??t.sourceRefs]),y=this.resolveReviewMemoryPlacement(t,d,u,a),v={destination:"memdir_handoff",proposalId:p,origin:"background_learning",userLabel:"context_note",memoryKind:y.memoryKind,body:f,metadata:{writeOrigin:"background_learning",executionContext:"primary",sessionId:h?.sessionId??"memory-review",sourceRefs:g,completedTurn:!0,persistenceKind:l.kind,...d.claimKind!==void 0?{claimKind:d.claimKind}:{},...d.claimKey!==void 0?{claimKey:d.claimKey}:{},...d.actionSignature!==void 0?{actionSignature:d.actionSignature}:{},...d.preconditions!==void 0?{preconditions:d.preconditions}:{},...y.applicability!==void 0?{applicability:y.applicability}:{},requestedLifecycle:y.requestedLifecycle,...h!==void 0?{episodeOutcome:h.outcome,verifiedEvidence:vi(h),...this.identity?.projectId!==void 0?{evidenceProjectId:this.identity.projectId}:{}}:{},...u!==void 0?{targetRefId:u.id,...u.storageUri!==void 0?{targetStorageUri:u.storageUri}:{}}:{}}};await rt(this.learningStorePath,v,{now:this.now,...n===void 0?{}:{revalidateAuthority:n}}),r.push(p),i.push({...l,proposalId:p}),this.emit({type:"proposal.created",proposalId:It(p)})}return{proposalIds:r,decisions:i}}resolveReviewMemoryPlacement(t,n,r,i){if(n.claimKind==="preference"&&(t.trigger==="explicit_remember"||t.trigger==="user_correction")&&this.identity?.userId!==void 0)return{memoryKind:"user",applicability:{tenantId:this.identity.tenantId,userId:this.identity.userId},requestedLifecycle:"active"};if(n.claimKind!=="procedure"||n.claimKey===void 0||this.identity===void 0)return this.projectPlacement(n.claimKind);let s=t.episodeDigest,a=s!==void 0&&vi(s),c=xg(n.claimKey,i,a&&s?.outcome==="succeeded"?this.identity.projectId:void 0,a&&s?.outcome==="failed");if(!(r?.scope==="agent"||c.projects.size>=2))return this.projectPlacement("procedure");let l=c.successes>=3&&c.projects.size>=2&&!c.hasCounterexample;return{memoryKind:"semantic_memory",applicability:{tenantId:this.identity.tenantId,agentId:this.identity.agentId},requestedLifecycle:l?"active":"provisional"}}projectPlacement(t){return this.identity?.projectId===void 0?{memoryKind:"project",requestedLifecycle:"active"}:{memoryKind:"project",applicability:{tenantId:this.identity.tenantId,...t==="procedure"?{agentId:this.identity.agentId}:{},projectId:this.identity.projectId},requestedLifecycle:"active"}}async reviewEpisode(t,n){let r=await this.reviewMemoryFeedback({trigger:ya(t),episodeDigest:t,userFeedback:t.summary,task:t.objective,sourceRefs:t.evidenceRefs});return this.applyReviewedEpisode(r,t,n)}async applyReviewedEpisode(t,n,r,i){let s=t.episodeDigest===n?t:{...t,episodeDigest:n};if(_a(r))return Dg(s,"episode review timed out");let a=await this.persistReviewPlanWithDecisions(s,i),c=a.proposalIds,d=[],l=[...s.warnings];for(let u of a.decisions){if(_a(r)){l.push("episode review timed out before governed apply");break}let f=u.proposalId;if(f===void 0)continue;let p=s.actions[u.actionIndex];if(p===void 0||!_g(p,n))continue;let h=await this.applyHostEligibleProposal(It(f),`${Ot}:episode-promotion`,"verified low-risk episode memory",i);h.applied?d.push(f):h.skippedReason!==void 0&&l.push(h.skippedReason)}return{plan:s,proposalIds:c,appliedProposalIds:d,decisions:a.decisions,warnings:l}}async consultReviewAction(t,n,r,i){if(n.action==="conflict_report"||n.relationship==="conflict")return{actionIndex:r,kind:"conflict",reason:"review reported an unresolved contradiction"};if(n.action==="quarantine"||jg(n.proposedBody??""))return{actionIndex:r,kind:"quarantine",reason:"memory content is restricted or explicitly quarantined"};if(n.action!=="write_memdir"&&n.action!=="patch_memdir"||n.proposedBody===void 0||n.proposedBody.trim().length===0)return{actionIndex:r,kind:"reject",reason:"review action is not a supported durable-memory mutation"};let s=Rg(n,t,i);if(s===void 0)return n.action==="patch_memdir"?{actionIndex:r,kind:"reject",reason:"patch target is missing or governance-incompatible"}:{actionIndex:r,kind:"create",reason:"no compatible governed claim exists"};if(s.lifecycle==="quarantined")return{actionIndex:r,kind:"quarantine",existingRefId:s.id,reason:"compatible claim is quarantined"};if(s.lifecycle==="archived"||s.authority==="proposal_only")return{actionIndex:r,kind:"reject",existingRefId:s.id,reason:"compatible claim is not eligible for governed update"};let a=await this.readRef(s),c=n.relationship==="same_claim"||wa(a.body)===wa(n.proposedBody),l=(t.episodeDigest?.evidenceRefs??t.sourceRefs).some(u=>!s.sourceRefs.includes(u));return c&&!l?{actionIndex:r,kind:"no_action",existingRefId:s.id,reason:"compatible claim and evidence already exist"}:{actionIndex:r,kind:c&&n.relationship!=="condition_refinement"?"evidence_update":"condition_refinement",existingRefId:s.id,reason:c?"compatible claim has new independent evidence":"compatible claim receives a reviewed condition refinement"}}async applyHostEligibleProposal(t,n,r,i){let s=await this.showProposal(t);if(s===void 0)return G(t,"memory proposal not found");let a=await this.adapterForProposal(s).applyProposal(s,{proposalId:s.id,approvedBy:"host",approvedAt:this.now(),expectedFingerprints:s.expectedFingerprints,policyId:n,policyReason:r,...i===void 0?{}:{revalidateAuthority:i}});return a.applied&&this.emit({type:"proposal.approved",proposalId:t}),a}async projectLearningProposal(t){if(t.proposal.destination==="memdir_handoff")return this.projectMemdirHandoff(t,t.proposal);if(t.proposal.destination==="reasoning_handoff")return this.projectReasoningHandoff(t,t.proposal)}async projectMemdirHandoff(t,n){let r=this.memoryRootForHandoff(n),i=this.scopedRoots.find(f=>f.root===r),s=Vh(r,n,t.proposalId),a=await Yh(s.targetPath,n,t,i),c=await Gh(s.entrypointPath,i),d=_n(t),l={[a.id]:a.bodyFingerprint??_t,[c.id]:c.bodyFingerprint??_t},u={summary:`${n.metadata.persistenceKind==="evidence_update"||n.metadata.persistenceKind==="condition_refinement"?"Update":"Write"} ${n.memoryKind} memory from learning proposal ${t.proposalId}.`,changedRefs:[a,c],changedPaths:[s.targetPath,s.entrypointPath],beforeFingerprints:l,afterFingerprints:{[a.id]:b(s.content)},diff:s.content,warnings:[]};return{id:It(t.proposalId),action:n.metadata.persistenceKind==="evidence_update"||n.metadata.persistenceKind==="condition_refinement"?"patch_memdir":"write_memdir",targetRefs:[a,c],sourceRefs:[d],expectedFingerprints:l,rationale:`F224 classified this as ${n.memoryKind} memory.`,risk:"medium",preview:u,requiresApproval:!0,createdAt:t.createdAt}}projectReasoningHandoff(t,n){let r=la(t),i=_n(t),s={summary:`Record reasoning report handoff: ${n.title}`,changedRefs:[],changedPaths:[],beforeFingerprints:{[r.id]:r.bodyFingerprint??b(n.body)},warnings:["No stable reasoning-strategy carrier exists yet; approval records the handoff only."]};return{id:It(t.proposalId),action:"no_op",targetRefs:[r],sourceRefs:[i],expectedFingerprints:s.beforeFingerprints,rationale:"Reasoning handoff stays as a report until a stable carrier exists.",risk:"low",preview:s,requiresApproval:!0,createdAt:t.createdAt}}async listLearningRefs(){let t=await P(this.learningStorePath);if(t.warnings.length>0)return[];let n=[];for(let r of t.proposals)(r.proposal.destination==="memdir_handoff"||r.proposal.destination==="reasoning_handoff")&&n.push(_n(r)),r.proposal.destination==="reasoning_handoff"&&n.push(la(r));return n}async readLearningRef(t){let n=t.kind==="reasoning_report"?t.id.replace(/^reasoning_report:/,""):t.id.replace(/^learning_proposal:/,""),r=await P(this.learningStorePath),i=r.proposals.find(a=>a.proposalId===n);if(i===void 0)return{ref:t,body:"",bodyFingerprint:b(""),readAt:this.now(),warnings:[`learning proposal not found: ${n}`]};let s=bi(i);return{ref:{...t,bodyFingerprint:b(s)},body:s,bodyFingerprint:b(s),readAt:this.now(),warnings:r.warnings}}async listProjectDocRefs(){let t=[];for(let n of this.projectDocs){let r=await Ie(n);r.exists&&t.push({kind:"project_doc",id:`project_doc:${Th(this.cwd,n).replace(/\\/g,"/")}`,scope:"project",title:oe(n),owner:"project",lifecycle:"readonly",authority:"read_only",visibility:"prompt_safe",sourceRefs:[],relatedRefs:[],bodyFingerprint:b(r.content),storageUri:n})}return t}listSessionTraceRefs(){return this.sessionLineage===void 0?[]:this.sessionLineage.entries.map(t=>zh(this.sessionId,t))}listArtifactLedgerRefs(){return this.artifactLedger.map(t=>Wh(this.sessionId,t))}readSessionTraceRef(t){let n=ua(t.id,"session_trace",this.sessionId),r=this.sessionLineage?.entries.find(s=>s.id===n),i=r===void 0?"":An(r);return{ref:{...t,bodyFingerprint:b(i)},body:i,bodyFingerprint:b(i),readAt:this.now(),warnings:r===void 0?[`session trace entry not found: ${t.id}`]:[]}}readArtifactLedgerRef(t){let n=ua(t.id,"artifact_ledger",this.sessionId),r=this.artifactLedger.find(s=>s.id===n),i=r===void 0?"":An(r);return{ref:{...t,bodyFingerprint:b(i)},body:i,bodyFingerprint:b(i),readAt:this.now(),warnings:r===void 0?[`artifact ledger entry not found: ${t.id}`]:[]}}async listSkillRefs(){if(!this.discoverSkills)return[];let t;try{t=(await Kr(this.cwd)).list()}catch{return[]}return t.map(n=>({kind:"skill",id:`skill:${n.name}`,scope:n.source==="builtin"?"builtin":n.source==="user"?"user":"project",title:n.name,owner:n.source==="builtin"?"kodax":n.source==="user"?"user":"project",lifecycle:n.source==="builtin"?"readonly":"active",authority:"read_only",visibility:"prompt_safe",sourceRefs:[],relatedRefs:[],storageUri:M(n.path,"SKILL.md")}))}async buildPackHints(t,n){let r=[];for(let i of t){let s=n.includeSnippets===!0?await this.readRef(i):void 0,a=T(i.title??i.id,240)??i.id,c=s===void 0||s.body.trim().length===0?void 0:n.purpose==="deliberate_query"||n.purpose==="intervention"?Fg(s.body):Ia(s.body),d=c===void 0?void 0:T(c,512);r.push({ref:i,hook:a,reason:Lg(i,ka(n)),...d!==void 0&&s!==void 0?{bodySnippet:d,bodyFingerprint:s.bodyFingerprint}:i.bodyFingerprint!==void 0?{bodyFingerprint:i.bodyFingerprint}:{}})}return r}async selectReviewCandidateRefs(t){let n=Math.max(0,t.maxRefs??6);if(n===0)return{candidateRefs:[],warnings:[]};let r=await this.listRefs({includePrivate:t.includePrivate,includeSensitive:t.includeSensitive}),i=[],s=t.candidateRefIds!==void 0&&t.candidateRefIds.length>0?$g(r,t.candidateRefIds,n,i):r.filter(Sg).sort((c,d)=>Sn(d,va(t))-Sn(c,va(t))).slice(0,n),a=[];for(let c of s)a.push(await this.readReviewCandidateRef(c));return{candidateRefs:a,warnings:i}}async readReviewCandidateRef(t){try{let n=await this.readRef(t);return{ref:n.ref,...n.body.trim().length>0?{bodySnippet:Ia(n.body)}:{},bodyFingerprint:n.bodyFingerprint,warnings:n.warnings}}catch(n){return{ref:t,...t.bodyFingerprint!==void 0?{bodyFingerprint:t.bodyFingerprint}:{},warnings:[`failed to read memory ref: ${Sa(n)}`]}}}adapterForProposal(t){return t.action==="write_memdir"||t.action==="patch_memdir"?this.memdirAdapter():new yi(this.learningStorePath,this.now)}memdirAdapter(){return this.memdirAdapters()[0]??new St(this.memoryRoot,this.learningStorePath,this.now)}memdirAdapters(){return this.scopedRoots.length===0?[new St(this.memoryRoot,this.learningStorePath,this.now,this.applicability,"project")]:this.scopedRoots.map(t=>new St(t.root,this.learningStorePath,this.now,t.applicability,t.scope))}memoryRootForHandoff(t){let n=t.memoryKind==="user"?"user":t.memoryKind==="semantic_memory"?"agent":"project";return this.scopedRoots.find(r=>r.scope===n)?.root??this.memoryRoot}memoryRootForRef(t){let n=t.storageUri===void 0?void 0:wi(t.storageUri);return this.scopedRoots.find(r=>n?.startsWith(`${wi(r.root)}${Mh}`))?.root??this.memoryRoot}emit(t){this.onEvent?.(t)}buildGovernanceReport(t){let n=this.now(),r=hg(t);return{reportId:`memory-governance:${b(`${n}:${r.length}`).slice(0,12)}`,generatedAt:n,findings:r.length>0?r:[{kind:"no_op",severity:"info",refIds:[],summary:"No memory governance findings.",suggestedAction:"no_op"}],warnings:[]}}},yi=class{static{o(this,"LearningHandoffAdapter")}learningStorePath;now;kind="learning_proposal";constructor(t,n){this.learningStorePath=t,this.now=n}async listRefs(t={}){let n=await P(this.learningStorePath);return n.warnings.length>0?[]:n.proposals.filter(r=>r.proposal.destination==="memdir_handoff"||r.proposal.destination==="reasoning_handoff").map(_n).filter(r=>Si(r,t))}async readRef(t){return Ii(t,this.now)}async previewProposal(t){return t.preview}async applyProposal(t,n){let r=ki(t.id);if(r===void 0)return G(t.id,"invalid memory proposal id");if(!Ng(t.expectedFingerprints,n.expectedFingerprints))return G(t.id,"approval fingerprints do not match proposal preview");let i=await de(this.learningStorePath,r,"approved",{appliedChangedPaths:[],approvedBy:n.approvedBy,approvedAt:n.approvedAt,approvalPolicyId:n.policyId,approvalPolicyReason:n.policyReason,approvalExpectedFingerprints:n.expectedFingerprints,approvalResultingFingerprints:n.expectedFingerprints,now:this.now,...n.revalidateAuthority===void 0?{}:{revalidateAuthority:n.revalidateAuthority}});return{proposalId:t.id,applied:!0,changedRefs:t.targetRefs,changedPaths:[],warnings:i.status==="approved"?[]:["proposal status did not become approved"]}}},St=class{static{o(this,"MemdirMemoryAdapter")}memoryRoot;learningStorePath;now;applicability;scope;kind="memdir";constructor(t,n,r,i,s="project"){this.memoryRoot=t,this.learningStorePath=n,this.now=r,this.applicability=i,this.scope=s}async listRefs(t={}){let n=[],r=this.applicability===void 0?void 0:await P(this.learningStorePath),i;try{i=await xa(this.memoryRoot,{withFileTypes:!0})}catch(s){if(_i(s))return[];throw s}for(let s of i){if(!s.isFile()||!s.name.endsWith(".md")||s.name==="MEMORY.md")continue;let a=M(this.memoryRoot,s.name),c=await Ie(a);if(!c.exists)continue;let d=Xh(a,c.content),l=await Qs(this.memoryRoot,d);if(l==="forgotten")continue;let u=l===d.lifecycle?d:{...d,lifecycle:l};if(this.applicability===void 0){n.push(u);continue}let f=xn(u,this.scope,this.applicability),p=Qh(r?.proposals??[],f,c.content),h=p?.proposal.destination==="memdir_handoff"?p.proposal.metadata:void 0,g=h?.applicability===void 0?f:xn(u,this.scope,h.applicability);n.push(p===void 0?{...f,lifecycle:"provisional",authority:"proposal_only"}:{...g,lifecycle:g.lifecycle==="archived"?"archived":h?.requestedLifecycle??"active",sourceRefs:p.proposal.destination==="memdir_handoff"?p.proposal.metadata.sourceRefs:g.sourceRefs,...p.proposal.destination==="memdir_handoff"&&p.proposal.metadata.claimKind!==void 0?{claimKind:p.proposal.metadata.claimKind}:{},...p.proposal.destination==="memdir_handoff"&&p.proposal.metadata.claimKey!==void 0?{claimKey:p.proposal.metadata.claimKey}:{},...p.proposal.destination==="memdir_handoff"&&p.proposal.metadata.actionSignature!==void 0?{actionSignature:p.proposal.metadata.actionSignature}:{},applyReceiptRef:`learning_proposal:${p.proposalId}`,expectedFingerprint:p.approvalExpectedFingerprints?.[g.id],resultingFingerprint:p.approvalResultingFingerprints?.[g.id]})}return n.filter(s=>Si(s,t))}async readRef(t){return Ii(t,this.now)}async previewProposal(t){return t.preview}async applyProposal(t,n){return F(M(this.memoryRoot,".memory-review.lock"),()=>this.applyProposalWithLock(t,n))}async applyProposalWithLock(t,n){let r=ki(t.id);if(r===void 0)return G(t.id,"invalid memory proposal id");let i=t.targetRefs.find($=>$.kind==="memdir"&&$.storageUri!==void 0),s=t.targetRefs.find($=>$.storageUri!==void 0&&oe($.storageUri)==="MEMORY.md");if(i?.storageUri===void 0||s?.storageUri===void 0)return G(t.id,"memory proposal has no memdir target");let a=n.expectedFingerprints[i.id],c=n.expectedFingerprints[s.id];if(a===void 0||c===void 0)return G(t.id,"approval fingerprints do not cover proposal preview");let l=[i,s].find($=>bg($));if(l!==void 0)return G(t.id,`${l.id} is not mutable by memory governance`);let u=await Ie(i.storageUri),f=await Ie(s.storageUri),p=t.preview.diff??"",h=tg(i.storageUri,p),g=u.exists&&u.content===p,y=ng(f.content,i.storageUri,h),v=f.exists&&f.content===y;if(da(u)!==a&&!g)return G(t.id,"target memory changed after preview");if(da(f)!==c&&!g&&!v)return G(t.id,"MEMORY.md changed after preview");let k=[],I=[];return g?I.push("target memory already matched proposal content; completing approval"):(await n.revalidateAuthority?.(),await En(i.storageUri,p),k.push(i.storageUri)),v?I.push("MEMORY.md already contained the proposal index line; completing approval"):(await n.revalidateAuthority?.(),await En(s.storageUri,y),k.push(s.storageUri)),await de(this.learningStorePath,r,"approved",{appliedAt:this.now(),appliedChangedPaths:[i.storageUri,s.storageUri],approvedBy:n.approvedBy,approvedAt:n.approvedAt,approvalPolicyId:n.policyId,approvalPolicyReason:n.policyReason,approvalExpectedFingerprints:n.expectedFingerprints,approvalResultingFingerprints:{[i.id]:b(p),[s.id]:b(y)},now:this.now,...n.revalidateAuthority===void 0?{}:{revalidateAuthority:n.revalidateAuthority}}),{proposalId:t.id,applied:!0,changedRefs:t.targetRefs,changedPaths:k,warnings:I}}};function Hh(e){return["README.md","AGENTS.md",M("docs","PRD.md"),M("docs","ADR.md"),M("docs","HLD.md"),M("docs","DD.md"),M("docs","FEATURE_LIST.md")].map(t=>wi(e,t))}o(Hh,"defaultProjectDocs");function qh(e){let t=[];return e.projectId!==void 0&&t.push({root:_e(e,"project"),scope:"project",applicability:{tenantId:e.tenantId,projectId:e.projectId}}),e.workspaceId!==void 0&&t.push({root:_e(e,"workspace"),scope:"workspace",applicability:{tenantId:e.tenantId,workspaceId:e.workspaceId}}),t.push({root:_e(e,"agent"),scope:"agent",applicability:{tenantId:e.tenantId,agentId:e.agentId}}),e.userId!==void 0&&t.push({root:_e(e,"user"),scope:"user",applicability:{tenantId:e.tenantId,userId:e.userId}}),t}o(qh,"buildScopedRoots");function It(e){return`memory:${e}`}o(It,"memoryProposalId");function ki(e){return e.startsWith("memory:")?e.slice(7):void 0}o(ki,"parseMemoryProposalId");function b(e){return`sha256:${Ch("sha256").update(e).digest("hex")}`}o(b,"fingerprint");function da(e){return e.exists?b(e.content):_t}o(da,"fingerprintOrMissing");function ja(e){return e.status==="pending"?"pending":e.status==="approved"?"trusted":"archived"}o(ja,"lifecycleFromStatus");function _n(e){let t=bi(e);return{kind:"learning_proposal",id:`learning_proposal:${e.proposalId}`,scope:"project",title:Jh(e),owner:"project",lifecycle:ja(e),authority:"proposal_only",visibility:"prompt_safe",sourceRefs:Pa(e),relatedRefs:[],bodyFingerprint:b(t),createdAt:e.createdAt,updatedAt:e.updatedAt}}o(_n,"learningRefFromEntry");function la(e){let t=e.proposal.destination==="reasoning_handoff"?e.proposal.title:e.proposalId,n=bi(e);return{kind:"reasoning_report",id:`reasoning_report:${e.proposalId}`,scope:"project",title:t,owner:"project",lifecycle:ja(e),authority:"proposal_only",visibility:"prompt_safe",sourceRefs:Pa(e),relatedRefs:[`learning_proposal:${e.proposalId}`],bodyFingerprint:b(n),createdAt:e.createdAt,updatedAt:e.updatedAt}}o(la,"reasoningRefFromEntry");function zh(e,t){let n=An(t);return{kind:"session_trace",id:`session_trace:${e}:${t.id}`,scope:"session",title:`Session ${t.type}: ${t.id}`,owner:"project",lifecycle:"provisional",authority:"read_only",visibility:"private",sourceRefs:[],relatedRefs:t.parentId===null?[]:[`session_trace:${e}:${t.parentId}`],version:"2",bodyFingerprint:b(n),createdAt:t.timestamp,updatedAt:t.timestamp}}o(zh,"sessionTraceRefFromEntry");function Wh(e,t){let n=An(t);return{kind:"artifact_ledger",id:`artifact_ledger:${e}:${t.id}`,scope:"session",title:t.summary??t.displayTarget??t.target,owner:"project",lifecycle:"provisional",authority:"read_only",visibility:"prompt_safe",sourceRefs:t.sessionEntryId===void 0?[]:[`session_trace:${e}:${t.sessionEntryId}`],relatedRefs:[],bodyFingerprint:b(n),createdAt:t.timestamp,updatedAt:t.timestamp}}o(Wh,"artifactLedgerRefFromEntry");function ua(e,t,n){let r=`${t}:${n}:`;return e.startsWith(r)?e.slice(r.length):""}o(ua,"parseScopedMemoryRefId");function Jh(e){let t=e.proposal;return t.destination==="memdir_handoff"?`${t.memoryKind} memory handoff`:t.destination==="reasoning_handoff"?t.title:t.proposalId}o(Jh,"learningTitle");function Pa(e){let t=e.proposal;return t.destination==="memdir_handoff"?t.metadata.sourceRefs:t.destination==="reasoning_handoff"?t.sourceTraceIds:[]}o(Pa,"learningSourceRefs");function bi(e){let t=e.proposal;return t.destination==="memdir_handoff"||t.destination==="reasoning_handoff"?t.body:JSON.stringify(t,null,2)}o(bi,"learningBody");function Vh(e,t,n){let r=Zh(t.memoryKind),i=$a(t.body,`${t.memoryKind} memory`),s=eg(t.body)||i,a=t.metadata.targetStorageUri===void 0?`${r}_${fa(i)}_${fa(n)}.md`:oe(t.metadata.targetStorageUri),c=t.metadata.targetStorageUri??M(e,a),d=["---",`name: ${pa(i)}`,`description: ${pa(s)}`,`type: ${r}`,"---","",t.body.trim(),""].join(`
207
+ `);return{targetPath:c,entrypointPath:M(e,"MEMORY.md"),content:d,indexLine:`- [${i}](${a}) - ${s}`}}o(Vh,"buildMemdirWritePlan");async function Yh(e,t,n,r){let i=await Ie(e),s={kind:"memdir",id:`memdir:${oe(e)}`,scope:t.memoryKind==="user"?"user":"project",title:$a(t.body,`${t.memoryKind} memory`),owner:t.memoryKind==="user"?"user":"project",lifecycle:i.exists?"active":"pending",authority:"approved_write",visibility:"prompt_safe",sourceRefs:[`learning_proposal:${n.proposalId}`,...t.metadata.sourceRefs],relatedRefs:[],...t.metadata.claimKind!==void 0?{claimKind:t.metadata.claimKind}:{},...t.metadata.claimKey!==void 0?{claimKey:t.metadata.claimKey}:{},...t.metadata.actionSignature!==void 0?{actionSignature:t.metadata.actionSignature}:{},bodyFingerprint:i.exists?b(i.content):_t,storageUri:e,createdAt:n.createdAt,updatedAt:n.updatedAt};return r===void 0?s:xn(s,r.scope,t.metadata.applicability??r.applicability)}o(Yh,"buildMemdirTargetRef");async function Gh(e,t){let n=await Ie(e),r={kind:"memdir",id:"memdir:MEMORY.md",scope:"project",title:"MEMORY.md",owner:"project",lifecycle:n.exists?"active":"pending",authority:"approved_write",visibility:"prompt_safe",sourceRefs:[],relatedRefs:[],bodyFingerprint:n.exists?b(n.content):_t,storageUri:e};return t===void 0?r:xn(r,t.scope,t.applicability)}o(Gh,"buildEntrypointRef");function Xh(e,t){let n=we(t),r=oe(e),i=n.frontmatter.type;return{kind:"memdir",id:`memdir:${r}`,scope:i==="user"?"user":"project",title:n.frontmatter.name??r,owner:i==="user"?"user":"project",lifecycle:"active",authority:r==="MEMORY.md"?"read_only":"approved_write",visibility:"prompt_safe",sourceRefs:[],relatedRefs:[],bodyFingerprint:b(t),storageUri:e}}o(Xh,"memdirRefFromFile");function xn(e,t,n){let r=Wn(n),i=e.storageUri===void 0?e.id:oe(e.storageUri);return{...e,id:`memdir:${t}:${r}:${i}`,scope:t,scopeId:r,applicability:n}}o(xn,"decorateScopedRef");function Qh(e,t,n){if(t.storageUri===void 0)return;let r=t.storageUri,i=b(n);for(let s=e.length-1;s>=0;s-=1){let a=e[s];if(a.status==="approved"&&a.appliedChangedPaths?.includes(r)===!0&&Object.values(a.approvalResultingFingerprints??{}).includes(i))return a}}o(Qh,"findApplyReceipt");function Zh(e){return e==="user"||e==="feedback"||e==="project"||e==="reference"?e:"project"}o(Zh,"memoryTypeForHandoff");function $a(e,t){let n=e.split(/\r?\n/).map(r=>r.trim()).find(r=>r.length>0);return n===void 0?t:n.replace(/^#+\s*/,"").slice(0,80)||t}o($a,"titleFromBody");function eg(e){let t=e.replace(/\s+/g," ").trim();if(t.length===0)return;let n=t.search(/[.!?。!?]/);return(n>=0?t.slice(0,n+1):t).slice(0,160)}o(eg,"firstSentence");function fa(e){let t=e.toLowerCase().replace(/[^a-z0-9]+/g,"_").replace(/^_+|_+$/g,"").slice(0,48);return t.length>0?t:"memory"}o(fa,"slugify");function pa(e){return JSON.stringify(e.replace(/\r?\n/g," "))}o(pa,"quoteScalar");function tg(e,t){let n=we(t),r=n.frontmatter.name??oe(e,".md"),i=n.frontmatter.description??r;return`- [${r}](${oe(e)}) - ${i}`}o(tg,"indexLineFromContent");function ng(e,t,n){let r=e.trimEnd();if(rg(r,n))return`${r}
208
+ `;let i=oe(t).replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),s=new RegExp(`^.*\\(${i}\\).*$`,"m");return s.test(r)?`${r.replace(s,n)}
209
+ `:r.length>0?`${n}
210
+ ${r}
211
+ `:`${n}
212
+ `}o(ng,"upsertIndexLine");function rg(e,t){return e.trimEnd().split(/\r?\n/).includes(t)}o(rg,"indexContainsLine");async function Ie(e){try{return{exists:!0,content:await Lh(e,"utf8")}}catch(t){if(_i(t))return{exists:!1,content:""};throw t}}o(Ie,"readTextIfExists");async function En(e,t){await Dh(ca(e),{recursive:!0});let n=M(ca(e),`.${oe(e)}.kodax-${process.pid}-${Date.now().toString(36)}.tmp`);try{await Nh(n,t,"utf8"),await Fh(n,e)}catch(r){throw await Ea(n,{force:!0}),r}}o(En,"writeFileAtomic");function ig(e){return M(e,".governance","auto-curate-state.json")}o(ig,"autoCuratorStatePath");function og(e,t){let n=ga(t.generatedAt),r=ga(t.reportId);return M(e,".governance","reports",`${n}-${r}.json`)}o(og,"autoCuratorReportPath");async function sg(e,t){if(t<=0)return;let n=M(e,".governance","reports"),r;try{r=await xa(n,{withFileTypes:!0})}catch(s){if(_i(s))return;throw s}let i=r.filter(s=>s.isFile()&&s.name.endsWith(".json")).map(s=>s.name).sort((s,a)=>a.localeCompare(s));for(let s of i.slice(t))await Ea(M(n,s),{force:!0})}o(sg,"pruneAutoCuratorReports");async function ag(e){let t=await Ie(e);if(t.exists)try{let n=JSON.parse(t.content);return dg(n)?n:void 0}catch{return}}o(ag,"readAutoCuratorState");async function cg(e,t){await En(e,`${JSON.stringify(t,null,2)}
213
+ `)}o(cg,"writeAutoCuratorState");function dg(e){return lg(e)?e.version===Aa&&In(e.lastCheckedAt)&&In(e.lastRunAt)&&In(e.lastInventoryFingerprint)&&In(e.lastReportPath):!1}o(dg,"isAutoCuratorState");function lg(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}o(lg,"isReadonlyRecord");function In(e){return e===void 0||typeof e=="string"}o(In,"optionalStringField");function ma(e,t){let n=Date.parse(e),r=Number.isFinite(n)?n:Date.now();return new Date(r+t).toISOString()}o(ma,"addMs");function ug(e,t){let n=Date.parse(e),r=Date.parse(t);return!Number.isFinite(n)||!Number.isFinite(r)?0:n-r}o(ug,"compareIso");function fg(e){return e.kind==="memdir"||e.kind==="learning_proposal"||e.kind==="reasoning_report"}o(fg,"isAutoCuratorCandidate");function ha(e){return e.map(t=>[t.id,t.kind,t.scope,t.lifecycle,t.authority,t.visibility,t.bodyFingerprint??"",t.storageUri??"",t.updatedAt??"",t.title??""].join(" ")).sort().join(`
214
+ `)}o(ha,"memoryInventoryPayload");function ga(e){let t=e.replace(/[^a-zA-Z0-9._-]+/g,"-").replace(/^-+|-+$/g,"");return t.length>0?t:"report"}o(ga,"sanitizePathSegment");async function Ii(e,t){if(e.storageUri===void 0)return{ref:e,body:"",bodyFingerprint:b(""),readAt:t(),warnings:["memory ref has no storageUri"]};let n=await Ie(e.storageUri);if(!n.exists)return{ref:e,body:"",bodyFingerprint:b(""),readAt:t(),warnings:[`memory ref storage does not exist: ${e.storageUri}`]};let r=e.kind==="memdir"?we(n.content):void 0;return{ref:{...e,bodyFingerprint:b(n.content)},body:n.content,bodyFingerprint:b(n.content),...r!==void 0?{frontmatter:pg(r.frontmatter)}:{},readAt:t(),warnings:[]}}o(Ii,"readStorageBackedRef");function pg(e){let t={};return e.name!==void 0&&(t.name=e.name),e.description!==void 0&&(t.description=e.description),e.type!==void 0&&(t.type=e.type),t}o(pg,"frontmatterRecord");function Si(e,t){return!(t.kinds!==void 0&&!t.kinds.includes(e.kind)||t.scopes!==void 0&&!t.scopes.includes(e.scope)||t.lifecycles!==void 0&&!t.lifecycles.includes(e.lifecycle)||e.visibility==="private"&&t.includePrivate!==!0||e.visibility==="sensitive"&&t.includeSensitive!==!0||t.query!==void 0&&!mg(e,t.query))}o(Si,"matchesFilter");function mg(e,t){let n=t.trim().toLowerCase();return n.length===0?!0:[e.id,e.title??"",e.kind,e.scope,e.owner,...e.sourceRefs,...e.relatedRefs].some(r=>r.toLowerCase().includes(n))}o(mg,"refMatchesQuery");function hg(e){let t=[];t.push(...gg(e)),t.push(...wg(e)),t.push(...yg(e));for(let n of e)n.lifecycle==="stale"&&t.push({kind:"stale",severity:"warning",refIds:[n.id],summary:`${n.id} is stale and excluded from normal memory packs.`,suggestedAction:"archive"}),n.lifecycle==="quarantined"&&t.push({kind:"quarantined",severity:"warning",refIds:[n.id],summary:`${n.id} is quarantined and requires manual review.`,suggestedAction:"conflict_report"});return t}o(hg,"buildGovernanceFindings");function gg(e){let t=new Map;for(let n of e){if(n.bodyFingerprint===void 0||n.lifecycle==="archived")continue;let r=t.get(n.bodyFingerprint)??[];r.push(n.id),t.set(n.bodyFingerprint,r)}return Array.from(t.entries()).filter(([,n])=>n.length>1).map(([n,r])=>({kind:"duplicate",severity:"warning",refIds:r,summary:`Multiple refs share ${n}.`,suggestedAction:"conflict_report"}))}o(gg,"duplicateFingerprintFindings");function wg(e){let t=new Map;for(let n of e){let r=vg(n.title);if(r===void 0||n.bodyFingerprint===void 0||n.lifecycle==="archived")continue;let i=t.get(r)??[];i.push(n),t.set(r,i)}return Array.from(t.entries()).flatMap(([n,r])=>{let i=new Set(r.map(s=>s.bodyFingerprint));return r.length<2||i.size<=1?[]:[{kind:"conflict",severity:"warning",refIds:r.map(s=>s.id),summary:`Multiple refs use the title "${n}" with different fingerprints.`,suggestedAction:"conflict_report"}]})}o(wg,"conflictTitleFindings");function yg(e){let t=new Set(e.map(n=>n.id));return e.flatMap(n=>{let r=n.relatedRefs.filter(i=>kg(i)&&!t.has(i));return r.length===0?[]:[{kind:"orphaned",severity:"warning",refIds:[n.id,...r],summary:`${n.id} points to missing memory ref(s): ${r.join(", ")}.`,suggestedAction:"conflict_report"}]})}o(yg,"orphanedRefFindings");function vg(e){let t=e?.trim().toLowerCase().replace(/\s+/g," ");return t!==void 0&&t.length>0?t:void 0}o(vg,"normalizeConflictTitle");function kg(e){return/^(learning_proposal|reasoning_report|memdir|session_trace|artifact_ledger|skill|project_doc|self_manual|workflow_run|working_context):/.test(e)}o(kg,"isMemoryControlledRefId");function bg(e){return e.authority==="read_only"||e.scope==="builtin"||e.pinned===!0}o(bg,"isProtectedFromMutation");function Ig(e,t){return e.applicability!==void 0&&(t.identity===void 0||!Mt(t.identity,e.applicability))||e.visibility==="private"&&t.includePrivate!==!0||e.visibility==="sensitive"&&t.includeSensitive!==!0||e.authority==="proposal_only"?!1:e.lifecycle==="trusted"||e.lifecycle==="active"||e.lifecycle==="readonly"}o(Ig,"isPackEligible");function Sg(e){return e.kind!=="memdir"&&e.kind!=="learning_proposal"&&e.kind!=="reasoning_report"?!1:e.lifecycle!=="archived"&&e.lifecycle!=="quarantined"}o(Sg,"isReviewCandidateEligible");function _g(e,t){if(e.confidence!=="high"||e.risk!=="low"||t.visibility!=="prompt_safe"||t.evidenceRefs.length===0||!vi(t)||e.claimKind==="procedure"&&t.outcome!=="succeeded")return!1;let n=e.proposedBody??"";return n.length===0?!1:!/(?:api[_-]?key|authorization:\s*bearer|private key|password|secret|token\s*[:=])/i.test(n)}o(_g,"isEligibleEpisodePromotion");function Rg(e,t,n){let r=new Set(e.targetRefIds),i=n.find(a=>r.has(a.id));if(i!==void 0)return gi(i,e)?i:void 0;if(r.size>0)return;if(e.claimKey!==void 0){let a=n.find(c=>c.claimKey===e.claimKey&&gi(c,e));if(a!==void 0)return a}let s=new Set(t.candidateRefs.map(a=>a.ref.id));return n.find(a=>s.has(a.id)&&gi(a,e))}o(Rg,"findCompatibleReviewRef");function gi(e,t){return!(e.kind!=="memdir"||e.visibility!=="prompt_safe"||t.claimKind!==void 0&&e.claimKind!==void 0&&e.claimKind!==t.claimKind)}o(gi,"isGovernanceCompatibleReviewRef");function wa(e){return we(e).body.replace(/\s+/g," ").trim().toLowerCase()}o(wa,"normalizeClaimBody");function xg(e,t,n,r){let i=n===void 0?0:1,s=r,a=new Set;n!==void 0&&a.add(n);for(let c of t){if(c.status==="rejected"||c.proposal.destination!=="memdir_handoff")continue;let d=c.proposal.metadata;if(d.claimKind!=="procedure"||d.claimKey!==e||d.verifiedEvidence!==!0)continue;let l=d.evidenceProjectId??d.applicability?.projectId;d.episodeOutcome==="succeeded"?(i+=1,l!==void 0&&a.add(l)):d.episodeOutcome==="failed"&&(s=!0)}return{successes:i,projects:a,hasCounterexample:s}}o(xg,"procedurePromotionHistory");function vi(e){let t=e.outcome==="succeeded"?"passed":"failed";return e.evidence?.some(n=>(n.grade==="authoritative"||n.grade==="verified")&&(n.source==="user"||n.source==="host"||n.source==="environment"||n.source==="tool"&&n.verdict===t))===!0}o(vi,"hasVerifiedDigestEvidence");function ya(e){return Eg(e)?e.memoryIntent?.operation==="remember"?"explicit_remember":e.memoryIntent?.operation==="correct"?"user_correction":"episode_completed":"episode_completed"}o(ya,"episodeReviewTrigger");function Eg(e){let t=e.memoryIntent?.evidenceRef;return t!==void 0&&e.evidence?.some(n=>n.ref===t&&n.grade==="authoritative"&&n.source==="user")===!0}o(Eg,"hasAuthoritativeMemoryIntentEvidence");function Ag(e){return we(e).body.trim()}o(Ag,"extractClaimBody");function jg(e){return/(?:api[_-]?key|authorization:\s*bearer|private key|password|secret|token\s*[:=])/i.test(e)||/(?:ignore|disregard|override)\s+(?:all\s+)?(?:previous|prior|system|developer)\s+instructions?/i.test(e)||/<\/?(?:system|developer|assistant|tool|prompt)(?:\s|>)/i.test(e)}o(jg,"isRestrictedMemoryBody");function Pg(e){return[...new Set(e)]}o(Pg,"uniqueStrings");function $g(e,t,n,r){let i=new Map(e.map(a=>[a.id,a])),s=[];for(let a of t.slice(0,n)){let c=i.get(a);c===void 0?r.push(`memory review candidate not found: ${a}`):s.push(c)}return s}o($g,"selectRefsById");function va(e){return[e.task,e.userFeedback].filter(t=>t!==void 0&&t.trim().length>0).join(`
215
+ `)}o(va,"reviewTask");function Cg(e){return/\b(ignore|do not use|don't use|without)\s+(project\s+)?memory\b/i.test(e)}o(Cg,"shouldIgnoreMemory");function ka(e){return[e.task,e.decisionIntent,e.actionSignature].filter(t=>t!==void 0&&t.trim().length>0).join(`
216
+ `)}o(ka,"memoryPackRankingText");function Sn(e,t){let n=t.toLowerCase(),r=e.title?.toLowerCase()??"",i=0;e.pinned===!0&&(i+=50),e.scope==="project"&&(i+=20),e.scope==="user"&&(i+=10),(e.lifecycle==="trusted"||e.lifecycle==="readonly")&&(i+=10),r.length>0&&n.includes(r)&&(i+=30);for(let s of r.split(/[^a-z0-9]+/).filter(a=>a.length>=3))n.includes(s)&&(i+=3);return i}o(Sn,"scoreRef");function ba(e,t){return t.actionSignature!==void 0&&e.actionSignature!==void 0&&e.actionSignature===t.actionSignature?2:t.decisionIntent!==void 0&&e.claimKey!==void 0&&e.claimKey===t.decisionIntent?1:0}o(ba,"structuredMatchScore");function Lg(e,t){let n=e.title??e.id;return t.toLowerCase().includes(n.toLowerCase())?"Exact task/title overlap.":`${e.scope} ${e.kind} is eligible for deterministic recall.`}o(Lg,"packReason");function Ia(e){return e.replace(/\s+/g," ").trim().slice(0,240)}o(Ia,"firstSnippet");function Fg(e){return we(e).body.replace(/```[\s\S]*?```/g," ").replace(/<\/?[^>]+>/g," ").replace(/^\s{0,3}(?:#{1,6}|[-*+]\s+|>\s*)/gm,"").replace(/[`*_~]/g,"").replace(/\s+/g," ").trim().slice(0,512)}o(Fg,"promptSafeClaimSnippet");function Sa(e){return e instanceof Error?e.message:String(e)}o(Sa,"errorMessage");function An(e){return JSON.stringify(e,null,2)}o(An,"stringifyJson");function Ng(e,t){let n=Object.keys(e).sort(),r=Object.keys(t).sort();return n.length!==r.length?!1:n.every((i,s)=>i===r[s]&&e[i]===t[i])}o(Ng,"fingerprintsMatch");function G(e,t){return{proposalId:e,applied:!1,changedRefs:[],changedPaths:[],skippedReason:t,warnings:[]}}o(G,"skippedApply");function _a(e){return e?.aborted===!0}o(_a,"isAborted");function Dg(e,t){return{plan:e,proposalIds:[],appliedProposalIds:[],decisions:[],warnings:[...e.warnings,t]}}o(Dg,"cancelledEpisodeReview");function Ra(e,t){return{refId:e,operation:t,acknowledged:!1,residualSourceRefs:[],warnings:["managed memory ref not found"]}}o(Ra,"lifecycleNotFound");function _i(e){return typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT"}o(_i,"isMissingFile");import{createHash as Tg,randomUUID as Ei}from"node:crypto";import{mkdir as Da,readFile as Ta,readdir as Ai,rename as Ma,rm as se,stat as Oa,writeFile as Mg}from"node:fs/promises";import w from"node:path";var Ce=class extends Error{static{o(this,"EpisodeReviewFailure")}kind;constructor(t,n){super(n),this.kind=t,this.name="EpisodeReviewFailure"}},ji=5*6e4,At=ji,Pn=class extends Error{static{o(this,"EpisodeReviewBranchChangedError")}constructor(){super("episode review branch changed before persistence"),this.name="EpisodeReviewBranchChangedError"}};async function Og(e){return N(e,async()=>(await Dn(e)).epoch)}o(Og,"captureEpisodeReviewBranchEpoch");async function Kg(e,t,n={}){if(!mc(t))throw new Error("invalid outcome digest for review inbox");if(t.sessionId!==e.sessionId)throw new Error("outcome digest session does not match review-inbox owner");return N(e,async()=>{let r=await Dn(e);if(n.expectedBranchEpoch!==void 0&&n.expectedBranchEpoch!==r.epoch)throw new Pn;let i={version:2,jobId:nw(e,t,r.epoch),reviewKey:t.reviewKey,digest:t,ownerSessionRef:e.sessionId,ownerAgentHash:x("agent",e.agentId),...e.projectId!==void 0?{ownerProjectHash:x("project",e.projectId)}:{},branchId:t.branchId,branchEpoch:r.epoch,authorityCeiling:"memory_and_project_skill",createdAt:t.createdAt},s=jt(e,i.jobId);return await J(e,i.jobId,async()=>{let a=await Nn(e,i.jobId);if(a?.status==="completed"||a?.status==="attention")return;let c=await Cn(s);if(c!==void 0&&c.jobId!==i.jobId)throw new Error("v2 review job path collision");c===void 0&&await E(s,i),a===void 0&&await E(ae(e,i.jobId),{schemaVersion:1,jobId:i.jobId,status:"pending",claimEpoch:0,providerAttempts:0,applyAttempts:0,applyAttemptsByCarrier:{memory:0,skill:0},completionAttempts:0,updatedAt:i.createdAt})}),await n.persistOwner?.(i),{path:s,entry:i}})}o(Kg,"persistPendingEpisodeReview");async function Ka(e,t,n={}){let r=n.now??new Date,i=Math.max(1e3,n.leaseMs??ji);return N(e,async()=>{let s=await Fi(e,t);if(s!==void 0)return J(e,s.jobId,async()=>{let a=await Nn(e,s.jobId),c=await Dn(e);if(a===void 0||ac(s,c)||a.status==="completed"||a.status==="attention"||a.nextAttemptAt!==void 0&&Date.parse(a.nextAttemptAt)>r.getTime()||a.nextApplyAttemptAt!==void 0&&Date.parse(a.nextApplyAttemptAt)>r.getTime()||a.nextCompletionAttemptAt!==void 0&&Date.parse(a.nextCompletionAttemptAt)>r.getTime()||a.claimToken!==void 0&&a.leaseDeadline!==void 0&&Date.parse(a.leaseDeadline)>r.getTime())return;let d=a.claimEpoch+1,l=Ei(),u=new Date(r.getTime()+i).toISOString();return await E(ae(e,s.jobId),{...a,status:"processing",claimEpoch:d,claimToken:l,leaseDeadline:u,updatedAt:r.toISOString()}),{jobId:s.jobId,reviewKey:s.reviewKey,ownerSessionRef:s.ownerSessionRef,branchId:s.branchId,branchEpoch:s.branchEpoch,epoch:d,token:l,leaseDeadline:u}})})}o(Ka,"claimEpisodeReview");async function Ua(e,t,n,r=new Date){return me(n.promptRevision,"promptRevision"),me(n.schemaRevision,"schemaRevision"),me(n.policyRevision,"policyRevision"),me(n.providerRevision,"providerRevision"),N(e,()=>J(e,t.jobId,async()=>{await ce(e,t,r);let i=await j(Ze(e,t.jobId),Nt);if(i!==void 0)return Ft(i,t.jobId),i;let s=oc(n.evidence),a={version:1,jobId:t.jobId,evidence:JSON.parse(s),evidenceBytes:s,evidenceHash:$t(s),promptRevision:n.promptRevision,schemaRevision:n.schemaRevision,policyRevision:n.policyRevision,providerRevision:n.providerRevision,createdAt:r.toISOString()};return await E(Ze(e,t.jobId),a),a}))}o(Ua,"freezeEpisodeReviewInput");async function Ba(e,t,n,r=new Date){Lt(n.memoryProposalIds,"memoryProposalIds");let i=n.requiredCarriers??["memory"];if(dc(i),!i.includes("memory"))throw new Error("requiredCarriers must include memory");return N(e,()=>J(e,t.jobId,async()=>{let s=await ce(e,t,r),a=await j(Ze(e,t.jobId),Nt);if(a===void 0)throw new Error("review decision requires a frozen input");Ft(a,t.jobId);let c=await j(xt(e,t.jobId),On);if(c!==void 0)return Mn(c,t.jobId,a.evidenceHash),c;if(a.evidenceHash!==n.inputHash)throw new Error("review decision does not reference the frozen input");let d=r.toISOString(),l={version:1,jobId:t.jobId,decisionId:$t(`${t.jobId}:${n.inputHash}`),inputHash:n.inputHash,memoryProposalIds:[...n.memoryProposalIds],requiredCarriers:[...i],...n.memoryPlan===void 0?{}:{memoryPlan:n.memoryPlan},...n.capabilityDecision===void 0?{}:{capabilityDecision:n.capabilityDecision},committedAt:d};return await E(xt(e,t.jobId),l),await E(ae(e,t.jobId),{...s,status:"decided",updatedAt:d}),l}))}o(Ba,"commitEpisodeReviewDecision");async function Ug(e,t,n,r=new Date){return N(e,()=>Ri(e,t,n,r))}o(Ug,"commitEpisodeReviewAction");async function jn(e,t,n){return N(e,async()=>(await Ca(e,t),n(async()=>{await Ca(e,t)})))}o(jn,"withEpisodeReviewClaimAuthority");async function Ri(e,t,n,r=new Date){return me(n.actionId,"actionId"),me(n.decisionId,"decisionId"),cc(n.carrier),Lt(n.resultRefs,"resultRefs"),J(e,t.jobId,async()=>{await ce(e,t,r);let i=await j(Ze(e,t.jobId),Nt);if(i===void 0)throw new Error("review action requires a frozen input");Ft(i,t.jobId);let s=await j(xt(e,t.jobId),On);if(s===void 0)throw new Error("review action does not reference the committed decision");if(Mn(s,t.jobId,i.evidenceHash),s.requiredCarriers!==void 0&&!s.requiredCarriers.includes(n.carrier))throw new Error(`review action carrier is not required: ${n.carrier}`);let a=`${s.decisionId}:${n.carrier}`;if(s.decisionId!==n.decisionId||n.actionId!==a)throw new Error("review action does not use the committed deterministic identity");let c=rw(e,t.jobId,n.actionId),d=await j(c,pc);if(d!==void 0)return lc(d,{jobId:t.jobId,actionId:n.actionId,decisionId:n.decisionId,carrier:n.carrier}),d;let l={version:1,jobId:t.jobId,actionId:n.actionId,decisionId:n.decisionId,carrier:n.carrier,resultRefs:[...n.resultRefs],committedAt:r.toISOString()};return await E(c,l),l})}o(Ri,"commitEpisodeReviewActionWithSessionFence");async function Ca(e,t){await J(e,t.jobId,async()=>{await ce(e,t,new Date)})}o(Ca,"assertEpisodeReviewClaimWithSessionFence");async function Ha(e,t,n,r=new Date){return N(e,()=>J(e,t.jobId,async()=>{let i=await ce(e,t,r),s=n.kind==="provider_timeout"||n.kind==="provider_error"||n.kind==="malformed_response",a=i.providerAttempts+(s?1:0),c=a>=4,d=s&&!c?[6e4,5*6e4,30*6e4][a-1]:void 0,l={...i,status:c?"attention":"pending",providerAttempts:a,...d===void 0?{nextAttemptAt:void 0}:{nextAttemptAt:new Date(r.getTime()+d).toISOString()},lastError:n.message,claimToken:void 0,leaseDeadline:void 0,updatedAt:r.toISOString()};return await E(ae(e,t.jobId),l),l}))}o(Ha,"failEpisodeReviewAttempt");async function qa(e,t,n,r=new Date){return N(e,()=>J(e,t.jobId,async()=>{let i=await ce(e,t,r),s=i.applyAttemptsByCarrier[n.carrier]+1,a={...i.applyAttemptsByCarrier,[n.carrier]:s},c=a.memory+a.skill,d=s>=4,l=d?void 0:[6e4,5*6e4,30*6e4][s-1],u={...i,status:d?"attention":"pending",applyAttempts:c,applyAttemptsByCarrier:a,...l===void 0?{nextApplyAttemptAt:void 0}:{nextApplyAttemptAt:new Date(r.getTime()+l).toISOString()},lastError:`${n.carrier} apply failed: ${n.message}`,claimToken:void 0,leaseDeadline:void 0,updatedAt:r.toISOString()};return await E(ae(e,t.jobId),u),u}))}o(qa,"failEpisodeReviewApply");async function Bg(e,t,n,r=new Date){return N(e,()=>J(e,t.jobId,async()=>{let i=await ce(e,t,r),s=i.completionAttempts+1,a=s>=4,c=a?void 0:[6e4,5*6e4,30*6e4][s-1],d={...i,status:a?"attention":"pending",completionAttempts:s,...c===void 0?{nextCompletionAttemptAt:void 0}:{nextCompletionAttemptAt:new Date(r.getTime()+c).toISOString()},lastError:`completion delivery failed: ${n}`,claimToken:void 0,leaseDeadline:void 0,updatedAt:r.toISOString()};return await E(ae(e,t.jobId),d),d}))}o(Bg,"failEpisodeReviewCompletion");async function Qe(e,t,n,r=new Date){return N(e,()=>J(e,t.jobId,async()=>{let s={...await ce(e,t,r),status:"pending",lastError:n,claimToken:void 0,leaseDeadline:void 0,updatedAt:r.toISOString()};return await E(ae(e,t.jobId),s),s}))}o(Qe,"deferEpisodeReview");async function za(e,t,n,r=new Date){return N(e,()=>Wa(e,t,n,r))}o(za,"completeFencedEpisodeReview");async function Wa(e,t,n,r=new Date){return Lt(n,"proposalIds"),J(e,t.jobId,async()=>{let i=await ce(e,t,r),s=await j(Ze(e,t.jobId),Nt);if(s===void 0)throw new Error("review completion requires a frozen input");Ft(s,t.jobId);let a=await j(xt(e,t.jobId),On);if(a===void 0)throw new Error("review completion requires a decision");Mn(a,t.jobId,s.evidenceHash);let c=await Va(e,t.jobId,a),d=a.requiredCarriers??["memory"],l=new Set(c.map(p=>p.carrier));for(let p of d)if(!l.has(p))throw new Error(`review completion is missing required ${p} action receipt`);let u=c.filter(p=>p.carrier==="memory").flatMap(p=>p.resultRefs);if(!Ti(u,n))throw new Error("review completion payload mismatch");let f=await Ci(e,t.reviewKey,n,t.jobId);return await E(ae(e,t.jobId),{...i,status:"completed",claimToken:void 0,leaseDeadline:void 0,updatedAt:r.toISOString()}),await Fe(jt(e,t.jobId),t.jobId),{acknowledged:!0,receiptPath:f}})}o(Wa,"completeFencedEpisodeReviewWithSessionFence");async function Rt(e,t,n,r=new Date){await N(e,()=>J(e,t.jobId,async()=>{let i=await ce(e,t,r);await E(ae(e,t.jobId),{...i,status:"completed",lastError:n,claimToken:void 0,leaseDeadline:void 0,updatedAt:r.toISOString()}),await Fe(jt(e,t.jobId),t.jobId)}))}o(Rt,"discardFencedEpisodeReview");async function Ja(e,t){return N(e,async()=>{let n=await Fi(e,t);if(n===void 0)return;let r=await Nn(e,n.jobId);if(r===void 0)return;let i=await j(Ze(e,n.jobId),Nt);i!==void 0&&Ft(i,n.jobId);let s=await j(xt(e,n.jobId),On);if(s!==void 0){if(i===void 0)throw new Error("review decision is missing its frozen input");Mn(s,n.jobId,i.evidenceHash)}let a=await Va(e,n.jobId,s);return{envelope:n,state:r,...i===void 0?{}:{input:i},...s===void 0?{}:{decision:s},actions:a}})}o(Ja,"inspectEpisodeReviewJob");async function Va(e,t,n){let r=[],i=nc(e,t);for(let s of await Ct(i)){let a=await j(w.join(i,s),pc);if(a===void 0)continue;if(n===void 0)throw new Error("review action receipt is missing its committed decision");let c=`${n.decisionId}:${a.carrier}`;if(s!==`${Q(c)}.json`)throw new Error("review action receipt identity mismatch");if(lc(a,{jobId:t,actionId:c,decisionId:n.decisionId,carrier:a.carrier}),n.requiredCarriers!==void 0&&!n.requiredCarriers.includes(a.carrier))throw new Error(`review action receipt carrier is not required: ${a.carrier}`);r.push(a)}return r.sort((s,a)=>s.actionId.localeCompare(a.actionId))}o(Va,"readVerifiedEpisodeReviewActions");async function Ya(e){let t=ec(e.tenantId,e.configHome),n=e.agentId===void 0?void 0:x("agent",e.agentId),r=e.projectId===void 0?void 0:x("project",e.projectId),i=await sw(t),s=[];for(let a of i){await aw(e.configHome,t,a);let c=w.join(t,a,"pending");for(let d of await Ct(c)){let l=await Le(w.join(c,d));l!==void 0&&(n!==void 0&&l.ownerAgentHash!==n||r!==void 0&&l.ownerProjectHash!==r||s.push(l))}}return s.sort((a,c)=>a.createdAt.localeCompare(c.createdAt)||a.reviewKey.localeCompare(c.reviewKey))}o(Ya,"listPendingEpisodeReviews");async function Hg(e,t,n){return me(t,"reviewKey"),Lt(n,"proposalIds"),N(e,async()=>{if(await Fi(e,t)!==void 0)throw new Error("v2 episode review requires frozen input, a committed decision, and action receipts");let i=tc(e,t),s=await Le(i,{cleanupCompleted:!1}),a=Li(X(e),t),c=await j(a,Di);if(s===void 0){if(c===void 0)throw new Error("pending legacy episode review was not found");return Ln(c,t,void 0,a,n,e),{acknowledged:!0,receiptPath:a}}if(s.version!==1||s.reviewKey!==t)throw new Error("legacy episode review identity mismatch");if(pw(s,e),c!==void 0)return uc(c,s),Ln(c,t,void 0,a,n),await Fe(i,t),{acknowledged:!0,receiptPath:a};let d=await Ci(e,t,n);return await Fe(i,t),{acknowledged:!0,receiptPath:d}})}o(Hg,"completeEpisodeReview");async function qg(e,t){return Fn(e,()=>Vg(X(e),t))}o(qg,"rewindPendingEpisodeReviews");async function zg(e,t){if(!Number.isSafeInteger(t)||t<0)throw new Error("rewind sequence must be a non-negative safe integer");return Fn(e,async()=>{let n=[...await Xa(e)].sort();return Pi(n,0,async()=>{let r=[];for(let s of n)r.push(await $i(s,({entry:a})=>a.digest.sequence>t,({entry:a,queue:c})=>c==="processing"&&a.digest.sequence<=t));let i=0;for(let s of r)i+=await Qa(s,t);return i})})}o(zg,"rewindPendingEpisodeReviewsForSession");async function Wg(e,t){return Ga(e,n=>n(t))}o(Wg,"fencePendingEpisodeReviewsForSession");async function Ga(e,t){return Fn(e,async()=>{let n=[...await Xa(e)].sort();return Pi(n,0,()=>t(async r=>{let i=new Set(r),s=[];for(let c of n)s.push(await $i(c,({entry:d})=>!La(d,i),({entry:d,queue:l})=>l==="processing"&&La(d,i)));let a=0;for(let c of s)a+=await Jg(c);return a}))})}o(Ga,"withPendingEpisodeReviewSessionFence");async function Xa(e){let t=e.configHome===void 0?O("memory-review-inbox"):w.join(e.configHome,"memory-review-inbox"),n=x("session",e.sessionId),r;try{r=await Ai(t,{withFileTypes:!0})}catch(s){if(Se(s))return[];throw s}let i=[];for(let s of r){if(!s.isDirectory()||s.name.startsWith("."))continue;let a=w.join(t,s.name,n);try{(await Oa(a)).isDirectory()&&i.push(a)}catch(c){if(!Se(c))throw c}}return i}o(Xa,"findSessionInboxRoots");async function Pi(e,t,n){let r=e[t];return r===void 0?n():F(w.join(r,".branch-authority.lock"),()=>Pi(e,t+1,n),At)}o(Pi,"withEpisodeReviewRootLocks");async function $i(e,t,n){let r=await cw(e),i=w.join(e,"branch-authority.json"),s=await uw(i),a=r.filter(t),c=new Map;for(let{entry:d}of a){if(d.version!==2||c.has(d.jobId))continue;let l=await j(w.join(e,"jobs",Q(d.jobId),"state.json"),Ni);if(l!==void 0&&l.jobId!==d.jobId)throw new Error(`review job state identity mismatch: ${d.jobId}`);c.set(d.jobId,l)}return{sessionRoot:e,authorityFile:i,current:s,retired:a,recoverable:r.filter(n),retiredStates:c}}o($i,"prepareEpisodeReviewMutationPlan");async function Jg(e){let t=new Date().toISOString(),n=e.current.epoch+1;await E(e.authorityFile,{...e.current,epoch:n,exactFences:[...e.current.exactFences??[],...e.retired.some(({entry:i})=>i.version===2)?[{epoch:n,retiredJobIds:e.retired.flatMap(({entry:i})=>i.version===2?[i.jobId]:[]).sort(),createdAt:t}]:[]]});let r=0;for(let{entry:i,filePath:s}of e.retired){if(i.version===2){let a=w.join(e.sessionRoot,"jobs",Q(i.jobId));await F(w.join(a,".authority.lock"),async()=>{let c=w.join(a,"state.json"),d=e.retiredStates.get(i.jobId);d!==void 0&&d.status!=="completed"&&await E(c,{...d,status:"completed",claimToken:void 0,leaseDeadline:void 0,lastError:"review job is outside the active Session branch",updatedAt:t}),await se(s,{force:!0})})}else await se(s,{force:!0});r+=1}return await Et(e.sessionRoot,e.recoverable),r}o(Jg,"applyFenceEpisodeReviewPlan");function La(e,t){return e.version===2&&t.has(e.jobId)||t.has(e.digest.id)}o(La,"isActiveReview");async function Vg(e,t){if(!Number.isSafeInteger(t)||t<0)throw new Error("rewind sequence must be a non-negative safe integer");return F(w.join(e,".branch-authority.lock"),async()=>{let n=await $i(e,({entry:r})=>r.digest.sequence>t,({entry:r,queue:i})=>i==="processing"&&r.digest.sequence<=t);return Qa(n,t)},At)}o(Vg,"rewindPendingEpisodeReviewsAtRoot");async function Qa(e,t){let n=new Date().toISOString(),r=e.current.epoch+1;await E(e.authorityFile,{...e.current,epoch:r,rewinds:[...e.current.rewinds,{epoch:r,throughSequence:t,createdAt:n}]});let i=0;for(let{entry:s,filePath:a}of e.retired){if(s.version===2){let c=w.join(e.sessionRoot,"jobs",Q(s.jobId));await F(w.join(c,".authority.lock"),async()=>{let d=w.join(c,"state.json"),l=e.retiredStates.get(s.jobId);l!==void 0&&l.status!=="completed"&&await E(d,{...l,status:"completed",claimToken:void 0,leaseDeadline:void 0,lastError:`rewound through sequence ${t}`,updatedAt:n}),await se(a,{force:!0})})}else await se(a,{force:!0});i+=1}return await Et(e.sessionRoot,e.recoverable),i}o(Qa,"applyRewindEpisodeReviewPlan");async function Yg(e,t){let n=await Ya({...e.configHome===void 0?{}:{configHome:e.configHome},tenantId:e.tenantId,agentId:e.agentId,...e.projectId!==void 0?{projectId:e.projectId}:{}}),r=e.projectId===void 0?n.filter(d=>d.ownerProjectHash===void 0):n,i=Math.max(1,Math.min(8,t.maxEntries??8)),s={reviewed:0,discarded:0,deferred:n.length-r.length,failed:0,failures:[]},a=0,c=0;for(let d of r){if(a>=i)break;c+=1;let l={...e,sessionId:d.ownerSessionRef};if(d.version===2){let f=await Xg(l,d,t);if(f.kind==="not_claimed"){s.deferred+=1;continue}a+=1,f.kind==="reviewed"?s.reviewed+=1:f.kind==="discarded"?s.discarded+=1:f.kind==="deferred"?s.deferred+=1:f.kind==="failed"&&(s.failed+=1,s.failures.push({reviewKey:d.reviewKey,error:f.error}));continue}let u=await Gg(l,d,t);if(u.kind==="not_claimed"){s.deferred+=1;continue}a+=1,u.kind==="reviewed"?s.reviewed+=1:u.kind==="discarded"?s.discarded+=1:u.kind==="deferred"?s.deferred+=1:u.kind==="failed"&&(s.failed+=1,s.failures.push({reviewKey:d.reviewKey,error:u.error}))}return s.deferred+=Math.max(0,r.length-c),s}o(Yg,"drainPendingEpisodeReviews");async function Gg(e,t,n){return N(e,async()=>{let r=await ew(e,t.reviewKey);if(r===void 0)return{kind:"not_claimed"};try{let i=await n.revalidate(t);if(i==="defer")return await Na(e,t,r),{kind:"deferred"};if(i==="discard")return await se(r,{force:!0}),{kind:"discarded"};let s=await n.review(t);return await Ci(e,t.reviewKey,s),await Fe(r,t.reviewKey),{kind:"reviewed"}}catch(i){return await Na(e,t,r),{kind:"failed",error:i instanceof Error?i.message:String(i)}}})}o(Gg,"drainLegacyEpisodeReview");async function Xg(e,t,n){let r=await Ka(e,t.jobId);if(r===void 0)return{kind:"not_claimed"};let i,s=!1,a=!1;try{let c=await n.revalidate(t);if(c==="defer")return await Qe(e,r,"review eligibility deferred"),{kind:"deferred"};if(c==="discard")return await Rt(e,r,"review eligibility discarded"),{kind:"discarded"};let d=await Ja(e,t.jobId),l=d?.input??await Ua(e,r,n.prepareV2Input===void 0?{evidence:{outcomeDigest:t.digest},promptRevision:"memory-review-compat-v1",schemaRevision:"memory-review-plan-v1",policyRevision:"memory-review-policy-v1",providerRevision:"host-injected"}:await n.prepareV2Input(t)),u=d?.decision;if(s=u!==void 0,u===void 0){let g;try{g=n.decideV2===void 0?{inputHash:l.evidenceHash,memoryProposalIds:[]}:await Qg(n.decideV2,t,l)}catch(v){let k=v instanceof Error?v.message:String(v),I=Zg(v);return await Ha(e,r,{kind:I,message:k}),{kind:"failed",error:k}}let y=await n.revalidate(t);if(y!=="eligible")return y==="discard"?(await Rt(e,r,"review branch changed before decision"),{kind:"discarded"}):(await Qe(e,r,"review branch unavailable before decision"),{kind:"deferred"});u=await Ba(e,r,g),s=!0}let f=await n.revalidate(t);if(f!=="eligible")return f==="discard"?(await Rt(e,r,"review branch changed before effects"),{kind:"discarded"}):(await Qe(e,r,"review branch unavailable before effects"),{kind:"deferred"});let p;if(n.applyV2Action!==void 0){let g=new Map((d?.actions??[]).map(I=>[I.carrier,I])),y=[...g.values()].map(I=>({carrier:I.carrier,resultRefs:I.resultRefs})),v=u.requiredCarriers,k=n.listV2Actions?.(t,u)??v??["memory"];if(dc(k),v===void 0&&!k.includes("memory"))throw new Error("legacy review action carriers must include memory");if(v!==void 0&&!Ti(k,v))throw new Error("review action carriers do not match the committed decision");for(let I of k){if(g.has(I))continue;let $=await n.revalidate(t);if($!=="eligible")return $==="discard"?(await Rt(e,r,"review branch changed before effect"),{kind:"discarded"}):(await Qe(e,r,"review branch unavailable before effect"),{kind:"deferred"});i=I;let vc=await n.applyV2Action(t,u,I,r,kc=>jn(e,r,async bc=>{let Oi=await kc(bc);return await Ri(e,r,{actionId:`${u.decisionId}:${I}`,decisionId:u.decisionId,carrier:I,resultRefs:Oi}),Oi}));i=void 0,y.push({carrier:I,resultRefs:vc})}p=y}else p=await jn(e,r,async()=>{let g=[{carrier:"memory",resultRefs:await n.review(t)}];for(let y of g)await Ri(e,r,{actionId:`${u.decisionId}:${y.carrier}`,decisionId:u.decisionId,carrier:y.carrier,resultRefs:y.resultRefs});return g});let h=p.filter(g=>g.carrier==="memory").flatMap(g=>g.resultRefs);return a=!0,n.onV2Completed!==void 0?await jn(e,r,async g=>{await n.onV2Completed?.(t,u,h),await g(),await Wa(e,r,h)}):await za(e,r,h),a=!1,{kind:"reviewed"}}catch(c){let d=c instanceof Error?c.message:String(c);try{s?a?await Bg(e,r,d):await qa(e,r,{carrier:i??"memory",message:d}):await Qe(e,r,d)}catch(l){if(!(l instanceof Error)||l.message!=="review claim is no longer authoritative")throw l}return{kind:"failed",error:d}}}o(Xg,"drainFencedEpisodeReview");var Fa=9e4;async function Qg(e,t,n){let r=new AbortController,i;try{return await new Promise((s,a)=>{i=setTimeout(()=>{r.abort(),a(new Ce("provider_timeout",`episode reviewer timed out after ${Fa}ms`))},Fa),e(t,n,r.signal).then(s,a)})}finally{i!==void 0&&clearTimeout(i)}}o(Qg,"decideEpisodeReviewWithHardTimeout");function Zg(e){return e instanceof Ce?e.kind:e instanceof Error&&(e.name==="AbortError"||e.name==="TimeoutError")?"provider_timeout":"provider_error"}o(Zg,"classifyEpisodeReviewFailure");async function ew(e,t){let n=w.join(X(e),"processing");await Da(n,{recursive:!0});let r=w.join(n,`${Q(t)}.${Ei()}.json`);try{return await Ma(tc(e,t),r),r}catch(i){if(Se(i))return;throw i}}o(ew,"claimPendingReview");async function Na(e,t,n){await Et(X(e),[{entry:t,filePath:n,queue:"processing"}])}o(Na,"restoreClaim");async function tw(e,t){let n=w.join(e,t),r=w.join(n,"processing"),i=[];for(let a of await Ct(r)){let c=w.join(r,a);try{let d=Date.now()-(await Oa(c)).mtimeMs>ji,l=await Le(c);if(l===void 0)continue;i.push({entry:l,filePath:c,queue:"processing",stale:d})}catch(d){if(!Se(d))throw d}}let s=sc(n,i);for(let[a,c]of s){let d=c.filter(f=>f.stale);if(d.length===0)continue;let l=c[0];if(l!==void 0&&await Za(n,l.entry)){for(let{filePath:f}of d)await se(f,{force:!0});continue}if(await Le(a)!==void 0){await Et(n,d);continue}let u=new Set(c.filter(f=>!f.stale).map(({entry:f})=>$n(f)));if(u.size>0){for(let f of d)u.has($n(f.entry))&&await se(f.filePath,{force:!0});continue}await Et(n,d)}}o(tw,"recoverStaleClaims");async function Ci(e,t,n,r){me(t,"reviewKey"),r!==void 0&&me(r,"jobId"),Lt(n,"proposalIds");let i=Li(X(e),r??t),s=await j(i,Di);if(s!==void 0)return Ln(s,t,r,i,n,r===void 0?e:void 0),i;let a={version:1,...r===void 0?{}:{jobId:r},reviewKey:t,...r===void 0?{ownerAgentHash:x("agent",e.agentId),...e.projectId===void 0?{}:{ownerProjectHash:x("project",e.projectId)}}:{},proposalIds:[...n],completedAt:new Date().toISOString()};return await E(i,a),i}o(Ci,"writeEpisodeReviewReceipt");function Li(e,t){return w.join(e,"receipts",`${Q(t)}.json`)}o(Li,"episodeReviewReceiptPath");async function Za(e,t){let n=t.version===2?t.jobId:t.reviewKey,r=Li(e,n),i=await j(r,Di);return i===void 0?!1:(Ln(i,t.reviewKey,t.version===1?void 0:t.jobId,r),t.version===1&&uc(i,t),!0)}o(Za,"episodeReviewReceiptExists");function ec(e,t){return w.join(rc(t),x("tenant",e))}o(ec,"tenantInboxRoot");function X(e){return w.join(ec(e.tenantId,e.configHome),x("session",e.sessionId))}o(X,"sessionInboxRoot");function tc(e,t){return w.join(X(e),"pending",`${Q(t)}.json`)}o(tc,"pendingPath");function jt(e,t){return w.join(X(e),"pending",`${t}.json`)}o(jt,"pendingV2Path");function nw(e,t,n){return $t([e.configHome??"",e.tenantId,e.agentId,e.projectId??"",e.sessionId,t.branchId,String(n),String(t.sequence),t.id,t.reviewKey].join(`
217
+ `))}o(nw,"episodeReviewJobId");function Pt(e,t){return w.join(X(e),"jobs",Q(t))}o(Pt,"jobRoot");function ae(e,t){return w.join(Pt(e,t),"state.json")}o(ae,"jobStatePath");function Ze(e,t){return w.join(Pt(e,t),"review-input.json")}o(Ze,"jobInputPath");function xt(e,t){return w.join(Pt(e,t),"decision.json")}o(xt,"jobDecisionPath");function nc(e,t){return w.join(Pt(e,t),"actions")}o(nc,"jobActionsRoot");function rw(e,t,n){return w.join(nc(e,t),`${Q(n)}.json`)}o(rw,"jobActionPath");function iw(e,t){return w.join(Pt(e,t),".authority.lock")}o(iw,"jobLockPath");function J(e,t,n){return F(iw(e,t),n)}o(J,"withEpisodeReviewJobLock");function ow(e){return w.join(X(e),"branch-authority.json")}o(ow,"branchAuthorityPath");function N(e,t){return Fn(e,()=>F(w.join(X(e),".branch-authority.lock"),t,At))}o(N,"withEpisodeReviewSessionLock");function rc(e){return e===void 0?O("memory-review-inbox"):w.join(e,"memory-review-inbox")}o(rc,"reviewInboxRoot");function Fn(e,t){let n=x("session",e.sessionId);return ic(e.configHome,n,t)}o(Fn,"withEpisodeReviewRootRegistryLock");function ic(e,t,n){return F(w.join(rc(e),".session-authority",`${t}.lock`),n,At)}o(ic,"withEpisodeReviewRootRegistryKeyLock");function Q(e){return x("review",e)}o(Q,"safeKey");function $t(e){return Tg("sha256").update(e).digest("hex")}o($t,"sha256");function oc(e){return JSON.stringify(xi(e))}o(oc,"stableJson");function xi(e){if(e===null||typeof e=="string"||typeof e=="boolean")return e;if(typeof e=="number"){if(!Number.isFinite(e))throw new Error("review input must contain finite JSON numbers");return e}if(Array.isArray(e))return e.map(xi);if(!L(e))throw new Error("review input must be JSON serializable");let t=Object.create(null);for(let n of Object.keys(e).sort()){let r=e[n];r!==void 0&&(t[n]=xi(r))}return t}o(xi,"normalizeJson");async function E(e,t){await Da(w.dirname(e),{recursive:!0});let n=`${e}.${Ei()}.tmp`;try{await Mg(n,`${JSON.stringify(t,null,2)}
218
+ `,"utf8"),await Ma(n,e)}catch(r){throw await se(n,{force:!0}),r}}o(E,"writeJsonAtomic");async function sw(e){try{return(await Ai(e,{withFileTypes:!0})).filter(t=>t.isDirectory()).map(t=>t.name)}catch(t){if(Se(t))return[];throw t}}o(sw,"readDirectories");async function Ct(e){try{return(await Ai(e,{withFileTypes:!0})).filter(t=>t.isFile()&&t.name.endsWith(".json")).map(t=>t.name)}catch(t){if(Se(t))return[];throw t}}o(Ct,"readJsonFiles");async function Le(e,t={}){try{let n=JSON.parse(await Ta(e,"utf8"));if(!L(n)||n.version!==1&&n.version!==2||typeof n.reviewKey!="string")return Xe(e,"invalid envelope");if(n.version===2&&(typeof n.jobId!="string"||typeof n.branchId!="string"||!Number.isSafeInteger(n.branchEpoch)||n.authorityCeiling!=="memory_and_project_skill"))return Xe(e,"invalid v2 envelope");if(typeof n.ownerSessionRef!="string"||typeof n.ownerAgentHash!="string")return Xe(e,"invalid owner");if(n.ownerProjectHash!==void 0&&typeof n.ownerProjectHash!="string")return Xe(e,"invalid project owner");if(typeof n.createdAt!="string"||!mc(n.digest))return Xe(e,"invalid digest");let r=n;if(r.version===1&&await Za(w.dirname(w.dirname(e)),r)&&t.cleanupCompleted!==!1){await Fe(e,r.reviewKey);return}if(r.version===2){let i=r.jobId,s=await j(w.join(w.dirname(w.dirname(e)),"jobs",Q(i),"state.json"),Ni);if(s!==void 0&&s.jobId!==i)throw new Error(`review job state identity mismatch: ${i}`);if(s?.status==="completed"&&t.cleanupCompleted!==!1){await Fe(e,i);return}}return r}catch(n){if(Se(n))return;if(n instanceof SyntaxError)return Xe(e,"invalid JSON");throw n}}o(Le,"readPending");async function Fe(e,t){try{await se(e,{force:!0})}catch(n){H({source:"memory.review-inbox",level:"warn",message:"Completed episode review left a recoverable pending residue.",detail:{filePath:e,jobId:t,error:n instanceof Error?n.message:String(n)}})}}o(Fe,"removeCompletedPendingBestEffort");async function aw(e,t,n){let r=w.join(t,n);await ic(e,n,()=>F(w.join(r,".branch-authority.lock"),()=>tw(t,n),At))}o(aw,"recoverStaleClaimsWithAuthority");async function cw(e){let t=[];for(let n of["pending","processing"]){let r=w.join(e,n);for(let i of await Ct(r)){let s=w.join(r,i),a=await Le(s,{cleanupCompleted:!1});a!==void 0&&t.push({entry:a,filePath:s,queue:n})}}return t}o(cw,"listQueuedReviewFiles");function dw(e,t){let n=t.entry.version===2?t.entry.jobId:Q(t.entry.reviewKey);return w.join(e,"pending",`${n}.json`)}o(dw,"queuedReviewPendingTarget");function sc(e,t){let n=new Map;for(let r of t){let i=dw(e,r);n.set(i,[...n.get(i)??[],r])}return n}o(sc,"groupQueuedReviewsByPendingTarget");function lw(e,t){if(e.entry.digest.sequence!==t.entry.digest.sequence)return e.entry.digest.sequence>t.entry.digest.sequence?-1:1;let n=t.entry.createdAt.localeCompare(e.entry.createdAt);if(n!==0)return n;let r=t.entry.digest.id.localeCompare(e.entry.digest.id);return r!==0?r:e.filePath.localeCompare(t.filePath)}o(lw,"compareQueuedReviewRecoveryPriority");function $n(e){return e.version===2?e.jobId:e.digest.id}o($n,"queuedReviewIdentity");async function Et(e,t){for(let[n,r]of sc(e,t)){let i=await Le(n);if(i===void 0){let a=[...r].sort(lw)[0];a!==void 0&&(await E(n,a.entry),i=a.entry)}if(i===void 0)continue;let s=$n(i);for(let{entry:a,filePath:c}of r)$n(a)===s&&await se(c,{force:!0})}}o(Et,"restoreQueuedReviewFiles");async function Cn(e){let t=await Le(e,{cleanupCompleted:!1});return t?.version===2?t:void 0}o(Cn,"readV2Envelope");async function Fi(e,t){let n=await Cn(jt(e,t));if(n!==void 0)return n;let r=w.join(X(e),"pending"),i=[];for(let s of await Ct(r)){let a=await Cn(w.join(r,s));a?.reviewKey===t&&i.push(a)}if(i.length>1)throw new Error("reviewKey is ambiguous across distinct v2 jobs; use jobId");return i[0]}o(Fi,"resolvePendingV2Envelope");async function Nn(e,t){let n=await j(ae(e,t),Ni);if(n!==void 0)return{...n,applyAttemptsByCarrier:n.applyAttemptsByCarrier??{memory:n.applyAttempts,skill:0},completionAttempts:n.completionAttempts??0}}o(Nn,"readJobState");async function Dn(e){return fw(ow(e))}o(Dn,"readOrCreateBranchAuthority");async function uw(e){return await j(e,fc)??{schemaVersion:1,epoch:0,rewinds:[]}}o(uw,"readBranchAuthorityAtPath");async function fw(e){let t=await j(e,fc);if(t!==void 0)return t;let n={schemaVersion:1,epoch:0,rewinds:[]};return await E(e,n),n}o(fw,"readOrCreateBranchAuthorityAtPath");function ac(e,t){return t.rewinds.some(n=>n.epoch>e.branchEpoch&&e.digest.sequence>n.throughSequence)||(t.exactFences??[]).some(n=>n.epoch>e.branchEpoch&&n.retiredJobIds.includes(e.jobId))}o(ac,"isRewound");async function ce(e,t,n){let r=await Cn(jt(e,t.jobId)),i=await Nn(e,t.jobId),s=await Dn(e);if(!(r!==void 0&&r.jobId===t.jobId&&r.branchId===t.branchId&&r.branchEpoch===t.branchEpoch&&!ac(r,s)&&i!==void 0&&i.claimEpoch===t.epoch&&i.claimToken===t.token&&i.leaseDeadline===t.leaseDeadline&&Date.parse(t.leaseDeadline)>n.getTime())||i===void 0)throw new Error("review claim is no longer authoritative");return i}o(ce,"assertAuthoritativeClaim");async function j(e,t){try{let n;try{n=JSON.parse(await Ta(e,"utf8"))}catch(r){throw r instanceof SyntaxError?new Error(`invalid review protocol record: ${e}`):r}if(!t(n))throw new Error(`invalid review protocol record: ${e}`);return n}catch(n){if(Se(n))return;throw n}}o(j,"readTypedJson");function Ni(e){return L(e)&&e.schemaVersion===1&&typeof e.jobId=="string"&&["pending","processing","decided","completed","attention"].includes(String(e.status))&&Number.isSafeInteger(e.claimEpoch)&&Number.isSafeInteger(e.providerAttempts)&&Number.isSafeInteger(e.applyAttempts)&&(e.applyAttemptsByCarrier===void 0||L(e.applyAttemptsByCarrier)&&Number.isSafeInteger(e.applyAttemptsByCarrier.memory)&&Number.isSafeInteger(e.applyAttemptsByCarrier.skill))&&(e.completionAttempts===void 0||Number.isSafeInteger(e.completionAttempts))&&typeof e.updatedAt=="string"&&(e.claimToken===void 0||typeof e.claimToken=="string")&&(e.leaseDeadline===void 0||typeof e.leaseDeadline=="string")&&(e.nextAttemptAt===void 0||typeof e.nextAttemptAt=="string")&&(e.nextApplyAttemptAt===void 0||typeof e.nextApplyAttemptAt=="string")&&(e.nextCompletionAttemptAt===void 0||typeof e.nextCompletionAttemptAt=="string")&&(e.lastError===void 0||typeof e.lastError=="string")}o(Ni,"isEpisodeReviewJobState");function Di(e){if(!L(e))return!1;let t=e.jobId!==void 0?["completedAt","jobId","proposalIds","reviewKey","version"]:e.ownerAgentHash===void 0?["completedAt","proposalIds","reviewKey","version"]:e.ownerProjectHash===void 0?["completedAt","ownerAgentHash","proposalIds","reviewKey","version"]:["completedAt","ownerAgentHash","ownerProjectHash","proposalIds","reviewKey","version"],n=Object.keys(e).sort();return n.length===t.length&&n.every((r,i)=>r===t[i])&&e.version===1&&(e.jobId===void 0||typeof e.jobId=="string"&&e.jobId.length>0)&&(e.ownerAgentHash===void 0||typeof e.ownerAgentHash=="string"&&e.ownerAgentHash.length>0)&&(e.ownerProjectHash===void 0||typeof e.ownerProjectHash=="string"&&e.ownerProjectHash.length>0)&&typeof e.reviewKey=="string"&&e.reviewKey.length>0&&Array.isArray(e.proposalIds)&&e.proposalIds.every(r=>typeof r=="string"&&r.length>0)&&Tn(e.completedAt)}o(Di,"isEpisodeReviewReceipt");function Tn(e){if(typeof e!="string")return!1;let t=Date.parse(e);return Number.isFinite(t)&&new Date(t).toISOString()===e}o(Tn,"isCanonicalIsoTimestamp");function me(e,t){if(typeof e!="string"||e.length===0)throw new Error(`${t} must be a non-empty string`)}o(me,"assertNonEmptyString");function Lt(e,t){if(!Array.isArray(e)||e.some(n=>typeof n!="string"||n.length===0))throw new Error(`${t} must contain only non-empty strings`)}o(Lt,"assertNonEmptyStrings");function Ti(e,t){return e.length===t.length&&e.every((n,r)=>n===t[r])}o(Ti,"sameStrings");function cc(e){if(e!=="memory"&&e!=="skill")throw new Error("carrier must be memory or skill")}o(cc,"assertEpisodeReviewCarrier");function dc(e){if(!Array.isArray(e))throw new Error("required carriers must be an array");let t=new Set;for(let n of e){if(cc(n),t.has(n))throw new Error(`duplicate review carrier: ${n}`);t.add(n)}}o(dc,"assertUniqueEpisodeReviewCarriers");function Ft(e,t){if(e.jobId!==t||e.evidenceBytes!==oc(e.evidence)||e.evidenceHash!==$t(e.evidenceBytes))throw new Error("review input identity mismatch")}o(Ft,"assertEpisodeReviewInputIdentity");function Mn(e,t,n){if(e.jobId!==t||e.inputHash!==n||e.decisionId!==$t(`${t}:${n}`))throw new Error("review decision identity mismatch")}o(Mn,"assertEpisodeReviewDecisionIdentity");function lc(e,t){if(e.jobId!==t.jobId||e.actionId!==t.actionId||e.decisionId!==t.decisionId||e.carrier!==t.carrier)throw new Error("review action receipt identity mismatch")}o(lc,"assertEpisodeReviewActionReceiptIdentity");function Ln(e,t,n,r,i,s){if(e.reviewKey!==t||e.jobId!==n)throw new Error(`review receipt identity mismatch: ${r}`);if(i!==void 0&&!Ti(e.proposalIds,i))throw new Error("review receipt payload mismatch");if(s!==void 0){let a=s.projectId===void 0?void 0:x("project",s.projectId);if(e.ownerAgentHash!==x("agent",s.agentId)||e.ownerProjectHash!==a)throw new Error("review owner identity mismatch")}}o(Ln,"assertEpisodeReviewReceiptIdentity");function pw(e,t){let n=t.projectId===void 0?void 0:x("project",t.projectId);if(e.ownerSessionRef!==t.sessionId||e.ownerAgentHash!==x("agent",t.agentId)||e.ownerProjectHash!==n)throw new Error("review owner identity mismatch")}o(pw,"assertEpisodeReviewOwnerIdentity");function uc(e,t){if(e.ownerAgentHash!==void 0&&(e.ownerAgentHash!==t.ownerAgentHash||e.ownerProjectHash!==t.ownerProjectHash))throw new Error("review owner identity mismatch")}o(uc,"assertEpisodeReviewReceiptEntryOwner");function fc(e){return L(e)&&e.schemaVersion===1&&Number.isSafeInteger(e.epoch)&&Array.isArray(e.rewinds)&&e.rewinds.every(t=>L(t)&&Number.isSafeInteger(t.epoch)&&Number.isSafeInteger(t.throughSequence)&&typeof t.createdAt=="string")&&(e.exactFences===void 0||Array.isArray(e.exactFences)&&e.exactFences.every(t=>L(t)&&Number.isSafeInteger(t.epoch)&&Array.isArray(t.retiredJobIds)&&t.retiredJobIds.every(n=>typeof n=="string")&&typeof t.createdAt=="string"))}o(fc,"isEpisodeReviewBranchAuthority");function Nt(e){return L(e)&&e.version===1&&typeof e.jobId=="string"&&e.jobId.length>0&&typeof e.evidenceBytes=="string"&&e.evidenceBytes.length>0&&typeof e.evidenceHash=="string"&&e.evidenceHash.length>0&&typeof e.promptRevision=="string"&&e.promptRevision.length>0&&typeof e.schemaRevision=="string"&&e.schemaRevision.length>0&&typeof e.policyRevision=="string"&&e.policyRevision.length>0&&typeof e.providerRevision=="string"&&e.providerRevision.length>0&&Tn(e.createdAt)&&"evidence"in e}o(Nt,"isEpisodeReviewInputCheckpoint");function On(e){return L(e)&&e.version===1&&typeof e.jobId=="string"&&e.jobId.length>0&&typeof e.decisionId=="string"&&e.decisionId.length>0&&typeof e.inputHash=="string"&&e.inputHash.length>0&&Array.isArray(e.memoryProposalIds)&&e.memoryProposalIds.every(t=>typeof t=="string"&&t.length>0)&&(e.requiredCarriers===void 0||Array.isArray(e.requiredCarriers)&&e.requiredCarriers.includes("memory")&&e.requiredCarriers.every(t=>t==="memory"||t==="skill")&&new Set(e.requiredCarriers).size===e.requiredCarriers.length)&&Tn(e.committedAt)}o(On,"isEpisodeReviewDecision");function pc(e){return L(e)&&e.version===1&&typeof e.jobId=="string"&&e.jobId.length>0&&typeof e.actionId=="string"&&e.actionId.length>0&&typeof e.decisionId=="string"&&e.decisionId.length>0&&(e.carrier==="memory"||e.carrier==="skill")&&Array.isArray(e.resultRefs)&&e.resultRefs.every(t=>typeof t=="string"&&t.length>0)&&Tn(e.committedAt)}o(pc,"isEpisodeReviewActionReceipt");function Xe(e,t){H({source:"memory.review-inbox",level:"warn",message:"Invalid pending episode review was skipped.",detail:{filePath:e,reason:t}})}o(Xe,"invalidPending");function mc(e){return L(e)?typeof e.id=="string"&&typeof e.reviewKey=="string"&&typeof e.sessionId=="string"&&typeof e.branchId=="string"&&Number.isSafeInteger(e.sequence)&&typeof e.objective=="string"&&typeof e.approach=="string"&&(e.outcome==="succeeded"||e.outcome==="failed"||e.outcome==="cancelled")&&typeof e.summary=="string"&&(e.actionSignature===void 0||typeof e.actionSignature=="string")&&(e.preconditions===void 0||typeof e.preconditions=="string")&&(e.lesson===void 0||typeof e.lesson=="string")&&Array.isArray(e.evidenceRefs)&&e.evidenceRefs.every(t=>typeof t=="string")&&(e.evidence===void 0||Array.isArray(e.evidence)&&e.evidence.every(mw))&&(e.outcome!=="cancelled"||hw(e))&&(e.memoryInfluence===void 0||Array.isArray(e.memoryInfluence)&&e.memoryInfluence.every(gw))&&(e.visibility==="prompt_safe"||e.visibility==="private"||e.visibility==="sensitive")&&typeof e.createdAt=="string":!1}o(mc,"isOutcomeDigest");function mw(e){return L(e)&&typeof e.ref=="string"&&(e.grade==="authoritative"||e.grade==="verified"||e.grade==="corroborated"||e.grade==="observed"||e.grade==="inferred")&&(e.source==="user"||e.source==="host"||e.source==="tool"||e.source==="environment"||e.source==="agent")&&(e.verdict===void 0||e.verdict==="passed"||e.verdict==="failed"||e.verdict==="inconclusive")&&typeof e.observedAt=="string"}o(mw,"isOutcomeEvidence");function hw(e){let t=e.memoryIntent,n=e.evidence,r=e.evidenceRefs;if(!L(t)||t.operation!=="remember"&&t.operation!=="correct"||typeof t.evidenceRef!="string"||typeof t.candidateStatement!="string"||typeof t.userQuote!="string"||!Array.isArray(n)||n.length!==1||!Array.isArray(r)||r.length!==1)return!1;let i=n[0];return L(i)&&i.ref===t.evidenceRef&&i.grade==="authoritative"&&i.source==="user"&&r[0]===t.evidenceRef&&e.objective===t.candidateStatement&&e.approach==="episode completion"&&e.actionSignature===void 0&&e.preconditions===void 0&&e.lesson===void 0&&e.memoryInfluence===void 0}o(hw,"isIntentOnlyCancelledDigest");function gw(e){return L(e)&&typeof e.decisionReceiptRef=="string"&&(e.grade==="direct"||e.grade==="supporting"||e.grade==="exposed"||e.grade==="unknown")}o(gw,"isMemoryInfluence");function L(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}o(L,"isRecord");function Se(e){return L(e)&&e.code==="ENOENT"}o(Se,"isMissing");var wc=/^[a-f0-9]{64}$/,ww=new Set(["credential_access","role_override","cross_project","global_mutation","bypass_permissions","destructive_default","network_default"]);function yw(e){let t=e.evidence.exactInvokedSkill===null||T(e.evidence.exactInvokedSkill.content,e.evidence.exactInvokedSkill.content.length)===void 0?null:e.evidence.exactInvokedSkill;return{cacheDomain:"learning-review",memory:{...e.memory,userFeedback:he(e.memory.userFeedback,"unsafe feedback"),...e.memory.task===void 0?{}:{task:he(e.memory.task,"unsafe task")},sourceRefs:Un(e.memory.sourceRefs),candidateRefs:e.memory.candidateRefs.filter(n=>n.ref.visibility==="prompt_safe").map(n=>{let{storageUri:r,scopeId:i,applicability:s,claimKey:a,title:c,sourceRefs:d,relatedRefs:l,...u}=n.ref,f=n.bodySnippet===void 0?void 0:T(n.bodySnippet,512),p=c===void 0?void 0:T(c,160),h=a===void 0?void 0:T(a,160);return{ref:{...u,id:he(n.ref.id,"unsafe ref"),sourceRefs:Un(d),relatedRefs:Un(l),...p===void 0?{}:{title:p},...h===void 0?{}:{claimKey:h}},...f===void 0?{}:{bodySnippet:f},...n.bodyFingerprint===void 0?{}:{bodyFingerprint:n.bodyFingerprint},warnings:[]}}),warnings:["provider evidence omits local paths, source warnings, and unsafe text"]},evidence:{outcomeDigest:hc(e.evidence.outcomeDigest),exactInvokedSkill:t,verifierFacts:e.evidence.verifierFacts.map(n=>({...n,ref:he(n.ref,"unsafe verifier ref")})),priorDigests:e.evidence.priorDigests.map(hc),qualification:{...e.evidence.qualification,exactSkillInvoked:t!==null&&e.evidence.qualification.exactSkillInvoked}}}}o(yw,"sanitizeUnifiedLearningReviewInput");function hc(e){let{lesson:t,preconditions:n,memoryIntent:r,...i}=e,s=t===void 0?void 0:T(t,512),a=n===void 0?void 0:T(n,512),c=r===void 0?void 0:T(r.candidateStatement,512),d=r===void 0?void 0:T(r.userQuote,512),l=r!==void 0&&e.evidence?.some(u=>u.ref===r.evidenceRef&&u.grade==="authoritative"&&u.source==="user")===!0;return{...i,objective:he(e.objective,"unsafe objective"),approach:he(e.approach,"unsafe approach"),summary:he(e.summary,"unsafe summary"),evidenceRefs:Un(e.evidenceRefs),...e.evidence===void 0?{}:{evidence:e.evidence.map(u=>({...u,ref:he(u.ref,"unsafe evidence ref")}))},...s===void 0?{}:{lesson:s},...a===void 0?{}:{preconditions:a},...!l||c===void 0||d===void 0?{}:{memoryIntent:{operation:r.operation,evidenceRef:he(r.evidenceRef,"unsafe intent ref"),candidateStatement:c,userQuote:d}}}}o(hc,"sanitizeOutcomeDigest");function Un(e){return e.map(t=>T(t,256)).filter(t=>t!==void 0)}o(Un,"safeReviewRefs");function he(e,t){return T(e,1024)??`[omitted: ${t}]`}o(he,"safeReviewText");function vw(e){if(!V(e)||e.cacheDomain!=="learning-review"||!V(e.memory)||!V(e.evidence))return!1;let t=e.memory,n=e.evidence,r=n.outcomeDigest,i=n.qualification;return yc(t.trigger)&&typeof t.userFeedback=="string"&&Z(t.sourceRefs)&&Array.isArray(t.candidateRefs)&&Z(t.warnings)&&V(r)&&typeof r.reviewKey=="string"&&typeof r.sessionId=="string"&&typeof r.branchId=="string"&&(r.outcome==="succeeded"||r.outcome==="failed"||r.outcome==="cancelled"&&kw(r))&&Z(r.evidenceRefs)&&Array.isArray(n.verifierFacts)&&Array.isArray(n.priorDigests)&&n.priorDigests.length<=2&&V(i)&&typeof i.reusableMethodEvidence=="boolean"&&typeof i.explicitSkillPreservation=="boolean"&&Number.isSafeInteger(i.independentEpisodeCount)&&typeof i.verifiedOutcome=="boolean"&&typeof i.exactSkillInvoked=="boolean"}o(vw,"isUnifiedLearningReviewModelInput");function kw(e){let t=e.memoryIntent,n=e.evidence,r=e.evidenceRefs;if(!V(t)||t.operation!=="remember"&&t.operation!=="correct"||typeof t.evidenceRef!="string"||typeof t.candidateStatement!="string"||typeof t.userQuote!="string"||!Array.isArray(n)||n.length!==1||!Array.isArray(r)||r.length!==1)return!1;let i=n[0];return V(i)&&i.ref===t.evidenceRef&&i.grade==="authoritative"&&i.source==="user"&&r[0]===t.evidenceRef&&e.objective===t.candidateStatement&&e.approach==="episode completion"&&e.actionSignature===void 0&&e.preconditions===void 0&&e.lesson===void 0&&e.memoryInfluence===void 0}o(kw,"isIntentOnlyCancelledDigest");function bw(e,t){let n=V(t)?t:{};if(!xw(n.memoryPlan))throw new Ce("malformed_response","unified reviewer returned an invalid Memory plan");let r=Aw(n.memoryPlan,e.memory,e.evidence.outcomeDigest),i=Iw(n.capabilityDecision,e.evidence);return{memoryPlan:r,...i===void 0?{}:{capabilityDecision:i}}}o(bw,"normalizeUnifiedLearningReview");function Iw(e,t){if(e==null)return;if(!V(e)||!["discard","ready","project_canary"].includes(String(e.disposition))||!Array.isArray(e.reasonCodes)||!e.reasonCodes.every(g=>typeof g=="string"))return{disposition:"ready",reasonCodes:["invalid_capability_decision"]};let n=[...new Set(e.reasonCodes)],r=Sw(t,n);if(e.disposition==="discard")return{disposition:"discard",reasonCodes:n,...r};let i=Rw(e.spec);if(i===void 0)return{disposition:"ready",reasonCodes:Mi([...n,"invalid_skill_spec"]),...r};try{ct(i)}catch{return{disposition:"ready",reasonCodes:Mi([...n,"unsafe_skill_spec"]),...r}}let s=e.operation==="create"||e.operation==="patch"?e.operation:void 0;if(e.disposition==="ready")return{disposition:"ready",reasonCodes:n,...s===void 0?{}:{operation:s},spec:i,...r};let a=[],c=s==="patch";e.requestedScope!=="project"&&a.push("project_scope_required"),(e.semanticDisposition!=="allow"||n.some(g=>ww.has(g)))&&a.push("semantic_authority_risk");let d=t.qualification,l=d.reusableMethodEvidence&&d.verifiedOutcome&&t.outcomeDigest.outcome==="succeeded"&&t.verifierFacts.some(g=>g.verdict==="passed")&&(d.explicitSkillPreservation||d.independentEpisodeCount>=2),u=c&&d.exactSkillInvoked&&d.verifiedOutcome&&t.verifierFacts.some(g=>g.verdict==="failed")&&n.includes("rule_level_contradiction")&&!n.includes("environment_failure");(c?!u:!l)&&a.push("insufficient_independent_verified_evidence"),s===void 0&&a.push("invalid_skill_operation");let f=typeof e.targetCapabilityId=="string"?e.targetCapabilityId:void 0,p=typeof e.expectedFingerprint=="string"?e.expectedFingerprint:void 0,h=Number.isSafeInteger(e.expectedRevision)?e.expectedRevision:void 0;return c&&!_w(t,f,p,h)&&a.push("exact_invoked_revision_required"),a.length>0?{disposition:"ready",reasonCodes:Mi([...n,...a]),...s===void 0?{}:{operation:s},spec:i,...f===void 0?{}:{targetCapabilityId:f},...p===void 0?{}:{expectedFingerprint:p},...h===void 0?{}:{expectedRevision:h},...r}:{disposition:"project_canary",reasonCodes:n,operation:s,spec:i,...f===void 0?{}:{targetCapabilityId:f},...p===void 0?{}:{expectedFingerprint:p},...h===void 0?{}:{expectedRevision:h},...r}}o(Iw,"normalizeCapabilityDecision");function Sw(e,t){let n=e.exactInvokedSkill;return!(n!==null&&e.qualification.exactSkillInvoked&&e.qualification.verifiedOutcome&&e.verifierFacts.some(i=>i.verdict==="failed")&&t.includes("rule_level_contradiction")&&!t.includes("environment_failure")&&wc.test(n.fingerprint))||n===null?{}:{quarantineExactInvokedRevision:!0,targetCapabilityId:n.capabilityId,expectedFingerprint:n.fingerprint,expectedRevision:n.revision}}o(Sw,"exactQuarantineFields");function _w(e,t,n,r){let i=e.exactInvokedSkill;return e.qualification.exactSkillInvoked&&i!==null&&i.capabilityId===t&&i.fingerprint===n&&i.revision===r&&wc.test(i.fingerprint)}o(_w,"matchesExactInvokedRevision");function Rw(e){if(!(!V(e)||typeof e.name!="string"||typeof e.description!="string"||typeof e.purpose!="string"||!Z(e.triggers)||!Z(e.steps)||!Z(e.verification)||!Z(e.pitfalls)))return{name:e.name,description:e.description,purpose:e.purpose,triggers:e.triggers,steps:e.steps,verification:e.verification,pitfalls:e.pitfalls}}o(Rw,"parseDeclarativeSkillSpec");function xw(e){return V(e)&&yc(e.trigger)&&typeof e.createdAt=="string"&&Z(e.sourceRefs)&&Array.isArray(e.candidateRefs)&&Array.isArray(e.actions)&&e.actions.every(Ew)&&Z(e.warnings)}o(xw,"isMemoryReviewPlan");function Ew(e){if(!V(e))return!1;let t=e.action==="write_memdir"||e.action==="patch_memdir";return["no_op","link_refs","write_memdir","patch_memdir","handoff_to_skill_loop","quarantine","archive","conflict_report"].includes(String(e.action))&&Z(e.targetRefIds)&&typeof e.summary=="string"&&typeof e.rationale=="string"&&["low","medium","high"].includes(String(e.confidence))&&["low","medium","high"].includes(String(e.risk))&&e.requiresApproval===!0&&Kn(e.proposedBody)&&(!t||typeof e.proposedBody=="string"&&e.proposedBody.trim().length>0)&&gc(e.claimKind,["fact","policy","preference","procedure","episode"])&&Kn(e.claimKey)&&Kn(e.actionSignature)&&Kn(e.preconditions)&&(e.counterexamples===void 0||Z(e.counterexamples))&&gc(e.relationship,["same_claim","condition_refinement","conflict"])}o(Ew,"isMemoryReviewAction");function yc(e){return["explicit_remember","explicit_forget","user_correction","proposal_rejected","conflict_detected","episode_completed"].includes(String(e))}o(yc,"isMemoryReviewTrigger");function Aw(e,t,n){return{...e,trigger:t.trigger,sourceRefs:t.sourceRefs,candidateRefs:t.candidateRefs,episodeDigest:n}}o(Aw,"bindMemoryPlanToInput");function Mi(e){return[...new Set(e)]}o(Mi,"unique");function Kn(e){return e===void 0||typeof e=="string"}o(Kn,"optionalString");function gc(e,t){return e===void 0||typeof e=="string"&&t.includes(e)}o(gc,"optionalEnum");function Z(e){return Array.isArray(e)&&e.every(t=>typeof t=="string")}o(Z,"isStringArray");function V(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}o(V,"isRecord");export{jw as a,Pw as b,Fw as c,H as d,Rc as e,Uw as f,Bi as g,O as h,Bw as i,Hw as j,qw as k,Mt as l,x as m,Wn as n,Ot as o,Ne as p,De as q,Te as r,Kt as s,Nc as t,_e as u,Dc as v,Tc as w,zi as x,we as y,Wi as z,Kc as A,Uc as B,Bc as C,Wc as D,Jc as E,Yn as F,Vc as G,Gn as H,Xn as I,Yi as J,Gi as K,Xi as L,Zn as M,Ut as N,tt as O,ad as P,tr as Q,Zi as R,nr as S,ro as T,io as U,qt as V,F as W,P as X,rt as Y,ur as Z,de as _,fr as $,hr as aa,gr as ba,Tl as ca,Ml as da,Oo as ea,Hl as fa,Ko as ga,ql as ha,nu as ia,su as ja,m as ka,Bo as la,Ue as ma,te as na,Ho as oa,Zt as pa,Yo as qa,le as ra,nn as sa,ot as ta,on as ua,Ru as va,Nu as wa,Du as xa,Wu as ya,Ju as za,ct as Aa,ts as Ba,rs as Ca,is as Da,Vu as Ea,Rr as Fa,Yu as Ga,xr as Ha,an as Ia,Xu as Ja,C as Ka,pf as La,Pf as Ma,Hf as Na,qf as Oa,zf as Pa,Wf as Qa,Nr as Ra,Yf as Sa,pn as Ta,Ss as Ua,dp as Va,Rs as Wa,mt as Xa,mp as Ya,je as Za,mn as _a,hn as $a,Kr as ab,hp as bb,ht as cb,gp as db,wp as eb,Br as fb,bp as gb,oh as hb,sh as ib,wh as jb,T as kb,Bh as lb,Rn as mb,Ce as nb,Pn as ob,Og as pb,Kg as qb,Ka as rb,Ua as sb,Ba as tb,Ug as ub,jn as vb,Ha as wb,qa as xb,Qe as yb,za as zb,Rt as Ab,Ja as Bb,Ya as Cb,Hg as Db,qg as Eb,zg as Fb,Wg as Gb,Ga as Hb,Yg as Ib,yw as Jb,vw as Kb,bw as Lb};