@kodax-ai/kodax 0.7.97-beta.2 → 0.7.97-beta.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (161) hide show
  1. package/CHANGELOG.md +96 -0
  2. package/README.md +55 -2
  3. package/README_CN.md +37 -1
  4. package/dist/artifacts/dist/contract.js +1 -1
  5. package/dist/artifacts/dist/contract.js.map +1 -1
  6. package/dist/artifacts/dist/document-render.d.ts +1 -1
  7. package/dist/artifacts/dist/document-render.js +41 -10
  8. package/dist/artifacts/dist/document-render.js.map +1 -1
  9. package/dist/artifacts/dist/kodax.js +1 -1
  10. package/dist/artifacts/dist/kodax.js.map +1 -1
  11. package/dist/artifacts/dist/libreoffice.d.ts +6 -1
  12. package/dist/artifacts/dist/libreoffice.js +37 -13
  13. package/dist/artifacts/dist/libreoffice.js.map +1 -1
  14. package/dist/artifacts/dist/runtime.js +13 -6
  15. package/dist/artifacts/dist/runtime.js.map +1 -1
  16. package/dist/artifacts/skills/artifact-review/SKILL.md +5 -1
  17. package/dist/chunks/agent-NWQPMZ7B.js +2 -0
  18. package/dist/chunks/agent-adapter-V3IPADCX.js +2 -0
  19. package/dist/chunks/argument-completer-VNKHT4X4.js +2 -0
  20. package/dist/chunks/{bedrock-native-Z5VNWF5U.js → bedrock-native-OEPOBW6W.js} +1 -1
  21. package/dist/chunks/{chunk-NSR4RW2F.js → chunk-3I2MIS4D.js} +1 -1
  22. package/dist/chunks/{chunk-RYBUYHDL.js → chunk-3Y5PBEOD.js} +1 -1
  23. package/dist/chunks/chunk-4FVCMKG2.js +20 -0
  24. package/dist/chunks/{chunk-F6GJXQNA.js → chunk-4GYXZTOD.js} +7 -7
  25. package/dist/chunks/{chunk-EISRVOBJ.js → chunk-4Z7ZHL6V.js} +2 -2
  26. package/dist/chunks/{chunk-W2CWO4PQ.js → chunk-576AAIQM.js} +1 -1
  27. package/dist/chunks/chunk-5E2P4RYS.js +4 -0
  28. package/dist/chunks/{chunk-X5M7TLJV.js → chunk-5LFQ5FVY.js} +1 -1
  29. package/dist/chunks/{chunk-WMMESRP3.js → chunk-6RDMSU4B.js} +1 -1
  30. package/dist/chunks/{chunk-3CP7AUWY.js → chunk-7BA4TSKC.js} +1 -1
  31. package/dist/chunks/{chunk-I325ER7D.js → chunk-AUU3N4V4.js} +1 -1
  32. package/dist/chunks/{chunk-DCE7XQUG.js → chunk-AYDLX2UK.js} +1 -1
  33. package/dist/chunks/{chunk-D36OIMV7.js → chunk-BP3NAYKY.js} +64 -64
  34. package/dist/chunks/{chunk-6TITQQAI.js → chunk-BSCSKJNC.js} +230 -229
  35. package/dist/chunks/{chunk-2HH5AS7E.js → chunk-DAQGOWKD.js} +88 -462
  36. package/dist/chunks/{chunk-UF3GZ5PO.js → chunk-EZF6ZRCO.js} +1 -1
  37. package/dist/chunks/chunk-F2TFWNVZ.js +2 -0
  38. package/dist/chunks/{chunk-53CJDQS2.js → chunk-FVXZ5L33.js} +1 -1
  39. package/dist/chunks/{chunk-MCDZNQWD.js → chunk-G32BMSHH.js} +75 -71
  40. package/dist/chunks/chunk-HJLYZ5AX.js +361 -0
  41. package/dist/chunks/{chunk-P55RJIOG.js → chunk-IOIFCU46.js} +1 -1
  42. package/dist/chunks/{chunk-DV5YPYLW.js → chunk-IR46ZHXU.js} +1 -1
  43. package/dist/chunks/chunk-NJDR5EEF.js +6 -0
  44. package/dist/chunks/{chunk-KDSO7V4O.js → chunk-OC3DQXN6.js} +1 -1
  45. package/dist/chunks/{chunk-J2L2NK6E.js → chunk-OMVAPRQI.js} +90 -57
  46. package/dist/chunks/chunk-OXCB2TRF.js +42 -0
  47. package/dist/chunks/{chunk-C6JGLEYD.js → chunk-P6R6V7EW.js} +1 -1
  48. package/dist/chunks/{chunk-SK3RRGHJ.js → chunk-PFBZ4ZXO.js} +28 -28
  49. package/dist/chunks/{chunk-V2XJSFFE.js → chunk-QDE6THC5.js} +1 -1
  50. package/dist/chunks/{chunk-EPK6EWRI.js → chunk-QRYEP34M.js} +1 -1
  51. package/dist/chunks/chunk-ROWYE472.js +460 -0
  52. package/dist/chunks/{chunk-R42S4BLA.js → chunk-SQGESMNC.js} +1 -1
  53. package/dist/chunks/{chunk-XZSFUGPN.js → chunk-U73VEVMP.js} +1 -1
  54. package/dist/chunks/{chunk-D425EZGC.js → chunk-V2TG7GNW.js} +1 -1
  55. package/dist/chunks/{chunk-QSZCR5GC.js → chunk-VRO2CDBY.js} +97 -97
  56. package/dist/chunks/{chunk-BBZWF2EA.js → chunk-WMQQQY3D.js} +1 -1
  57. package/dist/chunks/{chunk-JAF2YLZO.js → chunk-X3YYJJTF.js} +2 -2
  58. package/dist/chunks/{chunk-UL6YIT4M.js → chunk-XYRI6ER5.js} +1 -1
  59. package/dist/chunks/chunk-YRPB3LID.js +3 -0
  60. package/dist/chunks/{chunk-5MUVRFMU.js → chunk-ZDAU3LZ2.js} +1 -1
  61. package/dist/chunks/{chunk-WWPVEK6B.js → chunk-ZP3YSYWM.js} +10 -10
  62. package/dist/chunks/{client-LTIFNED5.js → client-NJ32JBC3.js} +1 -1
  63. package/dist/chunks/compaction-config-JBQGU3NO.js +2 -0
  64. package/dist/chunks/{construction-bootstrap-OAZKGI5Y.js → construction-bootstrap-CM47ZXG7.js} +1 -1
  65. package/dist/chunks/dist-O6BHIQEP.js +2 -0
  66. package/dist/chunks/{google-native-WLL27OV7.js → google-native-BV5GKT5B.js} +1 -1
  67. package/dist/chunks/host-PI5NL4W4.js +2 -0
  68. package/dist/chunks/{mistral-native-JXPIDDYZ.js → mistral-native-X42JCFZH.js} +1 -1
  69. package/dist/chunks/{model-DZF6URW3.js → model-MT3WJX76.js} +1 -1
  70. package/dist/chunks/{permission-YVVMLQ5I.js → permission-YVDVSE6H.js} +1 -1
  71. package/dist/chunks/{pi-messages-5LLOZH57.js → pi-messages-DVJANXV5.js} +1 -1
  72. package/dist/chunks/readline-helpers-5JS7UGTE.js +2 -0
  73. package/dist/chunks/run-manager-Y6VYEWSJ.js +2 -0
  74. package/dist/chunks/running-session-ANMBA5XV.js +2 -0
  75. package/dist/chunks/skills-XL2XIBWV.js +2 -0
  76. package/dist/chunks/{tool-dispatch-MLM3QTSU.js → tool-dispatch-2FOG65FC.js} +1 -1
  77. package/dist/chunks/{utils-2QNMYRGA.js → utils-XZ22R6VB.js} +1 -1
  78. package/dist/client-history.js +2 -0
  79. package/dist/history-turn.js +3 -0
  80. package/dist/index.d.ts +19 -19
  81. package/dist/index.js +2 -2
  82. package/dist/kodax_bootstrap.js +1 -1
  83. package/dist/kodax_cli.js +1472 -1810
  84. package/dist/kodax_doctor.js +1 -1
  85. package/dist/maintenance-scheduler.js +2 -0
  86. package/dist/manual-topics.json +32 -3
  87. package/dist/native/win32-x64/kodax-windows-sandbox.exe +0 -0
  88. package/dist/native/win32-x64/kodax-windows-text-transaction.node +0 -0
  89. package/dist/native/win32-x64/manifest.json +2 -2
  90. package/dist/one-shot-task.js +1 -1
  91. package/dist/provider-auth-cli.js +1 -1
  92. package/dist/runtime-daemon-schema.json +1 -1
  93. package/dist/sandbox-network-broker.js +93 -441
  94. package/dist/sdk-a2a.d.ts +13 -13
  95. package/dist/sdk-a2a.js +1 -1
  96. package/dist/sdk-agent.d.ts +17 -12
  97. package/dist/sdk-agent.js +1 -1
  98. package/dist/sdk-client.d.ts +6 -6
  99. package/dist/sdk-client.js +1 -1
  100. package/dist/sdk-coding.d.ts +17 -17
  101. package/dist/sdk-coding.js +1 -1
  102. package/dist/sdk-experimental-memory.d.ts +2 -2
  103. package/dist/sdk-experimental-memory.js +1 -1
  104. package/dist/sdk-llm.d.ts +4 -2
  105. package/dist/sdk-llm.js +1 -1
  106. package/dist/sdk-mcp.js +1 -1
  107. package/dist/sdk-media.d.ts +13 -13
  108. package/dist/sdk-media.js +1 -1
  109. package/dist/sdk-repl.d.ts +16 -16
  110. package/dist/sdk-repl.js +1 -1
  111. package/dist/sdk-runtime.d.ts +46 -46
  112. package/dist/sdk-runtime.js +1 -1
  113. package/dist/sdk-sandbox.js +1 -1
  114. package/dist/sdk-session.d.ts +7 -7
  115. package/dist/sdk-session.js +1 -1
  116. package/dist/sdk-skills.js +1 -1
  117. package/dist/semantic-worker.js +87 -435
  118. package/dist/storage-repair-cli.js +1 -1
  119. package/dist/types-chunks/{bash-prefix-extractor.d-CJliu5-D.d.ts → bash-prefix-extractor.d-BghXa_md.d.ts} +9 -3
  120. package/dist/types-chunks/{capsule.d-EMwSALqK.d.ts → capsule.d-BTlvC5qq.d.ts} +4 -4
  121. package/dist/types-chunks/{client-contract-B7q69yMA.d.ts → client-contract-B7ZSFKTv.d.ts} +52 -4
  122. package/dist/types-chunks/{controller.d-C0SAuNKu.d.ts → controller.d-Btu5FDdw.d.ts} +1 -1
  123. package/dist/types-chunks/{controller.d-D-hPLKaA.d.ts → controller.d-D6rEz5LS.d.ts} +3 -3
  124. package/dist/types-chunks/{history-retrieval.d-BwEUR9cb.d.ts → history-retrieval.d-B_AriUJp.d.ts} +1 -1
  125. package/dist/types-chunks/{manifest.d-YE3-AIeO.d.ts → manifest.d-Yyce-hHj.d.ts} +1 -1
  126. package/dist/types-chunks/{public-api.d-BhDU643p.d.ts → public-api.d-BLv3lFmw.d.ts} +9 -4
  127. package/dist/types-chunks/{review-inbox.d-Bgt46S7L.d.ts → review-inbox.d-yREk25Vf.d.ts} +2 -0
  128. package/dist/types-chunks/{review-packet.d-ChOfJaNI.d.ts → review-packet.d-xwXxHmML.d.ts} +1 -1
  129. package/dist/types-chunks/{run-manager.d-ChzguipG.d.ts → run-manager.d-D4sa9JYz.d.ts} +26 -12
  130. package/dist/types-chunks/{runtime-client-info-P_mRDG7j.d.ts → runtime-client-info-oRMrkHmb.d.ts} +2 -2
  131. package/dist/types-chunks/{runtime-event-BW5Pla7a.d.ts → runtime-event-BOyaILWg.d.ts} +3 -1
  132. package/dist/types-chunks/{sdk-runtime-cDe7qmN3.d.ts → sdk-runtime-CYyXmQok.d.ts} +27 -13
  133. package/dist/types-chunks/{sdk-session-D3pcSbnA.d.ts → sdk-session-D6mS5qgO.d.ts} +6 -3
  134. package/dist/types-chunks/{skill-invocation-error.d-gsNNDnnt.d.ts → skill-invocation-error.d-Be3qg4JQ.d.ts} +3 -3
  135. package/dist/types-chunks/{trusted-repl-entry-Bbkd2HlO.d.ts → trusted-repl-entry-YWNc4m-Z.d.ts} +7 -7
  136. package/dist/types-chunks/{types.d-BlXTogOo.d.ts → types.d-BQ-hbni4.d.ts} +1 -1
  137. package/dist/types-chunks/{utils.d-CxHyBvO6.d.ts → utils.d-C0F3Uf2X.d.ts} +6 -6
  138. package/dist/windows-effect-job-programs.json +4 -0
  139. package/docs/ARTIFACT_SDK.md +3 -3
  140. package/docs/CLIENT_CONTRACT.md +4 -2
  141. package/docs/SDK_MIGRATION.md +9 -5
  142. package/docs/SPACE_SDK_SEAMS.md +12 -1
  143. package/package.json +4 -3
  144. package/public_docs/README.md +10 -3
  145. package/public_docs/sdk/embedder-guide.md +1 -1
  146. package/dist/chunks/agent-DS7M57WD.js +0 -2
  147. package/dist/chunks/agent-adapter-TLWGGK3V.js +0 -2
  148. package/dist/chunks/argument-completer-OGCXKTRQ.js +0 -2
  149. package/dist/chunks/chunk-GJXOTOZB.js +0 -465
  150. package/dist/chunks/chunk-KE2NBMAP.js +0 -20
  151. package/dist/chunks/chunk-OGTRDK4Q.js +0 -359
  152. package/dist/chunks/chunk-R2HTPDI7.js +0 -2
  153. package/dist/chunks/chunk-SDPZFH6M.js +0 -4
  154. package/dist/chunks/chunk-XDMNJW6J.js +0 -42
  155. package/dist/chunks/compaction-config-ECMOFP5H.js +0 -2
  156. package/dist/chunks/dist-5J53DGAO.js +0 -2
  157. package/dist/chunks/host-65E5NM5P.js +0 -2
  158. package/dist/chunks/readline-helpers-UZXWBRXQ.js +0 -2
  159. package/dist/chunks/run-manager-ZFACIZM2.js +0 -2
  160. package/dist/chunks/running-session-Q5Y6A2QV.js +0 -2
  161. package/dist/chunks/skills-TJP6BLZJ.js +0 -2
@@ -1,18 +1,29 @@
1
1
  // @kodax-ai/kodax — bundled distribution. See docs/ADR.md ADR-022 + ADR-024.
2
- import{R as Ht}from"./chunk-V5RCDBKU.js";import{a as o}from"./chunk-V4WSBIXB.js";import{homedir as ms}from"os";import{existsSync as Ar}from"node:fs";import X from"path";import{fileURLToPath as hs}from"url";import{dirname as gs}from"path";import ds from"path";var Te=new Set;function Pr(e){let t=e.trim();if(!t)throw new Error("Plugin skill path cannot be empty.");return ds.resolve(t)}o(Pr,"normalizePluginSkillPath");function us(e){let t=Pr(e);return Te.add(t),()=>{Te.delete(t)}}o(us,"registerPluginSkillPath");function fs(e){return Te.delete(Pr(e))}o(fs,"unregisterPluginSkillPath");function Jt(){return Array.from(Te.values())}o(Jt,"listPluginSkillPaths");function ps(){Te.clear()}o(ps,"clearPluginSkillPaths");var ws=hs(import.meta.url),Tr=gs(ws);function ys(){if(process.env.KODAX_BUNDLED==="true")return X.join(X.dirname(process.execPath),"builtin");let e=X.join(Tr,"builtin"),t=X.join(Tr,"..","builtin");return!Ar(e)&&Ar(t)?t:e}o(ys,"resolveBuiltinPath");function qt(e){let t=ms();return{projectPaths:e?[X.join(e,".kodax","skills"),X.join(e,".agents","skills")]:[],userPaths:[X.join(t,".kodax","skills"),X.join(t,".agents","skills")],pluginPaths:Jt(),builtinPath:ys()}}o(qt,"getDefaultSkillPaths");function Gt(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(Gt,"getSkillPathsFlat");import{readFile as Xt,readdir as Is}from"fs/promises";import{join as V,relative as Es}from"path";var rt=[];function Fp(e){let t={id:Symbol("kodax-diagnostic-sink"),sink:e};rt.push(t);let n=!1;return()=>{if(n)return;n=!0;let r=rt.findIndex(i=>i.id===t.id);r>=0&&rt.splice(r,1)}}o(Fp,"setKodaXDiagnosticSink");function E(e){let t=Ht(e),n=rt.at(-1)?.sink;if(n){try{n(t)}catch{}return}if(process.env.KODAX_DIAGNOSTICS_STDERR==="1")try{process.stderr.write(`${ks(t)}
3
- `)}catch{}}o(E,"emitKodaXDiagnostic");function ks(e){let t=Ht(e),n=vs(t.detail);return`[${t.source}] ${t.level}: ${t.message}${n?` ${n}`:""}`}o(ks,"formatKodaXDiagnostic");function vs(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(vs,"formatDiagnosticDetail");import $r from"yaml";var Ss=["SessionStart","UserPromptSubmit","PreToolUse","PostToolUse","Stop","SubagentStop","Notification"];function bs(e){let t=e.split(`
2
+ import{R as Ht}from"./chunk-V5RCDBKU.js";import{a as o}from"./chunk-V4WSBIXB.js";import{homedir as hs}from"os";import{existsSync as Ar}from"node:fs";import X from"path";import{fileURLToPath as gs}from"url";import{dirname as ws}from"path";import us from"path";var Te=new Set;function Pr(e){let t=e.trim();if(!t)throw new Error("Plugin skill path cannot be empty.");return us.resolve(t)}o(Pr,"normalizePluginSkillPath");function fs(e){let t=Pr(e);return Te.add(t),()=>{Te.delete(t)}}o(fs,"registerPluginSkillPath");function ps(e){return Te.delete(Pr(e))}o(ps,"unregisterPluginSkillPath");function Jt(){return Array.from(Te.values())}o(Jt,"listPluginSkillPaths");function ms(){Te.clear()}o(ms,"clearPluginSkillPaths");var ys=gs(import.meta.url),Tr=ws(ys);function ks(){if(process.env.KODAX_BUNDLED==="true")return X.join(X.dirname(process.execPath),"builtin");let e=X.join(Tr,"builtin"),t=X.join(Tr,"..","builtin");return!Ar(e)&&Ar(t)?t:e}o(ks,"resolveBuiltinPath");function qt(e){let t=hs();return{projectPaths:e?[X.join(e,".kodax","skills"),X.join(e,".agents","skills")]:[],userPaths:[X.join(t,".kodax","skills"),X.join(t,".agents","skills")],pluginPaths:Jt(),builtinPath:ks()}}o(qt,"getDefaultSkillPaths");function Gt(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(Gt,"getSkillPathsFlat");import{readFile as Xt,readdir as Es}from"fs/promises";import{join as V,relative as Ps}from"path";var rt=[];function Mp(e){let t={id:Symbol("kodax-diagnostic-sink"),sink:e};rt.push(t);let n=!1;return()=>{if(n)return;n=!0;let r=rt.findIndex(i=>i.id===t.id);r>=0&&rt.splice(r,1)}}o(Mp,"setKodaXDiagnosticSink");function E(e){let t=Ht(e),n=rt.at(-1)?.sink;if(n){try{n(t)}catch{}return}if(process.env.KODAX_DIAGNOSTICS_STDERR==="1")try{process.stderr.write(`${vs(t)}
3
+ `)}catch{}}o(E,"emitKodaXDiagnostic");function vs(e){let t=Ht(e),n=Ss(t.detail);return`[${t.source}] ${t.level}: ${t.message}${n?` ${n}`:""}`}o(vs,"formatKodaXDiagnostic");function Ss(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(Ss,"formatDiagnosticDetail");import $r from"yaml";var bs=["SessionStart","UserPromptSubmit","PreToolUse","PostToolUse","Stop","SubagentStop","Notification"];function _s(e){let t=e.split(`
4
4
  `),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(`
5
- `)}o(bs,"sanitizeYaml");function Lr(e,t={}){let n=e.replace(/^/,"").replace(/\r\n/g,`
5
+ `)}o(_s,"sanitizeYaml");function Lr(e,t={}){let n=e.replace(/^/,"").replace(/\r\n/g,`
6
6
  `).replace(/\r/g,`
7
7
  `).trimStart();if(!n.startsWith(`---
8
8
  `)){if(t.throwOnMissing)throw new Error("Invalid markdown: missing YAML frontmatter");return[null,e]}let r=n.indexOf(`
9
9
  ---
10
10
  `,4);if(r===-1){let c=n.indexOf(`
11
- ---`,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=$r.parse(i)??{}}catch{a=$r.parse(bs(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(Lr,"parseYamlFrontmatter");function Cr(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(Cr,"normalizeAllowedToolsString");function _s(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(_s,"normalizeYamlHookEntry");function xs(e){if(e==null)return;let n=(Array.isArray(e)?e:[e]).map(r=>_s(r)).filter(r=>r!==void 0);return n.length>0?n:void 0}o(xs,"normalizeYamlHookEntryList");function Rr(e){if(!e||typeof e!="object"||Array.isArray(e))return;let t=e,n={};for(let r of Ss){let i=xs(t[r]);i&&(n[r]=i)}return Object.keys(n).length>0?n:void 0}o(Rr,"normalizeYamlHookMap");function Vt(e){let[t,n]=Lr(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:Cr(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:Rr(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(Vt,"parseSkillMarkdown");async function it(e,t){let n=V(e,"SKILL.md");try{let r=await Xt(n,"utf-8"),{frontmatter:i}=Vt(r);return{name:i.name,description:i.description,userInvocable:!0,argumentHint:i.argumentHint,path:e,source:t,disableModelInvocation:i.disableModelInvocation??!1}}catch(r){return E({source:"agent:skills",level:"error",message:`Failed to load skill metadata from ${e}.`,detail:r}),null}}o(it,"loadSkillMetadata");async function Yt(e,t){let n=V(e,"SKILL.md");try{let r=await Xt(n,"utf-8"),{frontmatter:i,body:s}=Vt(r),[a,c,l,d,u]=await Promise.all([pe(V(e,"scripts")),pe(V(e,"references")),pe(V(e,"assets")),pe(V(e,"templates")),pe(V(e,"resources"))]);return{...i,userInvocable:!0,path:e,skillFilePath:n,content:s,rawContent:s,loaded:!0,source:t,...a.length>0&&{scripts:a},...c.length>0&&{references:c},...l.length>0&&{assets:l},...d.length>0&&{templates:d},...u.length>0&&{resources:u}}}catch(r){return E({source:"agent:skills",level:"error",message:`Failed to load skill from ${e}.`,detail:r}),null}}o(Yt,"loadFullSkill");async function pe(e,t=e){let n=[];try{let r=await Is(e,{withFileTypes:!0});r.sort((i,s)=>i.name.localeCompare(s.name));for(let i of r){let s=V(e,i.name);if(i.isDirectory()){n.push(...await pe(s,t));continue}i.isFile()&&n.push({name:i.name,path:s,relativePath:Es(t,s).replace(/\\/g,"/")})}}catch{}return n}o(pe,"loadSkillFiles");async function Ps(e){if(e.content)return e.content;let t=await Xt(e.path,"utf-8");return e.content=t,t}o(Ps,"loadSkillFileContent");import{createHash as cu}from"node:crypto";import{lstat as Oo,readFile as lu,readdir as du,realpath as uu,stat as fu}from"fs/promises";import{join as ae,dirname as Zn,relative as pu,resolve as Dt,sep as er}from"path";var As="KODAX_LEARNING_DEFAULT_CONFIDENCE",Ts="KODAX_LEARNING_CONFIDENCE_FLOOR";function Nr(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(Nr,"readConfidenceEnv");function $s(){return Nr(As,.5)}o($s,"defaultConfidence");function Ls(){return Nr(Ts,.3)}o(Ls,"activeSuggestionConfidenceFloor");function Qt(e,t){return{destination:"discard",proposalId:e,reason:t}}o(Qt,"discard");function Cs(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??$s()}}o(Cs,"skillProposal");function Zt(e){if(!e.completedTurn)return Qt(e.proposalId,"procedural learning requires a completed turn");let t=e.candidate;if("confidence"in t&&typeof t.confidence=="number"&&t.confidence<Ls())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 Cs(e);case"workflow_handoff":return t.workflowStatus!=="completed"?Qt(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}:Qt(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(Zt,"triageProceduralLearning");var Rs=new Set(["builtin","plugin","learned","external"]),Ns=new Set(["archive","quarantine","delete","consolidate"]);function Dr(e){return e==="background_learning"}o(Dr,"canMarkCreatedByAgent");function en(e){return e.action==="record_usage"?{allowed:!0,mode:"telemetry",reason:"usage telemetry is best-effort and source-independent"}:e.pinned&&Ns.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"}:Rs.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"}:Dr(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(en,"decideSkillGovernance");import{copyFile as Ds,lstat as tn,mkdir as ot,realpath as nn,rename as Os,rm as js,writeFile as jr}from"fs/promises";import{basename as Fs,dirname as rn,isAbsolute as Fr,join as me,relative as Ms,resolve as st}from"path";var Mr=64*1024,Kr=256*1024,Ks=new Set(["references","templates","scripts","assets"]);async function Us(e){try{return{root:await nn(e.skillRoot),existed:!0}}catch(t){if(t.code!=="ENOENT"||e.createSkillRoot!==!0)throw t;return{root:st(e.skillRoot),existed:!1}}}o(Us,"resolveSkillRootForValidation");function Ur(e,t){let n=Ms(e,t);return n===""||!n.startsWith("..")&&!Fr(n)}o(Ur,"isInside");function $e(e){return typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT"}o($e,"isMissingFile");function Bs(e){return e.replace(/[^a-zA-Z0-9._-]/g,"_").slice(0,96)||"proposal"}o(Bs,"sanitizeProposalId");async function Ws(e){try{return await nn(e)}catch(t){if(!$e(t))throw t;return st(e)}}o(Ws,"resolveSnapshotSkillRoot");async function at(e){let t=await Ws(e.skillRoot);return{snapshotBase:st(e.snapshotRoot??me(rn(t),".kodax-learning-snapshots")),proposalPrefix:`${Bs(e.proposalId)}-`}}o(at,"resolveSkillSnapshotLocation");function zs(e){if(e.includes("\0"))throw new Error("skill proposal path contains a null byte");if(Fr(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(zs,"normalizeRelativePath");function Hs(e,t){if(t==="SKILL.md")return;let[n,r]=t.split("/");if(!n||!Ks.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(Hs,"assertSupportedPath");function Js(e,t){if(e.kind!=="write")return;if(Buffer.byteLength(e.content,"utf8")>(t==="SKILL.md"?Mr:Kr))throw new Error(`skill proposal file is too large: ${t}`)}o(Js,"assertContentSize");async function qs(e,t){let n;try{n=await tn(t)}catch(r){if($e(r)&&e.kind==="delete")throw new Error(`skill proposal delete target does not exist: ${e.relativePath}`);if(!$e(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(qs,"assertExistingTargetSafe");async function Gs(e,t){let n=t.split("/").slice(0,-1),r=e;for(let i of n){r=me(r,i);let s;try{s=await tn(r)}catch(a){if(!$e(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(Gs,"assertExistingAncestorsSafe");async function Or(e){if(e.changes.length===0)throw new Error("skill proposal must contain at least one change");let t=await Us(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=zs(i.relativePath);Hs(i,s),Js(i,s);let a=st(n,...s.split("/"));if(!Ur(n,a))throw new Error("skill proposal path resolves outside skill root");t.existed&&(await Gs(n,s),await qs(i,a)),r.push({change:i,absolutePath:a,normalizedRelativePath:s})}return{root:n,rootExisted:t.existed,changes:r}}o(Or,"validateSkillMutationPlan");async function Xs(e,t,n){let r=await at({proposalId:e.proposalId,skillRoot:t,...e.snapshotRoot!==void 0?{snapshotRoot:e.snapshotRoot}:{}}),i=me(r.snapshotBase,`${r.proposalPrefix}${Date.now().toString(36)}`);await ot(i,{recursive:!0});for(let s of n){try{await tn(s.absolutePath)}catch(c){if(!$e(c))throw c;continue}let a=me(i,s.normalizedRelativePath);await ot(rn(a),{recursive:!0}),await Ds(s.absolutePath,a)}return await jr(me(i,"manifest.json"),`${JSON.stringify({proposalId:e.proposalId,createdAt:new Date().toISOString(),changedPaths:n.map(s=>s.normalizedRelativePath)},null,2)}
12
- `,"utf8"),i}o(Xs,"createSnapshot");async function Vs(e,t,n,r){let i=rn(t);await ot(i,{recursive:!0});let s=await nn(i);if(!Ur(e,s))throw new Error("skill proposal parent directory resolves outside skill root");let a=me(i,`.${Fs(t)}.kodax-${process.pid}-${Date.now().toString(36)}-${r}.tmp`);try{await jr(a,n,"utf8"),await Os(a,t)}catch(c){throw await js(a,{force:!0}),c}}o(Vs,"atomicWriteFile");async function Ys(e,t){for(let[n,r]of t.entries()){if(r.change.kind==="write"){await Vs(e,r.absolutePath,r.change.content,n);continue}throw new Error("skill proposal delete is outside the F224 learning loop")}}o(Ys,"applyValidatedChanges");async function Br(e){let t=await Or(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 ot(e.skillRoot,{recursive:!0});let r=await Or(e),i=await Xs(e,r.root,r.changes);return await Ys(r.root,r.changes),{proposalId:e.proposalId,validated:!0,applied:!0,changedPaths:r.changes.map(s=>s.normalizedRelativePath),...i!==void 0?{snapshotPath:i}:{}}}o(Br,"applySkillMutationProposal");import{mkdir as $i,readFile as tc,rename as nc,rm as rc,writeFile as ic}from"fs/promises";import{basename as oc,dirname as Li,join as Ci}from"path";import{mkdirSync as Qs}from"node:fs";import{homedir as on}from"node:os";import{isAbsolute as Zs,normalize as ea,resolve as sn,sep as Wr}from"node:path";import{join as ct}from"node:path";var ta=".kodax",na="KODAX_HOME",an;function cm(e){an=e}o(cm,"setAgentConfigHome");function lt(){if(an)return an;let e=process.env[na];return e&&e.length>0?e:ct(on(),ta)}o(lt,"getAgentConfigHome");function D(...e){return ct(lt(),...e)}o(D,"getAgentConfigPath");function lm(e,t){let n=o(a=>{let c=ea(sn(a));return process.platform==="win32"?c.toLowerCase():c},"comparable"),r=n(e),i=n(t),s=i.endsWith(Wr)?i:`${i}${Wr}`;return r===i||r.startsWith(s)}o(lm,"isPathInsideDirectory");function dm(e,t){let n=e==="~"?on():e.startsWith("~/")||e.startsWith("~\\")?ct(on(),e.slice(2)):e;return Zs(n)?sn(n):sn(t,n)}o(dm,"resolveExecutionPath");function um(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=ct(lt(),"apps",e);return Qs(t,{recursive:!0}),t}o(um,"getAppDataDir");import{createHash as ha}from"node:crypto";import{execSync as ga}from"node:child_process";import{execFile as ra,execFileSync as ia}from"node:child_process";import{accessSync as oa,constants as Hr,promises as cn,realpathSync as sa,statSync as aa}from"node:fs";import{posix as zr}from"node:path";import{debuglog as ca}from"node:util";var Jr="/usr/bin/git",qr="/usr/bin/xcode-select",la=5e3,Le=new Map,ln=new Map,da=ca("kodax:macos-git");function Gr(e){let t=e.env??process.env;return JSON.stringify([e.cwd??process.cwd(),t.PATH,t.DEVELOPER_DIR])}o(Gr,"probeKey");function Xr(e){let t=Le.get(e);if(t&&t.expiresAt>Date.now())return t.missing;Le.delete(e)}o(Xr,"cachedResult");function Vr(e,t){t!==void 0&&(Le.size>=32&&Le.clear(),Le.set(e,{missing:t,expiresAt:Date.now()+la}))}o(Vr,"rememberResult");function Yr(e){let t=e.executable??"git",n=e.cwd??process.cwd();return t.includes("/")?[zr.resolve(n,t)]:((e.env??process.env).PATH??"/usr/bin:/bin").split(":").map(r=>zr.resolve(n,r,t))}o(Yr,"candidates");async function ua(e){for(let t of Yr(e)){try{if(await cn.access(t,Hr.X_OK),!(await cn.stat(t)).isFile())continue}catch{continue}return await cn.realpath(t).catch(()=>{})===Jr}return!1}o(ua,"selectsSystemGit");function fa(e){for(let t of Yr(e)){try{if(oa(t,Hr.X_OK),!aa(t).isFile())continue}catch{continue}try{return sa(t)===Jr}catch{return!1}}return!1}o(fa,"selectsSystemGitSync");function dn(){da("Could not determine macOS developer tools availability; retaining normal Git execution.")}o(dn,"reportProbeFailure");function un(){throw Object.assign(new Error("macOS command line developer tools are unavailable. Install them to use system Git."),{code:"MACOS_GIT_TOOLS_MISSING"})}o(un,"rejectMissingTools");async function ym(e={}){if(process.platform!=="darwin"||!await ua(e))return;let t=Gr(e),n=Xr(t);if(n===void 0){let r=ln.get(t);r||(r=pa(e).then(i=>(Vr(t,i),i)).finally(()=>{ln.delete(t)}),ln.set(t,r)),n=await r}n&&un()}o(ym,"assertNoGitInstallPrompt");function pa(e){return new Promise(t=>{ra(qr,["-p"],{cwd:e.cwd,env:e.env??process.env,timeout:1e3,encoding:"utf8",windowsHide:!0},n=>{n&&n.code!==2?(dn(),t(void 0)):t(n?.code===2)})}).catch(()=>{dn()})}o(pa,"probeAsync");function Qr(e={}){if(process.platform!=="darwin"||!fa(e))return;let t=Gr(e),n=Xr(t);if(n!==void 0){n&&un();return}let r=!1;try{ia(qr,["-p"],{cwd:e.cwd,env:e.env??process.env,timeout:1e3,encoding:"utf8",windowsHide:!0,stdio:["ignore","pipe","ignore"]})}catch(i){r=i.status===2?!0:void 0,r===void 0&&dn()}Vr(t,r),r&&un()}o(Qr,"assertNoGitInstallPromptSync");import*as C from"node:path";import{createHash as Zr}from"node:crypto";var ei=["tenantId","workspaceId","userId","agentId","projectId","sessionId"];function ma(e,t){return ei.every(n=>t[n]===void 0||t[n]===e[n])}o(ma,"matchesMemoryApplicability");function dt(e,t){if(t.length===0)throw new Error(`${e} identity must not be empty`);return Zr("sha256").update(`${e}\0${t}`).digest("hex")}o(dt,"hashMemoryIdentityComponent");function bm(e){let t=ei.filter(n=>e[n]!==void 0).map(n=>`${n}=${e[n]}`).join("\0");return Zr("sha256").update(t).digest("hex")}o(bm,"memoryApplicabilityFingerprint");function Ce(e){return wa(e).trim().replace(/^ssh:\/\//,"").replace(/^https?:\/\//,"").replace(/^git@/,"").replace(/\.git$/,"").replace(/[:@/\\]+/g,"-").replace(/^-+|-+$/g,"").toLowerCase()}o(Ce,"sanitizeProjectKey");function wa(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(wa,"remoteWithoutCredentials");function Re(e){let t=C.resolve(e).toLowerCase();return ha("sha256").update(t).digest("hex").slice(0,16)}o(Re,"hashCwd");function Ne(e){try{Qr({cwd:e});let n=ga("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(Ne,"tryGitRemote");function ya(e){let t=Ne(e),n=t?Ce(t):`local-${Re(e)}`;return D("projects",n,"memory")}o(ya,"resolveMemoryRoot");function $m(e){return C.join(ya(e),"MEMORY.md")}o($m,"resolveMemoryEntrypoint");function Lm(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",dt("tenant",e.tenantId),t,dt(t,r)];return e.configHome===void 0?D(...i):C.join(e.configHome,...i)}o(Lm,"resolveScopedMemoryRoot");function Cm(e){let t=fn(e),n=fn(D("memory-scopes"));if(t.startsWith(n+C.sep)){let a=t.slice(n.length+1).split(C.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=fn(D("projects"));if(!t.startsWith(r+C.sep))return!1;let s=t.slice(r.length+1).split(C.sep);return s.length>=3&&s[1]==="memory"}o(Cm,"isAutoManagedMemoryFile");function fn(e){let t=C.resolve(e);return process.platform==="win32"?t.toLowerCase():t}o(fn,"comparablePath");function Rm(e){let t=C.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(Rm,"parseMemoryTypeFromFilename");import{randomUUID as Oa}from"node:crypto";import{mkdir as hi,open as gi,readFile as Z,readdir as bn,rm as ja,stat as yt,utimes as Fa,writeFile as wi}from"node:fs/promises";import{dirname as Ma,join as vn}from"node:path";import{spawnSync as ie}from"node:child_process";import{readFileSync as ka}from"node:fs";function he(e,t,n,r){let i=t.error?.code;E({source:"runtime:windows",level:r?"debug":"warn",message:"Windows process probe completed.",detail:{stage:e,cached:!1,available:r,durationMs:Date.now()-n,timeoutMs:5e3,exitCode:t.status,errorCode:i===void 0?void 0:["ENOENT","EACCES","EPERM","ETIMEDOUT","ENOEXEC","ENOMEM","EIO"].includes(i)?i:"OTHER"}})}o(he,"reportWindowsProbe");var va=300,pn=2e3,z=5e3,Sa=String.raw`
11
+ ---`,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=$r.parse(i)??{}}catch{a=$r.parse(_s(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(Lr,"parseYamlFrontmatter");function Cr(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(Cr,"normalizeAllowedToolsString");function xs(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(xs,"normalizeYamlHookEntry");function Is(e){if(e==null)return;let n=(Array.isArray(e)?e:[e]).map(r=>xs(r)).filter(r=>r!==void 0);return n.length>0?n:void 0}o(Is,"normalizeYamlHookEntryList");function Rr(e){if(!e||typeof e!="object"||Array.isArray(e))return;let t=e,n={};for(let r of bs){let i=Is(t[r]);i&&(n[r]=i)}return Object.keys(n).length>0?n:void 0}o(Rr,"normalizeYamlHookMap");function Vt(e){let[t,n]=Lr(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:Cr(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:Rr(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(Vt,"parseSkillMarkdown");async function it(e,t){let n=V(e,"SKILL.md");try{let r=await Xt(n,"utf-8"),{frontmatter:i}=Vt(r);return{name:i.name,description:i.description,userInvocable:!0,argumentHint:i.argumentHint,path:e,source:t,disableModelInvocation:i.disableModelInvocation??!1}}catch(r){return E({source:"agent:skills",level:"error",message:`Failed to load skill metadata from ${e}.`,detail:r}),null}}o(it,"loadSkillMetadata");async function Yt(e,t){let n=V(e,"SKILL.md");try{let r=await Xt(n,"utf-8"),{frontmatter:i,body:s}=Vt(r),[a,c,l,d,u]=await Promise.all([me(V(e,"scripts")),me(V(e,"references")),me(V(e,"assets")),me(V(e,"templates")),me(V(e,"resources"))]);return{...i,userInvocable:!0,path:e,skillFilePath:n,content:s,rawContent:s,loaded:!0,source:t,...a.length>0&&{scripts:a},...c.length>0&&{references:c},...l.length>0&&{assets:l},...d.length>0&&{templates:d},...u.length>0&&{resources:u}}}catch(r){return E({source:"agent:skills",level:"error",message:`Failed to load skill from ${e}.`,detail:r}),null}}o(Yt,"loadFullSkill");async function me(e,t=e){let n=[];try{let r=await Es(e,{withFileTypes:!0});r.sort((i,s)=>i.name.localeCompare(s.name));for(let i of r){let s=V(e,i.name);if(i.isDirectory()){n.push(...await me(s,t));continue}i.isFile()&&n.push({name:i.name,path:s,relativePath:Ps(t,s).replace(/\\/g,"/")})}}catch{}return n}o(me,"loadSkillFiles");async function As(e){if(e.content)return e.content;let t=await Xt(e.path,"utf-8");return e.content=t,t}o(As,"loadSkillFileContent");import{createHash as lu}from"node:crypto";import{lstat as jo,readFile as du,readdir as uu,realpath as fu,stat as pu}from"fs/promises";import{join as ce,dirname as Zn,relative as mu,resolve as Dt,sep as er}from"path";var Ts="KODAX_LEARNING_DEFAULT_CONFIDENCE",$s="KODAX_LEARNING_CONFIDENCE_FLOOR";function Nr(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(Nr,"readConfidenceEnv");function Ls(){return Nr(Ts,.5)}o(Ls,"defaultConfidence");function Cs(){return Nr($s,.3)}o(Cs,"activeSuggestionConfidenceFloor");function Qt(e,t){return{destination:"discard",proposalId:e,reason:t}}o(Qt,"discard");function Rs(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??Ls()}}o(Rs,"skillProposal");function Zt(e){if(!e.completedTurn)return Qt(e.proposalId,"procedural learning requires a completed turn");let t=e.candidate;if("confidence"in t&&typeof t.confidence=="number"&&t.confidence<Cs())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 Rs(e);case"workflow_handoff":return t.workflowStatus!=="completed"?Qt(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}:Qt(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(Zt,"triageProceduralLearning");var Ns=new Set(["builtin","plugin","learned","external"]),Ds=new Set(["archive","quarantine","delete","consolidate"]);function Dr(e){return e==="background_learning"}o(Dr,"canMarkCreatedByAgent");function en(e){return e.action==="record_usage"?{allowed:!0,mode:"telemetry",reason:"usage telemetry is best-effort and source-independent"}:e.pinned&&Ds.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"}:Ns.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"}:Dr(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(en,"decideSkillGovernance");import{copyFile as Os,lstat as tn,mkdir as ot,realpath as nn,rename as js,rm as Fs,writeFile as jr}from"fs/promises";import{basename as Ms,dirname as rn,isAbsolute as Fr,join as he,relative as Ks,resolve as st}from"path";var Mr=64*1024,Kr=256*1024,Us=new Set(["references","templates","scripts","assets"]);async function Bs(e){try{return{root:await nn(e.skillRoot),existed:!0}}catch(t){if(t.code!=="ENOENT"||e.createSkillRoot!==!0)throw t;return{root:st(e.skillRoot),existed:!1}}}o(Bs,"resolveSkillRootForValidation");function Ur(e,t){let n=Ks(e,t);return n===""||!n.startsWith("..")&&!Fr(n)}o(Ur,"isInside");function $e(e){return typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT"}o($e,"isMissingFile");function Ws(e){return e.replace(/[^a-zA-Z0-9._-]/g,"_").slice(0,96)||"proposal"}o(Ws,"sanitizeProposalId");async function zs(e){try{return await nn(e)}catch(t){if(!$e(t))throw t;return st(e)}}o(zs,"resolveSnapshotSkillRoot");async function at(e){let t=await zs(e.skillRoot);return{snapshotBase:st(e.snapshotRoot??he(rn(t),".kodax-learning-snapshots")),proposalPrefix:`${Ws(e.proposalId)}-`}}o(at,"resolveSkillSnapshotLocation");function Hs(e){if(e.includes("\0"))throw new Error("skill proposal path contains a null byte");if(Fr(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(Hs,"normalizeRelativePath");function Js(e,t){if(t==="SKILL.md")return;let[n,r]=t.split("/");if(!n||!Us.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(Js,"assertSupportedPath");function qs(e,t){if(e.kind!=="write")return;if(Buffer.byteLength(e.content,"utf8")>(t==="SKILL.md"?Mr:Kr))throw new Error(`skill proposal file is too large: ${t}`)}o(qs,"assertContentSize");async function Gs(e,t){let n;try{n=await tn(t)}catch(r){if($e(r)&&e.kind==="delete")throw new Error(`skill proposal delete target does not exist: ${e.relativePath}`);if(!$e(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(Gs,"assertExistingTargetSafe");async function Xs(e,t){let n=t.split("/").slice(0,-1),r=e;for(let i of n){r=he(r,i);let s;try{s=await tn(r)}catch(a){if(!$e(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(Xs,"assertExistingAncestorsSafe");async function Or(e){if(e.changes.length===0)throw new Error("skill proposal must contain at least one change");let t=await Bs(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=Hs(i.relativePath);Js(i,s),qs(i,s);let a=st(n,...s.split("/"));if(!Ur(n,a))throw new Error("skill proposal path resolves outside skill root");t.existed&&(await Xs(n,s),await Gs(i,a)),r.push({change:i,absolutePath:a,normalizedRelativePath:s})}return{root:n,rootExisted:t.existed,changes:r}}o(Or,"validateSkillMutationPlan");async function Vs(e,t,n){let r=await at({proposalId:e.proposalId,skillRoot:t,...e.snapshotRoot!==void 0?{snapshotRoot:e.snapshotRoot}:{}}),i=he(r.snapshotBase,`${r.proposalPrefix}${Date.now().toString(36)}`);await ot(i,{recursive:!0});for(let s of n){try{await tn(s.absolutePath)}catch(c){if(!$e(c))throw c;continue}let a=he(i,s.normalizedRelativePath);await ot(rn(a),{recursive:!0}),await Os(s.absolutePath,a)}return await jr(he(i,"manifest.json"),`${JSON.stringify({proposalId:e.proposalId,createdAt:new Date().toISOString(),changedPaths:n.map(s=>s.normalizedRelativePath)},null,2)}
12
+ `,"utf8"),i}o(Vs,"createSnapshot");async function Ys(e,t,n,r){let i=rn(t);await ot(i,{recursive:!0});let s=await nn(i);if(!Ur(e,s))throw new Error("skill proposal parent directory resolves outside skill root");let a=he(i,`.${Ms(t)}.kodax-${process.pid}-${Date.now().toString(36)}-${r}.tmp`);try{await jr(a,n,"utf8"),await js(a,t)}catch(c){throw await Fs(a,{force:!0}),c}}o(Ys,"atomicWriteFile");async function Qs(e,t){for(let[n,r]of t.entries()){if(r.change.kind==="write"){await Ys(e,r.absolutePath,r.change.content,n);continue}throw new Error("skill proposal delete is outside the F224 learning loop")}}o(Qs,"applyValidatedChanges");async function Br(e){let t=await Or(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 ot(e.skillRoot,{recursive:!0});let r=await Or(e),i=await Vs(e,r.root,r.changes);return await Qs(r.root,r.changes),{proposalId:e.proposalId,validated:!0,applied:!0,changedPaths:r.changes.map(s=>s.normalizedRelativePath),...i!==void 0?{snapshotPath:i}:{}}}o(Br,"applySkillMutationProposal");import{mkdir as Li,readFile as nc,rename as rc,rm as ic,writeFile as oc}from"fs/promises";import{basename as sc,dirname as Ci,join as Ri}from"path";import{mkdirSync as Zs}from"node:fs";import{homedir as on}from"node:os";import{isAbsolute as ea,normalize as ta,resolve as sn,sep as Wr}from"node:path";import{join as ct}from"node:path";var na=".kodax",ra="KODAX_HOME",an;function lm(e){an=e}o(lm,"setAgentConfigHome");function lt(){if(an)return an;let e=process.env[ra];return e&&e.length>0?e:ct(on(),na)}o(lt,"getAgentConfigHome");function D(...e){return ct(lt(),...e)}o(D,"getAgentConfigPath");function dm(e,t){let n=o(a=>{let c=ta(sn(a));return process.platform==="win32"?c.toLowerCase():c},"comparable"),r=n(e),i=n(t),s=i.endsWith(Wr)?i:`${i}${Wr}`;return r===i||r.startsWith(s)}o(dm,"isPathInsideDirectory");function um(e,t){let n=e==="~"?on():e.startsWith("~/")||e.startsWith("~\\")?ct(on(),e.slice(2)):e;return ea(n)?sn(n):sn(t,n)}o(um,"resolveExecutionPath");function fm(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=ct(lt(),"apps",e);return Zs(t,{recursive:!0}),t}o(fm,"getAppDataDir");import{createHash as ga}from"node:crypto";import{execSync as wa}from"node:child_process";import{execFile as ia,execFileSync as oa}from"node:child_process";import{accessSync as sa,constants as Hr,promises as cn,realpathSync as aa,statSync as ca}from"node:fs";import{posix as zr}from"node:path";import{debuglog as la}from"node:util";var Jr="/usr/bin/git",qr="/usr/bin/xcode-select",da=5e3,Le=new Map,ln=new Map,ua=la("kodax:macos-git");function Gr(e){let t=e.env??process.env;return JSON.stringify([e.cwd??process.cwd(),t.PATH,t.DEVELOPER_DIR])}o(Gr,"probeKey");function Xr(e){let t=Le.get(e);if(t&&t.expiresAt>Date.now())return t.missing;Le.delete(e)}o(Xr,"cachedResult");function Vr(e,t){t!==void 0&&(Le.size>=32&&Le.clear(),Le.set(e,{missing:t,expiresAt:Date.now()+da}))}o(Vr,"rememberResult");function Yr(e){let t=e.executable??"git",n=e.cwd??process.cwd();return t.includes("/")?[zr.resolve(n,t)]:((e.env??process.env).PATH??"/usr/bin:/bin").split(":").map(r=>zr.resolve(n,r,t))}o(Yr,"candidates");async function fa(e){for(let t of Yr(e)){try{if(await cn.access(t,Hr.X_OK),!(await cn.stat(t)).isFile())continue}catch{continue}return await cn.realpath(t).catch(()=>{})===Jr}return!1}o(fa,"selectsSystemGit");function pa(e){for(let t of Yr(e)){try{if(sa(t,Hr.X_OK),!ca(t).isFile())continue}catch{continue}try{return aa(t)===Jr}catch{return!1}}return!1}o(pa,"selectsSystemGitSync");function dn(){ua("Could not determine macOS developer tools availability; retaining normal Git execution.")}o(dn,"reportProbeFailure");function un(){throw Object.assign(new Error("macOS command line developer tools are unavailable. Install them to use system Git."),{code:"MACOS_GIT_TOOLS_MISSING"})}o(un,"rejectMissingTools");async function km(e={}){if(process.platform!=="darwin"||!await fa(e))return;let t=Gr(e),n=Xr(t);if(n===void 0){let r=ln.get(t);r||(r=ma(e).then(i=>(Vr(t,i),i)).finally(()=>{ln.delete(t)}),ln.set(t,r)),n=await r}n&&un()}o(km,"assertNoGitInstallPrompt");function ma(e){return new Promise(t=>{ia(qr,["-p"],{cwd:e.cwd,env:e.env??process.env,timeout:1e3,encoding:"utf8",windowsHide:!0},n=>{n&&n.code!==2?(dn(),t(void 0)):t(n?.code===2)})}).catch(()=>{dn()})}o(ma,"probeAsync");function Qr(e={}){if(process.platform!=="darwin"||!pa(e))return;let t=Gr(e),n=Xr(t);if(n!==void 0){n&&un();return}let r=!1;try{oa(qr,["-p"],{cwd:e.cwd,env:e.env??process.env,timeout:1e3,encoding:"utf8",windowsHide:!0,stdio:["ignore","pipe","ignore"]})}catch(i){r=i.status===2?!0:void 0,r===void 0&&dn()}Vr(t,r),r&&un()}o(Qr,"assertNoGitInstallPromptSync");import*as C from"node:path";import{createHash as Zr}from"node:crypto";var ei=["tenantId","workspaceId","userId","agentId","projectId","sessionId"];function ha(e,t){return ei.every(n=>t[n]===void 0||t[n]===e[n])}o(ha,"matchesMemoryApplicability");function dt(e,t){if(t.length===0)throw new Error(`${e} identity must not be empty`);return Zr("sha256").update(`${e}\0${t}`).digest("hex")}o(dt,"hashMemoryIdentityComponent");function _m(e){let t=ei.filter(n=>e[n]!==void 0).map(n=>`${n}=${e[n]}`).join("\0");return Zr("sha256").update(t).digest("hex")}o(_m,"memoryApplicabilityFingerprint");function Ce(e){return ya(e).trim().replace(/^ssh:\/\//,"").replace(/^https?:\/\//,"").replace(/^git@/,"").replace(/\.git$/,"").replace(/[:@/\\]+/g,"-").replace(/^-+|-+$/g,"").toLowerCase()}o(Ce,"sanitizeProjectKey");function ya(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(ya,"remoteWithoutCredentials");function Re(e){let t=C.resolve(e).toLowerCase();return ga("sha256").update(t).digest("hex").slice(0,16)}o(Re,"hashCwd");function Ne(e){try{Qr({cwd:e});let n=wa("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(Ne,"tryGitRemote");function ka(e){let t=Ne(e),n=t?Ce(t):`local-${Re(e)}`;return D("projects",n,"memory")}o(ka,"resolveMemoryRoot");function Lm(e){return C.join(ka(e),"MEMORY.md")}o(Lm,"resolveMemoryEntrypoint");function Cm(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",dt("tenant",e.tenantId),t,dt(t,r)];return e.configHome===void 0?D(...i):C.join(e.configHome,...i)}o(Cm,"resolveScopedMemoryRoot");function Rm(e){let t=fn(e),n=fn(D("memory-scopes"));if(t.startsWith(n+C.sep)){let a=t.slice(n.length+1).split(C.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=fn(D("projects"));if(!t.startsWith(r+C.sep))return!1;let s=t.slice(r.length+1).split(C.sep);return s.length>=3&&s[1]==="memory"}o(Rm,"isAutoManagedMemoryFile");function fn(e){let t=C.resolve(e);return process.platform==="win32"?t.toLowerCase():t}o(fn,"comparablePath");function Nm(e){let t=C.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(Nm,"parseMemoryTypeFromFilename");import{randomUUID as ja}from"node:crypto";import{mkdir as gi,open as wi,readFile as Z,readdir as bn,rm as Fa,stat as yt,utimes as Ma,writeFile as yi}from"node:fs/promises";import{dirname as Ka,join as vn}from"node:path";import{execFile as va,spawnSync as ie}from"node:child_process";import{readFileSync as Sa}from"node:fs";function oe(e,t,n,r){let i=t.error?.code;E({source:"runtime:windows",level:r?"debug":"warn",message:"Windows process probe completed.",detail:{stage:e,cached:!1,available:r,durationMs:Date.now()-n,timeoutMs:5e3,exitCode:t.status,errorCode:i===void 0?void 0:["ENOENT","EACCES","EPERM","ETIMEDOUT","ENOEXEC","ENOMEM","EIO"].includes(i)?i:"OTHER"}})}o(oe,"reportWindowsProbe");var ba=300,pn=2e3,z=5e3,ri=String.raw`
13
13
  using System;
14
14
  using System.Runtime.InteropServices;
15
15
  public static class KodaXWindowsJobMembership {
16
+ [StructLayout(LayoutKind.Sequential)]
17
+ private struct BasicAccountingInformation {
18
+ public long TotalUserTime;
19
+ public long TotalKernelTime;
20
+ public long ThisPeriodTotalUserTime;
21
+ public long ThisPeriodTotalKernelTime;
22
+ public uint TotalPageFaultCount;
23
+ public uint TotalProcesses;
24
+ public uint ActiveProcesses;
25
+ public uint TotalTerminatedProcesses;
26
+ }
16
27
  [StructLayout(LayoutKind.Sequential)]
17
28
  private struct BasicLimitInformation {
18
29
  public long PerProcessUserTimeLimit;
@@ -54,6 +65,13 @@ public static class KodaXWindowsJobMembership {
54
65
  out ExtendedLimitInformation information,
55
66
  uint informationLength,
56
67
  IntPtr returnLength);
68
+ [DllImport("kernel32.dll", SetLastError = true)]
69
+ private static extern bool QueryInformationJobObject(
70
+ IntPtr job,
71
+ int informationClass,
72
+ out BasicAccountingInformation information,
73
+ uint informationLength,
74
+ IntPtr returnLength);
57
75
  [DllImport("kernel32.dll")]
58
76
  private static extern IntPtr GetCurrentProcess();
59
77
  [DllImport("kernel32.dll")]
@@ -76,7 +94,17 @@ public static class KodaXWindowsJobMembership {
76
94
  CloseHandle(job);
77
95
  }
78
96
  }
79
- }`,ba=String.raw`
97
+ public static long ActiveProcessCount(string name) {
98
+ var job = OpenJobObjectW(4, false, name);
99
+ if (job == IntPtr.Zero) return Marshal.GetLastWin32Error() == 2 ? 0 : -1;
100
+ try {
101
+ BasicAccountingInformation accounting;
102
+ if (!QueryInformationJobObject(job, 1, out accounting,
103
+ (uint)Marshal.SizeOf(typeof(BasicAccountingInformation)), IntPtr.Zero)) return -1;
104
+ return accounting.ActiveProcesses;
105
+ } finally { CloseHandle(job); }
106
+ }
107
+ }`,_a=String.raw`
80
108
  $ErrorActionPreference = 'Stop'
81
109
  $source = [Text.Encoding]::UTF8.GetString([Convert]::FromBase64String($env:KODAX_INTERNAL_JOB_QUERY_SOURCE))
82
110
  Add-Type -TypeDefinition $source
@@ -84,7 +112,7 @@ if ([KodaXWindowsJobMembership]::IsCurrentProcessContained($env:KODAX_DAEMON_JOB
84
112
  [Console]::Out.WriteLine('1')
85
113
  } else {
86
114
  [Console]::Out.Write('0')
87
- }`,ri=String.raw`
115
+ }`,ii=String.raw`
88
116
  using System;
89
117
  using System.Runtime.InteropServices;
90
118
  using System.Text;
@@ -171,38 +199,43 @@ public static class KodaXNativeProcessSnapshot {
171
199
  CloseHandle(snapshot);
172
200
  }
173
201
  }
174
- }`,A=Object.freeze({status:"terminated"}),re=Object.freeze({status:"already-exited"}),g=Object.freeze({status:"unknown"});function W(e){return e.exitCode!==null||e.signalCode!==null}o(W,"isChildProcessExited");function ut(e,t){return W(e)?Promise.resolve(!0):new Promise(n=>{let r=!1,i=o(c=>{r||(r=!0,clearTimeout(a),e.off("exit",s),e.off("error",s),n(c))},"finish"),s=o(()=>i(!0),"onExit"),a=setTimeout(()=>i(!1),t);a.unref?.(),e.once("exit",s),e.once("error",s)})}o(ut,"waitForChildProcessExit");function ge(e,t){let n=!1;try{process.kill(-e,t),n=!0}catch{}try{process.kill(e,t),n=!0}catch{}return n}o(ge,"signalPosixPidTree");function mn(e){try{return process.kill(e,0),!0}catch(t){return t.code!=="ESRCH"}}o(mn,"signalTargetExists");function ft(e){return mn(-e)||mn(e)}o(ft,"isPosixPidTreeAlive");async function pt(e,t){let n=Date.now()+t;for(;Date.now()<n;){if(!ft(e))return!0;await new Promise(r=>setTimeout(r,50))}return!ft(e)}o(pt,"waitForPosixPidTreeExit");function _a(e){let t=e.trim();if(!t)return[];try{let n=JSON.parse(t);return(Array.isArray(n)?n:[n]).flatMap(i=>{if(typeof i!="object"||i===null)return[];let s=i,a=Number(s.pid),c=Number(s.parentPid),l=typeof s.creationTime=="string"?s.creationTime:String(s.creationTime??"0");return!Number.isFinite(a)||a<=0||!Number.isFinite(c)?[]:[{pid:a,parentPid:c,creationTime:/^\d+$/.test(l)?l:"0"}]})}catch{return[]}}o(_a,"parseWindowsProcessSnapshotJson");function xa(e){let t=/^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})\.(\d{6})([+-])(\d{3})$/.exec(e);if(!t)return;let[,n,r,i,s,a,c,l,d,u]=t,f=Date.UTC(Number(n),Number(r)-1,Number(i),Number(s),Number(a),Number(c),Number(l.slice(0,3))),m=Number(u)*6e4*(d==="+"?1:-1),h=f-m;if(Number.isFinite(h))return{identity:(BigInt(h)+11644473600000n).toString(),unixMs:h}}o(xa,"parseWmicCreationTime");function Ia(){let e=["$cutoff = [DateTime]::UtcNow","$items = try { @(Get-CimInstance Win32_Process -ErrorAction Stop) } catch { @(Get-WmiObject Win32_Process -ErrorAction Stop) }","$rows = @($items | ForEach-Object {"," $creationTime = '0'"," try {"," $created = $_.CreationDate"," if ($created -isnot [DateTime]) { $created = [System.Management.ManagementDateTimeConverter]::ToDateTime([string]$created) }"," $created = $created.ToUniversalTime()"," if ($created -le $cutoff) { $creationTime = ([long][Math]::Floor($created.ToFileTimeUtc() / 10000)).ToString() }"," } catch {}"," [PSCustomObject]@{ pid = [int]$_.ProcessId; parentPid = [int]$_.ParentProcessId; creationTime = $creationTime }","})","$rows | ConvertTo-Json -Compress"].join(`
175
- `),t=Date.now(),n=ie("powershell.exe",["-NoProfile","-NonInteractive","-Command",e],{encoding:"utf8",timeout:z,windowsHide:!0});if(!n.error&&n.status===0){let a=_a(n.stdout);if(a.length>0)return a}he("process-snapshot-cim",n,t,!1);let r=Date.now(),i=ie("wmic",["process","get","CreationDate,ParentProcessId,ProcessId","/format:list"],{encoding:"utf8",timeout:z,windowsHide:!0});if(i.error||i.status!==0){he("process-snapshot-wmic",i,r,!1);return}let s=i.stdout.split(/\r?\n\s*\r?\n/).flatMap(a=>{let c=new Map(a.split(/\r?\n/).flatMap(m=>{let h=m.indexOf("=");return h<0?[]:[[m.slice(0,h),m.slice(h+1)]]})),l=Number(c.get("ProcessId")),d=Number(c.get("ParentProcessId")),u=c.get("CreationDate"),f=u===void 0?void 0:xa(u);return!Number.isFinite(l)||l<=0||!Number.isFinite(d)||f===void 0||f.unixMs>r?[]:[{pid:l,parentPid:d,creationTime:f.identity}]});return s.length>0?s:void 0}o(Ia,"readWindowsProcessSnapshotFallback");function Ea(){let e=["$source = @'",ri,"'@","Add-Type -TypeDefinition $source","[KodaXNativeProcessSnapshot]::ReadRows()"].join(`
176
- `),t=Date.now(),n=ie("powershell.exe",["-NoProfile","-NonInteractive","-Command",e],{encoding:"utf8",timeout:z,windowsHide:!0});if(n.error||n.status!==0){he("process-snapshot-native",n,t,!1);return}let r=ii(n.stdout);return r===void 0&&he("process-snapshot-native",n,t,!1),r}o(Ea,"readWindowsProcessSnapshotNative");function ii(e){let t=e.split(/\r?\n/).map(r=>r.trim()).filter(Boolean);if(t.some(r=>!/^\d+,\d+,\d+$/.test(r)))return;let n=t.flatMap(r=>{let[i,s,a="0"]=r.split(",",3),c=Number(i),l=Number(s);return!Number.isFinite(c)||c<=0||!Number.isFinite(l)?[]:[{pid:c,parentPid:l,creationTime:a}]});return n.length>0?n:void 0}o(ii,"parseWindowsNativeProcessRows");function ti(){return Ea()??Ia()}o(ti,"readWindowsProcessSnapshotUncached");var hn,gn=!1,De=0;function Q(){return De<=0?ti():(gn||(hn=ti(),gn=!0),hn)}o(Q,"readWindowsProcessSnapshot");function oi(){hn=void 0,gn=!1}o(oi,"invalidateSharedWindowsProcessSnapshot");async function Km(e){De+=1;try{return await e()}finally{De-=1,De===0&&oi()}}o(Km,"withSharedWindowsProcessSnapshot");function si(e){return[`foreach ($processId in @(${e.join(",")})) {`,' $target = $null; $creationTime = "0"'," try {"," $target = [System.Diagnostics.Process]::GetProcessById($processId)"," [long]$remainder = 0"," $creationTime = ([Math]::DivRem($target.StartTime.ToFileTimeUtc(), [long]10000, [ref]$remainder)).ToString([System.Globalization.CultureInfo]::InvariantCulture)",' } catch { $creationTime = "0" } finally { if ($null -ne $target) { $target.Dispose() } }',' [Console]::Out.WriteLine("$processId,$creationTime")',"}"].join(`
177
- `)}o(si,"windowsProcessStartIdentitiesScript");function ai(e,t){let n=e.trim().split(/\r?\n/);if(!(n.length!==t.length||n.some((r,i)=>!r.startsWith(`${t[i]},`)||!/^\d+,\d+$/.test(r))))return new Map(n.map(r=>{let[i,s]=r.split(",");return[Number(i),s]}))}o(ai,"parseWindowsProcessStartIdentities");function Pa(e){let t=Date.now(),n=ie("powershell.exe",["-NoProfile","-NonInteractive","-Command",si(e)],{encoding:"utf8",timeout:z,windowsHide:!0}),r=ai(n.stdout??"",e);if(n.error||n.status!==0||r===void 0){he("process-start-identities",n,t,!1);return}return r}o(Pa,"readWindowsProcessStartIdentities");function Aa(e){let t=[...new Set(e.filter(r=>Number.isInteger(r)&&r>0))];if(process.platform!=="win32")return new Map(t.map(r=>[r,mt(r)]));if(t.length===0)return new Map;let n=(De<=0?Pa(t):void 0)??new Map(Q()?.map(r=>[r.pid,r.creationTime]));return new Map(t.map(r=>{let i=n.get(r);return[r,i==="0"?void 0:i]}))}o(Aa,"readProcessStartIdentities");function mt(e){if(!Number.isInteger(e)||e<=0)return;if(process.platform==="win32"){let r=Aa([e]).get(e);return r===void 0&&E({source:"runtime:windows",level:"warn",message:"Windows process start identity is unavailable.",detail:{stage:"process-start-identity",pid:e,available:!1}}),r}if(process.platform==="linux")try{let r=ka(`/proc/${e}/stat`,"utf8"),i=r.slice(r.lastIndexOf(")")+2).trim().split(/\s+/);return i[19]===void 0?void 0:`linux:${i[19]}`}catch{return}let t=ie("ps",["-o","lstart=","-p",String(e)],{encoding:"utf8",timeout:z,windowsHide:!0}),n=t.status===0?t.stdout.trim():"";return n===""?void 0:`${process.platform}:${n}`}o(mt,"readProcessStartIdentity");var Y;function Um(){return process.platform!=="win32"?!1:Y!==void 0?(E({source:"runtime:windows",level:"debug",message:"Using cached Windows Job probe result.",detail:{stage:"job-membership",cached:!0,available:Y}}),Y):(Ta(),Y===!0)}o(Um,"isCurrentProcessWindowsJobContained");function Ta(){if(process.platform!=="win32")return;let e=Number.parseInt(process.env.KODAX_DAEMON_JOB_SUPERVISOR_PID??"",10);if(process.env.KODAX_DAEMON_JOB_CONTAINED!=="1"||!process.env.KODAX_DAEMON_JOB_NAME||!Number.isSafeInteger(e)||e<=0){Y=!1,E({source:"runtime:windows",level:"warn",message:"Windows Job supervisor metadata is unavailable.",detail:{stage:"job-membership",cached:!1,available:!1,reason:"supervisor-metadata"}});return}let t=Date.now(),n=ie("powershell.exe",["-NoProfile","-NonInteractive","-Command",ba+`
178
- `+si([process.pid,e])],{encoding:"utf8",timeout:5e3,windowsHide:!0,env:{...process.env,KODAX_INTERNAL_JOB_QUERY_SOURCE:Buffer.from(Sa,"utf8").toString("base64")}}),r=n.stdout?.trim().split(/\r?\n/)??[];if(Y=n.status===0&&r[0]==="1",he("job-membership",n,t,Y),!Y)return;let i=ai(r.slice(1).join(`
179
- `),[process.pid,e]),s=i?.get(process.pid),a=i?.get(e);return{processStartIdentity:s==="0"?void 0:s,supervisorProcessStartIdentity:a==="0"?void 0:a}}o(Ta,"readCurrentProcessWindowsJobIdentity");function ci(e,t,n){let r=new Map;for(let c of e)r.set(c.parentPid,[...r.get(c.parentPid)??[],c]);let i=[],s=[{pid:t,...n===void 0?{}:{creationTime:n},ancestryVerified:n!==void 0&&n!=="0"}],a=new Set([t]);for(;s.length>0;){let c=s.shift();if(c===void 0)break;for(let l of r.get(c.pid)??[]){if(a.has(l.pid)||!$a(l.creationTime,c.creationTime))continue;a.add(l.pid);let d=c.ancestryVerified&&l.creationTime!=="0";i.push(d?l:{...l,creationTime:"0"}),s.push({pid:l.pid,creationTime:l.creationTime,ancestryVerified:d})}}return i}o(ci,"collectDescendantIdentities");function $a(e,t){if(e==="0"||t===void 0||t==="0")return!0;try{return BigInt(e)>=BigInt(t)}catch{return!1}}o($a,"windowsCreationAtLeast");function La(e,t=Q()){if(t===void 0)return;let n=new Set(t.filter(i=>i.creationTime==="0").map(i=>i.pid));if(e.some(i=>n.has(i.pid)))return;let r=new Set(t.filter(i=>i.creationTime!=="0").map(i=>`${i.pid}:${i.creationTime}`));return new Set(e.filter(i=>i.creationTime!=="0").filter(i=>r.has(`${i.pid}:${i.creationTime}`)).map(i=>i.pid))}o(La,"currentCapturedWindowsPids");function we(e,t=Q()){if(t===void 0)return;let n=La([e.root,...e.descendants],t);if(n!==void 0){if(n.size>0)return!1;if(e.completeTree)return e.uncertainDescendantPids.every(r=>!t.some(i=>i.pid===r))?!0:void 0}}o(we,"capturedWindowsProcessesGone");function Ca(e){return[e.root.pid,...e.descendants.map(t=>t.pid),...e.uncertainDescendantPids].some(mn)}o(Ca,"capturedWindowsPidMayBeAlive");async function ni(e,t){let n=Date.now()+t;for(;Date.now()<n;){if(!Ca(e))return we(e)===!0;await new Promise(r=>setTimeout(r,50))}return we(e)===!0}o(ni,"waitForCapturedWindowsProcessesExit");var li="KODAX_TERMINATION_COMPLETED",di="KODAX_SNAPSHOT_COMPLETED";function Ra(e,t){let n=e.trim().split(/\r?\n/),r=n.indexOf(li),i=n.indexOf(di);return{terminationAttempted:t||r>=0,snapshot:t&&r>=0&&i>r?ii(n.slice(r+1,i).join(`
180
- `)):void 0}}o(Ra,"readWindowsTerminationResult");function wn(e,t,n=!1){let r=[...e].reverse().flatMap(c=>/^\d+$/.test(c.creationTime)?[`[KodaXNativeProcessSnapshot]::TerminateExact(${c.pid}, [UInt64]${c.creationTime}) | Out-Null`]:[]);if(r.length===0)return{terminationAttempted:!1};let i=["$source = @'",ri,"'@","Add-Type -TypeDefinition $source",...r,...n?[`[Console]::Out.WriteLine('${li}')`,"[Console]::Out.Flush()","[Console]::Out.Write([KodaXNativeProcessSnapshot]::ReadRows())",`[Console]::Out.WriteLine('${di}')`,"[Console]::Out.Flush()"]:[]].join(`
181
- `),s=ie("powershell.exe",["-NoProfile","-NonInteractive","-Command",i],{encoding:"utf8",timeout:t,windowsHide:!0}),a=Ra(s.stdout??"",!s.error&&s.status===0);return a.terminationAttempted&&oi(),a}o(wn,"terminateCapturedWindowsProcesses");function Oe(e,t){if(e==null)return t;if(t===void 0)return e;if(e.root.pid!==t.root.pid||e.root.creationTime!==t.root.creationTime)return t;let n=new Map;for(let r of[...t.descendants,...e.descendants])n.set(`${r.pid}:${r.creationTime}`,r);return{root:e.root,descendants:[...n.values()],uncertainDescendantPids:[...new Set([...t.uncertainDescendantPids,...e.uncertainDescendantPids])],completeTree:e.completeTree||t.completeTree}}o(Oe,"mergeWindowsProcessTreeCaptures");var j=new WeakMap,je=new WeakMap;function Bm(e,t,n){let r={verified:!1,terminate:n};je.set(e,r),t.then(()=>{r.verified=!0},()=>{})}o(Bm,"trackChildProcessTreeContainment");function Wm(e){return je.get(e)?.verified===!0}o(Wm,"isChildProcessTreeCleanupVerified");function zm(e){return je.has(e)}o(zm,"hasChildProcessTreeContainment");function Hm(e){if(je.has(e)||process.platform!=="win32"||e.pid===void 0)return;let t=j.get(e);if(t!==void 0&&!W(e)){let i=ui(e.pid,t.root.creationTime);return i!=null&&j.set(e,Oe(i,t)??t),t.root.creationTime}let n=Q();if(t!==void 0&&W(e)){if(n===void 0)return t.root.creationTime;let i=n.find(a=>a.pid===e.pid);if(i!==void 0&&i.creationTime!==t.root.creationTime)return t.root.creationTime;let s=ci(n,t.root.pid,t.root.creationTime);return j.set(e,Oe({root:t.root,descendants:s.filter(a=>a.creationTime!=="0"),uncertainDescendantPids:s.filter(a=>a.creationTime==="0").map(a=>a.pid),completeTree:t.completeTree},t)??t),t.root.creationTime}let r=n?.find(i=>i.pid===e.pid&&i.creationTime!=="0");if(r===void 0&&n!==void 0&&!W(e)&&(r=Q()?.find(i=>i.pid===e.pid&&i.creationTime!=="0")),!(r===void 0||W(e)))return j.set(e,{root:r,descendants:[],uncertainDescendantPids:[],completeTree:!1}),r.creationTime}o(Hm,"rememberChildProcessTree");function Jm(e){if(process.platform!=="win32")return;let t=j.get(e);if(t!==void 0)return[...[t.root,...t.descendants].map(n=>({pid:n.pid,creationTime:n.creationTime})),...t.uncertainDescendantPids.map(n=>({pid:n,creationTime:"0"}))]}o(Jm,"rememberedChildProcessTreeIdentities");function qm(e){return j.get(e)?.completeTree===!0}o(qm,"rememberedChildProcessTreeIsComplete");function ui(e,t){return kn(e,t,Q())}o(ui,"captureWindowsProcessTree");function kn(e,t,n){if(n===void 0)return;let r=n.find(s=>s.pid===e);if(r===void 0||r.creationTime==="0"||r.creationTime!==t)return null;let i=ci(n,e,r.creationTime);return{root:r,descendants:i.filter(s=>s.creationTime!=="0"),uncertainDescendantPids:i.filter(s=>s.creationTime==="0").map(s=>s.pid),completeTree:!0}}o(kn,"captureWindowsProcessTreeInSnapshot");async function yn(e,t,n,r){if(r!==void 0&&we(e,r)===!0)return re;let i=[e.root,...e.descendants],s=wn(i,t,e.completeTree);return e.completeTree?s.snapshot!==void 0&&we(e,s.snapshot)===!0||await ni(e,n)?A:s.terminationAttempted?(wn(i,t),await ni(e,n)?A:g):g:g}o(yn,"killCapturedWindowsTree");function Na(e,t,n,r){let i=n?.find(s=>s.pid===e);if(!(i?.creationTime!==t||n===void 0))return{root:{...i,parentPid:0},descendants:n.filter(s=>s.pid!==e&&s.creationTime!=="0").map(s=>({...s,parentPid:0})),uncertainDescendantPids:n.filter(s=>s.pid!==e&&s.creationTime==="0").map(s=>s.pid),completeTree:r}}o(Na,"retainedWindowsProcessTree");async function Gm(e,t={}){if(process.platform==="win32"){let r=t.taskkillMs??z,i=t.forceMs??pn,s=t.expectedProcessStartIdentity;if(s===void 0)return g;let a=Na(e,s,t.expectedProcessTreeIdentities,t.expectedProcessTreeComplete===!0),c=Q(),l=kn(e,s,c),d=Oe(l,a);return d===void 0||d===null?g:yn(d,r,i,c)}if(t.expectedProcessStartIdentity!==void 0)return ft(e)?g:re;let n=t.forceMs??pn;return ge(e,"SIGTERM")?await pt(e,n)?A:(ge(e,"SIGKILL"),await pt(e,n)?A:g):re}o(Gm,"killPidTree");function Da(e){return process.platform==="win32"?g:(ge(e,"SIGTERM"),ge(e,"SIGKILL"),ft(e)?g:A)}o(Da,"killPidTreeSync");async function Xm(e,t={}){let n=je.get(e);if(n!==void 0){if(n.verified)return re;try{return await n.terminate(),n.verified?A:g}catch(u){return E({source:"runtime:windows",level:"warn",message:"Windows managed process Job cleanup is unconfirmed.",detail:u}),g}}let r=t.gracefulMs??va,i=t.forceMs??pn,s=process.platform==="win32"?j.get(e):void 0,a=process.platform==="win32"&&e.pid!==void 0&&s!==void 0?Q():void 0,c=process.platform==="win32"&&e.pid!==void 0&&s!==void 0?kn(e.pid,s.root.creationTime,a):void 0,l=Oe(c,s);l!==void 0&&j.set(e,l);let d;if(t.gracefulStdinEnd&&!W(e)&&e.stdin?.writable){try{e.stdin.end()}catch{}if(await ut(e,r)&&process.platform!=="win32")return A}if(e.pid!==void 0&&process.platform!=="win32")return ge(e.pid,"SIGTERM")?await pt(e.pid,i)?A:(ge(e.pid,"SIGKILL"),await pt(e.pid,i)?A:g):re;if(W(e))return process.platform!=="win32"||e.pid===void 0?re:l===void 0||!l.completeTree&&l.descendants.length===0?g:yn(l,t.taskkillMs??z,i,a);if(process.platform==="win32"&&e.pid!==void 0)return l===void 0?g:(d=await yn(l,t.taskkillMs??z,i,a),await ut(e,i)?d.status==="unknown"?g:A:g);try{e.kill("SIGTERM")}catch{return W(e)&&d?.status!=="unknown"?A:g}if(await ut(e,i))return d?.status==="unknown"?g:A;try{e.kill("SIGKILL")}catch{}return await ut(e,i)?d?.status==="unknown"?g:A:g}o(Xm,"killChildProcessTree");function Vm(e){if(e.pid===void 0)return W(e)?re:g;if(process.platform==="win32"){let t=j.get(e);if(t===void 0)return g;let n=ui(e.pid,t.root.creationTime),r=Oe(n,t)??t;j.set(e,r);let i=wn([r.root,...r.descendants],z,r.completeTree);return r.completeTree&&(i.snapshot!==void 0&&we(r,i.snapshot)===!0||we(r)===!0)?A:g}return Da(e.pid)}o(Vm,"killChildProcessTreeSync");var yi=5e3,Fe=10,ki=3e4,Ka=16,ht=8,fi,pi=!1;function Ua(){return pi||(fi=mt(process.pid),pi=!0),fi}o(Ua,"getCurrentProcessStartIdentity");var gt=class extends Error{static{o(this,"KodaXFileLockTimeoutError")}lockPath;code="kodax_file_lock_timeout";constructor(t){super(`KodaX file lock timed out: ${t}`),this.lockPath=t,this.name="KodaXFileLockTimeoutError"}};async function Ke(e,t,n=yi){let r=await Ba(e,n);try{return await t()}finally{await r()}}o(Ke,"withLearningFileLock");async function Ba(e,t=yi,n={}){await hi(Ma(e),{recursive:!0});let r=await vi(e,t,n.requireKnownOwner===!0),i=!1,s=!1,a;return async()=>{if(!s){if(a!==void 0)return a;a=(async()=>{i||(await r.handle.close(),i=!0),await wt(e,r.token),s=!0})();try{await a}finally{s||(a=void 0)}}}}o(Ba,"acquireLearningFileLock");async function rh(e,t={}){let n=await xi(e,t.requireKnownOwner===!0);if(n===void 0||t.requireKnownOwner&&ye(n.raw)===void 0)return!1;let r;try{r=await vi(e,0,t.requireKnownOwner===!0,n.abandonedOwner)}catch(i){if(i instanceof gt)return!1;throw i}return await r.handle.close(),await wt(e,r.token),!0}o(rh,"reclaimStaleLearningFileLock");async function vi(e,t,n,r){let i=Date.now()+t,s=await Wa(e,r),a,c=!1;try{for(await za(s,i,e,r);;){await Si(s);try{let l=await Va(e,s.token);try{await _n(s)}catch(d){let u=[d];try{await l.handle.close()}catch(f){u.push(f)}try{await wt(e,l.token)}catch(f){u.push(f)}throw u.length===1?d:new AggregateError(u,"learning lock ticket loss cleanup failed")}return a=l,a}catch(l){let d=await Qa(l,e);if(d==="retry_missing"){if(c)throw l;c=!0,await Me(Fe);continue}if(d==="not_contended")throw l;c=!1;let u=await xi(e,n,r);if(u!==void 0&&(!n||ye(u.raw)!==void 0)&&await Ya(e,u))continue;if(Date.now()>=i)throw Ti(e);await Me(Fe)}}}finally{try{await Ii(s.path,s.raw)}catch(l){if(a===void 0)throw l;let d=[l];try{await a.handle.close()}catch(u){d.push(u)}try{await wt(e,a.token)}catch(u){d.push(u)}throw d.length===1?l:new AggregateError(d,"learning lock acquisition cleanup failed")}}}o(vi,"acquireLock");async function Wa(e,t){let n=`${e}.queue`,r=Oa(),i=Pi(r),s=vn(n,`choosing-${r}.lock`);await hi(n,{recursive:!0}),await mi(s,i);try{await _i(n,e,s,t),await bi(s,i,"choosing entry");let a=await Ha(n),c=Math.max(0,...a.map(u=>u.number))+1;if(!Number.isSafeInteger(c))throw new Error("learning lock ticket overflow");let l=`ticket-${String(c).padStart(Ka,"0")}-${r}.lock`,d=vn(n,l);return await mi(d,i),{queuePath:n,path:d,name:l,raw:i,token:r}}finally{await Ii(s,i)}}o(Wa,"createLockTicket");async function za(e,t,n,r){for(;;){await Si(e),await _i(e.queuePath,n,e.path,r),await _n(e);let i=await bn(e.queuePath),s=i.some(c=>c.startsWith("choosing-")),a=i.map(kt).filter(c=>c!==void 0).sort(Ja)[0];if(!s&&a?.name===e.name)return;if(Date.now()>=t)throw Ti(n);await Me(Fe)}}o(za,"waitForTicketTurn");async function mi(e,t){let n=await gi(e,"wx");try{try{await n.writeFile(t,"utf8")}finally{await n.close()}}catch(r){throw await ke(e),r}}o(mi,"createOwnerFile");async function _n(e){await bi(e.path,e.raw,"ticket")}o(_n,"assertTicketOwned");async function Si(e){await _n(e);try{let t=new Date;await Fa(e.path,t,t)}catch(t){throw x(t,"ENOENT")?new Error(`learning store lock ticket lost: ${e.path}`):t}}o(Si,"heartbeatLockTicket");async function bi(e,t,n){try{if(await Z(e,"utf8")!==t)throw new Error(`learning store lock ${n} lost: ${e}`)}catch(r){throw x(r,"ENOENT")?new Error(`learning store lock ${n} lost: ${e}`):r}}o(bi,"assertQueueEntryOwned");async function Ha(e){return(await bn(e)).map(kt).filter(t=>t!==void 0)}o(Ha,"listQueueTickets");function kt(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(kt,"parseQueueTicket");function Ja(e,t){return e.number-t.number||e.name.localeCompare(t.name)}o(Ja,"compareQueueTickets");async function _i(e,t,n,r){let i=await bn(e);await Promise.all(i.filter(qa).map(async s=>{let a=vn(e,s);a!==n&&await Ga(a,s,t,r)&&await ke(a)}))}o(_i,"cleanupAbandonedQueueEntries");function qa(e){return/^choosing-[0-9a-f-]+\.lock$/i.test(e)||kt(e)!==void 0}o(qa,"isQueueEntryName");async function Ga(e,t,n,r){try{let i=await yt(e),s=ye(await Z(e,"utf8"));return s?.released===!0||s!==void 0&&!xn(s.pid)||s!==void 0&&Ai(s,r)?!0:Date.now()-i.mtimeMs<=ki?!1:s===void 0||!Sn(s)?!0:s.token===void 0?!1:kt(t)===void 0?!0:!await Xa(n,s.token)}catch(i){if(x(i,"ENOENT")||["EPERM","EACCES","EBUSY"].some(s=>x(i,s)))return!1;throw i}}o(Ga,"isAbandonedQueueEntry");async function Xa(e,t){try{return ye(await Z(e,"utf8"))?.token===t}catch(n){if(x(n,"ENOENT"))return!1;if(["EPERM","EACCES","EBUSY"].some(r=>x(n,r)))return!0;throw n}}o(Xa,"queueTicketOwnsCoordinatorLock");async function Va(e,t){let n=await gi(e,"wx");try{return await n.writeFile(Pi(t),"utf8"),{handle:n,token:t}}catch(r){throw await n.close(),await ke(e),r}}o(Va,"createLock");async function xi(e,t=!1,n){try{let r=await yt(e),i=await Z(e,"utf8"),s=ye(i),a=s?.token!==void 0&&await ec(e,s.token),c=s!==void 0&&(!xn(s.pid)||Ai(s,n)||t&&!!s.processStartIdentity&&!Sn(s));return!a&&!c&&Date.now()-r.mtimeMs<=ki?void 0:a||c||s===void 0||!Sn(s)?{raw:i,mtimeMs:r.mtimeMs,size:r.size,...c&&s?{abandonedOwner:s}:{}}:void 0}catch(r){if(["ENOENT","EPERM","EACCES","EBUSY"].some(i=>x(r,i)))return;throw r}}o(xi,"observeStaleLock");async function Ya(e,t){try{let n=await yt(e);return n.mtimeMs!==t.mtimeMs||n.size!==t.size||await Z(e,"utf8")!==t.raw?!1:(await ke(e),!0)}catch(n){if(x(n,"ENOENT"))return!0;if(["EPERM","EACCES","EBUSY"].some(r=>x(n,r)))return!1;throw n}}o(Ya,"removeObservedStaleLock");async function Qa(e,t){if(x(e,"EEXIST"))return"contended";if(!["EPERM","EACCES","EBUSY"].some(n=>x(e,n)))return"not_contended";try{return(await yt(t)).isFile()?"contended":"not_contended"}catch(n){if(x(n,"ENOENT"))return"retry_missing";throw e}}o(Qa,"classifyExistingLockContention");async function wt(e,t){try{if(ye(await Z(e,"utf8"))?.token!==t)return;try{await ke(e);return}catch(r){try{await Za(e,t);return}catch(i){throw new AggregateError([r,i],"learning lock release marker and owner cleanup both failed")}}}catch(n){if(!x(n,"ENOENT"))throw n}}o(wt,"releaseLock");async function Za(e,t){for(let n=1;n<=ht;n+=1)try{await wi(Ei(e,t),`${t}
182
- `,"utf8");return}catch(r){if(!In(r)||n===ht)throw r;await Me(Fe)}}o(Za,"writeReleaseMarkerWithTransientRetry");async function Ii(e,t){let n;try{if(await Z(e,"utf8")!==t)throw new Error(`learning store lock queue entry lost: ${e}`);await wi(e,`${t.trimEnd()} released
183
- `,"utf8")}catch(r){if(x(r,"ENOENT"))return;n=r}try{await ke(e)}catch(r){if(n===void 0&&In(r))return;throw n===void 0?r:new AggregateError([n,r],"learning lock queue marker and cleanup both failed")}}o(Ii,"releaseQueueEntry");async function ec(e,t){try{return(await Z(Ei(e,t),"utf8")).trim()===t}catch(n){if(["ENOENT","EPERM","EACCES","EBUSY"].some(r=>x(n,r)))return!1;throw n}}o(ec,"hasReleaseMarker");function Ei(e,t){return`${e}.${t}.released`}o(Ei,"releaseMarkerPath");function Pi(e){let t=Ua(),n=t===void 0?"":` identity=${Buffer.from(t).toString("base64url")}`;return`${process.pid} ${e}${n}
184
- `}o(Pi,"lockOwnerRecord");function ye(e){let t=e.trim().split(/\s+/),n=Number(t.shift());if(!Number.isSafeInteger(n)||n<=0)return;let r,i,s=!1;for(let a of t){if(/^[0-9a-f-]+$/i.test(a)&&r===void 0){r=a;continue}if(a.startsWith("identity=")&&i===void 0){let c=a.slice(9);if(!/^[A-Za-z0-9_-]+$/.test(c)||(i=Buffer.from(c,"base64url").toString("utf8"),!i))return;continue}if(a==="released"&&!s){s=!0;continue}return}return{pid:n,...r===void 0?{}:{token:r},...i===void 0?{}:{processStartIdentity:i},released:s}}o(ye,"parseOwner");function xn(e){try{return process.kill(e,0),!0}catch(t){return!x(t,"ESRCH")}}o(xn,"isProcessAlive");function x(e,t){return typeof e=="object"&&e!==null&&"code"in e&&e.code===t}o(x,"isFileError");function Sn(e){if(!xn(e.pid))return!1;if(e.processStartIdentity===void 0)return!0;let t=mt(e.pid);return t===void 0||t===e.processStartIdentity}o(Sn,"isRecordedOwnerAlive");function Ai(e,t){return!!e.processStartIdentity&&e.pid===t?.pid&&e.processStartIdentity===t.processStartIdentity}o(Ai,"matchesAbandonedOwner");function In(e){return["EPERM","EACCES","EBUSY"].some(t=>x(e,t))}o(In,"isTransientFileContention");async function ke(e){for(let t=1;t<=ht;t+=1)try{await ja(e,{force:!0});return}catch(n){if(x(n,"ENOENT"))return;if(!In(n)||t===ht)throw n;await Me(Fe)}}o(ke,"removeFileWithTransientRetry");function Ti(e){return new gt(e)}o(Ti,"lockTimeout");async function Me(e){await new Promise(t=>setTimeout(t,e))}o(Me,"delay");var Ri=1;function F(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}o(F,"isRecord");function sc(e){return e==="pending"||e==="approved"||e==="rejected"}o(sc,"isReviewStatus");function Ni(e){return e==="foreground_user"||e==="assistant_tool"||e==="background_learning"}o(Ni,"isSkillWriteOrigin");function R(e){return Array.isArray(e)&&e.every(t=>typeof t=="string")}o(R,"isStringArray");function vt(e){return F(e)&&Object.values(e).every(t=>typeof t=="string")}o(vt,"isStringRecord");function ac(e){return e==="record_usage"||e==="create"||e==="patch"||e==="archive"||e==="quarantine"||e==="delete"||e==="consolidate"||e==="direct_mutation"}o(ac,"isSkillGovernanceAction");function cc(e){return e==="save_from_run"||e==="revise_capsule"||e==="add_skill_reference"||e==="report_only"}o(cc,"isWorkflowSuggestedAction");function Di(e){return e==="low"||e==="medium"||e==="high"}o(Di,"isLearningRisk");function lc(e){return e==="user"||e==="feedback"||e==="project"||e==="reference"||e==="semantic_memory"}o(lc,"isMemoryKind");function dc(e){return e==="foreground_user"||e==="assistant_tool"||e==="background_learning"||e==="external_provider"}o(dc,"isMemoryWriteOrigin");function uc(e){return e==="primary"||e==="subagent"||e==="workflow_child"||e==="cron"||e==="flush"||e==="compression"}o(uc,"isMemoryExecutionContext");function fc(e){return F(e)&&R(e.workflowCapsules)&&R(e.savedWorkflows)&&R(e.constructedAgents)&&R(e.promptReferences)&&(e.action==="none"||e.action==="rewrite_proposal"||e.action==="block_until_manual_review")}o(fc,"isConsumerImpact");function pc(e){return F(e)&&dc(e.writeOrigin)&&uc(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")&&R(e.sourceRefs)&&typeof e.completedTurn=="boolean"&&(e.claimKind===void 0||mc(e.claimKind))&&(e.claimKey===void 0||typeof e.claimKey=="string")&&(e.actionSignature===void 0||typeof e.actionSignature=="string")&&(e.reviewRationale===void 0||typeof e.reviewRationale=="string")&&(e.reviewRisk===void 0||Di(e.reviewRisk))&&(e.persistenceKind===void 0||e.persistenceKind==="create"||e.persistenceKind==="evidence_update"||e.persistenceKind==="condition_refinement"||e.persistenceKind==="conflict")&&(e.targetRefId===void 0||typeof e.targetRefId=="string")&&(e.targetStorageUri===void 0||typeof e.targetStorageUri=="string")&&(e.authorizationTargetFingerprint===void 0||typeof e.authorizationTargetFingerprint=="string")&&(e.preconditions===void 0||typeof e.preconditions=="string")&&(e.applicability===void 0||hc(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(pc,"isMemoryMetadata");function mc(e){return e==="fact"||e==="policy"||e==="preference"||e==="procedure"||e==="episode"}o(mc,"isMemoryClaimKind");function hc(e){return!F(e)||typeof e.tenantId!="string"?!1:["workspaceId","userId","agentId","projectId","sessionId"].every(t=>e[t]===void 0||typeof e[t]=="string")}o(hc,"isMemoryApplicability");function gc(e){if(!F(e))return!1;let t=e.destination;return typeof e.proposalId!="string"||!Ni(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"&&R(e.sourceTraceIds)&&typeof e.confidence=="number":t==="workflow_handoff"?e.userLabel==="runnable_workflow"&&R(e.evidenceRunIds)&&R(e.sourceTraceIds)&&cc(e.suggestedAction)&&typeof e.whyWorkflowNotSkill=="string"&&R(e.requiredWorkflowEvidence)&&Di(e.risk)&&fc(e.consumerImpact)&&e.appliedByF224===!1:t==="memdir_handoff"?e.userLabel==="context_note"&&lc(e.memoryKind)&&typeof e.body=="string"&&pc(e.metadata):t==="reasoning_handoff"?e.userLabel==="reasoning_report"&&typeof e.title=="string"&&typeof e.body=="string"&&R(e.sourceTraceIds):!1}o(gc,"isReviewableProposal");function wc(e){return F(e)?e.kind==="write"?typeof e.relativePath=="string"&&typeof e.content=="string":e.kind==="delete"?typeof e.relativePath=="string":!1:!1}o(wc,"isSkillMutationChange");function yc(e){if(!F(e)||e.kind!=="skill"||typeof e.skillRoot!="string"||e.skillRoot.length===0||!Array.isArray(e.changes)||!e.changes.every(wc))return!1;let t=e.governance;return!(!F(t)||!ac(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"||!Ni(t.origin)||t.pinned!==void 0&&typeof t.pinned!="boolean"||e.snapshotRoot!==void 0&&typeof e.snapshotRoot!="string")}o(yc,"isStoredLearningApplyPlan");function kc(e,t,n){if(!F(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,l=e.updatedAt,d=e.appliedAt,u=e.appliedChangedPaths,f=e.appliedSnapshotPath,m=e.approvedBy,h=e.approvedAt,w=e.approvalPolicyId,y=e.approvalPolicyReason,I=e.approvalExpectedFingerprints,b=e.approvalResultingFingerprints,ne=e.rejectedReason;if(typeof r!="string"||r.length===0){n.push(`proposal entry ${t} has no proposalId`);return}if(!sc(i)){n.push(`proposal entry ${r} has invalid status`);return}if(!gc(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 l!="string"){n.push(`proposal entry ${r} has invalid timestamps`);return}if(a!==void 0&&!yc(a)){n.push(`proposal entry ${r} has invalid apply plan`);return}if(d!==void 0&&typeof d!="string"){n.push(`proposal entry ${r} has invalid appliedAt`);return}if(u!==void 0&&!R(u)){n.push(`proposal entry ${r} has invalid applied changed paths`);return}if(m!==void 0&&m!=="user"&&m!=="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(w!==void 0&&typeof w!="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(I!==void 0&&!vt(I)){n.push(`proposal entry ${r} has invalid approvalExpectedFingerprints`);return}if(b!==void 0&&!vt(b)){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:l,...typeof d=="string"?{appliedAt:d}:{},...R(u)?{appliedChangedPaths:u}:{},...m==="user"||m==="host"?{approvedBy:m}:{},...typeof h=="string"?{approvedAt:h}:{},...typeof w=="string"?{approvalPolicyId:w}:{},...typeof y=="string"?{approvalPolicyReason:y}:{},...vt(I)?{approvalExpectedFingerprints:I}:{},...vt(b)?{approvalResultingFingerprints:b}:{},...typeof f=="string"?{appliedSnapshotPath:f}:{},...typeof ne=="string"?{rejectedReason:ne}:{}}}o(kc,"parseStoredProposal");function vc(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(!F(t))return{proposals:[],warnings:["learning proposal store root is not an object"]};if(t.version!==Ri)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)=>kc(s,a,n)).filter(s=>s!==void 0),warnings:n}}o(vc,"parseStoreDocument");async function Oi(e,t){let n={version:Ri,proposals:t},r=Li(e);await $i(r,{recursive:!0});let i=Ci(r,`.${oc(e)}.kodax-${process.pid}-${Date.now().toString(36)}.tmp`);try{await ic(i,`${JSON.stringify(n,null,2)}
185
- `,"utf8"),await nc(i,e)}catch(s){throw await rc(i,{force:!0}),s}}o(Oi,"writeStoreDocument");async function H(e){let t;try{t=await tc(e,"utf8")}catch(n){if(n.code==="ENOENT")return{proposals:[],warnings:[]};throw n}return vc(t)}o(H,"readLearningProposalStore");async function En(e,t,n={}){return ji(e,async()=>{await n.revalidateAuthority?.();let r=await H(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(d=>d.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},l=a?r.proposals.map(d=>d.proposalId===t.proposalId?c:d):[...r.proposals,c];return await n.revalidateAuthority?.(),await Oi(e,l),c})}o(En,"upsertLearningProposal");function Sc(e,t){let n=Ne(e),r=n?Ce(n):`local-${Re(e)}`;return t===void 0?D("projects",r,"learning","proposals.json"):Ci(t,"projects",r,"learning","proposals.json")}o(Sc,"resolveLearningProposalStore");async function Ue(e,t,n,r={}){return ji(e,async()=>{await r.revalidateAuthority?.();let i=await H(e);if(i.warnings.length>0)throw new Error(`refusing to write corrupt learning proposal store: ${i.warnings.join("; ")}`);let s=i.proposals.find(l=>l.proposalId===t);if(!s)throw new Error(`learning proposal not found: ${t}`);if(r.expectedStatus!==void 0&&s.status!==r.expectedStatus)throw new Error(`learning proposal ${t} is ${s.status}; expected ${r.expectedStatus}`);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 Oi(e,i.proposals.map(l=>l.proposalId===t?c:l)),c})}o(Ue,"updateLearningProposalStatus");async function ji(e,t){return await $i(Li(e),{recursive:!0}),Ke(`${e}.lock`,t)}o(ji,"withStoreWriteLock");function bc(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(bc,"ensureSkillProposal");function _c(e,t){let n=t==="skill_create"?"create":"patch";if(e.governance.action!==n)throw new Error(`skill ${t} requires governance action ${n}`)}o(_c,"ensureGovernanceMatchesProposal");function xc(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(xc,"ensureCreatePlanIncludesSkillFile");async function Pn(e){let t=bc(e);_c(e,t),xc(e);let n=en(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 Br({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(Pn,"applySkillLearningProposal");import{readdir as Ic,readFile as Ec,stat as Pc}from"fs/promises";import{isAbsolute as Mi,join as Ki,relative as Ac,resolve as Fi}from"path";function Ui(e){return typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT"}o(Ui,"isMissingFile");function Bi(e){if(e.includes("\0")||Mi(e))return;let n=e.replace(/\\/g,"/").split("/");if(!(n.length===0||n.some(r=>r.length===0||r==="."||r==="..")))return n.join("/")}o(Bi,"normalizePlanRelativePath");function Tc(e,t){let n=Ac(e,t);return n===""||!n.startsWith("..")&&!Mi(n)}o(Tc,"isInside");function Wi(e,t){let n=Bi(t);if(n===void 0)return;let r=Fi(e),i=Fi(r,...n.split("/"));if(Tc(r,i))return{absolutePath:i,normalizedRelativePath:n}}o(Wi,"resolvePlanTarget");async function Tn(e){try{return{exists:!0,content:await Ec(e,"utf8")}}catch(t){if(Ui(t))return{exists:!1};throw t}}o(Tn,"readUtf8IfExists");function $c(e){let t=e.applyPlan;return t?.kind!=="skill"?[]:t.changes.map(n=>Bi(n.relativePath)??n.relativePath)}o($c,"plannedSkillChangedPaths");async function Lc(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=Wi(t.skillRoot,n.relativePath);if(r===void 0)return!1;let i=await Tn(r.absolutePath);if(!i.exists||i.content!==n.content)return!1}return!0}o(Lc,"skillFilesAlreadyMatchPlan");async function zi(e){let t=e.applyPlan;if(t?.kind!=="skill")return;let n=await at({proposalId:e.proposalId,skillRoot:t.skillRoot,...t.snapshotRoot!==void 0?{snapshotRoot:t.snapshotRoot}:{}}),r;try{r=await Ic(n.snapshotBase,{withFileTypes:!0})}catch(s){if(Ui(s))return;throw s}let i=[];for(let s of r){if(!s.isDirectory()||!s.name.startsWith(n.proposalPrefix))continue;let a=Ki(n.snapshotBase,s.name),c=await Pc(a);i.push({path:a,mtimeMs:c.mtimeMs})}return i.sort((s,a)=>a.mtimeMs-s.mtimeMs),i[0]?.path}o(zi,"findLatestSnapshotPath");async function Cc(e){let t=e.applyPlan;if(t?.kind!=="skill")return;let n=await zi(e);if(n!==void 0)for(let r of t.changes){if(r.kind!=="write")continue;let i=Wi(t.skillRoot,r.relativePath);if(i===void 0)return;let s=await Tn(i.absolutePath);if(s.exists&&s.content===r.content)continue;let a=Ki(n,...i.normalizedRelativePath.split("/")),c=await Tn(a);if(!(!s.exists&&!c.exists)&&!(s.exists&&c.exists&&s.content===c.content))return{relativePath:i.normalizedRelativePath,snapshotPath:n}}}o(Cc,"findSnapshotConflict");function Hi(e){if(e.proposal.destination==="workflow_handoff")return e.proposal.consumerImpact}o(Hi,"getWorkflowConsumerImpact");function Rc(e){return Hi(e)?.action==="block_until_manual_review"}o(Rc,"requiresConsumerImpactAck");async function Nc(e,t){let n=await H(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(Nc,"readCurrentStoredProposal");async function An(e,t,n={}){let i=(n.now??(()=>new Date().toISOString()))(),s=n.appliedChangedPaths!==void 0||n.appliedSnapshotPath!==void 0;return Ue(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(An,"markApproved");async function $n(e,t,n={}){let r=await Nc(e,t.proposalId);if(r.status!=="pending")return{status:"blocked_not_pending",reviewStatus:r.status};if(t=r,t.applyPlan?.kind==="skill"){if(await Lc(t)){let c=await zi(t),l=$c(t);return{status:"approved_already_applied",proposal:await An(e,t,{appliedChangedPaths:l,...c!==void 0?{appliedSnapshotPath:c}:{},now:n.now}),changedPaths:l,...c!==void 0?{snapshotPath:c}:{}}}let i=await Cc(t);if(i!==void 0)return{status:"blocked_snapshot_conflict",...i};let s=await Pn({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 An(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(Rc(t)&&n.acknowledgeImpact!==!0){let i=Hi(t);return i===void 0?{status:"blocked_missing_apply_plan"}:{status:"blocked_consumer_impact",impact:i}}return{status:"approved_handoff",proposal:await An(e,t,{now:n.now})}}o($n,"approveStoredLearningProposal");function Dc(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(Dc,"ensureApplyPlanMatchesResult");async function Ln(e){Dc(e);let t=Zt(e.learning);if(t.destination==="discard"||t.destination==="trace_only")return{stored:!1,result:t};let n=await En(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(Ln,"recordProceduralLearning");import{mkdir as Oc,readFile as jc,rename as Fc,rm as Mc,writeFile as Kc}from"fs/promises";import{basename as Uc,dirname as Bc,join as Wc}from"path";var St=1;function Ji(e,t){let n=Ne(e),r=n?Ce(n):`local-${Re(e)}`;return D("projects",r,"learning",t)}o(Ji,"projectLearningPath");function zc(e){return Ji(e,"skill-usage.json")}o(zc,"resolveSkillUsageLedger");function Hc(e){return Ji(e,"skill-trust.json")}o(Hc,"resolveSkillTrustLedger");function bt(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}o(bt,"isRecord");function Jc(e){return e==="project"||e==="user"||e==="plugin"||e==="builtin"||e==="learned"||e==="external"}o(Jc,"isGovernedSkillSource");function qc(e){return e==="provisional"||e==="trusted"||e==="quarantined"||e==="archived"}o(qc,"isSkillTrustState");function Gc(e){return bt(e)&&typeof e.skillName=="string"&&Jc(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(Gc,"isUsageRecord");function Xc(e){return bt(e)&&typeof e.skillName=="string"&&(e.source==="project"||e.source==="user")&&e.ownership==="background_created"&&qc(e.state)&&e.createdByAgent===!0&&typeof e.updatedAt=="string"&&(e.reason===void 0||typeof e.reason=="string")}o(Xc,"isTrustRecord");async function qi(e,t){let n=Bc(e);await Oc(n,{recursive:!0});let r=Wc(n,`.${Uc(e)}.kodax-${process.pid}-${Date.now().toString(36)}.tmp`);try{await Kc(r,t,"utf8"),await Fc(r,e)}catch(i){throw await Mc(r,{force:!0}),i}}o(qi,"writeAtomic");async function Gi(e){let t;try{t=await jc(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(Gi,"readJsonDocument");async function Xi(e){let t=await Gi(e);if(t.warnings.length>0)return{records:[],warnings:t.warnings};if(t.parsed===void 0)return{records:[],warnings:[]};if(!bt(t.parsed)||t.parsed.version!==St||!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(Gc(i))return i;n.push(`usage record ${s} has invalid shape`)}).filter(i=>i!==void 0),warnings:n}}o(Xi,"readSkillUsageLedger");async function Vc(e,t){try{let n=await Xi(e);if(n.warnings.length>0)return{recorded:!1,warnings:n.warnings};let r=(t.now??(()=>new Date().toISOString()))(),i=n.records.find(d=>d.skillName===t.skillName&&d.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(d=>d.skillName===t.skillName&&d.source===t.source?a:d):[...n.records,a];return await qi(e,`${JSON.stringify({version:St,records:c},null,2)}
186
- `),{recorded:!0,record:a,warnings:[]}}catch(n){return{recorded:!1,warnings:[`failed to record skill usage: ${n instanceof Error?n.message:String(n)}`]}}}o(Vc,"recordSkillUsage");async function Vi(e){let t=await Gi(e);if(t.warnings.length>0)return{records:[],warnings:t.warnings};if(t.parsed===void 0)return{records:[],warnings:[]};if(!bt(t.parsed)||t.parsed.version!==St||!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(Xc(i))return i;n.push(`trust record ${s} has invalid shape`)}).filter(i=>i!==void 0),warnings:n}}o(Vi,"readSkillTrustLedger");async function Yc(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 Vi(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 qi(e,`${JSON.stringify({version:St,records:s},null,2)}
187
- `),{updated:!0,record:i}}o(Yc,"updateSkillTrustLedger");import{readdir as Qc,readFile as Zc,stat as el}from"fs/promises";import{join as tl}from"path";var nl=1024*1024,rl=new Set([".git","node_modules","dist","build",".turbo"]),il=new Set([".json",".jsonl",".md",".mdx",".txt",".yml",".yaml",".js",".mjs",".cjs",".ts",".tsx"]);function ol(e){let t=e.lastIndexOf(".");return t>=0?e.slice(t).toLowerCase():""}o(ol,"extensionOf");function sl(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}o(sl,"escapeRegExp");function al(e,t){let n=sl(t);return new RegExp(`(^|[^a-zA-Z0-9_-])(?:/skill:|skill:|skills?["'\\s:\\[]+)?${n}([^a-zA-Z0-9_-]|$)`,"i").test(e)}o(al,"hasSkillReference");async function cl(e,t){let n=await el(e);if(!n.isFile()||n.size>nl||!il.has(ol(e)))return!1;let r=await Zc(e,"utf8");return al(r,t)}o(cl,"scanFile");async function Yi(e,t){let n;try{n=await Qc(e,{withFileTypes:!0})}catch(i){if(i.code==="ENOENT")return[];throw i}let r=[];for(let i of n){let s=tl(e,i.name);if(i.isDirectory()){rl.has(i.name)||r.push(...await Yi(s,t));continue}i.isFile()&&await cl(s,t)&&r.push(s)}return r}o(Yi,"scanDir");async function _t(e,t){if(!e||e.length===0)return[];let n=[];for(let r of e)n.push(...await Yi(r,t));return Array.from(new Set(n)).sort()}o(_t,"scanDirs");async function ll(e){let t=await _t(e.workflowCapsuleDirs,e.skillName),n=await _t(e.savedWorkflowDirs,e.skillName),r=await _t(e.constructedAgentDirs,e.skillName),i=await _t(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(ll,"computeSkillConsumerImpact");function dl(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")||"turn"}o(dl,"safeIdPart");function ul(e,t){return{stored:!1,result:{destination:"discard",proposalId:e,reason:t}}}o(ul,"discardTurn");function fl(e){return e.completedTurn&&e.userMessage.trim().length>0&&e.assistantMessage.trim().length>0}o(fl,"hasUsableTurnEvidence");async function pl(e){let t=[],n=[],r=dl(e.sessionId);if(!fl(e)){for(let i=0;i<e.candidates.length;i+=1){let s=e.candidates[i]?.proposalId??`${r}-${i}`;n.push(ul(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 Ln({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(pl,"recordCompletedTurnLearning");var p=class extends Error{static{o(this,"LearningCapabilityError")}code;constructor(t,n){super(n),this.code=t,this.name="LearningCapabilityError"}},ml={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 Qi(e,t){return ml[e].includes(t)}o(Qi,"canTransitionLearnedCapability");function ve(e,t){if(!Qi(e,t))throw new p("invalid_transition",`learned capability cannot transition from ${e} to ${t}`)}o(ve,"assertLearnedCapabilityTransition");function M(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 p("invalid_record","learned capability name must contain letters or numbers");return t}o(M,"slugifyLearnedCapabilityName");function Zi(e){return e==="active_learned"?"activated":e==="promoted_user"?"promoted":e==="quarantined"?"attention":e}o(Zi,"learningEventKindForLifecycle");function Cn(e){return e.lastAction==="rollback"?"attention":Zi(e.lifecycle)}o(Cn,"learningEventKindForRecord");function xt(e){return`${e.capabilityId}-r${e.revision}-${Cn(e)}`}o(xt,"learningEventIdFor");import{mkdir as io,readFile as hl,readdir as oo,rename as gl,rm as wl,writeFile as yl}from"node:fs/promises";import{lstatSync as kl,realpathSync as vl}from"node:fs";import{basename as Be,dirname as be,isAbsolute as Sl,join as k,relative as so,resolve as ao,sep as bl}from"node:path";function co(e){return{root:e,skills:k(e,"skills"),extensions:k(e,"extensions"),capabilities:k(e,"capabilities"),events:k(e,"events"),clients:k(e,"clients")}}o(co,"resolveLearnedAreaPaths");function Se(e,t){if(!/^[a-zA-Z0-9][a-zA-Z0-9_-]{0,127}$/.test(e))throw new p("invalid_record",`${t} is not a safe file key`)}o(Se,"assertSafeFileKey");async function Rn(e,t){lo(e),await io(be(e),{recursive:!0});let n=k(be(e),`.${Be(e)}.${process.pid}-${Date.now().toString(36)}.tmp`);try{await yl(n,`${JSON.stringify(t,null,2)}
188
- `,"utf8"),await gl(n,e)}catch(r){throw await wl(n,{force:!0}),r}}o(Rn,"writeJsonAtomic");async function oe(e){try{return JSON.parse(await hl(e,"utf8"))}catch(t){if(On(t,"ENOENT"))return;throw t instanceof SyntaxError?new p("store_integrity_error",`invalid JSON in ${e}`):t}}o(oe,"readJson");function N(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}o(N,"isRecord");function On(e,t){return N(e)&&e.code===t}o(On,"isFileError");function It(e,t){if(!N(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"||!N(e.source)||e.schemaVersion===2&&!Il(e))throw new p("store_integrity_error",`invalid capability record in ${t}`);return e}o(It,"assertCapability");function eo(e){let t=[],n=ao(e);for(;;)try{return kl(n),k(vl.native(n),...t)}catch(r){if(r.code!=="ENOENT")throw r;let i=be(n);if(i===n)throw r;t.unshift(Be(n)),n=i}}o(eo,"canonicalExistingPath");function _l(e,t){let n=so(e,t);return n===""||n!==".."&&!n.startsWith(`..${bl}`)&&!Sl(n)}o(_l,"pathContains");function xl(e,t){return so(e,t)===""}o(xl,"pathsEqual");function lo(e){let t=eo(lt()),n=eo(e),r=k(t,"runtime");if(xl(n,t)||_l(r,n))throw new p("store_integrity_error",`learned Area path aliases protected Runtime state: ${e}`)}o(lo,"assertLearnedStoreTarget");function Il(e){if(e.carrier!=="skill"||!N(e.scope)||!N(e.artifact)||!N(e.provenance)||!N(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||El(i.binding))&&Array.isArray(i.invocations)&&i.invocations.every(Pl)}o(Il,"isValidV2Capability");function El(e){return N(e)&&typeof e.bindingId=="string"&&typeof e.ownerSessionRef=="string"&&Nn(e.expiresAt)}o(El,"isValidCanaryBinding");function Pl(e){return!N(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")||!Nn(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:Nn(e.completedAt)}o(Pl,"isValidCanaryInvocation");function Nn(e){return typeof e=="string"&&Number.isFinite(Date.parse(e))}o(Nn,"isValidTimestamp");function to(e,t){if(!N(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 p("store_integrity_error",`invalid learning event in ${t}`);return e}o(to,"assertEvent");function Al(e,t){if(!N(e)||e.schemaVersion!==1||e.clientIdentity!==t||!N(e.events))throw new p("store_integrity_error",`invalid learning client record for ${t}`);return e}o(Al,"assertClient");async function Dn(e){try{return(await oo(e)).filter(t=>t.endsWith(".json")).sort().map(t=>k(e,t))}catch(t){if(On(t,"ENOENT"))return[];throw t}}o(Dn,"listJsonFiles");var J=class{static{o(this,"LearnedAreaStore")}paths;#e;constructor(t){let n=ao(t);this.#e=Tl(n),this.paths={...co(n),events:k(this.#e,"events"),clients:k(this.#e,"clients")}}async initialize(){for(let t of Object.values(this.paths))lo(t);await Promise.all(Object.values(this.paths).map(t=>io(t,{recursive:!0}))),await this.withOwnerMutation(async()=>{for(let t of await this.listCapabilities())await this.ensureCurrentEvent(t)})}async readCapability(t){Se(t,"capabilityId");let n=k(this.paths.capabilities,`${t}.json`),r=await oe(n);if(r!==void 0)return It(r,n);if(this.#e!==this.paths.root)return;let i=await no(this.#e,t);if(i.length>1)throw new p("store_integrity_error",`duplicate project capabilityId: ${t}`);let s=i[0];return s===void 0?void 0:It(await oe(s),s)}async listCapabilities(){let t=await Dn(this.paths.capabilities),n=this.#e===this.paths.root?await no(this.#e):[];return Promise.all([...t,...n].map(async r=>It(await oe(r),r)))}async writeCapability(t){Se(t.capabilityId,"capabilityId");let n=this.#e===this.paths.root&&t.schemaVersion===2?k(this.#e,"projects",t.scope.tenantHash,t.scope.projectHash,"capabilities"):this.paths.capabilities,r=k(n,`${t.capabilityId}.json`);It(t,r),await Rn(r,t)}async writeEvent(t){Se(t.eventId,"eventId"),await Rn(k(this.paths.events,`${t.eventId}.json`),t)}async listEvents(){return(await Promise.all((await Dn(this.paths.events)).map(async n=>to(await oe(n),n)))).sort((n,r)=>n.sequence-r.sequence)}async readClient(t){Se(t,"clientIdentity");let n=k(this.paths.clients,`${t}.json`),r=await oe(n);return r===void 0?{schemaVersion:1,clientIdentity:t,events:{}}:Al(r,t)}async writeClient(t){Se(t.clientIdentity,"clientIdentity"),await Rn(k(this.paths.clients,`${t.clientIdentity}.json`),t)}withOwnerMutation(t){return Ke(k(this.#e,".owner.lock"),t)}withClientMutation(t,n){return Se(t,"clientIdentity"),Ke(k(this.paths.clients,`.${t}.lock`),n)}async ensureCurrentEvent(t){let n=xt(t),r=await oe(k(this.paths.events,`${n}.json`));if(r!==void 0)return to(r,n);let i=await this.listEvents(),s=Et(t,(i.at(-1)?.sequence??0)+1);return await this.writeEvent(s),s}};function Tl(e){let t=Be(e),n=be(e),r=Be(n),i=be(n);return/^[a-f0-9]{64}$/.test(t)&&/^[a-f0-9]{64}$/.test(r)&&Be(i)==="projects"?be(i):e}o(Tl,"globalLearnedAreaRoot");async function no(e,t){let n=k(e,"projects"),r=[];for(let i of await ro(n))for(let s of await ro(k(n,i))){let a=k(n,i,s,"capabilities");if(t!==void 0){let c=k(a,`${t}.json`);await oe(c)!==void 0&&r.push(c)}else r.push(...await Dn(a))}return r.sort()}o(no,"projectCapabilityFiles");async function ro(e){try{return(await oo(e,{withFileTypes:!0})).filter(t=>t.isDirectory()&&/^[a-f0-9]{64}$/.test(t.name)).map(t=>t.name).sort()}catch(t){if(On(t,"ENOENT"))return[];throw t}}o(ro,"listDirectories");function Et(e,t){return{schemaVersion:1,sequence:t,eventId:xt(e),capabilityId:e.capabilityId,capabilityRevision:e.revision,kind:Cn(e),lifecycle:e.lifecycle,displayName:e.displayName,slug:e.slug,carrier:e.carrier,createdAt:e.updatedAt}}o(Et,"eventFromCapability");import{createHash as $l}from"node:crypto";async function We(e){let t=await H(e);return{records:jn(t.proposals.map(n=>Cl(n,e))),warnings:t.warnings}}o(We,"projectLearningProposals");function jn(e,t=[]){let n=new Set(t);return e.map(r=>{let i=Ll(r.slug,r.capabilityId,n);return n.add(i),i===r.slug?r:{...r,slug:i}})}o(jn,"makeProjectedLearningSlugsUnique");function Ll(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(Ll,"nextAvailableSlug");function Cl(e,t){let n=Rl(e);return{schemaVersion:1,capabilityId:`lc_${$l("sha256").update(t).update("\0").update(e.proposalId).digest("hex").slice(0,20)}`,displayName:n,slug:M(n),carrier:Nl(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(Cl,"projectProposal");function Rl(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(Rl,"proposalDisplayName");function Nl(e){return e.proposal.destination==="workflow_handoff"?"workflow_handoff":"skill"}o(Nl,"proposalCarrier");var uo=new Map,Dl=25;function Ol(e){let t=uo.get(e);if(t)return t;let n=new Set;return uo.set(e,n),n}o(Ol,"eventHubFor");var At=class{static{o(this,"FileLearningCenterService")}options;store;now;proposalStores;drivers;waiters;constructor(t){this.options=t;let n=t.rootDir??D("learned");this.store=new J(n),this.waiters=Ol(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(l=>Kl(l,t)).sort(Ul),i=Bl(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 p("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 p("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 p("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=Wl(t,n);return{ready:Fn(i,r,"ready",this.now()),newlyActive:Fn(i,r,"activated",this.now()),attention:Fn(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 p("invalid_record","learning event revision is invalid");return(await this.store.listEvents()).filter(n=>n.sequence>t)}subscribe(t={}){return new Mn(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 p("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(Pt(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 p("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(Pt(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){Fl(t);let n=await this.store.readCapability(t.capabilityId);if(n){if(t.revision!==n.revision+1)throw new p("invalid_record","capability revision must increase by one");if(t.lifecycle===n.lifecycle){if(t.lastAction!=="rollback"||t.lifecycle!=="active_learned")throw new p("invalid_transition","same-state revision requires an active rollback")}else ve(n.lifecycle,t.lifecycle)}let r=(await this.store.listCapabilities()).find(a=>a.slug===t.slug&&a.capabilityId!==t.capabilityId&&Ml(a,t));if(r)throw new p("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=Et(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 Pt(i,r),ve(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);Pt(i,r);let s=this.driverFor(i,n);if(!s)throw new p("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 p("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(We))).flatMap(s=>s.records),r=jn(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(d=>d.capabilityId===i.capabilityId),l={...a.events};for(let d of c)l[d.eventId]={state:n,capabilityRevision:d.capabilityRevision,updatedAt:this.now(),...r===void 0?{}:{snoozedUntil:r}};await this.store.writeClient({...a,events:l})})}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 p("store_integrity_error","F224 projection is missing owner metadata");let i=await this.findF224ProposalStore(t,r),s=(await H(i)).proposals.find(c=>c.proposalId===r);if(!s)throw new p("capability_not_found",`F224 proposal not found: ${t.slug}`);if(n==="reject")await Ue(i,r,"rejected");else{let c=await $n(i,s);if(!c.status.startsWith("approved_"))throw new p("action_failed",`F224 proposal approval was blocked: ${c.status}`)}let a=(await We(i)).records.find(c=>c.capabilityId===t.capabilityId);if(!a)throw new p("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 We(r)).records.some(s=>s.capabilityId===t.capabilityId))return r;throw new p("capability_not_found",`F224 proposal owner was not found: ${n}`)}},Mn=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 p("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),Dl)})])}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 jl(e){return new At(e)}o(jl,"createLearningCenterService");function Fl(e){if(e.schemaVersion!==1&&e.schemaVersion!==2||e.capabilityId.length===0||e.displayName.trim().length===0||e.slug!==M(e.slug)||!Number.isSafeInteger(e.revision)||e.revision<1)throw new p("invalid_record","invalid learned capability record")}o(Fl,"validateRecord");function Ml(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(Ml,"hasSameCapabilityOwner");function Pt(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 p("invalid_record","explicit user action expected revision or fingerprint changed")}o(Pt,"assertExplicitAuthority");function Kl(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(Kl,"matchesQuery");function Ul(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(Ul,"compareCapabilities");function Bl(e){if(e===void 0)return 0;let t=Number(e);if(!Number.isSafeInteger(t)||t<0)throw new p("invalid_record","learning query cursor is invalid");return t}o(Bl,"parseCursor");function Wl(e,t){let n=new Map(e.map(r=>[r.capabilityId,r.revision]));return t.filter(r=>n.get(r.capabilityId)===r.capabilityRevision)}o(Wl,"selectCurrentEvents");function Fn(e,t,n,r){return e.filter(i=>i.kind===n&&zl(i,t,r)).length}o(Fn,"countActionable");function zl(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(zl,"isActionable");var Hl=/^[a-z0-9](?:[a-z0-9-]{0,62}[a-z0-9])?$/,Jl=/^[a-z][a-z0-9_]{0,63}$/;function ql(e,t){if(!Hl.test(e))throw new p("invalid_record","learned Extension slug is invalid");if(!Jl.test(t))throw new p("invalid_record","learned Extension tool name is invalid");return`learned.${e}.${t}`}o(ql,"getLearnedExtensionToolName");function Gl(e){return!1}o(Gl,"isLearnedExtensionCommandAllowed");import{createHash as hd,randomUUID as gd}from"node:crypto";import{link as wd,lstat as Gn,mkdir as _o,open as yd,readFile as xo,rm as kd}from"node:fs/promises";import{basename as vd,dirname as Sd,join as Je,relative as bd,resolve as xe,sep as Hn}from"node:path";import{createHash as Xl,randomUUID as Vl}from"node:crypto";import{lstat as po,mkdir as Yl,open as Ql,readFile as Zl}from"node:fs/promises";import{join as _e,relative as ed,resolve as mo,sep as td}from"node:path";var nd=16*1024,ho=/^[a-f0-9]{64}$/,rd=[/!\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 id(e,t){return _e(mo(e),"learned","projects",He("tenant",t.tenantId),He("project",t.projectId))}o(id,"resolveProjectLearnedAreaRoot");function od(e,t){return{configHomeHash:He("config-home",pd(e)),tenantHash:He("tenant",t.tenantId),projectHash:He("project",t.projectId)}}o(od,"createLearnedCapabilityScope");function Kn(e){let t=[e.name,e.description,e.purpose,...e.triggers,...e.steps,...e.verification,...e.pitfalls];if(!(e.name===M(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=>rd.some(s=>s.test(i))))throw new p("invalid_record","unsafe learned Skill specification was rejected");let r=wo(e);if(Buffer.byteLength(r,"utf8")>nd)throw new p("invalid_record","unsafe learned Skill specification exceeds the size limit")}o(Kn,"validateDeclarativeSkillSpec");function go(e){return Kn(e),wo(e)}o(go,"renderDeclarativeSkill");function wo(e){return["---",`name: ${e.name}`,`description: ${JSON.stringify(e.description.trim())}`,"---","","# Purpose","",e.purpose.trim(),"","## Use when","",...e.triggers.map(t=>`- ${Tt(t)}`),"","## Steps","",...e.steps.map((t,n)=>`${n+1}. ${Tt(t)}`),"","## Verification","",...e.verification.map(t=>`- ${Tt(t)}`),"","## Pitfalls","",...e.pitfalls.map(t=>`- ${Tt(t)}`),""].join(`
189
- `)}o(wo,"renderDeclarativeSkillUnchecked");async function yo(e,t,n){So(t);let r=go(n),i=Wn(r),s=_e(e,"skills",t,"revisions",i),a=_e(s,"SKILL.md");await ze(e),await ze(_e(e,"skills")),await ze(_e(e,"skills",t)),await ze(_e(e,"skills",t,"revisions")),await ze(s);try{let c=await Ql(a,"wx");try{await c.writeFile(r,"utf8")}finally{await c.close()}}catch(c){if(!md(c,"EEXIST"))throw c;if(await fo(a),await Zl(a,"utf8")!==r)throw new p("store_integrity_error","content-addressed learned Skill revision does not match its fingerprint")}return await fo(a),{kind:"skill_markdown",relativePath:ed(e,a).split(td).join("/"),fingerprint:i,contentRevision:1,absolutePath:a}}o(yo,"stageLearnedSkillRevision");function ko(e){So(e.capabilityId),ud(e.artifact),dd(e.scope);let t=e.now??new Date().toISOString(),n=e.previous;return{schemaVersion:2,capabilityId:e.capabilityId,displayName:e.displayName.trim(),slug:M(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:bo(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(ko,"createLearnedSkillRecord");async function sd(e,t){Kn(t.spec);let n=t.now??new Date().toISOString(),r=t.operation==="patch"?t.targetCapabilityId:fd(t.spec.name,t.scope);if(r===void 0)throw new p("invalid_record","learned Skill patch target is missing");let i=await yo(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&&P(c)&&c.provenance.actionId===t.provenance.actionId)return c;let l;if(t.operation==="patch"){if(c===void 0||!P(c))throw new p("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 p("invalid_record","learned Skill patch expected revision or fingerprint changed");l=c}else{let h=(await e.listCapabilities()).find(w=>w.slug===t.spec.name&&w.capabilityId!==r);if(c!==void 0||h!==void 0)throw new p("invalid_record","learned Skill create target already exists")}let d={...bo(i),contentRevision:l===void 0?1:l.artifact.contentRevision+1},u=(t.protectedSkillNames??[]).includes(t.spec.name),f=t.disposition==="project_canary"&&!u?"testing":"ready",m={...ko({capabilityId:r,displayName:t.spec.name,scope:t.scope,artifact:d,provenance:t.provenance,now:n,...l===void 0?{}:{previous:l}}),slug:t.spec.name,lifecycle:f,...u?{diagnostics:["formal Skill name collision requires explicit user review"]}:{}};return await a(),await e.writeCapability(m),await e.ensureCurrentEvent(m),m}),"commit");return t.authority===void 0?s(async()=>{}):t.authority.commit(s)}o(sd,"commitLearnedSkillRevision");async function Un(e,t,n){let r=n.now??new Date,i=Math.max(1e3,n.ttlMs??5*6e4);return Lt(e,t,r.toISOString(),s=>{let a=cd(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 l={bindingId:n.bindingId,ownerSessionRef:n.ownerSessionRef,expiresAt:new Date(r.getTime()+i).toISOString()};return{record:{...a,canary:{...a.canary,binding:l}},result:l,changed:c?.bindingId!==l.bindingId||c.expiresAt!==l.expiresAt}})}o(Un,"admitLearnedSkillBinding");async function ad(e,t,n,r=new Date().toISOString()){return Lt(e,t,r,i=>i.canary.binding?.bindingId!==n?{record:i,result:!1,changed:!1}:{record:vo(i,n,new Date(r),"released canary invocation recovered as inconclusive","host:learned-skill-binding-release"),result:!0,changed:!0})}o(ad,"releaseLearnedSkillBinding");async function Bn(e,t,n){let r=n.now??new Date,i=n.invocationId??Vl();return Lt(e,t,r.toISOString(),s=>{if(s.lifecycle!=="testing")throw new p("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 p("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 p("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 p("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 p("action_failed","learned Skill canary is exhausted");let l={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()},d=s.canary.invocationCount+1;return{record:{...s,canary:{...s.canary,invocationCount:d,invocations:[...s.canary.invocations,l]}},result:{invocationId:i,invocationCount:d,maxInvocations:3},changed:!0}})}o(Bn,"invokeLearnedSkillCanary");async function $t(e,t,n){let r=n.now??new Date().toISOString();return Lt(e,t,r,i=>{let s=i.canary.invocations.find(h=>h.invocationId===n.invocationId);if(s===void 0)throw new p("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 p("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),l=i.canary.credibleNegatives+(n.outcome==="credible_negative"?1:0),d=a.some(h=>h.status==="pending"),u=i.canary.invocationCount>=i.canary.maxInvocations&&!d,f=l>0?"quarantined":u&&c>0?"active_learned":u?"ready":i.lifecycle,m={...i,lifecycle:f,...f==="active_learned"&&i.previousGoodArtifact===void 0?{previousGoodRevision:i.artifact.contentRevision,previousGoodArtifact:i.artifact}:{},canary:{...i.canary,verifiedSuccesses:c,credibleNegatives:l,invocations:a}};return{record:m,result:m,changed:!0}})}o($t,"completeLearnedSkillOutcome");function cd(e,t){let n=e.canary.binding;return n===void 0||Date.parse(n.expiresAt)>t.getTime()?e:vo(e,n.bindingId,t,"expired canary invocation recovered as inconclusive","host:learned-skill-binding-expired")}o(cd,"recoverExpiredCanary");function vo(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,...l}=e.canary,d=l.invocationCount>=l.maxInvocations&&!a.some(u=>u.status==="pending");return{...e,lifecycle:d&&e.lifecycle==="testing"?"ready":e.lifecycle,canary:{...l,invocations:a},...s?{diagnostics:[...new Set([...e.diagnostics??[],r])]}:{}}}o(vo,"settleCanaryBinding");async function ld(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||!P(i))throw new p("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 p("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(ld,"quarantineLearnedSkillRevision");function P(e){return e.schemaVersion===2}o(P,"isLearnedCapabilityRecordV2");async function Lt(e,t,n,r){return e.withOwnerMutation(async()=>{let i=await e.readCapability(t);if(i===void 0||!P(i))throw new p("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(Lt,"mutateLearnedSkill");function So(e){if(!/^[a-zA-Z0-9][a-zA-Z0-9_-]{0,127}$/.test(e))throw new p("invalid_record","learned Skill capabilityId is unsafe")}o(So,"assertSafeCapabilityId");function dd(e){if(![e.configHomeHash,e.tenantHash,e.projectHash].every(t=>ho.test(t)))throw new p("invalid_record","learned Skill project scope is invalid")}o(dd,"assertScope");function ud(e){if(e.kind!=="skill_markdown"||!ho.test(e.fingerprint)||e.contentRevision<1||e.relativePath.startsWith("/")||e.relativePath.includes("\\")||e.relativePath.split("/").some(t=>t===".."||t==="."))throw new p("invalid_record","learned Skill artifact reference is invalid")}o(ud,"assertArtifact");function bo(e){return{kind:e.kind,relativePath:e.relativePath,fingerprint:e.fingerprint,contentRevision:e.contentRevision}}o(bo,"withoutAbsolutePath");function Tt(e){return e.trim().replace(/\s+/g," ")}o(Tt,"oneLine");function Wn(e){return Xl("sha256").update(e,"utf8").digest("hex")}o(Wn,"sha256");function fd(e,t){return`lc_skill_${Wn([e,t.configHomeHash,t.tenantHash,t.projectHash].join("\0")).slice(0,24)}`}o(fd,"learnedSkillCapabilityId");function He(e,t){return Wn(`${e}\0${t}`)}o(He,"scopedHash");function pd(e){let t=mo(e);return process.platform==="win32"?t.toLowerCase():t}o(pd,"normalizePath");async function ze(e){await Yl(e,{recursive:!0});let t=await po(e);if(!t.isDirectory()||t.isSymbolicLink())throw new p("store_integrity_error",`learned Skill directory is not an owned regular directory: ${e}`)}o(ze,"ensureOwnedDirectory");async function fo(e){let t=await po(e);if(!t.isFile()||t.isSymbolicLink())throw new p("store_integrity_error",`learned Skill artifact is not a regular file: ${e}`)}o(fo,"assertRegularFile");function md(e,t){return typeof e=="object"&&e!==null&&"code"in e&&e.code===t}o(md,"isFileError");var _d=["review","trust","rollback","promote"];function xd(e){return{carrier:"skill",actions:_d,execute:o(async(t,n)=>{let r=Id(n),i=e.now?.()??new Date().toISOString();if(t==="rollback")return Ed(r,i);if(t==="review")return zn(r,"testing",i,{canary:Eo(),lastAction:t});if(t==="trust")return zn(r,"active_learned",i,{previousGoodRevision:r.previousGoodRevision??r.artifact.contentRevision,previousGoodArtifact:r.previousGoodArtifact??r.artifact,lastAction:t});if(t==="promote")return await Pd(e,r),r.lifecycle==="promoted_user"?r:zn(r,"promoted_user",i,{lastAction:t});throw new p("unsupported_action",`unsupported learned Skill action: ${String(t)}`)},"execute")}}o(xd,"createLearnedSkillActionDriver");function Id(e){if(!P(e)||e.source.kind!=="skill_learning_loop")throw new p("unsupported_action","the capability is not an F263 learned Skill");return e}o(Id,"requireLearnedSkill");function zn(e,t,n,r){return e.lifecycle!==t&&ve(e.lifecycle,t),{...e,...r,lifecycle:t,revision:e.revision+1,updatedAt:n}}o(zn,"transitionRecord");function Ed(e,t){if(e.previousGoodArtifact===void 0||e.previousGoodRevision===void 0)throw new p("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:Eo()}}o(Ed,"rollbackRecord");function Eo(){return{maxInvocations:3,invocationCount:0,verifiedSuccesses:0,credibleNegatives:0,invocations:[]}}o(Eo,"resetCanary");async function Pd(e,t){let n=Ld(e,t),r=xe(n,...t.artifact.relativePath.split("/"));qn(r,n),await $d(n,r,"learned Skill promotion source contains a symlink or non-regular path");let i=await xo(r,"utf8");if(Cd(i)!==t.artifact.fingerprint)throw new p("store_integrity_error","learned Skill promotion source fingerprint changed");let s=await Td(e.userSkillsRoot,t.slug);if(qn(s,e.userSkillsRoot),await Ad(s,i))return;let a=await Gn(s);if(a.isSymbolicLink()||!a.isFile())throw new p("store_integrity_error","formal user Skill target is not a regular file");if(await xo(s,"utf8")!==i)throw new p("action_failed",`formal user Skill already exists with different content: ${t.slug}`)}o(Pd,"promoteExactArtifact");async function Ad(e,t){let n=Je(Sd(e),`.${vd(e)}.${process.pid}.${gd()}.tmp`),r;try{r=await yd(n,"wx"),await r.writeFile(t,"utf8"),await r.sync(),await r.close(),r=void 0;try{return await wd(n,e),!0}catch(i){if(Po(i,"EEXIST"))return!1;throw i}}finally{try{await r?.close()}finally{await kd(n,{force:!0})}}}o(Ad,"publishFormalSkill");async function Td(e,t){let n=xe(e);await _o(n,{recursive:!0}),await Jn(n,"formal user Skill root is not a regular directory");let r=xe(n,t);qn(r,n);try{await _o(r)}catch(i){if(!Po(i,"EEXIST"))throw i}return await Jn(r,"formal user Skill path contains a symlink or non-regular directory"),Je(r,"SKILL.md")}o(Td,"preparePromotionDestination");async function $d(e,t,n){let r=xe(e);await Jn(r,n);let i=bd(r,t).split(Hn),s=r;for(let[a,c]of i.entries()){s=Je(s,c);let l=await Gn(s),d=a===i.length-1;if(l.isSymbolicLink()||(d?!l.isFile():!l.isDirectory()))throw new p("store_integrity_error",n)}}o($d,"assertRegularFileChain");async function Jn(e,t){let n=await Gn(e);if(n.isSymbolicLink()||!n.isDirectory())throw new p("store_integrity_error",t)}o(Jn,"assertRegularDirectory");function Ld(e,t){let n=xe(e.learnedAreaRoot);return e.learnedAreaKind==="project"||e.learnedAreaKind===void 0&&n.endsWith(Je("projects",t.scope.tenantHash,t.scope.projectHash))?n:Je(n,"projects",t.scope.tenantHash,t.scope.projectHash)}o(Ld,"capabilityAreaRoot");function qn(e,t){let n=Io(t),r=Io(e);if(r!==n&&!r.startsWith(n.endsWith(Hn)?n:`${n}${Hn}`))throw new p("store_integrity_error","learned Skill path escaped its configured owner root")}o(qn,"assertInside");function Io(e){let t=xe(e);return process.platform==="win32"?t.toLowerCase():t}o(Io,"comparable");function Cd(e){return hd("sha256").update(e,"utf8").digest("hex")}o(Cd,"sha256");function Rd(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}o(Rd,"isRecord");function Po(e,t){return Rd(e)&&e.code===t}o(Po,"isFileError");import{createHash as Nd}from"node:crypto";import{lstat as Xn,mkdir as Dd,open as Od,readFile as jd,readdir as Ao}from"node:fs/promises";import{join as Ie,resolve as qe}from"node:path";var Fd=".legacy-skill-import-v1.json",Md=16*1024,Kd=[/!\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 Ud(e,t,n){let r=Ie(t.paths.root,Fd);return t.withOwnerMutation(async()=>{if(await qd(r))return{migratedActive:0,recordedAttention:0,alreadyComplete:!0};let i=Ie(qe(e),"learned"),s=Ie(i,"skills"),a=(await new J(i).listCapabilities()).filter(d=>d.schemaVersion===1),c=0,l=0;for(let d of await Jd(s)){let u=Ie(s,d,"SKILL.md"),f=await Wd(Ie(s,d),u),m=a.find(y=>zd(y,d,u)),h=f===void 0?void 0:To(f),w=Bd(n,d,m,h);await t.readCapability(w.capabilityId)===void 0&&(await t.writeCapability(w),await t.ensureCurrentEvent(w),l+=1)}return await Gd(r,{version:1,migratedActive:c,recordedAttention:l,completedAt:new Date().toISOString()}),{migratedActive:c,recordedAttention:l,alreadyComplete:!1}})}o(Ud,"migrateLegacyLearnedSkillsForProject");function Bd(e,t,n,r){let i=new Date().toISOString();return{schemaVersion:1,capabilityId:Hd(e,`attention:${t}`),displayName:n?.displayName??t,slug:M(n?.slug??t),carrier:"skill",lifecycle:"ready",revision:1,createdAt:n?.createdAt??i,updatedAt:i,source:{kind:"legacy_manual"},artifactPath:Ie("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(Bd,"attentionLegacyRecord");async function Wd(e,t){try{let n=await Xn(e),r=await Xn(t);if(!n.isDirectory()||n.isSymbolicLink()||!r.isFile()||r.isSymbolicLink()||(await Ao(e)).some(a=>a!=="SKILL.md"))return;let s=await jd(t,"utf8");return Buffer.byteLength(s,"utf8")>Md||Kd.some(a=>a.test(s))?void 0:s}catch(n){if(Vn(n,"ENOENT"))return;throw n}}o(Wd,"safeLegacyContent");function zd(e,t,n){if(e.carrier!=="skill")return!1;let r=e.artifactPath;if(r===void 0)return e.slug===t;let i=qe(r);return i===qe(n)||i===qe(n,"..")||e.slug===t}o(zd,"legacyRecordMatches");function Hd(e,t){return`lc_legacy_${To([e.configHomeHash,e.tenantHash,e.projectHash,t].join("\0")).slice(0,24)}`}o(Hd,"legacyCapabilityId");async function Jd(e){try{return(await Ao(e,{withFileTypes:!0})).filter(t=>t.isDirectory()&&!t.isSymbolicLink()).map(t=>t.name).sort()}catch(t){if(Vn(t,"ENOENT"))return[];throw t}}o(Jd,"directDirectories");async function qd(e){try{return await Xn(e),!0}catch(t){if(Vn(t,"ENOENT"))return!1;throw t}}o(qd,"fileExists");async function Gd(e,t){await Dd(qe(e,".."),{recursive:!0});let n=await Od(e,"wx");try{await n.writeFile(`${JSON.stringify(t,null,2)}
190
- `,"utf8")}finally{await n.close()}}o(Gd,"writeImmutableJson");function To(e){return Nd("sha256").update(e,"utf8").digest("hex")}o(To,"sha256");function Xd(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}o(Xd,"isRecord");function Vn(e,t){return Xd(e)&&e.code===t}o(Vn,"isFileError");import{createHash as Ro,randomUUID as Vd}from"node:crypto";import{mkdir as Yd,open as Qd,readFile as Xe,readdir as No}from"node:fs/promises";import{dirname as Zd,join as se,resolve as Do,sep as $o}from"node:path";async function eu(e,t){let n=K("session",t.sessionId),r={version:1,kind:"offered",receiptId:K("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 Ge(e,r),r}o(eu,"recordLearnedSkillOffered");async function tu(e,t){let n=t.now??new Date,r=t.invocationId??Vd(),i=K("session",t.sessionId),s=await e.readCapability(t.capabilityId);if(s===void 0||!P(s)||s.artifact.contentRevision!==t.expectedRevision||s.artifact.fingerprint!==t.expectedFingerprint)throw new p("invalid_record","learned Skill invocation expected revision or fingerprint changed");if(s.lifecycle==="testing"){if(await Un(e,t.capabilityId,{bindingId:t.bindingId,ownerSessionRef:t.ownerSessionRef,now:n})===void 0)throw new p("action_failed","learned Skill canary binding is owned by another root");await Bn(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 p("invalid_transition","learned Skill revision is not active or in admitted testing");let a=await e.readCapability(t.capabilityId);if(a===void 0||!P(a))throw new p("capability_not_found","learned Skill record disappeared");let c={version:1,kind:"invoked",receiptId:K("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 Ge(e,c),c}o(tu,"admitAndRecordLearnedSkillInvocation");async function nu(e,t){if(t.evidenceRefs.length===0)return[];let n=await Yn(e,t.sessionId),r=new Set(n.filter(l=>l.kind==="outcome").map(l=>l.invocationId)),i=n.filter(l=>l.kind==="invoked"&&(t.bindingId===void 0||l.bindingId===t.bindingId)),a=new Set(i.map(l=>l.capabilityId)).size>1?"inconclusive":t.outcome,c=[];for(let l of i){if(r.has(l.invocationId))continue;let d=await e.readCapability(l.capabilityId),u=d!==void 0&&P(d)?d.canary.invocations.find(y=>y.invocationId===l.invocationId):void 0,f=u!==void 0&&u.status!=="pending"?u.status:a,m=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(d!==void 0&&P(d)&&u?.status==="pending"){let I=(await $t(e,l.capabilityId,{invocationId:l.invocationId,outcome:a,evidenceRefs:t.evidenceRefs,now:t.now})).canary.invocations.find(b=>b.invocationId===l.invocationId);I!==void 0&&I.status!=="pending"&&(f=I.status,m=I.evidenceRefs,h=I.completedAt??h)}let w={version:1,kind:"outcome",receiptId:K("outcome",`${l.sessionHash}\0${l.invocationId}`),sessionHash:l.sessionHash,invocationId:l.invocationId,capabilityId:l.capabilityId,outcome:f,evidenceRefs:[...m],createdAt:h};await Ge(e,w),c.push(w)}return c}o(nu,"completeLearnedSkillSessionOutcomes");async function ru(e,t){let n=K("session",t.sessionId),r=t.now??new Date().toISOString(),i=[],s=(await e.listCapabilities()).filter(P),a=new Map;for(let c of await iu(e,n,t.bindingId)){let l=s.find(u=>u.capabilityId===c.capabilityId);if(l===void 0)continue;let d=l.canary.invocations.find(u=>u.invocationId===c.invocationId&&u.bindingId===c.bindingId);if(d===void 0&&(l.lifecycle!=="active_learned"||l.artifact.contentRevision!==c.revision||l.artifact.fingerprint!==c.fingerprint))throw new p("store_integrity_error","learned Skill invocation receipt does not match a current artifact");a.set(`${c.sessionHash}\0${c.invocationId}`,{invoked:c,capability:l,...d===void 0?{}:{canonicalInvocationId:c.invocationId}})}for(let c of s)for(let l of c.canary.invocations){if(l.bindingId!==t.bindingId&&l.status==="pending")continue;let d=l.usageSessionHash??(l.bindingId===t.bindingId?n:void 0);if(d===void 0)continue;let u=K("invoked",`${d}\0${l.invocationId}`),f=await Lo(e,d,u);if(f!==void 0&&f.kind!=="invoked")throw new p("store_integrity_error","learned Skill invocation receipt identity was reused");if(f?.kind==="invoked"&&(f.invocationId!==l.invocationId||f.bindingId!==l.bindingId||f.capabilityId!==c.capabilityId||f.revision!==(l.artifactRevision??c.artifact.contentRevision)||f.fingerprint!==(l.artifactFingerprint??c.artifact.fingerprint)))throw new p("store_integrity_error","learned Skill invocation receipt drifted from canonical invocation");let m=f??{version:1,kind:"invoked",receiptId:u,sessionHash:d,bindingId:l.bindingId,invocationId:l.invocationId,capabilityId:c.capabilityId,revision:l.artifactRevision??c.artifact.contentRevision,fingerprint:l.artifactFingerprint??c.artifact.fingerprint,createdAt:l.invokedAt};f===void 0&&await Ge(e,m),a.set(`${m.sessionHash}\0${m.invocationId}`,{invoked:m,capability:c,canonicalInvocationId:l.invocationId})}for(let c of a.values()){let{invoked:l}=c,d=K("outcome",`${l.sessionHash}\0${l.invocationId}`),u=await Lo(e,l.sessionHash,d),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 p("store_integrity_error","learned Skill outcome receipt identity was reused");let y=u.invocationId!==l.invocationId||u.capabilityId!==l.capabilityId,I=f!==void 0&&f.status!=="pending"&&f.completedAt===void 0,b=f!==void 0&&(f.status==="pending"||u.outcome!==f.status||JSON.stringify(u.evidenceRefs)!==JSON.stringify(f.evidenceRefs)||u.createdAt!==f.completedAt);if(y||I||b)throw new p("store_integrity_error","learned Skill outcome receipt drifted from canonical invocation");continue}let m=f?.status==="pending"?await $t(e,c.capability.capabilityId,{invocationId:l.invocationId,outcome:"inconclusive",evidenceRefs:["host:learned-skill-binding-release"],now:r}):c.capability,h=f===void 0?void 0:m.canary.invocations.find(y=>y.invocationId===l.invocationId);if(h?.status==="pending")throw new p("store_integrity_error","learned Skill canary invocation did not settle during reconciliation");if(h!==void 0&&h.completedAt===void 0)throw new p("store_integrity_error","learned Skill terminal invocation has no canonical completion time");let w={version:1,kind:"outcome",receiptId:d,sessionHash:l.sessionHash,invocationId:l.invocationId,capabilityId:l.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 Ge(e,w),i.push(w)}return i}o(ru,"reconcileLearnedSkillBindingOutcomes");async function iu(e,t,n){let r=Ct(e,t),i;try{i=(await No(r)).filter(a=>a.endsWith(".json")).sort()}catch(a){if(Nt(a,"ENOENT"))return[];throw a}let s=[];for(let a of i){let c;try{c=JSON.parse(await Xe(se(r,a),"utf8"))}catch(d){if(!(d instanceof SyntaxError))throw d;E({source:"learning.skill-usage",level:"warn",message:"Invalid unrelated usage receipt was skipped during binding recovery.",detail:{filePath:se(r,a)}});continue}if(!Rt(c)){if(Qn(c)&&c.kind==="invoked"&&c.bindingId===n)throw new p("store_integrity_error","invalid target learned Skill invocation receipt");ou(r,a);continue}if(c.kind!=="invoked"||c.bindingId!==n)continue;let l=K("invoked",`${t}\0${c.invocationId}`);if(c.sessionHash!==t||c.receiptId!==l||a!==`${l}.json`)throw new p("store_integrity_error","target learned Skill invocation receipt identity is invalid");s.push(c)}return s}o(iu,"listValidBindingInvocations");function ou(e,t){E({source:"learning.skill-usage",level:"warn",message:"Invalid unrelated usage receipt was skipped during binding recovery.",detail:{filePath:se(e,t)}})}o(ou,"emitInvalidSiblingReceipt");async function Yn(e,t){let n=Ct(e,K("session",t)),r;try{r=(await No(n)).filter(s=>s.endsWith(".json")).sort()}catch(s){if(Nt(s,"ENOENT"))return[];throw s}let i=[];for(let s of r){let a=JSON.parse(await Xe(se(n,s),"utf8"));if(!Rt(a))throw new p("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(Yn,"listLearnedSkillUsageReceipts");async function su(e,t,n={}){let r=(await Yn(e,t)).filter(d=>d.kind==="invoked"&&(n.bindingId===void 0||d.bindingId===n.bindingId)),i=r.at(-1);if(i===void 0||r.some(d=>d.capabilityId!==i.capabilityId))return null;let s=await e.readCapability(i.capabilityId);if(s===void 0||!P(s)||s.artifact.fingerprint!==i.fingerprint||s.artifact.contentRevision!==i.revision)return null;let a=Do(e.paths.root,...s.artifact.relativePath.split("/"));au(a,e.paths.root);let c=await Xe(a,"utf8");return Ro("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(su,"exactInvokedSkillSnapshotForSession");async function Ge(e,t){let n=se(Ct(e,t.sessionHash),`${t.receiptId}.json`);await Yd(Zd(n),{recursive:!0});let r=`${JSON.stringify(t,null,2)}
191
- `;try{let i=await Qd(n,"wx");try{await i.writeFile(r,"utf8")}finally{await i.close()}}catch(i){if(!Nt(i,"EEXIST"))throw i;let s=JSON.parse(await Xe(n,"utf8"));if(!Rt(s)||JSON.stringify({...s,createdAt:""})!==JSON.stringify({...t,createdAt:""}))throw new p("store_integrity_error","learned Skill usage receipt drifted")}}o(Ge,"writeImmutableReceipt");async function Lo(e,t,n){try{let r=JSON.parse(await Xe(se(Ct(e,t),`${n}.json`),"utf8"));if(!Rt(r)||r.receiptId!==n||r.sessionHash!==t)throw new p("store_integrity_error","invalid learned Skill usage receipt");return r}catch(r){if(Nt(r,"ENOENT"))return;throw r}}o(Lo,"readUsageReceipt");function Ct(e,t){return se(e.paths.root,"usage",t)}o(Ct,"usageSessionRoot");function K(e,t){return Ro("sha256").update(`${e}\0${t}`,"utf8").digest("hex")}o(K,"usageHash");function Rt(e){return!Qn(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(Rt,"isUsageReceipt");function au(e,t){let n=Co(t),r=Co(e);if(r!==n&&!r.startsWith(n.endsWith($o)?n:`${n}${$o}`))throw new p("store_integrity_error","learned Skill artifact escaped its owner")}o(au,"assertInside");function Co(e){let t=Do(e);return process.platform==="win32"?t.toLowerCase():t}o(Co,"comparable");function Qn(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}o(Qn,"isRecord");function Nt(e,t){return Qn(e)&&e.code===t}o(Nt,"isFileError");async function Ot(e,t){let n=new Map,r=[],i=o(l=>{let d=n.get(l.name);d?ce(d.path)!==ce(l.path)&&E({source:"agent:skills",level:"warn",message:`Skill "${l.name}" is shadowed by a higher-priority source.`,detail:{code:"skill_shadowed",name:l.name,selectedPath:ae(d.path,"SKILL.md"),shadowedPath:ae(l.path,"SKILL.md")}}):n.set(l.name,l)},"register"),a={...qt(e),...t},c=Gt(a);for(let{path:l,source:d}of c)try{let u=await xu(l,d,r);for(let f of u)i(f)}catch(u){r.push({path:l,error:u instanceof Error?u.message:String(u)})}if(a.learnedArea!==void 0){let l=await mu(a.learnedArea);r.push(...l.errors);for(let d of l.skills)i(d)}return{skills:n,errors:r}}o(Ot,"discoverSkills");async function mu(e){let t=[],n=[];for(let r of gu(e)){let i=await hu(r.rootDir,r.expectedScope,e);t.push(...i.skills),n.push(...i.errors)}return{skills:t,errors:n}}o(mu,"scanRecordGatedLearnedArea");async function hu(e,t,n){let r=new J(e),i=[],s=[],a;try{a=await r.listCapabilities()}catch(c){return{skills:i,errors:[{path:e,error:c instanceof Error?c.message:String(c)}]}}for(let c of a){if(!P(c)||!wu(c,t)||!ku(c,n))continue;let l=Dt(e,...c.artifact.relativePath.split("/"));try{bu(l,e),await Su(e,l);let d=await lu(l,"utf8");if(_u(d)!==c.artifact.fingerprint)throw new Error("learned Skill artifact fingerprint mismatch");let u=await it(Zn(l),"learned");if(u===null)throw new Error("learned Skill metadata is invalid");i.push({...u,learned:{capabilityId:c.capabilityId,revision:c.artifact.contentRevision,fingerprint:c.artifact.fingerprint}})}catch(d){let u=d instanceof Error?d.message:String(d);s.push({path:l,error:u}),await vu(r,c,u)}}return{skills:i,errors:s}}o(hu,"scanRecordGatedLearnedRoot");function gu(e){let t=[e.rootDir,...e.additionalRootDirs??[]],n=yu(e);if(t.length!==n.length)throw new Error("learned Skill discovery requires one expected scope per physical root");let r=t.map((i,s)=>({rootDir:i,expectedScope:n[s]}));for(let[i,s]of r.entries())if(r.findIndex(c=>ce(c.rootDir)===ce(s.rootDir))!==i)throw new Error("learned Skill discovery physical roots must be unique");return r}o(gu,"learnedAreaBindings");function wu(e,t){return e.scope.configHomeHash===t.configHomeHash&&e.scope.tenantHash===t.tenantHash&&e.scope.projectHash===t.projectHash}o(wu,"scopeMatches");function yu(e){let t=[...e.expectedScopes??[e.expectedScope]];if(t.length===0)throw new Error("learned Skill discovery requires at least one expected scope");return t}o(yu,"expectedLearnedScopes");function ku(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(ku,"isRecordAdmitted");async function vu(e,t,n){await e.withOwnerMutation(async()=>{let r=await e.readCapability(t.capabilityId);if(r===void 0||!P(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(vu,"quarantineInvalidLearnedArtifact");async function Su(e,t){let r=pu(Dt(e),t).split(er),i=Dt(e),s=await Oo(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=ae(i,c);let l=await Oo(i),d=a===r.length-1;if(l.isSymbolicLink()||(d?!l.isFile():!l.isDirectory()))throw new Error("learned Skill artifact contains a symlink or non-regular path")}}o(Su,"assertRegularArtifactChain");function bu(e,t){let n=ce(t),r=ce(e);if(r!==n&&!r.startsWith(n.endsWith(er)?n:`${n}${er}`))throw new Error("learned Skill artifact escapes its Learned Area")}o(bu,"assertInside");function ce(e){let t=Dt(e);return process.platform==="win32"?t.toLowerCase():t}o(ce,"comparablePath");function _u(e){return cu("sha256").update(e,"utf8").digest("hex")}o(_u,"sha256");async function xu(e,t,n){let r=[],i=new Set;async function s(a){try{let c=ce(await uu(a));if(i.has(c))return;i.add(c);let l=await du(a,{withFileTypes:!0});if(l.some(d=>d.name==="SKILL.md")){let d=await it(a,t);d?r.push(d):n.push({path:ae(a,"SKILL.md"),error:"Skill metadata could not be loaded."});return}l.sort((d,u)=>d.name<u.name?-1:d.name>u.name?1:0);for(let d of l){if(d.name.startsWith(".")||d.name==="node_modules")continue;let u=ae(a,d.name);try{(d.isDirectory()||d.isSymbolicLink()&&(await fu(u)).isDirectory())&&await s(u)}catch(f){jo(n,u,f)}}}catch(c){jo(n,a,c)}}return o(s,"visit"),await s(e),r}o(xu,"scanSkillDirectory");function jo(e,t,n){typeof n=="object"&&n!==null&&"code"in n&&n.code==="ENOENT"||e.push({path:t,error:n instanceof Error?n.message:String(n)})}o(jo,"recordDiscoveryError");function Fo(e,t){let n=[],r=[".kodax/skills",".agents/skills"],i=e,s=Zn(t);for(;i!==s&&i!=="/"&&i.length>3;){for(let c of r)n.push(ae(i,c));let a=Zn(i);if(a===i)break;i=a}return n}o(Fo,"getNestedSkillPaths");async function Iu(e,t){let n=Fo(e,t),r={projectPaths:[ae(t,".kodax","skills"),...n]};return Ot(t,r)}o(Iu,"discoverSkillsWithMonorepo");import{execSync as Eu}from"child_process";import Pu from"path";var Au=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 Mo(e){if(!e||!e.trim())return!1;let t=e.trim().replace(/\s+/g," ").toLowerCase();for(let n of Au)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(Mo,"isSingleSafeDynamicContextCommand");function Tu(e){if(!e||!e.trim())return!1;let t=e.trim().replace(/\\\r?\n/g," ");if(/[<>|;`]|\$\(|(?<!&)&(?!&)/.test(t)||t.includes("\\")&&Pu.sep!=="\\"&&t.replace(/\\ /g,"").includes("\\"))return!1;let r=t.split(/\s*&&\s*/);if(r.length===1)return Mo(r[0]);for(let i of r){let s=i?.trim();if(s&&!/^cd\s+/.test(s.toLowerCase())&&!Mo(s))return!1}return!0}o(Tu,"isSafeDynamicContextCommand");function Ko(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(Ko,"parseArguments");var Ve=class{static{o(this,"VariableResolver")}context;constructor(t){this.context=t}async resolve(t,n){let r=t,i=Ko(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 l=await this.executeDynamicCommand(c);s=s.replace(a,l)}catch(l){let d=l instanceof Error?l.message:String(l);s=s.replace(a,`[Error: ${d}]`)}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.assertDynamicContextAllowed?.(t),this.context.executeDynamicContext){let n=await this.context.executeDynamicContext(t,this.context.workingDirectory);return typeof n=="string"?n.trim():""}if(!Tu(t))throw new Error("Unsafe dynamic context command blocked. Only simple read-only commands are allowed in !`...` blocks.");try{return Eu(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 $u(e){return new Ve(e)}o($u,"createResolver");async function le(e,t,n){return new Ve(n).resolve(e,t)}o(le,"resolveSkillContent");var Lu=8e3,Cu=160;function Uo(e,t){let n=e.replace(/\s+/gu," ").trim();return n.length<=t?n:`${n.slice(0,t-1).replace(/[\uD800-\uDBFF]$/,"")}\u2026`}o(Uo,"catalogText");function Wo(e){let t=e.filter(c=>!c.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.","",'If the current task context already contains an "Active skill invocation" or a host-expanded Skill block for the referenced name, that explicit user invocation is already complete. Follow the expanded instructions and do NOT call the `skill` tool for that Skill again.',"",'When users reference a "slash command" or "/<something>" (e.g. "/feature-list-tracker", "/skill:foo") and the host has not already expanded it, they are referring to a skill. Invoke it via the `skill` tool with the skill name.',"","**BLOCKING REQUIREMENT**: When a model-visible Skill matches the user's request and the host has not already expanded it, 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 model-discovered Skill without actually calling the `skill` tool. This rule does not apply to a host-expanded active user invocation, which must not be called again. 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.",""],r=n.join(`
192
- `).length+1,i=0,s=0;for(let c of t){let l=Uo(c.description,500),d=c.argumentHint?Uo(c.argumentHint,80):"",u=`- ${c.name}:${d?` ${d}`:""} ${l}`;r+u.length+1>Lu-Cu||(n.push(u),r+=u.length+1,i++,(l!==c.description||d!==(c.argumentHint??""))&&s++)}let a=t.length-i;if(s>0||a>0){let c=`[Skill catalog shortened: ${s} entries shortened; ${a} Skills omitted. Explicit invocation of registered Skills remains available.]`;n.push("",c),E({source:"agent:skills",level:"warn",message:c,detail:{code:"skill_catalog_shortened",total:t.length,included:i,omitted:a,shortened:s}})}return n.push(""),n.join(`
193
- `)}o(Wo,"formatSkillsSystemPrompt");var jt=class{static{o(this,"SkillRegistry")}skillsByName=new Map;fullSkillsByName=new Map;incompleteDiscovery=!1;get discoveryIncomplete(){return this.incompleteDiscovery}projectRoot;customPaths;constructor(t,n){this.projectRoot=t,this.customPaths=n}async discover(){let t=await Ot(this.projectRoot,this.customPaths);this.incompleteDiscovery=t.errors.length>0,this.fullSkillsByName.clear(),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)E({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 Yt(r.path,r.source);if(this.skillsByName.get(t)!==r)return this.loadFull(t);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{success:!0,content:await le(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()}getSystemPromptSnippet(){return Wo(this.list())}has(t){return this.skillsByName.has(t)}get size(){return this.skillsByName.size}},Ee=null,Bo;function Ft(e,t){return Ee&&e!==void 0&&Bo!==e&&(Ee=null),Ee||(Ee=new jt(e,t),Bo=e),Ee}o(Ft,"getSkillRegistry");async function Ru(e,t){let n=Ft(e,t);return await n.discover(),n}o(Ru,"initializeSkillRegistry");function Nu(){Ee=null}o(Nu,"resetSkillRegistry");var Ye=class{static{o(this,"SkillExecutor")}context;constructor(t){this.context=t}async execute(t,n,r){let i=Ft();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 le(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(`
194
- `)}parseAllowedTools(t){return t?t.split(",").map(n=>n.trim()).filter(Boolean):[]}};function Du(e){return new Ye(e)}o(Du,"createExecutor");async function Ou(e,t,n,r){return new Ye(n).execute(e,t,r)}o(Ou,"executeSkill");function zo(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&apos;")}o(zo,"escapeXml");var tr=120;function Mt(e){return e.replace(/\\/g,"/")}o(Mt,"formatDisplayPath");function ju(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(ju,"collectSupportFiles");function Fu(e){let t=ju(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}/: ${Mt(`${e.path}/${i}`)} (${s.length} files)`);r.push("","Support file inventory:");for(let{folder:i,file:s}of t.slice(0,tr))r.push(`- ${i}/${s.relativePath}: ${Mt(s.path)}`);return t.length>tr&&r.push(`- ... ${t.length-tr} more files under ${Mt(e.path)}`),r}o(Fu,"buildSupportFileContext");function Mu(e,t,n){let r=[];r.push(`<skill name="${zo(e.name)}" location="${zo(e.path)}">`),r.push(""),r.push(`Skill root: ${Mt(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=Fu(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(`
195
- `)}o(Mu,"buildSkillBlock");async function Ku(e,t,n){let r=await le(e.content,t,n);return{content:Mu(e,r,t),disableModelInvocation:e.disableModelInvocation??!1,skill:e}}o(Ku,"expandSkillForLLM");function Uu(e,t){let n=`Skill activated: ${e}`;return t.trim()&&(n+=` with arguments: ${t}`),n}o(Uu,"formatSkillActivationMessage");import{writeFile as Yo}from"node:fs/promises";import te from"node:path";import{existsSync as Jo}from"node:fs";import{mkdir as Bu,readFile as nr,readdir as Wu,stat as qo,writeFile as Dw}from"node:fs/promises";import zu from"node:os";import O from"node:path";import{fileURLToPath as rr,pathToFileURL as Go}from"node:url";import Hu from"yaml";var de=null;async function ir(){let e=O.dirname(rr(import.meta.url)),t=O.resolve(e,"../../../sdk-skills.js");return Jo(t)?import(Go(t).href):import("./skills-TJP6BLZJ.js")}o(ir,"loadKodaXSkills");function Xo(e){de=e}o(Xo,"setKodaXSDKForSkillCreator");async function ee(){if(de)return de;let e=O.dirname(rr(import.meta.url)),t=[],n=O.resolve(e,"../../../index.js");if(Jo(n))return de=await import(Go(n).href),de;t.push(`relative SDK path not found: ${n}`);try{return de=await import(["@kodax-ai","kodax"].join("/")),de}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}.
202
+ }`,A=Object.freeze({status:"terminated"}),re=Object.freeze({status:"already-exited"}),g=Object.freeze({status:"unknown"});function W(e){return e.exitCode!==null||e.signalCode!==null}o(W,"isChildProcessExited");function ut(e,t){return W(e)?Promise.resolve(!0):new Promise(n=>{let r=!1,i=o(c=>{r||(r=!0,clearTimeout(a),e.off("exit",s),e.off("error",s),n(c))},"finish"),s=o(()=>i(!0),"onExit"),a=setTimeout(()=>i(!1),t);a.unref?.(),e.once("exit",s),e.once("error",s)})}o(ut,"waitForChildProcessExit");function ge(e,t){let n=!1;try{process.kill(-e,t),n=!0}catch{}try{process.kill(e,t),n=!0}catch{}return n}o(ge,"signalPosixPidTree");function mn(e){try{return process.kill(e,0),!0}catch(t){return t.code!=="ESRCH"}}o(mn,"signalTargetExists");function ft(e){return mn(-e)||mn(e)}o(ft,"isPosixPidTreeAlive");async function pt(e,t){let n=Date.now()+t;for(;Date.now()<n;){if(!ft(e))return!0;await new Promise(r=>setTimeout(r,50))}return!ft(e)}o(pt,"waitForPosixPidTreeExit");function xa(e){let t=e.trim();if(!t)return[];try{let n=JSON.parse(t);return(Array.isArray(n)?n:[n]).flatMap(i=>{if(typeof i!="object"||i===null)return[];let s=i,a=Number(s.pid),c=Number(s.parentPid),l=typeof s.creationTime=="string"?s.creationTime:String(s.creationTime??"0");return!Number.isFinite(a)||a<=0||!Number.isFinite(c)?[]:[{pid:a,parentPid:c,creationTime:/^\d+$/.test(l)?l:"0"}]})}catch{return[]}}o(xa,"parseWindowsProcessSnapshotJson");function Ia(e){let t=/^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})\.(\d{6})([+-])(\d{3})$/.exec(e);if(!t)return;let[,n,r,i,s,a,c,l,d,u]=t,f=Date.UTC(Number(n),Number(r)-1,Number(i),Number(s),Number(a),Number(c),Number(l.slice(0,3))),m=Number(u)*6e4*(d==="+"?1:-1),h=f-m;if(Number.isFinite(h))return{identity:(BigInt(h)+11644473600000n).toString(),unixMs:h}}o(Ia,"parseWmicCreationTime");function Ea(){let e=["$cutoff = [DateTime]::UtcNow","$items = try { @(Get-CimInstance Win32_Process -ErrorAction Stop) } catch { @(Get-WmiObject Win32_Process -ErrorAction Stop) }","$rows = @($items | ForEach-Object {"," $creationTime = '0'"," try {"," $created = $_.CreationDate"," if ($created -isnot [DateTime]) { $created = [System.Management.ManagementDateTimeConverter]::ToDateTime([string]$created) }"," $created = $created.ToUniversalTime()"," if ($created -le $cutoff) { $creationTime = ([long][Math]::Floor($created.ToFileTimeUtc() / 10000)).ToString() }"," } catch {}"," [PSCustomObject]@{ pid = [int]$_.ProcessId; parentPid = [int]$_.ParentProcessId; creationTime = $creationTime }","})","$rows | ConvertTo-Json -Compress"].join(`
203
+ `),t=Date.now(),n=ie("powershell.exe",["-NoProfile","-NonInteractive","-Command",e],{encoding:"utf8",timeout:z,windowsHide:!0});if(!n.error&&n.status===0){let a=xa(n.stdout);if(a.length>0)return a}oe("process-snapshot-cim",n,t,!1);let r=Date.now(),i=ie("wmic",["process","get","CreationDate,ParentProcessId,ProcessId","/format:list"],{encoding:"utf8",timeout:z,windowsHide:!0});if(i.error||i.status!==0){oe("process-snapshot-wmic",i,r,!1);return}let s=i.stdout.split(/\r?\n\s*\r?\n/).flatMap(a=>{let c=new Map(a.split(/\r?\n/).flatMap(m=>{let h=m.indexOf("=");return h<0?[]:[[m.slice(0,h),m.slice(h+1)]]})),l=Number(c.get("ProcessId")),d=Number(c.get("ParentProcessId")),u=c.get("CreationDate"),f=u===void 0?void 0:Ia(u);return!Number.isFinite(l)||l<=0||!Number.isFinite(d)||f===void 0||f.unixMs>r?[]:[{pid:l,parentPid:d,creationTime:f.identity}]});return s.length>0?s:void 0}o(Ea,"readWindowsProcessSnapshotFallback");function Pa(){let e=["$source = @'",ii,"'@","Add-Type -TypeDefinition $source","[KodaXNativeProcessSnapshot]::ReadRows()"].join(`
204
+ `),t=Date.now(),n=ie("powershell.exe",["-NoProfile","-NonInteractive","-Command",e],{encoding:"utf8",timeout:z,windowsHide:!0});if(n.error||n.status!==0){oe("process-snapshot-native",n,t,!1);return}let r=oi(n.stdout);return r===void 0&&oe("process-snapshot-native",n,t,!1),r}o(Pa,"readWindowsProcessSnapshotNative");function oi(e){let t=e.split(/\r?\n/).map(r=>r.trim()).filter(Boolean);if(t.some(r=>!/^\d+,\d+,\d+$/.test(r)))return;let n=t.flatMap(r=>{let[i,s,a="0"]=r.split(",",3),c=Number(i),l=Number(s);return!Number.isFinite(c)||c<=0||!Number.isFinite(l)?[]:[{pid:c,parentPid:l,creationTime:a}]});return n.length>0?n:void 0}o(oi,"parseWindowsNativeProcessRows");function ti(){return Pa()??Ea()}o(ti,"readWindowsProcessSnapshotUncached");var hn,gn=!1,De=0;function Q(){return De<=0?ti():(gn||(hn=ti(),gn=!0),hn)}o(Q,"readWindowsProcessSnapshot");function si(){hn=void 0,gn=!1}o(si,"invalidateSharedWindowsProcessSnapshot");async function Um(e){De+=1;try{return await e()}finally{De-=1,De===0&&si()}}o(Um,"withSharedWindowsProcessSnapshot");function ai(e){return[`foreach ($processId in @(${e.join(",")})) {`,' $target = $null; $creationTime = "0"'," try {"," $target = [System.Diagnostics.Process]::GetProcessById($processId)"," [long]$remainder = 0"," $creationTime = ([Math]::DivRem($target.StartTime.ToFileTimeUtc(), [long]10000, [ref]$remainder)).ToString([System.Globalization.CultureInfo]::InvariantCulture)",' } catch { $creationTime = "0" } finally { if ($null -ne $target) { $target.Dispose() } }',' [Console]::Out.WriteLine("$processId,$creationTime")',"}"].join(`
205
+ `)}o(ai,"windowsProcessStartIdentitiesScript");function ci(e,t){let n=e.trim().split(/\r?\n/);if(!(n.length!==t.length||n.some((r,i)=>!r.startsWith(`${t[i]},`)||!/^\d+,\d+$/.test(r))))return new Map(n.map(r=>{let[i,s]=r.split(",");return[Number(i),s]}))}o(ci,"parseWindowsProcessStartIdentities");function Aa(e){let t=Date.now(),n=ie("powershell.exe",["-NoProfile","-NonInteractive","-Command",ai(e)],{encoding:"utf8",timeout:z,windowsHide:!0}),r=ci(n.stdout??"",e);if(n.error||n.status!==0||r===void 0){oe("process-start-identities",n,t,!1);return}return r}o(Aa,"readWindowsProcessStartIdentities");function Ta(e){let t=[...new Set(e.filter(r=>Number.isInteger(r)&&r>0))];if(process.platform!=="win32")return new Map(t.map(r=>[r,mt(r)]));if(t.length===0)return new Map;let n=(De<=0?Aa(t):void 0)??new Map(Q()?.map(r=>[r.pid,r.creationTime]));return new Map(t.map(r=>{let i=n.get(r);return[r,i==="0"?void 0:i]}))}o(Ta,"readProcessStartIdentities");function mt(e){if(!Number.isInteger(e)||e<=0)return;if(process.platform==="win32"){let r=Ta([e]).get(e);return r===void 0&&E({source:"runtime:windows",level:"warn",message:"Windows process start identity is unavailable.",detail:{stage:"process-start-identity",pid:e,available:!1}}),r}if(process.platform==="linux")try{let r=Sa(`/proc/${e}/stat`,"utf8"),i=r.slice(r.lastIndexOf(")")+2).trim().split(/\s+/);return i[19]===void 0?void 0:`linux:${i[19]}`}catch{return}let t=ie("ps",["-o","lstart=","-p",String(e)],{encoding:"utf8",timeout:z,windowsHide:!0}),n=t.status===0?t.stdout.trim():"";return n===""?void 0:`${process.platform}:${n}`}o(mt,"readProcessStartIdentity");var Y;function Bm(){return process.platform!=="win32"?!1:Y!==void 0?(E({source:"runtime:windows",level:"debug",message:"Using cached Windows Job probe result.",detail:{stage:"job-membership",cached:!0,available:Y}}),Y):($a(),Y===!0)}o(Bm,"isCurrentProcessWindowsJobContained");function $a(){if(process.platform!=="win32")return;let e=Number.parseInt(process.env.KODAX_DAEMON_JOB_SUPERVISOR_PID??"",10);if(process.env.KODAX_DAEMON_JOB_CONTAINED!=="1"||!process.env.KODAX_DAEMON_JOB_NAME||!Number.isSafeInteger(e)||e<=0){Y=!1,E({source:"runtime:windows",level:"warn",message:"Windows Job supervisor metadata is unavailable.",detail:{stage:"job-membership",cached:!1,available:!1,reason:"supervisor-metadata"}});return}let t=Date.now(),n=ie("powershell.exe",["-NoProfile","-NonInteractive","-Command",_a+`
206
+ `+ai([process.pid,e])],{encoding:"utf8",timeout:5e3,windowsHide:!0,env:{...process.env,KODAX_INTERNAL_JOB_QUERY_SOURCE:Buffer.from(ri,"utf8").toString("base64")}}),r=n.stdout?.trim().split(/\r?\n/)??[];if(Y=n.status===0&&r[0]==="1",oe("job-membership",n,t,Y),!Y)return;let i=ci(r.slice(1).join(`
207
+ `),[process.pid,e]),s=i?.get(process.pid),a=i?.get(e);return{processStartIdentity:s==="0"?void 0:s,supervisorProcessStartIdentity:a==="0"?void 0:a}}o($a,"readCurrentProcessWindowsJobIdentity");async function Wm(e){if(process.platform!=="win32"||!/^Global\\(?:KodaXDaemonJob|KodaXEffect)-[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(e))return;let t=String.raw`
208
+ $ErrorActionPreference = 'Stop'
209
+ $source = [Text.Encoding]::UTF8.GetString([Convert]::FromBase64String($env:KODAX_INTERNAL_JOB_QUERY_SOURCE))
210
+ Add-Type -TypeDefinition $source
211
+ [Console]::Out.Write([KodaXWindowsJobMembership]::ActiveProcessCount($env:KODAX_INTERNAL_JOB_QUERY_NAME))
212
+ `,n=Date.now();return new Promise(r=>{va("powershell.exe",["-NoProfile","-NonInteractive","-Command",t],{encoding:"utf8",timeout:5e3,windowsHide:!0,env:{...process.env,KODAX_INTERNAL_JOB_QUERY_NAME:e,KODAX_INTERNAL_JOB_QUERY_SOURCE:Buffer.from(ri,"utf8").toString("base64")}},(i,s)=>{let a=s?.trim()??"",c=/^\d+$/.test(a)?Number(a):void 0,l=i===null&&c!==void 0&&Number.isSafeInteger(c)&&c<=4294967295;oe("job-active-processes",{error:i??void 0,status:i===null?0:typeof i.code=="number"?i.code:null},n,l),r(l?c:void 0)})})}o(Wm,"readWindowsJobActiveProcessCount");function li(e,t,n){let r=new Map;for(let c of e)r.set(c.parentPid,[...r.get(c.parentPid)??[],c]);let i=[],s=[{pid:t,...n===void 0?{}:{creationTime:n},ancestryVerified:n!==void 0&&n!=="0"}],a=new Set([t]);for(;s.length>0;){let c=s.shift();if(c===void 0)break;for(let l of r.get(c.pid)??[]){if(a.has(l.pid)||!La(l.creationTime,c.creationTime))continue;a.add(l.pid);let d=c.ancestryVerified&&l.creationTime!=="0";i.push(d?l:{...l,creationTime:"0"}),s.push({pid:l.pid,creationTime:l.creationTime,ancestryVerified:d})}}return i}o(li,"collectDescendantIdentities");function La(e,t){if(e==="0"||t===void 0||t==="0")return!0;try{return BigInt(e)>=BigInt(t)}catch{return!1}}o(La,"windowsCreationAtLeast");function Ca(e,t=Q()){if(t===void 0)return;let n=new Set(t.filter(i=>i.creationTime==="0").map(i=>i.pid));if(e.some(i=>n.has(i.pid)))return;let r=new Set(t.filter(i=>i.creationTime!=="0").map(i=>`${i.pid}:${i.creationTime}`));return new Set(e.filter(i=>i.creationTime!=="0").filter(i=>r.has(`${i.pid}:${i.creationTime}`)).map(i=>i.pid))}o(Ca,"currentCapturedWindowsPids");function we(e,t=Q()){if(t===void 0)return;let n=Ca([e.root,...e.descendants],t);if(n!==void 0){if(n.size>0)return!1;if(e.completeTree)return e.uncertainDescendantPids.every(r=>!t.some(i=>i.pid===r))?!0:void 0}}o(we,"capturedWindowsProcessesGone");function Ra(e){return[e.root.pid,...e.descendants.map(t=>t.pid),...e.uncertainDescendantPids].some(mn)}o(Ra,"capturedWindowsPidMayBeAlive");async function ni(e,t){let n=Date.now()+t;for(;Date.now()<n;){if(!Ra(e))return we(e)===!0;await new Promise(r=>setTimeout(r,50))}return we(e)===!0}o(ni,"waitForCapturedWindowsProcessesExit");var di="KODAX_TERMINATION_COMPLETED",ui="KODAX_SNAPSHOT_COMPLETED";function Na(e,t){let n=e.trim().split(/\r?\n/),r=n.indexOf(di),i=n.indexOf(ui);return{terminationAttempted:t||r>=0,snapshot:t&&r>=0&&i>r?oi(n.slice(r+1,i).join(`
213
+ `)):void 0}}o(Na,"readWindowsTerminationResult");function wn(e,t,n=!1){let r=[...e].reverse().flatMap(c=>/^\d+$/.test(c.creationTime)?[`[KodaXNativeProcessSnapshot]::TerminateExact(${c.pid}, [UInt64]${c.creationTime}) | Out-Null`]:[]);if(r.length===0)return{terminationAttempted:!1};let i=["$source = @'",ii,"'@","Add-Type -TypeDefinition $source",...r,...n?[`[Console]::Out.WriteLine('${di}')`,"[Console]::Out.Flush()","[Console]::Out.Write([KodaXNativeProcessSnapshot]::ReadRows())",`[Console]::Out.WriteLine('${ui}')`,"[Console]::Out.Flush()"]:[]].join(`
214
+ `),s=ie("powershell.exe",["-NoProfile","-NonInteractive","-Command",i],{encoding:"utf8",timeout:t,windowsHide:!0}),a=Na(s.stdout??"",!s.error&&s.status===0);return a.terminationAttempted&&si(),a}o(wn,"terminateCapturedWindowsProcesses");function Oe(e,t){if(e==null)return t;if(t===void 0)return e;if(e.root.pid!==t.root.pid||e.root.creationTime!==t.root.creationTime)return t;let n=new Map;for(let r of[...t.descendants,...e.descendants])n.set(`${r.pid}:${r.creationTime}`,r);return{root:e.root,descendants:[...n.values()],uncertainDescendantPids:[...new Set([...t.uncertainDescendantPids,...e.uncertainDescendantPids])],completeTree:e.completeTree||t.completeTree}}o(Oe,"mergeWindowsProcessTreeCaptures");var j=new WeakMap,je=new WeakMap;function zm(e,t,n){let r={verified:!1,terminate:n};je.set(e,r),t.then(()=>{r.verified=!0},()=>{})}o(zm,"trackChildProcessTreeContainment");function Hm(e){return je.get(e)?.verified===!0}o(Hm,"isChildProcessTreeCleanupVerified");function Jm(e){return je.has(e)}o(Jm,"hasChildProcessTreeContainment");function qm(e){if(je.has(e)||process.platform!=="win32"||e.pid===void 0)return;let t=j.get(e);if(t!==void 0&&!W(e)){let i=fi(e.pid,t.root.creationTime);return i!=null&&j.set(e,Oe(i,t)??t),t.root.creationTime}let n=Q();if(t!==void 0&&W(e)){if(n===void 0)return t.root.creationTime;let i=n.find(a=>a.pid===e.pid);if(i!==void 0&&i.creationTime!==t.root.creationTime)return t.root.creationTime;let s=li(n,t.root.pid,t.root.creationTime);return j.set(e,Oe({root:t.root,descendants:s.filter(a=>a.creationTime!=="0"),uncertainDescendantPids:s.filter(a=>a.creationTime==="0").map(a=>a.pid),completeTree:t.completeTree},t)??t),t.root.creationTime}let r=n?.find(i=>i.pid===e.pid&&i.creationTime!=="0");if(r===void 0&&n!==void 0&&!W(e)&&(r=Q()?.find(i=>i.pid===e.pid&&i.creationTime!=="0")),!(r===void 0||W(e)))return j.set(e,{root:r,descendants:[],uncertainDescendantPids:[],completeTree:!1}),r.creationTime}o(qm,"rememberChildProcessTree");function Gm(e){if(process.platform!=="win32")return;let t=j.get(e);if(t!==void 0)return[...[t.root,...t.descendants].map(n=>({pid:n.pid,creationTime:n.creationTime})),...t.uncertainDescendantPids.map(n=>({pid:n,creationTime:"0"}))]}o(Gm,"rememberedChildProcessTreeIdentities");function Xm(e){return j.get(e)?.completeTree===!0}o(Xm,"rememberedChildProcessTreeIsComplete");function fi(e,t){return kn(e,t,Q())}o(fi,"captureWindowsProcessTree");function kn(e,t,n){if(n===void 0)return;let r=n.find(s=>s.pid===e);if(r===void 0||r.creationTime==="0"||r.creationTime!==t)return null;let i=li(n,e,r.creationTime);return{root:r,descendants:i.filter(s=>s.creationTime!=="0"),uncertainDescendantPids:i.filter(s=>s.creationTime==="0").map(s=>s.pid),completeTree:!0}}o(kn,"captureWindowsProcessTreeInSnapshot");async function yn(e,t,n,r){if(r!==void 0&&we(e,r)===!0)return re;let i=[e.root,...e.descendants],s=wn(i,t,e.completeTree);return e.completeTree?s.snapshot!==void 0&&we(e,s.snapshot)===!0||await ni(e,n)?A:s.terminationAttempted?(wn(i,t),await ni(e,n)?A:g):g:g}o(yn,"killCapturedWindowsTree");function Da(e,t,n,r){let i=n?.find(s=>s.pid===e);if(!(i?.creationTime!==t||n===void 0))return{root:{...i,parentPid:0},descendants:n.filter(s=>s.pid!==e&&s.creationTime!=="0").map(s=>({...s,parentPid:0})),uncertainDescendantPids:n.filter(s=>s.pid!==e&&s.creationTime==="0").map(s=>s.pid),completeTree:r}}o(Da,"retainedWindowsProcessTree");async function Vm(e,t={}){if(process.platform==="win32"){let r=t.taskkillMs??z,i=t.forceMs??pn,s=t.expectedProcessStartIdentity;if(s===void 0)return g;let a=Da(e,s,t.expectedProcessTreeIdentities,t.expectedProcessTreeComplete===!0),c=Q(),l=kn(e,s,c),d=Oe(l,a);return d===void 0||d===null?g:yn(d,r,i,c)}if(t.expectedProcessStartIdentity!==void 0)return ft(e)?g:re;let n=t.forceMs??pn;return ge(e,"SIGTERM")?await pt(e,n)?A:(ge(e,"SIGKILL"),await pt(e,n)?A:g):re}o(Vm,"killPidTree");function Oa(e){return process.platform==="win32"?g:(ge(e,"SIGTERM"),ge(e,"SIGKILL"),ft(e)?g:A)}o(Oa,"killPidTreeSync");async function Ym(e,t={}){let n=je.get(e);if(n!==void 0){if(n.verified)return re;try{return await n.terminate(),n.verified?A:g}catch(u){return E({source:"runtime:windows",level:"warn",message:"Windows managed process Job cleanup is unconfirmed.",detail:u}),g}}let r=t.gracefulMs??ba,i=t.forceMs??pn,s=process.platform==="win32"?j.get(e):void 0,a=process.platform==="win32"&&e.pid!==void 0&&s!==void 0?Q():void 0,c=process.platform==="win32"&&e.pid!==void 0&&s!==void 0?kn(e.pid,s.root.creationTime,a):void 0,l=Oe(c,s);l!==void 0&&j.set(e,l);let d;if(t.gracefulStdinEnd&&!W(e)&&e.stdin?.writable){try{e.stdin.end()}catch{}if(await ut(e,r)&&process.platform!=="win32")return A}if(e.pid!==void 0&&process.platform!=="win32")return ge(e.pid,"SIGTERM")?await pt(e.pid,i)?A:(ge(e.pid,"SIGKILL"),await pt(e.pid,i)?A:g):re;if(W(e))return process.platform!=="win32"||e.pid===void 0?re:l===void 0||!l.completeTree&&l.descendants.length===0?g:yn(l,t.taskkillMs??z,i,a);if(process.platform==="win32"&&e.pid!==void 0)return l===void 0?g:(d=await yn(l,t.taskkillMs??z,i,a),await ut(e,i)?d.status==="unknown"?g:A:g);try{e.kill("SIGTERM")}catch{return W(e)&&d?.status!=="unknown"?A:g}if(await ut(e,i))return d?.status==="unknown"?g:A;try{e.kill("SIGKILL")}catch{}return await ut(e,i)?d?.status==="unknown"?g:A:g}o(Ym,"killChildProcessTree");function Qm(e){if(e.pid===void 0)return W(e)?re:g;if(process.platform==="win32"){let t=j.get(e);if(t===void 0)return g;let n=fi(e.pid,t.root.creationTime),r=Oe(n,t)??t;j.set(e,r);let i=wn([r.root,...r.descendants],z,r.completeTree);return r.completeTree&&(i.snapshot!==void 0&&we(r,i.snapshot)===!0||we(r)===!0)?A:g}return Oa(e.pid)}o(Qm,"killChildProcessTreeSync");var ki=5e3,Fe=10,vi=3e4,Ua=16,ht=8,pi,mi=!1;function Ba(){return mi||(pi=mt(process.pid),mi=!0),pi}o(Ba,"getCurrentProcessStartIdentity");var gt=class extends Error{static{o(this,"KodaXFileLockTimeoutError")}lockPath;code="kodax_file_lock_timeout";constructor(t){super(`KodaX file lock timed out: ${t}`),this.lockPath=t,this.name="KodaXFileLockTimeoutError"}};async function Ke(e,t,n=ki){let r=await Wa(e,n);try{return await t()}finally{await r()}}o(Ke,"withLearningFileLock");async function Wa(e,t=ki,n={}){await gi(Ka(e),{recursive:!0});let r=await Si(e,t,n.requireKnownOwner===!0),i=!1,s=!1,a;return async()=>{if(!s){if(a!==void 0)return a;a=(async()=>{i||(await r.handle.close(),i=!0),await wt(e,r.token),s=!0})();try{await a}finally{s||(a=void 0)}}}}o(Wa,"acquireLearningFileLock");async function oh(e,t={}){let n=await Ii(e,t.requireKnownOwner===!0);if(n===void 0||t.requireKnownOwner&&ye(n.raw)===void 0)return!1;let r;try{r=await Si(e,0,t.requireKnownOwner===!0,n.abandonedOwner)}catch(i){if(i instanceof gt)return!1;throw i}return await r.handle.close(),await wt(e,r.token),!0}o(oh,"reclaimStaleLearningFileLock");async function Si(e,t,n,r){let i=Date.now()+t,s=await za(e,r),a,c=!1;try{for(await Ha(s,i,e,r);;){await bi(s);try{let l=await Ya(e,s.token);try{await _n(s)}catch(d){let u=[d];try{await l.handle.close()}catch(f){u.push(f)}try{await wt(e,l.token)}catch(f){u.push(f)}throw u.length===1?d:new AggregateError(u,"learning lock ticket loss cleanup failed")}return a=l,a}catch(l){let d=await Za(l,e);if(d==="retry_missing"){if(c)throw l;c=!0,await Me(Fe);continue}if(d==="not_contended")throw l;c=!1;let u=await Ii(e,n,r);if(u!==void 0&&(!n||ye(u.raw)!==void 0)&&await Qa(e,u))continue;if(Date.now()>=i)throw $i(e);await Me(Fe)}}}finally{try{await Ei(s.path,s.raw)}catch(l){if(a===void 0)throw l;let d=[l];try{await a.handle.close()}catch(u){d.push(u)}try{await wt(e,a.token)}catch(u){d.push(u)}throw d.length===1?l:new AggregateError(d,"learning lock acquisition cleanup failed")}}}o(Si,"acquireLock");async function za(e,t){let n=`${e}.queue`,r=ja(),i=Ai(r),s=vn(n,`choosing-${r}.lock`);await gi(n,{recursive:!0}),await hi(s,i);try{await xi(n,e,s,t),await _i(s,i,"choosing entry");let a=await Ja(n),c=Math.max(0,...a.map(u=>u.number))+1;if(!Number.isSafeInteger(c))throw new Error("learning lock ticket overflow");let l=`ticket-${String(c).padStart(Ua,"0")}-${r}.lock`,d=vn(n,l);return await hi(d,i),{queuePath:n,path:d,name:l,raw:i,token:r}}finally{await Ei(s,i)}}o(za,"createLockTicket");async function Ha(e,t,n,r){for(;;){await bi(e),await xi(e.queuePath,n,e.path,r),await _n(e);let i=await bn(e.queuePath),s=i.some(c=>c.startsWith("choosing-")),a=i.map(kt).filter(c=>c!==void 0).sort(qa)[0];if(!s&&a?.name===e.name)return;if(Date.now()>=t)throw $i(n);await Me(Fe)}}o(Ha,"waitForTicketTurn");async function hi(e,t){let n=await wi(e,"wx");try{try{await n.writeFile(t,"utf8")}finally{await n.close()}}catch(r){throw await ke(e),r}}o(hi,"createOwnerFile");async function _n(e){await _i(e.path,e.raw,"ticket")}o(_n,"assertTicketOwned");async function bi(e){await _n(e);try{let t=new Date;await Ma(e.path,t,t)}catch(t){throw x(t,"ENOENT")?new Error(`learning store lock ticket lost: ${e.path}`):t}}o(bi,"heartbeatLockTicket");async function _i(e,t,n){try{if(await Z(e,"utf8")!==t)throw new Error(`learning store lock ${n} lost: ${e}`)}catch(r){throw x(r,"ENOENT")?new Error(`learning store lock ${n} lost: ${e}`):r}}o(_i,"assertQueueEntryOwned");async function Ja(e){return(await bn(e)).map(kt).filter(t=>t!==void 0)}o(Ja,"listQueueTickets");function kt(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(kt,"parseQueueTicket");function qa(e,t){return e.number-t.number||e.name.localeCompare(t.name)}o(qa,"compareQueueTickets");async function xi(e,t,n,r){let i=await bn(e);await Promise.all(i.filter(Ga).map(async s=>{let a=vn(e,s);a!==n&&await Xa(a,s,t,r)&&await ke(a)}))}o(xi,"cleanupAbandonedQueueEntries");function Ga(e){return/^choosing-[0-9a-f-]+\.lock$/i.test(e)||kt(e)!==void 0}o(Ga,"isQueueEntryName");async function Xa(e,t,n,r){try{let i=await yt(e),s=ye(await Z(e,"utf8"));return s?.released===!0||s!==void 0&&!xn(s.pid)||s!==void 0&&Ti(s,r)?!0:Date.now()-i.mtimeMs<=vi?!1:s===void 0||!Sn(s)?!0:s.token===void 0?!1:kt(t)===void 0?!0:!await Va(n,s.token)}catch(i){if(x(i,"ENOENT")||["EPERM","EACCES","EBUSY"].some(s=>x(i,s)))return!1;throw i}}o(Xa,"isAbandonedQueueEntry");async function Va(e,t){try{return ye(await Z(e,"utf8"))?.token===t}catch(n){if(x(n,"ENOENT"))return!1;if(["EPERM","EACCES","EBUSY"].some(r=>x(n,r)))return!0;throw n}}o(Va,"queueTicketOwnsCoordinatorLock");async function Ya(e,t){let n=await wi(e,"wx");try{return await n.writeFile(Ai(t),"utf8"),{handle:n,token:t}}catch(r){throw await n.close(),await ke(e),r}}o(Ya,"createLock");async function Ii(e,t=!1,n){try{let r=await yt(e),i=await Z(e,"utf8"),s=ye(i),a=s?.token!==void 0&&await tc(e,s.token),c=s!==void 0&&(!xn(s.pid)||Ti(s,n)||t&&!!s.processStartIdentity&&!Sn(s));return!a&&!c&&Date.now()-r.mtimeMs<=vi?void 0:a||c||s===void 0||!Sn(s)?{raw:i,mtimeMs:r.mtimeMs,size:r.size,...c&&s?{abandonedOwner:s}:{}}:void 0}catch(r){if(["ENOENT","EPERM","EACCES","EBUSY"].some(i=>x(r,i)))return;throw r}}o(Ii,"observeStaleLock");async function Qa(e,t){try{let n=await yt(e);return n.mtimeMs!==t.mtimeMs||n.size!==t.size||await Z(e,"utf8")!==t.raw?!1:(await ke(e),!0)}catch(n){if(x(n,"ENOENT"))return!0;if(["EPERM","EACCES","EBUSY"].some(r=>x(n,r)))return!1;throw n}}o(Qa,"removeObservedStaleLock");async function Za(e,t){if(x(e,"EEXIST"))return"contended";if(!["EPERM","EACCES","EBUSY"].some(n=>x(e,n)))return"not_contended";try{return(await yt(t)).isFile()?"contended":"not_contended"}catch(n){if(x(n,"ENOENT"))return"retry_missing";throw e}}o(Za,"classifyExistingLockContention");async function wt(e,t){try{if(ye(await Z(e,"utf8"))?.token!==t)return;try{await ke(e);return}catch(r){try{await ec(e,t);return}catch(i){throw new AggregateError([r,i],"learning lock release marker and owner cleanup both failed")}}}catch(n){if(!x(n,"ENOENT"))throw n}}o(wt,"releaseLock");async function ec(e,t){for(let n=1;n<=ht;n+=1)try{await yi(Pi(e,t),`${t}
215
+ `,"utf8");return}catch(r){if(!In(r)||n===ht)throw r;await Me(Fe)}}o(ec,"writeReleaseMarkerWithTransientRetry");async function Ei(e,t){let n;try{if(await Z(e,"utf8")!==t)throw new Error(`learning store lock queue entry lost: ${e}`);await yi(e,`${t.trimEnd()} released
216
+ `,"utf8")}catch(r){if(x(r,"ENOENT"))return;n=r}try{await ke(e)}catch(r){if(n===void 0&&In(r))return;throw n===void 0?r:new AggregateError([n,r],"learning lock queue marker and cleanup both failed")}}o(Ei,"releaseQueueEntry");async function tc(e,t){try{return(await Z(Pi(e,t),"utf8")).trim()===t}catch(n){if(["ENOENT","EPERM","EACCES","EBUSY"].some(r=>x(n,r)))return!1;throw n}}o(tc,"hasReleaseMarker");function Pi(e,t){return`${e}.${t}.released`}o(Pi,"releaseMarkerPath");function Ai(e){let t=Ba(),n=t===void 0?"":` identity=${Buffer.from(t).toString("base64url")}`;return`${process.pid} ${e}${n}
217
+ `}o(Ai,"lockOwnerRecord");function ye(e){let t=e.trim().split(/\s+/),n=Number(t.shift());if(!Number.isSafeInteger(n)||n<=0)return;let r,i,s=!1;for(let a of t){if(/^[0-9a-f-]+$/i.test(a)&&r===void 0){r=a;continue}if(a.startsWith("identity=")&&i===void 0){let c=a.slice(9);if(!/^[A-Za-z0-9_-]+$/.test(c)||(i=Buffer.from(c,"base64url").toString("utf8"),!i))return;continue}if(a==="released"&&!s){s=!0;continue}return}return{pid:n,...r===void 0?{}:{token:r},...i===void 0?{}:{processStartIdentity:i},released:s}}o(ye,"parseOwner");function xn(e){try{return process.kill(e,0),!0}catch(t){return!x(t,"ESRCH")}}o(xn,"isProcessAlive");function x(e,t){return typeof e=="object"&&e!==null&&"code"in e&&e.code===t}o(x,"isFileError");function Sn(e){if(!xn(e.pid))return!1;if(e.processStartIdentity===void 0)return!0;let t=mt(e.pid);return t===void 0||t===e.processStartIdentity}o(Sn,"isRecordedOwnerAlive");function Ti(e,t){return!!e.processStartIdentity&&e.pid===t?.pid&&e.processStartIdentity===t.processStartIdentity}o(Ti,"matchesAbandonedOwner");function In(e){return["EPERM","EACCES","EBUSY"].some(t=>x(e,t))}o(In,"isTransientFileContention");async function ke(e){for(let t=1;t<=ht;t+=1)try{await Fa(e,{force:!0});return}catch(n){if(x(n,"ENOENT"))return;if(!In(n)||t===ht)throw n;await Me(Fe)}}o(ke,"removeFileWithTransientRetry");function $i(e){return new gt(e)}o($i,"lockTimeout");async function Me(e){await new Promise(t=>setTimeout(t,e))}o(Me,"delay");var Ni=1;function F(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}o(F,"isRecord");function ac(e){return e==="pending"||e==="approved"||e==="rejected"}o(ac,"isReviewStatus");function Di(e){return e==="foreground_user"||e==="assistant_tool"||e==="background_learning"}o(Di,"isSkillWriteOrigin");function R(e){return Array.isArray(e)&&e.every(t=>typeof t=="string")}o(R,"isStringArray");function vt(e){return F(e)&&Object.values(e).every(t=>typeof t=="string")}o(vt,"isStringRecord");function cc(e){return e==="record_usage"||e==="create"||e==="patch"||e==="archive"||e==="quarantine"||e==="delete"||e==="consolidate"||e==="direct_mutation"}o(cc,"isSkillGovernanceAction");function lc(e){return e==="save_from_run"||e==="revise_capsule"||e==="add_skill_reference"||e==="report_only"}o(lc,"isWorkflowSuggestedAction");function Oi(e){return e==="low"||e==="medium"||e==="high"}o(Oi,"isLearningRisk");function dc(e){return e==="user"||e==="feedback"||e==="project"||e==="reference"||e==="semantic_memory"}o(dc,"isMemoryKind");function uc(e){return e==="foreground_user"||e==="assistant_tool"||e==="background_learning"||e==="external_provider"}o(uc,"isMemoryWriteOrigin");function fc(e){return e==="primary"||e==="subagent"||e==="workflow_child"||e==="cron"||e==="flush"||e==="compression"}o(fc,"isMemoryExecutionContext");function pc(e){return F(e)&&R(e.workflowCapsules)&&R(e.savedWorkflows)&&R(e.constructedAgents)&&R(e.promptReferences)&&(e.action==="none"||e.action==="rewrite_proposal"||e.action==="block_until_manual_review")}o(pc,"isConsumerImpact");function mc(e){return F(e)&&uc(e.writeOrigin)&&fc(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")&&R(e.sourceRefs)&&typeof e.completedTurn=="boolean"&&(e.claimKind===void 0||hc(e.claimKind))&&(e.claimKey===void 0||typeof e.claimKey=="string")&&(e.actionSignature===void 0||typeof e.actionSignature=="string")&&(e.reviewRationale===void 0||typeof e.reviewRationale=="string")&&(e.reviewRisk===void 0||Oi(e.reviewRisk))&&(e.persistenceKind===void 0||e.persistenceKind==="create"||e.persistenceKind==="evidence_update"||e.persistenceKind==="condition_refinement"||e.persistenceKind==="conflict")&&(e.targetRefId===void 0||typeof e.targetRefId=="string")&&(e.targetStorageUri===void 0||typeof e.targetStorageUri=="string")&&(e.authorizationTargetFingerprint===void 0||typeof e.authorizationTargetFingerprint=="string")&&(e.preconditions===void 0||typeof e.preconditions=="string")&&(e.applicability===void 0||gc(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(mc,"isMemoryMetadata");function hc(e){return e==="fact"||e==="policy"||e==="preference"||e==="procedure"||e==="episode"}o(hc,"isMemoryClaimKind");function gc(e){return!F(e)||typeof e.tenantId!="string"?!1:["workspaceId","userId","agentId","projectId","sessionId"].every(t=>e[t]===void 0||typeof e[t]=="string")}o(gc,"isMemoryApplicability");function wc(e){if(!F(e))return!1;let t=e.destination;return typeof e.proposalId!="string"||!Di(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"&&R(e.sourceTraceIds)&&typeof e.confidence=="number":t==="workflow_handoff"?e.userLabel==="runnable_workflow"&&R(e.evidenceRunIds)&&R(e.sourceTraceIds)&&lc(e.suggestedAction)&&typeof e.whyWorkflowNotSkill=="string"&&R(e.requiredWorkflowEvidence)&&Oi(e.risk)&&pc(e.consumerImpact)&&e.appliedByF224===!1:t==="memdir_handoff"?e.userLabel==="context_note"&&dc(e.memoryKind)&&typeof e.body=="string"&&mc(e.metadata):t==="reasoning_handoff"?e.userLabel==="reasoning_report"&&typeof e.title=="string"&&typeof e.body=="string"&&R(e.sourceTraceIds):!1}o(wc,"isReviewableProposal");function yc(e){return F(e)?e.kind==="write"?typeof e.relativePath=="string"&&typeof e.content=="string":e.kind==="delete"?typeof e.relativePath=="string":!1:!1}o(yc,"isSkillMutationChange");function kc(e){if(!F(e)||e.kind!=="skill"||typeof e.skillRoot!="string"||e.skillRoot.length===0||!Array.isArray(e.changes)||!e.changes.every(yc))return!1;let t=e.governance;return!(!F(t)||!cc(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"||!Di(t.origin)||t.pinned!==void 0&&typeof t.pinned!="boolean"||e.snapshotRoot!==void 0&&typeof e.snapshotRoot!="string")}o(kc,"isStoredLearningApplyPlan");function vc(e,t,n){if(!F(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,l=e.updatedAt,d=e.appliedAt,u=e.appliedChangedPaths,f=e.appliedSnapshotPath,m=e.approvedBy,h=e.approvedAt,w=e.approvalPolicyId,y=e.approvalPolicyReason,I=e.approvalExpectedFingerprints,b=e.approvalResultingFingerprints,ne=e.rejectedReason;if(typeof r!="string"||r.length===0){n.push(`proposal entry ${t} has no proposalId`);return}if(!ac(i)){n.push(`proposal entry ${r} has invalid status`);return}if(!wc(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 l!="string"){n.push(`proposal entry ${r} has invalid timestamps`);return}if(a!==void 0&&!kc(a)){n.push(`proposal entry ${r} has invalid apply plan`);return}if(d!==void 0&&typeof d!="string"){n.push(`proposal entry ${r} has invalid appliedAt`);return}if(u!==void 0&&!R(u)){n.push(`proposal entry ${r} has invalid applied changed paths`);return}if(m!==void 0&&m!=="user"&&m!=="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(w!==void 0&&typeof w!="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(I!==void 0&&!vt(I)){n.push(`proposal entry ${r} has invalid approvalExpectedFingerprints`);return}if(b!==void 0&&!vt(b)){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:l,...typeof d=="string"?{appliedAt:d}:{},...R(u)?{appliedChangedPaths:u}:{},...m==="user"||m==="host"?{approvedBy:m}:{},...typeof h=="string"?{approvedAt:h}:{},...typeof w=="string"?{approvalPolicyId:w}:{},...typeof y=="string"?{approvalPolicyReason:y}:{},...vt(I)?{approvalExpectedFingerprints:I}:{},...vt(b)?{approvalResultingFingerprints:b}:{},...typeof f=="string"?{appliedSnapshotPath:f}:{},...typeof ne=="string"?{rejectedReason:ne}:{}}}o(vc,"parseStoredProposal");function Sc(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(!F(t))return{proposals:[],warnings:["learning proposal store root is not an object"]};if(t.version!==Ni)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)=>vc(s,a,n)).filter(s=>s!==void 0),warnings:n}}o(Sc,"parseStoreDocument");async function ji(e,t){let n={version:Ni,proposals:t},r=Ci(e);await Li(r,{recursive:!0});let i=Ri(r,`.${sc(e)}.kodax-${process.pid}-${Date.now().toString(36)}.tmp`);try{await oc(i,`${JSON.stringify(n,null,2)}
218
+ `,"utf8"),await rc(i,e)}catch(s){throw await ic(i,{force:!0}),s}}o(ji,"writeStoreDocument");async function H(e){let t;try{t=await nc(e,"utf8")}catch(n){if(n.code==="ENOENT")return{proposals:[],warnings:[]};throw n}return Sc(t)}o(H,"readLearningProposalStore");async function En(e,t,n={}){return Fi(e,async()=>{await n.revalidateAuthority?.();let r=await H(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(d=>d.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},l=a?r.proposals.map(d=>d.proposalId===t.proposalId?c:d):[...r.proposals,c];return await n.revalidateAuthority?.(),await ji(e,l),c})}o(En,"upsertLearningProposal");function bc(e,t){let n=Ne(e),r=n?Ce(n):`local-${Re(e)}`;return t===void 0?D("projects",r,"learning","proposals.json"):Ri(t,"projects",r,"learning","proposals.json")}o(bc,"resolveLearningProposalStore");async function Ue(e,t,n,r={}){return Fi(e,async()=>{await r.revalidateAuthority?.();let i=await H(e);if(i.warnings.length>0)throw new Error(`refusing to write corrupt learning proposal store: ${i.warnings.join("; ")}`);let s=i.proposals.find(l=>l.proposalId===t);if(!s)throw new Error(`learning proposal not found: ${t}`);if(r.expectedStatus!==void 0&&s.status!==r.expectedStatus)throw new Error(`learning proposal ${t} is ${s.status}; expected ${r.expectedStatus}`);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 ji(e,i.proposals.map(l=>l.proposalId===t?c:l)),c})}o(Ue,"updateLearningProposalStatus");async function Fi(e,t){return await Li(Ci(e),{recursive:!0}),Ke(`${e}.lock`,t)}o(Fi,"withStoreWriteLock");function _c(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(_c,"ensureSkillProposal");function xc(e,t){let n=t==="skill_create"?"create":"patch";if(e.governance.action!==n)throw new Error(`skill ${t} requires governance action ${n}`)}o(xc,"ensureGovernanceMatchesProposal");function Ic(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(Ic,"ensureCreatePlanIncludesSkillFile");async function Pn(e){let t=_c(e);xc(e,t),Ic(e);let n=en(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 Br({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(Pn,"applySkillLearningProposal");import{readdir as Ec,readFile as Pc,stat as Ac}from"fs/promises";import{isAbsolute as Ki,join as Ui,relative as Tc,resolve as Mi}from"path";function Bi(e){return typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT"}o(Bi,"isMissingFile");function Wi(e){if(e.includes("\0")||Ki(e))return;let n=e.replace(/\\/g,"/").split("/");if(!(n.length===0||n.some(r=>r.length===0||r==="."||r==="..")))return n.join("/")}o(Wi,"normalizePlanRelativePath");function $c(e,t){let n=Tc(e,t);return n===""||!n.startsWith("..")&&!Ki(n)}o($c,"isInside");function zi(e,t){let n=Wi(t);if(n===void 0)return;let r=Mi(e),i=Mi(r,...n.split("/"));if($c(r,i))return{absolutePath:i,normalizedRelativePath:n}}o(zi,"resolvePlanTarget");async function Tn(e){try{return{exists:!0,content:await Pc(e,"utf8")}}catch(t){if(Bi(t))return{exists:!1};throw t}}o(Tn,"readUtf8IfExists");function Lc(e){let t=e.applyPlan;return t?.kind!=="skill"?[]:t.changes.map(n=>Wi(n.relativePath)??n.relativePath)}o(Lc,"plannedSkillChangedPaths");async function Cc(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=zi(t.skillRoot,n.relativePath);if(r===void 0)return!1;let i=await Tn(r.absolutePath);if(!i.exists||i.content!==n.content)return!1}return!0}o(Cc,"skillFilesAlreadyMatchPlan");async function Hi(e){let t=e.applyPlan;if(t?.kind!=="skill")return;let n=await at({proposalId:e.proposalId,skillRoot:t.skillRoot,...t.snapshotRoot!==void 0?{snapshotRoot:t.snapshotRoot}:{}}),r;try{r=await Ec(n.snapshotBase,{withFileTypes:!0})}catch(s){if(Bi(s))return;throw s}let i=[];for(let s of r){if(!s.isDirectory()||!s.name.startsWith(n.proposalPrefix))continue;let a=Ui(n.snapshotBase,s.name),c=await Ac(a);i.push({path:a,mtimeMs:c.mtimeMs})}return i.sort((s,a)=>a.mtimeMs-s.mtimeMs),i[0]?.path}o(Hi,"findLatestSnapshotPath");async function Rc(e){let t=e.applyPlan;if(t?.kind!=="skill")return;let n=await Hi(e);if(n!==void 0)for(let r of t.changes){if(r.kind!=="write")continue;let i=zi(t.skillRoot,r.relativePath);if(i===void 0)return;let s=await Tn(i.absolutePath);if(s.exists&&s.content===r.content)continue;let a=Ui(n,...i.normalizedRelativePath.split("/")),c=await Tn(a);if(!(!s.exists&&!c.exists)&&!(s.exists&&c.exists&&s.content===c.content))return{relativePath:i.normalizedRelativePath,snapshotPath:n}}}o(Rc,"findSnapshotConflict");function Ji(e){if(e.proposal.destination==="workflow_handoff")return e.proposal.consumerImpact}o(Ji,"getWorkflowConsumerImpact");function Nc(e){return Ji(e)?.action==="block_until_manual_review"}o(Nc,"requiresConsumerImpactAck");async function Dc(e,t){let n=await H(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(Dc,"readCurrentStoredProposal");async function An(e,t,n={}){let i=(n.now??(()=>new Date().toISOString()))(),s=n.appliedChangedPaths!==void 0||n.appliedSnapshotPath!==void 0;return Ue(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(An,"markApproved");async function $n(e,t,n={}){let r=await Dc(e,t.proposalId);if(r.status!=="pending")return{status:"blocked_not_pending",reviewStatus:r.status};if(t=r,t.applyPlan?.kind==="skill"){if(await Cc(t)){let c=await Hi(t),l=Lc(t);return{status:"approved_already_applied",proposal:await An(e,t,{appliedChangedPaths:l,...c!==void 0?{appliedSnapshotPath:c}:{},now:n.now}),changedPaths:l,...c!==void 0?{snapshotPath:c}:{}}}let i=await Rc(t);if(i!==void 0)return{status:"blocked_snapshot_conflict",...i};let s=await Pn({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 An(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(Nc(t)&&n.acknowledgeImpact!==!0){let i=Ji(t);return i===void 0?{status:"blocked_missing_apply_plan"}:{status:"blocked_consumer_impact",impact:i}}return{status:"approved_handoff",proposal:await An(e,t,{now:n.now})}}o($n,"approveStoredLearningProposal");function Oc(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(Oc,"ensureApplyPlanMatchesResult");async function Ln(e){Oc(e);let t=Zt(e.learning);if(t.destination==="discard"||t.destination==="trace_only")return{stored:!1,result:t};let n=await En(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(Ln,"recordProceduralLearning");import{mkdir as jc,readFile as Fc,rename as Mc,rm as Kc,writeFile as Uc}from"fs/promises";import{basename as Bc,dirname as Wc,join as zc}from"path";var St=1;function qi(e,t){let n=Ne(e),r=n?Ce(n):`local-${Re(e)}`;return D("projects",r,"learning",t)}o(qi,"projectLearningPath");function Hc(e){return qi(e,"skill-usage.json")}o(Hc,"resolveSkillUsageLedger");function Jc(e){return qi(e,"skill-trust.json")}o(Jc,"resolveSkillTrustLedger");function bt(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}o(bt,"isRecord");function qc(e){return e==="project"||e==="user"||e==="plugin"||e==="builtin"||e==="learned"||e==="external"}o(qc,"isGovernedSkillSource");function Gc(e){return e==="provisional"||e==="trusted"||e==="quarantined"||e==="archived"}o(Gc,"isSkillTrustState");function Xc(e){return bt(e)&&typeof e.skillName=="string"&&qc(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(Xc,"isUsageRecord");function Vc(e){return bt(e)&&typeof e.skillName=="string"&&(e.source==="project"||e.source==="user")&&e.ownership==="background_created"&&Gc(e.state)&&e.createdByAgent===!0&&typeof e.updatedAt=="string"&&(e.reason===void 0||typeof e.reason=="string")}o(Vc,"isTrustRecord");async function Gi(e,t){let n=Wc(e);await jc(n,{recursive:!0});let r=zc(n,`.${Bc(e)}.kodax-${process.pid}-${Date.now().toString(36)}.tmp`);try{await Uc(r,t,"utf8"),await Mc(r,e)}catch(i){throw await Kc(r,{force:!0}),i}}o(Gi,"writeAtomic");async function Xi(e){let t;try{t=await Fc(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(Xi,"readJsonDocument");async function Vi(e){let t=await Xi(e);if(t.warnings.length>0)return{records:[],warnings:t.warnings};if(t.parsed===void 0)return{records:[],warnings:[]};if(!bt(t.parsed)||t.parsed.version!==St||!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(Xc(i))return i;n.push(`usage record ${s} has invalid shape`)}).filter(i=>i!==void 0),warnings:n}}o(Vi,"readSkillUsageLedger");async function Yc(e,t){try{let n=await Vi(e);if(n.warnings.length>0)return{recorded:!1,warnings:n.warnings};let r=(t.now??(()=>new Date().toISOString()))(),i=n.records.find(d=>d.skillName===t.skillName&&d.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(d=>d.skillName===t.skillName&&d.source===t.source?a:d):[...n.records,a];return await Gi(e,`${JSON.stringify({version:St,records:c},null,2)}
219
+ `),{recorded:!0,record:a,warnings:[]}}catch(n){return{recorded:!1,warnings:[`failed to record skill usage: ${n instanceof Error?n.message:String(n)}`]}}}o(Yc,"recordSkillUsage");async function Yi(e){let t=await Xi(e);if(t.warnings.length>0)return{records:[],warnings:t.warnings};if(t.parsed===void 0)return{records:[],warnings:[]};if(!bt(t.parsed)||t.parsed.version!==St||!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(Vc(i))return i;n.push(`trust record ${s} has invalid shape`)}).filter(i=>i!==void 0),warnings:n}}o(Yi,"readSkillTrustLedger");async function Qc(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 Yi(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 Gi(e,`${JSON.stringify({version:St,records:s},null,2)}
220
+ `),{updated:!0,record:i}}o(Qc,"updateSkillTrustLedger");import{readdir as Zc,readFile as el,stat as tl}from"fs/promises";import{join as nl}from"path";var rl=1024*1024,il=new Set([".git","node_modules","dist","build",".turbo"]),ol=new Set([".json",".jsonl",".md",".mdx",".txt",".yml",".yaml",".js",".mjs",".cjs",".ts",".tsx"]);function sl(e){let t=e.lastIndexOf(".");return t>=0?e.slice(t).toLowerCase():""}o(sl,"extensionOf");function al(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}o(al,"escapeRegExp");function cl(e,t){let n=al(t);return new RegExp(`(^|[^a-zA-Z0-9_-])(?:/skill:|skill:|skills?["'\\s:\\[]+)?${n}([^a-zA-Z0-9_-]|$)`,"i").test(e)}o(cl,"hasSkillReference");async function ll(e,t){let n=await tl(e);if(!n.isFile()||n.size>rl||!ol.has(sl(e)))return!1;let r=await el(e,"utf8");return cl(r,t)}o(ll,"scanFile");async function Qi(e,t){let n;try{n=await Zc(e,{withFileTypes:!0})}catch(i){if(i.code==="ENOENT")return[];throw i}let r=[];for(let i of n){let s=nl(e,i.name);if(i.isDirectory()){il.has(i.name)||r.push(...await Qi(s,t));continue}i.isFile()&&await ll(s,t)&&r.push(s)}return r}o(Qi,"scanDir");async function _t(e,t){if(!e||e.length===0)return[];let n=[];for(let r of e)n.push(...await Qi(r,t));return Array.from(new Set(n)).sort()}o(_t,"scanDirs");async function dl(e){let t=await _t(e.workflowCapsuleDirs,e.skillName),n=await _t(e.savedWorkflowDirs,e.skillName),r=await _t(e.constructedAgentDirs,e.skillName),i=await _t(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(dl,"computeSkillConsumerImpact");function ul(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")||"turn"}o(ul,"safeIdPart");function fl(e,t){return{stored:!1,result:{destination:"discard",proposalId:e,reason:t}}}o(fl,"discardTurn");function pl(e){return e.completedTurn&&e.userMessage.trim().length>0&&e.assistantMessage.trim().length>0}o(pl,"hasUsableTurnEvidence");async function ml(e){let t=[],n=[],r=ul(e.sessionId);if(!pl(e)){for(let i=0;i<e.candidates.length;i+=1){let s=e.candidates[i]?.proposalId??`${r}-${i}`;n.push(fl(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 Ln({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(ml,"recordCompletedTurnLearning");var p=class extends Error{static{o(this,"LearningCapabilityError")}code;constructor(t,n){super(n),this.code=t,this.name="LearningCapabilityError"}},hl={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 Zi(e,t){return hl[e].includes(t)}o(Zi,"canTransitionLearnedCapability");function ve(e,t){if(!Zi(e,t))throw new p("invalid_transition",`learned capability cannot transition from ${e} to ${t}`)}o(ve,"assertLearnedCapabilityTransition");function M(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 p("invalid_record","learned capability name must contain letters or numbers");return t}o(M,"slugifyLearnedCapabilityName");function eo(e){return e==="active_learned"?"activated":e==="promoted_user"?"promoted":e==="quarantined"?"attention":e}o(eo,"learningEventKindForLifecycle");function Cn(e){return e.lastAction==="rollback"?"attention":eo(e.lifecycle)}o(Cn,"learningEventKindForRecord");function xt(e){return`${e.capabilityId}-r${e.revision}-${Cn(e)}`}o(xt,"learningEventIdFor");import{mkdir as oo,readFile as gl,readdir as so,rename as wl,rm as yl,writeFile as kl}from"node:fs/promises";import{lstatSync as vl,realpathSync as Sl}from"node:fs";import{basename as Be,dirname as be,isAbsolute as bl,join as k,relative as ao,resolve as co,sep as _l}from"node:path";function lo(e){return{root:e,skills:k(e,"skills"),extensions:k(e,"extensions"),capabilities:k(e,"capabilities"),events:k(e,"events"),clients:k(e,"clients")}}o(lo,"resolveLearnedAreaPaths");function Se(e,t){if(!/^[a-zA-Z0-9][a-zA-Z0-9_-]{0,127}$/.test(e))throw new p("invalid_record",`${t} is not a safe file key`)}o(Se,"assertSafeFileKey");async function Rn(e,t){uo(e),await oo(be(e),{recursive:!0});let n=k(be(e),`.${Be(e)}.${process.pid}-${Date.now().toString(36)}.tmp`);try{await kl(n,`${JSON.stringify(t,null,2)}
221
+ `,"utf8"),await wl(n,e)}catch(r){throw await yl(n,{force:!0}),r}}o(Rn,"writeJsonAtomic");async function se(e){try{return JSON.parse(await gl(e,"utf8"))}catch(t){if(On(t,"ENOENT"))return;throw t instanceof SyntaxError?new p("store_integrity_error",`invalid JSON in ${e}`):t}}o(se,"readJson");function N(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}o(N,"isRecord");function On(e,t){return N(e)&&e.code===t}o(On,"isFileError");function It(e,t){if(!N(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"||!N(e.source)||e.schemaVersion===2&&!El(e))throw new p("store_integrity_error",`invalid capability record in ${t}`);return e}o(It,"assertCapability");function to(e){let t=[],n=co(e);for(;;)try{return vl(n),k(Sl.native(n),...t)}catch(r){if(r.code!=="ENOENT")throw r;let i=be(n);if(i===n)throw r;t.unshift(Be(n)),n=i}}o(to,"canonicalExistingPath");function xl(e,t){let n=ao(e,t);return n===""||n!==".."&&!n.startsWith(`..${_l}`)&&!bl(n)}o(xl,"pathContains");function Il(e,t){return ao(e,t)===""}o(Il,"pathsEqual");function uo(e){let t=to(lt()),n=to(e),r=k(t,"runtime");if(Il(n,t)||xl(r,n))throw new p("store_integrity_error",`learned Area path aliases protected Runtime state: ${e}`)}o(uo,"assertLearnedStoreTarget");function El(e){if(e.carrier!=="skill"||!N(e.scope)||!N(e.artifact)||!N(e.provenance)||!N(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||Pl(i.binding))&&Array.isArray(i.invocations)&&i.invocations.every(Al)}o(El,"isValidV2Capability");function Pl(e){return N(e)&&typeof e.bindingId=="string"&&typeof e.ownerSessionRef=="string"&&Nn(e.expiresAt)}o(Pl,"isValidCanaryBinding");function Al(e){return!N(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")||!Nn(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:Nn(e.completedAt)}o(Al,"isValidCanaryInvocation");function Nn(e){return typeof e=="string"&&Number.isFinite(Date.parse(e))}o(Nn,"isValidTimestamp");function no(e,t){if(!N(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 p("store_integrity_error",`invalid learning event in ${t}`);return e}o(no,"assertEvent");function Tl(e,t){if(!N(e)||e.schemaVersion!==1||e.clientIdentity!==t||!N(e.events))throw new p("store_integrity_error",`invalid learning client record for ${t}`);return e}o(Tl,"assertClient");async function Dn(e){try{return(await so(e)).filter(t=>t.endsWith(".json")).sort().map(t=>k(e,t))}catch(t){if(On(t,"ENOENT"))return[];throw t}}o(Dn,"listJsonFiles");var J=class{static{o(this,"LearnedAreaStore")}paths;#e;constructor(t){let n=co(t);this.#e=$l(n),this.paths={...lo(n),events:k(this.#e,"events"),clients:k(this.#e,"clients")}}async initialize(){for(let t of Object.values(this.paths))uo(t);await Promise.all(Object.values(this.paths).map(t=>oo(t,{recursive:!0}))),await this.withOwnerMutation(async()=>{for(let t of await this.listCapabilities())await this.ensureCurrentEvent(t)})}async readCapability(t){Se(t,"capabilityId");let n=k(this.paths.capabilities,`${t}.json`),r=await se(n);if(r!==void 0)return It(r,n);if(this.#e!==this.paths.root)return;let i=await ro(this.#e,t);if(i.length>1)throw new p("store_integrity_error",`duplicate project capabilityId: ${t}`);let s=i[0];return s===void 0?void 0:It(await se(s),s)}async listCapabilities(){let t=await Dn(this.paths.capabilities),n=this.#e===this.paths.root?await ro(this.#e):[];return Promise.all([...t,...n].map(async r=>It(await se(r),r)))}async writeCapability(t){Se(t.capabilityId,"capabilityId");let n=this.#e===this.paths.root&&t.schemaVersion===2?k(this.#e,"projects",t.scope.tenantHash,t.scope.projectHash,"capabilities"):this.paths.capabilities,r=k(n,`${t.capabilityId}.json`);It(t,r),await Rn(r,t)}async writeEvent(t){Se(t.eventId,"eventId"),await Rn(k(this.paths.events,`${t.eventId}.json`),t)}async listEvents(){return(await Promise.all((await Dn(this.paths.events)).map(async n=>no(await se(n),n)))).sort((n,r)=>n.sequence-r.sequence)}async readClient(t){Se(t,"clientIdentity");let n=k(this.paths.clients,`${t}.json`),r=await se(n);return r===void 0?{schemaVersion:1,clientIdentity:t,events:{}}:Tl(r,t)}async writeClient(t){Se(t.clientIdentity,"clientIdentity"),await Rn(k(this.paths.clients,`${t.clientIdentity}.json`),t)}withOwnerMutation(t){return Ke(k(this.#e,".owner.lock"),t)}withClientMutation(t,n){return Se(t,"clientIdentity"),Ke(k(this.paths.clients,`.${t}.lock`),n)}async ensureCurrentEvent(t){let n=xt(t),r=await se(k(this.paths.events,`${n}.json`));if(r!==void 0)return no(r,n);let i=await this.listEvents(),s=Et(t,(i.at(-1)?.sequence??0)+1);return await this.writeEvent(s),s}};function $l(e){let t=Be(e),n=be(e),r=Be(n),i=be(n);return/^[a-f0-9]{64}$/.test(t)&&/^[a-f0-9]{64}$/.test(r)&&Be(i)==="projects"?be(i):e}o($l,"globalLearnedAreaRoot");async function ro(e,t){let n=k(e,"projects"),r=[];for(let i of await io(n))for(let s of await io(k(n,i))){let a=k(n,i,s,"capabilities");if(t!==void 0){let c=k(a,`${t}.json`);await se(c)!==void 0&&r.push(c)}else r.push(...await Dn(a))}return r.sort()}o(ro,"projectCapabilityFiles");async function io(e){try{return(await so(e,{withFileTypes:!0})).filter(t=>t.isDirectory()&&/^[a-f0-9]{64}$/.test(t.name)).map(t=>t.name).sort()}catch(t){if(On(t,"ENOENT"))return[];throw t}}o(io,"listDirectories");function Et(e,t){return{schemaVersion:1,sequence:t,eventId:xt(e),capabilityId:e.capabilityId,capabilityRevision:e.revision,kind:Cn(e),lifecycle:e.lifecycle,displayName:e.displayName,slug:e.slug,carrier:e.carrier,createdAt:e.updatedAt}}o(Et,"eventFromCapability");import{createHash as Ll}from"node:crypto";async function We(e){let t=await H(e);return{records:jn(t.proposals.map(n=>Rl(n,e))),warnings:t.warnings}}o(We,"projectLearningProposals");function jn(e,t=[]){let n=new Set(t);return e.map(r=>{let i=Cl(r.slug,r.capabilityId,n);return n.add(i),i===r.slug?r:{...r,slug:i}})}o(jn,"makeProjectedLearningSlugsUnique");function Cl(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(Cl,"nextAvailableSlug");function Rl(e,t){let n=Nl(e);return{schemaVersion:1,capabilityId:`lc_${Ll("sha256").update(t).update("\0").update(e.proposalId).digest("hex").slice(0,20)}`,displayName:n,slug:M(n),carrier:Dl(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(Rl,"projectProposal");function Nl(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(Nl,"proposalDisplayName");function Dl(e){return e.proposal.destination==="workflow_handoff"?"workflow_handoff":"skill"}o(Dl,"proposalCarrier");var fo=new Map,Ol=25;function jl(e){let t=fo.get(e);if(t)return t;let n=new Set;return fo.set(e,n),n}o(jl,"eventHubFor");var At=class{static{o(this,"FileLearningCenterService")}options;store;now;proposalStores;drivers;waiters;constructor(t){this.options=t;let n=t.rootDir??D("learned");this.store=new J(n),this.waiters=jl(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(l=>Ul(l,t)).sort(Bl),i=Wl(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 p("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 p("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 p("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=zl(t,n);return{ready:Fn(i,r,"ready",this.now()),newlyActive:Fn(i,r,"activated",this.now()),attention:Fn(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 p("invalid_record","learning event revision is invalid");return(await this.store.listEvents()).filter(n=>n.sequence>t)}subscribe(t={}){return new Mn(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 p("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(Pt(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 p("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(Pt(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){Ml(t);let n=await this.store.readCapability(t.capabilityId);if(n){if(t.revision!==n.revision+1)throw new p("invalid_record","capability revision must increase by one");if(t.lifecycle===n.lifecycle){if(t.lastAction!=="rollback"||t.lifecycle!=="active_learned")throw new p("invalid_transition","same-state revision requires an active rollback")}else ve(n.lifecycle,t.lifecycle)}let r=(await this.store.listCapabilities()).find(a=>a.slug===t.slug&&a.capabilityId!==t.capabilityId&&Kl(a,t));if(r)throw new p("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=Et(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 Pt(i,r),ve(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);Pt(i,r);let s=this.driverFor(i,n);if(!s)throw new p("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 p("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(We))).flatMap(s=>s.records),r=jn(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(d=>d.capabilityId===i.capabilityId),l={...a.events};for(let d of c)l[d.eventId]={state:n,capabilityRevision:d.capabilityRevision,updatedAt:this.now(),...r===void 0?{}:{snoozedUntil:r}};await this.store.writeClient({...a,events:l})})}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 p("store_integrity_error","F224 projection is missing owner metadata");let i=await this.findF224ProposalStore(t,r),s=(await H(i)).proposals.find(c=>c.proposalId===r);if(!s)throw new p("capability_not_found",`F224 proposal not found: ${t.slug}`);if(n==="reject")await Ue(i,r,"rejected");else{let c=await $n(i,s);if(!c.status.startsWith("approved_"))throw new p("action_failed",`F224 proposal approval was blocked: ${c.status}`)}let a=(await We(i)).records.find(c=>c.capabilityId===t.capabilityId);if(!a)throw new p("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 We(r)).records.some(s=>s.capabilityId===t.capabilityId))return r;throw new p("capability_not_found",`F224 proposal owner was not found: ${n}`)}},Mn=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 p("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),Ol)})])}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 Fl(e){return new At(e)}o(Fl,"createLearningCenterService");function Ml(e){if(e.schemaVersion!==1&&e.schemaVersion!==2||e.capabilityId.length===0||e.displayName.trim().length===0||e.slug!==M(e.slug)||!Number.isSafeInteger(e.revision)||e.revision<1)throw new p("invalid_record","invalid learned capability record")}o(Ml,"validateRecord");function Kl(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(Kl,"hasSameCapabilityOwner");function Pt(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 p("invalid_record","explicit user action expected revision or fingerprint changed")}o(Pt,"assertExplicitAuthority");function Ul(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(Ul,"matchesQuery");function Bl(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(Bl,"compareCapabilities");function Wl(e){if(e===void 0)return 0;let t=Number(e);if(!Number.isSafeInteger(t)||t<0)throw new p("invalid_record","learning query cursor is invalid");return t}o(Wl,"parseCursor");function zl(e,t){let n=new Map(e.map(r=>[r.capabilityId,r.revision]));return t.filter(r=>n.get(r.capabilityId)===r.capabilityRevision)}o(zl,"selectCurrentEvents");function Fn(e,t,n,r){return e.filter(i=>i.kind===n&&Hl(i,t,r)).length}o(Fn,"countActionable");function Hl(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(Hl,"isActionable");var Jl=/^[a-z0-9](?:[a-z0-9-]{0,62}[a-z0-9])?$/,ql=/^[a-z][a-z0-9_]{0,63}$/;function Gl(e,t){if(!Jl.test(e))throw new p("invalid_record","learned Extension slug is invalid");if(!ql.test(t))throw new p("invalid_record","learned Extension tool name is invalid");return`learned.${e}.${t}`}o(Gl,"getLearnedExtensionToolName");function Xl(e){return!1}o(Xl,"isLearnedExtensionCommandAllowed");import{createHash as gd,randomUUID as wd}from"node:crypto";import{link as yd,lstat as Gn,mkdir as xo,open as kd,readFile as Io,rm as vd}from"node:fs/promises";import{basename as Sd,dirname as bd,join as Je,relative as _d,resolve as xe,sep as Hn}from"node:path";import{createHash as Vl,randomUUID as Yl}from"node:crypto";import{lstat as mo,mkdir as Ql,open as Zl,readFile as ed}from"node:fs/promises";import{join as _e,relative as td,resolve as ho,sep as nd}from"node:path";var rd=16*1024,go=/^[a-f0-9]{64}$/,id=[/!\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 od(e,t){return _e(ho(e),"learned","projects",He("tenant",t.tenantId),He("project",t.projectId))}o(od,"resolveProjectLearnedAreaRoot");function sd(e,t){return{configHomeHash:He("config-home",md(e)),tenantHash:He("tenant",t.tenantId),projectHash:He("project",t.projectId)}}o(sd,"createLearnedCapabilityScope");function Kn(e){let t=[e.name,e.description,e.purpose,...e.triggers,...e.steps,...e.verification,...e.pitfalls];if(!(e.name===M(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=>id.some(s=>s.test(i))))throw new p("invalid_record","unsafe learned Skill specification was rejected");let r=yo(e);if(Buffer.byteLength(r,"utf8")>rd)throw new p("invalid_record","unsafe learned Skill specification exceeds the size limit")}o(Kn,"validateDeclarativeSkillSpec");function wo(e){return Kn(e),yo(e)}o(wo,"renderDeclarativeSkill");function yo(e){return["---",`name: ${e.name}`,`description: ${JSON.stringify(e.description.trim())}`,"---","","# Purpose","",e.purpose.trim(),"","## Use when","",...e.triggers.map(t=>`- ${Tt(t)}`),"","## Steps","",...e.steps.map((t,n)=>`${n+1}. ${Tt(t)}`),"","## Verification","",...e.verification.map(t=>`- ${Tt(t)}`),"","## Pitfalls","",...e.pitfalls.map(t=>`- ${Tt(t)}`),""].join(`
222
+ `)}o(yo,"renderDeclarativeSkillUnchecked");async function ko(e,t,n){bo(t);let r=wo(n),i=Wn(r),s=_e(e,"skills",t,"revisions",i),a=_e(s,"SKILL.md");await ze(e),await ze(_e(e,"skills")),await ze(_e(e,"skills",t)),await ze(_e(e,"skills",t,"revisions")),await ze(s);try{let c=await Zl(a,"wx");try{await c.writeFile(r,"utf8")}finally{await c.close()}}catch(c){if(!hd(c,"EEXIST"))throw c;if(await po(a),await ed(a,"utf8")!==r)throw new p("store_integrity_error","content-addressed learned Skill revision does not match its fingerprint")}return await po(a),{kind:"skill_markdown",relativePath:td(e,a).split(nd).join("/"),fingerprint:i,contentRevision:1,absolutePath:a}}o(ko,"stageLearnedSkillRevision");function vo(e){bo(e.capabilityId),fd(e.artifact),ud(e.scope);let t=e.now??new Date().toISOString(),n=e.previous;return{schemaVersion:2,capabilityId:e.capabilityId,displayName:e.displayName.trim(),slug:M(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:_o(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(vo,"createLearnedSkillRecord");async function ad(e,t){Kn(t.spec);let n=t.now??new Date().toISOString(),r=t.operation==="patch"?t.targetCapabilityId:pd(t.spec.name,t.scope);if(r===void 0)throw new p("invalid_record","learned Skill patch target is missing");let i=await ko(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&&P(c)&&c.provenance.actionId===t.provenance.actionId)return c;let l;if(t.operation==="patch"){if(c===void 0||!P(c))throw new p("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 p("invalid_record","learned Skill patch expected revision or fingerprint changed");l=c}else{let h=(await e.listCapabilities()).find(w=>w.slug===t.spec.name&&w.capabilityId!==r);if(c!==void 0||h!==void 0)throw new p("invalid_record","learned Skill create target already exists")}let d={..._o(i),contentRevision:l===void 0?1:l.artifact.contentRevision+1},u=(t.protectedSkillNames??[]).includes(t.spec.name),f=t.disposition==="project_canary"&&!u?"testing":"ready",m={...vo({capabilityId:r,displayName:t.spec.name,scope:t.scope,artifact:d,provenance:t.provenance,now:n,...l===void 0?{}:{previous:l}}),slug:t.spec.name,lifecycle:f,...u?{diagnostics:["formal Skill name collision requires explicit user review"]}:{}};return await a(),await e.writeCapability(m),await e.ensureCurrentEvent(m),m}),"commit");return t.authority===void 0?s(async()=>{}):t.authority.commit(s)}o(ad,"commitLearnedSkillRevision");async function Un(e,t,n){let r=n.now??new Date,i=Math.max(1e3,n.ttlMs??5*6e4);return Lt(e,t,r.toISOString(),s=>{let a=ld(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 l={bindingId:n.bindingId,ownerSessionRef:n.ownerSessionRef,expiresAt:new Date(r.getTime()+i).toISOString()};return{record:{...a,canary:{...a.canary,binding:l}},result:l,changed:c?.bindingId!==l.bindingId||c.expiresAt!==l.expiresAt}})}o(Un,"admitLearnedSkillBinding");async function cd(e,t,n,r=new Date().toISOString()){return Lt(e,t,r,i=>i.canary.binding?.bindingId!==n?{record:i,result:!1,changed:!1}:{record:So(i,n,new Date(r),"released canary invocation recovered as inconclusive","host:learned-skill-binding-release"),result:!0,changed:!0})}o(cd,"releaseLearnedSkillBinding");async function Bn(e,t,n){let r=n.now??new Date,i=n.invocationId??Yl();return Lt(e,t,r.toISOString(),s=>{if(s.lifecycle!=="testing")throw new p("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 p("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 p("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 p("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 p("action_failed","learned Skill canary is exhausted");let l={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()},d=s.canary.invocationCount+1;return{record:{...s,canary:{...s.canary,invocationCount:d,invocations:[...s.canary.invocations,l]}},result:{invocationId:i,invocationCount:d,maxInvocations:3},changed:!0}})}o(Bn,"invokeLearnedSkillCanary");async function $t(e,t,n){let r=n.now??new Date().toISOString();return Lt(e,t,r,i=>{let s=i.canary.invocations.find(h=>h.invocationId===n.invocationId);if(s===void 0)throw new p("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 p("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),l=i.canary.credibleNegatives+(n.outcome==="credible_negative"?1:0),d=a.some(h=>h.status==="pending"),u=i.canary.invocationCount>=i.canary.maxInvocations&&!d,f=l>0?"quarantined":u&&c>0?"active_learned":u?"ready":i.lifecycle,m={...i,lifecycle:f,...f==="active_learned"&&i.previousGoodArtifact===void 0?{previousGoodRevision:i.artifact.contentRevision,previousGoodArtifact:i.artifact}:{},canary:{...i.canary,verifiedSuccesses:c,credibleNegatives:l,invocations:a}};return{record:m,result:m,changed:!0}})}o($t,"completeLearnedSkillOutcome");function ld(e,t){let n=e.canary.binding;return n===void 0||Date.parse(n.expiresAt)>t.getTime()?e:So(e,n.bindingId,t,"expired canary invocation recovered as inconclusive","host:learned-skill-binding-expired")}o(ld,"recoverExpiredCanary");function So(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,...l}=e.canary,d=l.invocationCount>=l.maxInvocations&&!a.some(u=>u.status==="pending");return{...e,lifecycle:d&&e.lifecycle==="testing"?"ready":e.lifecycle,canary:{...l,invocations:a},...s?{diagnostics:[...new Set([...e.diagnostics??[],r])]}:{}}}o(So,"settleCanaryBinding");async function dd(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||!P(i))throw new p("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 p("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(dd,"quarantineLearnedSkillRevision");function P(e){return e.schemaVersion===2}o(P,"isLearnedCapabilityRecordV2");async function Lt(e,t,n,r){return e.withOwnerMutation(async()=>{let i=await e.readCapability(t);if(i===void 0||!P(i))throw new p("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(Lt,"mutateLearnedSkill");function bo(e){if(!/^[a-zA-Z0-9][a-zA-Z0-9_-]{0,127}$/.test(e))throw new p("invalid_record","learned Skill capabilityId is unsafe")}o(bo,"assertSafeCapabilityId");function ud(e){if(![e.configHomeHash,e.tenantHash,e.projectHash].every(t=>go.test(t)))throw new p("invalid_record","learned Skill project scope is invalid")}o(ud,"assertScope");function fd(e){if(e.kind!=="skill_markdown"||!go.test(e.fingerprint)||e.contentRevision<1||e.relativePath.startsWith("/")||e.relativePath.includes("\\")||e.relativePath.split("/").some(t=>t===".."||t==="."))throw new p("invalid_record","learned Skill artifact reference is invalid")}o(fd,"assertArtifact");function _o(e){return{kind:e.kind,relativePath:e.relativePath,fingerprint:e.fingerprint,contentRevision:e.contentRevision}}o(_o,"withoutAbsolutePath");function Tt(e){return e.trim().replace(/\s+/g," ")}o(Tt,"oneLine");function Wn(e){return Vl("sha256").update(e,"utf8").digest("hex")}o(Wn,"sha256");function pd(e,t){return`lc_skill_${Wn([e,t.configHomeHash,t.tenantHash,t.projectHash].join("\0")).slice(0,24)}`}o(pd,"learnedSkillCapabilityId");function He(e,t){return Wn(`${e}\0${t}`)}o(He,"scopedHash");function md(e){let t=ho(e);return process.platform==="win32"?t.toLowerCase():t}o(md,"normalizePath");async function ze(e){await Ql(e,{recursive:!0});let t=await mo(e);if(!t.isDirectory()||t.isSymbolicLink())throw new p("store_integrity_error",`learned Skill directory is not an owned regular directory: ${e}`)}o(ze,"ensureOwnedDirectory");async function po(e){let t=await mo(e);if(!t.isFile()||t.isSymbolicLink())throw new p("store_integrity_error",`learned Skill artifact is not a regular file: ${e}`)}o(po,"assertRegularFile");function hd(e,t){return typeof e=="object"&&e!==null&&"code"in e&&e.code===t}o(hd,"isFileError");var xd=["review","trust","rollback","promote"];function Id(e){return{carrier:"skill",actions:xd,execute:o(async(t,n)=>{let r=Ed(n),i=e.now?.()??new Date().toISOString();if(t==="rollback")return Pd(r,i);if(t==="review")return zn(r,"testing",i,{canary:Po(),lastAction:t});if(t==="trust")return zn(r,"active_learned",i,{previousGoodRevision:r.previousGoodRevision??r.artifact.contentRevision,previousGoodArtifact:r.previousGoodArtifact??r.artifact,lastAction:t});if(t==="promote")return await Ad(e,r),r.lifecycle==="promoted_user"?r:zn(r,"promoted_user",i,{lastAction:t});throw new p("unsupported_action",`unsupported learned Skill action: ${String(t)}`)},"execute")}}o(Id,"createLearnedSkillActionDriver");function Ed(e){if(!P(e)||e.source.kind!=="skill_learning_loop")throw new p("unsupported_action","the capability is not an F263 learned Skill");return e}o(Ed,"requireLearnedSkill");function zn(e,t,n,r){return e.lifecycle!==t&&ve(e.lifecycle,t),{...e,...r,lifecycle:t,revision:e.revision+1,updatedAt:n}}o(zn,"transitionRecord");function Pd(e,t){if(e.previousGoodArtifact===void 0||e.previousGoodRevision===void 0)throw new p("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:Po()}}o(Pd,"rollbackRecord");function Po(){return{maxInvocations:3,invocationCount:0,verifiedSuccesses:0,credibleNegatives:0,invocations:[]}}o(Po,"resetCanary");async function Ad(e,t){let n=Cd(e,t),r=xe(n,...t.artifact.relativePath.split("/"));qn(r,n),await Ld(n,r,"learned Skill promotion source contains a symlink or non-regular path");let i=await Io(r,"utf8");if(Rd(i)!==t.artifact.fingerprint)throw new p("store_integrity_error","learned Skill promotion source fingerprint changed");let s=await $d(e.userSkillsRoot,t.slug);if(qn(s,e.userSkillsRoot),await Td(s,i))return;let a=await Gn(s);if(a.isSymbolicLink()||!a.isFile())throw new p("store_integrity_error","formal user Skill target is not a regular file");if(await Io(s,"utf8")!==i)throw new p("action_failed",`formal user Skill already exists with different content: ${t.slug}`)}o(Ad,"promoteExactArtifact");async function Td(e,t){let n=Je(bd(e),`.${Sd(e)}.${process.pid}.${wd()}.tmp`),r;try{r=await kd(n,"wx"),await r.writeFile(t,"utf8"),await r.sync(),await r.close(),r=void 0;try{return await yd(n,e),!0}catch(i){if(Ao(i,"EEXIST"))return!1;throw i}}finally{try{await r?.close()}finally{await vd(n,{force:!0})}}}o(Td,"publishFormalSkill");async function $d(e,t){let n=xe(e);await xo(n,{recursive:!0}),await Jn(n,"formal user Skill root is not a regular directory");let r=xe(n,t);qn(r,n);try{await xo(r)}catch(i){if(!Ao(i,"EEXIST"))throw i}return await Jn(r,"formal user Skill path contains a symlink or non-regular directory"),Je(r,"SKILL.md")}o($d,"preparePromotionDestination");async function Ld(e,t,n){let r=xe(e);await Jn(r,n);let i=_d(r,t).split(Hn),s=r;for(let[a,c]of i.entries()){s=Je(s,c);let l=await Gn(s),d=a===i.length-1;if(l.isSymbolicLink()||(d?!l.isFile():!l.isDirectory()))throw new p("store_integrity_error",n)}}o(Ld,"assertRegularFileChain");async function Jn(e,t){let n=await Gn(e);if(n.isSymbolicLink()||!n.isDirectory())throw new p("store_integrity_error",t)}o(Jn,"assertRegularDirectory");function Cd(e,t){let n=xe(e.learnedAreaRoot);return e.learnedAreaKind==="project"||e.learnedAreaKind===void 0&&n.endsWith(Je("projects",t.scope.tenantHash,t.scope.projectHash))?n:Je(n,"projects",t.scope.tenantHash,t.scope.projectHash)}o(Cd,"capabilityAreaRoot");function qn(e,t){let n=Eo(t),r=Eo(e);if(r!==n&&!r.startsWith(n.endsWith(Hn)?n:`${n}${Hn}`))throw new p("store_integrity_error","learned Skill path escaped its configured owner root")}o(qn,"assertInside");function Eo(e){let t=xe(e);return process.platform==="win32"?t.toLowerCase():t}o(Eo,"comparable");function Rd(e){return gd("sha256").update(e,"utf8").digest("hex")}o(Rd,"sha256");function Nd(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}o(Nd,"isRecord");function Ao(e,t){return Nd(e)&&e.code===t}o(Ao,"isFileError");import{createHash as Dd}from"node:crypto";import{lstat as Xn,mkdir as Od,open as jd,readFile as Fd,readdir as To}from"node:fs/promises";import{join as Ie,resolve as qe}from"node:path";var Md=".legacy-skill-import-v1.json",Kd=16*1024,Ud=[/!\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 Bd(e,t,n){let r=Ie(t.paths.root,Md);return t.withOwnerMutation(async()=>{if(await Gd(r))return{migratedActive:0,recordedAttention:0,alreadyComplete:!0};let i=Ie(qe(e),"learned"),s=Ie(i,"skills"),a=(await new J(i).listCapabilities()).filter(d=>d.schemaVersion===1),c=0,l=0;for(let d of await qd(s)){let u=Ie(s,d,"SKILL.md"),f=await zd(Ie(s,d),u),m=a.find(y=>Hd(y,d,u)),h=f===void 0?void 0:$o(f),w=Wd(n,d,m,h);await t.readCapability(w.capabilityId)===void 0&&(await t.writeCapability(w),await t.ensureCurrentEvent(w),l+=1)}return await Xd(r,{version:1,migratedActive:c,recordedAttention:l,completedAt:new Date().toISOString()}),{migratedActive:c,recordedAttention:l,alreadyComplete:!1}})}o(Bd,"migrateLegacyLearnedSkillsForProject");function Wd(e,t,n,r){let i=new Date().toISOString();return{schemaVersion:1,capabilityId:Jd(e,`attention:${t}`),displayName:n?.displayName??t,slug:M(n?.slug??t),carrier:"skill",lifecycle:"ready",revision:1,createdAt:n?.createdAt??i,updatedAt:i,source:{kind:"legacy_manual"},artifactPath:Ie("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(Wd,"attentionLegacyRecord");async function zd(e,t){try{let n=await Xn(e),r=await Xn(t);if(!n.isDirectory()||n.isSymbolicLink()||!r.isFile()||r.isSymbolicLink()||(await To(e)).some(a=>a!=="SKILL.md"))return;let s=await Fd(t,"utf8");return Buffer.byteLength(s,"utf8")>Kd||Ud.some(a=>a.test(s))?void 0:s}catch(n){if(Vn(n,"ENOENT"))return;throw n}}o(zd,"safeLegacyContent");function Hd(e,t,n){if(e.carrier!=="skill")return!1;let r=e.artifactPath;if(r===void 0)return e.slug===t;let i=qe(r);return i===qe(n)||i===qe(n,"..")||e.slug===t}o(Hd,"legacyRecordMatches");function Jd(e,t){return`lc_legacy_${$o([e.configHomeHash,e.tenantHash,e.projectHash,t].join("\0")).slice(0,24)}`}o(Jd,"legacyCapabilityId");async function qd(e){try{return(await To(e,{withFileTypes:!0})).filter(t=>t.isDirectory()&&!t.isSymbolicLink()).map(t=>t.name).sort()}catch(t){if(Vn(t,"ENOENT"))return[];throw t}}o(qd,"directDirectories");async function Gd(e){try{return await Xn(e),!0}catch(t){if(Vn(t,"ENOENT"))return!1;throw t}}o(Gd,"fileExists");async function Xd(e,t){await Od(qe(e,".."),{recursive:!0});let n=await jd(e,"wx");try{await n.writeFile(`${JSON.stringify(t,null,2)}
223
+ `,"utf8")}finally{await n.close()}}o(Xd,"writeImmutableJson");function $o(e){return Dd("sha256").update(e,"utf8").digest("hex")}o($o,"sha256");function Vd(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}o(Vd,"isRecord");function Vn(e,t){return Vd(e)&&e.code===t}o(Vn,"isFileError");import{createHash as No,randomUUID as Yd}from"node:crypto";import{mkdir as Qd,open as Zd,readFile as Xe,readdir as Do}from"node:fs/promises";import{dirname as eu,join as ae,resolve as Oo,sep as Lo}from"node:path";async function tu(e,t){let n=K("session",t.sessionId),r={version:1,kind:"offered",receiptId:K("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 Ge(e,r),r}o(tu,"recordLearnedSkillOffered");async function nu(e,t){let n=t.now??new Date,r=t.invocationId??Yd(),i=K("session",t.sessionId),s=await e.readCapability(t.capabilityId);if(s===void 0||!P(s)||s.artifact.contentRevision!==t.expectedRevision||s.artifact.fingerprint!==t.expectedFingerprint)throw new p("invalid_record","learned Skill invocation expected revision or fingerprint changed");if(s.lifecycle==="testing"){if(await Un(e,t.capabilityId,{bindingId:t.bindingId,ownerSessionRef:t.ownerSessionRef,now:n})===void 0)throw new p("action_failed","learned Skill canary binding is owned by another root");await Bn(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 p("invalid_transition","learned Skill revision is not active or in admitted testing");let a=await e.readCapability(t.capabilityId);if(a===void 0||!P(a))throw new p("capability_not_found","learned Skill record disappeared");let c={version:1,kind:"invoked",receiptId:K("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 Ge(e,c),c}o(nu,"admitAndRecordLearnedSkillInvocation");async function ru(e,t){if(t.evidenceRefs.length===0)return[];let n=await Yn(e,t.sessionId),r=new Set(n.filter(l=>l.kind==="outcome").map(l=>l.invocationId)),i=n.filter(l=>l.kind==="invoked"&&(t.bindingId===void 0||l.bindingId===t.bindingId)),a=new Set(i.map(l=>l.capabilityId)).size>1?"inconclusive":t.outcome,c=[];for(let l of i){if(r.has(l.invocationId))continue;let d=await e.readCapability(l.capabilityId),u=d!==void 0&&P(d)?d.canary.invocations.find(y=>y.invocationId===l.invocationId):void 0,f=u!==void 0&&u.status!=="pending"?u.status:a,m=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(d!==void 0&&P(d)&&u?.status==="pending"){let I=(await $t(e,l.capabilityId,{invocationId:l.invocationId,outcome:a,evidenceRefs:t.evidenceRefs,now:t.now})).canary.invocations.find(b=>b.invocationId===l.invocationId);I!==void 0&&I.status!=="pending"&&(f=I.status,m=I.evidenceRefs,h=I.completedAt??h)}let w={version:1,kind:"outcome",receiptId:K("outcome",`${l.sessionHash}\0${l.invocationId}`),sessionHash:l.sessionHash,invocationId:l.invocationId,capabilityId:l.capabilityId,outcome:f,evidenceRefs:[...m],createdAt:h};await Ge(e,w),c.push(w)}return c}o(ru,"completeLearnedSkillSessionOutcomes");async function iu(e,t){let n=K("session",t.sessionId),r=t.now??new Date().toISOString(),i=[],s=(await e.listCapabilities()).filter(P),a=new Map;for(let c of await ou(e,n,t.bindingId)){let l=s.find(u=>u.capabilityId===c.capabilityId);if(l===void 0)continue;let d=l.canary.invocations.find(u=>u.invocationId===c.invocationId&&u.bindingId===c.bindingId);if(d===void 0&&(l.lifecycle!=="active_learned"||l.artifact.contentRevision!==c.revision||l.artifact.fingerprint!==c.fingerprint))throw new p("store_integrity_error","learned Skill invocation receipt does not match a current artifact");a.set(`${c.sessionHash}\0${c.invocationId}`,{invoked:c,capability:l,...d===void 0?{}:{canonicalInvocationId:c.invocationId}})}for(let c of s)for(let l of c.canary.invocations){if(l.bindingId!==t.bindingId&&l.status==="pending")continue;let d=l.usageSessionHash??(l.bindingId===t.bindingId?n:void 0);if(d===void 0)continue;let u=K("invoked",`${d}\0${l.invocationId}`),f=await Co(e,d,u);if(f!==void 0&&f.kind!=="invoked")throw new p("store_integrity_error","learned Skill invocation receipt identity was reused");if(f?.kind==="invoked"&&(f.invocationId!==l.invocationId||f.bindingId!==l.bindingId||f.capabilityId!==c.capabilityId||f.revision!==(l.artifactRevision??c.artifact.contentRevision)||f.fingerprint!==(l.artifactFingerprint??c.artifact.fingerprint)))throw new p("store_integrity_error","learned Skill invocation receipt drifted from canonical invocation");let m=f??{version:1,kind:"invoked",receiptId:u,sessionHash:d,bindingId:l.bindingId,invocationId:l.invocationId,capabilityId:c.capabilityId,revision:l.artifactRevision??c.artifact.contentRevision,fingerprint:l.artifactFingerprint??c.artifact.fingerprint,createdAt:l.invokedAt};f===void 0&&await Ge(e,m),a.set(`${m.sessionHash}\0${m.invocationId}`,{invoked:m,capability:c,canonicalInvocationId:l.invocationId})}for(let c of a.values()){let{invoked:l}=c,d=K("outcome",`${l.sessionHash}\0${l.invocationId}`),u=await Co(e,l.sessionHash,d),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 p("store_integrity_error","learned Skill outcome receipt identity was reused");let y=u.invocationId!==l.invocationId||u.capabilityId!==l.capabilityId,I=f!==void 0&&f.status!=="pending"&&f.completedAt===void 0,b=f!==void 0&&(f.status==="pending"||u.outcome!==f.status||JSON.stringify(u.evidenceRefs)!==JSON.stringify(f.evidenceRefs)||u.createdAt!==f.completedAt);if(y||I||b)throw new p("store_integrity_error","learned Skill outcome receipt drifted from canonical invocation");continue}let m=f?.status==="pending"?await $t(e,c.capability.capabilityId,{invocationId:l.invocationId,outcome:"inconclusive",evidenceRefs:["host:learned-skill-binding-release"],now:r}):c.capability,h=f===void 0?void 0:m.canary.invocations.find(y=>y.invocationId===l.invocationId);if(h?.status==="pending")throw new p("store_integrity_error","learned Skill canary invocation did not settle during reconciliation");if(h!==void 0&&h.completedAt===void 0)throw new p("store_integrity_error","learned Skill terminal invocation has no canonical completion time");let w={version:1,kind:"outcome",receiptId:d,sessionHash:l.sessionHash,invocationId:l.invocationId,capabilityId:l.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 Ge(e,w),i.push(w)}return i}o(iu,"reconcileLearnedSkillBindingOutcomes");async function ou(e,t,n){let r=Ct(e,t),i;try{i=(await Do(r)).filter(a=>a.endsWith(".json")).sort()}catch(a){if(Nt(a,"ENOENT"))return[];throw a}let s=[];for(let a of i){let c;try{c=JSON.parse(await Xe(ae(r,a),"utf8"))}catch(d){if(!(d instanceof SyntaxError))throw d;E({source:"learning.skill-usage",level:"warn",message:"Invalid unrelated usage receipt was skipped during binding recovery.",detail:{filePath:ae(r,a)}});continue}if(!Rt(c)){if(Qn(c)&&c.kind==="invoked"&&c.bindingId===n)throw new p("store_integrity_error","invalid target learned Skill invocation receipt");su(r,a);continue}if(c.kind!=="invoked"||c.bindingId!==n)continue;let l=K("invoked",`${t}\0${c.invocationId}`);if(c.sessionHash!==t||c.receiptId!==l||a!==`${l}.json`)throw new p("store_integrity_error","target learned Skill invocation receipt identity is invalid");s.push(c)}return s}o(ou,"listValidBindingInvocations");function su(e,t){E({source:"learning.skill-usage",level:"warn",message:"Invalid unrelated usage receipt was skipped during binding recovery.",detail:{filePath:ae(e,t)}})}o(su,"emitInvalidSiblingReceipt");async function Yn(e,t){let n=Ct(e,K("session",t)),r;try{r=(await Do(n)).filter(s=>s.endsWith(".json")).sort()}catch(s){if(Nt(s,"ENOENT"))return[];throw s}let i=[];for(let s of r){let a=JSON.parse(await Xe(ae(n,s),"utf8"));if(!Rt(a))throw new p("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(Yn,"listLearnedSkillUsageReceipts");async function au(e,t,n={}){let r=(await Yn(e,t)).filter(d=>d.kind==="invoked"&&(n.bindingId===void 0||d.bindingId===n.bindingId)),i=r.at(-1);if(i===void 0||r.some(d=>d.capabilityId!==i.capabilityId))return null;let s=await e.readCapability(i.capabilityId);if(s===void 0||!P(s)||s.artifact.fingerprint!==i.fingerprint||s.artifact.contentRevision!==i.revision)return null;let a=Oo(e.paths.root,...s.artifact.relativePath.split("/"));cu(a,e.paths.root);let c=await Xe(a,"utf8");return No("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(au,"exactInvokedSkillSnapshotForSession");async function Ge(e,t){let n=ae(Ct(e,t.sessionHash),`${t.receiptId}.json`);await Qd(eu(n),{recursive:!0});let r=`${JSON.stringify(t,null,2)}
224
+ `;try{let i=await Zd(n,"wx");try{await i.writeFile(r,"utf8")}finally{await i.close()}}catch(i){if(!Nt(i,"EEXIST"))throw i;let s=JSON.parse(await Xe(n,"utf8"));if(!Rt(s)||JSON.stringify({...s,createdAt:""})!==JSON.stringify({...t,createdAt:""}))throw new p("store_integrity_error","learned Skill usage receipt drifted")}}o(Ge,"writeImmutableReceipt");async function Co(e,t,n){try{let r=JSON.parse(await Xe(ae(Ct(e,t),`${n}.json`),"utf8"));if(!Rt(r)||r.receiptId!==n||r.sessionHash!==t)throw new p("store_integrity_error","invalid learned Skill usage receipt");return r}catch(r){if(Nt(r,"ENOENT"))return;throw r}}o(Co,"readUsageReceipt");function Ct(e,t){return ae(e.paths.root,"usage",t)}o(Ct,"usageSessionRoot");function K(e,t){return No("sha256").update(`${e}\0${t}`,"utf8").digest("hex")}o(K,"usageHash");function Rt(e){return!Qn(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(Rt,"isUsageReceipt");function cu(e,t){let n=Ro(t),r=Ro(e);if(r!==n&&!r.startsWith(n.endsWith(Lo)?n:`${n}${Lo}`))throw new p("store_integrity_error","learned Skill artifact escaped its owner")}o(cu,"assertInside");function Ro(e){let t=Oo(e);return process.platform==="win32"?t.toLowerCase():t}o(Ro,"comparable");function Qn(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}o(Qn,"isRecord");function Nt(e,t){return Qn(e)&&e.code===t}o(Nt,"isFileError");async function Ot(e,t){let n=new Map,r=[],i=o(l=>{let d=n.get(l.name);d?le(d.path)!==le(l.path)&&E({source:"agent:skills",level:"warn",message:`Skill "${l.name}" is shadowed by a higher-priority source.`,detail:{code:"skill_shadowed",name:l.name,selectedPath:ce(d.path,"SKILL.md"),shadowedPath:ce(l.path,"SKILL.md")}}):n.set(l.name,l)},"register"),a={...qt(e),...t},c=Gt(a);for(let{path:l,source:d}of c)try{let u=await Iu(l,d,r);for(let f of u)i(f)}catch(u){r.push({path:l,error:u instanceof Error?u.message:String(u)})}if(a.learnedArea!==void 0){let l=await hu(a.learnedArea);r.push(...l.errors);for(let d of l.skills)i(d)}return{skills:n,errors:r}}o(Ot,"discoverSkills");async function hu(e){let t=[],n=[];for(let r of wu(e)){let i=await gu(r.rootDir,r.expectedScope,e);t.push(...i.skills),n.push(...i.errors)}return{skills:t,errors:n}}o(hu,"scanRecordGatedLearnedArea");async function gu(e,t,n){let r=new J(e),i=[],s=[],a;try{a=await r.listCapabilities()}catch(c){return{skills:i,errors:[{path:e,error:c instanceof Error?c.message:String(c)}]}}for(let c of a){if(!P(c)||!yu(c,t)||!vu(c,n))continue;let l=Dt(e,...c.artifact.relativePath.split("/"));try{_u(l,e),await bu(e,l);let d=await du(l,"utf8");if(xu(d)!==c.artifact.fingerprint)throw new Error("learned Skill artifact fingerprint mismatch");let u=await it(Zn(l),"learned");if(u===null)throw new Error("learned Skill metadata is invalid");i.push({...u,learned:{capabilityId:c.capabilityId,revision:c.artifact.contentRevision,fingerprint:c.artifact.fingerprint}})}catch(d){let u=d instanceof Error?d.message:String(d);s.push({path:l,error:u}),await Su(r,c,u)}}return{skills:i,errors:s}}o(gu,"scanRecordGatedLearnedRoot");function wu(e){let t=[e.rootDir,...e.additionalRootDirs??[]],n=ku(e);if(t.length!==n.length)throw new Error("learned Skill discovery requires one expected scope per physical root");let r=t.map((i,s)=>({rootDir:i,expectedScope:n[s]}));for(let[i,s]of r.entries())if(r.findIndex(c=>le(c.rootDir)===le(s.rootDir))!==i)throw new Error("learned Skill discovery physical roots must be unique");return r}o(wu,"learnedAreaBindings");function yu(e,t){return e.scope.configHomeHash===t.configHomeHash&&e.scope.tenantHash===t.tenantHash&&e.scope.projectHash===t.projectHash}o(yu,"scopeMatches");function ku(e){let t=[...e.expectedScopes??[e.expectedScope]];if(t.length===0)throw new Error("learned Skill discovery requires at least one expected scope");return t}o(ku,"expectedLearnedScopes");function vu(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(vu,"isRecordAdmitted");async function Su(e,t,n){await e.withOwnerMutation(async()=>{let r=await e.readCapability(t.capabilityId);if(r===void 0||!P(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(Su,"quarantineInvalidLearnedArtifact");async function bu(e,t){let r=mu(Dt(e),t).split(er),i=Dt(e),s=await jo(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=ce(i,c);let l=await jo(i),d=a===r.length-1;if(l.isSymbolicLink()||(d?!l.isFile():!l.isDirectory()))throw new Error("learned Skill artifact contains a symlink or non-regular path")}}o(bu,"assertRegularArtifactChain");function _u(e,t){let n=le(t),r=le(e);if(r!==n&&!r.startsWith(n.endsWith(er)?n:`${n}${er}`))throw new Error("learned Skill artifact escapes its Learned Area")}o(_u,"assertInside");function le(e){let t=Dt(e);return process.platform==="win32"?t.toLowerCase():t}o(le,"comparablePath");function xu(e){return lu("sha256").update(e,"utf8").digest("hex")}o(xu,"sha256");async function Iu(e,t,n){let r=[],i=new Set;async function s(a){try{let c=le(await fu(a));if(i.has(c))return;i.add(c);let l=await uu(a,{withFileTypes:!0});if(l.some(d=>d.name==="SKILL.md")){let d=await it(a,t);d?r.push(d):n.push({path:ce(a,"SKILL.md"),error:"Skill metadata could not be loaded."});return}l.sort((d,u)=>d.name<u.name?-1:d.name>u.name?1:0);for(let d of l){if(d.name.startsWith(".")||d.name==="node_modules")continue;let u=ce(a,d.name);try{(d.isDirectory()||d.isSymbolicLink()&&(await pu(u)).isDirectory())&&await s(u)}catch(f){Fo(n,u,f)}}}catch(c){Fo(n,a,c)}}return o(s,"visit"),await s(e),r}o(Iu,"scanSkillDirectory");function Fo(e,t,n){typeof n=="object"&&n!==null&&"code"in n&&n.code==="ENOENT"||e.push({path:t,error:n instanceof Error?n.message:String(n)})}o(Fo,"recordDiscoveryError");function Mo(e,t){let n=[],r=[".kodax/skills",".agents/skills"],i=e,s=Zn(t);for(;i!==s&&i!=="/"&&i.length>3;){for(let c of r)n.push(ce(i,c));let a=Zn(i);if(a===i)break;i=a}return n}o(Mo,"getNestedSkillPaths");async function Eu(e,t){let n=Mo(e,t),r={projectPaths:[ce(t,".kodax","skills"),...n]};return Ot(t,r)}o(Eu,"discoverSkillsWithMonorepo");import{execSync as Pu}from"child_process";import Au from"path";var Tu=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 Ko(e){if(!e||!e.trim())return!1;let t=e.trim().replace(/\s+/g," ").toLowerCase();for(let n of Tu)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(Ko,"isSingleSafeDynamicContextCommand");function $u(e){if(!e||!e.trim())return!1;let t=e.trim().replace(/\\\r?\n/g," ");if(/[<>|;`]|\$\(|(?<!&)&(?!&)/.test(t)||t.includes("\\")&&Au.sep!=="\\"&&t.replace(/\\ /g,"").includes("\\"))return!1;let r=t.split(/\s*&&\s*/);if(r.length===1)return Ko(r[0]);for(let i of r){let s=i?.trim();if(s&&!/^cd\s+/.test(s.toLowerCase())&&!Ko(s))return!1}return!0}o($u,"isSafeDynamicContextCommand");function Uo(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(Uo,"parseArguments");var Ve=class{static{o(this,"VariableResolver")}context;constructor(t){this.context=t}async resolve(t,n){let r=t,i=Uo(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 l=await this.executeDynamicCommand(c);s=s.replace(a,l)}catch(l){let d=l instanceof Error?l.message:String(l);s=s.replace(a,`[Error: ${d}]`)}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.assertDynamicContextAllowed?.(t),this.context.executeDynamicContext){let n=await this.context.executeDynamicContext(t,this.context.workingDirectory);return typeof n=="string"?n.trim():""}if(!$u(t))throw new Error("Unsafe dynamic context command blocked. Only simple read-only commands are allowed in !`...` blocks.");try{return Pu(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 Lu(e){return new Ve(e)}o(Lu,"createResolver");async function de(e,t,n){return new Ve(n).resolve(e,t)}o(de,"resolveSkillContent");var Cu=8e3,Ru=160;function Bo(e,t){let n=e.replace(/\s+/gu," ").trim();return n.length<=t?n:`${n.slice(0,t-1).replace(/[\uD800-\uDBFF]$/,"")}\u2026`}o(Bo,"catalogText");function zo(e){let t=e.filter(c=>!c.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.","",'If the current task context already contains an "Active skill invocation" or a host-expanded Skill block for the referenced name, that explicit user invocation is already complete. Follow the expanded instructions and do NOT call the `skill` tool for that Skill again.',"",'When users reference a "slash command" or "/<something>" (e.g. "/feature-list-tracker", "/skill:foo") and the host has not already expanded it, they are referring to a skill. Invoke it via the `skill` tool with the skill name.',"","**BLOCKING REQUIREMENT**: When a model-visible Skill matches the user's request and the host has not already expanded it, 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 model-discovered Skill without actually calling the `skill` tool. This rule does not apply to a host-expanded active user invocation, which must not be called again. 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.",""],r=n.join(`
225
+ `).length+1,i=0,s=0;for(let c of t){let l=Bo(c.description,500),d=c.argumentHint?Bo(c.argumentHint,80):"",u=`- ${c.name}:${d?` ${d}`:""} ${l}`;r+u.length+1>Cu-Ru||(n.push(u),r+=u.length+1,i++,(l!==c.description||d!==(c.argumentHint??""))&&s++)}let a=t.length-i;if(s>0||a>0){let c=`[Skill catalog shortened: ${s} entries shortened; ${a} Skills omitted. Explicit invocation of registered Skills remains available.]`;n.push("",c),E({source:"agent:skills",level:"warn",message:c,detail:{code:"skill_catalog_shortened",total:t.length,included:i,omitted:a,shortened:s}})}return n.push(""),n.join(`
226
+ `)}o(zo,"formatSkillsSystemPrompt");var jt=class{static{o(this,"SkillRegistry")}skillsByName=new Map;fullSkillsByName=new Map;incompleteDiscovery=!1;get discoveryIncomplete(){return this.incompleteDiscovery}projectRoot;customPaths;constructor(t,n){this.projectRoot=t,this.customPaths=n}async discover(){let t=await Ot(this.projectRoot,this.customPaths);this.incompleteDiscovery=t.errors.length>0,this.fullSkillsByName.clear(),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)E({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 Yt(r.path,r.source);if(this.skillsByName.get(t)!==r)return this.loadFull(t);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{success:!0,content:await de(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()}getSystemPromptSnippet(){return zo(this.list())}has(t){return this.skillsByName.has(t)}get size(){return this.skillsByName.size}},Ee=null,Wo;function Ft(e,t){return Ee&&e!==void 0&&Wo!==e&&(Ee=null),Ee||(Ee=new jt(e,t),Wo=e),Ee}o(Ft,"getSkillRegistry");async function Nu(e,t){let n=Ft(e,t);return await n.discover(),n}o(Nu,"initializeSkillRegistry");function Du(){Ee=null}o(Du,"resetSkillRegistry");var Ye=class{static{o(this,"SkillExecutor")}context;constructor(t){this.context=t}async execute(t,n,r){let i=Ft();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 de(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(`
227
+ `)}parseAllowedTools(t){return t?t.split(",").map(n=>n.trim()).filter(Boolean):[]}};function Ou(e){return new Ye(e)}o(Ou,"createExecutor");async function ju(e,t,n,r){return new Ye(n).execute(e,t,r)}o(ju,"executeSkill");function Ho(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&apos;")}o(Ho,"escapeXml");var tr=120;function Mt(e){return e.replace(/\\/g,"/")}o(Mt,"formatDisplayPath");function Fu(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(Fu,"collectSupportFiles");function Mu(e){let t=Fu(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}/: ${Mt(`${e.path}/${i}`)} (${s.length} files)`);r.push("","Support file inventory:");for(let{folder:i,file:s}of t.slice(0,tr))r.push(`- ${i}/${s.relativePath}: ${Mt(s.path)}`);return t.length>tr&&r.push(`- ... ${t.length-tr} more files under ${Mt(e.path)}`),r}o(Mu,"buildSupportFileContext");function Ku(e,t,n){let r=[];r.push(`<skill name="${Ho(e.name)}" location="${Ho(e.path)}">`),r.push(""),r.push(`Skill root: ${Mt(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=Mu(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(`
228
+ `)}o(Ku,"buildSkillBlock");async function Uu(e,t,n){let r=await de(e.content,t,n);return{content:Ku(e,r,t),disableModelInvocation:e.disableModelInvocation??!1,skill:e}}o(Uu,"expandSkillForLLM");function Bu(e,t){let n=`Skill activated: ${e}`;return t.trim()&&(n+=` with arguments: ${t}`),n}o(Bu,"formatSkillActivationMessage");import{writeFile as Qo}from"node:fs/promises";import te from"node:path";import{existsSync as qo}from"node:fs";import{mkdir as Wu,readFile as nr,readdir as zu,stat as Go,writeFile as jw}from"node:fs/promises";import Hu from"node:os";import O from"node:path";import{fileURLToPath as rr,pathToFileURL as Xo}from"node:url";import Ju from"yaml";var ue=null;async function ir(){let e=O.dirname(rr(import.meta.url)),t=O.resolve(e,"../../../sdk-skills.js");return qo(t)?import(Xo(t).href):import("./skills-XL2XIBWV.js")}o(ir,"loadKodaXSkills");function Vo(e){ue=e}o(Vo,"setKodaXSDKForSkillCreator");async function ee(){if(ue)return ue;let e=O.dirname(rr(import.meta.url)),t=[],n=O.resolve(e,"../../../index.js");if(qo(n))return ue=await import(Xo(n).href),ue;t.push(`relative SDK path not found: ${n}`);try{return ue=await import(["@kodax-ai","kodax"].join("/")),ue}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}.
196
229
  Attempted:
197
230
  - ${t.join(`
198
- - `)}`)}o(ee,"loadKodaXSDK");function Ju(e){let t=e.replace(/^\uFEFF/,"").replace(/\r\n/g,`
231
+ - `)}`)}o(ee,"loadKodaXSDK");function qu(e){let t=e.replace(/^\uFEFF/,"").replace(/\r\n/g,`
199
232
  `).replace(/\r/g,`
200
233
  `).trimStart();if(!t.startsWith(`---
201
234
  `))throw new Error("SKILL.md missing YAML frontmatter");let n=t.indexOf(`
202
235
  ---
203
- `,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(Ju,"extractFrontmatter");function Kt(e){let{yamlText:t,body:n}=Ju(e),r=Hu.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(Kt,"parseSkillMarkdown");async function Ze(e){let t=O.join(e,"SKILL.md");if(!(await qo(t).catch(()=>null))?.isFile())throw new Error(`SKILL.md not found in ${e}`);let r=await nr(t,"utf8"),{frontmatter:i,body:s}=Kt(r);return{skillDir:O.resolve(e),skillMdPath:t,rawContent:r,body:s,frontmatter:i}}o(Ze,"loadSkill");async function et(e){try{return await qo(e),!0}catch{return!1}}o(et,"pathExists");function Ut(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:Qe(t),stddev:Qe(Math.sqrt(n)),min:Qe(Math.min(...e)),max:Qe(Math.max(...e))}}o(Ut,"calculateStats");function Qe(e,t=4){return Number(e.toFixed(t))}o(Qe,"roundNumber");function Bt(e){return e>=0?`+${e.toFixed(4)}`:e.toFixed(4)}o(Bt,"formatDelta");function Ho(e){try{return JSON.parse(e)}catch{return null}}o(Ho,"safeJsonParse");function Pe(e){let t=Ho(e.trim());if(t&&typeof t=="object")return t;let n=e.indexOf("{"),r=e.lastIndexOf("}");return n===-1||r===-1||r<=n?null:Ho(e.slice(n,r+1))}o(Pe,"extractJsonObject");async function U(e,t=null){try{return JSON.parse(await nr(e,"utf8"))}catch{return t}}o(U,"readJsonFile");async function Ae(e,t){let n=O.dirname(rr(e));return nr(O.resolve(n,t),"utf8")}o(Ae,"loadRelativeText");function T(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)}
236
+ `,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(qu,"extractFrontmatter");function Kt(e){let{yamlText:t,body:n}=qu(e),r=Ju.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(Kt,"parseSkillMarkdown");async function Ze(e){let t=O.join(e,"SKILL.md");if(!(await Go(t).catch(()=>null))?.isFile())throw new Error(`SKILL.md not found in ${e}`);let r=await nr(t,"utf8"),{frontmatter:i,body:s}=Kt(r);return{skillDir:O.resolve(e),skillMdPath:t,rawContent:r,body:s,frontmatter:i}}o(Ze,"loadSkill");async function et(e){try{return await Go(e),!0}catch{return!1}}o(et,"pathExists");function Ut(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:Qe(t),stddev:Qe(Math.sqrt(n)),min:Qe(Math.min(...e)),max:Qe(Math.max(...e))}}o(Ut,"calculateStats");function Qe(e,t=4){return Number(e.toFixed(t))}o(Qe,"roundNumber");function Bt(e){return e>=0?`+${e.toFixed(4)}`:e.toFixed(4)}o(Bt,"formatDelta");function Jo(e){try{return JSON.parse(e)}catch{return null}}o(Jo,"safeJsonParse");function Pe(e){let t=Jo(e.trim());if(t&&typeof t=="object")return t;let n=e.indexOf("{"),r=e.lastIndexOf("}");return n===-1||r===-1||r<=n?null:Jo(e.slice(n,r+1))}o(Pe,"extractJsonObject");async function U(e,t=null){try{return JSON.parse(await nr(e,"utf8"))}catch{return t}}o(U,"readJsonFile");async function Ae(e,t){let n=O.dirname(rr(e));return nr(O.resolve(n,t),"utf8")}o(Ae,"loadRelativeText");function T(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)}
204
237
 
205
- [truncated ${r} chars]`}o(T,"truncateText");function Vo(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?Qe(n/t):0}}o(Vo,"computePassSummary");async function or(e,t=e,n=[]){let r=await Wu(t,{withFileTypes:!0}).catch(()=>[]);for(let i of r.sort((s,a)=>s.name.localeCompare(a.name))){let s=O.join(t,i.name);if(i.isDirectory()){await or(e,s,n);continue}i.isFile()&&n.push({absolutePath:s,relativePath:O.relative(e,s).replace(/\\/g,"/")})}return n}o(or,"collectFiles");function tt(){return O.join(zu.homedir(),".kodax","skills")}o(tt,"getDefaultSkillsDir");async function $(e){return await Bu(e,{recursive:!0}),e}o($,"ensureDirectory");function qu(e){return e.split("-").filter(Boolean).map(t=>t[0]?.toUpperCase()+t.slice(1)).join(" ")}o(qu,"titleFromSlug");function Gu(e,t){let n=qu(e);return`---
238
+ [truncated ${r} chars]`}o(T,"truncateText");function Yo(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?Qe(n/t):0}}o(Yo,"computePassSummary");async function or(e,t=e,n=[]){let r=await zu(t,{withFileTypes:!0}).catch(()=>[]);for(let i of r.sort((s,a)=>s.name.localeCompare(a.name))){let s=O.join(t,i.name);if(i.isDirectory()){await or(e,s,n);continue}i.isFile()&&n.push({absolutePath:s,relativePath:O.relative(e,s).replace(/\\/g,"/")})}return n}o(or,"collectFiles");function tt(){return O.join(Hu.homedir(),".kodax","skills")}o(tt,"getDefaultSkillsDir");async function $(e){return await Wu(e,{recursive:!0}),e}o($,"ensureDirectory");function Gu(e){return e.split("-").filter(Boolean).map(t=>t[0]?.toUpperCase()+t.slice(1)).join(" ")}o(Gu,"titleFromSlug");function Xu(e,t){let n=Gu(e);return`---
206
239
  name: ${e}
207
240
  description: ${t}
208
241
  user-invocable: true
@@ -232,10 +265,10 @@ Describe the task this skill handles, the trigger boundary, and the expected out
232
265
  - Put deeper guidance in \`references/\`.
233
266
  - Put reusable templates or static files in \`assets/\`.
234
267
  - Put repeatable helper scripts in \`scripts/\`.
235
- `}o(Gu,"renderSkillTemplate");function Xu(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(Xu,"renderEvalTemplate");async function Vu(e){let t=te.resolve(e.baseDir??tt()),n=te.join(t,e.name),r=e.description??`Describe what ${e.name} does and when it should be used.`;if(await et(n)&&!e.force)throw new Error(`Skill directory already exists: ${n}`);return await $(n),await $(te.join(n,"references")),await $(te.join(n,"assets")),await $(te.join(n,"scripts")),await Yo(te.join(n,"SKILL.md"),Gu(e.name,r),"utf8"),e.includeEvals!==!1&&(await $(te.join(n,"evals")),await Yo(te.join(n,"evals","evals.json"),`${Xu(e.name)}
236
- `,"utf8")),{skillDir:n,created:["SKILL.md",...e.includeEvals!==!1?["evals/evals.json"]:[],"references/","assets/","scripts/"]}}o(Vu,"initSkill");function Yu(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(Yu,"parseArgs");async function sr(e=process.argv){let t=Yu(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 Vu(t);console.log(`Initialized ${n.skillDir}`)}o(sr,"main");var Qu=!1;Qu&&sr().catch(e=>{console.error(e instanceof Error?e.message:String(e)),process.exit(1)});import Qo from"node:path";var Zu=new Set(["name","description","license","compatibility","metadata","allowed-tools","disable-model-invocation","user-invocable","argument-hint","context","agent","model","hooks"]);async function nt(e){let t={valid:!1,errors:[],warnings:[],frontmatter:null},n;try{n=await Ze(e)}catch(l){return t.errors.push(l instanceof Error?l.message:String(l)),t}let{frontmatter:r,body:i}=n;t.frontmatter=r;let s=Object.keys(r).filter(l=>!Zu.has(l));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 l=Qo.basename(Qo.resolve(e));l!==a&&t.warnings.push(`Skill directory name "${l}" 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 l=r["allowed-tools"];typeof l=="string"||Array.isArray(l)&&l.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(nt,"validateSkillDirectory");async function ar(e=process.argv){let t=e[2];t||(console.error("Usage: node scripts/quick-validate.js <skill-directory>"),process.exit(1));let n=await nt(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(ar,"main");var ef=!1;ef&&ar().catch(e=>{console.error(e instanceof Error?e.message:String(e)),process.exit(1)});import{readFile as cr,writeFile as q}from"node:fs/promises";import v from"node:path";function tf(e){return typeof e=="string"?{text:e}:e&&typeof e=="object"&&typeof e.text=="string"?{text:e.text}:null}o(tf,"normalizeAssertion");function nf(e){return e.reduce((t,n)=>Array.isArray(n.content)?t+n.content.filter(r=>r?.type==="tool_use").length:t,0)}o(nf,"countToolCalls");function rf(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(rf,"countToolErrors");function of(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(`
268
+ `}o(Xu,"renderSkillTemplate");function Vu(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(Vu,"renderEvalTemplate");async function Yu(e){let t=te.resolve(e.baseDir??tt()),n=te.join(t,e.name),r=e.description??`Describe what ${e.name} does and when it should be used.`;if(await et(n)&&!e.force)throw new Error(`Skill directory already exists: ${n}`);return await $(n),await $(te.join(n,"references")),await $(te.join(n,"assets")),await $(te.join(n,"scripts")),await Qo(te.join(n,"SKILL.md"),Xu(e.name,r),"utf8"),e.includeEvals!==!1&&(await $(te.join(n,"evals")),await Qo(te.join(n,"evals","evals.json"),`${Vu(e.name)}
269
+ `,"utf8")),{skillDir:n,created:["SKILL.md",...e.includeEvals!==!1?["evals/evals.json"]:[],"references/","assets/","scripts/"]}}o(Yu,"initSkill");function Qu(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(Qu,"parseArgs");async function sr(e=process.argv){let t=Qu(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 Yu(t);console.log(`Initialized ${n.skillDir}`)}o(sr,"main");var Zu=!1;Zu&&sr().catch(e=>{console.error(e instanceof Error?e.message:String(e)),process.exit(1)});import Zo from"node:path";var ef=new Set(["name","description","license","compatibility","metadata","allowed-tools","disable-model-invocation","user-invocable","argument-hint","context","agent","model","hooks"]);async function nt(e){let t={valid:!1,errors:[],warnings:[],frontmatter:null},n;try{n=await Ze(e)}catch(l){return t.errors.push(l instanceof Error?l.message:String(l)),t}let{frontmatter:r,body:i}=n;t.frontmatter=r;let s=Object.keys(r).filter(l=>!ef.has(l));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 l=Zo.basename(Zo.resolve(e));l!==a&&t.warnings.push(`Skill directory name "${l}" 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 l=r["allowed-tools"];typeof l=="string"||Array.isArray(l)&&l.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(nt,"validateSkillDirectory");async function ar(e=process.argv){let t=e[2];t||(console.error("Usage: node scripts/quick-validate.js <skill-directory>"),process.exit(1));let n=await nt(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(ar,"main");var tf=!1;tf&&ar().catch(e=>{console.error(e instanceof Error?e.message:String(e)),process.exit(1)});import{readFile as cr,writeFile as q}from"node:fs/promises";import v from"node:path";function nf(e){return typeof e=="string"?{text:e}:e&&typeof e=="object"&&typeof e.text=="string"?{text:e.text}:null}o(nf,"normalizeAssertion");function rf(e){return e.reduce((t,n)=>Array.isArray(n.content)?t+n.content.filter(r=>r?.type==="tool_use").length:t,0)}o(rf,"countToolCalls");function of(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(of,"countToolErrors");function sf(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(`
237
270
  `)}
238
- `}o(of,"renderTranscript");async function sf(e,t){let n=v.dirname(v.resolve(t.evalsPath)),r=v.resolve(t.cwd??process.cwd()),i=[];for(let s of e??[]){let a=v.isAbsolute(s)?s:v.resolve(n,s),c=v.resolve(r,s),l=null,d=a;try{l=await cr(a,"utf8")}catch{l=await cr(c,"utf8").catch(()=>null),d=c}if(l==null)throw new Error(`Input file not found for eval: ${s}`);i.push(`### ${s}
271
+ `}o(sf,"renderTranscript");async function af(e,t){let n=v.dirname(v.resolve(t.evalsPath)),r=v.resolve(t.cwd??process.cwd()),i=[];for(let s of e??[]){let a=v.isAbsolute(s)?s:v.resolve(n,s),c=v.resolve(r,s),l=null,d=a;try{l=await cr(a,"utf8")}catch{l=await cr(c,"utf8").catch(()=>null),d=c}if(l==null)throw new Error(`Input file not found for eval: ${s}`);i.push(`### ${s}
239
272
  \`\`\`
240
273
  ${l}
241
274
  \`\`\`
@@ -245,15 +278,15 @@ ${i.join(`
245
278
 
246
279
  `)}
247
280
 
248
- `}o(sf,"readInputFiles");async function af(e,t){let n=String(e.prompt??e.query??"").trim();return`${await sf(e.files,t)}${n}`.trim()}o(af,"buildEvalPrompt");async function cf(e,t){let{runKodaX:n,estimateTokens:r}=await ee(),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:v.resolve(t.cwd??process.cwd())}},e);return{result:s,totalTokens:r(s.messages),durationMs:Date.now()-i}}o(cf,"defaultRunAgent");async function lf(e,t,n,r){if(e==="with_skill"){let{expandSkillForLLM:i}=await ir();return(await i(t,n,{workingDirectory:v.resolve(r.cwd??process.cwd()),projectRoot:v.resolve(r.cwd??process.cwd()),sessionId:"skill-eval",environment:{}})).content}return n}o(lf,"prepareConfigPrompt");async function df(e,t,n,r,i){let s=v.join(e,"outputs");await $(s);let a={total_tool_calls:nf(i.result.messages),errors_encountered:rf(i.result.messages),output_chars:i.result.lastText.length};await q(v.join(s,"result.md"),`${i.result.lastText}
281
+ `}o(af,"readInputFiles");async function cf(e,t){let n=String(e.prompt??e.query??"").trim();return`${await af(e.files,t)}${n}`.trim()}o(cf,"buildEvalPrompt");async function lf(e,t){let{runKodaX:n,estimateTokens:r}=await ee(),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:v.resolve(t.cwd??process.cwd())}},e);return{result:s,totalTokens:r(s.messages),durationMs:Date.now()-i}}o(lf,"defaultRunAgent");async function df(e,t,n,r){if(e==="with_skill"){let{expandSkillForLLM:i}=await ir();return(await i(t,n,{workingDirectory:v.resolve(r.cwd??process.cwd()),projectRoot:v.resolve(r.cwd??process.cwd()),sessionId:"skill-eval",environment:{}})).content}return n}o(df,"prepareConfigPrompt");async function uf(e,t,n,r,i){let s=v.join(e,"outputs");await $(s);let a={total_tool_calls:rf(i.result.messages),errors_encountered:of(i.result.messages),output_chars:i.result.lastText.length};await q(v.join(s,"result.md"),`${i.result.lastText}
249
282
  `,"utf8"),await q(v.join(s,"prompt.txt"),`${r}
250
- `,"utf8"),await q(v.join(e,"transcript.md"),of(r,i.result),"utf8"),await q(v.join(s,"metrics.json"),`${JSON.stringify({config:t,eval_id:n.id??null,session_id:i.result.sessionId,...a},null,2)}
283
+ `,"utf8"),await q(v.join(e,"transcript.md"),sf(r,i.result),"utf8"),await q(v.join(s,"metrics.json"),`${JSON.stringify({config:t,eval_id:n.id??null,session_id:i.result.sessionId,...a},null,2)}
251
284
  `,"utf8"),await q(v.join(s,"messages.json"),`${JSON.stringify(i.result.messages,null,2)}
252
285
  `,"utf8"),await q(v.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)}
253
286
  `,"utf8"),await q(v.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)}
254
- `,"utf8")}o(df,"writeRunArtifacts");async function uf(e,t=cf){let{loadFullSkill:n}=await ir(),r=await n(v.resolve(e.skillPath),"user");if(!r)throw new Error(`Failed to load skill from ${e.skillPath}`);let i=v.resolve(e.workspaceDir);await $(i);let s=JSON.parse(await cr(e.evalsPath,"utf8")),a=Array.isArray(s.evals)?s.evals:[],c=e.configs?.length?e.configs:["with_skill","without_skill"],l=Number.isFinite(e.runsPerConfig)&&e.runsPerConfig>0?Math.floor(e.runsPerConfig):1,d=[];for(let u=0;u<a.length;u+=1){let f=a[u],m=v.join(i,`eval-${u}`);await $(m),await q(v.join(m,"eval_metadata.json"),`${JSON.stringify({eval_id:f.id??u,eval_name:f.name??`eval-${u}`,prompt:f.prompt??f.query??"",expected_output:f.expected_output??"",assertions:(Array.isArray(f.assertions)?f.assertions:[]).map(tf).filter(Boolean)},null,2)}
255
- `,"utf8");let h=await af(f,e),w={};for(let y of c){let I=v.join(m,y);await $(I),w[y]=[];for(let b=1;b<=l;b+=1){let ne=v.join(I,`run-${b}`);await $(ne);let Er=await lf(y,r,h,e),fe=await t(Er,{...e,configName:y,evalItem:f,runIndex:b});await df(ne,y,f,Er,fe),w[y].push({run_id:`run-${b}`,session_id:fe.result.sessionId,success:fe.result.success,total_tokens:fe.totalTokens,duration_ms:fe.durationMs,output_chars:fe.result.lastText.length})}}d.push({eval_id:f.id??u,prompt:f.prompt??f.query??"",configs:w})}return{workspace:i,skill_name:r.name,eval_count:a.length,configs:c,runs_per_config:l,reports:d}}o(uf,"runEvalWorkspace");function ff(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(ff,"parseArgs");async function lr(e=process.argv){let t=ff(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 uf(t),r=`${JSON.stringify(n,null,2)}
256
- `;t.output?(await q(t.output,r,"utf8"),console.log(`Wrote ${v.resolve(t.output)}`)):process.stdout.write(r)}o(lr,"main");var pf=!1;pf&&lr().catch(e=>{console.error(e instanceof Error?e.message:String(e)),process.exit(1)});import{readdir as mf,readFile as dr,writeFile as es}from"node:fs/promises";import S from"node:path";function ue(e){return String(e??"").trim()}o(ue,"normalizeExpectationText");function ts(e){let n=(Array.isArray(e?.assertions)?e.assertions:[]).map(i=>typeof i=="string"?ue(i):i&&typeof i=="object"&&typeof i.text=="string"?ue(i.text):"").filter(Boolean);if(n.length>0)return n;let r=ue(e?.expected_output);return r?[r]:[]}o(ts,"normalizeExpectedRubric");function ur(e){return Array.isArray(e)?e.map(t=>String(t??"").trim()).filter(Boolean):[]}o(ur,"normalizeStringArray");function Zo(e,t){return{text:ue(e?.text??t),passed:e?.passed===!0,evidence:ue(e?.evidence)}}o(Zo,"normalizeExpectationEntry");function hf(e,t){let n=Pe(e)??{},r=Array.isArray(n.expectations)?n.expectations:[],i=[],s=new Set;for(let a of t){let c=r.findIndex((l,d)=>s.has(d)?!1:ue(l?.text).toLowerCase()===a.toLowerCase());if(c===-1){i.push({text:a,passed:!1,evidence:""});continue}s.add(c),i.push(Zo(r[c],a))}if(t.length===0)for(let a of r){let c=Zo(a,"");c.text&&i.push(c)}return{overall_summary:ue(n.overall_summary),expectations:i,user_notes_summary:{uncertainties:ur(n.user_notes_summary?.uncertainties),needs_review:ur(n.user_notes_summary?.needs_review),workarounds:ur(n.user_notes_summary?.workarounds)}}}o(hf,"normalizeParsedGrading");async function fr(e){return(await mf(e,{withFileTypes:!0}).catch(()=>[])).filter(n=>n.isDirectory()).map(n=>S.join(e,n.name)).sort((n,r)=>n.localeCompare(r))}o(fr,"listDirectories");async function gf(e){let t=S.dirname(e),n=S.dirname(t),r=S.basename(t),i=S.basename(e),s=S.join(e,"outputs"),a=await U(S.join(n,"eval_metadata.json"),{}),c=await dr(S.join(s,"result.md"),"utf8").catch(()=>""),l=await dr(S.join(s,"prompt.txt"),"utf8").catch(()=>""),d=await dr(S.join(e,"transcript.md"),"utf8").catch(()=>""),u=await U(S.join(s,"metrics.json"),{}),f=await U(S.join(e,"result.json"),{}),m=await U(S.join(e,"timing.json"),{});return{evalDir:n,runDir:e,runId:i,configName:r,evalMetadata:a,outputsDir:s,resultText:c,promptText:l,transcript:d,metrics:u,result:f,timing:m}}o(gf,"loadRunContext");function wf(e){let t=ts(e.evalMetadata),n=t.length>0?t.map((r,i)=>`${i+1}. ${r}`).join(`
287
+ `,"utf8")}o(uf,"writeRunArtifacts");async function ff(e,t=lf){let{loadFullSkill:n}=await ir(),r=await n(v.resolve(e.skillPath),"user");if(!r)throw new Error(`Failed to load skill from ${e.skillPath}`);let i=v.resolve(e.workspaceDir);await $(i);let s=JSON.parse(await cr(e.evalsPath,"utf8")),a=Array.isArray(s.evals)?s.evals:[],c=e.configs?.length?e.configs:["with_skill","without_skill"],l=Number.isFinite(e.runsPerConfig)&&e.runsPerConfig>0?Math.floor(e.runsPerConfig):1,d=[];for(let u=0;u<a.length;u+=1){let f=a[u],m=v.join(i,`eval-${u}`);await $(m),await q(v.join(m,"eval_metadata.json"),`${JSON.stringify({eval_id:f.id??u,eval_name:f.name??`eval-${u}`,prompt:f.prompt??f.query??"",expected_output:f.expected_output??"",assertions:(Array.isArray(f.assertions)?f.assertions:[]).map(nf).filter(Boolean)},null,2)}
288
+ `,"utf8");let h=await cf(f,e),w={};for(let y of c){let I=v.join(m,y);await $(I),w[y]=[];for(let b=1;b<=l;b+=1){let ne=v.join(I,`run-${b}`);await $(ne);let Er=await df(y,r,h,e),pe=await t(Er,{...e,configName:y,evalItem:f,runIndex:b});await uf(ne,y,f,Er,pe),w[y].push({run_id:`run-${b}`,session_id:pe.result.sessionId,success:pe.result.success,total_tokens:pe.totalTokens,duration_ms:pe.durationMs,output_chars:pe.result.lastText.length})}}d.push({eval_id:f.id??u,prompt:f.prompt??f.query??"",configs:w})}return{workspace:i,skill_name:r.name,eval_count:a.length,configs:c,runs_per_config:l,reports:d}}o(ff,"runEvalWorkspace");function pf(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(pf,"parseArgs");async function lr(e=process.argv){let t=pf(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 ff(t),r=`${JSON.stringify(n,null,2)}
289
+ `;t.output?(await q(t.output,r,"utf8"),console.log(`Wrote ${v.resolve(t.output)}`)):process.stdout.write(r)}o(lr,"main");var mf=!1;mf&&lr().catch(e=>{console.error(e instanceof Error?e.message:String(e)),process.exit(1)});import{readdir as hf,readFile as dr,writeFile as ts}from"node:fs/promises";import S from"node:path";function fe(e){return String(e??"").trim()}o(fe,"normalizeExpectationText");function ns(e){let n=(Array.isArray(e?.assertions)?e.assertions:[]).map(i=>typeof i=="string"?fe(i):i&&typeof i=="object"&&typeof i.text=="string"?fe(i.text):"").filter(Boolean);if(n.length>0)return n;let r=fe(e?.expected_output);return r?[r]:[]}o(ns,"normalizeExpectedRubric");function ur(e){return Array.isArray(e)?e.map(t=>String(t??"").trim()).filter(Boolean):[]}o(ur,"normalizeStringArray");function es(e,t){return{text:fe(e?.text??t),passed:e?.passed===!0,evidence:fe(e?.evidence)}}o(es,"normalizeExpectationEntry");function gf(e,t){let n=Pe(e)??{},r=Array.isArray(n.expectations)?n.expectations:[],i=[],s=new Set;for(let a of t){let c=r.findIndex((l,d)=>s.has(d)?!1:fe(l?.text).toLowerCase()===a.toLowerCase());if(c===-1){i.push({text:a,passed:!1,evidence:""});continue}s.add(c),i.push(es(r[c],a))}if(t.length===0)for(let a of r){let c=es(a,"");c.text&&i.push(c)}return{overall_summary:fe(n.overall_summary),expectations:i,user_notes_summary:{uncertainties:ur(n.user_notes_summary?.uncertainties),needs_review:ur(n.user_notes_summary?.needs_review),workarounds:ur(n.user_notes_summary?.workarounds)}}}o(gf,"normalizeParsedGrading");async function fr(e){return(await hf(e,{withFileTypes:!0}).catch(()=>[])).filter(n=>n.isDirectory()).map(n=>S.join(e,n.name)).sort((n,r)=>n.localeCompare(r))}o(fr,"listDirectories");async function wf(e){let t=S.dirname(e),n=S.dirname(t),r=S.basename(t),i=S.basename(e),s=S.join(e,"outputs"),a=await U(S.join(n,"eval_metadata.json"),{}),c=await dr(S.join(s,"result.md"),"utf8").catch(()=>""),l=await dr(S.join(s,"prompt.txt"),"utf8").catch(()=>""),d=await dr(S.join(e,"transcript.md"),"utf8").catch(()=>""),u=await U(S.join(s,"metrics.json"),{}),f=await U(S.join(e,"result.json"),{}),m=await U(S.join(e,"timing.json"),{});return{evalDir:n,runDir:e,runId:i,configName:r,evalMetadata:a,outputsDir:s,resultText:c,promptText:l,transcript:d,metrics:u,result:f,timing:m}}o(wf,"loadRunContext");function yf(e){let t=ns(e.evalMetadata),n=t.length>0?t.map((r,i)=>`${i+1}. ${r}`).join(`
257
290
  `):"(No explicit assertions; infer one expectation from expected_output if present.)";return`${e.agentInstructions.trim()}
258
291
 
259
292
  Return JSON with this shape:
@@ -299,12 +332,12 @@ ${JSON.stringify({total_tool_calls:e.metrics.total_tool_calls??e.result.executio
299
332
 
300
333
  ## Transcript Excerpt
301
334
  ${T(e.transcript,5e3)}
302
- `}o(wf,"buildGradingPrompt");async function ns(e,t){let{runKodaX:n}=await ee();return(await n({provider:t.provider??"anthropic",model:t.model,maxIter:t.maxIter??20,effort:t.effort??(t.reasoningMode?void 0:"medium"),reasoningMode:t.reasoningMode,context:{gitRoot:S.resolve(t.cwd??t.workspaceDir??process.cwd())}},e)).lastText}o(ns,"defaultRunJudge");async function yf(e,t,n=ns){let r=await gf(S.resolve(e)),i=ts(r.evalMetadata),s=await Ae(import.meta.url,"../agents/grader.md"),a=wf({...r,agentInstructions:s}),c=await n(a,{...t,runDir:r.runDir,configName:r.configName,evalMetadata:r.evalMetadata,runId:r.runId}),l=hf(c,i),d={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:Vo(l.expectations),expectations:l.expectations,execution_metrics:d,user_notes_summary:l.user_notes_summary,overall_summary:l.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 es(S.join(r.runDir,"grading.json"),`${JSON.stringify(u,null,2)}
303
- `,"utf8"),{runDir:r.runDir,grading:u,prompt:a,rawResponse:c}}o(yf,"gradeRun");async function kf(e,t=ns){let n=S.resolve(e.workspaceDir);await $(n);let r=new Set((e.configs??[]).map(c=>String(c).trim()).filter(Boolean)),i=[],s=[];for(let c of await fr(n))if(S.basename(c).startsWith("eval-"))for(let l of await fr(c)){let d=S.basename(l);if(!(r.size>0&&!r.has(d)))for(let u of await fr(l)){if(!S.basename(u).startsWith("run-"))continue;let f=S.join(u,"grading.json");if(await U(f,null)&&e.overwrite!==!0){s.push(S.relative(n,u).replace(/\\/g,"/"));continue}let h=await yf(u,e,t);i.push({run:S.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 es(S.join(n,"grading-summary.json"),`${JSON.stringify(a,null,2)}
304
- `,"utf8"),a}o(kf,"gradeWorkspace");function vf(e){let t={workspaceDir:e[2]??"",provider:"anthropic",model:void 0,effort:void 0,reasoningMode:void 0,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==="--effort"&&e[n+1]?t.effort=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(vf,"parseArgs");async function pr(e=process.argv){let t=vf(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 kf(t);process.stdout.write(`${JSON.stringify(n,null,2)}
305
- `)}o(pr,"main");var Sf=!1;Sf&&pr().catch(e=>{console.error(e instanceof Error?e.message:String(e)),process.exit(1)});import{writeFile as wr}from"node:fs/promises";import G from"node:path";import{readFile as bf,readdir as _f,stat as xf,writeFile as rs}from"node:fs/promises";import L from"node:path";async function mr(e){return JSON.parse(await bf(e,"utf8"))}o(mr,"readJson");async function If(e){try{return await xf(e),!0}catch{return!1}}o(If,"pathExists");async function hr(e){return(await _f(e,{withFileTypes:!0}).catch(()=>[])).filter(n=>n.isDirectory()).map(n=>L.join(e,n.name)).sort((n,r)=>n.localeCompare(r))}o(hr,"listDirectories");async function Wt(e){let t=await If(L.join(e,"runs"))?L.join(e,"runs"):e,n=(await hr(t)).filter(i=>L.basename(i).startsWith("eval-")),r={};for(let i of n){let s=L.join(i,"eval_metadata.json"),c=(await mr(s).catch(()=>({}))).eval_id??L.basename(i);for(let l of await hr(i)){let d=L.basename(l),u=(await hr(l)).filter(f=>L.basename(f).startsWith("run-"));if(u.length!==0){r[d]??=[];for(let f of u){let m=await mr(L.join(f,"grading.json")).catch(()=>null);if(!m)continue;let h=await mr(L.join(f,"timing.json")).catch(()=>({}));r[d].push({eval_id:c,run_id:L.basename(f),pass_rate:m.summary?.pass_rate??0,passed:m.summary?.passed??0,failed:m.summary?.failed??0,total:m.summary?.total??0,time_seconds:h.total_duration_seconds??m.timing?.total_duration_seconds??0,tokens:h.total_tokens??m.execution_metrics?.output_chars??0,tool_calls:m.execution_metrics?.total_tool_calls??0,errors:m.execution_metrics?.errors_encountered??0,expectations:Array.isArray(m.expectations)?m.expectations:[],notes:[...m.user_notes_summary?.uncertainties??[],...m.user_notes_summary?.needs_review??[],...m.user_notes_summary?.workarounds??[]]})}}}}return r}o(Wt,"loadRunResults");function Ef(e){let t={};for(let[s,a]of Object.entries(e))t[s]={pass_rate:Ut(a.map(c=>Number(c.pass_rate??0))),time_seconds:Ut(a.map(c=>Number(c.time_seconds??0))),tokens:Ut(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:Bt(r.pass_rate.mean-i.pass_rate.mean),time_seconds:Bt(r.time_seconds.mean-i.time_seconds.mean),tokens:Bt(r.tokens.mean-i.tokens.mean)}}}o(Ef,"summarizeConfigs");function gr(e,t,n){let r=Ef(n);return{skill_name:t,generated_at:new Date().toISOString(),workspace:L.resolve(e),configs:r.configs,delta:r.delta,runs:n}}o(gr,"buildBenchmarkDocument");function Pf(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(`
306
- `)}o(Pf,"renderBenchmarkMarkdown");function Af(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(Af,"parseArgs");async function Tf(){let{iterationDir:e,skillName:t}=Af(process.argv);e||(console.error("Usage: node scripts/aggregate-benchmark.js <iteration-dir> --skill-name <name>"),process.exit(1));let n=await Wt(e);Object.keys(n).length===0&&(console.error(`No benchmark runs found in ${e}`),process.exit(1));let r=gr(e,t,n),i=L.join(e,"benchmark.json"),s=L.join(e,"benchmark.md");await rs(i,JSON.stringify(r,null,2)),await rs(s,`${Pf(r)}
307
- `),console.log(`Wrote ${i}`),console.log(`Wrote ${s}`)}o(Tf,"main");var $f=!1;$f&&Tf().catch(e=>{console.error(e instanceof Error?e.message:String(e)),process.exit(1)});function zt(e){return Array.isArray(e)?e.map(t=>String(t??"").trim()).filter(Boolean):[]}o(zt,"normalizeStringArray");function Lf(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 l=String(c?.text??"").trim();l&&i.set(l,(i.get(l)??0)+1)}for(let c of a.notes??[]){let l=String(c??"").trim();l&&s.push(l)}}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(Lf,"summarizeFailureClusters");function Cf(e,t,n){let r=Pe(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:zt(r.key_findings),variance_hotspots:zt(r.variance_hotspots),suggested_actions:zt(r.suggested_actions),watchouts:zt(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(Cf,"normalizeAnalysisResult");function Rf(e){return`${e.agentInstructions.trim()}
335
+ `}o(yf,"buildGradingPrompt");async function rs(e,t){let{runKodaX:n}=await ee();return(await n({provider:t.provider??"anthropic",model:t.model,maxIter:t.maxIter??20,effort:t.effort??(t.reasoningMode?void 0:"medium"),reasoningMode:t.reasoningMode,context:{gitRoot:S.resolve(t.cwd??t.workspaceDir??process.cwd())}},e)).lastText}o(rs,"defaultRunJudge");async function kf(e,t,n=rs){let r=await wf(S.resolve(e)),i=ns(r.evalMetadata),s=await Ae(import.meta.url,"../agents/grader.md"),a=yf({...r,agentInstructions:s}),c=await n(a,{...t,runDir:r.runDir,configName:r.configName,evalMetadata:r.evalMetadata,runId:r.runId}),l=gf(c,i),d={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:Yo(l.expectations),expectations:l.expectations,execution_metrics:d,user_notes_summary:l.user_notes_summary,overall_summary:l.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 ts(S.join(r.runDir,"grading.json"),`${JSON.stringify(u,null,2)}
336
+ `,"utf8"),{runDir:r.runDir,grading:u,prompt:a,rawResponse:c}}o(kf,"gradeRun");async function vf(e,t=rs){let n=S.resolve(e.workspaceDir);await $(n);let r=new Set((e.configs??[]).map(c=>String(c).trim()).filter(Boolean)),i=[],s=[];for(let c of await fr(n))if(S.basename(c).startsWith("eval-"))for(let l of await fr(c)){let d=S.basename(l);if(!(r.size>0&&!r.has(d)))for(let u of await fr(l)){if(!S.basename(u).startsWith("run-"))continue;let f=S.join(u,"grading.json");if(await U(f,null)&&e.overwrite!==!0){s.push(S.relative(n,u).replace(/\\/g,"/"));continue}let h=await kf(u,e,t);i.push({run:S.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 ts(S.join(n,"grading-summary.json"),`${JSON.stringify(a,null,2)}
337
+ `,"utf8"),a}o(vf,"gradeWorkspace");function Sf(e){let t={workspaceDir:e[2]??"",provider:"anthropic",model:void 0,effort:void 0,reasoningMode:void 0,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==="--effort"&&e[n+1]?t.effort=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(Sf,"parseArgs");async function pr(e=process.argv){let t=Sf(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 vf(t);process.stdout.write(`${JSON.stringify(n,null,2)}
338
+ `)}o(pr,"main");var bf=!1;bf&&pr().catch(e=>{console.error(e instanceof Error?e.message:String(e)),process.exit(1)});import{writeFile as wr}from"node:fs/promises";import G from"node:path";import{readFile as _f,readdir as xf,stat as If,writeFile as is}from"node:fs/promises";import L from"node:path";async function mr(e){return JSON.parse(await _f(e,"utf8"))}o(mr,"readJson");async function Ef(e){try{return await If(e),!0}catch{return!1}}o(Ef,"pathExists");async function hr(e){return(await xf(e,{withFileTypes:!0}).catch(()=>[])).filter(n=>n.isDirectory()).map(n=>L.join(e,n.name)).sort((n,r)=>n.localeCompare(r))}o(hr,"listDirectories");async function Wt(e){let t=await Ef(L.join(e,"runs"))?L.join(e,"runs"):e,n=(await hr(t)).filter(i=>L.basename(i).startsWith("eval-")),r={};for(let i of n){let s=L.join(i,"eval_metadata.json"),c=(await mr(s).catch(()=>({}))).eval_id??L.basename(i);for(let l of await hr(i)){let d=L.basename(l),u=(await hr(l)).filter(f=>L.basename(f).startsWith("run-"));if(u.length!==0){r[d]??=[];for(let f of u){let m=await mr(L.join(f,"grading.json")).catch(()=>null);if(!m)continue;let h=await mr(L.join(f,"timing.json")).catch(()=>({}));r[d].push({eval_id:c,run_id:L.basename(f),pass_rate:m.summary?.pass_rate??0,passed:m.summary?.passed??0,failed:m.summary?.failed??0,total:m.summary?.total??0,time_seconds:h.total_duration_seconds??m.timing?.total_duration_seconds??0,tokens:h.total_tokens??m.execution_metrics?.output_chars??0,tool_calls:m.execution_metrics?.total_tool_calls??0,errors:m.execution_metrics?.errors_encountered??0,expectations:Array.isArray(m.expectations)?m.expectations:[],notes:[...m.user_notes_summary?.uncertainties??[],...m.user_notes_summary?.needs_review??[],...m.user_notes_summary?.workarounds??[]]})}}}}return r}o(Wt,"loadRunResults");function Pf(e){let t={};for(let[s,a]of Object.entries(e))t[s]={pass_rate:Ut(a.map(c=>Number(c.pass_rate??0))),time_seconds:Ut(a.map(c=>Number(c.time_seconds??0))),tokens:Ut(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:Bt(r.pass_rate.mean-i.pass_rate.mean),time_seconds:Bt(r.time_seconds.mean-i.time_seconds.mean),tokens:Bt(r.tokens.mean-i.tokens.mean)}}}o(Pf,"summarizeConfigs");function gr(e,t,n){let r=Pf(n);return{skill_name:t,generated_at:new Date().toISOString(),workspace:L.resolve(e),configs:r.configs,delta:r.delta,runs:n}}o(gr,"buildBenchmarkDocument");function Af(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(`
339
+ `)}o(Af,"renderBenchmarkMarkdown");function Tf(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(Tf,"parseArgs");async function $f(){let{iterationDir:e,skillName:t}=Tf(process.argv);e||(console.error("Usage: node scripts/aggregate-benchmark.js <iteration-dir> --skill-name <name>"),process.exit(1));let n=await Wt(e);Object.keys(n).length===0&&(console.error(`No benchmark runs found in ${e}`),process.exit(1));let r=gr(e,t,n),i=L.join(e,"benchmark.json"),s=L.join(e,"benchmark.md");await is(i,JSON.stringify(r,null,2)),await is(s,`${Af(r)}
340
+ `),console.log(`Wrote ${i}`),console.log(`Wrote ${s}`)}o($f,"main");var Lf=!1;Lf&&$f().catch(e=>{console.error(e instanceof Error?e.message:String(e)),process.exit(1)});function zt(e){return Array.isArray(e)?e.map(t=>String(t??"").trim()).filter(Boolean):[]}o(zt,"normalizeStringArray");function Cf(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 l=String(c?.text??"").trim();l&&i.set(l,(i.get(l)??0)+1)}for(let c of a.notes??[]){let l=String(c??"").trim();l&&s.push(l)}}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(Cf,"summarizeFailureClusters");function Rf(e,t,n){let r=Pe(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:zt(r.key_findings),variance_hotspots:zt(r.variance_hotspots),suggested_actions:zt(r.suggested_actions),watchouts:zt(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(Rf,"normalizeAnalysisResult");function Nf(e){return`${e.agentInstructions.trim()}
308
341
 
309
342
  Return JSON with this shape:
310
343
  {
@@ -322,12 +355,12 @@ ${T(JSON.stringify({skill_name:e.benchmark.skill_name,configs:e.benchmark.config
322
355
 
323
356
  ## Failure Clusters
324
357
  ${T(JSON.stringify(e.failureClusters,null,2),8e3)}
325
- `}o(Rf,"buildAnalysisPrompt");async function Nf(e,t){let{runKodaX:n}=await ee();return(await n({provider:t.provider??"anthropic",model:t.model,maxIter:t.maxIter??20,effort:t.effort??(t.reasoningMode?void 0:"medium"),reasoningMode:t.reasoningMode,context:{gitRoot:G.resolve(t.cwd??t.workspaceDir??process.cwd())}},e)).lastText}o(Nf,"defaultRunAnalyst");function Df(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(`
358
+ `}o(Nf,"buildAnalysisPrompt");async function Df(e,t){let{runKodaX:n}=await ee();return(await n({provider:t.provider??"anthropic",model:t.model,maxIter:t.maxIter??20,effort:t.effort??(t.reasoningMode?void 0:"medium"),reasoningMode:t.reasoningMode,context:{gitRoot:G.resolve(t.cwd??t.workspaceDir??process.cwd())}},e)).lastText}o(Df,"defaultRunAnalyst");function Of(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(`
326
359
  `)}
327
- `}o(Df,"renderAnalysisMarkdown");async function Of(e,t=Nf){let n=G.resolve(e.workspaceDir),r=G.resolve(e.benchmarkPath??G.join(n,"benchmark.json")),i=await U(r,null);if(!i){let h=await Wt(n);if(Object.keys(h).length===0)throw new Error(`No benchmark data found in ${n}`);i=gr(n,e.skillName??G.basename(n),h),await wr(r,`${JSON.stringify(i,null,2)}
328
- `,"utf8")}let s=await Wt(n),a=Lf(s),c=await Ae(import.meta.url,"../agents/analyzer.md"),l=Rf({agentInstructions:c,benchmark:i,failureClusters:a}),d=await t(l,{...e,workspaceDir:n,benchmarkPath:r,benchmark:i}),u=Cf(d,i,a),f=G.resolve(e.outputPath??G.join(n,"analysis.json")),m=G.resolve(e.markdownPath??G.join(n,"analysis.md"));return await wr(f,`${JSON.stringify(u,null,2)}
329
- `,"utf8"),await wr(m,Df(u),"utf8"),{analysis:u,prompt:l,rawResponse:d,analysisJsonPath:f,analysisMdPath:m}}o(Of,"analyzeBenchmark");function jf(e){let t={workspaceDir:e[2]??"",benchmarkPath:void 0,outputPath:void 0,markdownPath:void 0,skillName:void 0,provider:"anthropic",model:void 0,effort:void 0,reasoningMode:void 0,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==="--effort"&&e[n+1]?t.effort=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(jf,"parseArgs");async function yr(e=process.argv){let t=jf(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 Of(t);process.stdout.write(`${JSON.stringify({analysis:n.analysis,analysis_json:n.analysisJsonPath,analysis_md:n.analysisMdPath},null,2)}
330
- `)}o(yr,"main");var Ff=!1;Ff&&yr().catch(e=>{console.error(e instanceof Error?e.message:String(e)),process.exit(1)});import{readdir as Mf,readFile as is,writeFile as os}from"node:fs/promises";import _ from"node:path";async function vr(e){return(await Mf(e,{withFileTypes:!0}).catch(()=>[])).filter(n=>n.isDirectory()).map(n=>_.join(e,n.name)).sort((n,r)=>n.localeCompare(r))}o(vr,"listDirectories");function kr(e){return Array.isArray(e)?e.map(t=>String(t??"").trim()).filter(Boolean):[]}o(kr,"normalizeStringArray");function Kf(e){let t=Pe(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:kr(t.strengths_a),strengths_b:kr(t.strengths_b),risks:kr(t.risks)}}o(Kf,"normalizeComparisonResult");async function Uf(e,t,n,r){let i=(await vr(_.join(e,t))).filter(f=>_.basename(f).startsWith("run-")),s=(await vr(_.join(e,n))).filter(f=>_.basename(f).startsWith("run-")),a=i[r],c=s[r];if(!a||!c)return null;let l=await U(_.join(e,"eval_metadata.json"),{}),d=await is(_.join(a,"outputs","result.md"),"utf8").catch(()=>""),u=await is(_.join(c,"outputs","result.md"),"utf8").catch(()=>"");return{evalDir:e,evalMetadata:l,runA:{runDir:a,runId:_.basename(a),configName:t,output:d},runB:{runDir:c,runId:_.basename(c),configName:n,output:u}}}o(Uf,"loadComparisonPair");function Bf(e){let t=e.presentPrimaryFirst?{A:e.runA,B:e.runB}:{A:e.runB,B:e.runA};return`${e.agentInstructions.trim()}
360
+ `}o(Of,"renderAnalysisMarkdown");async function jf(e,t=Df){let n=G.resolve(e.workspaceDir),r=G.resolve(e.benchmarkPath??G.join(n,"benchmark.json")),i=await U(r,null);if(!i){let h=await Wt(n);if(Object.keys(h).length===0)throw new Error(`No benchmark data found in ${n}`);i=gr(n,e.skillName??G.basename(n),h),await wr(r,`${JSON.stringify(i,null,2)}
361
+ `,"utf8")}let s=await Wt(n),a=Cf(s),c=await Ae(import.meta.url,"../agents/analyzer.md"),l=Nf({agentInstructions:c,benchmark:i,failureClusters:a}),d=await t(l,{...e,workspaceDir:n,benchmarkPath:r,benchmark:i}),u=Rf(d,i,a),f=G.resolve(e.outputPath??G.join(n,"analysis.json")),m=G.resolve(e.markdownPath??G.join(n,"analysis.md"));return await wr(f,`${JSON.stringify(u,null,2)}
362
+ `,"utf8"),await wr(m,Of(u),"utf8"),{analysis:u,prompt:l,rawResponse:d,analysisJsonPath:f,analysisMdPath:m}}o(jf,"analyzeBenchmark");function Ff(e){let t={workspaceDir:e[2]??"",benchmarkPath:void 0,outputPath:void 0,markdownPath:void 0,skillName:void 0,provider:"anthropic",model:void 0,effort:void 0,reasoningMode:void 0,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==="--effort"&&e[n+1]?t.effort=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(Ff,"parseArgs");async function yr(e=process.argv){let t=Ff(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 jf(t);process.stdout.write(`${JSON.stringify({analysis:n.analysis,analysis_json:n.analysisJsonPath,analysis_md:n.analysisMdPath},null,2)}
363
+ `)}o(yr,"main");var Mf=!1;Mf&&yr().catch(e=>{console.error(e instanceof Error?e.message:String(e)),process.exit(1)});import{readdir as Kf,readFile as os,writeFile as ss}from"node:fs/promises";import _ from"node:path";async function vr(e){return(await Kf(e,{withFileTypes:!0}).catch(()=>[])).filter(n=>n.isDirectory()).map(n=>_.join(e,n.name)).sort((n,r)=>n.localeCompare(r))}o(vr,"listDirectories");function kr(e){return Array.isArray(e)?e.map(t=>String(t??"").trim()).filter(Boolean):[]}o(kr,"normalizeStringArray");function Uf(e){let t=Pe(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:kr(t.strengths_a),strengths_b:kr(t.strengths_b),risks:kr(t.risks)}}o(Uf,"normalizeComparisonResult");async function Bf(e,t,n,r){let i=(await vr(_.join(e,t))).filter(f=>_.basename(f).startsWith("run-")),s=(await vr(_.join(e,n))).filter(f=>_.basename(f).startsWith("run-")),a=i[r],c=s[r];if(!a||!c)return null;let l=await U(_.join(e,"eval_metadata.json"),{}),d=await os(_.join(a,"outputs","result.md"),"utf8").catch(()=>""),u=await os(_.join(c,"outputs","result.md"),"utf8").catch(()=>"");return{evalDir:e,evalMetadata:l,runA:{runDir:a,runId:_.basename(a),configName:t,output:d},runB:{runDir:c,runId:_.basename(c),configName:n,output:u}}}o(Bf,"loadComparisonPair");function Wf(e){let t=e.presentPrimaryFirst?{A:e.runA,B:e.runB}:{A:e.runB,B:e.runA};return`${e.agentInstructions.trim()}
331
364
 
332
365
  Return JSON with this shape:
333
366
  {
@@ -355,12 +388,12 @@ ${T(t.A.output,12e3)}
355
388
 
356
389
  ## Candidate B
357
390
  ${T(t.B.output,12e3)}
358
- `}o(Bf,"buildComparisonPrompt");async function Wf(e,t){let{runKodaX:n}=await ee();return(await n({provider:t.provider??"anthropic",model:t.model,maxIter:t.maxIter??20,effort:t.effort??(t.reasoningMode?void 0:"medium"),reasoningMode:t.reasoningMode,context:{gitRoot:_.resolve(t.cwd??t.workspaceDir??process.cwd())}},e)).lastText}o(Wf,"defaultRunComparator");function zf(e,t,n,r){return e==="A"?t?n:r:e==="B"?t?r:n:e}o(zf,"mapWinnerToConfig");function Hf(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(`
391
+ `}o(Wf,"buildComparisonPrompt");async function zf(e,t){let{runKodaX:n}=await ee();return(await n({provider:t.provider??"anthropic",model:t.model,maxIter:t.maxIter??20,effort:t.effort??(t.reasoningMode?void 0:"medium"),reasoningMode:t.reasoningMode,context:{gitRoot:_.resolve(t.cwd??t.workspaceDir??process.cwd())}},e)).lastText}o(zf,"defaultRunComparator");function Hf(e,t,n,r){return e==="A"?t?n:r:e==="B"?t?r:n:e}o(Hf,"mapWinnerToConfig");function Jf(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(`
359
392
  `)}
360
- `}o(Hf,"renderComparisonMarkdown");async function Jf(e,t=Wf){let n=_.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 Ae(import.meta.url,"../agents/comparator.md"),c=[];for(let f of await vr(n))if(_.basename(f).startsWith("eval-"))for(let m=0;m<s;m+=1){let h=await Uf(f,r,i,m);if(!h)break;let w=c.length%2===0,y=Bf({agentInstructions:a,evalMetadata:h.evalMetadata,runA:h.runA,runB:h.runB,presentPrimaryFirst:w}),I=await t(y,{...e,workspaceDir:n,evalDir:f,pairIndex:m,configA:r,configB:i}),b=Kf(I),ne=zf(b.winner,w,r,i);c.push({index:c.length+1,eval_id:h.evalMetadata.eval_id??null,eval_name:h.evalMetadata.eval_name??null,run_a:_.relative(n,h.runA.runDir).replace(/\\/g,"/"),run_b:_.relative(n,h.runB.runDir).replace(/\\/g,"/"),presented_as:w?{A:r,B:i}:{A:i,B:r},winner_label:b.winner,winner_config:ne,confidence:b.confidence,rationale:b.rationale,strengths_a:b.strengths_a,strengths_b:b.strengths_b,risks:b.risks})}if(c.length===0)throw new Error(`No comparable run pairs found for ${r} vs ${i} in ${n}`);let l={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},d=_.resolve(e.outputPath??_.join(n,"comparison.json")),u=_.resolve(e.markdownPath??_.join(n,"comparison.md"));return await os(d,`${JSON.stringify(l,null,2)}
361
- `,"utf8"),await os(u,Hf(l),"utf8"),{document:l,outputPath:d,markdownPath:u}}o(Jf,"compareWorkspace");function qf(e){let t={workspaceDir:e[2]??"",configA:"with_skill",configB:"without_skill",outputPath:void 0,markdownPath:void 0,provider:"anthropic",model:void 0,effort:void 0,reasoningMode:void 0,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==="--effort"&&e[n+1]?t.effort=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(qf,"parseArgs");async function Sr(e=process.argv){let t=qf(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 Jf(t);process.stdout.write(`${JSON.stringify({comparison:n.document.summary,output:n.outputPath,markdown:n.markdownPath},null,2)}
362
- `)}o(Sr,"main");var Gf=!1;Gf&&Sr().catch(e=>{console.error(e instanceof Error?e.message:String(e)),process.exit(1)});import{readFile as Xf,writeFile as Vf}from"node:fs/promises";import{createHash as Yf}from"node:crypto";import br from"node:path";import{zipSync as Qf,strToU8 as Zf}from"fflate";var ep=".kodax-package.json";function tp(e){return e instanceof Uint8Array?e:new Uint8Array(e)}o(tp,"toUint8Array");function np(e){return Yf("sha256").update(e).digest("hex")}o(np,"sha256");function rp(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(rp,"createPackageManifest");async function ip(e,t={}){let n=await nt(e);if(!n.valid)throw new Error(`Cannot package invalid skill:
393
+ `}o(Jf,"renderComparisonMarkdown");async function qf(e,t=zf){let n=_.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 Ae(import.meta.url,"../agents/comparator.md"),c=[];for(let f of await vr(n))if(_.basename(f).startsWith("eval-"))for(let m=0;m<s;m+=1){let h=await Bf(f,r,i,m);if(!h)break;let w=c.length%2===0,y=Wf({agentInstructions:a,evalMetadata:h.evalMetadata,runA:h.runA,runB:h.runB,presentPrimaryFirst:w}),I=await t(y,{...e,workspaceDir:n,evalDir:f,pairIndex:m,configA:r,configB:i}),b=Uf(I),ne=Hf(b.winner,w,r,i);c.push({index:c.length+1,eval_id:h.evalMetadata.eval_id??null,eval_name:h.evalMetadata.eval_name??null,run_a:_.relative(n,h.runA.runDir).replace(/\\/g,"/"),run_b:_.relative(n,h.runB.runDir).replace(/\\/g,"/"),presented_as:w?{A:r,B:i}:{A:i,B:r},winner_label:b.winner,winner_config:ne,confidence:b.confidence,rationale:b.rationale,strengths_a:b.strengths_a,strengths_b:b.strengths_b,risks:b.risks})}if(c.length===0)throw new Error(`No comparable run pairs found for ${r} vs ${i} in ${n}`);let l={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},d=_.resolve(e.outputPath??_.join(n,"comparison.json")),u=_.resolve(e.markdownPath??_.join(n,"comparison.md"));return await ss(d,`${JSON.stringify(l,null,2)}
394
+ `,"utf8"),await ss(u,Jf(l),"utf8"),{document:l,outputPath:d,markdownPath:u}}o(qf,"compareWorkspace");function Gf(e){let t={workspaceDir:e[2]??"",configA:"with_skill",configB:"without_skill",outputPath:void 0,markdownPath:void 0,provider:"anthropic",model:void 0,effort:void 0,reasoningMode:void 0,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==="--effort"&&e[n+1]?t.effort=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(Gf,"parseArgs");async function Sr(e=process.argv){let t=Gf(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 qf(t);process.stdout.write(`${JSON.stringify({comparison:n.document.summary,output:n.outputPath,markdown:n.markdownPath},null,2)}
395
+ `)}o(Sr,"main");var Xf=!1;Xf&&Sr().catch(e=>{console.error(e instanceof Error?e.message:String(e)),process.exit(1)});import{readFile as Vf,writeFile as Yf}from"node:fs/promises";import{createHash as Qf}from"node:crypto";import br from"node:path";import{zipSync as Zf,strToU8 as ep}from"fflate";var tp=".kodax-package.json";function np(e){return e instanceof Uint8Array?e:new Uint8Array(e)}o(np,"toUint8Array");function rp(e){return Qf("sha256").update(e).digest("hex")}o(rp,"sha256");function ip(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(ip,"createPackageManifest");async function op(e,t={}){let n=await nt(e);if(!n.valid)throw new Error(`Cannot package invalid skill:
363
396
  - ${n.errors.join(`
364
- - `)}`);let r=await Ze(e),i=await or(e),s=[];for(let l of i){if(l.relativePath.endsWith(".skill"))continue;let d=tp(await Xf(l.absolutePath));s.push({...l,bytes:d,sha256:np(d)})}let a=rp(r,s,t),c={[ep]:Zf(JSON.stringify(a,null,2))};for(let l of s)c[l.relativePath]=l.bytes;return{manifest:a,bytes:Qf(c,{level:6})}}o(ip,"buildSkillPackage");async function op(e,t,n={}){let r=await ip(e,n);return await Vf(t,r.bytes),{...r,outputPath:br.resolve(t)}}o(op,"writeSkillPackage");function sp(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(sp,"parseArgs");async function _r(e=process.argv){let t=sp(e);t.skillDir||(console.error("Usage: node scripts/package-skill.js <skill-dir> [--output <file.skill>]"),process.exit(1));let n=await Ze(t.skillDir),r=t.output??br.join(br.dirname(t.skillDir),`${n.frontmatter.name}.skill`),i=await op(t.skillDir,r);console.log(`Wrote ${i.outputPath}`)}o(_r,"main");var ap=!1;ap&&_r().catch(e=>{console.error(e instanceof Error?e.message:String(e)),process.exit(1)});import{cp,mkdir as xr,readFile as cs,rm as ls,stat as lp,writeFile as dp}from"node:fs/promises";import B from"node:path";import{strFromU8 as ss,unzipSync as up}from"fflate";var as=".kodax-package.json";function fp(e){return e.replace(/\\/g,"/").replace(/^\.?\//,"")}o(fp,"normalizeArchivePath");function pp(e){let t=fp(e);if(!t||t.startsWith("/")||t.includes("../"))throw new Error(`Unsafe archive entry path: ${e}`);return t}o(pp,"assertSafeArchivePath");function mp(e){return/\.(skill|zip)$/i.test(e)}o(mp,"isZipLike");function hp(e){let t=up(e),n=Object.entries(t).map(([d,u])=>({relativePath:pp(d),bytes:u})),r=n.find(d=>d.relativePath==="SKILL.md");if(!r)throw new Error("Archive is missing SKILL.md");let i=Kt(ss(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(d=>d.relativePath===as),l=c?JSON.parse(ss(c.bytes)):null;return{skillName:s,manifest:l,entries:n.filter(d=>d.relativePath!==as)}}o(hp,"readSkillPackageBuffer");async function gp(e,t){if(await et(e)){if(!t)throw new Error(`Target skill already exists: ${e}`);await ls(e,{recursive:!0,force:!0})}await xr(e,{recursive:!0})}o(gp,"ensureInstallTarget");async function wp(e,t={}){let n=B.resolve(t.skillsDir??tt()),r=hp(await cs(e)),i=B.join(n,r.skillName);await gp(i,t.force===!0);for(let s of r.entries){let a=B.join(i,s.relativePath);await xr(B.dirname(a),{recursive:!0}),await dp(a,s.bytes)}return{skillName:r.skillName,installedTo:i,source:B.resolve(e),manifest:r.manifest}}o(wp,"installSkillArchive");async function yp(e,t={}){let n=await nt(e);if(!n.valid)throw new Error(`Cannot install invalid skill:
397
+ - `)}`);let r=await Ze(e),i=await or(e),s=[];for(let l of i){if(l.relativePath.endsWith(".skill"))continue;let d=np(await Vf(l.absolutePath));s.push({...l,bytes:d,sha256:rp(d)})}let a=ip(r,s,t),c={[tp]:ep(JSON.stringify(a,null,2))};for(let l of s)c[l.relativePath]=l.bytes;return{manifest:a,bytes:Zf(c,{level:6})}}o(op,"buildSkillPackage");async function sp(e,t,n={}){let r=await op(e,n);return await Yf(t,r.bytes),{...r,outputPath:br.resolve(t)}}o(sp,"writeSkillPackage");function ap(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(ap,"parseArgs");async function _r(e=process.argv){let t=ap(e);t.skillDir||(console.error("Usage: node scripts/package-skill.js <skill-dir> [--output <file.skill>]"),process.exit(1));let n=await Ze(t.skillDir),r=t.output??br.join(br.dirname(t.skillDir),`${n.frontmatter.name}.skill`),i=await sp(t.skillDir,r);console.log(`Wrote ${i.outputPath}`)}o(_r,"main");var cp=!1;cp&&_r().catch(e=>{console.error(e instanceof Error?e.message:String(e)),process.exit(1)});import{cp as lp,mkdir as xr,readFile as ls,rm as ds,stat as dp,writeFile as up}from"node:fs/promises";import B from"node:path";import{strFromU8 as as,unzipSync as fp}from"fflate";var cs=".kodax-package.json";function pp(e){return e.replace(/\\/g,"/").replace(/^\.?\//,"")}o(pp,"normalizeArchivePath");function mp(e){let t=pp(e);if(!t||t.startsWith("/")||t.includes("../"))throw new Error(`Unsafe archive entry path: ${e}`);return t}o(mp,"assertSafeArchivePath");function hp(e){return/\.(skill|zip)$/i.test(e)}o(hp,"isZipLike");function gp(e){let t=fp(e),n=Object.entries(t).map(([d,u])=>({relativePath:mp(d),bytes:u})),r=n.find(d=>d.relativePath==="SKILL.md");if(!r)throw new Error("Archive is missing SKILL.md");let i=Kt(as(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(d=>d.relativePath===cs),l=c?JSON.parse(as(c.bytes)):null;return{skillName:s,manifest:l,entries:n.filter(d=>d.relativePath!==cs)}}o(gp,"readSkillPackageBuffer");async function wp(e,t){if(await et(e)){if(!t)throw new Error(`Target skill already exists: ${e}`);await ds(e,{recursive:!0,force:!0})}await xr(e,{recursive:!0})}o(wp,"ensureInstallTarget");async function yp(e,t={}){let n=B.resolve(t.skillsDir??tt()),r=gp(await ls(e)),i=B.join(n,r.skillName);await wp(i,t.force===!0);for(let s of r.entries){let a=B.join(i,s.relativePath);await xr(B.dirname(a),{recursive:!0}),await up(a,s.bytes)}return{skillName:r.skillName,installedTo:i,source:B.resolve(e),manifest:r.manifest}}o(yp,"installSkillArchive");async function kp(e,t={}){let n=await nt(e);if(!n.valid)throw new Error(`Cannot install invalid skill:
365
398
  - ${n.errors.join(`
366
- - `)}`);let r=B.join(e,"SKILL.md"),i=Kt(await cs(r,"utf8")),s=B.resolve(t.skillsDir??tt()),a=B.join(s,i.frontmatter.name);if(await et(a)){if(!t.force)throw new Error(`Target skill already exists: ${a}`);await ls(a,{recursive:!0,force:!0})}return await xr(s,{recursive:!0}),await cp(e,a,{recursive:!0}),{skillName:i.frontmatter.name,installedTo:a,source:B.resolve(e),manifest:null}}o(yp,"installSkillDirectory");async function kp(e,t={}){let n=B.resolve(e),r=await lp(n).catch(()=>null);if(!r)throw new Error(`Input not found: ${n}`);if(r.isDirectory())return yp(n,t);if(r.isFile()&&mp(n))return wp(n,t);throw new Error("Input must be a skill directory or a .skill/.zip archive.")}o(kp,"installSkill");function vp(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(vp,"parseArgs");async function Ir(e=process.argv){let t=vp(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 kp(t.input,t);console.log(`Installed ${n.skillName} to ${n.installedTo}`)}o(Ir,"main");var Sp=!1;Sp&&Ir().catch(e=>{console.error(e instanceof Error?e.message:String(e)),process.exit(1)});var bp=["init","validate","eval","grade","analyze","compare","package","install"],_p={init:sr,validate:ar,eval:lr,grade:pr,analyze:yr,compare:Sr,package:_r,install:Ir};function xp(e){return e!==void 0&&bp.some(t=>t===e)}o(xp,"isSkillCreatorDispatchAction");async function Ip(e,t,n){Xo(n),await _p[e]([process.execPath,`skill-${e}.js`,...t])}o(Ip,"dispatchSkillCreatorTool");export{cm as a,lt as b,D as c,lm as d,dm as e,um as f,Fp as g,E as h,ks as i,ym as j,Qr as k,W as l,ut as m,Km as n,Aa as o,mt as p,Um as q,Ta as r,Oe as s,Bm as t,Wm as u,zm as v,Hm as w,Jm as x,qm as y,ui as z,Na as A,Gm as B,Da as C,Xm as D,Vm as E,ma as F,dt as G,bm as H,Ce as I,Re as J,Ne as K,ya as L,$m as M,Lm as N,Cm as O,Rm as P,us as Q,fs as R,Jt as S,ps as T,qt as U,Gt as V,Lr as W,Cr as X,Rr as Y,Vt as Z,it as _,Yt as $,Ps as aa,Zt as ba,Dr as ca,en as da,Mr as ea,Kr as fa,at as ga,gt as ha,Ke as ia,Ba as ja,rh as ka,H as la,En as ma,Sc as na,Ue as oa,Pn as pa,$n as qa,Ln as ra,zc as sa,Hc as ta,Xi as ua,Vc as va,Vi as wa,Yc as xa,ll as ya,pl as za,p as Aa,Qi as Ba,ve as Ca,M as Da,Zi as Ea,xt as Fa,co as Ga,J as Ha,Et as Ia,We as Ja,At as Ka,jl as La,ql as Ma,Gl as Na,id as Oa,od as Pa,Kn as Qa,go as Ra,yo as Sa,ko as Ta,sd as Ua,Un as Va,ad as Wa,Bn as Xa,$t as Ya,ld as Za,P as _a,xd as $a,Ud as ab,eu as bb,tu as cb,nu as db,ru as eb,Yn as fb,su as gb,Ot as hb,Fo as ib,Iu as jb,Ko as kb,Ve as lb,$u as mb,le as nb,Wo as ob,jt as pb,Ft as qb,Ru as rb,Nu as sb,Ye as tb,Du as ub,Ou as vb,Ku as wb,Uu as xb,xp as yb,Ip as zb};
399
+ - `)}`);let r=B.join(e,"SKILL.md"),i=Kt(await ls(r,"utf8")),s=B.resolve(t.skillsDir??tt()),a=B.join(s,i.frontmatter.name);if(await et(a)){if(!t.force)throw new Error(`Target skill already exists: ${a}`);await ds(a,{recursive:!0,force:!0})}return await xr(s,{recursive:!0}),await lp(e,a,{recursive:!0}),{skillName:i.frontmatter.name,installedTo:a,source:B.resolve(e),manifest:null}}o(kp,"installSkillDirectory");async function vp(e,t={}){let n=B.resolve(e),r=await dp(n).catch(()=>null);if(!r)throw new Error(`Input not found: ${n}`);if(r.isDirectory())return kp(n,t);if(r.isFile()&&hp(n))return yp(n,t);throw new Error("Input must be a skill directory or a .skill/.zip archive.")}o(vp,"installSkill");function Sp(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(Sp,"parseArgs");async function Ir(e=process.argv){let t=Sp(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 vp(t.input,t);console.log(`Installed ${n.skillName} to ${n.installedTo}`)}o(Ir,"main");var bp=!1;bp&&Ir().catch(e=>{console.error(e instanceof Error?e.message:String(e)),process.exit(1)});var _p=["init","validate","eval","grade","analyze","compare","package","install"],xp={init:sr,validate:ar,eval:lr,grade:pr,analyze:yr,compare:Sr,package:_r,install:Ir};function Ip(e){return e!==void 0&&_p.some(t=>t===e)}o(Ip,"isSkillCreatorDispatchAction");async function Ep(e,t,n){Vo(n),await xp[e]([process.execPath,`skill-${e}.js`,...t])}o(Ep,"dispatchSkillCreatorTool");export{lm as a,lt as b,D as c,dm as d,um as e,fm as f,Mp as g,E as h,vs as i,km as j,Qr as k,W as l,ut as m,Um as n,Ta as o,mt as p,Bm as q,$a as r,Wm as s,Oe as t,zm as u,Hm as v,Jm as w,qm as x,Gm as y,Xm as z,fi as A,Da as B,Vm as C,Oa as D,Ym as E,Qm as F,ha as G,dt as H,_m as I,Ce as J,Re as K,Ne as L,ka as M,Lm as N,Cm as O,Rm as P,Nm as Q,fs as R,ps as S,Jt as T,ms as U,qt as V,Gt as W,Lr as X,Cr as Y,Rr as Z,Vt as _,it as $,Yt as aa,As as ba,Zt as ca,Dr as da,en as ea,Mr as fa,Kr as ga,at as ha,gt as ia,Ke as ja,Wa as ka,oh as la,H as ma,En as na,bc as oa,Ue as pa,Pn as qa,$n as ra,Ln as sa,Hc as ta,Jc as ua,Vi as va,Yc as wa,Yi as xa,Qc as ya,dl as za,ml as Aa,p as Ba,Zi as Ca,ve as Da,M as Ea,eo as Fa,xt as Ga,lo as Ha,J as Ia,Et as Ja,We as Ka,At as La,Fl as Ma,Gl as Na,Xl as Oa,od as Pa,sd as Qa,Kn as Ra,wo as Sa,ko as Ta,vo as Ua,ad as Va,Un as Wa,cd as Xa,Bn as Ya,$t as Za,dd as _a,P as $a,Id as ab,Bd as bb,tu as cb,nu as db,ru as eb,iu as fb,Yn as gb,au as hb,Ot as ib,Mo as jb,Eu as kb,Uo as lb,Ve as mb,Lu as nb,de as ob,zo as pb,jt as qb,Ft as rb,Nu as sb,Du as tb,Ye as ub,Ou as vb,ju as wb,Uu as xb,Bu as yb,Ip as zb,Ep as Ab};