@theokit/sdk 4.36.0 → 4.37.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (301) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/dist/agent-K5LYVJGJ.cjs +51 -0
  3. package/dist/{agent-P77NPBF4.cjs.map → agent-K5LYVJGJ.cjs.map} +1 -1
  4. package/dist/agent-ODWMOAEC.js +42 -0
  5. package/dist/{agent-H6HL5ITH.js.map → agent-ODWMOAEC.js.map} +1 -1
  6. package/dist/agent.d.ts +2 -1
  7. package/dist/auth/index.cjs +15 -15
  8. package/dist/auth/index.js +4 -4
  9. package/dist/{batch-2FSD2UNL.cjs → batch-3SEPDXCU.cjs} +23 -23
  10. package/dist/{batch-2FSD2UNL.cjs.map → batch-3SEPDXCU.cjs.map} +1 -1
  11. package/dist/{batch-MR2HKYMS.js → batch-SY5GZLFD.js} +9 -9
  12. package/dist/{batch-MR2HKYMS.js.map → batch-SY5GZLFD.js.map} +1 -1
  13. package/dist/{chunk-JLMXKTBX.cjs → chunk-2423XDPT.cjs} +26 -26
  14. package/dist/{chunk-JLMXKTBX.cjs.map → chunk-2423XDPT.cjs.map} +1 -1
  15. package/dist/{chunk-5IB2UKSN.js → chunk-2WFB5ZOX.js} +5 -5
  16. package/dist/{chunk-5IB2UKSN.js.map → chunk-2WFB5ZOX.js.map} +1 -1
  17. package/dist/{chunk-EPYZOCOL.cjs → chunk-3ILFUXNE.cjs} +5 -5
  18. package/dist/{chunk-EPYZOCOL.cjs.map → chunk-3ILFUXNE.cjs.map} +1 -1
  19. package/dist/{chunk-KSKU6JY6.cjs → chunk-3O2ELBST.cjs} +5 -5
  20. package/dist/{chunk-KSKU6JY6.cjs.map → chunk-3O2ELBST.cjs.map} +1 -1
  21. package/dist/{chunk-M2PU44HP.cjs → chunk-4YB7B3RP.cjs} +8 -8
  22. package/dist/{chunk-M2PU44HP.cjs.map → chunk-4YB7B3RP.cjs.map} +1 -1
  23. package/dist/{chunk-S2BBRVQX.js → chunk-56OXYUZE.js} +8 -7
  24. package/dist/chunk-56OXYUZE.js.map +1 -0
  25. package/dist/{chunk-D42XHI4O.cjs → chunk-56ZM6P7Z.cjs} +13 -14
  26. package/dist/chunk-56ZM6P7Z.cjs.map +1 -0
  27. package/dist/{chunk-7BTE3RXJ.js → chunk-5SB4V74H.js} +7 -8
  28. package/dist/chunk-5SB4V74H.js.map +1 -0
  29. package/dist/{chunk-MZ5ZRORA.cjs → chunk-6EDQBX7U.cjs} +17 -16
  30. package/dist/chunk-6EDQBX7U.cjs.map +1 -0
  31. package/dist/{chunk-RKG6QFCJ.js → chunk-6VP3XGEK.js} +4 -4
  32. package/dist/{chunk-RKG6QFCJ.js.map → chunk-6VP3XGEK.js.map} +1 -1
  33. package/dist/{chunk-KAP4GJHO.js → chunk-77WHPVXE.js} +10 -11
  34. package/dist/chunk-77WHPVXE.js.map +1 -0
  35. package/dist/{chunk-LALRCFSN.cjs → chunk-7DXLNNKH.cjs} +4 -4
  36. package/dist/{chunk-LALRCFSN.cjs.map → chunk-7DXLNNKH.cjs.map} +1 -1
  37. package/dist/{chunk-WEHUJ7ZS.cjs → chunk-ALU3KC4G.cjs} +267 -120
  38. package/dist/chunk-ALU3KC4G.cjs.map +1 -0
  39. package/dist/{chunk-Z2OC3UIW.cjs → chunk-BJMKQOY2.cjs} +11 -11
  40. package/dist/{chunk-Z2OC3UIW.cjs.map → chunk-BJMKQOY2.cjs.map} +1 -1
  41. package/dist/{chunk-WLKFWQSJ.js → chunk-CD73YHEH.js} +3 -3
  42. package/dist/{chunk-WLKFWQSJ.js.map → chunk-CD73YHEH.js.map} +1 -1
  43. package/dist/{chunk-BXV2QUIC.js → chunk-CSZRJ4RE.js} +6 -5
  44. package/dist/chunk-CSZRJ4RE.js.map +1 -0
  45. package/dist/{chunk-6M6A6WWW.cjs → chunk-D4ZUJTFB.cjs} +9 -10
  46. package/dist/chunk-D4ZUJTFB.cjs.map +1 -0
  47. package/dist/{chunk-XAUBQMQU.js → chunk-DCJ5MCJ3.js} +7 -7
  48. package/dist/{chunk-XAUBQMQU.js.map → chunk-DCJ5MCJ3.js.map} +1 -1
  49. package/dist/{chunk-Y66627E4.cjs → chunk-E7X2B66S.cjs} +24 -24
  50. package/dist/{chunk-Y66627E4.cjs.map → chunk-E7X2B66S.cjs.map} +1 -1
  51. package/dist/{chunk-6CLRANZA.js → chunk-EXQV452X.js} +3 -3
  52. package/dist/{chunk-6CLRANZA.js.map → chunk-EXQV452X.js.map} +1 -1
  53. package/dist/{chunk-EKFA76N4.js → chunk-F3X7Q4BF.js} +344 -453
  54. package/dist/chunk-F3X7Q4BF.js.map +1 -0
  55. package/dist/{chunk-XIG2IE3L.js → chunk-F6Y4IEQM.js} +5 -4
  56. package/dist/chunk-F6Y4IEQM.js.map +1 -0
  57. package/dist/{chunk-N24XBYNX.cjs → chunk-FAY3QDGC.cjs} +11 -10
  58. package/dist/chunk-FAY3QDGC.cjs.map +1 -0
  59. package/dist/{chunk-JD74LN7R.cjs → chunk-FK4EJD2I.cjs} +7 -6
  60. package/dist/chunk-FK4EJD2I.cjs.map +1 -0
  61. package/dist/{chunk-IX2LKBCD.js → chunk-GL7CFBVC.js} +176 -35
  62. package/dist/chunk-GL7CFBVC.js.map +1 -0
  63. package/dist/{chunk-77FOZCOT.js → chunk-GLUWH6JO.js} +6 -5
  64. package/dist/chunk-GLUWH6JO.js.map +1 -0
  65. package/dist/{chunk-RZQ6E5YZ.cjs → chunk-GM7QDQ24.cjs} +11 -11
  66. package/dist/{chunk-RZQ6E5YZ.cjs.map → chunk-GM7QDQ24.cjs.map} +1 -1
  67. package/dist/{chunk-G4WI3VW2.cjs → chunk-H5YVJB4K.cjs} +9 -10
  68. package/dist/chunk-H5YVJB4K.cjs.map +1 -0
  69. package/dist/{chunk-HRA3CPGG.js → chunk-HEN5WXXI.js} +9 -8
  70. package/dist/chunk-HEN5WXXI.js.map +1 -0
  71. package/dist/{chunk-LU7VALW5.js → chunk-I35DI7ES.js} +3 -3
  72. package/dist/{chunk-LU7VALW5.js.map → chunk-I35DI7ES.js.map} +1 -1
  73. package/dist/{chunk-TIZ4TS5V.cjs → chunk-ICYBIC6N.cjs} +8 -7
  74. package/dist/chunk-ICYBIC6N.cjs.map +1 -0
  75. package/dist/{chunk-2DYI7MIF.cjs → chunk-IEUDKUPM.cjs} +8 -8
  76. package/dist/{chunk-2DYI7MIF.cjs.map → chunk-IEUDKUPM.cjs.map} +1 -1
  77. package/dist/{chunk-AIDNODHJ.cjs → chunk-ITLS5LRF.cjs} +11 -11
  78. package/dist/{chunk-AIDNODHJ.cjs.map → chunk-ITLS5LRF.cjs.map} +1 -1
  79. package/dist/{chunk-M72RJVPC.js → chunk-JNIWFCKI.js} +3 -3
  80. package/dist/{chunk-M72RJVPC.js.map → chunk-JNIWFCKI.js.map} +1 -1
  81. package/dist/{chunk-LEJXBUBD.js → chunk-LISL36B6.js} +5 -5
  82. package/dist/{chunk-LEJXBUBD.js.map → chunk-LISL36B6.js.map} +1 -1
  83. package/dist/{chunk-3XJ7CS2C.cjs → chunk-LMWXF4LL.cjs} +554 -666
  84. package/dist/chunk-LMWXF4LL.cjs.map +1 -0
  85. package/dist/{chunk-BEURCLDV.cjs → chunk-LTCOPATU.cjs} +9 -3
  86. package/dist/chunk-LTCOPATU.cjs.map +1 -0
  87. package/dist/{chunk-TQKCU7CL.js → chunk-M5ZQBOIZ.js} +3 -3
  88. package/dist/{chunk-TQKCU7CL.js.map → chunk-M5ZQBOIZ.js.map} +1 -1
  89. package/dist/{chunk-A44COQJJ.cjs → chunk-MHCKWQR3.cjs} +8 -8
  90. package/dist/{chunk-A44COQJJ.cjs.map → chunk-MHCKWQR3.cjs.map} +1 -1
  91. package/dist/{chunk-7S7KKUO6.cjs → chunk-MRODLUGY.cjs} +4 -4
  92. package/dist/{chunk-7S7KKUO6.cjs.map → chunk-MRODLUGY.cjs.map} +1 -1
  93. package/dist/{chunk-BOTK6ZUP.js → chunk-MXSMAGDU.js} +3 -3
  94. package/dist/{chunk-BOTK6ZUP.js.map → chunk-MXSMAGDU.js.map} +1 -1
  95. package/dist/{chunk-5PZMMF4H.js → chunk-NFCKEBHI.js} +3 -3
  96. package/dist/{chunk-5PZMMF4H.js.map → chunk-NFCKEBHI.js.map} +1 -1
  97. package/dist/{chunk-6M4ODB2V.cjs → chunk-NNSKJCBM.cjs} +10 -10
  98. package/dist/{chunk-6M4ODB2V.cjs.map → chunk-NNSKJCBM.cjs.map} +1 -1
  99. package/dist/{chunk-4WL52CXU.cjs → chunk-NQ4AC2U4.cjs} +9 -9
  100. package/dist/{chunk-4WL52CXU.cjs.map → chunk-NQ4AC2U4.cjs.map} +1 -1
  101. package/dist/{chunk-YRXTIESB.cjs → chunk-P34DHHYQ.cjs} +4 -4
  102. package/dist/{chunk-YRXTIESB.cjs.map → chunk-P34DHHYQ.cjs.map} +1 -1
  103. package/dist/{chunk-HFPGOTVF.cjs → chunk-PAEJPLVN.cjs} +4 -4
  104. package/dist/{chunk-HFPGOTVF.cjs.map → chunk-PAEJPLVN.cjs.map} +1 -1
  105. package/dist/{chunk-S5RCBTSF.js → chunk-QFMXXUUT.js} +3 -3
  106. package/dist/{chunk-S5RCBTSF.js.map → chunk-QFMXXUUT.js.map} +1 -1
  107. package/dist/{chunk-V4XRLPEF.js → chunk-QGDKZDPN.js} +3 -3
  108. package/dist/{chunk-V4XRLPEF.js.map → chunk-QGDKZDPN.js.map} +1 -1
  109. package/dist/{chunk-DHLZIMP6.cjs → chunk-QUFSDDNU.cjs} +15 -15
  110. package/dist/{chunk-DHLZIMP6.cjs.map → chunk-QUFSDDNU.cjs.map} +1 -1
  111. package/dist/{chunk-BFWPZMG7.js → chunk-SDIBMLL5.js} +8 -8
  112. package/dist/{chunk-BFWPZMG7.js.map → chunk-SDIBMLL5.js.map} +1 -1
  113. package/dist/{chunk-GIW4L6HY.cjs → chunk-SWIBQFPH.cjs} +4 -4
  114. package/dist/{chunk-GIW4L6HY.cjs.map → chunk-SWIBQFPH.cjs.map} +1 -1
  115. package/dist/{chunk-JTFYYKDT.js → chunk-TAPQWDW2.js} +9 -4
  116. package/dist/chunk-TAPQWDW2.js.map +1 -0
  117. package/dist/{chunk-4GTXATWK.cjs → chunk-THEYGCYS.cjs} +4 -4
  118. package/dist/{chunk-4GTXATWK.cjs.map → chunk-THEYGCYS.cjs.map} +1 -1
  119. package/dist/{chunk-CJVMDRQB.cjs → chunk-TQI3KRXZ.cjs} +5 -4
  120. package/dist/chunk-TQI3KRXZ.cjs.map +1 -0
  121. package/dist/{chunk-LUSXDZPV.cjs → chunk-U2WLFOA3.cjs} +4 -4
  122. package/dist/{chunk-LUSXDZPV.cjs.map → chunk-U2WLFOA3.cjs.map} +1 -1
  123. package/dist/{chunk-FKCC2MED.js → chunk-UQPDFW4E.js} +3 -3
  124. package/dist/{chunk-FKCC2MED.js.map → chunk-UQPDFW4E.js.map} +1 -1
  125. package/dist/{chunk-CR3DGWUQ.js → chunk-VNNK6AKU.js} +3 -3
  126. package/dist/{chunk-CR3DGWUQ.js.map → chunk-VNNK6AKU.js.map} +1 -1
  127. package/dist/{chunk-ANIZEWTU.cjs → chunk-W4QN5CMG.cjs} +9 -8
  128. package/dist/chunk-W4QN5CMG.cjs.map +1 -0
  129. package/dist/{chunk-POQT2OIF.js → chunk-WDGCZDRG.js} +3 -3
  130. package/dist/{chunk-POQT2OIF.js.map → chunk-WDGCZDRG.js.map} +1 -1
  131. package/dist/{chunk-Q56IYTBZ.js → chunk-XAEAMI5H.js} +4 -4
  132. package/dist/{chunk-Q56IYTBZ.js.map → chunk-XAEAMI5H.js.map} +1 -1
  133. package/dist/{chunk-BWT67BI4.cjs → chunk-XAYVHS2B.cjs} +4 -4
  134. package/dist/{chunk-BWT67BI4.cjs.map → chunk-XAYVHS2B.cjs.map} +1 -1
  135. package/dist/{chunk-KIO7QFIV.cjs → chunk-YBFDBOUN.cjs} +8 -8
  136. package/dist/{chunk-KIO7QFIV.cjs.map → chunk-YBFDBOUN.cjs.map} +1 -1
  137. package/dist/{chunk-BNIFFFH3.js → chunk-YCXMSDSP.js} +4 -4
  138. package/dist/{chunk-BNIFFFH3.js.map → chunk-YCXMSDSP.js.map} +1 -1
  139. package/dist/{chunk-UVNG67DG.js → chunk-YDLNI7J6.js} +3 -3
  140. package/dist/{chunk-UVNG67DG.js.map → chunk-YDLNI7J6.js.map} +1 -1
  141. package/dist/{chunk-UAYYNWYJ.js → chunk-YHZXBDAW.js} +5 -4
  142. package/dist/chunk-YHZXBDAW.js.map +1 -0
  143. package/dist/{chunk-OKXUMCGM.js → chunk-YVTNFKZO.js} +5 -5
  144. package/dist/{chunk-OKXUMCGM.js.map → chunk-YVTNFKZO.js.map} +1 -1
  145. package/dist/{chunk-GJAGKFTR.js → chunk-ZJN6NTHE.js} +3 -3
  146. package/dist/{chunk-GJAGKFTR.js.map → chunk-ZJN6NTHE.js.map} +1 -1
  147. package/dist/{chunk-XV2RBL6D.js → chunk-ZW345YOI.js} +8 -9
  148. package/dist/chunk-ZW345YOI.js.map +1 -0
  149. package/dist/compact-session-H5TKLD55.cjs +54 -0
  150. package/dist/{compact-session-BEA3IOON.cjs.map → compact-session-H5TKLD55.cjs.map} +1 -1
  151. package/dist/compact-session-WNKKIIDW.js +17 -0
  152. package/dist/{compact-session-5BDD4HIB.js.map → compact-session-WNKKIIDW.js.map} +1 -1
  153. package/dist/compaction.cjs +16 -16
  154. package/dist/compaction.js +3 -3
  155. package/dist/concurrency.cjs +6 -6
  156. package/dist/concurrency.js +4 -4
  157. package/dist/context-VAYLPT4O.js +5 -0
  158. package/dist/{context-GWANQLX4.js.map → context-VAYLPT4O.js.map} +1 -1
  159. package/dist/context-ZV33V4DC.cjs +22 -0
  160. package/dist/{context-KNWVTZSY.cjs.map → context-ZV33V4DC.cjs.map} +1 -1
  161. package/dist/cron.cjs +28 -28
  162. package/dist/cron.js +27 -27
  163. package/dist/errors.cjs +21 -21
  164. package/dist/errors.js +2 -2
  165. package/dist/eval.cjs +31 -31
  166. package/dist/eval.js +27 -27
  167. package/dist/{executor-Y4MKPIUD.cjs → executor-OZSYXDKF.cjs} +23 -23
  168. package/dist/{executor-Y4MKPIUD.cjs.map → executor-OZSYXDKF.cjs.map} +1 -1
  169. package/dist/{executor-ORJS5GV2.js → executor-PAH72CB5.js} +7 -7
  170. package/dist/{executor-ORJS5GV2.js.map → executor-PAH72CB5.js.map} +1 -1
  171. package/dist/filesystem/index.cjs +7 -7
  172. package/dist/filesystem/index.js +3 -3
  173. package/dist/fs-session-store-6MY7PNI2.js +10 -0
  174. package/dist/{fs-session-store-4ALCDU3K.js.map → fs-session-store-6MY7PNI2.js.map} +1 -1
  175. package/dist/fs-session-store-7E7UPLF2.cjs +19 -0
  176. package/dist/{fs-session-store-IQYE35HX.cjs.map → fs-session-store-7E7UPLF2.cjs.map} +1 -1
  177. package/dist/generate-object-5SCEH2EE.cjs +20 -0
  178. package/dist/{generate-object-H3RNAM6S.cjs.map → generate-object-5SCEH2EE.cjs.map} +1 -1
  179. package/dist/generate-object-I7UD4NWN.js +7 -0
  180. package/dist/{generate-object-YJPDV5BS.js.map → generate-object-I7UD4NWN.js.map} +1 -1
  181. package/dist/index-manager-KKAK7NT3.js +10 -0
  182. package/dist/{index-manager-P7ZUX2RG.js.map → index-manager-KKAK7NT3.js.map} +1 -1
  183. package/dist/index-manager-R6ZJFEZF.cjs +19 -0
  184. package/dist/{index-manager-H7HUMW52.cjs.map → index-manager-R6ZJFEZF.cjs.map} +1 -1
  185. package/dist/index.cjs +124 -129
  186. package/dist/index.cjs.map +1 -1
  187. package/dist/index.d.cts +2 -1
  188. package/dist/index.d.ts +2 -1
  189. package/dist/index.js +45 -50
  190. package/dist/index.js.map +1 -1
  191. package/dist/{inject-session-SMH56NXP.cjs → inject-session-DM4SKTZO.cjs} +8 -8
  192. package/dist/{inject-session-SMH56NXP.cjs.map → inject-session-DM4SKTZO.cjs.map} +1 -1
  193. package/dist/{inject-session-V5FTK72N.js → inject-session-UXNJQTZ6.js} +6 -6
  194. package/dist/{inject-session-V5FTK72N.js.map → inject-session-UXNJQTZ6.js.map} +1 -1
  195. package/dist/internal/diagnostics.d.ts +54 -0
  196. package/dist/internal/local-agent/local-agent-invalidate.d.ts +0 -7
  197. package/dist/internal/local-agent/local-agent-lifecycle.d.ts +13 -0
  198. package/dist/internal/local-agent/local-agent.d.ts +1 -93
  199. package/dist/internal/persistence/index.cjs +25 -25
  200. package/dist/internal/persistence/index.js +6 -6
  201. package/dist/internal/persistence/sqlite-wal.d.cts +0 -9
  202. package/dist/internal/persistence/sqlite-wal.d.ts +0 -9
  203. package/dist/internal/persistence/transcript-ops.d.cts +14 -0
  204. package/dist/internal/persistence/transcript-ops.d.ts +14 -0
  205. package/dist/internal/plugins/lifecycle.d.cts +1 -0
  206. package/dist/internal/plugins/lifecycle.d.ts +1 -0
  207. package/dist/internal/runtime/fixtures/fixture-run-base.d.ts +19 -0
  208. package/dist/internal/runtime/registry/agent-registry.d.ts +0 -1
  209. package/dist/internal/security/index.cjs +13 -13
  210. package/dist/internal/security/index.js +3 -3
  211. package/dist/internal/security/redact.d.cts +0 -18
  212. package/dist/internal/security/redact.d.ts +0 -18
  213. package/dist/judge-call-SP3G3X2Y.cjs +22 -0
  214. package/dist/{judge-call-2FULQ6KL.cjs.map → judge-call-SP3G3X2Y.cjs.map} +1 -1
  215. package/dist/judge-call-TAEIXMYG.js +5 -0
  216. package/dist/{judge-call-D7R3ZTZS.js.map → judge-call-TAEIXMYG.js.map} +1 -1
  217. package/dist/models.cjs +22 -26
  218. package/dist/models.cjs.map +1 -1
  219. package/dist/models.js +13 -17
  220. package/dist/models.js.map +1 -1
  221. package/dist/path-safety.cjs +10 -10
  222. package/dist/path-safety.js +3 -3
  223. package/dist/persistence.cjs +27 -27
  224. package/dist/persistence.cjs.map +1 -1
  225. package/dist/persistence.js +8 -8
  226. package/dist/persistence.js.map +1 -1
  227. package/dist/project.cjs +5 -5
  228. package/dist/project.js +3 -3
  229. package/dist/registry-N3GTKYCI.cjs +46 -0
  230. package/dist/{registry-APYDISL6.cjs.map → registry-N3GTKYCI.cjs.map} +1 -1
  231. package/dist/registry-SOXE4RY6.js +9 -0
  232. package/dist/{registry-34IWWDQQ.js.map → registry-SOXE4RY6.js.map} +1 -1
  233. package/dist/retry.cjs +4 -4
  234. package/dist/retry.js +3 -3
  235. package/dist/sandbox/index.cjs +6 -6
  236. package/dist/sandbox/index.js +2 -2
  237. package/dist/server/errors-envelope.cjs +14 -14
  238. package/dist/server/errors-envelope.js +3 -3
  239. package/dist/session-transcript-6WKLYIN4.js +5 -0
  240. package/dist/{session-transcript-F2ANTA2M.js.map → session-transcript-6WKLYIN4.js.map} +1 -1
  241. package/dist/session-transcript-EAKR4D2W.cjs +50 -0
  242. package/dist/{session-transcript-JXFMPLOT.cjs.map → session-transcript-EAKR4D2W.cjs.map} +1 -1
  243. package/dist/skills.cjs +7 -7
  244. package/dist/skills.js +5 -5
  245. package/dist/stream-object-OFM66VUT.js +7 -0
  246. package/dist/{stream-object-WUQSSRY2.js.map → stream-object-OFM66VUT.js.map} +1 -1
  247. package/dist/stream-object-Y7YCX3BI.cjs +20 -0
  248. package/dist/{stream-object-QEQJJDTI.cjs.map → stream-object-Y7YCX3BI.cjs.map} +1 -1
  249. package/dist/subagents-loader.cjs +6 -6
  250. package/dist/subagents-loader.js +4 -4
  251. package/dist/subscription/index.cjs +3 -3
  252. package/dist/subscription/index.js +2 -2
  253. package/dist/task-store.cjs +7 -7
  254. package/dist/task-store.js +4 -4
  255. package/dist/workflow.cjs +27 -27
  256. package/dist/workflow.js +6 -6
  257. package/package.json +13 -12
  258. package/dist/agent-H6HL5ITH.js +0 -42
  259. package/dist/agent-P77NPBF4.cjs +0 -51
  260. package/dist/chunk-3XJ7CS2C.cjs.map +0 -1
  261. package/dist/chunk-6M6A6WWW.cjs.map +0 -1
  262. package/dist/chunk-77FOZCOT.js.map +0 -1
  263. package/dist/chunk-7BTE3RXJ.js.map +0 -1
  264. package/dist/chunk-ANIZEWTU.cjs.map +0 -1
  265. package/dist/chunk-BEURCLDV.cjs.map +0 -1
  266. package/dist/chunk-BXV2QUIC.js.map +0 -1
  267. package/dist/chunk-CJVMDRQB.cjs.map +0 -1
  268. package/dist/chunk-D42XHI4O.cjs.map +0 -1
  269. package/dist/chunk-EKFA76N4.js.map +0 -1
  270. package/dist/chunk-G4WI3VW2.cjs.map +0 -1
  271. package/dist/chunk-HRA3CPGG.js.map +0 -1
  272. package/dist/chunk-IX2LKBCD.js.map +0 -1
  273. package/dist/chunk-JD74LN7R.cjs.map +0 -1
  274. package/dist/chunk-JTFYYKDT.js.map +0 -1
  275. package/dist/chunk-KAP4GJHO.js.map +0 -1
  276. package/dist/chunk-MZ5ZRORA.cjs.map +0 -1
  277. package/dist/chunk-N24XBYNX.cjs.map +0 -1
  278. package/dist/chunk-S2BBRVQX.js.map +0 -1
  279. package/dist/chunk-TIZ4TS5V.cjs.map +0 -1
  280. package/dist/chunk-UAYYNWYJ.js.map +0 -1
  281. package/dist/chunk-WEHUJ7ZS.cjs.map +0 -1
  282. package/dist/chunk-XIG2IE3L.js.map +0 -1
  283. package/dist/chunk-XV2RBL6D.js.map +0 -1
  284. package/dist/compact-session-5BDD4HIB.js +0 -17
  285. package/dist/compact-session-BEA3IOON.cjs +0 -54
  286. package/dist/context-GWANQLX4.js +0 -5
  287. package/dist/context-KNWVTZSY.cjs +0 -22
  288. package/dist/fs-session-store-4ALCDU3K.js +0 -10
  289. package/dist/fs-session-store-IQYE35HX.cjs +0 -19
  290. package/dist/generate-object-H3RNAM6S.cjs +0 -20
  291. package/dist/generate-object-YJPDV5BS.js +0 -7
  292. package/dist/index-manager-H7HUMW52.cjs +0 -19
  293. package/dist/index-manager-P7ZUX2RG.js +0 -10
  294. package/dist/judge-call-2FULQ6KL.cjs +0 -22
  295. package/dist/judge-call-D7R3ZTZS.js +0 -5
  296. package/dist/registry-34IWWDQQ.js +0 -9
  297. package/dist/registry-APYDISL6.cjs +0 -46
  298. package/dist/session-transcript-F2ANTA2M.js +0 -5
  299. package/dist/session-transcript-JXFMPLOT.cjs +0 -50
  300. package/dist/stream-object-QEQJJDTI.cjs +0 -20
  301. package/dist/stream-object-WUQSSRY2.js +0 -7
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/agent-factory.ts","../src/internal/budget/calendar-window.ts","../src/internal/budget/ledger.ts","../src/internal/budget/registry.ts","../src/internal/budget/enforcement.ts","../src/internal/budget/normalize-usage.ts","../src/budget.ts","../src/built-in-processors.ts","../src/create-skill.ts","../src/define-provider.ts","../src/define-skill-read-tool.ts","../src/event-bus.ts","../src/goal-loop.ts","../src/internal/budget/tracker/budget-tracker-counter.ts","../src/internal/plugins/types.ts","../src/internal/runtime/memory/memory-provider-noop.ts","../src/job-queue.ts","../src/internal/memory/dreaming/diary.ts","../src/internal/memory/dreaming/phases.ts","../src/internal/memory/dreaming/run.ts","../src/internal/memory/sdk-memory-peer-loader.ts","../src/memory.ts","../src/memory-adapter-helpers.ts","../src/internal/memory/migrate-sqlite-to-lance.ts","../src/migrate.ts","../src/permission-engine.ts","../src/permission-plugin.ts","../src/schema-normalizer.ts","../src/security.ts","../src/session-scope.ts","../src/squad.ts","../src/task.ts","../src/internal/catalog/fixtures.ts","../src/internal/catalog/local-models.ts","../src/theokit.ts","../src/trajectory-helpers.ts"],"names":["list","kept","join","migrateSqliteToLance","Agent"],"mappings":"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","file":"index.js","sourcesContent":["import { Agent } from \"./agent.js\";\nimport type { AgentOptions, SDKAgent } from \"./types/agent.js\";\n\n/**\n * Handle returned by {@link createAgentFactory}. See ADR D23 for merge\n * semantics.\n *\n * @public\n */\nexport interface AgentFactory {\n /**\n * Create a fresh agent for this session. Equivalent to `Agent.create(merged)`\n * where `merged` is `common` ⊕ `overrides` ⊕ `{ agentId }`.\n */\n forSession(agentId: string, overrides?: Partial<AgentOptions>): Promise<SDKAgent>;\n /**\n * Resume an existing agent for this session, or create one if the ID is\n * unknown. Equivalent to `Agent.getOrCreate(agentId, merged)`.\n */\n getOrCreate(agentId: string, overrides?: Partial<AgentOptions>): Promise<SDKAgent>;\n}\n\n/**\n * Capture a common {@link AgentOptions} prefix and produce per-session agents\n * with focused overrides. Useful for chat-bot patterns where most config is\n * shared across users/sessions.\n *\n * Merge rules (ADR D23):\n * - Top-level shallow merge with `overrides` winning.\n * - Deep merge for `local`, `memory`, `cloud` (configuration objects with\n * non-conflicting flat keys).\n * - Total replace for `mcpServers`, `agents`, `tools`, `providers`,\n * `plugins`, `skills`, `context` (collection-shaped).\n * - The function-level `agentId` always wins over both `common.agentId` and\n * `overrides.agentId`.\n *\n * The factory holds `common` by reference — mutating it after construction\n * leaks to subsequent `forSession` calls (documented caveat).\n *\n * @public\n */\nfunction createAgentFactory(common: Partial<AgentOptions>): AgentFactory {\n return {\n forSession: (agentId, overrides) => Agent.create(mergeAgentOptions(common, overrides, agentId)),\n getOrCreate: (agentId, overrides) =>\n Agent.getOrCreate(agentId, mergeAgentOptions(common, overrides, agentId)),\n };\n}\n\n/**\n * Merge factory `common` config with per-session `overrides`, forcing the\n * function-level `agentId`. Deep-merges the 3 configuration-shaped fields\n * (`local`, `memory`, `cloud`); replaces collection-shaped fields.\n *\n * @internal\n */\nfunction mergeAgentOptions(\n common: Partial<AgentOptions>,\n overrides: Partial<AgentOptions> | undefined,\n agentId: string,\n): AgentOptions {\n const o = overrides ?? {};\n const merged: Partial<AgentOptions> = { ...common, ...o };\n const local = deepMergeLocal(common.local, o.local);\n if (local !== undefined) merged.local = local;\n const memory = deepMergeMemory(common.memory, o.memory);\n if (memory !== undefined) merged.memory = memory;\n const cloud = deepMergeCloud(common.cloud, o.cloud);\n if (cloud !== undefined) merged.cloud = cloud;\n merged.agentId = agentId;\n return merged as AgentOptions;\n}\n\nfunction deepMergeLocal(\n base: AgentOptions[\"local\"],\n top: AgentOptions[\"local\"],\n): AgentOptions[\"local\"] | undefined {\n if (base === undefined && top === undefined) return undefined;\n return { ...(base ?? {}), ...(top ?? {}) };\n}\n\nfunction deepMergeMemory(\n base: AgentOptions[\"memory\"],\n top: AgentOptions[\"memory\"],\n): AgentOptions[\"memory\"] | undefined {\n if (base === undefined && top === undefined) return undefined;\n return {\n ...(base ?? {}),\n ...(top ?? {}),\n enabled: top?.enabled ?? base?.enabled ?? false,\n };\n}\n\nfunction deepMergeCloud(\n base: AgentOptions[\"cloud\"],\n top: AgentOptions[\"cloud\"],\n): AgentOptions[\"cloud\"] | undefined {\n if (base === undefined && top === undefined) return undefined;\n return { ...(base ?? {}), ...(top ?? {}) };\n}\n\n/** SE36 — `AgentFactory.create` replaces `createAgentFactory` (ADR 0015). Merges with the `AgentFactory` interface. @public */\n// biome-ignore lint/suspicious/noUnsafeDeclarationMerging: SE36 namespace class merges with the `AgentFactory` instance interface (ADR 0015) — intentional; `create()` returns the interface type, `new` is blocked by the private ctor.\nexport class AgentFactory {\n private constructor() {}\n static create(common: Partial<AgentOptions>): AgentFactory {\n return createAgentFactory(common);\n }\n}\n","/**\n * UTC-aligned calendar window helpers (ADR D382).\n *\n * - `1h` — relative (now - 1 hour).\n * - `1d` — UTC midnight (current UTC day).\n * - `1w` — UTC monday 00:00:00 (current UTC week, Monday is week start).\n * - `30d` — relative 30 days.\n * - `365d` — relative 365 days.\n *\n * `1d` and `1w` are calendar-aligned because users expect \"1 USD per day\"\n * = \"since midnight UTC\", not a rolling 24h.\n * `30d`/`365d` are relative because nobody expects \"since the 1st\".\n *\n * @internal\n */\n\nimport type { BudgetWindow } from \"../../types/budget.js\";\n\nexport function startOfDayUtc(now: Date = new Date()): Date {\n return new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate()));\n}\n\nexport function startOfWeekUtc(now: Date = new Date()): Date {\n // ISO 8601 week starts on Monday. getUTCDay() returns 0 (Sun) .. 6 (Sat).\n const dayOfWeek = now.getUTCDay();\n const daysSinceMonday = (dayOfWeek + 6) % 7; // Mon=0, Sun=6\n const start = startOfDayUtc(now);\n start.setUTCDate(start.getUTCDate() - daysSinceMonday);\n return start;\n}\n\nconst MS_PER_HOUR = 60 * 60 * 1000;\nconst MS_PER_DAY = 24 * MS_PER_HOUR;\n\n/** Returns the inclusive start timestamp (ms) for the given window relative to `now`. */\nexport function windowStartMs(window: BudgetWindow, now: Date = new Date()): number {\n switch (window) {\n case \"1h\":\n return now.getTime() - MS_PER_HOUR;\n case \"1d\":\n return startOfDayUtc(now).getTime();\n case \"1w\":\n return startOfWeekUtc(now).getTime();\n case \"30d\":\n return now.getTime() - 30 * MS_PER_DAY;\n case \"365d\":\n return now.getTime() - 365 * MS_PER_DAY;\n default: {\n const _exhaustive: never = window;\n throw new Error(`unreachable window: ${_exhaustive as string}`);\n }\n }\n}\n","/**\n * In-process Budget ledger (ADR D385).\n *\n * Singleton mutex-protected. Stores per-budget ChargeLog[] arrays;\n * `spentIn(window)` filters by timestamp.\n *\n * EC-6: GC eviction runs DENTRO do mesmo mutex que charge — sem race.\n * EC-9: charge() é called inside same critical section as preflight\n * check by Budget enforcement.\n *\n * Persistence cross-restart: deferred to v0.2 (JsonFile pattern).\n *\n * @internal\n */\n\nimport type { BudgetWindow } from \"../../types/budget.js\";\nimport { withCwdMutex } from \"../persistence/cwd-mutex.js\";\nimport { windowStartMs } from \"./calendar-window.js\";\n\ninterface ChargeLog {\n timestamp: number;\n amountUsd: number;\n}\n\nconst MS_PER_YEAR = 365 * 24 * 60 * 60 * 1000;\nconst GC_INTERVAL_MS = 5 * 60 * 1000; // 5 minutes\nconst GC_LOGS_THRESHOLD = 10_000;\n\ninterface LedgerState {\n readonly logs: Map<string, ChargeLog[]>;\n lastGcAt: number;\n}\n\nlet state: LedgerState = {\n logs: new Map(),\n lastGcAt: Date.now(),\n};\n\nconst MUTEX_KEY = \"budget-ledger\";\n\nfunction shouldGc(now: number): boolean {\n if (now - state.lastGcAt < GC_INTERVAL_MS) return false;\n let totalLogs = 0;\n for (const arr of state.logs.values()) totalLogs += arr.length;\n return totalLogs > GC_LOGS_THRESHOLD;\n}\n\nfunction gcOlderThanOneYear(now: number): void {\n const cutoff = now - MS_PER_YEAR;\n for (const [name, arr] of state.logs.entries()) {\n const kept = arr.filter((l) => l.timestamp >= cutoff);\n if (kept.length === 0) state.logs.delete(name);\n else state.logs.set(name, kept);\n }\n state.lastGcAt = now;\n}\n\n/** Charge a budget. Idempotent across concurrent calls via withCwdMutex. */\nexport async function charge(name: string, amountUsd: number): Promise<void> {\n if (amountUsd <= 0) return;\n await withCwdMutex(MUTEX_KEY, async () => {\n const now = Date.now();\n const list = state.logs.get(name) ?? [];\n list.push({ timestamp: now, amountUsd });\n state.logs.set(name, list);\n if (shouldGc(now)) gcOlderThanOneYear(now);\n });\n}\n\n/** Return total spend in the given window for `name`. Snapshot read (no mutex needed). */\nexport function spentIn(name: string, window: BudgetWindow, now: Date = new Date()): number {\n const arr = state.logs.get(name);\n if (arr === undefined) return 0;\n const sinceMs = windowStartMs(window, now);\n let total = 0;\n for (const log of arr) {\n if (log.timestamp >= sinceMs) total += log.amountUsd;\n }\n return total;\n}\n\n/** Diagnostic — total logs across all budgets. */\nexport function __getLogCountForTests(name?: string): number {\n if (name !== undefined) return state.logs.get(name)?.length ?? 0;\n let total = 0;\n for (const arr of state.logs.values()) total += arr.length;\n return total;\n}\n\nexport function __resetLedgerForTests(): void {\n state = { logs: new Map(), lastGcAt: Date.now() };\n}\n\n/** Force GC manually (tests only). */\nexport async function __evictNowForTests(): Promise<void> {\n await withCwdMutex(MUTEX_KEY, async () => {\n gcOlderThanOneYear(Date.now());\n });\n}\n\n/** Force-insert a log at a specific timestamp (tests only). */\nexport function __injectLogForTests(name: string, timestamp: number, amountUsd: number): void {\n const list = state.logs.get(name) ?? [];\n list.push({ timestamp, amountUsd });\n state.logs.set(name, list);\n}\n","/**\n * Internal Budget registry — keeps live `BudgetOptions` per name.\n * Singleton; no persistence (D385).\n *\n * @internal\n */\n\nimport { ConfigurationError } from \"../../errors.js\";\nimport type {\n BudgetHandle,\n BudgetMode,\n BudgetOptions,\n BudgetSnapshot,\n BudgetWindow,\n} from \"../../types/budget.js\";\nimport { spentIn } from \"./ledger.js\";\n\nconst NAME_GRAMMAR = /^[a-z0-9][a-z0-9_-]*$/;\n\nconst registry = new Map<string, BudgetOptions>();\n\nexport function __resetRegistryForTests(): void {\n registry.clear();\n}\n\nexport function validateBudgetName(name: string): void {\n if (typeof name !== \"string\" || name.length === 0) {\n throw new ConfigurationError(\"Budget name must be a non-empty string\", {\n code: \"invalid_budget_name\",\n });\n }\n if (!NAME_GRAMMAR.test(name)) {\n throw new ConfigurationError(\n `Budget name \"${name}\" must match ^[a-z0-9][a-z0-9_-]*$ (lowercase + dash/underscore, start alphanumeric)`,\n { code: \"invalid_budget_name\" },\n );\n }\n}\n\nexport function createBudget(opts: BudgetOptions): BudgetHandle {\n // EC-7: name validation\n validateBudgetName(opts.name);\n if (registry.has(opts.name)) {\n // EC-16: duplicate throws (vs Task.submit idempotent return)\n throw new ConfigurationError(`Budget \"${opts.name}\" already exists`, {\n code: \"invalid_budget_name\",\n });\n }\n registry.set(opts.name, opts);\n return buildHandle(opts);\n}\n\nexport function getBudget(name: string): BudgetHandle | undefined {\n const opts = registry.get(name);\n if (opts === undefined) return undefined;\n return buildHandle(opts);\n}\n\nexport function listBudgets(): readonly BudgetHandle[] {\n return [...registry.values()].map(buildHandle);\n}\n\nexport function deleteBudget(name: string): boolean {\n return registry.delete(name);\n}\n\nexport function snapshotAll(): readonly BudgetSnapshot[] {\n const result: BudgetSnapshot[] = [];\n for (const opts of registry.values()) {\n for (const lim of opts.limits) {\n const spent = spentIn(opts.name, lim.window);\n result.push({\n name: opts.name,\n window: lim.window,\n spentUsd: spent,\n limitUsd: lim.limitUsd,\n ratio: lim.limitUsd > 0 ? spent / lim.limitUsd : 0,\n });\n }\n }\n return result;\n}\n\nexport function getBudgetOptionsRaw(name: string): BudgetOptions | undefined {\n return registry.get(name);\n}\n\nexport function defaultMode(opts: BudgetOptions): BudgetMode {\n return opts.mode ?? \"warn\";\n}\n\nfunction buildHandle(opts: BudgetOptions): BudgetHandle {\n return {\n name: opts.name,\n mode: defaultMode(opts),\n scope: opts.scope,\n limits: opts.limits,\n spentIn: (window: BudgetWindow) => spentIn(opts.name, window),\n remainingIn: (window: BudgetWindow) => {\n const lim = opts.limits.find((l) => l.window === window);\n if (lim === undefined) return Number.POSITIVE_INFINITY;\n return Math.max(0, lim.limitUsd - spentIn(opts.name, window));\n },\n };\n}\n","/**\n * Budget enforcement (ADRs D383, D386, EC-7/8/9).\n *\n * - `preflightCheck(name, estimatedUsd)` — em `block` mode, throw\n * `BudgetExceededError` antes da LLM call se qualquer limit seria\n * excedido (EC-9 — caller chama dentro do mutex section).\n * - `chargeAndCheckThresholds(name, actualUsd)` — apply charge ao\n * ledger + invoca onThreshold/onExceed callbacks isolated em\n * try/catch (EC-8).\n *\n * @internal\n */\n\nimport { BudgetExceededError } from \"../../errors.js\";\nimport type { BudgetMode, BudgetOptions } from \"../../types/budget.js\";\nimport { charge, spentIn } from \"./ledger.js\";\nimport { defaultMode, getBudgetOptionsRaw } from \"./registry.js\";\n\nconst THRESHOLDS = [0.8, 0.95] as const;\ntype Threshold = (typeof THRESHOLDS)[number];\n\n/**\n * Throws BudgetExceededError if `mode === \"block\"` and any limit\n * would be exceeded. No-op for audit/warn modes (post-charge checks\n * handle those).\n *\n * Caller invokes this BEFORE the LLM call.\n */\nexport function preflightCheck(name: string, estimatedUsd: number): void {\n const opts = getBudgetOptionsRaw(name);\n if (opts === undefined) return; // EC-20: budget deleted; charge becomes no-op\n if (defaultMode(opts) !== \"block\") return;\n for (const lim of opts.limits) {\n const currentSpent = spentIn(opts.name, lim.window);\n if (currentSpent + estimatedUsd > lim.limitUsd) {\n throw new BudgetExceededError({\n budgetName: opts.name,\n window: lim.window,\n spentUsd: currentSpent + estimatedUsd,\n limitUsd: lim.limitUsd,\n mode: \"block\",\n });\n }\n }\n}\n\n/**\n * Charge the budget + dispatch threshold/exceed callbacks (EC-8 isolated).\n *\n * - In `audit` mode: charge only, no callbacks.\n * - In `warn` mode: charge + onThreshold (80/95) + onExceed (100). No throw.\n * - In `block` mode: charge + onThreshold + onExceed. No throw post-call\n * (preflightCheck already prevented exceed for the upcoming call;\n * this protects against simultaneous-call races where multiple sends\n * each pass preflight independently — last one to charge may still\n * tip a limit. We document the case rather than retroactively throw).\n */\nexport async function chargeAndCheckThresholds(name: string, actualUsd: number): Promise<void> {\n const opts = getBudgetOptionsRaw(name);\n if (opts === undefined) {\n // EC-20: budget deleted during in-flight call. Charge is silent no-op.\n process.stderr.write(\n `[budget] charge for deleted budget \"${name}\" is a no-op (was the budget removed during in-flight send?)\\n`,\n );\n return;\n }\n const mode = defaultMode(opts);\n\n await charge(opts.name, actualUsd);\n\n if (mode === \"audit\") return;\n await dispatchCallbacksFor(opts, mode);\n}\n\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: 3-mode × 3-threshold dispatch table inherently branchy; pulling out helpers loses local context.\nasync function dispatchCallbacksFor(opts: BudgetOptions, mode: BudgetMode): Promise<void> {\n for (const lim of opts.limits) {\n const spent = spentIn(opts.name, lim.window);\n if (lim.limitUsd <= 0) {\n if (spent > 0) await dispatchExceed(opts, lim.window, spent, lim.limitUsd, mode);\n continue;\n }\n const ratio = spent / lim.limitUsd;\n if (ratio >= 1) {\n await dispatchExceed(opts, lim.window, spent, lim.limitUsd, mode);\n } else {\n // Iterate descending so the HIGHEST matched threshold fires (0.95 not 0.8)\n for (const t of [...THRESHOLDS].reverse() as Threshold[]) {\n if (ratio >= t) {\n await dispatchThreshold(opts, lim.window, spent, lim.limitUsd, t);\n break;\n }\n }\n }\n }\n}\n\nasync function dispatchThreshold(\n opts: BudgetOptions,\n window: BudgetOptions[\"limits\"][number][\"window\"],\n spentUsd: number,\n limitUsd: number,\n threshold: Threshold,\n): Promise<void> {\n if (opts.onThreshold === undefined) return;\n try {\n await opts.onThreshold({\n budgetName: opts.name,\n window,\n threshold,\n spentUsd,\n limitUsd,\n });\n } catch (err) {\n // EC-8: callback throw isolated\n const msg = err instanceof Error ? err.message : String(err);\n process.stderr.write(`[budget] onThreshold callback threw: ${msg}\\n`);\n }\n}\n\nasync function dispatchExceed(\n opts: BudgetOptions,\n window: BudgetOptions[\"limits\"][number][\"window\"],\n spentUsd: number,\n limitUsd: number,\n mode: BudgetMode,\n): Promise<void> {\n if (opts.onExceed === undefined) {\n if (mode === \"warn\") {\n process.stderr.write(\n `[budget] \"${opts.name}\" exceeded ${window} limit: $${spentUsd.toFixed(4)} > $${limitUsd.toFixed(4)}\\n`,\n );\n }\n return;\n }\n try {\n await opts.onExceed({\n budgetName: opts.name,\n window,\n spentUsd,\n limitUsd,\n mode,\n });\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n process.stderr.write(`[budget] onExceed callback threw: ${msg}\\n`);\n }\n}\n","/**\n * normalizeUsage — convert provider-shaped raw `usage` object to\n * canonical `TokenUsage`. Ports Hermes Agent's `normalize_usage`\n * (referencia/peer-agent/agent/usage_pricing.py:672-742).\n *\n * Handles 3 API shapes:\n * - Anthropic Messages: 4 explicit buckets (input/output/cache_read/cache_creation).\n * - OpenAI Chat Completions: prompt_tokens INCLUDES cache; subtract cached_tokens.\n * - OpenAI Responses (Codex): input_tokens INCLUDES cache; same subtraction.\n *\n * Edge cases:\n * - a peer#10266 — OpenAI-compat proxies (OpenRouter, a peer vendor AI Gateway,\n * a peer) routing Claude expose Anthropic-style top-level fields\n * (cache_read_input_tokens / cache_creation_input_tokens). Both\n * locations are checked with top-level fallback.\n * - Null/undefined fields → 0 via `int()` coerce.\n * - String token counts → parsed via int.\n * - Negative values → clamped to 0 (defensive against proxy bugs).\n *\n * @internal\n */\n\nimport type { TokenUsage } from \"../../types/usage.js\";\n\nexport type ApiMode = \"anthropic_messages\" | \"openai_chat_completions\" | \"openai_responses\";\n\nfunction int(v: unknown): number {\n if (typeof v === \"number\") return Number.isFinite(v) ? Math.max(0, Math.trunc(v)) : 0;\n if (typeof v === \"string\") {\n const n = Number.parseInt(v, 10);\n return Number.isFinite(n) ? Math.max(0, n) : 0;\n }\n return 0;\n}\n\nfunction buildTotal(buckets: {\n inputTokens: number;\n outputTokens: number;\n cacheReadTokens: number;\n cacheWriteTokens: number;\n}): number {\n // total = visible input + cache buckets + output (reasoning counted via output)\n return (\n buckets.inputTokens + buckets.outputTokens + buckets.cacheReadTokens + buckets.cacheWriteTokens\n );\n}\n\nfunction omitUndefined(usage: {\n inputTokens: number;\n outputTokens: number;\n cacheReadTokens: number;\n cacheWriteTokens: number;\n reasoningTokens: number;\n totalTokens: number;\n}): TokenUsage {\n return {\n inputTokens: usage.inputTokens,\n outputTokens: usage.outputTokens,\n ...(usage.cacheReadTokens > 0 ? { cacheReadTokens: usage.cacheReadTokens } : {}),\n ...(usage.cacheWriteTokens > 0 ? { cacheWriteTokens: usage.cacheWriteTokens } : {}),\n ...(usage.reasoningTokens > 0 ? { reasoningTokens: usage.reasoningTokens } : {}),\n totalTokens: usage.totalTokens,\n };\n}\n\nexport function inferApiMode(provider: string): ApiMode {\n const p = provider.toLowerCase();\n if (p === \"anthropic\" || p === \"claude\" || p === \"bedrock_anthropic\") {\n return \"anthropic_messages\";\n }\n if (p === \"openai-codex\" || p === \"codex\") return \"openai_responses\";\n // openai, openrouter, deepseek, google (compat), ollama (compat), lmstudio (compat), etc\n return \"openai_chat_completions\";\n}\n\ninterface RawRecord {\n [k: string]: unknown;\n}\n\nexport function normalizeUsage(\n rawUsage: unknown,\n opts: { provider: string; apiMode?: ApiMode },\n): TokenUsage {\n if (rawUsage === null || rawUsage === undefined) {\n return { inputTokens: 0, outputTokens: 0, totalTokens: 0 };\n }\n if (typeof rawUsage !== \"object\") {\n return { inputTokens: 0, outputTokens: 0, totalTokens: 0 };\n }\n const raw = rawUsage as RawRecord;\n const mode = opts.apiMode ?? inferApiMode(opts.provider);\n\n if (mode === \"anthropic_messages\") return normalizeAnthropic(raw);\n if (mode === \"openai_responses\") return normalizeOpenAIResponses(raw);\n return normalizeOpenAIChat(raw);\n}\n\nfunction normalizeAnthropic(raw: RawRecord): TokenUsage {\n const inputTokens = int(raw.input_tokens);\n const outputTokens = int(raw.output_tokens);\n const cacheReadTokens = int(raw.cache_read_input_tokens);\n const cacheWriteTokens = int(raw.cache_creation_input_tokens);\n const usage = {\n inputTokens,\n outputTokens,\n cacheReadTokens,\n cacheWriteTokens,\n reasoningTokens: 0,\n totalTokens: buildTotal({ inputTokens, outputTokens, cacheReadTokens, cacheWriteTokens }),\n };\n return omitUndefined(usage);\n}\n\nfunction normalizeOpenAIResponses(raw: RawRecord): TokenUsage {\n const inputTotal = int(raw.input_tokens);\n const outputTokens = int(raw.output_tokens);\n const inputDetails = (raw.input_tokens_details as RawRecord | undefined) ?? {};\n const outputDetails = (raw.output_tokens_details as RawRecord | undefined) ?? {};\n const cacheReadTokens = int(inputDetails.cached_tokens);\n const cacheWriteTokens = int(inputDetails.cache_creation_tokens);\n const reasoningTokens = int(outputDetails.reasoning_tokens);\n const inputTokens = Math.max(0, inputTotal - cacheReadTokens - cacheWriteTokens);\n const usage = {\n inputTokens,\n outputTokens,\n cacheReadTokens,\n cacheWriteTokens,\n reasoningTokens,\n totalTokens: buildTotal({ inputTokens, outputTokens, cacheReadTokens, cacheWriteTokens }),\n };\n return omitUndefined(usage);\n}\n\nfunction normalizeOpenAIChat(raw: RawRecord): TokenUsage {\n const promptTotal = int(raw.prompt_tokens);\n const outputTokens = int(raw.completion_tokens);\n const promptDetails = (raw.prompt_tokens_details as RawRecord | undefined) ?? {};\n const completionDetails = (raw.completion_tokens_details as RawRecord | undefined) ?? {};\n\n // a peer#10266 fallback — proxies expose Anthropic-style top-level fields when routing Claude\n const cacheReadTokens = int(promptDetails.cached_tokens) || int(raw.cache_read_input_tokens);\n const cacheWriteTokens =\n int(promptDetails.cache_write_tokens) || int(raw.cache_creation_input_tokens);\n\n const reasoningTokens = int(completionDetails.reasoning_tokens);\n const inputTokens = Math.max(0, promptTotal - cacheReadTokens - cacheWriteTokens);\n const usage = {\n inputTokens,\n outputTokens,\n cacheReadTokens,\n cacheWriteTokens,\n reasoningTokens,\n totalTokens: buildTotal({ inputTokens, outputTokens, cacheReadTokens, cacheWriteTokens }),\n };\n return omitUndefined(usage);\n}\n","/**\n * `Budget` — token cost enforcement primitive (Adoption Roadmap #1\n * post-Tasks, ADRs D375-D388).\n *\n * Static facade delegating to the in-process registry + ledger.\n * 3 modes: `audit` (log-only), `warn` (callbacks + log), `block`\n * (preflight throw before LLM call).\n *\n * @public\n *\n * @deprecated since SDK 2.0 (iter 18+) — import this facade from\n * `@theokit/sdk-budget` instead. The sources backing this facade have\n * been physically extracted to `@theokit/sdk-budget/internal/` per\n * ADR-008. The sdk-core copies are retained for the v1.x sync API\n * contract; consumers MUST migrate before sdk-core v3.0.\n *\n * Migration:\n *\n * ```ts\n * // Before (sdk-core, deprecated):\n * import { Budget, computeCost } from \"@theokit/sdk\";\n *\n * // After (sdk-budget, authoritative):\n * import {\n * chargeAndCheckThresholds,\n * createBudget,\n * computeUsdCost, // replaces computeCost\n * createUsdBudgetTracker,\n * } from \"@theokit/sdk-budget\";\n * ```\n */\n\nimport { computeCost } from \"./internal/budget/compute-cost.js\";\nimport { chargeAndCheckThresholds, preflightCheck } from \"./internal/budget/enforcement.js\";\nimport { inferApiMode, normalizeUsage } from \"./internal/budget/normalize-usage.js\";\nimport { getPricingEntry } from \"./internal/budget/pricing-registry.js\";\nimport {\n createBudget,\n deleteBudget,\n getBudget,\n listBudgets,\n snapshotAll,\n} from \"./internal/budget/registry.js\";\nimport { UsageAccumulator } from \"./internal/budget/usage-accumulator.js\";\nimport type { BudgetHandle, BudgetOptions, BudgetSnapshot } from \"./types/budget.js\";\n\n// Re-exports for caller-side composition until auto-wire-up in v0.2 (T4.2 deferred).\nexport {\n chargeAndCheckThresholds,\n computeCost,\n getPricingEntry,\n inferApiMode,\n normalizeUsage,\n preflightCheck,\n UsageAccumulator,\n};\n\nexport class Budget {\n // D375 — static class with private constructor.\n private constructor() {\n throw new Error(\"Budget is static; do not instantiate\");\n }\n\n /**\n * Create a budget. `name` must match `^[a-z0-9][a-z0-9_-]*$` (EC-7).\n * Throws `ConfigurationError` if name is invalid OR already exists\n * (EC-16: duplicate surface caller bug).\n *\n * `limits` is stacked (D384) — ANY exceeded triggers enforcement.\n * Empty `limits[]` is valid: pure tracking, no thresholds/exceed\n * callbacks fire (EC-19).\n *\n * Default `mode` is `\"warn\"` (D383). For emergency stop, use\n * `mode: \"block\", limits: [{ window: \"1d\", limitUsd: 0 }]` (EC-18).\n */\n static create(options: BudgetOptions): BudgetHandle {\n return createBudget(options);\n }\n\n /** Returns the handle for an active budget, or `undefined`. */\n static get(name: string): BudgetHandle | undefined {\n return getBudget(name);\n }\n\n /** Returns all active budgets. */\n static list(): readonly BudgetHandle[] {\n return listBudgets();\n }\n\n /**\n * Deletes a budget from the registry. Returns `true` if it existed.\n * In-flight `agent.send` calls referencing the name treat the\n * subsequent charge as a silent no-op + stderr warn (EC-20).\n */\n static delete(name: string): boolean {\n return deleteBudget(name);\n }\n\n /**\n * Returns per-window spend snapshot for all active budgets. Each\n * entry has `{ name, window, spentUsd, limitUsd, ratio }`.\n */\n static snapshot(): readonly BudgetSnapshot[] {\n return snapshotAll();\n }\n}\n","/**\n * SE25 — deterministic, no-LLM guardrail processors built on the SE24\n * {@link Processor} seam. Cheap and churn-free (no provider/model deltas), so\n * they are safe to own in-core — unlike the LLM-classifier processors, which are\n * delegated (see the guardrails ADR). All are OPT-IN: add them to\n * `AgentOptions.inputProcessors` / `outputProcessors`.\n *\n * @public\n */\n\nimport type { Processor, ProcessorControls } from \"./types/processors.js\";\n\n/** Rough char→token ratio for the estimate below (no tokenizer dependency). */\nconst CHARS_PER_TOKEN = 4;\n\n/**\n * Approximate token count from string length. This is an ESTIMATE\n * (≈ UTF-16-code-units / 4, NOT Unicode code points, NOT an exact per-model\n * tokenizer count) — good enough for a coarse cap, and dependency-free.\n */\nexport function estimateTokens(text: string): number {\n return Math.ceil(text.length / CHARS_PER_TOKEN);\n}\n\n/** Options for {@link createUnicodeNormalizer}. @public */\nexport interface UnicodeNormalizerOptions {\n /** Remove C0 + C1 control chars + DEL (keeps tab / newline / carriage-return). Default `false`. */\n stripControlChars?: boolean;\n /** Collapse runs of intra-line whitespace to one space, 3+ blank lines to one, and trim. Default `false`. Uses legacy `\\s`; Unicode-only whitespace (U+00A0 NBSP, U+FEFF BOM, U+2000–U+200A) is NOT collapsed. */\n collapseWhitespace?: boolean;\n}\n\n// C0 controls (U+0000–U+001F) + DEL (U+007F) + C1 controls (U+0080–U+009F),\n// EXCLUDING tab (U+0009), line feed (U+000A), and carriage return (U+000D) so\n// line structure survives. C1 is included (matching a peer framework's Cc-category strip)\n// since C1 controls are invisible noise / prompt-injection vectors in LLM input.\n// biome-ignore lint/suspicious/noControlCharactersInRegex: intentional — this processor's whole job is to strip control characters (written with \\u escapes, no literal control char in source).\nconst CONTROL_CHARS = /[\\u0000-\\u0008\\u000B\\u000C\\u000E-\\u001F\\u007F-\\u009F]/g;\n\n/**\n * SE25 — an input processor that normalizes user text: Unicode NFC (so\n * canonically-equivalent sequences compare equal) plus optional control-char\n * stripping and whitespace collapsing. Pure + deterministic; no LLM. Mirrors\n * a peer framework's `UnicodeNormalizer`.\n *\n * @public\n */\nexport function createUnicodeNormalizer(opts: UnicodeNormalizerOptions = {}): Processor {\n const stripControlChars = opts.stripControlChars ?? false;\n const collapseWhitespace = opts.collapseWhitespace ?? false;\n return {\n id: \"unicode-normalizer\",\n processInput(ctx) {\n let s = ctx.message.normalize(\"NFC\");\n if (stripControlChars) s = s.replace(CONTROL_CHARS, \"\");\n if (collapseWhitespace) {\n s = s\n .replace(/[^\\S\\n]+/g, \" \") // runs of intra-line whitespace -> one space\n .replace(/ *\\n */g, \"\\n\") // drop spaces hugging a newline\n .replace(/\\n{3,}/g, \"\\n\\n\") // 3+ blank lines -> one blank line\n .trim();\n }\n return s;\n },\n };\n}\n\n/** Options for {@link createTokenLimiter}. @public */\nexport interface TokenLimiterOptions {\n /** Positive integer token budget (estimate — see {@link estimateTokens}). */\n limit: number;\n /** Over the limit: `\"truncate\"` (default, cut to fit) or `\"block\"` (abort with a tripwire). */\n strategy?: \"truncate\" | \"block\";\n}\n\n/**\n * SE25 — a processor that caps text to a token budget. Placed in\n * `inputProcessors` it limits the prompt; in `outputProcessors` it limits the\n * response. Uses a char-based estimate (no tokenizer dep). `truncate` cuts to\n * fit; `block` aborts (tripwire). Mirrors a peer framework's `TokenLimiterProcessor`.\n *\n * @public\n */\nexport function createTokenLimiter(opts: TokenLimiterOptions): Processor {\n if (!Number.isInteger(opts.limit) || opts.limit <= 0) {\n throw new Error(\"createTokenLimiter: `limit` must be a positive integer.\");\n }\n const limit = opts.limit;\n const strategy = opts.strategy ?? \"truncate\";\n const cap = (text: string, controls: Pick<ProcessorControls, \"abort\">): string => {\n const estimated = estimateTokens(text);\n if (estimated <= limit) return text;\n if (strategy === \"block\") {\n controls.abort(`exceeds token limit ${limit} (~${estimated} estimated)`);\n }\n // Truncate on CODE POINTS (not UTF-16 code units) so a cut never splits a\n // surrogate pair into a lone surrogate (invalid UTF-8 → rejected by LLM APIs).\n return [...text].slice(0, limit * CHARS_PER_TOKEN).join(\"\");\n };\n return {\n id: \"token-limiter\",\n processInput: (ctx) => cap(ctx.message, ctx),\n processOutput: (ctx) => cap(ctx.text, ctx),\n };\n}\n\n/** SE36 — `TokenLimiter.create` replaces `createTokenLimiter` (ADR 0015). @public */\nexport class TokenLimiter {\n private constructor() {}\n static create(opts: TokenLimiterOptions): Processor {\n return createTokenLimiter(opts);\n }\n}\n/** SE36 — `UnicodeNormalizer.create` replaces `createUnicodeNormalizer` (ADR 0015). @public */\nexport class UnicodeNormalizer {\n private constructor() {}\n static create(opts: UnicodeNormalizerOptions = {}): Processor {\n return createUnicodeNormalizer(opts);\n }\n}\n","/**\n * M22 — `createSkill`: define a skill in TypeScript, without a `SKILL.md` file on disk.\n *\n * An inline skill is usable ALONGSIDE filesystem skills (`AgentOptions.skills.inline`), and points\n * an agent at code-defined capabilities without a `.theokit/skills/<name>/SKILL.md`. Like file\n * skills, its `name` + `description` surface in the `<skills>` system-prompt block; its\n * `instructions` (the body) travel on the object for the consumer (the SDK injects name+description,\n * not bodies — inline and file skills are symmetric there). Inline skills override file skills on a\n * name conflict (mirrors the subagents-loader precedent).\n */\nimport type { Skill as SkillShape } from \"./internal/runtime/skills/discover-skills.js\";\n\n/** A code-defined skill (from {@link createSkill}) — a {@link Skill} plus its inline body. */\nexport interface InlineSkill extends SkillShape {\n /** The skill body/instructions (inline skills carry it here instead of a SKILL.md file). */\n instructions: string;\n /**\n * SE21 — supporting documents bundled with the skill (filename → content),\n * mirroring a filesystem skill's `references/` directory. Surfaced to the app\n * via `agent.skills.get(name)`; not injected into the model prompt.\n */\n references?: Record<string, string>;\n}\n\n/** Spec accepted by {@link createSkill}. */\nexport interface CreateSkillSpec {\n name: string;\n description: string;\n instructions: string;\n category?: string;\n dependencies?: string[];\n /** SE21 — supporting documents (filename → content), like a filesystem skill's `references/`. */\n references?: Record<string, string>;\n}\n\n/**\n * Build an {@link InlineSkill} from a code spec. Fails fast on an empty `name`/`description`\n * (error-handling.md). The synthetic `source` (`inline://<name>`) marks it as file-less.\n */\nfunction createSkill(spec: CreateSkillSpec): InlineSkill {\n if (!spec.name) throw new Error(\"createSkill: `name` is required.\");\n if (!spec.description) throw new Error(\"createSkill: `description` is required.\");\n return {\n name: spec.name,\n description: spec.description,\n source: `inline://${spec.name}`,\n instructions: spec.instructions,\n ...(spec.category !== undefined ? { category: spec.category } : {}),\n ...(spec.dependencies !== undefined ? { dependencies: spec.dependencies } : {}),\n ...(spec.references !== undefined ? { references: spec.references } : {}),\n };\n}\n\n/** SE36 — `Skill.create` replaces `createSkill` (ADR 0015). @public */\nexport class Skill {\n private constructor() {}\n static create(spec: CreateSkillSpec): InlineSkill {\n return createSkill(spec);\n }\n}\n","import { parseModelId } from \"./internal/llm/model-identifier.js\";\nimport type { Plugin } from \"./internal/plugins/types.js\";\nimport { registerBuiltins } from \"./internal/providers/builtin/index.js\";\nimport { listProviders } from \"./internal/providers/registry.js\";\nimport type { ProviderProfile } from \"./internal/providers/types.js\";\n\n/**\n * Options for {@link defineProvider}.\n *\n * @public\n */\nexport interface DefineProviderOptions {\n /** Plugin version surfaced in diagnostics. Default `\"1.0.0\"`. */\n version?: string;\n}\n\n/**\n * Canonical factory for a custom LLM provider, mirroring {@link defineTool} and\n * {@link definePlugin} (Inviolable Rule 9 — every agentic capability ships as a\n * factory function).\n *\n * A {@link ProviderProfile} is data-only: it declares the provider name, the\n * HTTP dialect (`apiMode`), auth, base URL and fallback models. The transport\n * is selected from `apiMode` by the router, so any OpenAI-/Anthropic-compatible\n * endpoint (Groq, Together, Fireworks, a private gateway) is expressible as a\n * profile with no new code.\n *\n * Pass the result to `Agent.create({ plugins: [...] })` and route to it with\n * the `provider/model` id prefix or `providers.routes`:\n *\n * ```ts\n * const groq = defineProvider({\n * name: \"groq\",\n * apiMode: \"chat_completions\",\n * authType: \"api_key\",\n * envVars: [\"GROQ_API_KEY\"],\n * baseUrl: \"https://api.groq.com/openai/v1\",\n * fallbackModels: [\"groq/llama-3.1-8b-instant\"],\n * });\n * const agent = await Agent.create({\n * model: { id: \"groq/llama-3.1-8b-instant\" },\n * plugins: [groq],\n * });\n * ```\n *\n * @public\n */\nfunction defineProvider(profile: ProviderProfile, opts?: DefineProviderOptions): Plugin {\n return {\n name: profile.name,\n version: opts?.version ?? \"1.0.0\",\n kind: \"model-provider\",\n profile,\n };\n}\n\n/** SE36 — uniform namespace API. `Provider.create` replaces `defineProvider` (ADR 0015). @public */\nexport class Provider {\n private constructor() {}\n static create(profile: ProviderProfile, opts?: DefineProviderOptions): Plugin {\n return defineProvider(profile, opts);\n }\n\n /**\n * Every first-party builtin provider (anthropic, openai, openrouter, gemini, ollama, the ChatGPT/Codex\n * `openai-chatgpt`, …) as model-provider plugins, ready to hand to `Agent.create({ plugins })` or any\n * runtime that consumes model-provider plugins (e.g. the `theokit` agent server / `@theokit/agents`, whose\n * own model resolution does NOT share this registry). Enables a consumer to route to ANY SDK builtin —\n * including one added later in a single SDK file — with ZERO provider-specific code: just\n * `.plugins(Provider.builtins())` once, then pick a `provider/model` id. @public\n */\n static builtins(): Plugin[] {\n registerBuiltins();\n return listProviders().map((profile) => defineProvider(profile));\n }\n\n /**\n * O builtin que atende `modelId`, ou `undefined` quando nenhum atende.\n *\n * A gramática de um id de modelo — `provider/modelo` — passa a ter **um** dono. M94: o consumidor\n * a refazia à mão com `modelId.slice(0, modelId.indexOf('/'))`, que num id **sem barra** devolve o\n * id menos o último caractere (`claude-opus-5` → `claude-opus-`): casa provider nenhum e o\n * chamador seguia para o default, sem distinguir isso de um acerto. Um modelo não-roteável era\n * indistinguível do caminho feliz.\n *\n * Devolve `undefined` em vez de lançar: quem decide se a ausência é erro é o chamador, e só ele\n * sabe se o modelo veio de um `--model` explícito (erro) ou do default (normal).\n *\n * @public\n */\n static forModel(modelId: string): Plugin | undefined {\n // Delega ao `parseModelId`, que é o dono canônico da gramática — o DoD do M94 pedia\n // exatamente isso (\"reusando o parser de id do próprio SDK para que a gramática tenha UM\n // dono\") e a primeira versão refez `indexOf`/`slice` inline, reinventando o dono ao lado dele.\n //\n // A revisão adversarial mediu o custo: 7 de 8 divergências. `lm-studio/qwen3` resolve para o\n // builtin real `lmstudio` pelo parser e para NADA pelo slice — e como o consumidor passou a\n // lançar quando não há provider, um comando customizado que funcionava antes do M94 passaria a\n // falhar. `Anthropic/…`, `␣openai/…`, `llama.cpp/…` idem. E o inverso: `openai/` (nome vazio) o\n // parser rejeita e o slice aceitava.\n const { provider } = parseModelId(modelId);\n if (provider === undefined) return undefined;\n return Provider.builtins().find((p) => p.name === provider);\n }\n}\n","/**\n * SE23 — `defineSkillReadTool`: an OPT-IN factory that gives the MODEL on-demand\n * access to a skill's full body + references via a `skill_read` tool.\n *\n * TheoKit discloses skills eagerly through the `<skills>` system-prompt block\n * (name + description only). This factory is the LAZY read path: the consumer\n * explicitly adds the returned {@link CustomTool} to `tools`, and when the model\n * calls it with a skill name, it gets that skill's `instructions` (+ SE21\n * `references`). The SDK NEVER auto-injects it — bring-your-own-tools stays\n * intact (sibling of `defineSubAgent` / `workflowAsTool`). See ADR 0007.\n *\n * import { Agent, createSkill, defineSkillReadTool } from \"@theokit/sdk\";\n *\n * const skills = [createSkill({ name: \"release\", description: \"…\", instructions: \"…\" })];\n * const agent = await Agent.create({\n * model: { id: \"openai/gpt-4o-mini\" },\n * skills: { inline: skills },\n * tools: [defineSkillReadTool(skills)],\n * });\n *\n * @public\n */\n\nimport { z } from \"zod\";\nimport type { InlineSkill } from \"./create-skill.js\";\nimport { toJsonSchema } from \"./internal/zod/to-json-schema.js\";\nimport type { CustomTool } from \"./types/agent.js\";\n\nconst SkillReadInputSchema = z.object({\n name: z.string().min(1, \"skill_read: `name` is required.\"),\n});\n\n/**\n * Render a skill's body (+ references) into a single model-facing string.\n * `skill.name` is expected to be a short identifier-like token (no newlines /\n * Markdown headings) — the consumer controls both the names and the tool, so\n * this is a formatting assumption, not a trust boundary.\n */\nfunction renderSkill(skill: InlineSkill): string {\n const parts = [`# Skill: ${skill.name}`, \"\", skill.instructions];\n const refs = skill.references;\n if (refs !== undefined && Object.keys(refs).length > 0) {\n parts.push(\"\", \"## References\");\n for (const [file, content] of Object.entries(refs)) {\n parts.push(\"\", `### ${file}`, content);\n }\n }\n return parts.join(\"\\n\");\n}\n\n/**\n * SE23 — build an OPT-IN `skill_read` {@link CustomTool} over the given inline\n * skills. When the model calls it with `{ name }`, the handler returns that\n * skill's body + references. An UNKNOWN (but well-formed) name returns a typed\n * \"not found\" string the model can act on — NOT a throw that kills the run.\n * Malformed input (missing `name`) fails at the trust boundary via the schema.\n *\n * The consumer controls exposure by choosing which skills to pass; the SDK\n * never auto-injects this tool.\n *\n * @public\n */\nfunction defineSkillReadTool(skills: ReadonlyArray<InlineSkill>): CustomTool {\n // Fail fast on duplicate names (Rule 8): a shadowed skill would be silently\n // unreachable and the \"not found\" list would show the name twice. Names are\n // addressed by exact, case-sensitive match — the same identity the <skills>\n // block uses — so a collision is a construction-time error, not a runtime one.\n const seen = new Set<string>();\n for (const skill of skills) {\n if (seen.has(skill.name)) {\n throw new Error(`defineSkillReadTool: duplicate skill name \"${skill.name}\".`);\n }\n seen.add(skill.name);\n }\n return {\n name: \"skill_read\",\n description:\n \"Read a skill's full instructions (and any bundled reference documents) by its name. \" +\n \"Use this to load the body of a skill listed in the <skills> block before acting on it.\",\n inputSchema: toJsonSchema(SkillReadInputSchema),\n handler: (input: Record<string, unknown>): string => {\n const { name } = SkillReadInputSchema.parse(input);\n const skill = skills.find((s) => s.name === name);\n if (skill === undefined) {\n const available = skills.map((s) => s.name).join(\", \");\n return `Skill \"${name}\" not found. Available skills: ${available.length > 0 ? available : \"(none)\"}.`;\n }\n return renderSkill(skill);\n },\n };\n}\n\n/** SE36 — `SkillReadTool.create` replaces `defineSkillReadTool` (ADR 0015). @public */\nexport class SkillReadTool {\n private constructor() {}\n static create(skills: ReadonlyArray<InlineSkill>): CustomTool {\n return defineSkillReadTool(skills);\n }\n}\n","/**\n * `EventBus` — typed EventEmitter wrapper.\n *\n * Provides type-safe publish/subscribe with automatic unsubscribe cleanup.\n * Each handler is try-caught (EC-2) so one failing handler cannot break others.\n */\n\ntype EventHandler<T> = (payload: T) => void;\n\nexport class EventBus<Events extends Record<string, unknown>> {\n private handlers = new Map<keyof Events, Set<EventHandler<never>>>();\n // M3 #64 — a swallowed handler error used to vanish without a trace (fail-loud\n // violation). We now log it AND expose an observable count so ops/tests can see\n // that a subscriber is silently failing, without breaking the EC-2 contract.\n #handlerErrorCount = 0;\n\n /** M3 #64 — number of handler invocations that threw (and were logged). */\n get handlerErrorCount(): number {\n return this.#handlerErrorCount;\n }\n\n /**\n * Subscribe to an event. Returns an unsubscribe function.\n */\n subscribe<K extends keyof Events>(event: K, handler: EventHandler<Events[K]>): () => void {\n if (!this.handlers.has(event)) {\n this.handlers.set(event, new Set());\n }\n const set = this.handlers.get(event)!;\n set.add(handler as EventHandler<never>);\n return () => {\n set.delete(handler as EventHandler<never>);\n };\n }\n\n /**\n * Publish an event to all subscribers. EC-2: try-catch per handler.\n */\n publish<K extends keyof Events>(event: K, payload: Events[K]): void {\n const set = this.handlers.get(event);\n if (!set) return;\n for (const handler of set) {\n try {\n (handler as EventHandler<Events[K]>)(payload);\n } catch (cause) {\n // EC-2: an error in one handler MUST NOT break the others — but M3 #64\n // makes it fail-loud: log with the event key + message and count it,\n // instead of the pre-M3 empty catch that discarded it without a trace.\n this.#handlerErrorCount += 1;\n const message = cause instanceof Error ? cause.message : String(cause);\n process.stderr.write(\n `[theokit-sdk] event-bus: handler for \"${String(event)}\" threw: ${message}\\n`,\n );\n }\n }\n }\n\n /**\n * Subscribe to an event for a single firing. Returns an unsubscribe function.\n */\n once<K extends keyof Events>(event: K, handler: EventHandler<Events[K]>): () => void {\n const wrapped: EventHandler<Events[K]> = (payload) => {\n unsub();\n handler(payload);\n };\n const unsub = this.subscribe(event, wrapped);\n return unsub;\n }\n}\n","/**\n * M56 (agent-builder goal transparency) — PUBLIC goal-loop driver for CUSTOM agent surfaces.\n *\n * `LocalAgent.runUntil` binds the goal loop to a registered local agent. Surfaces that route turns\n * through their OWN transport (e.g. a TUI store facade, so every goal turn renders in the same\n * timeline as a manual turn) need the SAME loop over a minimal `send → wait` shape. This export\n * gives them exactly that: the canonical `runUntilImpl` (judge + continuation + token budget +\n * Codex states) with the default judge wired from the DI registry.\n *\n * @public\n */\n\nimport type { JudgeContext, JudgeOptions } from \"./internal/judge/judge-call.js\";\nimport type { RunUntilDeps } from \"./internal/runtime/lifecycle/run-until.js\";\nimport type { SDKAgent } from \"./types/agent.js\";\n\n/**\n * Stable marker on the FIRST LINE of every goal-continuation prompt. Surfaces detect it to render the\n * turn collapsed, exclude it from backtrack windows, and skip it in compaction preservation.\n */\nexport { GOAL_CONTINUATION_MARKER } from \"./internal/runtime/lifecycle/goal-marker.js\";\n\nimport type { GoalEvent, GoalOptions, GoalResult } from \"./types/goal-events.js\";\n\n/** The minimal surface the goal loop drives — anything that can send a prompt and wait for it. */\nexport interface GoalLoopAgent {\n send(prompt: string): Promise<{\n wait(): Promise<{ result?: string; usage?: { totalTokens?: number } }>;\n }>;\n}\n\n/**\n * Run the goal-driven loop (`send → judge → continuation`) over ANY `send → wait` surface.\n * Identical semantics to `Agent.runUntil` (ADRs D115-D121 + M55 token budget / states).\n * `depsOverride` is a test seam for injecting a fake judge.\n */\nexport function runGoalLoop(\n agent: GoalLoopAgent,\n goal: string,\n options?: GoalOptions,\n depsOverride?: RunUntilDeps,\n): AsyncGenerator<GoalEvent, GoalResult, void> {\n async function* wrap(): AsyncGenerator<GoalEvent, GoalResult, void> {\n const { runUntilImpl } = await import(\"./internal/runtime/lifecycle/run-until.js\");\n const deps: RunUntilDeps =\n depsOverride ??\n (await (async () => {\n const { judgeCallImpl } = await import(\"./internal/judge/judge-call.js\");\n const { getAgentFacade } = await import(\n \"./internal/runtime/registry/agent-factory-registry.js\"\n );\n const create = getAgentFacade().create;\n return {\n judge: (ctx: JudgeContext, opts?: JudgeOptions) => judgeCallImpl(ctx, opts, { create }),\n };\n })());\n // runUntilImpl only touches `agent.send(...)` → `run.wait()` — the SDKAgent cast is safe for\n // any GoalLoopAgent (structural subset).\n return yield* runUntilImpl(agent as unknown as SDKAgent, goal, options, deps);\n }\n return wrap();\n}\n","/**\n * Reference `BudgetTracker` impl — pure token + iteration counter\n * (SDK 2.0 Phase 2 / T2.1 — ADR D1 reference implementation).\n *\n * Counts tokens per type (input/output) + iteration count. Enforces\n * optional `maxTokens` / `maxIterations` ceilings via `check()`.\n *\n * Does NOT compute USD cost — leaves that to richer impls in\n * `@theokit/sdk-budget` (post-Phase-2). This file is intentionally\n * minimal so consumers can:\n * - use it as-is for simple guard-rails;\n * - read it as a worked example before authoring a custom tracker;\n * - rely on it as a fallback before sdk-budget ships.\n *\n * @public — surface-level reference impl.\n */\n\nimport type {\n BudgetCheck,\n BudgetTotal,\n BudgetTracker,\n BudgetUsageEvent,\n} from \"./budget-tracker.js\";\n\n/** Options for `createCounterBudgetTracker`. */\nexport interface CounterBudgetTrackerOptions {\n /** Hard ceiling on total tokens (input + output). When reached, `check()` returns `allowed: false`. */\n readonly maxTokens?: number;\n /** Hard ceiling on iterations counted by `nextIteration()`. */\n readonly maxIterations?: number;\n}\n\n/**\n * Build a fresh tracker. The returned object is independent — call\n * `createCounterBudgetTracker()` per Agent instance.\n *\n * The tracker exposes the `BudgetTracker` contract PLUS a `nextIteration()`\n * helper for impls that want explicit iteration counting (the agent loop\n * calls it once per turn). Without `nextIteration()` calls, the iteration\n * cap is never reached.\n */\nexport function createCounterBudgetTracker(\n options: CounterBudgetTrackerOptions = {},\n): BudgetTracker & { nextIteration(): void } {\n let totalTokens = 0;\n let iterations = 0;\n const maxTokens = options.maxTokens;\n const maxIterations = options.maxIterations;\n\n return {\n track(event: BudgetUsageEvent): void {\n // `track()` MUST be synchronous and non-throwing per the contract.\n // Invalid events (negative tokens) are silently clamped.\n const t = Number.isFinite(event.tokens) && event.tokens > 0 ? event.tokens : 0;\n totalTokens += t;\n },\n\n check(): BudgetCheck {\n if (maxTokens !== undefined && totalTokens >= maxTokens) {\n return {\n allowed: false,\n reason: \"token_limit\",\n detail: `${totalTokens} >= maxTokens ${maxTokens}`,\n };\n }\n if (maxIterations !== undefined && iterations >= maxIterations) {\n return {\n allowed: false,\n reason: \"iteration_limit\",\n detail: `${iterations} >= maxIterations ${maxIterations}`,\n };\n }\n return { allowed: true };\n },\n\n getTotal(): BudgetTotal {\n return { tokens: totalTokens, iterations };\n },\n\n nextIteration(): void {\n iterations += 1;\n },\n };\n}\n","/**\n * Plugin contract — RUNTIME value + type re-exports (T1.1, ADRs D97-D101).\n *\n * SE45/SE46 — the pure `Plugin` *type* and its type companions now live in\n * `types/plugin.ts` (above the DIP boundary, because `Plugin` is public\n * contract). This module keeps the RUNTIME value (`definePlugin` /\n * `Plugin.create`) and re-exports the types so every existing\n * `../plugins/types.js` importer (and the `index.ts` barrel) resolves the same\n * names unchanged.\n *\n * @public\n */\n\nimport type { Plugin as PluginType } from \"../../types/plugin.js\";\n\nexport type {\n CommandHandler,\n CommandOptions,\n HookHandler,\n HookName,\n LlmCallContext,\n // `MemoryProviderFactory` is @internal; re-exporting it across this module hop\n // trips rollup-plugin-dts (it strips @internal decls, then the re-export dangles\n // — see stripInternal in tsconfig.base.json). Its two internal consumers import\n // it directly from ../../types/plugin.js instead. It stays reachable as the\n // `createProvider` field type on the `Plugin` union, which IS re-exported here.\n PluginContext,\n PostAssistantReplyContext,\n PostToolCallContext,\n PreToolCallContext,\n PreToolCallDecision,\n PreUserSendContext,\n PreUserSendResult,\n SessionLifecycleContext,\n ToolCallSummary,\n ToolContext,\n ToolResultTransformContext,\n TransformContext,\n} from \"../../types/plugin.js\";\n\n// Re-establish the declaration merge locally: `Plugin` is BOTH the discriminated\n// union *type* (aliased from ./types/plugin.js) AND the runtime const-companion\n// (`Plugin.create`) declared below. Keeping both bindings under the one exported\n// name `Plugin` preserves the public value+type surface byte-for-byte.\nexport type Plugin = PluginType;\n\n/**\n * Identity helper for plugin authors. TS-only convenience — preserves\n * inferred type without forcing manual `Plugin` annotation.\n *\n * @public\n */\nexport function definePlugin<P extends Plugin>(p: P): P {\n return p;\n}\n\n/** SE36 — `Plugin.create` replaces `definePlugin` (ADR 0015). Const-companion (the `Plugin` type alias blocks a class of the same name); `create` is the generic `definePlugin`. @public */\nexport const Plugin = { create: definePlugin };\n","/**\n * Reference `MemoryProvider` impl — no-op fallback (SDK 2.0 Phase 1 /\n * T1.2 reference implementation, mirrors `createCounterBudgetTracker`).\n *\n * Every method is a degenerate identity:\n * - `init()` returns a handle wrapping a no-op `MemoryAdapter`.\n * - `buildTools()` returns `[]` (no memory tools surfaced to the LLM).\n * - `runActivePass()` returns `{ facts: [] }` (no recall fires).\n * - `dispose()` is a no-op.\n *\n * Why ship this:\n * - Default safety net before `@theokit/sdk-memory` is installed.\n * - Worked reference for authors of custom providers.\n * - Enables `Agent.create({ memoryProvider: createNoopMemoryProvider() })`\n * unit tests without pulling memory infrastructure.\n *\n * NOT a substitute for the existing `Memory` class — the legacy class\n * stays authoritative until the subsystem fully ports to providers\n * (Phase 1 / T1.6).\n *\n * @public — surface-level reference impl.\n */\n\nimport type {\n MemoryAdapter,\n MemoryAdapterCapabilities,\n MemoryContext,\n MemoryFact,\n MemoryId,\n MemoryTurnMessage,\n} from \"../../../types/memory-adapter.js\";\nimport type {\n ActiveMemoryPassArgs,\n ActiveMemoryPassResult,\n MemoryProvider,\n MemoryProviderHandle,\n MemoryProviderInitOptions,\n} from \"./memory-provider.js\";\n\n/** Adapter-id used by the no-op MemoryAdapter — namespaced to avoid collision. */\nconst NOOP_ADAPTER_ID = \"noop\";\n\n/** All-false capabilities — every optional feature gated off. */\nconst NOOP_CAPABILITIES: MemoryAdapterCapabilities = {\n history: false,\n sessions: false,\n tenancy: false,\n reasoning: false,\n toolSchemas: false,\n prefetch: false,\n};\n\n/** Build the no-op MemoryAdapter satisfying the public contract. */\nfunction createNoopMemoryAdapter(): MemoryAdapter {\n return {\n id: NOOP_ADAPTER_ID,\n capabilities: NOOP_CAPABILITIES,\n isAvailable(): boolean {\n return true;\n },\n async write(_content: string | MemoryTurnMessage[], _ctx: MemoryContext): Promise<MemoryId> {\n // Return a deterministic noop id with the adapter-id prefix so\n // `extractRawId` cross-adapter safety check still works.\n return `${NOOP_ADAPTER_ID}:noop` as MemoryId;\n },\n async recall(_query: string, _ctx: MemoryContext, _k?: number): Promise<MemoryFact[]> {\n return [];\n },\n async delete(_id: MemoryId): Promise<void> {\n return;\n },\n };\n}\n\n/**\n * Build a fresh no-op MemoryProvider. The returned object is independent —\n * call `createNoopMemoryProvider()` per Agent instance. `init()` is\n * idempotent: subsequent calls return a NEW handle (no per-agent cache —\n * the no-op has no state worth caching).\n */\nexport function createNoopMemoryProvider(): MemoryProvider {\n return {\n async init(_opts: MemoryProviderInitOptions): Promise<MemoryProviderHandle> {\n return {\n adapter: createNoopMemoryAdapter(),\n };\n },\n buildTools(_handle: MemoryProviderHandle): readonly never[] {\n return [];\n },\n async runActivePass(\n _handle: MemoryProviderHandle,\n _args: ActiveMemoryPassArgs,\n ): Promise<ActiveMemoryPassResult> {\n return { facts: [] };\n },\n recordSessionSummary(): void {\n // No-op: the no-op provider doesn't persist anything. Defining the\n // method (vs leaving it undefined) is intentional — when consumers\n // wire the no-op explicitly, they OPT INTO the port path for the\n // session-summary write site too. Future rich impls override this\n // with real disk writes.\n return;\n },\n dispose(_handle: MemoryProviderHandle): void {\n return;\n },\n };\n}\n\n/** SE36 — `NoopMemoryProvider.create` replaces `createNoopMemoryProvider` (ADR 0015). @public */\nexport class NoopMemoryProvider {\n private constructor() {}\n static create(): MemoryProvider {\n return createNoopMemoryProvider();\n }\n}\n","/**\n * `JobQueue` — background job queue with status tracking, cancellation, and an\n * optional concurrency bound.\n *\n * EC-1: all enqueued functions are wrapped in Promise.resolve().then() so\n * synchronous throws become rejections.\n *\n * #58: each job runs under an `AbortController` whose signal is passed to the\n * job fn, so `cancel()` actually interrupts a running job (not just a status\n * flip); an optional `maxConcurrency` bounds how many jobs run at once.\n */\n\nimport { randomUUID } from \"node:crypto\";\n\ntype JobStatus = \"pending\" | \"running\" | \"completed\" | \"failed\" | \"cancelled\";\n\ninterface Job<T> {\n id: string;\n status: JobStatus;\n result?: T;\n error?: string;\n}\n\n/** #58 — construction options. */\nexport interface JobQueueOptions {\n /**\n * Max jobs running concurrently. Omit for unbounded (previous behavior).\n * Values < 1 are clamped to 1 (an invalid bound must not deadlock).\n */\n maxConcurrency?: number;\n}\n\nexport class JobQueue {\n private jobs = new Map<string, Job<unknown>>();\n private controllers = new Map<string, AbortController>();\n private readonly maxConcurrency: number;\n private running = 0;\n private readonly waiting: Array<() => void> = [];\n\n constructor(options: JobQueueOptions = {}) {\n this.maxConcurrency =\n options.maxConcurrency === undefined\n ? Number.POSITIVE_INFINITY\n : Math.max(1, options.maxConcurrency);\n }\n\n /**\n * Enqueue a background function. Returns the job ID immediately. The function\n * receives an `AbortSignal` that fires when the job is cancelled (#58) — a\n * cooperative job should observe it to stop early. Existing `() => Promise<T>`\n * callers are unaffected (the signal argument is simply ignored).\n */\n enqueue<T>(fn: (signal: AbortSignal) => Promise<T>): string {\n const id = randomUUID();\n const job: Job<T> = { id, status: \"pending\" };\n this.jobs.set(id, job as Job<unknown>);\n const controller = new AbortController();\n this.controllers.set(id, controller);\n\n void this.#acquire().then(() => {\n // Cancelled while waiting for a slot → never start.\n if (job.status === \"cancelled\") {\n this.#release(id);\n return;\n }\n job.status = \"running\";\n Promise.resolve()\n .then(() => fn(controller.signal))\n .then((result) => {\n if (job.status === \"cancelled\") return;\n job.result = result;\n job.status = \"completed\";\n })\n .catch((err: unknown) => {\n if (job.status === \"cancelled\") return;\n job.error = err instanceof Error ? err.message : String(err);\n job.status = \"failed\";\n })\n .finally(() => this.#release(id));\n });\n\n return id;\n }\n\n getJob(id: string): Job<unknown> | undefined {\n return this.jobs.get(id);\n }\n\n list(): Job<unknown>[] {\n return [...this.jobs.values()];\n }\n\n /**\n * Cancel a pending or running job. Returns true if cancelled. #58 — aborts the\n * job's `AbortSignal` so a cooperative running job is actually interrupted.\n */\n cancel(id: string): boolean {\n const job = this.jobs.get(id);\n if (!job) return false;\n if (job.status === \"pending\" || job.status === \"running\") {\n const wasRunning = job.status === \"running\";\n job.status = \"cancelled\";\n this.controllers.get(id)?.abort();\n // A running job holds a concurrency slot; its fn may ignore the signal and\n // never settle, so free the slot NOW rather than waiting for `.finally`\n // (which would never fire → the bounded queue would deadlock). `#release`\n // is idempotent, so the job's eventual `.finally` is a no-op. A *pending*\n // job holds no slot yet — its slot-grant self-releases when it starts.\n if (wasRunning) this.#release(id);\n return true;\n }\n return false;\n }\n\n /** Acquire a concurrency slot (resolves immediately when unbounded/free). */\n #acquire(): Promise<void> {\n if (this.running < this.maxConcurrency) {\n this.running += 1;\n return Promise.resolve();\n }\n return new Promise<void>((resolve) => {\n this.waiting.push(() => {\n this.running += 1;\n resolve();\n });\n });\n }\n\n /**\n * Release a slot + clean up the controller; start the next waiting job.\n * Idempotent — keyed on the controller's presence, so a running job that was\n * cancelled (released early) does not double-decrement when its `.finally`\n * eventually fires.\n */\n #release(id: string): void {\n if (!this.controllers.has(id)) return; // already released\n this.controllers.delete(id);\n this.running -= 1;\n const next = this.waiting.shift();\n if (next !== undefined) next();\n }\n}\n","import { createHash } from \"node:crypto\";\nimport { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nimport { replaceFileAtomic } from \"../../persistence/atomic-write.js\";\nimport { memoryDir } from \"../storage/markdown-store.js\";\n\n/**\n * Dream-diary append (ADR D7).\n *\n * Diary lives at `.theokit/memory/dream-diary.md` and grows with one entry\n * per sweep. Each entry is content-hashed so the same input produces the\n * same entry — idempotency contract.\n *\n * Writes go through `replaceFileAtomic` (EC-3 of edge-case review) so a\n * crash mid-write can never leave a half-written diary.\n *\n * @internal\n */\n\nexport interface DiaryEntry {\n timestampMs: number;\n factsBefore: number;\n factsAfter: number;\n duplicatesRemoved: number;\n clustersCreated: number;\n notesWritten: number;\n}\n\nexport function diaryPath(cwd: string): string {\n return join(memoryDir(cwd), \"dream-diary.md\");\n}\n\nexport function renderDiaryEntry(entry: DiaryEntry): string {\n const stamp = new Date(entry.timestampMs).toISOString();\n const hash = entryHash(entry).slice(0, 8);\n return [\n `## ${stamp}`,\n \"\",\n `- entry-hash: ${hash}`,\n `- facts before: ${entry.factsBefore}`,\n `- facts after: ${entry.factsAfter}`,\n `- duplicates removed: ${entry.duplicatesRemoved}`,\n `- clusters created: ${entry.clustersCreated}`,\n `- notes written: ${entry.notesWritten}`,\n \"\",\n ].join(\"\\n\");\n}\n\nexport async function appendDiaryEntry(cwd: string, entry: DiaryEntry): Promise<void> {\n const path = diaryPath(cwd);\n let raw = \"\";\n try {\n raw = await readFile(path, \"utf8\");\n } catch {\n raw = \"# Dream Diary\\n\\n\";\n }\n const next = `${raw.endsWith(\"\\n\") ? raw : `${raw}\\n`}${renderDiaryEntry(entry)}`;\n await replaceFileAtomic(path, next);\n}\n\nexport function entryHash(entry: DiaryEntry): string {\n return createHash(\"sha256\")\n .update(\n [\n entry.factsBefore,\n entry.factsAfter,\n entry.duplicatesRemoved,\n entry.clustersCreated,\n entry.notesWritten,\n ].join(\"|\"),\n )\n .digest(\"hex\");\n}\n","import type { EmbeddingRuntime } from \"../embedding-adapter.js\";\nimport type { MemoryFact } from \"../types.js\";\n\n/**\n * Dreaming/REM phase logic.\n *\n * Three phases:\n * - **light** — drop near-duplicate facts (cosine similarity > 0.95).\n * - **REM** — cluster thematically related facts (cosine ≥ 0.75).\n * - **deep** — pick a representative bullet per cluster (longest text\n * wins) and emit consolidated markdown notes.\n *\n * @internal\n */\n\nexport interface DedupResult {\n kept: MemoryFact[];\n duplicatesRemoved: number;\n}\n\nexport interface Cluster {\n representativeText: string;\n members: ReadonlyArray<MemoryFact>;\n}\n\nexport interface ClusterResult {\n clusters: Cluster[];\n}\n\nconst DEFAULT_DEDUP_THRESHOLD = 0.95;\nconst DEFAULT_CLUSTER_THRESHOLD = 0.75;\n\n/** Light phase — drop facts whose embedding is too similar to one already kept. */\nexport async function lightPhase(\n facts: ReadonlyArray<MemoryFact>,\n embedding: EmbeddingRuntime,\n threshold: number = DEFAULT_DEDUP_THRESHOLD,\n): Promise<DedupResult> {\n if (facts.length <= 1) return { kept: [...facts], duplicatesRemoved: 0 };\n const vectors = await embedding.embed(facts.map((f) => f.text));\n const keptIdx: number[] = [];\n const keptVecs: number[][] = [];\n for (let i = 0; i < facts.length; i++) {\n const vec = vectors[i] ?? [];\n const isDup = keptVecs.some((kept) => cosineSimilarity(vec, kept) >= threshold);\n if (isDup) continue;\n keptIdx.push(i);\n keptVecs.push(vec);\n }\n const kept = keptIdx.map((i) => facts[i] as MemoryFact);\n return { kept, duplicatesRemoved: facts.length - kept.length };\n}\n\n// T4.6 — cap facts per sweep to prevent O(N²) blowup. 500 facts →\n// 125K comparisons (acceptable). 5000 facts → 12.5M (unacceptable).\n// When facts exceed the cap, a deterministic subsample is taken so the\n// sweep is bounded. The remaining facts are carried to the next sweep.\nconst DEFAULT_MAX_FACTS_PER_SWEEP = 500;\n\n/** REM phase — single-link agglomerative clustering by cosine similarity. */\nexport async function remPhase(\n facts: ReadonlyArray<MemoryFact>,\n embedding: EmbeddingRuntime,\n threshold: number = DEFAULT_CLUSTER_THRESHOLD,\n maxFactsPerSweep: number = DEFAULT_MAX_FACTS_PER_SWEEP,\n): Promise<ClusterResult> {\n if (facts.length === 0) return { clusters: [] };\n // T4.6 — cap: subsample when facts exceed budget. Deterministic\n // sort by text hash so the same input always picks the same subset.\n const capped = facts.length > maxFactsPerSweep ? facts.slice(0, maxFactsPerSweep) : facts;\n const vectors = await embedding.embed(capped.map((f) => f.text));\n const clusterOfIdx = unionFindByPairs(vectors, threshold);\n const groups = bucketFactsByClusterRoot(capped, clusterOfIdx);\n return { clusters: [...groups.values()].map(buildClusterFromMembers) };\n}\n\nfunction unionFindByPairs(\n vectors: ReadonlyArray<ReadonlyArray<number>>,\n threshold: number,\n): number[] {\n const clusterOfIdx = vectors.map((_, i) => i);\n for (let i = 0; i < vectors.length; i++) {\n for (let j = i + 1; j < vectors.length; j++) {\n if (cosineSimilarity(vectors[i] ?? [], vectors[j] ?? []) >= threshold) {\n unifyClusters(clusterOfIdx, i, j);\n }\n }\n }\n return clusterOfIdx;\n}\n\nfunction bucketFactsByClusterRoot(\n facts: ReadonlyArray<MemoryFact>,\n clusterOfIdx: number[],\n): Map<number, MemoryFact[]> {\n const groups = new Map<number, MemoryFact[]>();\n for (let i = 0; i < facts.length; i++) {\n const root = findRoot(clusterOfIdx, i);\n const list = groups.get(root) ?? [];\n list.push(facts[i] as MemoryFact);\n groups.set(root, list);\n }\n return groups;\n}\n\nfunction buildClusterFromMembers(members: ReadonlyArray<MemoryFact>): Cluster {\n const sorted = [...members].sort((a, b) => b.text.length - a.text.length);\n return { representativeText: sorted[0]?.text ?? \"\", members };\n}\n\n/** Deep phase — render consolidated markdown for the dreamed note. */\nexport function deepPhase(clusters: ReadonlyArray<Cluster>, timestampMs: number): string {\n if (clusters.length === 0) return \"\";\n const isoStamp = new Date(timestampMs).toISOString();\n const lines: string[] = [`# Dreamed ${isoStamp}`, \"\"];\n for (let i = 0; i < clusters.length; i++) {\n const c = clusters[i];\n if (c === undefined) continue;\n lines.push(`## Cluster ${i + 1}: ${c.representativeText}`);\n lines.push(\"\");\n for (const member of c.members) lines.push(`- ${member.text}`);\n lines.push(\"\");\n }\n return `${lines.join(\"\\n\")}\\n`;\n}\n\nfunction cosineSimilarity(a: ReadonlyArray<number>, b: ReadonlyArray<number>): number {\n if (a.length === 0 || b.length === 0 || a.length !== b.length) return 0;\n let dot = 0;\n let aNorm = 0;\n let bNorm = 0;\n for (let i = 0; i < a.length; i++) {\n const ai = a[i] ?? 0;\n const bi = b[i] ?? 0;\n dot += ai * bi;\n aNorm += ai * ai;\n bNorm += bi * bi;\n }\n const denom = Math.sqrt(aNorm) * Math.sqrt(bNorm);\n return denom === 0 ? 0 : dot / denom;\n}\n\nfunction findRoot(parents: number[], i: number): number {\n let root = i;\n while (parents[root] !== root) {\n const next = parents[root] ?? root;\n if (next === root) break;\n root = next;\n }\n parents[i] = root;\n return root;\n}\n\nfunction unifyClusters(parents: number[], a: number, b: number): void {\n const rootA = findRoot(parents, a);\n const rootB = findRoot(parents, b);\n if (rootA !== rootB) parents[rootB] = rootA;\n}\n","import { mkdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nimport { replaceFileAtomic } from \"../../persistence/atomic-write.js\";\nimport { withCwdMutex } from \"../../persistence/cwd-mutex.js\";\nimport type { EmbeddingRuntime } from \"../embedding-adapter.js\";\nimport { memoryDir, readFactsFromMarkdown } from \"../storage/markdown-store.js\";\nimport { appendDiaryEntry } from \"./diary.js\";\nimport { deepPhase, lightPhase, remPhase } from \"./phases.js\";\n\n/**\n * Dreaming sweep orchestrator (ADR D7 of memory-system-peer-project-parity).\n *\n * Phases:\n * 1. **light** — drop near-duplicate facts via cosine similarity.\n * 2. **REM** — cluster thematically related facts.\n * 3. **deep** — write a `notes/dreamed-<ts>.md` per sweep with consolidated\n * clusters; append a diary entry.\n *\n * All file writes go through `replaceFileAtomic` (EC-3) and the entire sweep\n * holds the per-cwd mutex so a `Remember:` append can't race it.\n *\n * @internal\n */\n\nexport interface DreamingOptions {\n cwd: string;\n embedding: EmbeddingRuntime;\n dedupThreshold?: number;\n clusterThreshold?: number;\n /** Test hook — fixed timestamp for the run. */\n now?: () => number;\n}\n\nexport interface DreamingResult {\n status: \"ok\" | \"skipped\" | \"error\";\n factsBefore: number;\n factsAfter: number;\n duplicatesRemoved: number;\n clustersCreated: number;\n notesWritten: number;\n diaryEntryHash: string | undefined;\n}\n\nexport function runDreamingSweep(options: DreamingOptions): Promise<DreamingResult> {\n return withCwdMutex(`dream:${options.cwd}`, () => runInner(options));\n}\n\nasync function runInner(options: DreamingOptions): Promise<DreamingResult> {\n const now = options.now ?? Date.now;\n const timestampMs = now();\n try {\n const facts = await readFactsFromMarkdown(options.cwd);\n if (facts.length === 0) {\n return emptyResult(\"skipped\");\n }\n const dedup = await lightPhase(facts, options.embedding, options.dedupThreshold);\n const rem = await remPhase(dedup.kept, options.embedding, options.clusterThreshold);\n const notesWritten = await writeConsolidatedNotes(options.cwd, rem.clusters, timestampMs);\n const result: DreamingResult = {\n status: \"ok\",\n factsBefore: facts.length,\n factsAfter: dedup.kept.length,\n duplicatesRemoved: dedup.duplicatesRemoved,\n clustersCreated: rem.clusters.length,\n notesWritten,\n diaryEntryHash: undefined,\n };\n await appendDiaryEntry(options.cwd, {\n timestampMs,\n factsBefore: result.factsBefore,\n factsAfter: result.factsAfter,\n duplicatesRemoved: result.duplicatesRemoved,\n clustersCreated: result.clustersCreated,\n notesWritten: result.notesWritten,\n });\n return result;\n } catch (cause) {\n const message = cause instanceof Error ? cause.message : String(cause);\n process.stderr.write(`[theokit-sdk] dreaming sweep failed: ${message}\\n`);\n return emptyResult(\"error\");\n }\n}\n\nasync function writeConsolidatedNotes(\n cwd: string,\n clusters: ReadonlyArray<{ representativeText: string; members: ReadonlyArray<{ text: string }> }>,\n timestampMs: number,\n): Promise<number> {\n if (clusters.length === 0) return 0;\n const notesDir = join(memoryDir(cwd), \"notes\");\n await mkdir(notesDir, { recursive: true });\n const isoSlug = new Date(timestampMs).toISOString().replace(/[^\\dT]/g, \"-\");\n const file = join(notesDir, `dreamed-${isoSlug}.md`);\n const body = deepPhase(clusters, timestampMs);\n await replaceFileAtomic(file, body);\n return 1;\n}\n\nfunction emptyResult(status: \"skipped\" | \"error\"): DreamingResult {\n return {\n status,\n factsBefore: 0,\n factsAfter: 0,\n duplicatesRemoved: 0,\n clustersCreated: 0,\n notesWritten: 0,\n diaryEntryHash: undefined,\n };\n}\n","/**\n * SDK 2.0 Phase 4 (Stage 4) — Optional peer loader for\n * `@theokit/sdk-memory`.\n *\n * The Memory class public API in `src/memory.ts` keeps its surface\n * stable but routes through sdk-memory when installed. When sdk-memory\n * is NOT installed, methods fall back to sdk-core's legacy\n * `internal/memory/*` implementations — preserving v1.x back-compat.\n *\n * Pattern mirrors sdk-handoff's optional-peer dynamic import: try\n * `await import(\"@theokit/sdk-memory\")` once, cache the result (the\n * module OR `null` for \"definitively missing\"), and let the caller\n * route.\n *\n * Iter 76 (Stage 4 #1): foundation helper for the Memory class\n * delegation refactor. No behavior changes yet — this iter only\n * adds the loader; iter 77+ wires Memory class methods to use it.\n *\n * @internal\n */\n\n/**\n * Minimal structural mirror of the sdk-memory surface this loader\n * exposes to Memory class methods. Keeps the contract pinned even\n * if sdk-memory ships additional exports.\n */\nexport interface SdkMemoryModule {\n /** Mirrors @theokit/sdk-memory's catalog Record. */\n readonly MEMORY_EMBEDDING_ADAPTERS: Readonly<\n Record<\n string,\n {\n readonly id: string;\n readonly defaultModel: string;\n readonly transport: \"local\" | \"remote\";\n // biome-ignore lint/suspicious/noExplicitAny: structural mirror — runtime carries the canonical types\n create(options: any): Promise<any>;\n }\n >\n >;\n\n /** Mirrors @theokit/sdk-memory's runDreamingSweep entrypoint. */\n runDreamingSweep(opts: {\n cwd: string;\n // biome-ignore lint/suspicious/noExplicitAny: structural mirror\n embedding: any;\n dedupThreshold?: number;\n clusterThreshold?: number;\n }): Promise<{\n status: \"ok\" | \"skipped\" | \"error\";\n factsBefore: number;\n factsAfter: number;\n duplicatesRemoved: number;\n clustersCreated: number;\n notesWritten: number;\n }>;\n\n /** Mirrors @theokit/sdk-memory's IndexManager class (static open). */\n readonly IndexManager: {\n open(opts: {\n cwd: string;\n filePath?: string;\n // biome-ignore lint/suspicious/noExplicitAny: structural mirror\n embedding?: any;\n backend?: \"sqlite-vec\" | \"lance\";\n // biome-ignore lint/suspicious/noExplicitAny: structural mirror\n }): Promise<any>;\n };\n\n /** Mirrors @theokit/sdk-memory's migrateSqliteToLance entrypoint (ADR D44). */\n migrateSqliteToLance(opts: {\n cwd: string;\n dryRun?: boolean;\n batchSize?: number;\n logger?: (msg: string) => void;\n }): Promise<{\n countSqlite: number;\n countLance: number;\n validated: boolean;\n sampleComparisons: ReadonlyArray<{ id: string; match: boolean }>;\n lancePath: string;\n committed: boolean;\n }>;\n}\n\nlet cachedAttempt: Promise<SdkMemoryModule | null> | undefined;\nlet forcedAbsentForTests = false;\n\n/**\n * Attempt to load `@theokit/sdk-memory`. Returns the module on\n * success, `null` on definitive absence. Result is memoized so\n * repeated calls during agent runtime don't re-pay the dynamic\n * import cost.\n *\n * @internal\n */\nexport function tryLoadSdkMemoryPeer(): Promise<SdkMemoryModule | null> {\n if (forcedAbsentForTests) return Promise.resolve(null);\n if (cachedAttempt !== undefined) return cachedAttempt;\n cachedAttempt = (async () => {\n try {\n // Dynamic specifier kept opaque so bundlers can't statically\n // resolve sdk-memory and bake it into a bundle that would\n // require the package to exist at install time.\n const spec = \"@theokit/sdk-memory\";\n const mod = (await import(spec)) as unknown as SdkMemoryModule;\n // Sanity: the module must expose the 4 surfaces we route through.\n if (\n typeof mod.runDreamingSweep === \"function\" &&\n mod.MEMORY_EMBEDDING_ADAPTERS !== undefined &&\n mod.IndexManager !== undefined &&\n typeof mod.migrateSqliteToLance === \"function\"\n ) {\n return mod;\n }\n return null;\n } catch {\n return null;\n }\n })();\n return cachedAttempt;\n}\n\n/**\n * Test-only: reset the memoized loader state so an integration test\n * can probe both the \"peer present\" and \"peer absent\" code paths.\n *\n * @internal\n */\nexport function resetSdkMemoryPeerCacheForTests(): void {\n cachedAttempt = undefined;\n forcedAbsentForTests = false;\n}\n\n/**\n * Test-only: force the loader to behave as if sdk-memory is NOT\n * installed, even when the workspace setup makes it resolvable. Lets\n * tests exercise the legacy fallback code path inside sdk-core's\n * Memory class methods + migrate wrapper without uninstalling the\n * peer.\n *\n * Pair with `resetSdkMemoryPeerCacheForTests()` in afterEach to undo.\n *\n * @internal\n */\nexport function forceSdkMemoryPeerAbsentForTests(): void {\n cachedAttempt = undefined;\n forcedAbsentForTests = true;\n}\n","import { MEMORY_EMBEDDING_ADAPTERS } from \"./internal/memory/adapters/catalog.js\";\nimport { runDreamingSweep as runDreamingSweepInternal } from \"./internal/memory/dreaming/run.js\";\nimport { tryLoadSdkMemoryPeer } from \"./internal/memory/sdk-memory-peer-loader.js\";\n\n/**\n * Public handle to an open memory index. Mirrors the internal `MemoryIndex`\n * contract structurally; defined here (NOT re-exported from internal/) so\n * the public DTS surface does not pull the internal/runtime cycle that\n * trips rollup-plugin-dts.\n *\n * @public\n */\nexport interface MemoryIndexHandle {\n sync(): Promise<{\n filesScanned: number;\n filesUpdated: number;\n chunksWritten: number;\n chunksEmbedded: number;\n }>;\n search(\n query: string,\n options?: {\n maxResults?: number;\n minScore?: number;\n sources?: ReadonlyArray<\"memory\" | \"sessions\" | \"wiki\">;\n },\n ): Promise<\n ReadonlyArray<{\n path: string;\n startLine: number;\n endLine: number;\n score: number;\n textScore: number;\n vectorScore?: number;\n snippet: string;\n source: \"memory\" | \"sessions\" | \"wiki\";\n citation: string;\n }>\n >;\n status(): {\n backend: \"fts-only\" | \"hybrid\";\n filesIndexed: number;\n chunksIndexed: number;\n lastSyncMs?: number;\n };\n close(): Promise<void> | void;\n}\n\n/**\n * Public `Memory` namespace.\n *\n * Exposes operations users can run outside of `agent.send()` — most notably\n * the dreaming sweep (consolidation of facts via dedup + clustering).\n *\n * @public\n */\n\nexport interface DreamingSweepOptions {\n /** Workspace cwd holding `.theokit/memory/`. */\n cwd: string;\n /**\n * Embedding provider for semantic dedup + clustering. Required — dreaming\n * relies on real embeddings to score cosine similarity. Supported providers:\n * `\"openai\"`, `\"mistral\"`, `\"openrouter\"`, `\"voyage\"`, `\"deepinfra\"`,\n * `\"ollama\"` (local, ADR D183).\n */\n embedding: {\n provider: \"openai\" | \"mistral\" | \"openrouter\" | \"voyage\" | \"deepinfra\" | \"ollama\";\n model?: string;\n };\n /** Cosine-similarity threshold for the dedup phase. Default `0.95`. */\n dedupThreshold?: number;\n /** Cosine-similarity threshold for the clustering phase. Default `0.75`. */\n clusterThreshold?: number;\n}\n\nexport interface DreamingSweepResult {\n status: \"ok\" | \"skipped\" | \"error\";\n factsBefore: number;\n factsAfter: number;\n duplicatesRemoved: number;\n clustersCreated: number;\n notesWritten: number;\n}\n\n/**\n * Options for `Memory.openIndex`. Mirrors the internal `OpenIndexOptions`\n * but using only public types from the SDK surface.\n *\n * @public\n */\nexport interface OpenMemoryIndexOptions {\n /** Workspace cwd holding `.theokit/memory/`. */\n cwd: string;\n /** Override storage file path (SQLite) OR storage directory (Lance). */\n filePath?: string;\n /**\n * Embedding runtime — REQUIRED for `backend: \"lance\"`, optional for\n * `\"sqlite-vec\"` (when omitted, SQLite runs FTS-only without vector\n * recall).\n */\n embedding?: {\n provider: \"openai\" | \"mistral\" | \"openrouter\" | \"voyage\" | \"deepinfra\" | \"ollama\";\n model?: string;\n };\n /** Default `\"sqlite-vec\"`. Set to `\"lance\"` to opt into LanceDB (peer dep). */\n backend?: \"sqlite-vec\" | \"lance\";\n}\n\nexport const Memory = {\n /**\n * Open a memory index. Dispatches to SQLite-vec (default, zero deps) or\n * LanceDB (opt-in via `backend: \"lance\"`, requires `@lancedb/lancedb`\n * peer dep + an embedding runtime).\n *\n * Returns a `MemoryIndex` with `sync()`, `search(query, opts?)`,\n * `status()`, and `close()`. Use this when you want a direct index\n * handle outside of `Agent.create({ memory: ... })`.\n *\n * @throws ConfigurationError({code:\"invalid_memory_backend\"}) for typos\n * like `\"lancedb\"`.\n * @throws ConfigurationError({code:\"lance_requires_embedding\"}) when\n * `backend: \"lance\"` is requested without `embedding`.\n * @throws ConfigurationError({code:\"lance_backend_unavailable\"}) when\n * `backend: \"lance\"` is requested but the peer dep is absent.\n *\n * @public\n */\n async openIndex(opts: OpenMemoryIndexOptions): Promise<MemoryIndexHandle> {\n // SDK 2.0 Phase 4 (Stage 4, iter 77): if @theokit/sdk-memory is\n // installed, route through it. Otherwise fall back to the legacy\n // internal path. Behavior + thrown errors are byte-equivalent\n // because sdk-memory's IndexManager + MEMORY_EMBEDDING_ADAPTERS\n // are hybrid copies of sdk-core's internals (iter 44-75).\n const peer = await tryLoadSdkMemoryPeer();\n const openArgs = buildIndexOpenArgs(opts, undefined);\n if (peer !== null) {\n openArgs.embedding = await resolveEmbedding(opts.embedding, peer.MEMORY_EMBEDDING_ADAPTERS);\n // biome-ignore lint/suspicious/noExplicitAny: peer is dynamically loaded — structural compat ensured by sdk-memory\n return (await peer.IndexManager.open(openArgs as any)) as MemoryIndexHandle;\n }\n // Fallback path — sdk-memory peer absent; use the internal\n // implementation (v1.x behavior preserved).\n // Lazy import to avoid pulling internal/runtime types into the public\n // DTS surface (rollup-plugin-dts trips on a pre-existing cycle in\n // types/agent.ts ↔ fork-agent.ts when reached transitively).\n const { IndexManager } = await import(\"./internal/memory/index-manager.js\");\n openArgs.embedding = await resolveEmbedding(opts.embedding, MEMORY_EMBEDDING_ADAPTERS);\n // Cast: structural-compat (internal MemoryIndex matches MemoryIndexHandle).\n // biome-ignore lint/suspicious/noExplicitAny: embedding is resolved from the same catalog — types match at runtime\n return (await IndexManager.open(openArgs as any)) as MemoryIndexHandle;\n },\n\n /**\n * Run a dreaming sweep: dedup near-duplicate facts, cluster thematically\n * related ones, and write a consolidated note + diary entry.\n *\n * @public\n */\n async runDreamingSweep(opts: DreamingSweepOptions): Promise<DreamingSweepResult> {\n // SDK 2.0 Phase 4 (Stage 4, iter 77): route through sdk-memory\n // when installed; fall back to legacy internal/ path otherwise.\n const peer = await tryLoadSdkMemoryPeer();\n const catalog = peer !== null ? peer.MEMORY_EMBEDDING_ADAPTERS : MEMORY_EMBEDDING_ADAPTERS;\n const sweepArgs = await buildDreamingSweepArgs(opts, catalog);\n const result =\n peer !== null\n ? // biome-ignore lint/suspicious/noExplicitAny: peer is dynamically loaded — structural compat ensured by sdk-memory\n await peer.runDreamingSweep(sweepArgs as any)\n : // biome-ignore lint/suspicious/noExplicitAny: legacy path accepts the same shape\n await runDreamingSweepInternal(sweepArgs as any);\n return toDreamingSweepResult(result);\n },\n};\n\n// ---------------------------------------------------------------------------\n// Internal helpers — deduplicate patterns shared across peer + legacy paths.\n// ---------------------------------------------------------------------------\n\n/** Catalog shape shared between sdk-memory peer and local MEMORY_EMBEDDING_ADAPTERS. */\ninterface EmbeddingCatalog {\n [provider: string]: { create(opts: Record<string, unknown>): Promise<unknown> } | undefined;\n}\n\n/**\n * Resolve an embedding runtime from a provider catalog. Throws the canonical\n * \"Unknown embedding provider\" error when the provider is not in the catalog.\n */\nasync function resolveEmbedding(\n embeddingOpts: { provider: string; model?: string } | undefined,\n catalog: EmbeddingCatalog,\n): Promise<unknown> {\n if (embeddingOpts === undefined) return undefined;\n const adapter = catalog[embeddingOpts.provider];\n if (adapter === undefined) {\n throw new Error(\n `Unknown embedding provider \"${embeddingOpts.provider}\". Supported: ${Object.keys(catalog).join(\", \")}.`,\n );\n }\n return adapter.create(embeddingOpts.model !== undefined ? { model: embeddingOpts.model } : {});\n}\n\ninterface IndexOpenArgs {\n cwd: string;\n filePath?: string;\n embedding?: unknown;\n backend?: \"sqlite-vec\" | \"lance\";\n}\n\n/** Build the args object for IndexManager.open from user-facing options. */\nfunction buildIndexOpenArgs(opts: OpenMemoryIndexOptions, embedding: unknown): IndexOpenArgs {\n return {\n cwd: opts.cwd,\n ...(opts.filePath !== undefined ? { filePath: opts.filePath } : {}),\n ...(embedding !== undefined ? { embedding } : {}),\n ...(opts.backend !== undefined ? { backend: opts.backend } : {}),\n };\n}\n\ninterface DreamingSweepArgs {\n cwd: string;\n embedding: unknown;\n dedupThreshold?: number;\n clusterThreshold?: number;\n}\n\n/** Build args for runDreamingSweep from user-facing options + resolved embedding. */\nasync function buildDreamingSweepArgs(\n opts: DreamingSweepOptions,\n catalog: EmbeddingCatalog,\n): Promise<DreamingSweepArgs> {\n const runtime = await resolveEmbedding(opts.embedding, catalog);\n return {\n cwd: opts.cwd,\n embedding: runtime,\n ...(opts.dedupThreshold !== undefined ? { dedupThreshold: opts.dedupThreshold } : {}),\n ...(opts.clusterThreshold !== undefined ? { clusterThreshold: opts.clusterThreshold } : {}),\n };\n}\n\n/** Normalize a raw dreaming sweep result into the public DreamingSweepResult shape. */\nfunction toDreamingSweepResult(result: {\n status: string;\n factsBefore: number;\n factsAfter: number;\n duplicatesRemoved: number;\n clustersCreated: number;\n notesWritten: number;\n}): DreamingSweepResult {\n return {\n status: result.status as DreamingSweepResult[\"status\"],\n factsBefore: result.factsBefore,\n factsAfter: result.factsAfter,\n duplicatesRemoved: result.duplicatesRemoved,\n clustersCreated: result.clustersCreated,\n notesWritten: result.notesWritten,\n };\n}\n","/**\n * Runtime helpers for `MemoryAdapter` (T1.1, ADR D141).\n *\n * Kept separate from `types/memory-adapter.ts` so the types module\n * stays import-free of runtime code (dep-cruise rule\n * `types-dont-import-runtime`). Adapter authors call `mkMemoryId` to\n * construct a branded id and `extractRawId` to unwrap with cross-adapter\n * safety (EC-B).\n *\n * @public\n */\n\nimport { MemoryAdapterError } from \"./errors.js\";\nimport type { MemoryId } from \"./types/memory-adapter.js\";\n\n/**\n * Construct a branded `MemoryId` for an adapter. Embeds the adapter\n * identifier so `extractRawId` can reject ids minted by other adapters.\n *\n * @public\n */\nexport function mkMemoryId(adapterId: string, rawId: string): MemoryId {\n return `${adapterId}:${rawId}` as MemoryId;\n}\n\n/**\n * Extract the raw provider id from a `MemoryId`, enforcing that the\n * prefix matches `expectedAdapterId`. Throws `MemoryAdapterError(code:\n * \"invalid_input\")` on mismatch — prevents `mem0.delete(supermemoryId)`\n * from accidentally deleting unrelated data (EC-B).\n *\n * @public\n */\nexport function extractRawId(id: MemoryId, expectedAdapterId: string): string {\n const prefix = `${expectedAdapterId}:`;\n if (!id.startsWith(prefix)) {\n const sourcePrefix = id.split(\":\", 1)[0] ?? \"<malformed>\";\n throw new MemoryAdapterError(\n `MemoryId belongs to a different adapter (expected \"${expectedAdapterId}\", got \"${sourcePrefix}\")`,\n { adapterId: expectedAdapterId, code: \"invalid_input\" },\n );\n }\n return id.slice(prefix.length);\n}\n","import { existsSync, mkdirSync, renameSync, rmSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\nimport { ConfigurationError } from \"../../errors.js\";\nimport { redactSecrets } from \"../security/index.js\";\nimport { defaultIndexPath, openMemoryDb } from \"./index-db.js\";\nimport { LanceIndex, lanceStoragePath } from \"./lance-index.js\";\n\n/**\n * Migrate Memory.index from SQLite to LanceDB (ADR D44).\n *\n * EC-3 MUST FIX: validation uses NFC unicode normalization on both sides.\n *\n * @internal\n */\n\nexport interface MigrateOptions {\n cwd: string;\n dryRun?: boolean;\n batchSize?: number;\n /** Inject for tests; defaults to console.log. */\n logger?: (msg: string) => void;\n}\n\nexport interface MigrateResult {\n countSqlite: number;\n countLance: number;\n /** Set when validation succeeded (or dryRun); false on validation failure. */\n validated: boolean;\n /** Per-fact compare results (size = sample count, up to 10). */\n sampleComparisons: ReadonlyArray<{ id: string; match: boolean }>;\n /** Lance storage location (final, after migration). */\n lancePath: string;\n /** Was the migration committed (false for dry-run). */\n committed: boolean;\n}\n\ninterface SqliteFactRow {\n id: string;\n path: string;\n source: \"memory\" | \"sessions\" | \"wiki\";\n start_line: number;\n end_line: number;\n text: string;\n namespace?: string | null;\n scope?: string | null;\n user_id?: string | null;\n}\n\n/**\n * Read all facts from the SQLite memory index. Returns empty array if the\n * SQLite db file does not exist (workspace never used Memory).\n *\n * @internal\n */\nasync function readAllSqliteFacts(cwd: string): Promise<SqliteFactRow[]> {\n const dbPath = defaultIndexPath(cwd);\n if (!existsSync(dbPath)) return [];\n const db = await openMemoryDb({ filePath: dbPath });\n try {\n // SQLite schema: chunks table holds the facts. Schema may vary; we\n // probe column existence and fall back to safe defaults.\n const stmt = db.prepare(\"SELECT id, path, source, start_line, end_line, text FROM chunks\");\n const rows = stmt.all() as Array<{\n id: string;\n path: string;\n source: \"memory\" | \"sessions\" | \"wiki\";\n start_line: number;\n end_line: number;\n text: string;\n }>;\n return rows.map((r) => ({\n ...r,\n namespace: \"default\",\n scope: \"agent\",\n user_id: \"default\",\n }));\n } finally {\n db.close();\n }\n}\n\n/**\n * Compare two strings via NFC normalization (EC-3 MUST FIX). Required\n * because SQLite/Lance native bindings can normalize unicode differently\n * (NFC vs NFD), producing false negatives on facts with accents/emojis.\n *\n * @internal\n */\nfunction nfcEqual(a: string, b: string): boolean {\n return a.normalize(\"NFC\") === b.normalize(\"NFC\");\n}\n\n/**\n * Run the migration. Writes Lance to `<cwd>/.theokit/memory/lance-new/`\n * first, validates round-trip, then renames to `lance/` on success.\n * SQLite db is preserved (CLI prompts user to delete).\n *\n * @internal\n */\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: migration is a single transaction (read → write → validate → commit-or-rollback); splitting harms atomicity reasoning.\nexport async function migrateSqliteToLance(opts: MigrateOptions): Promise<MigrateResult> {\n const cwd = opts.cwd;\n const finalPath = lanceStoragePath(cwd);\n const newPath = join(cwd, \".theokit\", \"memory\", \"lance-new\");\n // T1.4 (ADR D68): wrap logger so any fact text containing secrets is\n // masked before reaching the destination (console or user-supplied sink).\n // Caller-supplied loggers cannot bypass — by design (D70).\n const rawLog = opts.logger ?? ((m: string) => console.log(m));\n const log = (m: string) => rawLog(redactSecrets(m));\n\n // EC: destination exists → error tipado.\n if (existsSync(finalPath)) {\n throw new ConfigurationError(\n `Destination already exists: ${finalPath}. Remove it manually (\\`rm -rf ${finalPath}\\`) and re-run.`,\n { code: \"migration_destination_exists\" },\n );\n }\n if (existsSync(newPath)) {\n // Leftover from a previous failed/interrupted migration. Safe to delete.\n log(`Removing stale ${newPath} from a previous run...`);\n rmSync(newPath, { recursive: true, force: true });\n }\n\n log(`Reading SQLite facts from ${cwd}/.theokit/memory/index.sqlite ...`);\n const sqliteFacts = await readAllSqliteFacts(cwd);\n log(`SQLite has ${sqliteFacts.length} facts.`);\n if (sqliteFacts.length === 0) {\n return {\n countSqlite: 0,\n countLance: 0,\n validated: true,\n sampleComparisons: [],\n lancePath: finalPath,\n committed: false,\n };\n }\n\n // Reuse the embedding runtime configured in the workspace? For v1.2 we\n // require the caller to pass embedding explicitly via env. The migration\n // path is documented as: \"set OPENAI_API_KEY (or similar) before running.\"\n // Here we ship a placeholder embedder that uses a deterministic\n // content-hash — sufficient for migration validation; consumers should\n // re-embed on first real query after migration if needed.\n const placeholderEmbedding = {\n id: \"migration-placeholder\",\n model: \"deterministic-hash\",\n dimension: 8,\n embed: async (texts: ReadonlyArray<string>) => {\n // Simple deterministic hash → 8-dim vector (migration validation only).\n return texts.map((t) => {\n const arr = new Array(8).fill(0);\n for (let i = 0; i < t.length; i += 1) {\n arr[i % 8] += t.charCodeAt(i);\n }\n return arr.map((x) => x / 1000);\n });\n },\n stats: () => ({ cacheHits: 0, cacheMisses: 0, httpCalls: 0, retries: 0 }),\n };\n\n mkdirSync(newPath, { recursive: true });\n log(`Writing Lance index to ${newPath} ...`);\n\n const lance = await LanceIndex.open({\n cwd,\n embedding: placeholderEmbedding,\n storagePath: newPath,\n });\n\n const batchSize = opts.batchSize ?? 100;\n for (let i = 0; i < sqliteFacts.length; i += batchSize) {\n const batch = sqliteFacts.slice(i, i + batchSize).map((f) => ({\n id: f.id,\n text: f.text,\n source: f.source,\n namespace: f.namespace ?? \"default\",\n scope: f.scope ?? \"agent\",\n user_id: f.user_id ?? \"default\",\n timestamp: 0,\n }));\n await lance.addFacts(batch);\n log(` Migrated ${Math.min(i + batchSize, sqliteFacts.length)}/${sqliteFacts.length}`);\n }\n\n // Validation: count + sample compare (10 random) with NFC normalization.\n const lanceCount = await lance.countFacts(\"default\");\n log(`Lance has ${lanceCount} facts (expected ${sqliteFacts.length}).`);\n\n const sampleSize = Math.min(10, sqliteFacts.length);\n const sampleComparisons: { id: string; match: boolean }[] = [];\n for (let i = 0; i < sampleSize; i += 1) {\n const sqliteFact = sqliteFacts[Math.floor((i * sqliteFacts.length) / sampleSize)];\n if (sqliteFact === undefined) continue;\n // Search Lance for this fact's text — best-effort round-trip.\n const hits = await lance.search(sqliteFact.text, {\n namespace: sqliteFact.namespace ?? \"default\",\n limit: 1,\n });\n // EC-3: compare with NFC normalization.\n const hit = hits[0];\n const match = hit !== undefined && nfcEqual(hit.text, sqliteFact.text);\n sampleComparisons.push({ id: sqliteFact.id, match });\n }\n\n const allMatch = sampleComparisons.every((c) => c.match);\n const countMatch = lanceCount === sqliteFacts.length;\n const validated = allMatch && countMatch;\n\n await lance.close();\n\n if (opts.dryRun === true) {\n log(\"Dry-run mode — discarding Lance staging dir.\");\n rmSync(newPath, { recursive: true, force: true });\n return {\n countSqlite: sqliteFacts.length,\n countLance: lanceCount,\n validated,\n sampleComparisons,\n lancePath: finalPath,\n committed: false,\n };\n }\n\n if (!validated) {\n log(\"Validation FAILED — leaving SQLite intact, removing Lance staging dir.\");\n rmSync(newPath, { recursive: true, force: true });\n return {\n countSqlite: sqliteFacts.length,\n countLance: lanceCount,\n validated: false,\n sampleComparisons,\n lancePath: finalPath,\n committed: false,\n };\n }\n\n // Atomic commit via rename.\n renameSync(newPath, finalPath);\n log(`Migration committed to ${finalPath}.`);\n return {\n countSqlite: sqliteFacts.length,\n countLance: lanceCount,\n validated: true,\n sampleComparisons,\n lancePath: finalPath,\n committed: true,\n };\n}\n","// Public API for memory migration (ADR D44).\n//\n// This file is the public re-export wrapper for the internal implementation.\n// Declaring types here (rather than re-exporting from internal/) avoids a\n// known rollup-dts resolution quirk with internal/ paths.\n//\n// Iter 78 (SDK 2.0 Phase 4 Stage 4 #3): routes through\n// `@theokit/sdk-memory` when the peer is installed. Falls back to\n// the legacy `internal/memory/migrate-sqlite-to-lance.js` when the\n// peer is absent. Both paths share byte-equivalent runtime behavior\n// because sdk-memory's copy is the iter 71 source-move (atomic\n// rename commit, NFC sample compare, D70 redaction logger wrap).\n\nimport { migrateSqliteToLance as _migrateSqliteToLance } from \"./internal/memory/migrate-sqlite-to-lance.js\";\nimport { tryLoadSdkMemoryPeer } from \"./internal/memory/sdk-memory-peer-loader.js\";\n\n/**\n * Options for {@link migrateSqliteToLance}.\n *\n * @public\n */\nexport interface MigrateOptions {\n cwd: string;\n dryRun?: boolean;\n batchSize?: number;\n logger?: (msg: string) => void;\n}\n\n/**\n * Outcome of {@link migrateSqliteToLance}.\n *\n * @public\n */\nexport interface MigrateResult {\n countSqlite: number;\n countLance: number;\n validated: boolean;\n sampleComparisons: ReadonlyArray<{ id: string; match: boolean }>;\n lancePath: string;\n committed: boolean;\n}\n\n/**\n * Migrate the Memory index from SQLite to LanceDB. ADR D44.\n *\n * @public\n */\nexport async function migrateSqliteToLance(options: MigrateOptions): Promise<MigrateResult> {\n // SDK 2.0 Phase 4 Stage 4 (iter 78): peer routing.\n const peer = await tryLoadSdkMemoryPeer();\n if (peer !== null) {\n return peer.migrateSqliteToLance(options);\n }\n return _migrateSqliteToLance(options);\n}\n","/**\n * `PermissionEngine` — first-match permission rules for tool invocations.\n *\n * Evaluates a tool name (and optional arguments, #55) against an ordered list\n * of rules. First matching rule wins; when no rule matches the `defaultAction`\n * is returned. #55 — the default is now `\"ask\"` (FAIL-CLOSED): a permission\n * engine that cannot positively allow must not silently allow. Opt back into\n * the previous fail-open behavior with `{ defaultAction: \"allow\" }`.\n */\n\nexport type PermissionAction = \"allow\" | \"deny\" | \"ask\";\n\n/**\n * SE1 — a per-run permission MODE that adjusts the rule-engine verdict globally.\n * A PURE post-processor of the verdict (no tool-safety metadata needed, so it fits\n * a bring-your-own-tools runtime). Grounded in a peer project (plan agent = deny-all,\n * `dangerously-skip-permissions`) + Codex (`AskForApproval`: `OnRequest` default,\n * `Never`, `UnlessTrusted`). See {@link applyMode} for the exact table.\n *\n * - `default` — verdict as-is (rules decide; unmatched ⇒ `ask`, fail-closed).\n * - `plan` — read-only: `allow` rules pass, everything else ⇒ `deny` (mutations blocked).\n * NOTE: `plan` gates on the resolved verdict, so an engine configured with\n * `{ defaultAction: \"allow\" }` still yields `allow` for UNMATCHED calls under\n * `plan` — pair `plan` with the default fail-closed engine (`defaultAction: \"ask\"`)\n * for full read-only behavior.\n * - `acceptEdits` — auto-approve the UNMATCHED verdict, but STILL honor an explicit\n * `ask` rule (a caller gates a risky tool with an ask rule). Codex `UnlessTrusted`.\n * - `bypass` (alias `bypassPermissions`, the Anthropic-exact name) — everything ⇒\n * `allow` EXCEPT an explicit `deny` rule. Never asks. a peer project\n * `dangerously-skip-permissions` / Codex `Never` / Anthropic `bypassPermissions`.\n */\nexport type PermissionMode = \"default\" | \"plan\" | \"acceptEdits\" | \"bypass\" | \"bypassPermissions\";\n\n/**\n * SE1 — apply a {@link PermissionMode} to a rule-engine verdict. Pure.\n *\n * `explicit` is `true` when the verdict came from a rule that matched by name (and\n * args), `false` when it is the fail-closed default for an unmatched call. The flag\n * is load-bearing for `acceptEdits`, which auto-approves the unmatched default but\n * keeps honoring an explicit `ask` rule (unlike `bypass`, which allows even that).\n *\n * INVARIANT (both a peer project + Codex): an explicit `deny` is immune to EVERY\n * auto-approve mode — `bypass`/`acceptEdits` never un-deny.\n */\nexport function applyMode(\n verdict: PermissionAction,\n mode: PermissionMode,\n explicit: boolean,\n): PermissionAction {\n // (a) explicit deny is terminal under every mode — fail-closed.\n if (verdict === \"deny\") return \"deny\";\n switch (mode) {\n case \"default\":\n return verdict;\n case \"plan\":\n // read-only: only allow rules pass; ask + unmatched ⇒ deny.\n return verdict === \"allow\" ? \"allow\" : \"deny\";\n case \"acceptEdits\":\n // (b) auto-approve the unmatched default; honor an explicit ask rule.\n if (verdict === \"ask\") return explicit ? \"ask\" : \"allow\";\n return verdict; // allow stays allow\n case \"bypass\":\n case \"bypassPermissions\":\n // everything that survived the deny check ⇒ allow (never asks).\n return \"allow\";\n }\n}\n\n/**\n * #55 — an argument matcher. A rule with `args` gates on the tool's argument\n * VALUES, not just its name: an exact string, a RegExp (tested against the\n * stringified value), or a predicate. Every declared arg must match for the\n * rule to apply — so `{ tool: \"shell\", args: { command: /rm\\s+-rf/ } }` denies\n * a destructive shell call while leaving `ls` to fall through.\n */\nexport type ArgMatcher = string | RegExp | ((value: unknown) => boolean);\n\nexport interface PermissionRule {\n /** Tool name (exact string) or pattern (RegExp). */\n tool: string | RegExp;\n /**\n * #55 — optional per-argument matchers. When present, the rule matches only\n * if the tool name matches AND every declared arg predicate matches the\n * corresponding call argument. A missing/undefined arg fails its predicate\n * (the rule does not match) — never throws.\n */\n args?: Record<string, ArgMatcher>;\n /** Action to take when rule matches. */\n action: PermissionAction;\n}\n\n/** Options for {@link PermissionEngine}. */\nexport interface PermissionEngineOptions {\n /**\n * Action when no rule matches. #55 — default is now `\"ask\"` (fail-closed): a\n * permission engine that cannot positively allow must not silently allow.\n * Pass `\"allow\"` to restore the previous fail-open behavior.\n */\n readonly defaultAction?: PermissionAction;\n}\n\nfunction argMatches(matcher: ArgMatcher, value: unknown): boolean {\n if (typeof matcher === \"function\") return matcher(value);\n if (value === undefined) return false; // missing arg never matches a declared predicate\n if (matcher instanceof RegExp) {\n // Reset `lastIndex` so a global/sticky-flag regex (`/x/g`) does not carry\n // state across `.test()` calls — otherwise the same rule would alternate\n // verdicts on identical repeated calls (non-deterministic authorization).\n matcher.lastIndex = 0;\n return matcher.test(String(value));\n }\n return matcher === value;\n}\n\nexport class PermissionEngine {\n private readonly defaultAction: PermissionAction;\n\n constructor(\n private readonly rules: PermissionRule[],\n options: PermissionEngineOptions = {},\n ) {\n // #55 — fail-closed by default.\n this.defaultAction = options.defaultAction ?? \"ask\";\n }\n\n /**\n * Evaluate a tool name (and optional arguments) against the rules. First\n * match wins; falls back to the configured `defaultAction` (default `\"ask\"`,\n * fail-closed) when no rule matches. #55 — a rule with `args` gates on the\n * argument values, so the same tool name can resolve to different actions\n * depending on what it is asked to do.\n */\n evaluate(\n toolName: string,\n args?: Record<string, unknown>,\n mode: PermissionMode = \"default\",\n ): PermissionAction {\n for (const rule of this.rules) {\n const nameMatches =\n typeof rule.tool === \"string\" ? rule.tool === toolName : rule.tool.test(toolName);\n if (!nameMatches) continue;\n if (rule.args !== undefined && !this.#argsMatch(rule.args, args)) continue;\n // SE1 — a matched rule is an EXPLICIT verdict; apply the mode with explicit=true.\n return applyMode(rule.action, mode, true);\n }\n // SE1 — no rule matched: the default is NOT explicit (explicit=false), so\n // `acceptEdits` auto-approves it while still honoring explicit `ask` rules above.\n return applyMode(this.defaultAction, mode, false);\n }\n\n #argsMatch(\n matchers: Record<string, ArgMatcher>,\n args: Record<string, unknown> | undefined,\n ): boolean {\n const call = args ?? {};\n for (const [key, matcher] of Object.entries(matchers)) {\n if (!argMatches(matcher, call[key])) return false;\n }\n return true;\n }\n}\n","/**\n * M7-5 — `createPermissionPlugin`: wire a {@link PermissionEngine} into the\n * `definePlugin` `pre_tool_call` veto seam. This is the canonical exemplar that\n * gives `PermissionEngine` a real caller (it was previously exported-but-unwired):\n * on each tool call the engine's verdict maps to the veto contract —\n * `\"deny\"` -> block, `\"ask\"` -> the caller's `onAsk` resolver (or block, fail-closed),\n * `\"allow\"` -> pass.\n *\n * @public\n */\n\nimport { definePlugin } from \"./internal/plugins/index.js\";\nimport type { Plugin, PreToolCallDecision } from \"./internal/plugins/types.js\";\nimport type { PermissionEngine, PermissionMode } from \"./permission-engine.js\";\n\n/**\n * SE1 — context passed to the {@link PermissionGate}. Intentionally minimal for\n * SE1; `agentId`/`runId` (for audit logging) are a documented follow-up — they are\n * available on the raw `pre_tool_call` context and can be threaded in a later slice.\n */\nexport interface PermissionGateContext {\n /** The tool being gated. */\n readonly toolName: string;\n /** The active permission mode for this run. */\n readonly mode: PermissionMode;\n}\n\n/**\n * SE1 — the resolution of an `\"ask\"` verdict by the host gate. Fail-closed: an\n * absent gate, a throwing gate, and a `\"deny\"` decision all block. Arg rewrite\n * (`updatedInput`) is intentionally NOT supported yet — the `pre_tool_call` seam\n * is veto-only (`{ block, message }`); a future enhancement can extend it.\n */\nexport type PermissionGateDecision =\n | { readonly behavior: \"allow\" }\n | { readonly behavior: \"deny\"; readonly message?: string };\n\n/**\n * SE1 — the enriched `canUseTool` gate (the Anthropic-parity shape). Invoked ONLY\n * on an `\"ask\"` verdict, it receives the tool name, its input args, and the run\n * {@link PermissionGateContext}, and resolves to allow/deny. May be async (a real\n * gate can prompt a human — the `pre_tool_call` seam awaits it).\n */\nexport type PermissionGate = (\n toolName: string,\n input: Record<string, unknown>,\n ctx: PermissionGateContext,\n) => PermissionGateDecision | Promise<PermissionGateDecision>;\n\n/** Options for {@link createPermissionPlugin}. */\nexport interface PermissionPluginOptions {\n /** Plugin name (default `\"permission-engine\"`). */\n readonly name?: string;\n /**\n * SE1 — the per-run {@link PermissionMode}. Threaded into `engine.evaluate`, so\n * `bypass` auto-allows the ask verdict (gate never consulted), `plan` blocks\n * mutations, etc. An explicit `deny` rule is immune to every mode. Default\n * `\"default\"` (rules decide; unmatched ⇒ fail-closed ask).\n */\n readonly mode?: PermissionMode;\n /**\n * SE1 — the enriched gate for the `\"ask\"` verdict. Preferred over {@link onAsk}.\n * Absent gate on an `ask` verdict ⇒ fail-closed block.\n */\n readonly canUseTool?: PermissionGate;\n /**\n * @deprecated since SE1 — use {@link canUseTool}, which receives `(toolName,\n * input, ctx)` and returns a typed decision. Honored only when `canUseTool` is\n * absent. Returns a veto (`{block,message}`) to deny or `undefined` to allow.\n */\n readonly onAsk?: (toolName: string) => PreToolCallDecision | undefined;\n}\n\n/**\n * Resolve an `\"ask\"` verdict via the gate (fail-closed). Extracted from the\n * register handler to keep its cognitive complexity in budget. Prefers\n * `canUseTool`; falls back to the deprecated `onAsk`; blocks when neither exists.\n */\nasync function resolveAsk(\n opts: PermissionPluginOptions,\n name: string,\n args: Record<string, unknown>,\n mode: PermissionMode,\n): Promise<PreToolCallDecision | undefined> {\n if (opts.canUseTool !== undefined) {\n let decision: PermissionGateDecision;\n try {\n decision = await opts.canUseTool(name, args, { toolName: name, mode });\n } catch {\n // Fail-closed: a gate that throws must not silently allow.\n return { block: true, message: `permission gate error (fail-closed): ${name}` };\n }\n // Fail-CLOSED (allow-list): only an explicit `allow` passes. Any other value\n // — `deny`, a malformed/undefined return from a JS consumer, a wrong-cased\n // behavior — blocks, so the gate can never silently allow on a bad decision.\n return decision?.behavior === \"allow\"\n ? undefined\n : { block: true, message: decision?.message ?? `denied: ${name}` };\n }\n // Deprecated back-compat: honor onAsk (undefined = allow). Fail-closed (block)\n // only when NEITHER a gate nor onAsk was supplied.\n return opts.onAsk ? opts.onAsk(name) : { block: true, message: `requires approval: ${name}` };\n}\n\n/**\n * Build a `general` plugin that vetoes tool calls per the engine's verdict, under\n * the configured {@link PermissionMode}, resolving `ask` via the {@link canUseTool}\n * gate. Register it on an agent's plugin manager (same as the ACP permission plugin).\n */\nfunction createPermissionPlugin(\n engine: PermissionEngine,\n opts: PermissionPluginOptions = {},\n): Plugin {\n return definePlugin({\n name: opts.name ?? \"permission-engine\",\n version: \"1.0.0\",\n kind: \"general\",\n register(ctx) {\n ctx.on(\"pre_tool_call\", async (rawCtx) => {\n const { name, args, permissionMode } = rawCtx as {\n name: string;\n args: Record<string, unknown>;\n permissionMode?: PermissionMode;\n };\n // SE1 — precedence: the RUN's mode (threaded from `SendOptions`/`AgentOptions`\n // via the pre_tool_call context) wins over the plugin's construction-time\n // default. `default` when neither is set.\n const mode: PermissionMode = permissionMode ?? opts.mode ?? \"default\";\n // #55 — args gate rules on the command/args, not just the tool name.\n // SE1 — the mode adjusts the verdict (bypass/plan/acceptEdits); an explicit\n // `deny` rule is immune to every auto-approve mode.\n const action = engine.evaluate(name, args, mode);\n if (action === \"deny\") {\n return { block: true, message: `denied by permission engine: ${name}` };\n }\n if (action === \"ask\") return resolveAsk(opts, name, args, mode);\n return undefined;\n });\n },\n });\n}\n\n/** SE36 — `PermissionPlugin.create` replaces `createPermissionPlugin` (ADR 0015). @public */\nexport class PermissionPlugin {\n private constructor() {}\n static create(engine: PermissionEngine, opts: PermissionPluginOptions = {}): Plugin {\n return createPermissionPlugin(engine, opts);\n }\n}\n","/**\n * M23 — schema normalizer: convert a schema from any supported provider to the internal JSON Schema\n * the synthetic `output` tool uses. Zod stays the DEFAULT and the documented recommendation; this is\n * a THIN adapter with no deep coupling (ADR-0041). Supported inputs:\n *\n * - **Zod** (default) — via the SDK's native `z.toJSONSchema` path.\n * - **JSON Schema** — a plain object with `type`/`properties` (or `$schema`) → passthrough.\n * - **ArkType** — any schema exposing `.toJsonSchema()` (ArkType 2.0) → called directly.\n * - **Valibot** — via the OPTIONAL `@valibot/to-json-schema` peer (dynamic import; a clear\n * error tells the user to install it — no hard dependency).\n *\n * Parse-failure handling stays uniform: the normalized JSON Schema drives the same synthetic-tool\n * validation + M14 `errorStrategy` regardless of the source library.\n */\nimport { toJsonSchema } from \"./internal/zod/to-json-schema.js\";\n\n/** The internal JSON-Schema shape the synthetic `output` tool consumes. */\nexport type NormalizedJsonSchema = Record<string, unknown>;\n\n/** A plain JSON Schema object already in the target shape. */\nfunction isJsonSchemaObject(s: unknown): s is NormalizedJsonSchema {\n if (typeof s !== \"object\" || s === null) return false;\n const o = s as Record<string, unknown>;\n if (\"$schema\" in o) return true;\n return o.type === \"object\" && typeof o.properties === \"object\" && o.properties !== null;\n}\n\n/** ArkType (and any lib) exposing its own `.toJsonSchema()`. */\nfunction hasToJsonSchemaMethod(s: unknown): s is { toJsonSchema: () => NormalizedJsonSchema } {\n return (\n typeof s === \"object\" &&\n s !== null &&\n typeof (s as { toJsonSchema?: unknown }).toJsonSchema === \"function\"\n );\n}\n\n/** A Zod schema — carries `safeParse` plus the Zod internals (`_def` v3 / `def` v4). */\nfunction isZodSchema(s: unknown): boolean {\n if (typeof s !== \"object\" || s === null) return false;\n const o = s as Record<string, unknown>;\n return typeof o.safeParse === \"function\" && (\"_def\" in o || \"def\" in o);\n}\n\n/** A Valibot schema — `{ kind: 'schema', type, ... }` (no built-in JSON-Schema method). */\nfunction isValibotSchema(s: unknown): boolean {\n if (typeof s !== \"object\" || s === null) return false;\n const o = s as Record<string, unknown>;\n return o.kind === \"schema\" && \"type\" in o && typeof o.toJsonSchema !== \"function\";\n}\n\n/**\n * Normalize any supported schema to the internal JSON Schema. Async because the Valibot path\n * dynamically imports its optional converter. Throws a clear, typed-message error for an unsupported\n * schema or a missing Valibot peer (error-handling.md).\n */\nexport async function normalizeSchema(schema: unknown): Promise<NormalizedJsonSchema> {\n // JSON Schema — passthrough (already the target shape).\n if (isJsonSchemaObject(schema)) return schema;\n\n // Valibot — needs its own converter (optional peer). Import via a NON-literal specifier so TS does\n // not try to statically resolve the (uninstalled) optional peer at build time.\n if (isValibotSchema(schema)) {\n const specifier = \"@valibot/to-json-schema\";\n try {\n const mod = (await import(specifier)) as {\n toJsonSchema: (s: unknown) => NormalizedJsonSchema;\n };\n return mod.toJsonSchema(schema);\n } catch (err) {\n const missing =\n err instanceof Error && /Cannot find|Cannot resolve|ERR_MODULE_NOT_FOUND/.test(err.message);\n if (missing) {\n throw new Error(\n \"normalizeSchema: a Valibot schema requires the optional '@valibot/to-json-schema' package. \" +\n \"Install it, or use a Zod schema (the default recommendation).\",\n );\n }\n throw err;\n }\n }\n\n // Zod — the default path.\n if (isZodSchema(schema)) {\n return toJsonSchema(schema as never, { unrepresentable: \"any\" }) as NormalizedJsonSchema;\n }\n\n // ArkType (or any lib exposing `.toJsonSchema()`).\n if (hasToJsonSchemaMethod(schema)) return schema.toJsonSchema();\n\n throw new Error(\n \"normalizeSchema: unsupported schema. Supported: Zod (default), JSON Schema, ArkType (.toJsonSchema()), \" +\n \"Valibot (with @valibot/to-json-schema).\",\n );\n}\n","/**\n * Public security namespace (T2.1, ADR D68).\n *\n * Two entry points:\n *\n * - `Security.redact(text, opts?)` — apply the canonical redactor to\n * arbitrary text. Useful when a consumer app (or example) writes its\n * own logs / metrics / paste-share artifacts that the SDK's wired\n * sinks (error metadata, telemetry, transcript, migration) don't\n * cover.\n * - `Security.addPattern(re)` — register a custom credential pattern\n * on top of the 12 builtins (OpenAI, Anthropic, GitHub PAT classic +\n * fine, GitLab, AWS, Google, Slack, Sentry, Stripe live + restricted)\n * plus the parametric `key=value` + `Bearer <token>` matchers.\n *\n * Redaction is ON by default. Disable with `THEOKIT_REDACT_SECRETS=false`\n * (a warning is emitted on stderr so the operator knows the SDK process\n * is vulnerable). The env var is snapshotted at module init — runtime\n * mutation cannot disable it, defending against prompt injection that\n * tries to flip the flag mid-run.\n */\n\nimport {\n addPattern as _addPattern,\n redactSecrets as _redactSecrets,\n} from \"./internal/security/index.js\";\n\nexport class Security {\n private constructor() {}\n\n /**\n * Redact known credential patterns from `text` and return the masked\n * string. Use this at any consumer output boundary the SDK does not\n * directly own (custom stdout loggers, app-level metrics, debug-share\n * artifacts, etc.).\n *\n * Coerces non-strings (objects via JSON.stringify, null/undefined → \"\").\n * Two-bucket masking: tokens shorter than 18 chars → `***`; longer\n * tokens preserve `prefix...suffix` for debuggability without revealing\n * the secret middle.\n *\n * @param text - The value to redact. Strings, objects, primitives all OK.\n * @param opts.codeFile - When `true`, skips the parametric `key=value`\n * matcher so file content like `.env.example` placeholders is left\n * intact. Built-in pattern matches still apply.\n *\n * @example\n * console.log(`[bot] received: ${Security.redact(userText)}`);\n * // → \"[bot] received: please remember sk-abc...xyz1\"\n */\n static redact(text: unknown, opts?: { codeFile?: boolean }): string {\n return _redactSecrets(text, opts);\n }\n\n /**\n * Register a custom redaction pattern. Additive — built-in patterns\n * (OpenAI, Anthropic, GitHub PAT, AWS, etc.) cannot be removed.\n *\n * @param re - RegExp with `/g` flag. Throws if `/g` is missing\n * (without /g, only first match is replaced and the rest\n * leaks).\n *\n * Process-global mutable state. The SDK is designed for single-tenant\n * processes (Theo PaaS user runtime, local CLI). Multi-tenant\n * deployments running multiple SDK consumers in the same Node process\n * share this list — patterns added by tenant A apply to tenant B's\n * redactions. Acceptable for v1; future isolate-aware refactor would\n * thread patterns through a context if needed.\n *\n * @example\n * Security.addPattern(/MYORG-[A-Z0-9]{32}/g);\n * // → text containing \"MYORG-AAAA...AAAA\" now masks like a builtin.\n */\n static addPattern(re: RegExp): void {\n _addPattern(re);\n }\n}\n","/**\n * M3 #62 — scoped session state.\n *\n * A conversation id can be namespaced by SCOPE so a consumer keeps app-durable,\n * user-durable, and ephemeral (temp) session data separated in the same store:\n *\n * - `app:` — durable state shared across users (app-level memory).\n * - `user:` — durable state for one user.\n * - `temp:` — ephemeral state a consumer prunes on logout / session end.\n *\n * The scope is a prefix on the conversation id (`\"<scope>__<id>\"`). The `__`\n * separator is path-safe (unlike `:`, which the identifier guard rejects), so a\n * host can partition sessions by scope over the native transcript store.\n *\n * @public\n */\n\n/** M3 #62 — session state scope. */\nexport type SessionScope = \"app\" | \"user\" | \"temp\";\n\n/** M3 #62 — build a scope-namespaced conversation id (`\"<scope>__<id>\"`). */\nexport function scopedConversationId(scope: SessionScope, id: string): string {\n return `${scope}__${id}`;\n}\n\n/** M3 #62 — the id prefix (`\"<scope>__\"`) used to match a scope's conversations. */\nexport function sessionScopePrefix(scope: SessionScope): string {\n return `${scope}__`;\n}\n","/**\n * `createSquad` — a sequential team of agents.\n *\n * A Squad is a thin convenience that COMPOSES `Workflow` + `agentStep` — it\n * adds NO new orchestration logic. Agents run in array order; each agent's\n * output is threaded into the next agent's prompt. For branching/parallel/\n * foreach teams use `Workflow` directly; for manager→worker delegation use\n * subagents or `@theokit/sdk-handoff`.\n *\n * Mirrors the `createAgentFactory` composition-LEGO precedent (a factory over\n * existing primitives, not a new subsystem).\n *\n * @public\n */\n\nimport { ConfigurationError } from \"./errors.js\";\nimport type { AgentDefinition, SDKAgent } from \"./types/agent.js\";\nimport type { StepResult } from \"./types/workflow.js\";\nimport { agentStep, Workflow } from \"./workflow.js\";\n\n/**\n * Options for {@link createSquad}.\n *\n * @public\n */\nexport interface SquadOptions {\n /**\n * Agents run in array order (sequential pipeline). Must be non-empty.\n *\n * M81 — accepts an `AgentDefinition` (plain data) as well as a constructed `SDKAgent`. Building a\n * team used to force the caller to materialize every member by hand first: resolve the credential,\n * assemble the options, call `Agent.create`, await. That is precisely the work this milestone moves\n * into the framework elsewhere, so leaving it here would be inconsistent — and with\n * `discoverSubagents` now public (`@theokit/sdk/subagents-loader`), the data that describes an\n * agent is reachable, which closes the loop: discover → build a team, with no manual step between.\n *\n * Mixing both forms in one list is supported on purpose: a real team usually has members from\n * different origins.\n */\n agents: ReadonlyArray<SDKAgent | AgentDefinition>;\n /**\n * Orchestration process. Only `\"sequential\"` is supported (the default).\n * `\"hierarchical\"` is accepted by the type but rejected at runtime with\n * guidance — use subagents or `@theokit/sdk-handoff` for manager→worker\n * delegation (those already cover it).\n */\n process?: \"sequential\" | \"hierarchical\";\n /** Optional squad name (surfaced on the underlying workflow). Default `\"squad\"`. */\n name?: string;\n}\n\n/**\n * Result of a {@link Squad.run}. `result` is the final (last agent's) output;\n * `steps` is the per-agent trace from the underlying workflow run.\n *\n * @public\n */\nexport interface SquadRun {\n readonly result: unknown;\n readonly status: \"running\" | \"completed\" | \"failed\" | \"suspended\" | \"cancelled\";\n readonly steps: ReadonlyArray<StepResult>;\n}\n\n/**\n * A sequential agent team produced by {@link createSquad}.\n *\n * @public\n */\nexport interface Squad {\n /** Run the team over `input`, threading each agent's output to the next. */\n run(input: unknown): Promise<SquadRun>;\n}\n\n/**\n * Build a sequential agent team. The returned {@link Squad} composes a\n * `Workflow` of `agentStep`s under the hood — all orchestration is delegated\n * to the workflow engine.\n *\n * @public\n */\n/**\n * M81 — an `SDKAgent` is recognised by having `send`; an `AgentDefinition` is plain data.\n *\n * Structural, not `instanceof`: the definition crosses package boundaries as data (that is the whole\n * interop contract the layer relies on), so an identity check would fail exactly when two copies of\n * the SDK are loaded — the failure mode M79 measured.\n */\nfunction ehAgenteConstruido(m: SDKAgent | AgentDefinition): m is SDKAgent {\n return typeof (m as SDKAgent).send === \"function\";\n}\n\n/**\n * M81 — transforma um `AgentDefinition` num agente executável.\n *\n * Import dinâmico do `Agent` porque `squad.ts` é consumido por caminhos que não querem arrastar o\n * agente inteiro só para declarar um time; o custo só é pago por quem de fato passa dado puro.\n */\nasync function materializar(def: AgentDefinition, indice: number): Promise<SDKAgent> {\n const { Agent } = await import(\"./agent.js\");\n return Agent.create({\n // `AgentDefinition.model` admite o sentinel `'inherit'`, que não é um id de modelo. Herdar\n // aqui significa \"não declare nada e deixe o default valer\" — passar o literal adiante criaria\n // um agente pedindo um modelo chamado `inherit`.\n ...(def.model !== undefined && def.model !== \"inherit\" ? { model: def.model } : {}),\n ...(def.prompt !== undefined ? { systemPrompt: def.prompt } : {}),\n agentId: `squad-member-${String(indice)}`,\n local: {},\n });\n}\n\nfunction createSquad(options: SquadOptions): Squad {\n const { agents } = options;\n if (!Array.isArray(agents) || agents.length === 0) {\n throw new ConfigurationError(\"createSquad requires a non-empty `agents` array\", {\n code: \"invalid_squad\",\n });\n }\n if (options.process !== undefined && options.process !== \"sequential\") {\n throw new ConfigurationError(\n `createSquad only supports process \"sequential\"; for manager→worker delegation use subagents or @theokit/sdk-handoff`,\n { code: \"squad_process_unsupported\" },\n );\n }\n\n return {\n run: async (input: unknown): Promise<SquadRun> => {\n const run = await (await montarPipeline(agents, options.name)).run(input);\n return { result: run.output, status: run.status, steps: run.stepResults };\n },\n };\n}\n\n/**\n * Monta o pipeline sequencial, materializando os membros que ainda são dado puro.\n *\n * Extraído de `run` porque o gate de complexidade cognitiva barrou a função combinada — e porque\n * \"montar o pipeline\" e \"executar e traduzir o resultado\" são duas responsabilidades que só estavam\n * juntas por proximidade.\n */\nasync function montarPipeline(\n agents: ReadonlyArray<SDKAgent | AgentDefinition>,\n nome: string | undefined,\n): Promise<ReturnType<ReturnType<typeof Workflow.create>[\"commit\"]>> {\n // Compose Workflow + agentStep — identity threading: each agent's prompt is the previous agent's\n // output (the run input for the first agent).\n let builder = Workflow.create({ name: nome ?? \"squad\" });\n for (let i = 0; i < agents.length; i++) {\n const membro = agents[i];\n if (membro === undefined) continue;\n // M81 — materializa na hora de RODAR, não na construção: `Squad.create` é síncrono e um\n // `AgentDefinition` só vira agente com um `await`. Adiar até aqui mantém a construção barata e\n // evita que montar um time exija credencial resolvida antes da primeira execução.\n const agent = ehAgenteConstruido(membro) ? membro : await materializar(membro, i);\n // SE3 — the first agent receives the human input (no peer origin); every subsequent agent\n // receives its predecessor's output, so its turn carries `{ kind: \"peer\", from: \"agent-<i-1>\" }`.\n const opts = i > 0 ? { origin: { kind: \"peer\" as const, from: `agent-${i - 1}` } } : undefined;\n builder = builder.then(agentStep(`agent-${i}`, agent, (prev) => String(prev), opts));\n }\n return builder.commit();\n}\n\n/** SE36 — `Squad.create` replaces `createSquad` (ADR 0015). Merges with the `Squad` interface. @public */\n// biome-ignore lint/suspicious/noUnsafeDeclarationMerging: SE36 namespace class merges with the `Squad` instance interface (ADR 0015) — intentional; `create()` returns the interface type, `new` is blocked by the private ctor.\nexport class Squad {\n private constructor() {}\n static create(options: SquadOptions): Squad {\n return createSquad(options);\n }\n}\n","/**\n * `Task` — observable async work registry (Adoption Roadmap gap #2,\n * ADRs D361-D374).\n *\n * Static facade delegating to the in-process `TaskRegistry` singleton.\n * The lifecycle of any task is the 5-state machine `queued | running |\n * finished | error | cancelled` (D362). Wrapping `Agent.send` /\n * `Agent.batch` / `Workflow.run` / `Cron` fires is opt-in via the\n * `{ task: true }` option on each (D363).\n *\n * @public\n */\n\nimport {\n cancel as registryCancel,\n configure as registryConfigure,\n get as registryGet,\n list as registryList,\n submit as registrySubmit,\n subscribe as registrySubscribe,\n} from \"./internal/task/registry.js\";\nimport type {\n TaskCancelResult,\n TaskEvent,\n TaskFilter,\n TaskHandle,\n TaskKind,\n TaskStoreOptions,\n TaskSubmitOptions,\n} from \"./types/task.js\";\n\nexport interface TaskWorkContext {\n readonly signal: AbortSignal;\n emit(payload: unknown): void;\n}\n\nexport type TaskWorkFn<T> = (ctx: TaskWorkContext) => Promise<T> | T;\n\n/**\n * Registry-level configuration. May only be applied BEFORE the first\n * `Task.submit` of the process — see EC-13. Subsequent calls emit a\n * single stderr line and become no-ops.\n */\nexport interface TaskConfigureOptions {\n readonly store?: TaskStoreOptions;\n readonly maxConcurrent?: number;\n readonly retentionMs?: number;\n}\n\nexport class Task {\n // D361 — static class with private constructor.\n private constructor() {\n throw new Error(\"Task is static; do not instantiate\");\n }\n\n /**\n * Configure the registry. **Must be called before the first `submit`**\n * (EC-13). Available knobs: pluggable store (D364), concurrency cap\n * (D369), and retention (D373).\n */\n static configure(opts: TaskConfigureOptions): void {\n registryConfigure(opts);\n }\n\n /**\n * Submit a unit of asynchronous work to the registry.\n *\n * The `work` function receives `{ signal, emit }` — `signal` is the\n * AbortSignal honored on cancel; `emit(payload)` produces a\n * `progress` event observable via `Task.subscribe`.\n *\n * Returns a `TaskHandle` in `state: \"queued\"`. Subsequent state\n * transitions are observable via `Task.subscribe(handle.id)` OR\n * polled via `Task.get(handle.id)`.\n *\n * **Idempotency (D367):** submitting twice with the same `id` returns\n * the existing handle without re-invoking work.\n *\n * **Grammar (D368):** user-supplied ids must match\n * `^[a-z0-9][a-z0-9_-]*$` and must not start with reserved prefixes\n * `wf-` / `b-` / `cron-`. Otherwise `InvalidTaskIdError` is thrown.\n *\n * **Pre-aborted signal (EC-4):** if `options.signal` is already\n * aborted, the task short-circuits to `cancelled` without acquiring\n * a semaphore slot and without invoking `work`.\n */\n static async submit<T>(\n kind: TaskKind,\n work: TaskWorkFn<T>,\n options: TaskSubmitOptions = {},\n ): Promise<TaskHandle> {\n return registrySubmit<T>({\n kind,\n work,\n ...(options.id !== undefined ? { id: options.id } : {}),\n ...(options.meta !== undefined ? { meta: options.meta } : {}),\n ...(options.signal !== undefined ? { signal: options.signal } : {}),\n ...(options.onRunEvent !== undefined ? { onRunEvent: options.onRunEvent } : {}),\n });\n }\n\n /** Returns matching handles, capped at `filter.limit ?? 100`. */\n static list(filter: TaskFilter = {}): Promise<TaskHandle[]> {\n return registryList(filter);\n }\n\n /** Returns a single handle by id, or `undefined` if unknown / evicted. */\n static get(id: string): Promise<TaskHandle | undefined> {\n return registryGet(id);\n }\n\n /**\n * Idempotent cancel (D365). Returns:\n * - `{ cancelled: true, alreadyTerminal: false }` — transitioned\n * queued/running task to `cancelled`.\n * - `{ cancelled: false, alreadyTerminal: true }` — task already\n * terminal.\n * - `{ cancelled: false, alreadyTerminal: false }` — task unknown.\n *\n * Never throws.\n */\n static cancel(id: string, reason?: string): Promise<TaskCancelResult> {\n return registryCancel(id, reason);\n }\n\n /**\n * Subscribe to a task's event stream. The returned `AsyncIterable<TaskEvent>`\n * starts by replaying buffered events (ring buffer cap 64, D372) and\n * then yields live events until a terminal event (finished / errored\n * / cancelled) is emitted, at which point it closes automatically.\n *\n * Calling `.return()` on the iterator (or `break` in a `for await`)\n * cleans up the subscriber callback (EC-10).\n *\n * Throws `TaskNotFoundError` if the id is unknown or has been evicted.\n */\n static subscribe(id: string): AsyncIterable<TaskEvent> {\n return registrySubscribe(id);\n }\n}\n","import type { SDKProvider } from \"../../types/providers.js\";\nimport type { SDKModel, SDKRepository, SDKUser } from \"../../types/theokit.js\";\nimport { DEFAULT_AGENTIC_MODEL_ID } from \"../runtime/config/default-model.js\";\n\n/**\n * Fixture catalog data — returned when fixture-mode is active (no\n * `THEOKIT_API_BASE_URL` set + `theo_test_*` API key).\n *\n * Shapes here must match the JSON files under `tests/golden/theokit/`\n * after `normalizeForGolden()` is applied. `createdAt` is an ISO timestamp\n * normalized to `<timestamp>` by the test helper.\n *\n * @internal\n */\n\nconst FIXTURE_TIMESTAMP = \"2024-01-01T00:00:00.000Z\";\n\n/** Fixture user identity (matches `tests/golden/theokit/me.json`). */\nexport const FIXTURE_USER: SDKUser = {\n apiKeyName: \"Contract Test Key\",\n userEmail: \"sdk-contract@example.com\",\n createdAt: FIXTURE_TIMESTAMP,\n};\n\n/** Fixture model catalog (matches `tests/golden/theokit/models.json`). */\nexport const FIXTURE_MODELS: SDKModel[] = [\n {\n id: DEFAULT_AGENTIC_MODEL_ID,\n name: \"Gemini 2.0 Flash\",\n displayName: \"Gemini 2.0 Flash\",\n parameters: [\n {\n id: \"thinking\",\n displayName: \"Thinking\",\n values: [\n { value: \"low\", displayName: \"Low\" },\n { value: \"high\", displayName: \"High\" },\n ],\n },\n ],\n variants: [\n {\n displayName: \"High thinking\",\n params: [{ id: \"thinking\", value: \"high\" }],\n isDefault: false,\n },\n ],\n },\n];\n\n/** Fixture connected repos (matches `tests/golden/theokit/repositories.json`). */\nexport const FIXTURE_REPOSITORIES: SDKRepository[] = [\n { url: \"https://github.com/usetheo/example\" },\n];\n\n/**\n * Generic JSON Schema used as `setupSchema` for fixture providers. The\n * property name is intentionally generic (`credential`) so the schema never\n * contains substrings that look like environment variable names for real\n * provider tokens — fixture output must remain secret-shaped-noise-free.\n */\nconst GENERIC_SETUP_SCHEMA = {\n type: \"object\",\n description: \"Configuration values for this provider.\",\n required: [\"credential\"],\n properties: { credential: { type: \"string\" } },\n} as const;\n\n/**\n * Fixture provider catalog. Covers chat, web_search, image, and embedding\n * capabilities. The `setupSchema` is intentionally generic JSON Schema —\n * consumers drive UI from these definitions.\n *\n * Public and secret-free by design — no tokens or API key examples.\n */\nexport const FIXTURE_PROVIDERS: SDKProvider[] = [\n {\n name: \"anthropic\",\n displayName: \"Anthropic\",\n capabilities: [\"chat\"],\n isAvailable: true,\n setupSchema: GENERIC_SETUP_SCHEMA,\n },\n {\n name: \"openai\",\n displayName: \"OpenAI\",\n capabilities: [\"chat\", \"embedding\", \"image\"],\n isAvailable: false,\n setupSchema: GENERIC_SETUP_SCHEMA,\n },\n {\n name: \"openrouter\",\n displayName: \"OpenRouter\",\n capabilities: [\"chat\"],\n isAvailable: true,\n setupSchema: GENERIC_SETUP_SCHEMA,\n },\n {\n name: \"nous\",\n displayName: \"Nous Research\",\n capabilities: [\"chat\"],\n isAvailable: true,\n setupSchema: GENERIC_SETUP_SCHEMA,\n },\n {\n name: \"fixture-search\",\n displayName: \"Fixture Search\",\n capabilities: [\"web_search\"],\n isAvailable: true,\n setupSchema: GENERIC_SETUP_SCHEMA,\n },\n];\n","/**\n * Local model discovery via OpenAI-compatible `/v1/models` endpoint\n * (T2.1, ADR D184).\n *\n * Used by `Theokit.models.list({ provider: \"ollama\" })` (and any other\n * future provider with `authType: \"none\"` exposing the OpenAI-shape\n * models endpoint — LM Studio, llama.cpp `./server`, vLLM, etc.) to\n * enumerate locally-installed models without a cloud round-trip.\n *\n * Aligned with peer-project `extensions/ollama/src/provider-models.ts` which\n * targets the same endpoint shape. Mirrors the relevant Hermes\n * `models.dev` catalog behavior for local providers.\n *\n * @internal\n */\n\nimport { ConfigurationError } from \"../../errors.js\";\nimport type { SDKModel } from \"../../types/theokit.js\";\nimport { mapOllamaHttpError, mapOllamaTransportError } from \"../error-mappers/ollama.js\";\n\ninterface OpenAiModelsResponse {\n object?: string;\n data?: Array<{ id?: string; owned_by?: string }>;\n}\n\n/**\n * Fetch and map `<baseUrl>/v1/models` → `SDKModel[]`. Throws a typed\n * `ConfigurationError` on connection failures (ECONNREFUSED → \"Run\n * `ollama serve`\"). Returns `[]` when the body is unparseable —\n * defensive choice over crashing on malformed responses from\n * non-standard local runtimes.\n */\nexport async function listLocalModelsViaOpenAiCompat(baseUrl: string): Promise<SDKModel[]> {\n const url = `${baseUrl}/v1/models`;\n let response: Response;\n try {\n response = await fetch(url, { method: \"GET\" });\n } catch (fetchErr) {\n const mapped = mapOllamaTransportError({\n providerId: \"ollama\",\n cause: fetchErr,\n endpoint: \"/v1/models\",\n });\n if (mapped !== undefined) throw mapped;\n throw new ConfigurationError(\n `Failed to reach local provider at ${baseUrl}: ${(fetchErr as Error).message}`,\n { code: \"local_provider_unreachable\" },\n );\n }\n if (!response.ok) {\n const text = await response.text().catch(() => \"\");\n let body: unknown = text;\n try {\n body = JSON.parse(text);\n } catch {\n // keep as string\n }\n const mapped = mapOllamaHttpError({\n providerId: \"ollama\",\n status: response.status,\n body,\n headers: response.headers,\n endpoint: \"/v1/models\",\n });\n if (mapped !== undefined) throw mapped;\n throw new ConfigurationError(\n `Local provider at ${baseUrl} returned HTTP ${response.status} on /v1/models`,\n { code: \"local_provider_http_error\" },\n );\n }\n let parsed: OpenAiModelsResponse;\n try {\n parsed = (await response.json()) as OpenAiModelsResponse;\n } catch {\n return [];\n }\n const data = parsed.data ?? [];\n return data\n .filter(\n (entry): entry is { id: string } => typeof entry?.id === \"string\" && entry.id.length > 0,\n )\n .map((entry) => ({\n id: entry.id,\n displayName: entry.id,\n name: entry.id,\n }));\n}\n","import { AuthenticationError } from \"./errors.js\";\nimport {\n FIXTURE_MODELS,\n FIXTURE_PROVIDERS,\n FIXTURE_REPOSITORIES,\n FIXTURE_USER,\n} from \"./internal/catalog/fixtures.js\";\nimport { listLocalModelsViaOpenAiCompat } from \"./internal/catalog/local-models.js\";\nimport { resolveApiKey } from \"./internal/env.js\";\nimport { httpRequest } from \"./internal/http.js\";\nimport { MEMORY_EMBEDDING_ADAPTERS } from \"./internal/memory/adapters/catalog.js\";\nimport {\n getCatalogCapabilities,\n type ProviderCapabilities,\n} from \"./internal/providers/catalog-loader.js\";\nimport {\n discoverProviderPlugins,\n getProviderProfile,\n listProviders,\n registerBuiltins,\n} from \"./internal/providers/index.js\";\nimport { isFixtureApiKey, shouldUseFixtureMode } from \"./internal/runtime/fixtures/fixture-mode.js\";\nimport type { SDKProvider } from \"./types/providers.js\";\nimport type { SDKModel, SDKRepository, SDKUser } from \"./types/theokit.js\";\n\n/**\n * Options shared by every `Theokit.*` request.\n *\n * @public\n */\nexport interface TheokitRequestOptions {\n /** Override the `THEOKIT_API_KEY` env var for this call. */\n apiKey?: string;\n /**\n * Target a specific provider for catalog reads. When set to a provider\n * with `authType: \"none\"` (e.g. `\"ollama\"`, `\"lmstudio\"`, `\"llamacpp\"`),\n * `Theokit.models.list({ provider })` reads from the provider's local\n * `/v1/models` endpoint instead of the TheoCloud catalog. ADR D184.\n *\n * @public\n */\n provider?: string;\n}\n\n/**\n * Account-level and catalog reads. All methods accept an optional `apiKey`\n * and otherwise fall back to the `THEOKIT_API_KEY` environment variable.\n *\n * @public\n */\nexport class Theokit {\n private constructor() {\n // Static-only namespace.\n }\n\n /**\n * Return the user behind the current API key.\n *\n * @public\n */\n static me(options: TheokitRequestOptions = {}): Promise<SDKUser> {\n return executeCatalogRequest({\n apiKey: options.apiKey,\n fixture: FIXTURE_USER,\n path: \"/v1/me\",\n });\n }\n\n /**\n * Model catalog reads.\n *\n * @public\n */\n static readonly models: {\n list: (options?: TheokitRequestOptions) => Promise<SDKModel[]>;\n capabilities: (providerOrModelId: string) => ProviderCapabilities | undefined;\n } = {\n list: async (options = {}) => {\n // ADR D184: when `provider` targets an `authType: \"none\"` provider,\n // read locally instead of hitting TheoCloud. Cloud catalog path is\n // unchanged when `provider` is undefined.\n if (options.provider !== undefined) {\n const localModels = await maybeListLocalModels(options.provider);\n if (localModels !== undefined) return localModels;\n }\n return executeCatalogRequest({\n apiKey: options.apiKey,\n fixture: FIXTURE_MODELS,\n path: \"/v1/models\",\n });\n },\n capabilities: (providerOrModelId: string) => {\n registerBuiltins();\n // Extract provider name from \"provider/model\" format\n const providerId = providerOrModelId.includes(\"/\")\n ? (providerOrModelId.split(\"/\")[0] ?? providerOrModelId)\n : providerOrModelId;\n return getCatalogCapabilities(providerId);\n },\n };\n\n /**\n * Connected GitHub repositories for the calling user's team. Cloud only.\n *\n * @public\n */\n static readonly repositories: {\n list: (options?: TheokitRequestOptions) => Promise<SDKRepository[]>;\n } = {\n list: (options = {}) =>\n executeCatalogRequest({\n apiKey: options.apiKey,\n fixture: FIXTURE_REPOSITORIES,\n path: \"/v1/repositories\",\n }),\n };\n\n /**\n * Provider catalog. Lists every provider known to the platform, including\n * plugin-registered ones, with capability and availability metadata.\n *\n * @public\n */\n static readonly providers: {\n list: (options?: TheokitRequestOptions) => Promise<SDKProvider[]>;\n } = {\n list: (options = {}) =>\n executeCatalogRequest({\n apiKey: options.apiKey,\n fixture: FIXTURE_PROVIDERS,\n path: \"/v1/providers\",\n }),\n };\n\n /**\n * Local introspection of bundled SDK assets (ADR D201). Unlike the\n * cloud-catalog `providers.list()` (which hits the TheoCloud HTTP API),\n * `inspect.*` reads the SDK's own bundled registries — useful for\n * tooling (e.g. `@theokit/cli`'s `theokit inspect`) that needs to know\n * what's available WITHOUT a network round-trip.\n *\n * @public\n */\n static readonly inspect: {\n builtinProviders: () => Array<{\n readonly name: string;\n readonly apiMode: string;\n readonly authType: string;\n readonly baseUrl: string;\n readonly aliases?: ReadonlyArray<string>;\n readonly envVars: ReadonlyArray<string>;\n }>;\n embeddingAdapters: () => Array<{\n readonly id: string;\n readonly transport: string;\n readonly defaultModel: string;\n }>;\n } = {\n builtinProviders: () => {\n registerBuiltins();\n return listProviders().map((p) => ({\n name: p.name,\n apiMode: p.apiMode,\n authType: p.authType,\n baseUrl: p.baseUrl,\n ...(p.aliases !== undefined ? { aliases: p.aliases } : {}),\n envVars: p.envVars,\n }));\n },\n embeddingAdapters: () =>\n Object.entries(MEMORY_EMBEDDING_ADAPTERS).map(([id, adapter]) => ({\n id,\n transport: adapter.transport,\n defaultModel: adapter.defaultModel,\n })),\n };\n\n // NOTE: `Theokit.subscribe` is exported from `@theokit/sdk/subscription`\n // sub-path entry instead of the main `Theokit` static class to avoid\n // pulling the subscription module into the main `index.ts` DTS bundle\n // (which trips on the pre-existing `types/agent.ts ↔ fork-agent.ts` cycle\n // — same pattern as `path-safety` per ADR D425/D429 + see tsup.config.ts\n // header comment). Consumers import via:\n // `import { subscribe } from \"@theokit/sdk/subscription\"`\n // The function shape mirrors a hypothetical `Theokit.subscribe(name, input, opts)`\n // and may be promoted onto Theokit once the agent.ts cycle is broken.\n}\n\n/**\n * ADR D184: when caller passed `{ provider }` targeting a profile with\n * `authType: \"none\"`, fetch from the local provider's `/v1/models`.\n * Returns `undefined` when the provider does not exist OR has auth —\n * caller falls back to the cloud catalog path.\n */\nasync function maybeListLocalModels(providerName: string): Promise<SDKModel[] | undefined> {\n registerBuiltins();\n // M47 review F2 — this async entrypoint resolves provider profiles, so plugin discovery must run\n // here too (the sync surfaces `models.capabilities()` / `inspect.builtinProviders()` intentionally\n // remain builtins-only — they cannot await; documented limitation).\n await discoverProviderPlugins();\n const profile = getProviderProfile(providerName);\n if (profile === undefined) return undefined;\n if (profile.authType !== \"none\") return undefined;\n const baseUrl = resolveLocalProviderBaseUrl(profile.name, profile.baseUrl);\n return listLocalModelsViaOpenAiCompat(baseUrl);\n}\n\nfunction resolveLocalProviderBaseUrl(providerName: string, fallback: string): string {\n // Mirror the env override priority used in router.ts selectTransport.\n if (providerName === \"ollama\" && process.env.OLLAMA_HOST !== undefined) {\n return process.env.OLLAMA_HOST;\n }\n return fallback;\n}\n\ninterface CatalogRequest<T> {\n apiKey: string | undefined;\n fixture: T;\n path: string;\n}\n\nasync function executeCatalogRequest<T>(request: CatalogRequest<T>): Promise<T> {\n const apiKey = resolveApiKey(request.apiKey);\n if (apiKey === undefined) {\n throw new AuthenticationError(\"Missing API key\", { code: \"missing_api_key\" });\n }\n\n if (shouldUseFixtureMode(apiKey)) {\n return request.fixture;\n }\n\n // Fixture-mode is off — either an explicit base URL is set (real HTTP)\n // or a non-fixture key is being used without a backend reachable.\n if (!isFixtureApiKey(apiKey) && process.env.THEOKIT_API_BASE_URL === undefined) {\n throw new AuthenticationError(\"Invalid API key\", { code: \"authentication_error\" });\n }\n\n return httpRequest<T>(request.path, { apiKey });\n}\n","/**\n * `toShareGptTrajectory` — opt-in BatchResult → ShareGPT converter (ADR D139).\n *\n * Pure transformation. Returns `null` for failed results so callers can\n * filter via `.map(toShareGptTrajectory).filter(Boolean)`. Tool calls and\n * tool results are preserved when an SDKMessage trace is provided; otherwise\n * a minimal `human → gpt` trajectory is emitted from the final text.\n *\n * @public\n */\n\nimport type { BatchResult } from \"./types/batch.js\";\nimport type { SDKMessage, TextBlock, ToolUseBlock } from \"./types/messages.js\";\nimport type { ShareGptMessage, ShareGptTrajectory } from \"./types/trajectory.js\";\n\n/**\n * Convert a successful `BatchResult` to ShareGPT-format trajectory.\n *\n * Behavior:\n * - `result.ok === false` → returns `null` (EC-11).\n * - First entry is always `{from: \"human\", value: result.prompt}`.\n * - When `options.messages` is supplied, each SDKMessage maps to one or\n * more ShareGPT entries (assistant text → gpt, tool_use → gpt + tool).\n * - Without `options.messages`, fall back to a single `{from: \"gpt\"}`\n * entry carrying `result.result.result` (the final text) when present.\n * - Malformed message entries are silently skipped (EC-F / EC-14).\n *\n * @public\n */\nexport function toShareGptTrajectory(\n result: BatchResult,\n options?: { messages?: SDKMessage[]; model?: string },\n): ShareGptTrajectory | null {\n if (!result.ok) return null;\n const conversations = buildConversations(result, options?.messages);\n const trajectory: ShareGptTrajectory = {\n conversations,\n metadata: {\n timestamp: new Date().toISOString(),\n durationMs: result.durationMs,\n promptIndex: result.index,\n ...(options?.model !== undefined ? { model: options.model } : {}),\n },\n completed: true,\n };\n const usage = extractUsage(result.result);\n if (usage !== undefined) trajectory.usage = usage;\n return trajectory;\n}\n\nfunction buildConversations(\n result: Extract<BatchResult, { ok: true }>,\n messages: SDKMessage[] | undefined,\n): ShareGptMessage[] {\n const conversations: ShareGptMessage[] = [{ from: \"human\", value: result.prompt }];\n if (Array.isArray(messages) && messages.length > 0) {\n for (const m of messages) {\n for (const entry of mapSdkMessage(m)) conversations.push(entry);\n }\n return conversations;\n }\n // Fall-back: minimal {gpt} entry with final text (EC-12).\n const finalText = typeof result.result.result === \"string\" ? result.result.result : \"\";\n conversations.push({ from: \"gpt\", value: finalText });\n return conversations;\n}\n\nfunction extractUsage(\n runResult: unknown,\n): { inputTokens: number; outputTokens: number } | undefined {\n const usage = (runResult as { usage?: { inputTokens?: unknown; outputTokens?: unknown } })?.usage;\n if (usage === undefined) return undefined;\n if (typeof usage.inputTokens !== \"number\" || typeof usage.outputTokens !== \"number\") {\n return undefined;\n }\n return { inputTokens: usage.inputTokens, outputTokens: usage.outputTokens };\n}\n\n/**\n * Map one SDKMessage to zero or more ShareGPT entries. Tool-use blocks\n * inside an assistant message split into a `gpt` entry with `tool_calls`\n * plus, when paired with a `tool_call.completed` event, a `tool` entry\n * carrying the result.\n *\n * Malformed shapes (missing `message.content`, non-array content) yield\n * an empty list — caller skips silently (EC-F).\n *\n * @internal\n */\nfunction mapSdkMessage(m: SDKMessage): ShareGptMessage[] {\n if (m === null || typeof m !== \"object\") return [];\n switch (m.type) {\n case \"assistant\":\n return mapAssistant(m);\n case \"tool_call\":\n return mapToolCall(m);\n case \"thinking\":\n case \"system\":\n case \"user\":\n case \"status\":\n case \"task\":\n case \"request\":\n case \"object_delta\":\n return [];\n default: {\n // Exhaustive sentinel — unreachable on stable SDKMessage union.\n const _exhaustive: never = m;\n void _exhaustive;\n return [];\n }\n }\n}\n\nfunction mapAssistant(m: Extract<SDKMessage, { type: \"assistant\" }>): ShareGptMessage[] {\n const content = m.message?.content;\n if (!Array.isArray(content)) return [];\n const textParts: string[] = [];\n const toolCalls: NonNullable<ShareGptMessage[\"tool_calls\"]> = [];\n for (const block of content) {\n appendBlock(block, textParts, toolCalls);\n }\n const entry: ShareGptMessage = { from: \"gpt\", value: textParts.join(\"\") };\n if (toolCalls.length > 0) entry.tool_calls = toolCalls;\n return [entry];\n}\n\nfunction appendBlock(\n block: unknown,\n textParts: string[],\n toolCalls: NonNullable<ShareGptMessage[\"tool_calls\"]>,\n): void {\n if (block === null || typeof block !== \"object\") return;\n const text = block as TextBlock;\n if (text.type === \"text\" && typeof text.text === \"string\") {\n textParts.push(text.text);\n return;\n }\n const tu = block as ToolUseBlock;\n if (tu.type !== \"tool_use\") return;\n const args =\n tu.input !== null && typeof tu.input === \"object\" ? (tu.input as Record<string, unknown>) : {};\n toolCalls.push({ name: tu.name, arguments: args });\n}\n\nfunction mapToolCall(m: Extract<SDKMessage, { type: \"tool_call\" }>): ShareGptMessage[] {\n // Only emit when the tool call completed — running/error are interim states.\n if (m.status !== \"completed\") return [];\n const value =\n typeof m.result === \"string\" ? m.result : m.result === undefined ? \"\" : safeStringify(m.result);\n return [{ from: \"tool\", value }];\n}\n\nfunction safeStringify(v: unknown): string {\n try {\n return JSON.stringify(v);\n } catch {\n return String(v);\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/agent-factory.ts","../src/internal/budget/calendar-window.ts","../src/internal/budget/ledger.ts","../src/internal/budget/registry.ts","../src/internal/budget/enforcement.ts","../src/internal/budget/normalize-usage.ts","../src/budget.ts","../src/built-in-processors.ts","../src/create-skill.ts","../src/define-provider.ts","../src/define-skill-read-tool.ts","../src/event-bus.ts","../src/goal-loop.ts","../src/internal/budget/tracker/budget-tracker-counter.ts","../src/internal/plugins/types.ts","../src/internal/runtime/memory/memory-provider-noop.ts","../src/job-queue.ts","../src/internal/memory/dreaming/diary.ts","../src/internal/memory/dreaming/phases.ts","../src/internal/memory/dreaming/run.ts","../src/internal/memory/sdk-memory-peer-loader.ts","../src/memory.ts","../src/memory-adapter-helpers.ts","../src/internal/memory/migrate-sqlite-to-lance.ts","../src/migrate.ts","../src/permission-engine.ts","../src/permission-plugin.ts","../src/schema-normalizer.ts","../src/security.ts","../src/session-scope.ts","../src/squad.ts","../src/task.ts","../src/internal/catalog/fixtures.ts","../src/internal/catalog/local-models.ts","../src/theokit.ts","../src/trajectory-helpers.ts"],"names":["list","kept","join","migrateSqliteToLance","Agent"],"mappings":"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","file":"index.js","sourcesContent":["import { Agent } from \"./agent.js\";\nimport type { AgentOptions, SDKAgent } from \"./types/agent.js\";\n\n/**\n * Handle returned by {@link createAgentFactory}. See ADR D23 for merge\n * semantics.\n *\n * @public\n */\nexport interface AgentFactory {\n /**\n * Create a fresh agent for this session. Equivalent to `Agent.create(merged)`\n * where `merged` is `common` ⊕ `overrides` ⊕ `{ agentId }`.\n */\n forSession(agentId: string, overrides?: Partial<AgentOptions>): Promise<SDKAgent>;\n /**\n * Resume an existing agent for this session, or create one if the ID is\n * unknown. Equivalent to `Agent.getOrCreate(agentId, merged)`.\n */\n getOrCreate(agentId: string, overrides?: Partial<AgentOptions>): Promise<SDKAgent>;\n}\n\n/**\n * Capture a common {@link AgentOptions} prefix and produce per-session agents\n * with focused overrides. Useful for chat-bot patterns where most config is\n * shared across users/sessions.\n *\n * Merge rules (ADR D23):\n * - Top-level shallow merge with `overrides` winning.\n * - Deep merge for `local`, `memory`, `cloud` (configuration objects with\n * non-conflicting flat keys).\n * - Total replace for `mcpServers`, `agents`, `tools`, `providers`,\n * `plugins`, `skills`, `context` (collection-shaped).\n * - The function-level `agentId` always wins over both `common.agentId` and\n * `overrides.agentId`.\n *\n * The factory holds `common` by reference — mutating it after construction\n * leaks to subsequent `forSession` calls (documented caveat).\n *\n * @public\n */\nfunction createAgentFactory(common: Partial<AgentOptions>): AgentFactory {\n return {\n forSession: (agentId, overrides) => Agent.create(mergeAgentOptions(common, overrides, agentId)),\n getOrCreate: (agentId, overrides) =>\n Agent.getOrCreate(agentId, mergeAgentOptions(common, overrides, agentId)),\n };\n}\n\n/**\n * Merge factory `common` config with per-session `overrides`, forcing the\n * function-level `agentId`. Deep-merges the 3 configuration-shaped fields\n * (`local`, `memory`, `cloud`); replaces collection-shaped fields.\n *\n * @internal\n */\nfunction mergeAgentOptions(\n common: Partial<AgentOptions>,\n overrides: Partial<AgentOptions> | undefined,\n agentId: string,\n): AgentOptions {\n const o = overrides ?? {};\n const merged: Partial<AgentOptions> = { ...common, ...o };\n const local = deepMergeLocal(common.local, o.local);\n if (local !== undefined) merged.local = local;\n const memory = deepMergeMemory(common.memory, o.memory);\n if (memory !== undefined) merged.memory = memory;\n const cloud = deepMergeCloud(common.cloud, o.cloud);\n if (cloud !== undefined) merged.cloud = cloud;\n merged.agentId = agentId;\n return merged as AgentOptions;\n}\n\nfunction deepMergeLocal(\n base: AgentOptions[\"local\"],\n top: AgentOptions[\"local\"],\n): AgentOptions[\"local\"] | undefined {\n if (base === undefined && top === undefined) return undefined;\n return { ...(base ?? {}), ...(top ?? {}) };\n}\n\nfunction deepMergeMemory(\n base: AgentOptions[\"memory\"],\n top: AgentOptions[\"memory\"],\n): AgentOptions[\"memory\"] | undefined {\n if (base === undefined && top === undefined) return undefined;\n return {\n ...(base ?? {}),\n ...(top ?? {}),\n enabled: top?.enabled ?? base?.enabled ?? false,\n };\n}\n\nfunction deepMergeCloud(\n base: AgentOptions[\"cloud\"],\n top: AgentOptions[\"cloud\"],\n): AgentOptions[\"cloud\"] | undefined {\n if (base === undefined && top === undefined) return undefined;\n return { ...(base ?? {}), ...(top ?? {}) };\n}\n\n/** SE36 — `AgentFactory.create` replaces `createAgentFactory` (ADR 0015). Merges with the `AgentFactory` interface. @public */\n// biome-ignore lint/suspicious/noUnsafeDeclarationMerging: SE36 namespace class merges with the `AgentFactory` instance interface (ADR 0015) — intentional; `create()` returns the interface type, `new` is blocked by the private ctor.\nexport class AgentFactory {\n private constructor() {}\n static create(common: Partial<AgentOptions>): AgentFactory {\n return createAgentFactory(common);\n }\n}\n","/**\n * UTC-aligned calendar window helpers (ADR D382).\n *\n * - `1h` — relative (now - 1 hour).\n * - `1d` — UTC midnight (current UTC day).\n * - `1w` — UTC monday 00:00:00 (current UTC week, Monday is week start).\n * - `30d` — relative 30 days.\n * - `365d` — relative 365 days.\n *\n * `1d` and `1w` are calendar-aligned because users expect \"1 USD per day\"\n * = \"since midnight UTC\", not a rolling 24h.\n * `30d`/`365d` are relative because nobody expects \"since the 1st\".\n *\n * @internal\n */\n\nimport type { BudgetWindow } from \"../../types/budget.js\";\n\nexport function startOfDayUtc(now: Date = new Date()): Date {\n return new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate()));\n}\n\nexport function startOfWeekUtc(now: Date = new Date()): Date {\n // ISO 8601 week starts on Monday. getUTCDay() returns 0 (Sun) .. 6 (Sat).\n const dayOfWeek = now.getUTCDay();\n const daysSinceMonday = (dayOfWeek + 6) % 7; // Mon=0, Sun=6\n const start = startOfDayUtc(now);\n start.setUTCDate(start.getUTCDate() - daysSinceMonday);\n return start;\n}\n\nconst MS_PER_HOUR = 60 * 60 * 1000;\nconst MS_PER_DAY = 24 * MS_PER_HOUR;\n\n/** Returns the inclusive start timestamp (ms) for the given window relative to `now`. */\nexport function windowStartMs(window: BudgetWindow, now: Date = new Date()): number {\n switch (window) {\n case \"1h\":\n return now.getTime() - MS_PER_HOUR;\n case \"1d\":\n return startOfDayUtc(now).getTime();\n case \"1w\":\n return startOfWeekUtc(now).getTime();\n case \"30d\":\n return now.getTime() - 30 * MS_PER_DAY;\n case \"365d\":\n return now.getTime() - 365 * MS_PER_DAY;\n default: {\n const _exhaustive: never = window;\n throw new Error(`unreachable window: ${_exhaustive as string}`);\n }\n }\n}\n","/**\n * In-process Budget ledger (ADR D385).\n *\n * Singleton mutex-protected. Stores per-budget ChargeLog[] arrays;\n * `spentIn(window)` filters by timestamp.\n *\n * EC-6: GC eviction runs DENTRO do mesmo mutex que charge — sem race.\n * EC-9: charge() é called inside same critical section as preflight\n * check by Budget enforcement.\n *\n * Persistence cross-restart: deferred to v0.2 (JsonFile pattern).\n *\n * @internal\n */\n\nimport type { BudgetWindow } from \"../../types/budget.js\";\nimport { withCwdMutex } from \"../persistence/cwd-mutex.js\";\nimport { windowStartMs } from \"./calendar-window.js\";\n\ninterface ChargeLog {\n timestamp: number;\n amountUsd: number;\n}\n\nconst MS_PER_YEAR = 365 * 24 * 60 * 60 * 1000;\nconst GC_INTERVAL_MS = 5 * 60 * 1000; // 5 minutes\nconst GC_LOGS_THRESHOLD = 10_000;\n\ninterface LedgerState {\n readonly logs: Map<string, ChargeLog[]>;\n lastGcAt: number;\n}\n\nlet state: LedgerState = {\n logs: new Map(),\n lastGcAt: Date.now(),\n};\n\nconst MUTEX_KEY = \"budget-ledger\";\n\nfunction shouldGc(now: number): boolean {\n if (now - state.lastGcAt < GC_INTERVAL_MS) return false;\n let totalLogs = 0;\n for (const arr of state.logs.values()) totalLogs += arr.length;\n return totalLogs > GC_LOGS_THRESHOLD;\n}\n\nfunction gcOlderThanOneYear(now: number): void {\n const cutoff = now - MS_PER_YEAR;\n for (const [name, arr] of state.logs.entries()) {\n const kept = arr.filter((l) => l.timestamp >= cutoff);\n if (kept.length === 0) state.logs.delete(name);\n else state.logs.set(name, kept);\n }\n state.lastGcAt = now;\n}\n\n/** Charge a budget. Idempotent across concurrent calls via withCwdMutex. */\nexport async function charge(name: string, amountUsd: number): Promise<void> {\n if (amountUsd <= 0) return;\n await withCwdMutex(MUTEX_KEY, async () => {\n const now = Date.now();\n const list = state.logs.get(name) ?? [];\n list.push({ timestamp: now, amountUsd });\n state.logs.set(name, list);\n if (shouldGc(now)) gcOlderThanOneYear(now);\n });\n}\n\n/** Return total spend in the given window for `name`. Snapshot read (no mutex needed). */\nexport function spentIn(name: string, window: BudgetWindow, now: Date = new Date()): number {\n const arr = state.logs.get(name);\n if (arr === undefined) return 0;\n const sinceMs = windowStartMs(window, now);\n let total = 0;\n for (const log of arr) {\n if (log.timestamp >= sinceMs) total += log.amountUsd;\n }\n return total;\n}\n\n/** Diagnostic — total logs across all budgets. */\nexport function __getLogCountForTests(name?: string): number {\n if (name !== undefined) return state.logs.get(name)?.length ?? 0;\n let total = 0;\n for (const arr of state.logs.values()) total += arr.length;\n return total;\n}\n\nexport function __resetLedgerForTests(): void {\n state = { logs: new Map(), lastGcAt: Date.now() };\n}\n\n/** Force GC manually (tests only). */\nexport async function __evictNowForTests(): Promise<void> {\n await withCwdMutex(MUTEX_KEY, async () => {\n gcOlderThanOneYear(Date.now());\n });\n}\n\n/** Force-insert a log at a specific timestamp (tests only). */\nexport function __injectLogForTests(name: string, timestamp: number, amountUsd: number): void {\n const list = state.logs.get(name) ?? [];\n list.push({ timestamp, amountUsd });\n state.logs.set(name, list);\n}\n","/**\n * Internal Budget registry — keeps live `BudgetOptions` per name.\n * Singleton; no persistence (D385).\n *\n * @internal\n */\n\nimport { ConfigurationError } from \"../../errors.js\";\nimport type {\n BudgetHandle,\n BudgetMode,\n BudgetOptions,\n BudgetSnapshot,\n BudgetWindow,\n} from \"../../types/budget.js\";\nimport { spentIn } from \"./ledger.js\";\n\nconst NAME_GRAMMAR = /^[a-z0-9][a-z0-9_-]*$/;\n\nconst registry = new Map<string, BudgetOptions>();\n\nexport function __resetRegistryForTests(): void {\n registry.clear();\n}\n\nexport function validateBudgetName(name: string): void {\n if (typeof name !== \"string\" || name.length === 0) {\n throw new ConfigurationError(\"Budget name must be a non-empty string\", {\n code: \"invalid_budget_name\",\n });\n }\n if (!NAME_GRAMMAR.test(name)) {\n throw new ConfigurationError(\n `Budget name \"${name}\" must match ^[a-z0-9][a-z0-9_-]*$ (lowercase + dash/underscore, start alphanumeric)`,\n { code: \"invalid_budget_name\" },\n );\n }\n}\n\nexport function createBudget(opts: BudgetOptions): BudgetHandle {\n // EC-7: name validation\n validateBudgetName(opts.name);\n if (registry.has(opts.name)) {\n // EC-16: duplicate throws (vs Task.submit idempotent return)\n throw new ConfigurationError(`Budget \"${opts.name}\" already exists`, {\n code: \"invalid_budget_name\",\n });\n }\n registry.set(opts.name, opts);\n return buildHandle(opts);\n}\n\nexport function getBudget(name: string): BudgetHandle | undefined {\n const opts = registry.get(name);\n if (opts === undefined) return undefined;\n return buildHandle(opts);\n}\n\nexport function listBudgets(): readonly BudgetHandle[] {\n return [...registry.values()].map(buildHandle);\n}\n\nexport function deleteBudget(name: string): boolean {\n return registry.delete(name);\n}\n\nexport function snapshotAll(): readonly BudgetSnapshot[] {\n const result: BudgetSnapshot[] = [];\n for (const opts of registry.values()) {\n for (const lim of opts.limits) {\n const spent = spentIn(opts.name, lim.window);\n result.push({\n name: opts.name,\n window: lim.window,\n spentUsd: spent,\n limitUsd: lim.limitUsd,\n ratio: lim.limitUsd > 0 ? spent / lim.limitUsd : 0,\n });\n }\n }\n return result;\n}\n\nexport function getBudgetOptionsRaw(name: string): BudgetOptions | undefined {\n return registry.get(name);\n}\n\nexport function defaultMode(opts: BudgetOptions): BudgetMode {\n return opts.mode ?? \"warn\";\n}\n\nfunction buildHandle(opts: BudgetOptions): BudgetHandle {\n return {\n name: opts.name,\n mode: defaultMode(opts),\n scope: opts.scope,\n limits: opts.limits,\n spentIn: (window: BudgetWindow) => spentIn(opts.name, window),\n remainingIn: (window: BudgetWindow) => {\n const lim = opts.limits.find((l) => l.window === window);\n if (lim === undefined) return Number.POSITIVE_INFINITY;\n return Math.max(0, lim.limitUsd - spentIn(opts.name, window));\n },\n };\n}\n","/**\n * Budget enforcement (ADRs D383, D386, EC-7/8/9).\n *\n * - `preflightCheck(name, estimatedUsd)` — em `block` mode, throw\n * `BudgetExceededError` antes da LLM call se qualquer limit seria\n * excedido (EC-9 — caller chama dentro do mutex section).\n * - `chargeAndCheckThresholds(name, actualUsd)` — apply charge ao\n * ledger + invoca onThreshold/onExceed callbacks isolated em\n * try/catch (EC-8).\n *\n * @internal\n */\n\nimport { BudgetExceededError } from \"../../errors.js\";\nimport type { BudgetMode, BudgetOptions } from \"../../types/budget.js\";\nimport { diag } from \"../diagnostics.js\";\nimport { charge, spentIn } from \"./ledger.js\";\nimport { defaultMode, getBudgetOptionsRaw } from \"./registry.js\";\n\nconst THRESHOLDS = [0.8, 0.95] as const;\ntype Threshold = (typeof THRESHOLDS)[number];\n\n/**\n * Throws BudgetExceededError if `mode === \"block\"` and any limit\n * would be exceeded. No-op for audit/warn modes (post-charge checks\n * handle those).\n *\n * Caller invokes this BEFORE the LLM call.\n */\nexport function preflightCheck(name: string, estimatedUsd: number): void {\n const opts = getBudgetOptionsRaw(name);\n if (opts === undefined) return; // EC-20: budget deleted; charge becomes no-op\n if (defaultMode(opts) !== \"block\") return;\n for (const lim of opts.limits) {\n const currentSpent = spentIn(opts.name, lim.window);\n if (currentSpent + estimatedUsd > lim.limitUsd) {\n throw new BudgetExceededError({\n budgetName: opts.name,\n window: lim.window,\n spentUsd: currentSpent + estimatedUsd,\n limitUsd: lim.limitUsd,\n mode: \"block\",\n });\n }\n }\n}\n\n/**\n * Charge the budget + dispatch threshold/exceed callbacks (EC-8 isolated).\n *\n * - In `audit` mode: charge only, no callbacks.\n * - In `warn` mode: charge + onThreshold (80/95) + onExceed (100). No throw.\n * - In `block` mode: charge + onThreshold + onExceed. No throw post-call\n * (preflightCheck already prevented exceed for the upcoming call;\n * this protects against simultaneous-call races where multiple sends\n * each pass preflight independently — last one to charge may still\n * tip a limit. We document the case rather than retroactively throw).\n */\nexport async function chargeAndCheckThresholds(name: string, actualUsd: number): Promise<void> {\n const opts = getBudgetOptionsRaw(name);\n if (opts === undefined) {\n // EC-20: budget deleted during in-flight call. Charge is silent no-op.\n diag(\n `[budget] charge for deleted budget \"${name}\" is a no-op (was the budget removed during in-flight send?)\\n`,\n );\n return;\n }\n const mode = defaultMode(opts);\n\n await charge(opts.name, actualUsd);\n\n if (mode === \"audit\") return;\n await dispatchCallbacksFor(opts, mode);\n}\n\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: 3-mode × 3-threshold dispatch table inherently branchy; pulling out helpers loses local context.\nasync function dispatchCallbacksFor(opts: BudgetOptions, mode: BudgetMode): Promise<void> {\n for (const lim of opts.limits) {\n const spent = spentIn(opts.name, lim.window);\n if (lim.limitUsd <= 0) {\n if (spent > 0) await dispatchExceed(opts, lim.window, spent, lim.limitUsd, mode);\n continue;\n }\n const ratio = spent / lim.limitUsd;\n if (ratio >= 1) {\n await dispatchExceed(opts, lim.window, spent, lim.limitUsd, mode);\n } else {\n // Iterate descending so the HIGHEST matched threshold fires (0.95 not 0.8)\n for (const t of [...THRESHOLDS].reverse() as Threshold[]) {\n if (ratio >= t) {\n await dispatchThreshold(opts, lim.window, spent, lim.limitUsd, t);\n break;\n }\n }\n }\n }\n}\n\nasync function dispatchThreshold(\n opts: BudgetOptions,\n window: BudgetOptions[\"limits\"][number][\"window\"],\n spentUsd: number,\n limitUsd: number,\n threshold: Threshold,\n): Promise<void> {\n if (opts.onThreshold === undefined) return;\n try {\n await opts.onThreshold({\n budgetName: opts.name,\n window,\n threshold,\n spentUsd,\n limitUsd,\n });\n } catch (err) {\n // EC-8: callback throw isolated\n const msg = err instanceof Error ? err.message : String(err);\n diag(`[budget] onThreshold callback threw: ${msg}\\n`);\n }\n}\n\nasync function dispatchExceed(\n opts: BudgetOptions,\n window: BudgetOptions[\"limits\"][number][\"window\"],\n spentUsd: number,\n limitUsd: number,\n mode: BudgetMode,\n): Promise<void> {\n if (opts.onExceed === undefined) {\n if (mode === \"warn\") {\n diag(\n `[budget] \"${opts.name}\" exceeded ${window} limit: $${spentUsd.toFixed(4)} > $${limitUsd.toFixed(4)}\\n`,\n );\n }\n return;\n }\n try {\n await opts.onExceed({\n budgetName: opts.name,\n window,\n spentUsd,\n limitUsd,\n mode,\n });\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n diag(`[budget] onExceed callback threw: ${msg}\\n`);\n }\n}\n","/**\n * normalizeUsage — convert provider-shaped raw `usage` object to\n * canonical `TokenUsage`. Ports Hermes Agent's `normalize_usage`\n * (referencia/peer-agent/agent/usage_pricing.py:672-742).\n *\n * Handles 3 API shapes:\n * - Anthropic Messages: 4 explicit buckets (input/output/cache_read/cache_creation).\n * - OpenAI Chat Completions: prompt_tokens INCLUDES cache; subtract cached_tokens.\n * - OpenAI Responses (Codex): input_tokens INCLUDES cache; same subtraction.\n *\n * Edge cases:\n * - a peer#10266 — OpenAI-compat proxies (OpenRouter, a peer vendor AI Gateway,\n * a peer) routing Claude expose Anthropic-style top-level fields\n * (cache_read_input_tokens / cache_creation_input_tokens). Both\n * locations are checked with top-level fallback.\n * - Null/undefined fields → 0 via `int()` coerce.\n * - String token counts → parsed via int.\n * - Negative values → clamped to 0 (defensive against proxy bugs).\n *\n * @internal\n */\n\nimport type { TokenUsage } from \"../../types/usage.js\";\n\nexport type ApiMode = \"anthropic_messages\" | \"openai_chat_completions\" | \"openai_responses\";\n\nfunction int(v: unknown): number {\n if (typeof v === \"number\") return Number.isFinite(v) ? Math.max(0, Math.trunc(v)) : 0;\n if (typeof v === \"string\") {\n const n = Number.parseInt(v, 10);\n return Number.isFinite(n) ? Math.max(0, n) : 0;\n }\n return 0;\n}\n\nfunction buildTotal(buckets: {\n inputTokens: number;\n outputTokens: number;\n cacheReadTokens: number;\n cacheWriteTokens: number;\n}): number {\n // total = visible input + cache buckets + output (reasoning counted via output)\n return (\n buckets.inputTokens + buckets.outputTokens + buckets.cacheReadTokens + buckets.cacheWriteTokens\n );\n}\n\nfunction omitUndefined(usage: {\n inputTokens: number;\n outputTokens: number;\n cacheReadTokens: number;\n cacheWriteTokens: number;\n reasoningTokens: number;\n totalTokens: number;\n}): TokenUsage {\n return {\n inputTokens: usage.inputTokens,\n outputTokens: usage.outputTokens,\n ...(usage.cacheReadTokens > 0 ? { cacheReadTokens: usage.cacheReadTokens } : {}),\n ...(usage.cacheWriteTokens > 0 ? { cacheWriteTokens: usage.cacheWriteTokens } : {}),\n ...(usage.reasoningTokens > 0 ? { reasoningTokens: usage.reasoningTokens } : {}),\n totalTokens: usage.totalTokens,\n };\n}\n\nexport function inferApiMode(provider: string): ApiMode {\n const p = provider.toLowerCase();\n if (p === \"anthropic\" || p === \"claude\" || p === \"bedrock_anthropic\") {\n return \"anthropic_messages\";\n }\n if (p === \"openai-codex\" || p === \"codex\") return \"openai_responses\";\n // openai, openrouter, deepseek, google (compat), ollama (compat), lmstudio (compat), etc\n return \"openai_chat_completions\";\n}\n\ninterface RawRecord {\n [k: string]: unknown;\n}\n\nexport function normalizeUsage(\n rawUsage: unknown,\n opts: { provider: string; apiMode?: ApiMode },\n): TokenUsage {\n if (rawUsage === null || rawUsage === undefined) {\n return { inputTokens: 0, outputTokens: 0, totalTokens: 0 };\n }\n if (typeof rawUsage !== \"object\") {\n return { inputTokens: 0, outputTokens: 0, totalTokens: 0 };\n }\n const raw = rawUsage as RawRecord;\n const mode = opts.apiMode ?? inferApiMode(opts.provider);\n\n if (mode === \"anthropic_messages\") return normalizeAnthropic(raw);\n if (mode === \"openai_responses\") return normalizeOpenAIResponses(raw);\n return normalizeOpenAIChat(raw);\n}\n\nfunction normalizeAnthropic(raw: RawRecord): TokenUsage {\n const inputTokens = int(raw.input_tokens);\n const outputTokens = int(raw.output_tokens);\n const cacheReadTokens = int(raw.cache_read_input_tokens);\n const cacheWriteTokens = int(raw.cache_creation_input_tokens);\n const usage = {\n inputTokens,\n outputTokens,\n cacheReadTokens,\n cacheWriteTokens,\n reasoningTokens: 0,\n totalTokens: buildTotal({ inputTokens, outputTokens, cacheReadTokens, cacheWriteTokens }),\n };\n return omitUndefined(usage);\n}\n\nfunction normalizeOpenAIResponses(raw: RawRecord): TokenUsage {\n const inputTotal = int(raw.input_tokens);\n const outputTokens = int(raw.output_tokens);\n const inputDetails = (raw.input_tokens_details as RawRecord | undefined) ?? {};\n const outputDetails = (raw.output_tokens_details as RawRecord | undefined) ?? {};\n const cacheReadTokens = int(inputDetails.cached_tokens);\n const cacheWriteTokens = int(inputDetails.cache_creation_tokens);\n const reasoningTokens = int(outputDetails.reasoning_tokens);\n const inputTokens = Math.max(0, inputTotal - cacheReadTokens - cacheWriteTokens);\n const usage = {\n inputTokens,\n outputTokens,\n cacheReadTokens,\n cacheWriteTokens,\n reasoningTokens,\n totalTokens: buildTotal({ inputTokens, outputTokens, cacheReadTokens, cacheWriteTokens }),\n };\n return omitUndefined(usage);\n}\n\nfunction normalizeOpenAIChat(raw: RawRecord): TokenUsage {\n const promptTotal = int(raw.prompt_tokens);\n const outputTokens = int(raw.completion_tokens);\n const promptDetails = (raw.prompt_tokens_details as RawRecord | undefined) ?? {};\n const completionDetails = (raw.completion_tokens_details as RawRecord | undefined) ?? {};\n\n // a peer#10266 fallback — proxies expose Anthropic-style top-level fields when routing Claude\n const cacheReadTokens = int(promptDetails.cached_tokens) || int(raw.cache_read_input_tokens);\n const cacheWriteTokens =\n int(promptDetails.cache_write_tokens) || int(raw.cache_creation_input_tokens);\n\n const reasoningTokens = int(completionDetails.reasoning_tokens);\n const inputTokens = Math.max(0, promptTotal - cacheReadTokens - cacheWriteTokens);\n const usage = {\n inputTokens,\n outputTokens,\n cacheReadTokens,\n cacheWriteTokens,\n reasoningTokens,\n totalTokens: buildTotal({ inputTokens, outputTokens, cacheReadTokens, cacheWriteTokens }),\n };\n return omitUndefined(usage);\n}\n","/**\n * `Budget` — token cost enforcement primitive (Adoption Roadmap #1\n * post-Tasks, ADRs D375-D388).\n *\n * Static facade delegating to the in-process registry + ledger.\n * 3 modes: `audit` (log-only), `warn` (callbacks + log), `block`\n * (preflight throw before LLM call).\n *\n * @public\n *\n * @deprecated since SDK 2.0 (iter 18+) — import this facade from\n * `@theokit/sdk-budget` instead. The sources backing this facade have\n * been physically extracted to `@theokit/sdk-budget/internal/` per\n * ADR-008. The sdk-core copies are retained for the v1.x sync API\n * contract; consumers MUST migrate before sdk-core v3.0.\n *\n * Migration:\n *\n * ```ts\n * // Before (sdk-core, deprecated):\n * import { Budget, computeCost } from \"@theokit/sdk\";\n *\n * // After (sdk-budget, authoritative):\n * import {\n * chargeAndCheckThresholds,\n * createBudget,\n * computeUsdCost, // replaces computeCost\n * createUsdBudgetTracker,\n * } from \"@theokit/sdk-budget\";\n * ```\n */\n\nimport { computeCost } from \"./internal/budget/compute-cost.js\";\nimport { chargeAndCheckThresholds, preflightCheck } from \"./internal/budget/enforcement.js\";\nimport { inferApiMode, normalizeUsage } from \"./internal/budget/normalize-usage.js\";\nimport { getPricingEntry } from \"./internal/budget/pricing-registry.js\";\nimport {\n createBudget,\n deleteBudget,\n getBudget,\n listBudgets,\n snapshotAll,\n} from \"./internal/budget/registry.js\";\nimport { UsageAccumulator } from \"./internal/budget/usage-accumulator.js\";\nimport type { BudgetHandle, BudgetOptions, BudgetSnapshot } from \"./types/budget.js\";\n\n// Re-exports for caller-side composition until auto-wire-up in v0.2 (T4.2 deferred).\nexport {\n chargeAndCheckThresholds,\n computeCost,\n getPricingEntry,\n inferApiMode,\n normalizeUsage,\n preflightCheck,\n UsageAccumulator,\n};\n\nexport class Budget {\n // D375 — static class with private constructor.\n private constructor() {\n throw new Error(\"Budget is static; do not instantiate\");\n }\n\n /**\n * Create a budget. `name` must match `^[a-z0-9][a-z0-9_-]*$` (EC-7).\n * Throws `ConfigurationError` if name is invalid OR already exists\n * (EC-16: duplicate surface caller bug).\n *\n * `limits` is stacked (D384) — ANY exceeded triggers enforcement.\n * Empty `limits[]` is valid: pure tracking, no thresholds/exceed\n * callbacks fire (EC-19).\n *\n * Default `mode` is `\"warn\"` (D383). For emergency stop, use\n * `mode: \"block\", limits: [{ window: \"1d\", limitUsd: 0 }]` (EC-18).\n */\n static create(options: BudgetOptions): BudgetHandle {\n return createBudget(options);\n }\n\n /** Returns the handle for an active budget, or `undefined`. */\n static get(name: string): BudgetHandle | undefined {\n return getBudget(name);\n }\n\n /** Returns all active budgets. */\n static list(): readonly BudgetHandle[] {\n return listBudgets();\n }\n\n /**\n * Deletes a budget from the registry. Returns `true` if it existed.\n * In-flight `agent.send` calls referencing the name treat the\n * subsequent charge as a silent no-op + stderr warn (EC-20).\n */\n static delete(name: string): boolean {\n return deleteBudget(name);\n }\n\n /**\n * Returns per-window spend snapshot for all active budgets. Each\n * entry has `{ name, window, spentUsd, limitUsd, ratio }`.\n */\n static snapshot(): readonly BudgetSnapshot[] {\n return snapshotAll();\n }\n}\n","/**\n * SE25 — deterministic, no-LLM guardrail processors built on the SE24\n * {@link Processor} seam. Cheap and churn-free (no provider/model deltas), so\n * they are safe to own in-core — unlike the LLM-classifier processors, which are\n * delegated (see the guardrails ADR). All are OPT-IN: add them to\n * `AgentOptions.inputProcessors` / `outputProcessors`.\n *\n * @public\n */\n\nimport type { Processor, ProcessorControls } from \"./types/processors.js\";\n\n/** Rough char→token ratio for the estimate below (no tokenizer dependency). */\nconst CHARS_PER_TOKEN = 4;\n\n/**\n * Approximate token count from string length. This is an ESTIMATE\n * (≈ UTF-16-code-units / 4, NOT Unicode code points, NOT an exact per-model\n * tokenizer count) — good enough for a coarse cap, and dependency-free.\n */\nexport function estimateTokens(text: string): number {\n return Math.ceil(text.length / CHARS_PER_TOKEN);\n}\n\n/** Options for {@link createUnicodeNormalizer}. @public */\nexport interface UnicodeNormalizerOptions {\n /** Remove C0 + C1 control chars + DEL (keeps tab / newline / carriage-return). Default `false`. */\n stripControlChars?: boolean;\n /** Collapse runs of intra-line whitespace to one space, 3+ blank lines to one, and trim. Default `false`. Uses legacy `\\s`; Unicode-only whitespace (U+00A0 NBSP, U+FEFF BOM, U+2000–U+200A) is NOT collapsed. */\n collapseWhitespace?: boolean;\n}\n\n// C0 controls (U+0000–U+001F) + DEL (U+007F) + C1 controls (U+0080–U+009F),\n// EXCLUDING tab (U+0009), line feed (U+000A), and carriage return (U+000D) so\n// line structure survives. C1 is included (matching a peer framework's Cc-category strip)\n// since C1 controls are invisible noise / prompt-injection vectors in LLM input.\n// biome-ignore lint/suspicious/noControlCharactersInRegex: intentional — this processor's whole job is to strip control characters (written with \\u escapes, no literal control char in source).\nconst CONTROL_CHARS = /[\\u0000-\\u0008\\u000B\\u000C\\u000E-\\u001F\\u007F-\\u009F]/g;\n\n/**\n * SE25 — an input processor that normalizes user text: Unicode NFC (so\n * canonically-equivalent sequences compare equal) plus optional control-char\n * stripping and whitespace collapsing. Pure + deterministic; no LLM. Mirrors\n * a peer framework's `UnicodeNormalizer`.\n *\n * @public\n */\nexport function createUnicodeNormalizer(opts: UnicodeNormalizerOptions = {}): Processor {\n const stripControlChars = opts.stripControlChars ?? false;\n const collapseWhitespace = opts.collapseWhitespace ?? false;\n return {\n id: \"unicode-normalizer\",\n processInput(ctx) {\n let s = ctx.message.normalize(\"NFC\");\n if (stripControlChars) s = s.replace(CONTROL_CHARS, \"\");\n if (collapseWhitespace) {\n s = s\n .replace(/[^\\S\\n]+/g, \" \") // runs of intra-line whitespace -> one space\n .replace(/ *\\n */g, \"\\n\") // drop spaces hugging a newline\n .replace(/\\n{3,}/g, \"\\n\\n\") // 3+ blank lines -> one blank line\n .trim();\n }\n return s;\n },\n };\n}\n\n/** Options for {@link createTokenLimiter}. @public */\nexport interface TokenLimiterOptions {\n /** Positive integer token budget (estimate — see {@link estimateTokens}). */\n limit: number;\n /** Over the limit: `\"truncate\"` (default, cut to fit) or `\"block\"` (abort with a tripwire). */\n strategy?: \"truncate\" | \"block\";\n}\n\n/**\n * SE25 — a processor that caps text to a token budget. Placed in\n * `inputProcessors` it limits the prompt; in `outputProcessors` it limits the\n * response. Uses a char-based estimate (no tokenizer dep). `truncate` cuts to\n * fit; `block` aborts (tripwire). Mirrors a peer framework's `TokenLimiterProcessor`.\n *\n * @public\n */\nexport function createTokenLimiter(opts: TokenLimiterOptions): Processor {\n if (!Number.isInteger(opts.limit) || opts.limit <= 0) {\n throw new Error(\"createTokenLimiter: `limit` must be a positive integer.\");\n }\n const limit = opts.limit;\n const strategy = opts.strategy ?? \"truncate\";\n const cap = (text: string, controls: Pick<ProcessorControls, \"abort\">): string => {\n const estimated = estimateTokens(text);\n if (estimated <= limit) return text;\n if (strategy === \"block\") {\n controls.abort(`exceeds token limit ${limit} (~${estimated} estimated)`);\n }\n // Truncate on CODE POINTS (not UTF-16 code units) so a cut never splits a\n // surrogate pair into a lone surrogate (invalid UTF-8 → rejected by LLM APIs).\n return [...text].slice(0, limit * CHARS_PER_TOKEN).join(\"\");\n };\n return {\n id: \"token-limiter\",\n processInput: (ctx) => cap(ctx.message, ctx),\n processOutput: (ctx) => cap(ctx.text, ctx),\n };\n}\n\n/** SE36 — `TokenLimiter.create` replaces `createTokenLimiter` (ADR 0015). @public */\nexport class TokenLimiter {\n private constructor() {}\n static create(opts: TokenLimiterOptions): Processor {\n return createTokenLimiter(opts);\n }\n}\n/** SE36 — `UnicodeNormalizer.create` replaces `createUnicodeNormalizer` (ADR 0015). @public */\nexport class UnicodeNormalizer {\n private constructor() {}\n static create(opts: UnicodeNormalizerOptions = {}): Processor {\n return createUnicodeNormalizer(opts);\n }\n}\n","/**\n * M22 — `createSkill`: define a skill in TypeScript, without a `SKILL.md` file on disk.\n *\n * An inline skill is usable ALONGSIDE filesystem skills (`AgentOptions.skills.inline`), and points\n * an agent at code-defined capabilities without a `.theokit/skills/<name>/SKILL.md`. Like file\n * skills, its `name` + `description` surface in the `<skills>` system-prompt block; its\n * `instructions` (the body) travel on the object for the consumer (the SDK injects name+description,\n * not bodies — inline and file skills are symmetric there). Inline skills override file skills on a\n * name conflict (mirrors the subagents-loader precedent).\n */\nimport type { Skill as SkillShape } from \"./internal/runtime/skills/discover-skills.js\";\n\n/** A code-defined skill (from {@link createSkill}) — a {@link Skill} plus its inline body. */\nexport interface InlineSkill extends SkillShape {\n /** The skill body/instructions (inline skills carry it here instead of a SKILL.md file). */\n instructions: string;\n /**\n * SE21 — supporting documents bundled with the skill (filename → content),\n * mirroring a filesystem skill's `references/` directory. Surfaced to the app\n * via `agent.skills.get(name)`; not injected into the model prompt.\n */\n references?: Record<string, string>;\n}\n\n/** Spec accepted by {@link createSkill}. */\nexport interface CreateSkillSpec {\n name: string;\n description: string;\n instructions: string;\n category?: string;\n dependencies?: string[];\n /** SE21 — supporting documents (filename → content), like a filesystem skill's `references/`. */\n references?: Record<string, string>;\n}\n\n/**\n * Build an {@link InlineSkill} from a code spec. Fails fast on an empty `name`/`description`\n * (error-handling.md). The synthetic `source` (`inline://<name>`) marks it as file-less.\n */\nfunction createSkill(spec: CreateSkillSpec): InlineSkill {\n if (!spec.name) throw new Error(\"createSkill: `name` is required.\");\n if (!spec.description) throw new Error(\"createSkill: `description` is required.\");\n return {\n name: spec.name,\n description: spec.description,\n source: `inline://${spec.name}`,\n instructions: spec.instructions,\n ...(spec.category !== undefined ? { category: spec.category } : {}),\n ...(spec.dependencies !== undefined ? { dependencies: spec.dependencies } : {}),\n ...(spec.references !== undefined ? { references: spec.references } : {}),\n };\n}\n\n/** SE36 — `Skill.create` replaces `createSkill` (ADR 0015). @public */\nexport class Skill {\n private constructor() {}\n static create(spec: CreateSkillSpec): InlineSkill {\n return createSkill(spec);\n }\n}\n","import { parseModelId } from \"./internal/llm/model-identifier.js\";\nimport type { Plugin } from \"./internal/plugins/types.js\";\nimport { registerBuiltins } from \"./internal/providers/builtin/index.js\";\nimport { listProviders } from \"./internal/providers/registry.js\";\nimport type { ProviderProfile } from \"./internal/providers/types.js\";\n\n/**\n * Options for {@link defineProvider}.\n *\n * @public\n */\nexport interface DefineProviderOptions {\n /** Plugin version surfaced in diagnostics. Default `\"1.0.0\"`. */\n version?: string;\n}\n\n/**\n * Canonical factory for a custom LLM provider, mirroring {@link defineTool} and\n * {@link definePlugin} (Inviolable Rule 9 — every agentic capability ships as a\n * factory function).\n *\n * A {@link ProviderProfile} is data-only: it declares the provider name, the\n * HTTP dialect (`apiMode`), auth, base URL and fallback models. The transport\n * is selected from `apiMode` by the router, so any OpenAI-/Anthropic-compatible\n * endpoint (Groq, Together, Fireworks, a private gateway) is expressible as a\n * profile with no new code.\n *\n * Pass the result to `Agent.create({ plugins: [...] })` and route to it with\n * the `provider/model` id prefix or `providers.routes`:\n *\n * ```ts\n * const groq = defineProvider({\n * name: \"groq\",\n * apiMode: \"chat_completions\",\n * authType: \"api_key\",\n * envVars: [\"GROQ_API_KEY\"],\n * baseUrl: \"https://api.groq.com/openai/v1\",\n * fallbackModels: [\"groq/llama-3.1-8b-instant\"],\n * });\n * const agent = await Agent.create({\n * model: { id: \"groq/llama-3.1-8b-instant\" },\n * plugins: [groq],\n * });\n * ```\n *\n * @public\n */\nfunction defineProvider(profile: ProviderProfile, opts?: DefineProviderOptions): Plugin {\n return {\n name: profile.name,\n version: opts?.version ?? \"1.0.0\",\n kind: \"model-provider\",\n profile,\n };\n}\n\n/** SE36 — uniform namespace API. `Provider.create` replaces `defineProvider` (ADR 0015). @public */\nexport class Provider {\n private constructor() {}\n static create(profile: ProviderProfile, opts?: DefineProviderOptions): Plugin {\n return defineProvider(profile, opts);\n }\n\n /**\n * Every first-party builtin provider (anthropic, openai, openrouter, gemini, ollama, the ChatGPT/Codex\n * `openai-chatgpt`, …) as model-provider plugins, ready to hand to `Agent.create({ plugins })` or any\n * runtime that consumes model-provider plugins (e.g. the `theokit` agent server / `@theokit/agents`, whose\n * own model resolution does NOT share this registry). Enables a consumer to route to ANY SDK builtin —\n * including one added later in a single SDK file — with ZERO provider-specific code: just\n * `.plugins(Provider.builtins())` once, then pick a `provider/model` id. @public\n */\n static builtins(): Plugin[] {\n registerBuiltins();\n return listProviders().map((profile) => defineProvider(profile));\n }\n\n /**\n * O builtin que atende `modelId`, ou `undefined` quando nenhum atende.\n *\n * A gramática de um id de modelo — `provider/modelo` — passa a ter **um** dono. M94: o consumidor\n * a refazia à mão com `modelId.slice(0, modelId.indexOf('/'))`, que num id **sem barra** devolve o\n * id menos o último caractere (`claude-opus-5` → `claude-opus-`): casa provider nenhum e o\n * chamador seguia para o default, sem distinguir isso de um acerto. Um modelo não-roteável era\n * indistinguível do caminho feliz.\n *\n * Devolve `undefined` em vez de lançar: quem decide se a ausência é erro é o chamador, e só ele\n * sabe se o modelo veio de um `--model` explícito (erro) ou do default (normal).\n *\n * @public\n */\n static forModel(modelId: string): Plugin | undefined {\n // Delega ao `parseModelId`, que é o dono canônico da gramática — o DoD do M94 pedia\n // exatamente isso (\"reusando o parser de id do próprio SDK para que a gramática tenha UM\n // dono\") e a primeira versão refez `indexOf`/`slice` inline, reinventando o dono ao lado dele.\n //\n // A revisão adversarial mediu o custo: 7 de 8 divergências. `lm-studio/qwen3` resolve para o\n // builtin real `lmstudio` pelo parser e para NADA pelo slice — e como o consumidor passou a\n // lançar quando não há provider, um comando customizado que funcionava antes do M94 passaria a\n // falhar. `Anthropic/…`, `␣openai/…`, `llama.cpp/…` idem. E o inverso: `openai/` (nome vazio) o\n // parser rejeita e o slice aceitava.\n const { provider } = parseModelId(modelId);\n if (provider === undefined) return undefined;\n return Provider.builtins().find((p) => p.name === provider);\n }\n}\n","/**\n * SE23 — `defineSkillReadTool`: an OPT-IN factory that gives the MODEL on-demand\n * access to a skill's full body + references via a `skill_read` tool.\n *\n * TheoKit discloses skills eagerly through the `<skills>` system-prompt block\n * (name + description only). This factory is the LAZY read path: the consumer\n * explicitly adds the returned {@link CustomTool} to `tools`, and when the model\n * calls it with a skill name, it gets that skill's `instructions` (+ SE21\n * `references`). The SDK NEVER auto-injects it — bring-your-own-tools stays\n * intact (sibling of `defineSubAgent` / `workflowAsTool`). See ADR 0007.\n *\n * import { Agent, createSkill, defineSkillReadTool } from \"@theokit/sdk\";\n *\n * const skills = [createSkill({ name: \"release\", description: \"…\", instructions: \"…\" })];\n * const agent = await Agent.create({\n * model: { id: \"openai/gpt-4o-mini\" },\n * skills: { inline: skills },\n * tools: [defineSkillReadTool(skills)],\n * });\n *\n * @public\n */\n\nimport { z } from \"zod\";\nimport type { InlineSkill } from \"./create-skill.js\";\nimport { toJsonSchema } from \"./internal/zod/to-json-schema.js\";\nimport type { CustomTool } from \"./types/agent.js\";\n\nconst SkillReadInputSchema = z.object({\n name: z.string().min(1, \"skill_read: `name` is required.\"),\n});\n\n/**\n * Render a skill's body (+ references) into a single model-facing string.\n * `skill.name` is expected to be a short identifier-like token (no newlines /\n * Markdown headings) — the consumer controls both the names and the tool, so\n * this is a formatting assumption, not a trust boundary.\n */\nfunction renderSkill(skill: InlineSkill): string {\n const parts = [`# Skill: ${skill.name}`, \"\", skill.instructions];\n const refs = skill.references;\n if (refs !== undefined && Object.keys(refs).length > 0) {\n parts.push(\"\", \"## References\");\n for (const [file, content] of Object.entries(refs)) {\n parts.push(\"\", `### ${file}`, content);\n }\n }\n return parts.join(\"\\n\");\n}\n\n/**\n * SE23 — build an OPT-IN `skill_read` {@link CustomTool} over the given inline\n * skills. When the model calls it with `{ name }`, the handler returns that\n * skill's body + references. An UNKNOWN (but well-formed) name returns a typed\n * \"not found\" string the model can act on — NOT a throw that kills the run.\n * Malformed input (missing `name`) fails at the trust boundary via the schema.\n *\n * The consumer controls exposure by choosing which skills to pass; the SDK\n * never auto-injects this tool.\n *\n * @public\n */\nfunction defineSkillReadTool(skills: ReadonlyArray<InlineSkill>): CustomTool {\n // Fail fast on duplicate names (Rule 8): a shadowed skill would be silently\n // unreachable and the \"not found\" list would show the name twice. Names are\n // addressed by exact, case-sensitive match — the same identity the <skills>\n // block uses — so a collision is a construction-time error, not a runtime one.\n const seen = new Set<string>();\n for (const skill of skills) {\n if (seen.has(skill.name)) {\n throw new Error(`defineSkillReadTool: duplicate skill name \"${skill.name}\".`);\n }\n seen.add(skill.name);\n }\n return {\n name: \"skill_read\",\n description:\n \"Read a skill's full instructions (and any bundled reference documents) by its name. \" +\n \"Use this to load the body of a skill listed in the <skills> block before acting on it.\",\n inputSchema: toJsonSchema(SkillReadInputSchema),\n handler: (input: Record<string, unknown>): string => {\n const { name } = SkillReadInputSchema.parse(input);\n const skill = skills.find((s) => s.name === name);\n if (skill === undefined) {\n const available = skills.map((s) => s.name).join(\", \");\n return `Skill \"${name}\" not found. Available skills: ${available.length > 0 ? available : \"(none)\"}.`;\n }\n return renderSkill(skill);\n },\n };\n}\n\n/** SE36 — `SkillReadTool.create` replaces `defineSkillReadTool` (ADR 0015). @public */\nexport class SkillReadTool {\n private constructor() {}\n static create(skills: ReadonlyArray<InlineSkill>): CustomTool {\n return defineSkillReadTool(skills);\n }\n}\n","/**\n * `EventBus` — typed EventEmitter wrapper.\n *\n * Provides type-safe publish/subscribe with automatic unsubscribe cleanup.\n * Each handler is try-caught (EC-2) so one failing handler cannot break others.\n */\n\ntype EventHandler<T> = (payload: T) => void;\n\nexport class EventBus<Events extends Record<string, unknown>> {\n private handlers = new Map<keyof Events, Set<EventHandler<never>>>();\n // M3 #64 — a swallowed handler error used to vanish without a trace (fail-loud\n // violation). We now log it AND expose an observable count so ops/tests can see\n // that a subscriber is silently failing, without breaking the EC-2 contract.\n #handlerErrorCount = 0;\n\n /** M3 #64 — number of handler invocations that threw (and were logged). */\n get handlerErrorCount(): number {\n return this.#handlerErrorCount;\n }\n\n /**\n * Subscribe to an event. Returns an unsubscribe function.\n */\n subscribe<K extends keyof Events>(event: K, handler: EventHandler<Events[K]>): () => void {\n if (!this.handlers.has(event)) {\n this.handlers.set(event, new Set());\n }\n const set = this.handlers.get(event)!;\n set.add(handler as EventHandler<never>);\n return () => {\n set.delete(handler as EventHandler<never>);\n };\n }\n\n /**\n * Publish an event to all subscribers. EC-2: try-catch per handler.\n */\n publish<K extends keyof Events>(event: K, payload: Events[K]): void {\n const set = this.handlers.get(event);\n if (!set) return;\n for (const handler of set) {\n try {\n (handler as EventHandler<Events[K]>)(payload);\n } catch (cause) {\n // EC-2: an error in one handler MUST NOT break the others — but M3 #64\n // makes it fail-loud: log with the event key + message and count it,\n // instead of the pre-M3 empty catch that discarded it without a trace.\n this.#handlerErrorCount += 1;\n const message = cause instanceof Error ? cause.message : String(cause);\n process.stderr.write(\n `[theokit-sdk] event-bus: handler for \"${String(event)}\" threw: ${message}\\n`,\n );\n }\n }\n }\n\n /**\n * Subscribe to an event for a single firing. Returns an unsubscribe function.\n */\n once<K extends keyof Events>(event: K, handler: EventHandler<Events[K]>): () => void {\n const wrapped: EventHandler<Events[K]> = (payload) => {\n unsub();\n handler(payload);\n };\n const unsub = this.subscribe(event, wrapped);\n return unsub;\n }\n}\n","/**\n * M56 (agent-builder goal transparency) — PUBLIC goal-loop driver for CUSTOM agent surfaces.\n *\n * `LocalAgent.runUntil` binds the goal loop to a registered local agent. Surfaces that route turns\n * through their OWN transport (e.g. a TUI store facade, so every goal turn renders in the same\n * timeline as a manual turn) need the SAME loop over a minimal `send → wait` shape. This export\n * gives them exactly that: the canonical `runUntilImpl` (judge + continuation + token budget +\n * Codex states) with the default judge wired from the DI registry.\n *\n * @public\n */\n\nimport type { JudgeContext, JudgeOptions } from \"./internal/judge/judge-call.js\";\nimport type { RunUntilDeps } from \"./internal/runtime/lifecycle/run-until.js\";\nimport type { SDKAgent } from \"./types/agent.js\";\n\n/**\n * Stable marker on the FIRST LINE of every goal-continuation prompt. Surfaces detect it to render the\n * turn collapsed, exclude it from backtrack windows, and skip it in compaction preservation.\n */\nexport { GOAL_CONTINUATION_MARKER } from \"./internal/runtime/lifecycle/goal-marker.js\";\n\nimport type { GoalEvent, GoalOptions, GoalResult } from \"./types/goal-events.js\";\n\n/** The minimal surface the goal loop drives — anything that can send a prompt and wait for it. */\nexport interface GoalLoopAgent {\n send(prompt: string): Promise<{\n wait(): Promise<{ result?: string; usage?: { totalTokens?: number } }>;\n }>;\n}\n\n/**\n * Run the goal-driven loop (`send → judge → continuation`) over ANY `send → wait` surface.\n * Identical semantics to `Agent.runUntil` (ADRs D115-D121 + M55 token budget / states).\n * `depsOverride` is a test seam for injecting a fake judge.\n */\nexport function runGoalLoop(\n agent: GoalLoopAgent,\n goal: string,\n options?: GoalOptions,\n depsOverride?: RunUntilDeps,\n): AsyncGenerator<GoalEvent, GoalResult, void> {\n async function* wrap(): AsyncGenerator<GoalEvent, GoalResult, void> {\n const { runUntilImpl } = await import(\"./internal/runtime/lifecycle/run-until.js\");\n const deps: RunUntilDeps =\n depsOverride ??\n (await (async () => {\n const { judgeCallImpl } = await import(\"./internal/judge/judge-call.js\");\n const { getAgentFacade } = await import(\n \"./internal/runtime/registry/agent-factory-registry.js\"\n );\n const create = getAgentFacade().create;\n return {\n judge: (ctx: JudgeContext, opts?: JudgeOptions) => judgeCallImpl(ctx, opts, { create }),\n };\n })());\n // runUntilImpl only touches `agent.send(...)` → `run.wait()` — the SDKAgent cast is safe for\n // any GoalLoopAgent (structural subset).\n return yield* runUntilImpl(agent as unknown as SDKAgent, goal, options, deps);\n }\n return wrap();\n}\n","/**\n * Reference `BudgetTracker` impl — pure token + iteration counter\n * (SDK 2.0 Phase 2 / T2.1 — ADR D1 reference implementation).\n *\n * Counts tokens per type (input/output) + iteration count. Enforces\n * optional `maxTokens` / `maxIterations` ceilings via `check()`.\n *\n * Does NOT compute USD cost — leaves that to richer impls in\n * `@theokit/sdk-budget` (post-Phase-2). This file is intentionally\n * minimal so consumers can:\n * - use it as-is for simple guard-rails;\n * - read it as a worked example before authoring a custom tracker;\n * - rely on it as a fallback before sdk-budget ships.\n *\n * @public — surface-level reference impl.\n */\n\nimport type {\n BudgetCheck,\n BudgetTotal,\n BudgetTracker,\n BudgetUsageEvent,\n} from \"./budget-tracker.js\";\n\n/** Options for `createCounterBudgetTracker`. */\nexport interface CounterBudgetTrackerOptions {\n /** Hard ceiling on total tokens (input + output). When reached, `check()` returns `allowed: false`. */\n readonly maxTokens?: number;\n /** Hard ceiling on iterations counted by `nextIteration()`. */\n readonly maxIterations?: number;\n}\n\n/**\n * Build a fresh tracker. The returned object is independent — call\n * `createCounterBudgetTracker()` per Agent instance.\n *\n * The tracker exposes the `BudgetTracker` contract PLUS a `nextIteration()`\n * helper for impls that want explicit iteration counting (the agent loop\n * calls it once per turn). Without `nextIteration()` calls, the iteration\n * cap is never reached.\n */\nexport function createCounterBudgetTracker(\n options: CounterBudgetTrackerOptions = {},\n): BudgetTracker & { nextIteration(): void } {\n let totalTokens = 0;\n let iterations = 0;\n const maxTokens = options.maxTokens;\n const maxIterations = options.maxIterations;\n\n return {\n track(event: BudgetUsageEvent): void {\n // `track()` MUST be synchronous and non-throwing per the contract.\n // Invalid events (negative tokens) are silently clamped.\n const t = Number.isFinite(event.tokens) && event.tokens > 0 ? event.tokens : 0;\n totalTokens += t;\n },\n\n check(): BudgetCheck {\n if (maxTokens !== undefined && totalTokens >= maxTokens) {\n return {\n allowed: false,\n reason: \"token_limit\",\n detail: `${totalTokens} >= maxTokens ${maxTokens}`,\n };\n }\n if (maxIterations !== undefined && iterations >= maxIterations) {\n return {\n allowed: false,\n reason: \"iteration_limit\",\n detail: `${iterations} >= maxIterations ${maxIterations}`,\n };\n }\n return { allowed: true };\n },\n\n getTotal(): BudgetTotal {\n return { tokens: totalTokens, iterations };\n },\n\n nextIteration(): void {\n iterations += 1;\n },\n };\n}\n","/**\n * Plugin contract — RUNTIME value + type re-exports (T1.1, ADRs D97-D101).\n *\n * SE45/SE46 — the pure `Plugin` *type* and its type companions now live in\n * `types/plugin.ts` (above the DIP boundary, because `Plugin` is public\n * contract). This module keeps the RUNTIME value (`definePlugin` /\n * `Plugin.create`) and re-exports the types so every existing\n * `../plugins/types.js` importer (and the `index.ts` barrel) resolves the same\n * names unchanged.\n *\n * @public\n */\n\nimport type { Plugin as PluginType } from \"../../types/plugin.js\";\n\nexport type {\n CommandHandler,\n CommandOptions,\n HookHandler,\n HookName,\n LlmCallContext,\n // `MemoryProviderFactory` is @internal; re-exporting it across this module hop\n // trips rollup-plugin-dts (it strips @internal decls, then the re-export dangles\n // — see stripInternal in tsconfig.base.json). Its two internal consumers import\n // it directly from ../../types/plugin.js instead. It stays reachable as the\n // `createProvider` field type on the `Plugin` union, which IS re-exported here.\n PluginContext,\n PostAssistantReplyContext,\n PostToolCallContext,\n PreToolCallContext,\n PreToolCallDecision,\n PreUserSendContext,\n PreUserSendResult,\n SessionLifecycleContext,\n ToolCallSummary,\n ToolContext,\n ToolResultTransformContext,\n TransformContext,\n} from \"../../types/plugin.js\";\n\n// Re-establish the declaration merge locally: `Plugin` is BOTH the discriminated\n// union *type* (aliased from ./types/plugin.js) AND the runtime const-companion\n// (`Plugin.create`) declared below. Keeping both bindings under the one exported\n// name `Plugin` preserves the public value+type surface byte-for-byte.\nexport type Plugin = PluginType;\n\n/**\n * Identity helper for plugin authors. TS-only convenience — preserves\n * inferred type without forcing manual `Plugin` annotation.\n *\n * @public\n */\nexport function definePlugin<P extends Plugin>(p: P): P {\n return p;\n}\n\n/** SE36 — `Plugin.create` replaces `definePlugin` (ADR 0015). Const-companion (the `Plugin` type alias blocks a class of the same name); `create` is the generic `definePlugin`. @public */\nexport const Plugin = { create: definePlugin };\n","/**\n * Reference `MemoryProvider` impl — no-op fallback (SDK 2.0 Phase 1 /\n * T1.2 reference implementation, mirrors `createCounterBudgetTracker`).\n *\n * Every method is a degenerate identity:\n * - `init()` returns a handle wrapping a no-op `MemoryAdapter`.\n * - `buildTools()` returns `[]` (no memory tools surfaced to the LLM).\n * - `runActivePass()` returns `{ facts: [] }` (no recall fires).\n * - `dispose()` is a no-op.\n *\n * Why ship this:\n * - Default safety net before `@theokit/sdk-memory` is installed.\n * - Worked reference for authors of custom providers.\n * - Enables `Agent.create({ memoryProvider: createNoopMemoryProvider() })`\n * unit tests without pulling memory infrastructure.\n *\n * NOT a substitute for the existing `Memory` class — the legacy class\n * stays authoritative until the subsystem fully ports to providers\n * (Phase 1 / T1.6).\n *\n * @public — surface-level reference impl.\n */\n\nimport type {\n MemoryAdapter,\n MemoryAdapterCapabilities,\n MemoryContext,\n MemoryFact,\n MemoryId,\n MemoryTurnMessage,\n} from \"../../../types/memory-adapter.js\";\nimport type {\n ActiveMemoryPassArgs,\n ActiveMemoryPassResult,\n MemoryProvider,\n MemoryProviderHandle,\n MemoryProviderInitOptions,\n} from \"./memory-provider.js\";\n\n/** Adapter-id used by the no-op MemoryAdapter — namespaced to avoid collision. */\nconst NOOP_ADAPTER_ID = \"noop\";\n\n/** All-false capabilities — every optional feature gated off. */\nconst NOOP_CAPABILITIES: MemoryAdapterCapabilities = {\n history: false,\n sessions: false,\n tenancy: false,\n reasoning: false,\n toolSchemas: false,\n prefetch: false,\n};\n\n/** Build the no-op MemoryAdapter satisfying the public contract. */\nfunction createNoopMemoryAdapter(): MemoryAdapter {\n return {\n id: NOOP_ADAPTER_ID,\n capabilities: NOOP_CAPABILITIES,\n isAvailable(): boolean {\n return true;\n },\n async write(_content: string | MemoryTurnMessage[], _ctx: MemoryContext): Promise<MemoryId> {\n // Return a deterministic noop id with the adapter-id prefix so\n // `extractRawId` cross-adapter safety check still works.\n return `${NOOP_ADAPTER_ID}:noop` as MemoryId;\n },\n async recall(_query: string, _ctx: MemoryContext, _k?: number): Promise<MemoryFact[]> {\n return [];\n },\n async delete(_id: MemoryId): Promise<void> {\n return;\n },\n };\n}\n\n/**\n * Build a fresh no-op MemoryProvider. The returned object is independent —\n * call `createNoopMemoryProvider()` per Agent instance. `init()` is\n * idempotent: subsequent calls return a NEW handle (no per-agent cache —\n * the no-op has no state worth caching).\n */\nexport function createNoopMemoryProvider(): MemoryProvider {\n return {\n async init(_opts: MemoryProviderInitOptions): Promise<MemoryProviderHandle> {\n return {\n adapter: createNoopMemoryAdapter(),\n };\n },\n buildTools(_handle: MemoryProviderHandle): readonly never[] {\n return [];\n },\n async runActivePass(\n _handle: MemoryProviderHandle,\n _args: ActiveMemoryPassArgs,\n ): Promise<ActiveMemoryPassResult> {\n return { facts: [] };\n },\n recordSessionSummary(): void {\n // No-op: the no-op provider doesn't persist anything. Defining the\n // method (vs leaving it undefined) is intentional — when consumers\n // wire the no-op explicitly, they OPT INTO the port path for the\n // session-summary write site too. Future rich impls override this\n // with real disk writes.\n return;\n },\n dispose(_handle: MemoryProviderHandle): void {\n return;\n },\n };\n}\n\n/** SE36 — `NoopMemoryProvider.create` replaces `createNoopMemoryProvider` (ADR 0015). @public */\nexport class NoopMemoryProvider {\n private constructor() {}\n static create(): MemoryProvider {\n return createNoopMemoryProvider();\n }\n}\n","/**\n * `JobQueue` — background job queue with status tracking, cancellation, and an\n * optional concurrency bound.\n *\n * EC-1: all enqueued functions are wrapped in Promise.resolve().then() so\n * synchronous throws become rejections.\n *\n * #58: each job runs under an `AbortController` whose signal is passed to the\n * job fn, so `cancel()` actually interrupts a running job (not just a status\n * flip); an optional `maxConcurrency` bounds how many jobs run at once.\n */\n\nimport { randomUUID } from \"node:crypto\";\n\ntype JobStatus = \"pending\" | \"running\" | \"completed\" | \"failed\" | \"cancelled\";\n\ninterface Job<T> {\n id: string;\n status: JobStatus;\n result?: T;\n error?: string;\n}\n\n/** #58 — construction options. */\nexport interface JobQueueOptions {\n /**\n * Max jobs running concurrently. Omit for unbounded (previous behavior).\n * Values < 1 are clamped to 1 (an invalid bound must not deadlock).\n */\n maxConcurrency?: number;\n}\n\nexport class JobQueue {\n private jobs = new Map<string, Job<unknown>>();\n private controllers = new Map<string, AbortController>();\n private readonly maxConcurrency: number;\n private running = 0;\n private readonly waiting: Array<() => void> = [];\n\n constructor(options: JobQueueOptions = {}) {\n this.maxConcurrency =\n options.maxConcurrency === undefined\n ? Number.POSITIVE_INFINITY\n : Math.max(1, options.maxConcurrency);\n }\n\n /**\n * Enqueue a background function. Returns the job ID immediately. The function\n * receives an `AbortSignal` that fires when the job is cancelled (#58) — a\n * cooperative job should observe it to stop early. Existing `() => Promise<T>`\n * callers are unaffected (the signal argument is simply ignored).\n */\n enqueue<T>(fn: (signal: AbortSignal) => Promise<T>): string {\n const id = randomUUID();\n const job: Job<T> = { id, status: \"pending\" };\n this.jobs.set(id, job as Job<unknown>);\n const controller = new AbortController();\n this.controllers.set(id, controller);\n\n void this.#acquire().then(() => {\n // Cancelled while waiting for a slot → never start.\n if (job.status === \"cancelled\") {\n this.#release(id);\n return;\n }\n job.status = \"running\";\n Promise.resolve()\n .then(() => fn(controller.signal))\n .then((result) => {\n if (job.status === \"cancelled\") return;\n job.result = result;\n job.status = \"completed\";\n })\n .catch((err: unknown) => {\n if (job.status === \"cancelled\") return;\n job.error = err instanceof Error ? err.message : String(err);\n job.status = \"failed\";\n })\n .finally(() => this.#release(id));\n });\n\n return id;\n }\n\n getJob(id: string): Job<unknown> | undefined {\n return this.jobs.get(id);\n }\n\n list(): Job<unknown>[] {\n return [...this.jobs.values()];\n }\n\n /**\n * Cancel a pending or running job. Returns true if cancelled. #58 — aborts the\n * job's `AbortSignal` so a cooperative running job is actually interrupted.\n */\n cancel(id: string): boolean {\n const job = this.jobs.get(id);\n if (!job) return false;\n if (job.status === \"pending\" || job.status === \"running\") {\n const wasRunning = job.status === \"running\";\n job.status = \"cancelled\";\n this.controllers.get(id)?.abort();\n // A running job holds a concurrency slot; its fn may ignore the signal and\n // never settle, so free the slot NOW rather than waiting for `.finally`\n // (which would never fire → the bounded queue would deadlock). `#release`\n // is idempotent, so the job's eventual `.finally` is a no-op. A *pending*\n // job holds no slot yet — its slot-grant self-releases when it starts.\n if (wasRunning) this.#release(id);\n return true;\n }\n return false;\n }\n\n /** Acquire a concurrency slot (resolves immediately when unbounded/free). */\n #acquire(): Promise<void> {\n if (this.running < this.maxConcurrency) {\n this.running += 1;\n return Promise.resolve();\n }\n return new Promise<void>((resolve) => {\n this.waiting.push(() => {\n this.running += 1;\n resolve();\n });\n });\n }\n\n /**\n * Release a slot + clean up the controller; start the next waiting job.\n * Idempotent — keyed on the controller's presence, so a running job that was\n * cancelled (released early) does not double-decrement when its `.finally`\n * eventually fires.\n */\n #release(id: string): void {\n if (!this.controllers.has(id)) return; // already released\n this.controllers.delete(id);\n this.running -= 1;\n const next = this.waiting.shift();\n if (next !== undefined) next();\n }\n}\n","import { createHash } from \"node:crypto\";\nimport { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nimport { replaceFileAtomic } from \"../../persistence/atomic-write.js\";\nimport { memoryDir } from \"../storage/markdown-store.js\";\n\n/**\n * Dream-diary append (ADR D7).\n *\n * Diary lives at `.theokit/memory/dream-diary.md` and grows with one entry\n * per sweep. Each entry is content-hashed so the same input produces the\n * same entry — idempotency contract.\n *\n * Writes go through `replaceFileAtomic` (EC-3 of edge-case review) so a\n * crash mid-write can never leave a half-written diary.\n *\n * @internal\n */\n\nexport interface DiaryEntry {\n timestampMs: number;\n factsBefore: number;\n factsAfter: number;\n duplicatesRemoved: number;\n clustersCreated: number;\n notesWritten: number;\n}\n\nexport function diaryPath(cwd: string): string {\n return join(memoryDir(cwd), \"dream-diary.md\");\n}\n\nexport function renderDiaryEntry(entry: DiaryEntry): string {\n const stamp = new Date(entry.timestampMs).toISOString();\n const hash = entryHash(entry).slice(0, 8);\n return [\n `## ${stamp}`,\n \"\",\n `- entry-hash: ${hash}`,\n `- facts before: ${entry.factsBefore}`,\n `- facts after: ${entry.factsAfter}`,\n `- duplicates removed: ${entry.duplicatesRemoved}`,\n `- clusters created: ${entry.clustersCreated}`,\n `- notes written: ${entry.notesWritten}`,\n \"\",\n ].join(\"\\n\");\n}\n\nexport async function appendDiaryEntry(cwd: string, entry: DiaryEntry): Promise<void> {\n const path = diaryPath(cwd);\n let raw = \"\";\n try {\n raw = await readFile(path, \"utf8\");\n } catch {\n raw = \"# Dream Diary\\n\\n\";\n }\n const next = `${raw.endsWith(\"\\n\") ? raw : `${raw}\\n`}${renderDiaryEntry(entry)}`;\n await replaceFileAtomic(path, next);\n}\n\nexport function entryHash(entry: DiaryEntry): string {\n return createHash(\"sha256\")\n .update(\n [\n entry.factsBefore,\n entry.factsAfter,\n entry.duplicatesRemoved,\n entry.clustersCreated,\n entry.notesWritten,\n ].join(\"|\"),\n )\n .digest(\"hex\");\n}\n","import type { EmbeddingRuntime } from \"../embedding-adapter.js\";\nimport type { MemoryFact } from \"../types.js\";\n\n/**\n * Dreaming/REM phase logic.\n *\n * Three phases:\n * - **light** — drop near-duplicate facts (cosine similarity > 0.95).\n * - **REM** — cluster thematically related facts (cosine ≥ 0.75).\n * - **deep** — pick a representative bullet per cluster (longest text\n * wins) and emit consolidated markdown notes.\n *\n * @internal\n */\n\nexport interface DedupResult {\n kept: MemoryFact[];\n duplicatesRemoved: number;\n}\n\nexport interface Cluster {\n representativeText: string;\n members: ReadonlyArray<MemoryFact>;\n}\n\nexport interface ClusterResult {\n clusters: Cluster[];\n}\n\nconst DEFAULT_DEDUP_THRESHOLD = 0.95;\nconst DEFAULT_CLUSTER_THRESHOLD = 0.75;\n\n/** Light phase — drop facts whose embedding is too similar to one already kept. */\nexport async function lightPhase(\n facts: ReadonlyArray<MemoryFact>,\n embedding: EmbeddingRuntime,\n threshold: number = DEFAULT_DEDUP_THRESHOLD,\n): Promise<DedupResult> {\n if (facts.length <= 1) return { kept: [...facts], duplicatesRemoved: 0 };\n const vectors = await embedding.embed(facts.map((f) => f.text));\n const keptIdx: number[] = [];\n const keptVecs: number[][] = [];\n for (let i = 0; i < facts.length; i++) {\n const vec = vectors[i] ?? [];\n const isDup = keptVecs.some((kept) => cosineSimilarity(vec, kept) >= threshold);\n if (isDup) continue;\n keptIdx.push(i);\n keptVecs.push(vec);\n }\n const kept = keptIdx.map((i) => facts[i] as MemoryFact);\n return { kept, duplicatesRemoved: facts.length - kept.length };\n}\n\n// T4.6 — cap facts per sweep to prevent O(N²) blowup. 500 facts →\n// 125K comparisons (acceptable). 5000 facts → 12.5M (unacceptable).\n// When facts exceed the cap, a deterministic subsample is taken so the\n// sweep is bounded. The remaining facts are carried to the next sweep.\nconst DEFAULT_MAX_FACTS_PER_SWEEP = 500;\n\n/** REM phase — single-link agglomerative clustering by cosine similarity. */\nexport async function remPhase(\n facts: ReadonlyArray<MemoryFact>,\n embedding: EmbeddingRuntime,\n threshold: number = DEFAULT_CLUSTER_THRESHOLD,\n maxFactsPerSweep: number = DEFAULT_MAX_FACTS_PER_SWEEP,\n): Promise<ClusterResult> {\n if (facts.length === 0) return { clusters: [] };\n // T4.6 — cap: subsample when facts exceed budget. Deterministic\n // sort by text hash so the same input always picks the same subset.\n const capped = facts.length > maxFactsPerSweep ? facts.slice(0, maxFactsPerSweep) : facts;\n const vectors = await embedding.embed(capped.map((f) => f.text));\n const clusterOfIdx = unionFindByPairs(vectors, threshold);\n const groups = bucketFactsByClusterRoot(capped, clusterOfIdx);\n return { clusters: [...groups.values()].map(buildClusterFromMembers) };\n}\n\nfunction unionFindByPairs(\n vectors: ReadonlyArray<ReadonlyArray<number>>,\n threshold: number,\n): number[] {\n const clusterOfIdx = vectors.map((_, i) => i);\n for (let i = 0; i < vectors.length; i++) {\n for (let j = i + 1; j < vectors.length; j++) {\n if (cosineSimilarity(vectors[i] ?? [], vectors[j] ?? []) >= threshold) {\n unifyClusters(clusterOfIdx, i, j);\n }\n }\n }\n return clusterOfIdx;\n}\n\nfunction bucketFactsByClusterRoot(\n facts: ReadonlyArray<MemoryFact>,\n clusterOfIdx: number[],\n): Map<number, MemoryFact[]> {\n const groups = new Map<number, MemoryFact[]>();\n for (let i = 0; i < facts.length; i++) {\n const root = findRoot(clusterOfIdx, i);\n const list = groups.get(root) ?? [];\n list.push(facts[i] as MemoryFact);\n groups.set(root, list);\n }\n return groups;\n}\n\nfunction buildClusterFromMembers(members: ReadonlyArray<MemoryFact>): Cluster {\n const sorted = [...members].sort((a, b) => b.text.length - a.text.length);\n return { representativeText: sorted[0]?.text ?? \"\", members };\n}\n\n/** Deep phase — render consolidated markdown for the dreamed note. */\nexport function deepPhase(clusters: ReadonlyArray<Cluster>, timestampMs: number): string {\n if (clusters.length === 0) return \"\";\n const isoStamp = new Date(timestampMs).toISOString();\n const lines: string[] = [`# Dreamed ${isoStamp}`, \"\"];\n for (let i = 0; i < clusters.length; i++) {\n const c = clusters[i];\n if (c === undefined) continue;\n lines.push(`## Cluster ${i + 1}: ${c.representativeText}`);\n lines.push(\"\");\n for (const member of c.members) lines.push(`- ${member.text}`);\n lines.push(\"\");\n }\n return `${lines.join(\"\\n\")}\\n`;\n}\n\nfunction cosineSimilarity(a: ReadonlyArray<number>, b: ReadonlyArray<number>): number {\n if (a.length === 0 || b.length === 0 || a.length !== b.length) return 0;\n let dot = 0;\n let aNorm = 0;\n let bNorm = 0;\n for (let i = 0; i < a.length; i++) {\n const ai = a[i] ?? 0;\n const bi = b[i] ?? 0;\n dot += ai * bi;\n aNorm += ai * ai;\n bNorm += bi * bi;\n }\n const denom = Math.sqrt(aNorm) * Math.sqrt(bNorm);\n return denom === 0 ? 0 : dot / denom;\n}\n\nfunction findRoot(parents: number[], i: number): number {\n let root = i;\n while (parents[root] !== root) {\n const next = parents[root] ?? root;\n if (next === root) break;\n root = next;\n }\n parents[i] = root;\n return root;\n}\n\nfunction unifyClusters(parents: number[], a: number, b: number): void {\n const rootA = findRoot(parents, a);\n const rootB = findRoot(parents, b);\n if (rootA !== rootB) parents[rootB] = rootA;\n}\n","import { mkdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { diag } from \"../../diagnostics.js\";\nimport { replaceFileAtomic } from \"../../persistence/atomic-write.js\";\nimport { withCwdMutex } from \"../../persistence/cwd-mutex.js\";\nimport type { EmbeddingRuntime } from \"../embedding-adapter.js\";\nimport { memoryDir, readFactsFromMarkdown } from \"../storage/markdown-store.js\";\nimport { appendDiaryEntry } from \"./diary.js\";\nimport { deepPhase, lightPhase, remPhase } from \"./phases.js\";\n\n/**\n * Dreaming sweep orchestrator (ADR D7 of memory-system-peer-project-parity).\n *\n * Phases:\n * 1. **light** — drop near-duplicate facts via cosine similarity.\n * 2. **REM** — cluster thematically related facts.\n * 3. **deep** — write a `notes/dreamed-<ts>.md` per sweep with consolidated\n * clusters; append a diary entry.\n *\n * All file writes go through `replaceFileAtomic` (EC-3) and the entire sweep\n * holds the per-cwd mutex so a `Remember:` append can't race it.\n *\n * @internal\n */\n\nexport interface DreamingOptions {\n cwd: string;\n embedding: EmbeddingRuntime;\n dedupThreshold?: number;\n clusterThreshold?: number;\n /** Test hook — fixed timestamp for the run. */\n now?: () => number;\n}\n\nexport interface DreamingResult {\n status: \"ok\" | \"skipped\" | \"error\";\n factsBefore: number;\n factsAfter: number;\n duplicatesRemoved: number;\n clustersCreated: number;\n notesWritten: number;\n diaryEntryHash: string | undefined;\n}\n\nexport function runDreamingSweep(options: DreamingOptions): Promise<DreamingResult> {\n return withCwdMutex(`dream:${options.cwd}`, () => runInner(options));\n}\n\nasync function runInner(options: DreamingOptions): Promise<DreamingResult> {\n const now = options.now ?? Date.now;\n const timestampMs = now();\n try {\n const facts = await readFactsFromMarkdown(options.cwd);\n if (facts.length === 0) {\n return emptyResult(\"skipped\");\n }\n const dedup = await lightPhase(facts, options.embedding, options.dedupThreshold);\n const rem = await remPhase(dedup.kept, options.embedding, options.clusterThreshold);\n const notesWritten = await writeConsolidatedNotes(options.cwd, rem.clusters, timestampMs);\n const result: DreamingResult = {\n status: \"ok\",\n factsBefore: facts.length,\n factsAfter: dedup.kept.length,\n duplicatesRemoved: dedup.duplicatesRemoved,\n clustersCreated: rem.clusters.length,\n notesWritten,\n diaryEntryHash: undefined,\n };\n await appendDiaryEntry(options.cwd, {\n timestampMs,\n factsBefore: result.factsBefore,\n factsAfter: result.factsAfter,\n duplicatesRemoved: result.duplicatesRemoved,\n clustersCreated: result.clustersCreated,\n notesWritten: result.notesWritten,\n });\n return result;\n } catch (cause) {\n const message = cause instanceof Error ? cause.message : String(cause);\n diag(`[theokit-sdk] dreaming sweep failed: ${message}\\n`);\n return emptyResult(\"error\");\n }\n}\n\nasync function writeConsolidatedNotes(\n cwd: string,\n clusters: ReadonlyArray<{ representativeText: string; members: ReadonlyArray<{ text: string }> }>,\n timestampMs: number,\n): Promise<number> {\n if (clusters.length === 0) return 0;\n const notesDir = join(memoryDir(cwd), \"notes\");\n await mkdir(notesDir, { recursive: true });\n const isoSlug = new Date(timestampMs).toISOString().replace(/[^\\dT]/g, \"-\");\n const file = join(notesDir, `dreamed-${isoSlug}.md`);\n const body = deepPhase(clusters, timestampMs);\n await replaceFileAtomic(file, body);\n return 1;\n}\n\nfunction emptyResult(status: \"skipped\" | \"error\"): DreamingResult {\n return {\n status,\n factsBefore: 0,\n factsAfter: 0,\n duplicatesRemoved: 0,\n clustersCreated: 0,\n notesWritten: 0,\n diaryEntryHash: undefined,\n };\n}\n","/**\n * SDK 2.0 Phase 4 (Stage 4) — Optional peer loader for\n * `@theokit/sdk-memory`.\n *\n * The Memory class public API in `src/memory.ts` keeps its surface\n * stable but routes through sdk-memory when installed. When sdk-memory\n * is NOT installed, methods fall back to sdk-core's legacy\n * `internal/memory/*` implementations — preserving v1.x back-compat.\n *\n * Pattern mirrors sdk-handoff's optional-peer dynamic import: try\n * `await import(\"@theokit/sdk-memory\")` once, cache the result (the\n * module OR `null` for \"definitively missing\"), and let the caller\n * route.\n *\n * Iter 76 (Stage 4 #1): foundation helper for the Memory class\n * delegation refactor. No behavior changes yet — this iter only\n * adds the loader; iter 77+ wires Memory class methods to use it.\n *\n * @internal\n */\n\n/**\n * Minimal structural mirror of the sdk-memory surface this loader\n * exposes to Memory class methods. Keeps the contract pinned even\n * if sdk-memory ships additional exports.\n */\nexport interface SdkMemoryModule {\n /** Mirrors @theokit/sdk-memory's catalog Record. */\n readonly MEMORY_EMBEDDING_ADAPTERS: Readonly<\n Record<\n string,\n {\n readonly id: string;\n readonly defaultModel: string;\n readonly transport: \"local\" | \"remote\";\n // biome-ignore lint/suspicious/noExplicitAny: structural mirror — runtime carries the canonical types\n create(options: any): Promise<any>;\n }\n >\n >;\n\n /** Mirrors @theokit/sdk-memory's runDreamingSweep entrypoint. */\n runDreamingSweep(opts: {\n cwd: string;\n // biome-ignore lint/suspicious/noExplicitAny: structural mirror\n embedding: any;\n dedupThreshold?: number;\n clusterThreshold?: number;\n }): Promise<{\n status: \"ok\" | \"skipped\" | \"error\";\n factsBefore: number;\n factsAfter: number;\n duplicatesRemoved: number;\n clustersCreated: number;\n notesWritten: number;\n }>;\n\n /** Mirrors @theokit/sdk-memory's IndexManager class (static open). */\n readonly IndexManager: {\n open(opts: {\n cwd: string;\n filePath?: string;\n // biome-ignore lint/suspicious/noExplicitAny: structural mirror\n embedding?: any;\n backend?: \"sqlite-vec\" | \"lance\";\n // biome-ignore lint/suspicious/noExplicitAny: structural mirror\n }): Promise<any>;\n };\n\n /** Mirrors @theokit/sdk-memory's migrateSqliteToLance entrypoint (ADR D44). */\n migrateSqliteToLance(opts: {\n cwd: string;\n dryRun?: boolean;\n batchSize?: number;\n logger?: (msg: string) => void;\n }): Promise<{\n countSqlite: number;\n countLance: number;\n validated: boolean;\n sampleComparisons: ReadonlyArray<{ id: string; match: boolean }>;\n lancePath: string;\n committed: boolean;\n }>;\n}\n\nlet cachedAttempt: Promise<SdkMemoryModule | null> | undefined;\nlet forcedAbsentForTests = false;\n\n/**\n * Attempt to load `@theokit/sdk-memory`. Returns the module on\n * success, `null` on definitive absence. Result is memoized so\n * repeated calls during agent runtime don't re-pay the dynamic\n * import cost.\n *\n * @internal\n */\nexport function tryLoadSdkMemoryPeer(): Promise<SdkMemoryModule | null> {\n if (forcedAbsentForTests) return Promise.resolve(null);\n if (cachedAttempt !== undefined) return cachedAttempt;\n cachedAttempt = (async () => {\n try {\n // Dynamic specifier kept opaque so bundlers can't statically\n // resolve sdk-memory and bake it into a bundle that would\n // require the package to exist at install time.\n const spec = \"@theokit/sdk-memory\";\n const mod = (await import(spec)) as unknown as SdkMemoryModule;\n // Sanity: the module must expose the 4 surfaces we route through.\n if (\n typeof mod.runDreamingSweep === \"function\" &&\n mod.MEMORY_EMBEDDING_ADAPTERS !== undefined &&\n mod.IndexManager !== undefined &&\n typeof mod.migrateSqliteToLance === \"function\"\n ) {\n return mod;\n }\n return null;\n } catch {\n return null;\n }\n })();\n return cachedAttempt;\n}\n\n/**\n * Test-only: reset the memoized loader state so an integration test\n * can probe both the \"peer present\" and \"peer absent\" code paths.\n *\n * @internal\n */\nexport function resetSdkMemoryPeerCacheForTests(): void {\n cachedAttempt = undefined;\n forcedAbsentForTests = false;\n}\n\n/**\n * Test-only: force the loader to behave as if sdk-memory is NOT\n * installed, even when the workspace setup makes it resolvable. Lets\n * tests exercise the legacy fallback code path inside sdk-core's\n * Memory class methods + migrate wrapper without uninstalling the\n * peer.\n *\n * Pair with `resetSdkMemoryPeerCacheForTests()` in afterEach to undo.\n *\n * @internal\n */\nexport function forceSdkMemoryPeerAbsentForTests(): void {\n cachedAttempt = undefined;\n forcedAbsentForTests = true;\n}\n","import { MEMORY_EMBEDDING_ADAPTERS } from \"./internal/memory/adapters/catalog.js\";\nimport { runDreamingSweep as runDreamingSweepInternal } from \"./internal/memory/dreaming/run.js\";\nimport { tryLoadSdkMemoryPeer } from \"./internal/memory/sdk-memory-peer-loader.js\";\n\n/**\n * Public handle to an open memory index. Mirrors the internal `MemoryIndex`\n * contract structurally; defined here (NOT re-exported from internal/) so\n * the public DTS surface does not pull the internal/runtime cycle that\n * trips rollup-plugin-dts.\n *\n * @public\n */\nexport interface MemoryIndexHandle {\n sync(): Promise<{\n filesScanned: number;\n filesUpdated: number;\n chunksWritten: number;\n chunksEmbedded: number;\n }>;\n search(\n query: string,\n options?: {\n maxResults?: number;\n minScore?: number;\n sources?: ReadonlyArray<\"memory\" | \"sessions\" | \"wiki\">;\n },\n ): Promise<\n ReadonlyArray<{\n path: string;\n startLine: number;\n endLine: number;\n score: number;\n textScore: number;\n vectorScore?: number;\n snippet: string;\n source: \"memory\" | \"sessions\" | \"wiki\";\n citation: string;\n }>\n >;\n status(): {\n backend: \"fts-only\" | \"hybrid\";\n filesIndexed: number;\n chunksIndexed: number;\n lastSyncMs?: number;\n };\n close(): Promise<void> | void;\n}\n\n/**\n * Public `Memory` namespace.\n *\n * Exposes operations users can run outside of `agent.send()` — most notably\n * the dreaming sweep (consolidation of facts via dedup + clustering).\n *\n * @public\n */\n\nexport interface DreamingSweepOptions {\n /** Workspace cwd holding `.theokit/memory/`. */\n cwd: string;\n /**\n * Embedding provider for semantic dedup + clustering. Required — dreaming\n * relies on real embeddings to score cosine similarity. Supported providers:\n * `\"openai\"`, `\"mistral\"`, `\"openrouter\"`, `\"voyage\"`, `\"deepinfra\"`,\n * `\"ollama\"` (local, ADR D183).\n */\n embedding: {\n provider: \"openai\" | \"mistral\" | \"openrouter\" | \"voyage\" | \"deepinfra\" | \"ollama\";\n model?: string;\n };\n /** Cosine-similarity threshold for the dedup phase. Default `0.95`. */\n dedupThreshold?: number;\n /** Cosine-similarity threshold for the clustering phase. Default `0.75`. */\n clusterThreshold?: number;\n}\n\nexport interface DreamingSweepResult {\n status: \"ok\" | \"skipped\" | \"error\";\n factsBefore: number;\n factsAfter: number;\n duplicatesRemoved: number;\n clustersCreated: number;\n notesWritten: number;\n}\n\n/**\n * Options for `Memory.openIndex`. Mirrors the internal `OpenIndexOptions`\n * but using only public types from the SDK surface.\n *\n * @public\n */\nexport interface OpenMemoryIndexOptions {\n /** Workspace cwd holding `.theokit/memory/`. */\n cwd: string;\n /** Override storage file path (SQLite) OR storage directory (Lance). */\n filePath?: string;\n /**\n * Embedding runtime — REQUIRED for `backend: \"lance\"`, optional for\n * `\"sqlite-vec\"` (when omitted, SQLite runs FTS-only without vector\n * recall).\n */\n embedding?: {\n provider: \"openai\" | \"mistral\" | \"openrouter\" | \"voyage\" | \"deepinfra\" | \"ollama\";\n model?: string;\n };\n /** Default `\"sqlite-vec\"`. Set to `\"lance\"` to opt into LanceDB (peer dep). */\n backend?: \"sqlite-vec\" | \"lance\";\n}\n\nexport const Memory = {\n /**\n * Open a memory index. Dispatches to SQLite-vec (default, zero deps) or\n * LanceDB (opt-in via `backend: \"lance\"`, requires `@lancedb/lancedb`\n * peer dep + an embedding runtime).\n *\n * Returns a `MemoryIndex` with `sync()`, `search(query, opts?)`,\n * `status()`, and `close()`. Use this when you want a direct index\n * handle outside of `Agent.create({ memory: ... })`.\n *\n * @throws ConfigurationError({code:\"invalid_memory_backend\"}) for typos\n * like `\"lancedb\"`.\n * @throws ConfigurationError({code:\"lance_requires_embedding\"}) when\n * `backend: \"lance\"` is requested without `embedding`.\n * @throws ConfigurationError({code:\"lance_backend_unavailable\"}) when\n * `backend: \"lance\"` is requested but the peer dep is absent.\n *\n * @public\n */\n async openIndex(opts: OpenMemoryIndexOptions): Promise<MemoryIndexHandle> {\n // SDK 2.0 Phase 4 (Stage 4, iter 77): if @theokit/sdk-memory is\n // installed, route through it. Otherwise fall back to the legacy\n // internal path. Behavior + thrown errors are byte-equivalent\n // because sdk-memory's IndexManager + MEMORY_EMBEDDING_ADAPTERS\n // are hybrid copies of sdk-core's internals (iter 44-75).\n const peer = await tryLoadSdkMemoryPeer();\n const openArgs = buildIndexOpenArgs(opts, undefined);\n if (peer !== null) {\n openArgs.embedding = await resolveEmbedding(opts.embedding, peer.MEMORY_EMBEDDING_ADAPTERS);\n // biome-ignore lint/suspicious/noExplicitAny: peer is dynamically loaded — structural compat ensured by sdk-memory\n return (await peer.IndexManager.open(openArgs as any)) as MemoryIndexHandle;\n }\n // Fallback path — sdk-memory peer absent; use the internal\n // implementation (v1.x behavior preserved).\n // Lazy import to avoid pulling internal/runtime types into the public\n // DTS surface (rollup-plugin-dts trips on a pre-existing cycle in\n // types/agent.ts ↔ fork-agent.ts when reached transitively).\n const { IndexManager } = await import(\"./internal/memory/index-manager.js\");\n openArgs.embedding = await resolveEmbedding(opts.embedding, MEMORY_EMBEDDING_ADAPTERS);\n // Cast: structural-compat (internal MemoryIndex matches MemoryIndexHandle).\n // biome-ignore lint/suspicious/noExplicitAny: embedding is resolved from the same catalog — types match at runtime\n return (await IndexManager.open(openArgs as any)) as MemoryIndexHandle;\n },\n\n /**\n * Run a dreaming sweep: dedup near-duplicate facts, cluster thematically\n * related ones, and write a consolidated note + diary entry.\n *\n * @public\n */\n async runDreamingSweep(opts: DreamingSweepOptions): Promise<DreamingSweepResult> {\n // SDK 2.0 Phase 4 (Stage 4, iter 77): route through sdk-memory\n // when installed; fall back to legacy internal/ path otherwise.\n const peer = await tryLoadSdkMemoryPeer();\n const catalog = peer !== null ? peer.MEMORY_EMBEDDING_ADAPTERS : MEMORY_EMBEDDING_ADAPTERS;\n const sweepArgs = await buildDreamingSweepArgs(opts, catalog);\n const result =\n peer !== null\n ? // biome-ignore lint/suspicious/noExplicitAny: peer is dynamically loaded — structural compat ensured by sdk-memory\n await peer.runDreamingSweep(sweepArgs as any)\n : // biome-ignore lint/suspicious/noExplicitAny: legacy path accepts the same shape\n await runDreamingSweepInternal(sweepArgs as any);\n return toDreamingSweepResult(result);\n },\n};\n\n// ---------------------------------------------------------------------------\n// Internal helpers — deduplicate patterns shared across peer + legacy paths.\n// ---------------------------------------------------------------------------\n\n/** Catalog shape shared between sdk-memory peer and local MEMORY_EMBEDDING_ADAPTERS. */\ninterface EmbeddingCatalog {\n [provider: string]: { create(opts: Record<string, unknown>): Promise<unknown> } | undefined;\n}\n\n/**\n * Resolve an embedding runtime from a provider catalog. Throws the canonical\n * \"Unknown embedding provider\" error when the provider is not in the catalog.\n */\nasync function resolveEmbedding(\n embeddingOpts: { provider: string; model?: string } | undefined,\n catalog: EmbeddingCatalog,\n): Promise<unknown> {\n if (embeddingOpts === undefined) return undefined;\n const adapter = catalog[embeddingOpts.provider];\n if (adapter === undefined) {\n throw new Error(\n `Unknown embedding provider \"${embeddingOpts.provider}\". Supported: ${Object.keys(catalog).join(\", \")}.`,\n );\n }\n return adapter.create(embeddingOpts.model !== undefined ? { model: embeddingOpts.model } : {});\n}\n\ninterface IndexOpenArgs {\n cwd: string;\n filePath?: string;\n embedding?: unknown;\n backend?: \"sqlite-vec\" | \"lance\";\n}\n\n/** Build the args object for IndexManager.open from user-facing options. */\nfunction buildIndexOpenArgs(opts: OpenMemoryIndexOptions, embedding: unknown): IndexOpenArgs {\n return {\n cwd: opts.cwd,\n ...(opts.filePath !== undefined ? { filePath: opts.filePath } : {}),\n ...(embedding !== undefined ? { embedding } : {}),\n ...(opts.backend !== undefined ? { backend: opts.backend } : {}),\n };\n}\n\ninterface DreamingSweepArgs {\n cwd: string;\n embedding: unknown;\n dedupThreshold?: number;\n clusterThreshold?: number;\n}\n\n/** Build args for runDreamingSweep from user-facing options + resolved embedding. */\nasync function buildDreamingSweepArgs(\n opts: DreamingSweepOptions,\n catalog: EmbeddingCatalog,\n): Promise<DreamingSweepArgs> {\n const runtime = await resolveEmbedding(opts.embedding, catalog);\n return {\n cwd: opts.cwd,\n embedding: runtime,\n ...(opts.dedupThreshold !== undefined ? { dedupThreshold: opts.dedupThreshold } : {}),\n ...(opts.clusterThreshold !== undefined ? { clusterThreshold: opts.clusterThreshold } : {}),\n };\n}\n\n/** Normalize a raw dreaming sweep result into the public DreamingSweepResult shape. */\nfunction toDreamingSweepResult(result: {\n status: string;\n factsBefore: number;\n factsAfter: number;\n duplicatesRemoved: number;\n clustersCreated: number;\n notesWritten: number;\n}): DreamingSweepResult {\n return {\n status: result.status as DreamingSweepResult[\"status\"],\n factsBefore: result.factsBefore,\n factsAfter: result.factsAfter,\n duplicatesRemoved: result.duplicatesRemoved,\n clustersCreated: result.clustersCreated,\n notesWritten: result.notesWritten,\n };\n}\n","/**\n * Runtime helpers for `MemoryAdapter` (T1.1, ADR D141).\n *\n * Kept separate from `types/memory-adapter.ts` so the types module\n * stays import-free of runtime code (dep-cruise rule\n * `types-dont-import-runtime`). Adapter authors call `mkMemoryId` to\n * construct a branded id and `extractRawId` to unwrap with cross-adapter\n * safety (EC-B).\n *\n * @public\n */\n\nimport { MemoryAdapterError } from \"./errors.js\";\nimport type { MemoryId } from \"./types/memory-adapter.js\";\n\n/**\n * Construct a branded `MemoryId` for an adapter. Embeds the adapter\n * identifier so `extractRawId` can reject ids minted by other adapters.\n *\n * @public\n */\nexport function mkMemoryId(adapterId: string, rawId: string): MemoryId {\n return `${adapterId}:${rawId}` as MemoryId;\n}\n\n/**\n * Extract the raw provider id from a `MemoryId`, enforcing that the\n * prefix matches `expectedAdapterId`. Throws `MemoryAdapterError(code:\n * \"invalid_input\")` on mismatch — prevents `mem0.delete(supermemoryId)`\n * from accidentally deleting unrelated data (EC-B).\n *\n * @public\n */\nexport function extractRawId(id: MemoryId, expectedAdapterId: string): string {\n const prefix = `${expectedAdapterId}:`;\n if (!id.startsWith(prefix)) {\n const sourcePrefix = id.split(\":\", 1)[0] ?? \"<malformed>\";\n throw new MemoryAdapterError(\n `MemoryId belongs to a different adapter (expected \"${expectedAdapterId}\", got \"${sourcePrefix}\")`,\n { adapterId: expectedAdapterId, code: \"invalid_input\" },\n );\n }\n return id.slice(prefix.length);\n}\n","import { existsSync, mkdirSync, renameSync, rmSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\nimport { ConfigurationError } from \"../../errors.js\";\nimport { redactSecrets } from \"../security/index.js\";\nimport { defaultIndexPath, openMemoryDb } from \"./index-db.js\";\nimport { LanceIndex, lanceStoragePath } from \"./lance-index.js\";\n\n/**\n * Migrate Memory.index from SQLite to LanceDB (ADR D44).\n *\n * EC-3 MUST FIX: validation uses NFC unicode normalization on both sides.\n *\n * @internal\n */\n\nexport interface MigrateOptions {\n cwd: string;\n dryRun?: boolean;\n batchSize?: number;\n /** Inject for tests; defaults to console.log. */\n logger?: (msg: string) => void;\n}\n\nexport interface MigrateResult {\n countSqlite: number;\n countLance: number;\n /** Set when validation succeeded (or dryRun); false on validation failure. */\n validated: boolean;\n /** Per-fact compare results (size = sample count, up to 10). */\n sampleComparisons: ReadonlyArray<{ id: string; match: boolean }>;\n /** Lance storage location (final, after migration). */\n lancePath: string;\n /** Was the migration committed (false for dry-run). */\n committed: boolean;\n}\n\ninterface SqliteFactRow {\n id: string;\n path: string;\n source: \"memory\" | \"sessions\" | \"wiki\";\n start_line: number;\n end_line: number;\n text: string;\n namespace?: string | null;\n scope?: string | null;\n user_id?: string | null;\n}\n\n/**\n * Read all facts from the SQLite memory index. Returns empty array if the\n * SQLite db file does not exist (workspace never used Memory).\n *\n * @internal\n */\nasync function readAllSqliteFacts(cwd: string): Promise<SqliteFactRow[]> {\n const dbPath = defaultIndexPath(cwd);\n if (!existsSync(dbPath)) return [];\n const db = await openMemoryDb({ filePath: dbPath });\n try {\n // SQLite schema: chunks table holds the facts. Schema may vary; we\n // probe column existence and fall back to safe defaults.\n const stmt = db.prepare(\"SELECT id, path, source, start_line, end_line, text FROM chunks\");\n const rows = stmt.all() as Array<{\n id: string;\n path: string;\n source: \"memory\" | \"sessions\" | \"wiki\";\n start_line: number;\n end_line: number;\n text: string;\n }>;\n return rows.map((r) => ({\n ...r,\n namespace: \"default\",\n scope: \"agent\",\n user_id: \"default\",\n }));\n } finally {\n db.close();\n }\n}\n\n/**\n * Compare two strings via NFC normalization (EC-3 MUST FIX). Required\n * because SQLite/Lance native bindings can normalize unicode differently\n * (NFC vs NFD), producing false negatives on facts with accents/emojis.\n *\n * @internal\n */\nfunction nfcEqual(a: string, b: string): boolean {\n return a.normalize(\"NFC\") === b.normalize(\"NFC\");\n}\n\n/**\n * Run the migration. Writes Lance to `<cwd>/.theokit/memory/lance-new/`\n * first, validates round-trip, then renames to `lance/` on success.\n * SQLite db is preserved (CLI prompts user to delete).\n *\n * @internal\n */\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: migration is a single transaction (read → write → validate → commit-or-rollback); splitting harms atomicity reasoning.\nexport async function migrateSqliteToLance(opts: MigrateOptions): Promise<MigrateResult> {\n const cwd = opts.cwd;\n const finalPath = lanceStoragePath(cwd);\n const newPath = join(cwd, \".theokit\", \"memory\", \"lance-new\");\n // T1.4 (ADR D68): wrap logger so any fact text containing secrets is\n // masked before reaching the destination (console or user-supplied sink).\n // Caller-supplied loggers cannot bypass — by design (D70).\n const rawLog = opts.logger ?? ((m: string) => console.log(m));\n const log = (m: string) => rawLog(redactSecrets(m));\n\n // EC: destination exists → error tipado.\n if (existsSync(finalPath)) {\n throw new ConfigurationError(\n `Destination already exists: ${finalPath}. Remove it manually (\\`rm -rf ${finalPath}\\`) and re-run.`,\n { code: \"migration_destination_exists\" },\n );\n }\n if (existsSync(newPath)) {\n // Leftover from a previous failed/interrupted migration. Safe to delete.\n log(`Removing stale ${newPath} from a previous run...`);\n rmSync(newPath, { recursive: true, force: true });\n }\n\n log(`Reading SQLite facts from ${cwd}/.theokit/memory/index.sqlite ...`);\n const sqliteFacts = await readAllSqliteFacts(cwd);\n log(`SQLite has ${sqliteFacts.length} facts.`);\n if (sqliteFacts.length === 0) {\n return {\n countSqlite: 0,\n countLance: 0,\n validated: true,\n sampleComparisons: [],\n lancePath: finalPath,\n committed: false,\n };\n }\n\n // Reuse the embedding runtime configured in the workspace? For v1.2 we\n // require the caller to pass embedding explicitly via env. The migration\n // path is documented as: \"set OPENAI_API_KEY (or similar) before running.\"\n // Here we ship a placeholder embedder that uses a deterministic\n // content-hash — sufficient for migration validation; consumers should\n // re-embed on first real query after migration if needed.\n const placeholderEmbedding = {\n id: \"migration-placeholder\",\n model: \"deterministic-hash\",\n dimension: 8,\n embed: async (texts: ReadonlyArray<string>) => {\n // Simple deterministic hash → 8-dim vector (migration validation only).\n return texts.map((t) => {\n const arr = new Array(8).fill(0);\n for (let i = 0; i < t.length; i += 1) {\n arr[i % 8] += t.charCodeAt(i);\n }\n return arr.map((x) => x / 1000);\n });\n },\n stats: () => ({ cacheHits: 0, cacheMisses: 0, httpCalls: 0, retries: 0 }),\n };\n\n mkdirSync(newPath, { recursive: true });\n log(`Writing Lance index to ${newPath} ...`);\n\n const lance = await LanceIndex.open({\n cwd,\n embedding: placeholderEmbedding,\n storagePath: newPath,\n });\n\n const batchSize = opts.batchSize ?? 100;\n for (let i = 0; i < sqliteFacts.length; i += batchSize) {\n const batch = sqliteFacts.slice(i, i + batchSize).map((f) => ({\n id: f.id,\n text: f.text,\n source: f.source,\n namespace: f.namespace ?? \"default\",\n scope: f.scope ?? \"agent\",\n user_id: f.user_id ?? \"default\",\n timestamp: 0,\n }));\n await lance.addFacts(batch);\n log(` Migrated ${Math.min(i + batchSize, sqliteFacts.length)}/${sqliteFacts.length}`);\n }\n\n // Validation: count + sample compare (10 random) with NFC normalization.\n const lanceCount = await lance.countFacts(\"default\");\n log(`Lance has ${lanceCount} facts (expected ${sqliteFacts.length}).`);\n\n const sampleSize = Math.min(10, sqliteFacts.length);\n const sampleComparisons: { id: string; match: boolean }[] = [];\n for (let i = 0; i < sampleSize; i += 1) {\n const sqliteFact = sqliteFacts[Math.floor((i * sqliteFacts.length) / sampleSize)];\n if (sqliteFact === undefined) continue;\n // Search Lance for this fact's text — best-effort round-trip.\n const hits = await lance.search(sqliteFact.text, {\n namespace: sqliteFact.namespace ?? \"default\",\n limit: 1,\n });\n // EC-3: compare with NFC normalization.\n const hit = hits[0];\n const match = hit !== undefined && nfcEqual(hit.text, sqliteFact.text);\n sampleComparisons.push({ id: sqliteFact.id, match });\n }\n\n const allMatch = sampleComparisons.every((c) => c.match);\n const countMatch = lanceCount === sqliteFacts.length;\n const validated = allMatch && countMatch;\n\n await lance.close();\n\n if (opts.dryRun === true) {\n log(\"Dry-run mode — discarding Lance staging dir.\");\n rmSync(newPath, { recursive: true, force: true });\n return {\n countSqlite: sqliteFacts.length,\n countLance: lanceCount,\n validated,\n sampleComparisons,\n lancePath: finalPath,\n committed: false,\n };\n }\n\n if (!validated) {\n log(\"Validation FAILED — leaving SQLite intact, removing Lance staging dir.\");\n rmSync(newPath, { recursive: true, force: true });\n return {\n countSqlite: sqliteFacts.length,\n countLance: lanceCount,\n validated: false,\n sampleComparisons,\n lancePath: finalPath,\n committed: false,\n };\n }\n\n // Atomic commit via rename.\n renameSync(newPath, finalPath);\n log(`Migration committed to ${finalPath}.`);\n return {\n countSqlite: sqliteFacts.length,\n countLance: lanceCount,\n validated: true,\n sampleComparisons,\n lancePath: finalPath,\n committed: true,\n };\n}\n","// Public API for memory migration (ADR D44).\n//\n// This file is the public re-export wrapper for the internal implementation.\n// Declaring types here (rather than re-exporting from internal/) avoids a\n// known rollup-dts resolution quirk with internal/ paths.\n//\n// Iter 78 (SDK 2.0 Phase 4 Stage 4 #3): routes through\n// `@theokit/sdk-memory` when the peer is installed. Falls back to\n// the legacy `internal/memory/migrate-sqlite-to-lance.js` when the\n// peer is absent. Both paths share byte-equivalent runtime behavior\n// because sdk-memory's copy is the iter 71 source-move (atomic\n// rename commit, NFC sample compare, D70 redaction logger wrap).\n\nimport { migrateSqliteToLance as _migrateSqliteToLance } from \"./internal/memory/migrate-sqlite-to-lance.js\";\nimport { tryLoadSdkMemoryPeer } from \"./internal/memory/sdk-memory-peer-loader.js\";\n\n/**\n * Options for {@link migrateSqliteToLance}.\n *\n * @public\n */\nexport interface MigrateOptions {\n cwd: string;\n dryRun?: boolean;\n batchSize?: number;\n logger?: (msg: string) => void;\n}\n\n/**\n * Outcome of {@link migrateSqliteToLance}.\n *\n * @public\n */\nexport interface MigrateResult {\n countSqlite: number;\n countLance: number;\n validated: boolean;\n sampleComparisons: ReadonlyArray<{ id: string; match: boolean }>;\n lancePath: string;\n committed: boolean;\n}\n\n/**\n * Migrate the Memory index from SQLite to LanceDB. ADR D44.\n *\n * @public\n */\nexport async function migrateSqliteToLance(options: MigrateOptions): Promise<MigrateResult> {\n // SDK 2.0 Phase 4 Stage 4 (iter 78): peer routing.\n const peer = await tryLoadSdkMemoryPeer();\n if (peer !== null) {\n return peer.migrateSqliteToLance(options);\n }\n return _migrateSqliteToLance(options);\n}\n","/**\n * `PermissionEngine` — first-match permission rules for tool invocations.\n *\n * Evaluates a tool name (and optional arguments, #55) against an ordered list\n * of rules. First matching rule wins; when no rule matches the `defaultAction`\n * is returned. #55 — the default is now `\"ask\"` (FAIL-CLOSED): a permission\n * engine that cannot positively allow must not silently allow. Opt back into\n * the previous fail-open behavior with `{ defaultAction: \"allow\" }`.\n */\n\nexport type PermissionAction = \"allow\" | \"deny\" | \"ask\";\n\n/**\n * SE1 — a per-run permission MODE that adjusts the rule-engine verdict globally.\n * A PURE post-processor of the verdict (no tool-safety metadata needed, so it fits\n * a bring-your-own-tools runtime). Grounded in a peer project (plan agent = deny-all,\n * `dangerously-skip-permissions`) + Codex (`AskForApproval`: `OnRequest` default,\n * `Never`, `UnlessTrusted`). See {@link applyMode} for the exact table.\n *\n * - `default` — verdict as-is (rules decide; unmatched ⇒ `ask`, fail-closed).\n * - `plan` — read-only: `allow` rules pass, everything else ⇒ `deny` (mutations blocked).\n * NOTE: `plan` gates on the resolved verdict, so an engine configured with\n * `{ defaultAction: \"allow\" }` still yields `allow` for UNMATCHED calls under\n * `plan` — pair `plan` with the default fail-closed engine (`defaultAction: \"ask\"`)\n * for full read-only behavior.\n * - `acceptEdits` — auto-approve the UNMATCHED verdict, but STILL honor an explicit\n * `ask` rule (a caller gates a risky tool with an ask rule). Codex `UnlessTrusted`.\n * - `bypass` (alias `bypassPermissions`, the Anthropic-exact name) — everything ⇒\n * `allow` EXCEPT an explicit `deny` rule. Never asks. a peer project\n * `dangerously-skip-permissions` / Codex `Never` / Anthropic `bypassPermissions`.\n */\nexport type PermissionMode = \"default\" | \"plan\" | \"acceptEdits\" | \"bypass\" | \"bypassPermissions\";\n\n/**\n * SE1 — apply a {@link PermissionMode} to a rule-engine verdict. Pure.\n *\n * `explicit` is `true` when the verdict came from a rule that matched by name (and\n * args), `false` when it is the fail-closed default for an unmatched call. The flag\n * is load-bearing for `acceptEdits`, which auto-approves the unmatched default but\n * keeps honoring an explicit `ask` rule (unlike `bypass`, which allows even that).\n *\n * INVARIANT (both a peer project + Codex): an explicit `deny` is immune to EVERY\n * auto-approve mode — `bypass`/`acceptEdits` never un-deny.\n */\nexport function applyMode(\n verdict: PermissionAction,\n mode: PermissionMode,\n explicit: boolean,\n): PermissionAction {\n // (a) explicit deny is terminal under every mode — fail-closed.\n if (verdict === \"deny\") return \"deny\";\n switch (mode) {\n case \"default\":\n return verdict;\n case \"plan\":\n // read-only: only allow rules pass; ask + unmatched ⇒ deny.\n return verdict === \"allow\" ? \"allow\" : \"deny\";\n case \"acceptEdits\":\n // (b) auto-approve the unmatched default; honor an explicit ask rule.\n if (verdict === \"ask\") return explicit ? \"ask\" : \"allow\";\n return verdict; // allow stays allow\n case \"bypass\":\n case \"bypassPermissions\":\n // everything that survived the deny check ⇒ allow (never asks).\n return \"allow\";\n }\n}\n\n/**\n * #55 — an argument matcher. A rule with `args` gates on the tool's argument\n * VALUES, not just its name: an exact string, a RegExp (tested against the\n * stringified value), or a predicate. Every declared arg must match for the\n * rule to apply — so `{ tool: \"shell\", args: { command: /rm\\s+-rf/ } }` denies\n * a destructive shell call while leaving `ls` to fall through.\n */\nexport type ArgMatcher = string | RegExp | ((value: unknown) => boolean);\n\nexport interface PermissionRule {\n /** Tool name (exact string) or pattern (RegExp). */\n tool: string | RegExp;\n /**\n * #55 — optional per-argument matchers. When present, the rule matches only\n * if the tool name matches AND every declared arg predicate matches the\n * corresponding call argument. A missing/undefined arg fails its predicate\n * (the rule does not match) — never throws.\n */\n args?: Record<string, ArgMatcher>;\n /** Action to take when rule matches. */\n action: PermissionAction;\n}\n\n/** Options for {@link PermissionEngine}. */\nexport interface PermissionEngineOptions {\n /**\n * Action when no rule matches. #55 — default is now `\"ask\"` (fail-closed): a\n * permission engine that cannot positively allow must not silently allow.\n * Pass `\"allow\"` to restore the previous fail-open behavior.\n */\n readonly defaultAction?: PermissionAction;\n}\n\nfunction argMatches(matcher: ArgMatcher, value: unknown): boolean {\n if (typeof matcher === \"function\") return matcher(value);\n if (value === undefined) return false; // missing arg never matches a declared predicate\n if (matcher instanceof RegExp) {\n // Reset `lastIndex` so a global/sticky-flag regex (`/x/g`) does not carry\n // state across `.test()` calls — otherwise the same rule would alternate\n // verdicts on identical repeated calls (non-deterministic authorization).\n matcher.lastIndex = 0;\n return matcher.test(String(value));\n }\n return matcher === value;\n}\n\nexport class PermissionEngine {\n private readonly defaultAction: PermissionAction;\n\n constructor(\n private readonly rules: PermissionRule[],\n options: PermissionEngineOptions = {},\n ) {\n // #55 — fail-closed by default.\n this.defaultAction = options.defaultAction ?? \"ask\";\n }\n\n /**\n * Evaluate a tool name (and optional arguments) against the rules. First\n * match wins; falls back to the configured `defaultAction` (default `\"ask\"`,\n * fail-closed) when no rule matches. #55 — a rule with `args` gates on the\n * argument values, so the same tool name can resolve to different actions\n * depending on what it is asked to do.\n */\n evaluate(\n toolName: string,\n args?: Record<string, unknown>,\n mode: PermissionMode = \"default\",\n ): PermissionAction {\n for (const rule of this.rules) {\n const nameMatches =\n typeof rule.tool === \"string\" ? rule.tool === toolName : rule.tool.test(toolName);\n if (!nameMatches) continue;\n if (rule.args !== undefined && !this.#argsMatch(rule.args, args)) continue;\n // SE1 — a matched rule is an EXPLICIT verdict; apply the mode with explicit=true.\n return applyMode(rule.action, mode, true);\n }\n // SE1 — no rule matched: the default is NOT explicit (explicit=false), so\n // `acceptEdits` auto-approves it while still honoring explicit `ask` rules above.\n return applyMode(this.defaultAction, mode, false);\n }\n\n #argsMatch(\n matchers: Record<string, ArgMatcher>,\n args: Record<string, unknown> | undefined,\n ): boolean {\n const call = args ?? {};\n for (const [key, matcher] of Object.entries(matchers)) {\n if (!argMatches(matcher, call[key])) return false;\n }\n return true;\n }\n}\n","/**\n * M7-5 — `createPermissionPlugin`: wire a {@link PermissionEngine} into the\n * `definePlugin` `pre_tool_call` veto seam. This is the canonical exemplar that\n * gives `PermissionEngine` a real caller (it was previously exported-but-unwired):\n * on each tool call the engine's verdict maps to the veto contract —\n * `\"deny\"` -> block, `\"ask\"` -> the caller's `onAsk` resolver (or block, fail-closed),\n * `\"allow\"` -> pass.\n *\n * @public\n */\n\nimport { definePlugin } from \"./internal/plugins/index.js\";\nimport type { Plugin, PreToolCallDecision } from \"./internal/plugins/types.js\";\nimport type { PermissionEngine, PermissionMode } from \"./permission-engine.js\";\n\n/**\n * SE1 — context passed to the {@link PermissionGate}. Intentionally minimal for\n * SE1; `agentId`/`runId` (for audit logging) are a documented follow-up — they are\n * available on the raw `pre_tool_call` context and can be threaded in a later slice.\n */\nexport interface PermissionGateContext {\n /** The tool being gated. */\n readonly toolName: string;\n /** The active permission mode for this run. */\n readonly mode: PermissionMode;\n}\n\n/**\n * SE1 — the resolution of an `\"ask\"` verdict by the host gate. Fail-closed: an\n * absent gate, a throwing gate, and a `\"deny\"` decision all block. Arg rewrite\n * (`updatedInput`) is intentionally NOT supported yet — the `pre_tool_call` seam\n * is veto-only (`{ block, message }`); a future enhancement can extend it.\n */\nexport type PermissionGateDecision =\n | { readonly behavior: \"allow\" }\n | { readonly behavior: \"deny\"; readonly message?: string };\n\n/**\n * SE1 — the enriched `canUseTool` gate (the Anthropic-parity shape). Invoked ONLY\n * on an `\"ask\"` verdict, it receives the tool name, its input args, and the run\n * {@link PermissionGateContext}, and resolves to allow/deny. May be async (a real\n * gate can prompt a human — the `pre_tool_call` seam awaits it).\n */\nexport type PermissionGate = (\n toolName: string,\n input: Record<string, unknown>,\n ctx: PermissionGateContext,\n) => PermissionGateDecision | Promise<PermissionGateDecision>;\n\n/** Options for {@link createPermissionPlugin}. */\nexport interface PermissionPluginOptions {\n /** Plugin name (default `\"permission-engine\"`). */\n readonly name?: string;\n /**\n * SE1 — the per-run {@link PermissionMode}. Threaded into `engine.evaluate`, so\n * `bypass` auto-allows the ask verdict (gate never consulted), `plan` blocks\n * mutations, etc. An explicit `deny` rule is immune to every mode. Default\n * `\"default\"` (rules decide; unmatched ⇒ fail-closed ask).\n */\n readonly mode?: PermissionMode;\n /**\n * SE1 — the enriched gate for the `\"ask\"` verdict. Preferred over {@link onAsk}.\n * Absent gate on an `ask` verdict ⇒ fail-closed block.\n */\n readonly canUseTool?: PermissionGate;\n /**\n * @deprecated since SE1 — use {@link canUseTool}, which receives `(toolName,\n * input, ctx)` and returns a typed decision. Honored only when `canUseTool` is\n * absent. Returns a veto (`{block,message}`) to deny or `undefined` to allow.\n */\n readonly onAsk?: (toolName: string) => PreToolCallDecision | undefined;\n}\n\n/**\n * Resolve an `\"ask\"` verdict via the gate (fail-closed). Extracted from the\n * register handler to keep its cognitive complexity in budget. Prefers\n * `canUseTool`; falls back to the deprecated `onAsk`; blocks when neither exists.\n */\nasync function resolveAsk(\n opts: PermissionPluginOptions,\n name: string,\n args: Record<string, unknown>,\n mode: PermissionMode,\n): Promise<PreToolCallDecision | undefined> {\n if (opts.canUseTool !== undefined) {\n let decision: PermissionGateDecision;\n try {\n decision = await opts.canUseTool(name, args, { toolName: name, mode });\n } catch {\n // Fail-closed: a gate that throws must not silently allow.\n return { block: true, message: `permission gate error (fail-closed): ${name}` };\n }\n // Fail-CLOSED (allow-list): only an explicit `allow` passes. Any other value\n // — `deny`, a malformed/undefined return from a JS consumer, a wrong-cased\n // behavior — blocks, so the gate can never silently allow on a bad decision.\n return decision?.behavior === \"allow\"\n ? undefined\n : { block: true, message: decision?.message ?? `denied: ${name}` };\n }\n // Deprecated back-compat: honor onAsk (undefined = allow). Fail-closed (block)\n // only when NEITHER a gate nor onAsk was supplied.\n return opts.onAsk ? opts.onAsk(name) : { block: true, message: `requires approval: ${name}` };\n}\n\n/**\n * Build a `general` plugin that vetoes tool calls per the engine's verdict, under\n * the configured {@link PermissionMode}, resolving `ask` via the {@link canUseTool}\n * gate. Register it on an agent's plugin manager (same as the ACP permission plugin).\n */\nfunction createPermissionPlugin(\n engine: PermissionEngine,\n opts: PermissionPluginOptions = {},\n): Plugin {\n return definePlugin({\n name: opts.name ?? \"permission-engine\",\n version: \"1.0.0\",\n kind: \"general\",\n register(ctx) {\n ctx.on(\"pre_tool_call\", async (rawCtx) => {\n const { name, args, permissionMode } = rawCtx as {\n name: string;\n args: Record<string, unknown>;\n permissionMode?: PermissionMode;\n };\n // SE1 — precedence: the RUN's mode (threaded from `SendOptions`/`AgentOptions`\n // via the pre_tool_call context) wins over the plugin's construction-time\n // default. `default` when neither is set.\n const mode: PermissionMode = permissionMode ?? opts.mode ?? \"default\";\n // #55 — args gate rules on the command/args, not just the tool name.\n // SE1 — the mode adjusts the verdict (bypass/plan/acceptEdits); an explicit\n // `deny` rule is immune to every auto-approve mode.\n const action = engine.evaluate(name, args, mode);\n if (action === \"deny\") {\n return { block: true, message: `denied by permission engine: ${name}` };\n }\n if (action === \"ask\") return resolveAsk(opts, name, args, mode);\n return undefined;\n });\n },\n });\n}\n\n/** SE36 — `PermissionPlugin.create` replaces `createPermissionPlugin` (ADR 0015). @public */\nexport class PermissionPlugin {\n private constructor() {}\n static create(engine: PermissionEngine, opts: PermissionPluginOptions = {}): Plugin {\n return createPermissionPlugin(engine, opts);\n }\n}\n","/**\n * M23 — schema normalizer: convert a schema from any supported provider to the internal JSON Schema\n * the synthetic `output` tool uses. Zod stays the DEFAULT and the documented recommendation; this is\n * a THIN adapter with no deep coupling (ADR-0041). Supported inputs:\n *\n * - **Zod** (default) — via the SDK's native `z.toJSONSchema` path.\n * - **JSON Schema** — a plain object with `type`/`properties` (or `$schema`) → passthrough.\n * - **ArkType** — any schema exposing `.toJsonSchema()` (ArkType 2.0) → called directly.\n * - **Valibot** — via the OPTIONAL `@valibot/to-json-schema` peer (dynamic import; a clear\n * error tells the user to install it — no hard dependency).\n *\n * Parse-failure handling stays uniform: the normalized JSON Schema drives the same synthetic-tool\n * validation + M14 `errorStrategy` regardless of the source library.\n */\nimport { toJsonSchema } from \"./internal/zod/to-json-schema.js\";\n\n/** The internal JSON-Schema shape the synthetic `output` tool consumes. */\nexport type NormalizedJsonSchema = Record<string, unknown>;\n\n/** A plain JSON Schema object already in the target shape. */\nfunction isJsonSchemaObject(s: unknown): s is NormalizedJsonSchema {\n if (typeof s !== \"object\" || s === null) return false;\n const o = s as Record<string, unknown>;\n if (\"$schema\" in o) return true;\n return o.type === \"object\" && typeof o.properties === \"object\" && o.properties !== null;\n}\n\n/** ArkType (and any lib) exposing its own `.toJsonSchema()`. */\nfunction hasToJsonSchemaMethod(s: unknown): s is { toJsonSchema: () => NormalizedJsonSchema } {\n return (\n typeof s === \"object\" &&\n s !== null &&\n typeof (s as { toJsonSchema?: unknown }).toJsonSchema === \"function\"\n );\n}\n\n/** A Zod schema — carries `safeParse` plus the Zod internals (`_def` v3 / `def` v4). */\nfunction isZodSchema(s: unknown): boolean {\n if (typeof s !== \"object\" || s === null) return false;\n const o = s as Record<string, unknown>;\n return typeof o.safeParse === \"function\" && (\"_def\" in o || \"def\" in o);\n}\n\n/** A Valibot schema — `{ kind: 'schema', type, ... }` (no built-in JSON-Schema method). */\nfunction isValibotSchema(s: unknown): boolean {\n if (typeof s !== \"object\" || s === null) return false;\n const o = s as Record<string, unknown>;\n return o.kind === \"schema\" && \"type\" in o && typeof o.toJsonSchema !== \"function\";\n}\n\n/**\n * Normalize any supported schema to the internal JSON Schema. Async because the Valibot path\n * dynamically imports its optional converter. Throws a clear, typed-message error for an unsupported\n * schema or a missing Valibot peer (error-handling.md).\n */\nexport async function normalizeSchema(schema: unknown): Promise<NormalizedJsonSchema> {\n // JSON Schema — passthrough (already the target shape).\n if (isJsonSchemaObject(schema)) return schema;\n\n // Valibot — needs its own converter (optional peer). Import via a NON-literal specifier so TS does\n // not try to statically resolve the (uninstalled) optional peer at build time.\n if (isValibotSchema(schema)) {\n const specifier = \"@valibot/to-json-schema\";\n try {\n const mod = (await import(specifier)) as {\n toJsonSchema: (s: unknown) => NormalizedJsonSchema;\n };\n return mod.toJsonSchema(schema);\n } catch (err) {\n const missing =\n err instanceof Error && /Cannot find|Cannot resolve|ERR_MODULE_NOT_FOUND/.test(err.message);\n if (missing) {\n throw new Error(\n \"normalizeSchema: a Valibot schema requires the optional '@valibot/to-json-schema' package. \" +\n \"Install it, or use a Zod schema (the default recommendation).\",\n );\n }\n throw err;\n }\n }\n\n // Zod — the default path.\n if (isZodSchema(schema)) {\n return toJsonSchema(schema as never, { unrepresentable: \"any\" }) as NormalizedJsonSchema;\n }\n\n // ArkType (or any lib exposing `.toJsonSchema()`).\n if (hasToJsonSchemaMethod(schema)) return schema.toJsonSchema();\n\n throw new Error(\n \"normalizeSchema: unsupported schema. Supported: Zod (default), JSON Schema, ArkType (.toJsonSchema()), \" +\n \"Valibot (with @valibot/to-json-schema).\",\n );\n}\n","/**\n * Public security namespace (T2.1, ADR D68).\n *\n * Two entry points:\n *\n * - `Security.redact(text, opts?)` — apply the canonical redactor to\n * arbitrary text. Useful when a consumer app (or example) writes its\n * own logs / metrics / paste-share artifacts that the SDK's wired\n * sinks (error metadata, telemetry, transcript, migration) don't\n * cover.\n * - `Security.addPattern(re)` — register a custom credential pattern\n * on top of the 12 builtins (OpenAI, Anthropic, GitHub PAT classic +\n * fine, GitLab, AWS, Google, Slack, Sentry, Stripe live + restricted)\n * plus the parametric `key=value` + `Bearer <token>` matchers.\n *\n * Redaction is ON by default. Disable with `THEOKIT_REDACT_SECRETS=false`\n * (a warning is emitted on stderr so the operator knows the SDK process\n * is vulnerable). The env var is snapshotted at module init — runtime\n * mutation cannot disable it, defending against prompt injection that\n * tries to flip the flag mid-run.\n */\n\nimport {\n addPattern as _addPattern,\n redactSecrets as _redactSecrets,\n} from \"./internal/security/index.js\";\n\nexport class Security {\n private constructor() {}\n\n /**\n * Redact known credential patterns from `text` and return the masked\n * string. Use this at any consumer output boundary the SDK does not\n * directly own (custom stdout loggers, app-level metrics, debug-share\n * artifacts, etc.).\n *\n * Coerces non-strings (objects via JSON.stringify, null/undefined → \"\").\n * Two-bucket masking: tokens shorter than 18 chars → `***`; longer\n * tokens preserve `prefix...suffix` for debuggability without revealing\n * the secret middle.\n *\n * @param text - The value to redact. Strings, objects, primitives all OK.\n * @param opts.codeFile - When `true`, skips the parametric `key=value`\n * matcher so file content like `.env.example` placeholders is left\n * intact. Built-in pattern matches still apply.\n *\n * @example\n * console.log(`[bot] received: ${Security.redact(userText)}`);\n * // → \"[bot] received: please remember sk-abc...xyz1\"\n */\n static redact(text: unknown, opts?: { codeFile?: boolean }): string {\n return _redactSecrets(text, opts);\n }\n\n /**\n * Register a custom redaction pattern. Additive — built-in patterns\n * (OpenAI, Anthropic, GitHub PAT, AWS, etc.) cannot be removed.\n *\n * @param re - RegExp with `/g` flag. Throws if `/g` is missing\n * (without /g, only first match is replaced and the rest\n * leaks).\n *\n * Process-global mutable state. The SDK is designed for single-tenant\n * processes (Theo PaaS user runtime, local CLI). Multi-tenant\n * deployments running multiple SDK consumers in the same Node process\n * share this list — patterns added by tenant A apply to tenant B's\n * redactions. Acceptable for v1; future isolate-aware refactor would\n * thread patterns through a context if needed.\n *\n * @example\n * Security.addPattern(/MYORG-[A-Z0-9]{32}/g);\n * // → text containing \"MYORG-AAAA...AAAA\" now masks like a builtin.\n */\n static addPattern(re: RegExp): void {\n _addPattern(re);\n }\n}\n","/**\n * M3 #62 — scoped session state.\n *\n * A conversation id can be namespaced by SCOPE so a consumer keeps app-durable,\n * user-durable, and ephemeral (temp) session data separated in the same store:\n *\n * - `app:` — durable state shared across users (app-level memory).\n * - `user:` — durable state for one user.\n * - `temp:` — ephemeral state a consumer prunes on logout / session end.\n *\n * The scope is a prefix on the conversation id (`\"<scope>__<id>\"`). The `__`\n * separator is path-safe (unlike `:`, which the identifier guard rejects), so a\n * host can partition sessions by scope over the native transcript store.\n *\n * @public\n */\n\n/** M3 #62 — session state scope. */\nexport type SessionScope = \"app\" | \"user\" | \"temp\";\n\n/** M3 #62 — build a scope-namespaced conversation id (`\"<scope>__<id>\"`). */\nexport function scopedConversationId(scope: SessionScope, id: string): string {\n return `${scope}__${id}`;\n}\n\n/** M3 #62 — the id prefix (`\"<scope>__\"`) used to match a scope's conversations. */\nexport function sessionScopePrefix(scope: SessionScope): string {\n return `${scope}__`;\n}\n","/**\n * `createSquad` — a sequential team of agents.\n *\n * A Squad is a thin convenience that COMPOSES `Workflow` + `agentStep` — it\n * adds NO new orchestration logic. Agents run in array order; each agent's\n * output is threaded into the next agent's prompt. For branching/parallel/\n * foreach teams use `Workflow` directly; for manager→worker delegation use\n * subagents or `@theokit/sdk-handoff`.\n *\n * Mirrors the `createAgentFactory` composition-LEGO precedent (a factory over\n * existing primitives, not a new subsystem).\n *\n * @public\n */\n\nimport { ConfigurationError } from \"./errors.js\";\nimport type { AgentDefinition, SDKAgent } from \"./types/agent.js\";\nimport type { StepResult } from \"./types/workflow.js\";\nimport { agentStep, Workflow } from \"./workflow.js\";\n\n/**\n * Options for {@link createSquad}.\n *\n * @public\n */\nexport interface SquadOptions {\n /**\n * Agents run in array order (sequential pipeline). Must be non-empty.\n *\n * M81 — accepts an `AgentDefinition` (plain data) as well as a constructed `SDKAgent`. Building a\n * team used to force the caller to materialize every member by hand first: resolve the credential,\n * assemble the options, call `Agent.create`, await. That is precisely the work this milestone moves\n * into the framework elsewhere, so leaving it here would be inconsistent — and with\n * `discoverSubagents` now public (`@theokit/sdk/subagents-loader`), the data that describes an\n * agent is reachable, which closes the loop: discover → build a team, with no manual step between.\n *\n * Mixing both forms in one list is supported on purpose: a real team usually has members from\n * different origins.\n */\n agents: ReadonlyArray<SDKAgent | AgentDefinition>;\n /**\n * Orchestration process. Only `\"sequential\"` is supported (the default).\n * `\"hierarchical\"` is accepted by the type but rejected at runtime with\n * guidance — use subagents or `@theokit/sdk-handoff` for manager→worker\n * delegation (those already cover it).\n */\n process?: \"sequential\" | \"hierarchical\";\n /** Optional squad name (surfaced on the underlying workflow). Default `\"squad\"`. */\n name?: string;\n}\n\n/**\n * Result of a {@link Squad.run}. `result` is the final (last agent's) output;\n * `steps` is the per-agent trace from the underlying workflow run.\n *\n * @public\n */\nexport interface SquadRun {\n readonly result: unknown;\n readonly status: \"running\" | \"completed\" | \"failed\" | \"suspended\" | \"cancelled\";\n readonly steps: ReadonlyArray<StepResult>;\n}\n\n/**\n * A sequential agent team produced by {@link createSquad}.\n *\n * @public\n */\nexport interface Squad {\n /** Run the team over `input`, threading each agent's output to the next. */\n run(input: unknown): Promise<SquadRun>;\n}\n\n/**\n * Build a sequential agent team. The returned {@link Squad} composes a\n * `Workflow` of `agentStep`s under the hood — all orchestration is delegated\n * to the workflow engine.\n *\n * @public\n */\n/**\n * M81 — an `SDKAgent` is recognised by having `send`; an `AgentDefinition` is plain data.\n *\n * Structural, not `instanceof`: the definition crosses package boundaries as data (that is the whole\n * interop contract the layer relies on), so an identity check would fail exactly when two copies of\n * the SDK are loaded — the failure mode M79 measured.\n */\nfunction ehAgenteConstruido(m: SDKAgent | AgentDefinition): m is SDKAgent {\n return typeof (m as SDKAgent).send === \"function\";\n}\n\n/**\n * M81 — transforma um `AgentDefinition` num agente executável.\n *\n * Import dinâmico do `Agent` porque `squad.ts` é consumido por caminhos que não querem arrastar o\n * agente inteiro só para declarar um time; o custo só é pago por quem de fato passa dado puro.\n */\nasync function materializar(def: AgentDefinition, indice: number): Promise<SDKAgent> {\n const { Agent } = await import(\"./agent.js\");\n return Agent.create({\n // `AgentDefinition.model` admite o sentinel `'inherit'`, que não é um id de modelo. Herdar\n // aqui significa \"não declare nada e deixe o default valer\" — passar o literal adiante criaria\n // um agente pedindo um modelo chamado `inherit`.\n ...(def.model !== undefined && def.model !== \"inherit\" ? { model: def.model } : {}),\n ...(def.prompt !== undefined ? { systemPrompt: def.prompt } : {}),\n agentId: `squad-member-${String(indice)}`,\n local: {},\n });\n}\n\nfunction createSquad(options: SquadOptions): Squad {\n const { agents } = options;\n if (!Array.isArray(agents) || agents.length === 0) {\n throw new ConfigurationError(\"createSquad requires a non-empty `agents` array\", {\n code: \"invalid_squad\",\n });\n }\n if (options.process !== undefined && options.process !== \"sequential\") {\n throw new ConfigurationError(\n `createSquad only supports process \"sequential\"; for manager→worker delegation use subagents or @theokit/sdk-handoff`,\n { code: \"squad_process_unsupported\" },\n );\n }\n\n return {\n run: async (input: unknown): Promise<SquadRun> => {\n const run = await (await montarPipeline(agents, options.name)).run(input);\n return { result: run.output, status: run.status, steps: run.stepResults };\n },\n };\n}\n\n/**\n * Monta o pipeline sequencial, materializando os membros que ainda são dado puro.\n *\n * Extraído de `run` porque o gate de complexidade cognitiva barrou a função combinada — e porque\n * \"montar o pipeline\" e \"executar e traduzir o resultado\" são duas responsabilidades que só estavam\n * juntas por proximidade.\n */\nasync function montarPipeline(\n agents: ReadonlyArray<SDKAgent | AgentDefinition>,\n nome: string | undefined,\n): Promise<ReturnType<ReturnType<typeof Workflow.create>[\"commit\"]>> {\n // Compose Workflow + agentStep — identity threading: each agent's prompt is the previous agent's\n // output (the run input for the first agent).\n let builder = Workflow.create({ name: nome ?? \"squad\" });\n for (let i = 0; i < agents.length; i++) {\n const membro = agents[i];\n if (membro === undefined) continue;\n // M81 — materializa na hora de RODAR, não na construção: `Squad.create` é síncrono e um\n // `AgentDefinition` só vira agente com um `await`. Adiar até aqui mantém a construção barata e\n // evita que montar um time exija credencial resolvida antes da primeira execução.\n const agent = ehAgenteConstruido(membro) ? membro : await materializar(membro, i);\n // SE3 — the first agent receives the human input (no peer origin); every subsequent agent\n // receives its predecessor's output, so its turn carries `{ kind: \"peer\", from: \"agent-<i-1>\" }`.\n const opts = i > 0 ? { origin: { kind: \"peer\" as const, from: `agent-${i - 1}` } } : undefined;\n builder = builder.then(agentStep(`agent-${i}`, agent, (prev) => String(prev), opts));\n }\n return builder.commit();\n}\n\n/** SE36 — `Squad.create` replaces `createSquad` (ADR 0015). Merges with the `Squad` interface. @public */\n// biome-ignore lint/suspicious/noUnsafeDeclarationMerging: SE36 namespace class merges with the `Squad` instance interface (ADR 0015) — intentional; `create()` returns the interface type, `new` is blocked by the private ctor.\nexport class Squad {\n private constructor() {}\n static create(options: SquadOptions): Squad {\n return createSquad(options);\n }\n}\n","/**\n * `Task` — observable async work registry (Adoption Roadmap gap #2,\n * ADRs D361-D374).\n *\n * Static facade delegating to the in-process `TaskRegistry` singleton.\n * The lifecycle of any task is the 5-state machine `queued | running |\n * finished | error | cancelled` (D362). Wrapping `Agent.send` /\n * `Agent.batch` / `Workflow.run` / `Cron` fires is opt-in via the\n * `{ task: true }` option on each (D363).\n *\n * @public\n */\n\nimport {\n cancel as registryCancel,\n configure as registryConfigure,\n get as registryGet,\n list as registryList,\n submit as registrySubmit,\n subscribe as registrySubscribe,\n} from \"./internal/task/registry.js\";\nimport type {\n TaskCancelResult,\n TaskEvent,\n TaskFilter,\n TaskHandle,\n TaskKind,\n TaskStoreOptions,\n TaskSubmitOptions,\n} from \"./types/task.js\";\n\nexport interface TaskWorkContext {\n readonly signal: AbortSignal;\n emit(payload: unknown): void;\n}\n\nexport type TaskWorkFn<T> = (ctx: TaskWorkContext) => Promise<T> | T;\n\n/**\n * Registry-level configuration. May only be applied BEFORE the first\n * `Task.submit` of the process — see EC-13. Subsequent calls emit a\n * single stderr line and become no-ops.\n */\nexport interface TaskConfigureOptions {\n readonly store?: TaskStoreOptions;\n readonly maxConcurrent?: number;\n readonly retentionMs?: number;\n}\n\nexport class Task {\n // D361 — static class with private constructor.\n private constructor() {\n throw new Error(\"Task is static; do not instantiate\");\n }\n\n /**\n * Configure the registry. **Must be called before the first `submit`**\n * (EC-13). Available knobs: pluggable store (D364), concurrency cap\n * (D369), and retention (D373).\n */\n static configure(opts: TaskConfigureOptions): void {\n registryConfigure(opts);\n }\n\n /**\n * Submit a unit of asynchronous work to the registry.\n *\n * The `work` function receives `{ signal, emit }` — `signal` is the\n * AbortSignal honored on cancel; `emit(payload)` produces a\n * `progress` event observable via `Task.subscribe`.\n *\n * Returns a `TaskHandle` in `state: \"queued\"`. Subsequent state\n * transitions are observable via `Task.subscribe(handle.id)` OR\n * polled via `Task.get(handle.id)`.\n *\n * **Idempotency (D367):** submitting twice with the same `id` returns\n * the existing handle without re-invoking work.\n *\n * **Grammar (D368):** user-supplied ids must match\n * `^[a-z0-9][a-z0-9_-]*$` and must not start with reserved prefixes\n * `wf-` / `b-` / `cron-`. Otherwise `InvalidTaskIdError` is thrown.\n *\n * **Pre-aborted signal (EC-4):** if `options.signal` is already\n * aborted, the task short-circuits to `cancelled` without acquiring\n * a semaphore slot and without invoking `work`.\n */\n static async submit<T>(\n kind: TaskKind,\n work: TaskWorkFn<T>,\n options: TaskSubmitOptions = {},\n ): Promise<TaskHandle> {\n return registrySubmit<T>({\n kind,\n work,\n ...(options.id !== undefined ? { id: options.id } : {}),\n ...(options.meta !== undefined ? { meta: options.meta } : {}),\n ...(options.signal !== undefined ? { signal: options.signal } : {}),\n ...(options.onRunEvent !== undefined ? { onRunEvent: options.onRunEvent } : {}),\n });\n }\n\n /** Returns matching handles, capped at `filter.limit ?? 100`. */\n static list(filter: TaskFilter = {}): Promise<TaskHandle[]> {\n return registryList(filter);\n }\n\n /** Returns a single handle by id, or `undefined` if unknown / evicted. */\n static get(id: string): Promise<TaskHandle | undefined> {\n return registryGet(id);\n }\n\n /**\n * Idempotent cancel (D365). Returns:\n * - `{ cancelled: true, alreadyTerminal: false }` — transitioned\n * queued/running task to `cancelled`.\n * - `{ cancelled: false, alreadyTerminal: true }` — task already\n * terminal.\n * - `{ cancelled: false, alreadyTerminal: false }` — task unknown.\n *\n * Never throws.\n */\n static cancel(id: string, reason?: string): Promise<TaskCancelResult> {\n return registryCancel(id, reason);\n }\n\n /**\n * Subscribe to a task's event stream. The returned `AsyncIterable<TaskEvent>`\n * starts by replaying buffered events (ring buffer cap 64, D372) and\n * then yields live events until a terminal event (finished / errored\n * / cancelled) is emitted, at which point it closes automatically.\n *\n * Calling `.return()` on the iterator (or `break` in a `for await`)\n * cleans up the subscriber callback (EC-10).\n *\n * Throws `TaskNotFoundError` if the id is unknown or has been evicted.\n */\n static subscribe(id: string): AsyncIterable<TaskEvent> {\n return registrySubscribe(id);\n }\n}\n","import type { SDKProvider } from \"../../types/providers.js\";\nimport type { SDKModel, SDKRepository, SDKUser } from \"../../types/theokit.js\";\nimport { DEFAULT_AGENTIC_MODEL_ID } from \"../runtime/config/default-model.js\";\n\n/**\n * Fixture catalog data — returned when fixture-mode is active (no\n * `THEOKIT_API_BASE_URL` set + `theo_test_*` API key).\n *\n * Shapes here must match the JSON files under `tests/golden/theokit/`\n * after `normalizeForGolden()` is applied. `createdAt` is an ISO timestamp\n * normalized to `<timestamp>` by the test helper.\n *\n * @internal\n */\n\nconst FIXTURE_TIMESTAMP = \"2024-01-01T00:00:00.000Z\";\n\n/** Fixture user identity (matches `tests/golden/theokit/me.json`). */\nexport const FIXTURE_USER: SDKUser = {\n apiKeyName: \"Contract Test Key\",\n userEmail: \"sdk-contract@example.com\",\n createdAt: FIXTURE_TIMESTAMP,\n};\n\n/** Fixture model catalog (matches `tests/golden/theokit/models.json`). */\nexport const FIXTURE_MODELS: SDKModel[] = [\n {\n id: DEFAULT_AGENTIC_MODEL_ID,\n name: \"Gemini 2.0 Flash\",\n displayName: \"Gemini 2.0 Flash\",\n parameters: [\n {\n id: \"thinking\",\n displayName: \"Thinking\",\n values: [\n { value: \"low\", displayName: \"Low\" },\n { value: \"high\", displayName: \"High\" },\n ],\n },\n ],\n variants: [\n {\n displayName: \"High thinking\",\n params: [{ id: \"thinking\", value: \"high\" }],\n isDefault: false,\n },\n ],\n },\n];\n\n/** Fixture connected repos (matches `tests/golden/theokit/repositories.json`). */\nexport const FIXTURE_REPOSITORIES: SDKRepository[] = [\n { url: \"https://github.com/usetheo/example\" },\n];\n\n/**\n * Generic JSON Schema used as `setupSchema` for fixture providers. The\n * property name is intentionally generic (`credential`) so the schema never\n * contains substrings that look like environment variable names for real\n * provider tokens — fixture output must remain secret-shaped-noise-free.\n */\nconst GENERIC_SETUP_SCHEMA = {\n type: \"object\",\n description: \"Configuration values for this provider.\",\n required: [\"credential\"],\n properties: { credential: { type: \"string\" } },\n} as const;\n\n/**\n * Fixture provider catalog. Covers chat, web_search, image, and embedding\n * capabilities. The `setupSchema` is intentionally generic JSON Schema —\n * consumers drive UI from these definitions.\n *\n * Public and secret-free by design — no tokens or API key examples.\n */\nexport const FIXTURE_PROVIDERS: SDKProvider[] = [\n {\n name: \"anthropic\",\n displayName: \"Anthropic\",\n capabilities: [\"chat\"],\n isAvailable: true,\n setupSchema: GENERIC_SETUP_SCHEMA,\n },\n {\n name: \"openai\",\n displayName: \"OpenAI\",\n capabilities: [\"chat\", \"embedding\", \"image\"],\n isAvailable: false,\n setupSchema: GENERIC_SETUP_SCHEMA,\n },\n {\n name: \"openrouter\",\n displayName: \"OpenRouter\",\n capabilities: [\"chat\"],\n isAvailable: true,\n setupSchema: GENERIC_SETUP_SCHEMA,\n },\n {\n name: \"nous\",\n displayName: \"Nous Research\",\n capabilities: [\"chat\"],\n isAvailable: true,\n setupSchema: GENERIC_SETUP_SCHEMA,\n },\n {\n name: \"fixture-search\",\n displayName: \"Fixture Search\",\n capabilities: [\"web_search\"],\n isAvailable: true,\n setupSchema: GENERIC_SETUP_SCHEMA,\n },\n];\n","/**\n * Local model discovery via OpenAI-compatible `/v1/models` endpoint\n * (T2.1, ADR D184).\n *\n * Used by `Theokit.models.list({ provider: \"ollama\" })` (and any other\n * future provider with `authType: \"none\"` exposing the OpenAI-shape\n * models endpoint — LM Studio, llama.cpp `./server`, vLLM, etc.) to\n * enumerate locally-installed models without a cloud round-trip.\n *\n * Aligned with peer-project `extensions/ollama/src/provider-models.ts` which\n * targets the same endpoint shape. Mirrors the relevant Hermes\n * `models.dev` catalog behavior for local providers.\n *\n * @internal\n */\n\nimport { ConfigurationError } from \"../../errors.js\";\nimport type { SDKModel } from \"../../types/theokit.js\";\nimport { mapOllamaHttpError, mapOllamaTransportError } from \"../error-mappers/ollama.js\";\nimport { readErrorResponseBody } from \"../http.js\";\n\ninterface OpenAiModelsResponse {\n object?: string;\n data?: Array<{ id?: string; owned_by?: string }>;\n}\n\n/**\n * Fetch and map `<baseUrl>/v1/models` → `SDKModel[]`. Throws a typed\n * `ConfigurationError` on connection failures (ECONNREFUSED → \"Run\n * `ollama serve`\"). Returns `[]` when the body is unparseable —\n * defensive choice over crashing on malformed responses from\n * non-standard local runtimes.\n */\nexport async function listLocalModelsViaOpenAiCompat(baseUrl: string): Promise<SDKModel[]> {\n const url = `${baseUrl}/v1/models`;\n let response: Response;\n try {\n response = await fetch(url, { method: \"GET\" });\n } catch (fetchErr) {\n const mapped = mapOllamaTransportError({\n providerId: \"ollama\",\n cause: fetchErr,\n endpoint: \"/v1/models\",\n });\n if (mapped !== undefined) throw mapped;\n throw new ConfigurationError(\n `Failed to reach local provider at ${baseUrl}: ${(fetchErr as Error).message}`,\n { code: \"local_provider_unreachable\" },\n );\n }\n if (!response.ok) {\n const body = await readErrorResponseBody(response);\n const mapped = mapOllamaHttpError({\n providerId: \"ollama\",\n status: response.status,\n body,\n headers: response.headers,\n endpoint: \"/v1/models\",\n });\n if (mapped !== undefined) throw mapped;\n throw new ConfigurationError(\n `Local provider at ${baseUrl} returned HTTP ${response.status} on /v1/models`,\n { code: \"local_provider_http_error\" },\n );\n }\n let parsed: OpenAiModelsResponse;\n try {\n parsed = (await response.json()) as OpenAiModelsResponse;\n } catch {\n return [];\n }\n const data = parsed.data ?? [];\n return data\n .filter(\n (entry): entry is { id: string } => typeof entry?.id === \"string\" && entry.id.length > 0,\n )\n .map((entry) => ({\n id: entry.id,\n displayName: entry.id,\n name: entry.id,\n }));\n}\n","import { AuthenticationError } from \"./errors.js\";\nimport {\n FIXTURE_MODELS,\n FIXTURE_PROVIDERS,\n FIXTURE_REPOSITORIES,\n FIXTURE_USER,\n} from \"./internal/catalog/fixtures.js\";\nimport { listLocalModelsViaOpenAiCompat } from \"./internal/catalog/local-models.js\";\nimport { resolveApiKey } from \"./internal/env.js\";\nimport { httpRequest } from \"./internal/http.js\";\nimport { MEMORY_EMBEDDING_ADAPTERS } from \"./internal/memory/adapters/catalog.js\";\nimport {\n getCatalogCapabilities,\n type ProviderCapabilities,\n} from \"./internal/providers/catalog-loader.js\";\nimport {\n discoverProviderPlugins,\n getProviderProfile,\n listProviders,\n registerBuiltins,\n} from \"./internal/providers/index.js\";\nimport { isFixtureApiKey, shouldUseFixtureMode } from \"./internal/runtime/fixtures/fixture-mode.js\";\nimport type { SDKProvider } from \"./types/providers.js\";\nimport type { SDKModel, SDKRepository, SDKUser } from \"./types/theokit.js\";\n\n/**\n * Options shared by every `Theokit.*` request.\n *\n * @public\n */\nexport interface TheokitRequestOptions {\n /** Override the `THEOKIT_API_KEY` env var for this call. */\n apiKey?: string;\n /**\n * Target a specific provider for catalog reads. When set to a provider\n * with `authType: \"none\"` (e.g. `\"ollama\"`, `\"lmstudio\"`, `\"llamacpp\"`),\n * `Theokit.models.list({ provider })` reads from the provider's local\n * `/v1/models` endpoint instead of the TheoCloud catalog. ADR D184.\n *\n * @public\n */\n provider?: string;\n}\n\n/**\n * Account-level and catalog reads. All methods accept an optional `apiKey`\n * and otherwise fall back to the `THEOKIT_API_KEY` environment variable.\n *\n * @public\n */\nexport class Theokit {\n private constructor() {\n // Static-only namespace.\n }\n\n /**\n * Return the user behind the current API key.\n *\n * @public\n */\n static me(options: TheokitRequestOptions = {}): Promise<SDKUser> {\n return executeCatalogRequest({\n apiKey: options.apiKey,\n fixture: FIXTURE_USER,\n path: \"/v1/me\",\n });\n }\n\n /**\n * Model catalog reads.\n *\n * @public\n */\n static readonly models: {\n list: (options?: TheokitRequestOptions) => Promise<SDKModel[]>;\n capabilities: (providerOrModelId: string) => ProviderCapabilities | undefined;\n } = {\n list: async (options = {}) => {\n // ADR D184: when `provider` targets an `authType: \"none\"` provider,\n // read locally instead of hitting TheoCloud. Cloud catalog path is\n // unchanged when `provider` is undefined.\n if (options.provider !== undefined) {\n const localModels = await maybeListLocalModels(options.provider);\n if (localModels !== undefined) return localModels;\n }\n return executeCatalogRequest({\n apiKey: options.apiKey,\n fixture: FIXTURE_MODELS,\n path: \"/v1/models\",\n });\n },\n capabilities: (providerOrModelId: string) => {\n registerBuiltins();\n // Extract provider name from \"provider/model\" format\n const providerId = providerOrModelId.includes(\"/\")\n ? (providerOrModelId.split(\"/\")[0] ?? providerOrModelId)\n : providerOrModelId;\n return getCatalogCapabilities(providerId);\n },\n };\n\n /**\n * Connected GitHub repositories for the calling user's team. Cloud only.\n *\n * @public\n */\n static readonly repositories: {\n list: (options?: TheokitRequestOptions) => Promise<SDKRepository[]>;\n } = {\n list: (options = {}) =>\n executeCatalogRequest({\n apiKey: options.apiKey,\n fixture: FIXTURE_REPOSITORIES,\n path: \"/v1/repositories\",\n }),\n };\n\n /**\n * Provider catalog. Lists every provider known to the platform, including\n * plugin-registered ones, with capability and availability metadata.\n *\n * @public\n */\n static readonly providers: {\n list: (options?: TheokitRequestOptions) => Promise<SDKProvider[]>;\n } = {\n list: (options = {}) =>\n executeCatalogRequest({\n apiKey: options.apiKey,\n fixture: FIXTURE_PROVIDERS,\n path: \"/v1/providers\",\n }),\n };\n\n /**\n * Local introspection of bundled SDK assets (ADR D201). Unlike the\n * cloud-catalog `providers.list()` (which hits the TheoCloud HTTP API),\n * `inspect.*` reads the SDK's own bundled registries — useful for\n * tooling (e.g. `@theokit/cli`'s `theokit inspect`) that needs to know\n * what's available WITHOUT a network round-trip.\n *\n * @public\n */\n static readonly inspect: {\n builtinProviders: () => Array<{\n readonly name: string;\n readonly apiMode: string;\n readonly authType: string;\n readonly baseUrl: string;\n readonly aliases?: ReadonlyArray<string>;\n readonly envVars: ReadonlyArray<string>;\n }>;\n embeddingAdapters: () => Array<{\n readonly id: string;\n readonly transport: string;\n readonly defaultModel: string;\n }>;\n } = {\n builtinProviders: () => {\n registerBuiltins();\n return listProviders().map((p) => ({\n name: p.name,\n apiMode: p.apiMode,\n authType: p.authType,\n baseUrl: p.baseUrl,\n ...(p.aliases !== undefined ? { aliases: p.aliases } : {}),\n envVars: p.envVars,\n }));\n },\n embeddingAdapters: () =>\n Object.entries(MEMORY_EMBEDDING_ADAPTERS).map(([id, adapter]) => ({\n id,\n transport: adapter.transport,\n defaultModel: adapter.defaultModel,\n })),\n };\n\n // NOTE: `Theokit.subscribe` is exported from `@theokit/sdk/subscription`\n // sub-path entry instead of the main `Theokit` static class to avoid\n // pulling the subscription module into the main `index.ts` DTS bundle\n // (which trips on the pre-existing `types/agent.ts ↔ fork-agent.ts` cycle\n // — same pattern as `path-safety` per ADR D425/D429 + see tsup.config.ts\n // header comment). Consumers import via:\n // `import { subscribe } from \"@theokit/sdk/subscription\"`\n // The function shape mirrors a hypothetical `Theokit.subscribe(name, input, opts)`\n // and may be promoted onto Theokit once the agent.ts cycle is broken.\n}\n\n/**\n * ADR D184: when caller passed `{ provider }` targeting a profile with\n * `authType: \"none\"`, fetch from the local provider's `/v1/models`.\n * Returns `undefined` when the provider does not exist OR has auth —\n * caller falls back to the cloud catalog path.\n */\nasync function maybeListLocalModels(providerName: string): Promise<SDKModel[] | undefined> {\n registerBuiltins();\n // M47 review F2 — this async entrypoint resolves provider profiles, so plugin discovery must run\n // here too (the sync surfaces `models.capabilities()` / `inspect.builtinProviders()` intentionally\n // remain builtins-only — they cannot await; documented limitation).\n await discoverProviderPlugins();\n const profile = getProviderProfile(providerName);\n if (profile === undefined) return undefined;\n if (profile.authType !== \"none\") return undefined;\n const baseUrl = resolveLocalProviderBaseUrl(profile.name, profile.baseUrl);\n return listLocalModelsViaOpenAiCompat(baseUrl);\n}\n\nfunction resolveLocalProviderBaseUrl(providerName: string, fallback: string): string {\n // Mirror the env override priority used in router.ts selectTransport.\n if (providerName === \"ollama\" && process.env.OLLAMA_HOST !== undefined) {\n return process.env.OLLAMA_HOST;\n }\n return fallback;\n}\n\ninterface CatalogRequest<T> {\n apiKey: string | undefined;\n fixture: T;\n path: string;\n}\n\nasync function executeCatalogRequest<T>(request: CatalogRequest<T>): Promise<T> {\n const apiKey = resolveApiKey(request.apiKey);\n if (apiKey === undefined) {\n throw new AuthenticationError(\"Missing API key\", { code: \"missing_api_key\" });\n }\n\n if (shouldUseFixtureMode(apiKey)) {\n return request.fixture;\n }\n\n // Fixture-mode is off — either an explicit base URL is set (real HTTP)\n // or a non-fixture key is being used without a backend reachable.\n if (!isFixtureApiKey(apiKey) && process.env.THEOKIT_API_BASE_URL === undefined) {\n throw new AuthenticationError(\"Invalid API key\", { code: \"authentication_error\" });\n }\n\n return httpRequest<T>(request.path, { apiKey });\n}\n","/**\n * `toShareGptTrajectory` — opt-in BatchResult → ShareGPT converter (ADR D139).\n *\n * Pure transformation. Returns `null` for failed results so callers can\n * filter via `.map(toShareGptTrajectory).filter(Boolean)`. Tool calls and\n * tool results are preserved when an SDKMessage trace is provided; otherwise\n * a minimal `human → gpt` trajectory is emitted from the final text.\n *\n * @public\n */\n\nimport type { BatchResult } from \"./types/batch.js\";\nimport type { SDKMessage, TextBlock, ToolUseBlock } from \"./types/messages.js\";\nimport type { ShareGptMessage, ShareGptTrajectory } from \"./types/trajectory.js\";\n\n/**\n * Convert a successful `BatchResult` to ShareGPT-format trajectory.\n *\n * Behavior:\n * - `result.ok === false` → returns `null` (EC-11).\n * - First entry is always `{from: \"human\", value: result.prompt}`.\n * - When `options.messages` is supplied, each SDKMessage maps to one or\n * more ShareGPT entries (assistant text → gpt, tool_use → gpt + tool).\n * - Without `options.messages`, fall back to a single `{from: \"gpt\"}`\n * entry carrying `result.result.result` (the final text) when present.\n * - Malformed message entries are silently skipped (EC-F / EC-14).\n *\n * @public\n */\nexport function toShareGptTrajectory(\n result: BatchResult,\n options?: { messages?: SDKMessage[]; model?: string },\n): ShareGptTrajectory | null {\n if (!result.ok) return null;\n const conversations = buildConversations(result, options?.messages);\n const trajectory: ShareGptTrajectory = {\n conversations,\n metadata: {\n timestamp: new Date().toISOString(),\n durationMs: result.durationMs,\n promptIndex: result.index,\n ...(options?.model !== undefined ? { model: options.model } : {}),\n },\n completed: true,\n };\n const usage = extractUsage(result.result);\n if (usage !== undefined) trajectory.usage = usage;\n return trajectory;\n}\n\nfunction buildConversations(\n result: Extract<BatchResult, { ok: true }>,\n messages: SDKMessage[] | undefined,\n): ShareGptMessage[] {\n const conversations: ShareGptMessage[] = [{ from: \"human\", value: result.prompt }];\n if (Array.isArray(messages) && messages.length > 0) {\n for (const m of messages) {\n for (const entry of mapSdkMessage(m)) conversations.push(entry);\n }\n return conversations;\n }\n // Fall-back: minimal {gpt} entry with final text (EC-12).\n const finalText = typeof result.result.result === \"string\" ? result.result.result : \"\";\n conversations.push({ from: \"gpt\", value: finalText });\n return conversations;\n}\n\nfunction extractUsage(\n runResult: unknown,\n): { inputTokens: number; outputTokens: number } | undefined {\n const usage = (runResult as { usage?: { inputTokens?: unknown; outputTokens?: unknown } })?.usage;\n if (usage === undefined) return undefined;\n if (typeof usage.inputTokens !== \"number\" || typeof usage.outputTokens !== \"number\") {\n return undefined;\n }\n return { inputTokens: usage.inputTokens, outputTokens: usage.outputTokens };\n}\n\n/**\n * Map one SDKMessage to zero or more ShareGPT entries. Tool-use blocks\n * inside an assistant message split into a `gpt` entry with `tool_calls`\n * plus, when paired with a `tool_call.completed` event, a `tool` entry\n * carrying the result.\n *\n * Malformed shapes (missing `message.content`, non-array content) yield\n * an empty list — caller skips silently (EC-F).\n *\n * @internal\n */\nfunction mapSdkMessage(m: SDKMessage): ShareGptMessage[] {\n if (m === null || typeof m !== \"object\") return [];\n switch (m.type) {\n case \"assistant\":\n return mapAssistant(m);\n case \"tool_call\":\n return mapToolCall(m);\n case \"thinking\":\n case \"system\":\n case \"user\":\n case \"status\":\n case \"task\":\n case \"request\":\n case \"object_delta\":\n return [];\n default: {\n // Exhaustive sentinel — unreachable on stable SDKMessage union.\n const _exhaustive: never = m;\n void _exhaustive;\n return [];\n }\n }\n}\n\nfunction mapAssistant(m: Extract<SDKMessage, { type: \"assistant\" }>): ShareGptMessage[] {\n const content = m.message?.content;\n if (!Array.isArray(content)) return [];\n const textParts: string[] = [];\n const toolCalls: NonNullable<ShareGptMessage[\"tool_calls\"]> = [];\n for (const block of content) {\n appendBlock(block, textParts, toolCalls);\n }\n const entry: ShareGptMessage = { from: \"gpt\", value: textParts.join(\"\") };\n if (toolCalls.length > 0) entry.tool_calls = toolCalls;\n return [entry];\n}\n\nfunction appendBlock(\n block: unknown,\n textParts: string[],\n toolCalls: NonNullable<ShareGptMessage[\"tool_calls\"]>,\n): void {\n if (block === null || typeof block !== \"object\") return;\n const text = block as TextBlock;\n if (text.type === \"text\" && typeof text.text === \"string\") {\n textParts.push(text.text);\n return;\n }\n const tu = block as ToolUseBlock;\n if (tu.type !== \"tool_use\") return;\n const args =\n tu.input !== null && typeof tu.input === \"object\" ? (tu.input as Record<string, unknown>) : {};\n toolCalls.push({ name: tu.name, arguments: args });\n}\n\nfunction mapToolCall(m: Extract<SDKMessage, { type: \"tool_call\" }>): ShareGptMessage[] {\n // Only emit when the tool call completed — running/error are interim states.\n if (m.status !== \"completed\") return [];\n const value =\n typeof m.result === \"string\" ? m.result : m.result === undefined ? \"\" : safeStringify(m.result);\n return [{ from: \"tool\", value }];\n}\n\nfunction safeStringify(v: unknown): string {\n try {\n return JSON.stringify(v);\n } catch {\n return String(v);\n }\n}\n"]}