@theokit/sdk 4.50.0 → 4.51.1

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 (308) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/dist/agent-2KSLHB6B.cjs +57 -0
  3. package/dist/{agent-JA4ILE5O.cjs.map → agent-2KSLHB6B.cjs.map} +1 -1
  4. package/dist/agent-QWNWBCQZ.js +48 -0
  5. package/dist/{agent-GKX5FE5K.js.map → agent-QWNWBCQZ.js.map} +1 -1
  6. package/dist/agent-session-store-EPX2WQI4.cjs +23 -0
  7. package/dist/{agent-session-store-EPUERCUU.cjs.map → agent-session-store-EPX2WQI4.cjs.map} +1 -1
  8. package/dist/agent-session-store-JMU7ASDB.js +6 -0
  9. package/dist/{agent-session-store-TXP5ZVOD.js.map → agent-session-store-JMU7ASDB.js.map} +1 -1
  10. package/dist/auth/index.cjs +16 -16
  11. package/dist/auth/index.js +4 -4
  12. package/dist/{batch-OUF4N2TM.js → batch-NLIS4QTW.js} +9 -9
  13. package/dist/{batch-OUF4N2TM.js.map → batch-NLIS4QTW.js.map} +1 -1
  14. package/dist/{batch-URTEXK77.cjs → batch-WQ3AJCDV.cjs} +26 -26
  15. package/dist/{batch-URTEXK77.cjs.map → batch-WQ3AJCDV.cjs.map} +1 -1
  16. package/dist/{chunk-NETYW4V3.cjs → chunk-2CFEET3Y.cjs} +4 -4
  17. package/dist/{chunk-NETYW4V3.cjs.map → chunk-2CFEET3Y.cjs.map} +1 -1
  18. package/dist/{chunk-74VVGK7P.cjs → chunk-2S7IB4O3.cjs} +24 -24
  19. package/dist/{chunk-74VVGK7P.cjs.map → chunk-2S7IB4O3.cjs.map} +1 -1
  20. package/dist/{chunk-YULF6FPB.cjs → chunk-2YGIBOUH.cjs} +8 -8
  21. package/dist/{chunk-YULF6FPB.cjs.map → chunk-2YGIBOUH.cjs.map} +1 -1
  22. package/dist/{chunk-3NLOQEJR.js → chunk-34XOCZJO.js} +5 -16
  23. package/dist/chunk-34XOCZJO.js.map +1 -0
  24. package/dist/{chunk-FAUKVJCC.cjs → chunk-3BKWFISQ.cjs} +8 -8
  25. package/dist/{chunk-FAUKVJCC.cjs.map → chunk-3BKWFISQ.cjs.map} +1 -1
  26. package/dist/{chunk-FZ4YMZA3.cjs → chunk-3R4ZCQAZ.cjs} +5 -5
  27. package/dist/{chunk-FZ4YMZA3.cjs.map → chunk-3R4ZCQAZ.cjs.map} +1 -1
  28. package/dist/{chunk-HECR7KF5.cjs → chunk-3YYDHUNH.cjs} +11 -11
  29. package/dist/{chunk-HECR7KF5.cjs.map → chunk-3YYDHUNH.cjs.map} +1 -1
  30. package/dist/{chunk-BRHRQOJA.cjs → chunk-44IISBRZ.cjs} +4 -4
  31. package/dist/{chunk-BRHRQOJA.cjs.map → chunk-44IISBRZ.cjs.map} +1 -1
  32. package/dist/{chunk-PBML2FHN.js → chunk-4X3SBHPK.js} +2 -2
  33. package/dist/chunk-4X3SBHPK.js.map +1 -0
  34. package/dist/{chunk-OLLOUAUJ.js → chunk-5XXUYU3M.js} +3 -3
  35. package/dist/{chunk-OLLOUAUJ.js.map → chunk-5XXUYU3M.js.map} +1 -1
  36. package/dist/{chunk-XARLSCKA.js → chunk-6CSIUJ5W.js} +38 -38
  37. package/dist/chunk-6CSIUJ5W.js.map +1 -0
  38. package/dist/{chunk-KCQUYQ3V.cjs → chunk-6DCTL32L.cjs} +17 -17
  39. package/dist/{chunk-KCQUYQ3V.cjs.map → chunk-6DCTL32L.cjs.map} +1 -1
  40. package/dist/{chunk-EON4YTR6.js → chunk-6PTCKXD3.js} +8 -8
  41. package/dist/{chunk-EON4YTR6.js.map → chunk-6PTCKXD3.js.map} +1 -1
  42. package/dist/{chunk-XR4LPBXH.cjs → chunk-7HQVDLFI.cjs} +9 -9
  43. package/dist/{chunk-XR4LPBXH.cjs.map → chunk-7HQVDLFI.cjs.map} +1 -1
  44. package/dist/{chunk-GNMPCZNN.js → chunk-7TB5U7RK.js} +6 -6
  45. package/dist/{chunk-GNMPCZNN.js.map → chunk-7TB5U7RK.js.map} +1 -1
  46. package/dist/{chunk-7PESI6YD.cjs → chunk-ADVZIC43.cjs} +10 -10
  47. package/dist/{chunk-7PESI6YD.cjs.map → chunk-ADVZIC43.cjs.map} +1 -1
  48. package/dist/{chunk-NNNUQELM.cjs → chunk-AMYY3JHQ.cjs} +9 -9
  49. package/dist/{chunk-NNNUQELM.cjs.map → chunk-AMYY3JHQ.cjs.map} +1 -1
  50. package/dist/{chunk-L4JFQCG4.js → chunk-BKRTYDVN.js} +3 -3
  51. package/dist/{chunk-L4JFQCG4.js.map → chunk-BKRTYDVN.js.map} +1 -1
  52. package/dist/{chunk-MZQHVN7C.js → chunk-BVT6LFQ3.js} +5 -5
  53. package/dist/{chunk-MZQHVN7C.js.map → chunk-BVT6LFQ3.js.map} +1 -1
  54. package/dist/{chunk-UJMEWGO6.cjs → chunk-BWGXYOBZ.cjs} +4 -4
  55. package/dist/{chunk-UJMEWGO6.cjs.map → chunk-BWGXYOBZ.cjs.map} +1 -1
  56. package/dist/{chunk-2S6B5B2A.js → chunk-BXVSBYGW.js} +5 -5
  57. package/dist/{chunk-2S6B5B2A.js.map → chunk-BXVSBYGW.js.map} +1 -1
  58. package/dist/{chunk-AF4BBKIF.js → chunk-C4EU627W.js} +4 -4
  59. package/dist/{chunk-AF4BBKIF.js.map → chunk-C4EU627W.js.map} +1 -1
  60. package/dist/{chunk-VQFSEKU5.js → chunk-CHVSMEKM.js} +3 -3
  61. package/dist/{chunk-VQFSEKU5.js.map → chunk-CHVSMEKM.js.map} +1 -1
  62. package/dist/{chunk-6X2HUT4A.cjs → chunk-CZHPR2G7.cjs} +8 -8
  63. package/dist/{chunk-6X2HUT4A.cjs.map → chunk-CZHPR2G7.cjs.map} +1 -1
  64. package/dist/{chunk-F4RUADRC.js → chunk-DHVNJYTO.js} +3 -3
  65. package/dist/{chunk-F4RUADRC.js.map → chunk-DHVNJYTO.js.map} +1 -1
  66. package/dist/{chunk-UJ7HK7BX.js → chunk-DRRSUUI5.js} +5 -5
  67. package/dist/{chunk-UJ7HK7BX.js.map → chunk-DRRSUUI5.js.map} +1 -1
  68. package/dist/{chunk-S4Q5OMIK.cjs → chunk-E3OCRJU6.cjs} +11 -11
  69. package/dist/{chunk-S4Q5OMIK.cjs.map → chunk-E3OCRJU6.cjs.map} +1 -1
  70. package/dist/{chunk-3KY7MHR4.js → chunk-E6T264NS.js} +3 -3
  71. package/dist/{chunk-3KY7MHR4.js.map → chunk-E6T264NS.js.map} +1 -1
  72. package/dist/{chunk-WCXOKGOQ.cjs → chunk-ECPL5RV6.cjs} +8 -8
  73. package/dist/{chunk-WCXOKGOQ.cjs.map → chunk-ECPL5RV6.cjs.map} +1 -1
  74. package/dist/{chunk-LLE7HPRI.js → chunk-EFXJ5C7X.js} +5 -5
  75. package/dist/{chunk-LLE7HPRI.js.map → chunk-EFXJ5C7X.js.map} +1 -1
  76. package/dist/{chunk-GH52NOCL.cjs → chunk-EQMLJ52C.cjs} +26 -26
  77. package/dist/{chunk-GH52NOCL.cjs.map → chunk-EQMLJ52C.cjs.map} +1 -1
  78. package/dist/{chunk-WIGJGFH4.cjs → chunk-EUBGGYPH.cjs} +5 -5
  79. package/dist/{chunk-WIGJGFH4.cjs.map → chunk-EUBGGYPH.cjs.map} +1 -1
  80. package/dist/{chunk-RBQYHEZD.cjs → chunk-FBZMSLDC.cjs} +4 -4
  81. package/dist/{chunk-RBQYHEZD.cjs.map → chunk-FBZMSLDC.cjs.map} +1 -1
  82. package/dist/{chunk-64TJCXY5.cjs → chunk-FUASIT3E.cjs} +15 -15
  83. package/dist/{chunk-64TJCXY5.cjs.map → chunk-FUASIT3E.cjs.map} +1 -1
  84. package/dist/{chunk-MRKSSN36.js → chunk-HI4ZW62S.js} +3 -3
  85. package/dist/{chunk-MRKSSN36.js.map → chunk-HI4ZW62S.js.map} +1 -1
  86. package/dist/{chunk-O3IZ7JEL.js → chunk-I732VEDW.js} +3 -3
  87. package/dist/{chunk-O3IZ7JEL.js.map → chunk-I732VEDW.js.map} +1 -1
  88. package/dist/{chunk-AZ6FKDQR.js → chunk-ITQ4NO4P.js} +3 -3
  89. package/dist/{chunk-AZ6FKDQR.js.map → chunk-ITQ4NO4P.js.map} +1 -1
  90. package/dist/{chunk-PYM5OUL4.js → chunk-J4RY5DTI.js} +5 -5
  91. package/dist/{chunk-PYM5OUL4.js.map → chunk-J4RY5DTI.js.map} +1 -1
  92. package/dist/{chunk-NOM2YWFP.js → chunk-JJZ4NIAG.js} +5 -5
  93. package/dist/{chunk-NOM2YWFP.js.map → chunk-JJZ4NIAG.js.map} +1 -1
  94. package/dist/{chunk-GC44RATP.cjs → chunk-K42QGAKM.cjs} +10 -10
  95. package/dist/{chunk-GC44RATP.cjs.map → chunk-K42QGAKM.cjs.map} +1 -1
  96. package/dist/{chunk-FRQ6F44U.js → chunk-KIX45IKP.js} +4 -4
  97. package/dist/{chunk-FRQ6F44U.js.map → chunk-KIX45IKP.js.map} +1 -1
  98. package/dist/{chunk-OEFFPR2S.cjs → chunk-KNZU4YO5.cjs} +4 -4
  99. package/dist/{chunk-OEFFPR2S.cjs.map → chunk-KNZU4YO5.cjs.map} +1 -1
  100. package/dist/{chunk-HK4HRLWE.js → chunk-KZBB4YKU.js} +3 -3
  101. package/dist/{chunk-HK4HRLWE.js.map → chunk-KZBB4YKU.js.map} +1 -1
  102. package/dist/{chunk-ZS6SLELQ.js → chunk-L7EGRCKJ.js} +4 -4
  103. package/dist/{chunk-ZS6SLELQ.js.map → chunk-L7EGRCKJ.js.map} +1 -1
  104. package/dist/{chunk-LXKNENHK.js → chunk-MV4TOCUK.js} +3 -3
  105. package/dist/{chunk-LXKNENHK.js.map → chunk-MV4TOCUK.js.map} +1 -1
  106. package/dist/{chunk-PAV4ZPSW.js → chunk-N43XLTHZ.js} +3 -3
  107. package/dist/{chunk-PAV4ZPSW.js.map → chunk-N43XLTHZ.js.map} +1 -1
  108. package/dist/{chunk-QFFNMJAS.cjs → chunk-N6NUMXAJ.cjs} +121 -121
  109. package/dist/{chunk-QFFNMJAS.cjs.map → chunk-N6NUMXAJ.cjs.map} +1 -1
  110. package/dist/{chunk-ZNW2TXLO.js → chunk-NACDF3PK.js} +3 -3
  111. package/dist/{chunk-ZNW2TXLO.js.map → chunk-NACDF3PK.js.map} +1 -1
  112. package/dist/{chunk-27DYRARU.cjs → chunk-NFATC6ZF.cjs} +4 -4
  113. package/dist/{chunk-27DYRARU.cjs.map → chunk-NFATC6ZF.cjs.map} +1 -1
  114. package/dist/{chunk-RJBHWM6D.js → chunk-NOS7PTKP.js} +7 -7
  115. package/dist/{chunk-RJBHWM6D.js.map → chunk-NOS7PTKP.js.map} +1 -1
  116. package/dist/{chunk-NRA36JKG.cjs → chunk-OI6RHLGC.cjs} +11 -11
  117. package/dist/{chunk-NRA36JKG.cjs.map → chunk-OI6RHLGC.cjs.map} +1 -1
  118. package/dist/{chunk-J5RW43IR.js → chunk-OIBHY6JQ.js} +4 -4
  119. package/dist/{chunk-J5RW43IR.js.map → chunk-OIBHY6JQ.js.map} +1 -1
  120. package/dist/{chunk-UU7MAO2D.cjs → chunk-OKLYRPKL.cjs} +4 -16
  121. package/dist/chunk-OKLYRPKL.cjs.map +1 -0
  122. package/dist/{chunk-SNKY3C2L.js → chunk-OZXPA3ME.js} +4 -4
  123. package/dist/{chunk-SNKY3C2L.js.map → chunk-OZXPA3ME.js.map} +1 -1
  124. package/dist/{chunk-35NFZ7QB.js → chunk-PLUCC4N5.js} +3 -3
  125. package/dist/{chunk-35NFZ7QB.js.map → chunk-PLUCC4N5.js.map} +1 -1
  126. package/dist/{chunk-MMZX557L.cjs → chunk-PVBANCWU.cjs} +5 -5
  127. package/dist/{chunk-MMZX557L.cjs.map → chunk-PVBANCWU.cjs.map} +1 -1
  128. package/dist/{chunk-BV42CCRP.cjs → chunk-QLAWEGTZ.cjs} +7 -7
  129. package/dist/{chunk-BV42CCRP.cjs.map → chunk-QLAWEGTZ.cjs.map} +1 -1
  130. package/dist/{chunk-TDDRPFO3.js → chunk-QVIUICFM.js} +9 -9
  131. package/dist/{chunk-TDDRPFO3.js.map → chunk-QVIUICFM.js.map} +1 -1
  132. package/dist/{chunk-HKSSM5RK.js → chunk-R7TKOQMJ.js} +3 -3
  133. package/dist/{chunk-HKSSM5RK.js.map → chunk-R7TKOQMJ.js.map} +1 -1
  134. package/dist/{chunk-HLNLYLNN.cjs → chunk-RAACTJ7C.cjs} +4 -4
  135. package/dist/{chunk-HLNLYLNN.cjs.map → chunk-RAACTJ7C.cjs.map} +1 -1
  136. package/dist/chunk-RIAM53CP.js +22 -0
  137. package/dist/chunk-RIAM53CP.js.map +1 -0
  138. package/dist/{chunk-X2YQP452.cjs → chunk-RTLUZKDL.cjs} +11 -11
  139. package/dist/{chunk-X2YQP452.cjs.map → chunk-RTLUZKDL.cjs.map} +1 -1
  140. package/dist/{chunk-6W4U2G3J.cjs → chunk-SDJYLCJK.cjs} +5 -5
  141. package/dist/{chunk-6W4U2G3J.cjs.map → chunk-SDJYLCJK.cjs.map} +1 -1
  142. package/dist/{chunk-ZHPET3LZ.cjs → chunk-SXSPMRSV.cjs} +2 -2
  143. package/dist/chunk-SXSPMRSV.cjs.map +1 -0
  144. package/dist/{chunk-JA4FEA5Z.cjs → chunk-T6QUCG7L.cjs} +4 -4
  145. package/dist/{chunk-JA4FEA5Z.cjs.map → chunk-T6QUCG7L.cjs.map} +1 -1
  146. package/dist/{chunk-GLEKLAUW.cjs → chunk-T6ZCG5AP.cjs} +12 -12
  147. package/dist/{chunk-GLEKLAUW.cjs.map → chunk-T6ZCG5AP.cjs.map} +1 -1
  148. package/dist/{chunk-ZTEAJAE6.js → chunk-UJ3SXRZZ.js} +3 -3
  149. package/dist/{chunk-ZTEAJAE6.js.map → chunk-UJ3SXRZZ.js.map} +1 -1
  150. package/dist/{chunk-Z6N6SDNR.js → chunk-V2EJLKGA.js} +4 -4
  151. package/dist/{chunk-Z6N6SDNR.js.map → chunk-V2EJLKGA.js.map} +1 -1
  152. package/dist/{chunk-57KX5WTP.cjs → chunk-V45L2OYP.cjs} +9 -9
  153. package/dist/{chunk-57KX5WTP.cjs.map → chunk-V45L2OYP.cjs.map} +1 -1
  154. package/dist/chunk-VKJ7V7EB.cjs +25 -0
  155. package/dist/chunk-VKJ7V7EB.cjs.map +1 -0
  156. package/dist/{chunk-2WB6EIYW.js → chunk-W4FV7JBH.js} +4 -4
  157. package/dist/{chunk-2WB6EIYW.js.map → chunk-W4FV7JBH.js.map} +1 -1
  158. package/dist/{chunk-TJRPNBY5.js → chunk-XGYI2KQH.js} +4 -4
  159. package/dist/{chunk-TJRPNBY5.js.map → chunk-XGYI2KQH.js.map} +1 -1
  160. package/dist/{chunk-TSK4VVBW.cjs → chunk-XI4L45SS.cjs} +301 -301
  161. package/dist/chunk-XI4L45SS.cjs.map +1 -0
  162. package/dist/{chunk-4JRRFRV4.cjs → chunk-XK54DTRF.cjs} +4 -4
  163. package/dist/{chunk-4JRRFRV4.cjs.map → chunk-XK54DTRF.cjs.map} +1 -1
  164. package/dist/{chunk-6FSQ3CHQ.js → chunk-XWCTBGYK.js} +6 -7
  165. package/dist/chunk-XWCTBGYK.js.map +1 -0
  166. package/dist/{chunk-XA3TSBAH.cjs → chunk-YTO5BRBD.cjs} +10 -11
  167. package/dist/chunk-YTO5BRBD.cjs.map +1 -0
  168. package/dist/{chunk-JO76RWCA.cjs → chunk-Z5U2JGEK.cjs} +11 -11
  169. package/dist/{chunk-JO76RWCA.cjs.map → chunk-Z5U2JGEK.cjs.map} +1 -1
  170. package/dist/{chunk-Q4DTGCSD.js → chunk-ZSJPRPN7.js} +3 -3
  171. package/dist/{chunk-Q4DTGCSD.js.map → chunk-ZSJPRPN7.js.map} +1 -1
  172. package/dist/compact-session-AAFICMPQ.cjs +56 -0
  173. package/dist/{compact-session-UUCBTBCZ.cjs.map → compact-session-AAFICMPQ.cjs.map} +1 -1
  174. package/dist/compact-session-LR73ESZX.js +19 -0
  175. package/dist/{compact-session-GF2CBKXB.js.map → compact-session-LR73ESZX.js.map} +1 -1
  176. package/dist/compaction.cjs +16 -16
  177. package/dist/compaction.js +3 -3
  178. package/dist/concurrency.cjs +6 -6
  179. package/dist/concurrency.js +4 -4
  180. package/dist/context/index.cjs +6 -5
  181. package/dist/context/index.cjs.map +1 -1
  182. package/dist/context/index.js +3 -2
  183. package/dist/context/index.js.map +1 -1
  184. package/dist/context-4HGPCOH6.cjs +22 -0
  185. package/dist/{context-2G4375BZ.cjs.map → context-4HGPCOH6.cjs.map} +1 -1
  186. package/dist/context-DCECDKWN.js +5 -0
  187. package/dist/{context-GSQYVVMJ.js.map → context-DCECDKWN.js.map} +1 -1
  188. package/dist/cron.cjs +33 -32
  189. package/dist/cron.js +32 -31
  190. package/dist/errors.cjs +21 -21
  191. package/dist/errors.js +2 -2
  192. package/dist/eval.cjs +38 -37
  193. package/dist/eval.cjs.map +1 -1
  194. package/dist/eval.js +32 -31
  195. package/dist/eval.js.map +1 -1
  196. package/dist/{executor-VQLTQY53.js → executor-3CGPLVJL.js} +7 -7
  197. package/dist/{executor-VQLTQY53.js.map → executor-3CGPLVJL.js.map} +1 -1
  198. package/dist/{executor-CB75B5BH.cjs → executor-4SW7QGZ4.cjs} +24 -24
  199. package/dist/{executor-CB75B5BH.cjs.map → executor-4SW7QGZ4.cjs.map} +1 -1
  200. package/dist/filesystem/index.cjs +8 -7
  201. package/dist/filesystem/index.cjs.map +1 -1
  202. package/dist/filesystem/index.js +4 -3
  203. package/dist/filesystem/index.js.map +1 -1
  204. package/dist/fs-session-store-2TF3ZWMT.js +10 -0
  205. package/dist/{fs-session-store-ZNUYZHYI.js.map → fs-session-store-2TF3ZWMT.js.map} +1 -1
  206. package/dist/fs-session-store-TL4RJTXZ.cjs +19 -0
  207. package/dist/{fs-session-store-MAZV5FXJ.cjs.map → fs-session-store-TL4RJTXZ.cjs.map} +1 -1
  208. package/dist/generate-object-E465DX5I.cjs +20 -0
  209. package/dist/{generate-object-6PWGH5DZ.cjs.map → generate-object-E465DX5I.cjs.map} +1 -1
  210. package/dist/generate-object-TVQCW2IZ.js +7 -0
  211. package/dist/{generate-object-IXMJ7FUX.js.map → generate-object-TVQCW2IZ.js.map} +1 -1
  212. package/dist/index-manager-EA6FGIQG.js +12 -0
  213. package/dist/{index-manager-X5IPG2JL.js.map → index-manager-EA6FGIQG.js.map} +1 -1
  214. package/dist/index-manager-HGGL4DD5.cjs +21 -0
  215. package/dist/{index-manager-YFFEPISE.cjs.map → index-manager-HGGL4DD5.cjs.map} +1 -1
  216. package/dist/index.cjs +226 -134
  217. package/dist/index.cjs.map +1 -1
  218. package/dist/index.d.cts +239 -1
  219. package/dist/index.d.ts +239 -1
  220. package/dist/index.js +131 -46
  221. package/dist/index.js.map +1 -1
  222. package/dist/{inject-session-NR64GB3T.js → inject-session-6ZAFN7F7.js} +7 -7
  223. package/dist/{inject-session-NR64GB3T.js.map → inject-session-6ZAFN7F7.js.map} +1 -1
  224. package/dist/{inject-session-I3HK3AHB.cjs → inject-session-KOGUD6KM.cjs} +9 -9
  225. package/dist/{inject-session-I3HK3AHB.cjs.map → inject-session-KOGUD6KM.cjs.map} +1 -1
  226. package/dist/internal/memory/adapters/index.cjs +9 -8
  227. package/dist/internal/memory/adapters/index.js +8 -7
  228. package/dist/internal/persistence/index.cjs +25 -25
  229. package/dist/internal/persistence/index.js +6 -6
  230. package/dist/internal/security/index.cjs +14 -13
  231. package/dist/internal/security/index.js +4 -3
  232. package/dist/judge-call-GVIJWQVE.cjs +22 -0
  233. package/dist/{judge-call-J5EETJL3.cjs.map → judge-call-GVIJWQVE.cjs.map} +1 -1
  234. package/dist/judge-call-QMKGC2ZK.js +5 -0
  235. package/dist/{judge-call-3QZO5H5N.js.map → judge-call-QMKGC2ZK.js.map} +1 -1
  236. package/dist/models.cjs +20 -20
  237. package/dist/models.js +5 -5
  238. package/dist/path-safety.cjs +11 -10
  239. package/dist/path-safety.js +4 -3
  240. package/dist/persistence.cjs +28 -28
  241. package/dist/persistence.js +8 -8
  242. package/dist/project.cjs +5 -5
  243. package/dist/project.js +3 -3
  244. package/dist/registry-GC7BQMSV.js +9 -0
  245. package/dist/{registry-PPFMCM4A.js.map → registry-GC7BQMSV.js.map} +1 -1
  246. package/dist/registry-UBY26R4I.cjs +46 -0
  247. package/dist/{registry-KB3TS6BM.cjs.map → registry-UBY26R4I.cjs.map} +1 -1
  248. package/dist/retry.cjs +4 -4
  249. package/dist/retry.js +3 -3
  250. package/dist/sandbox/index.cjs +6 -6
  251. package/dist/sandbox/index.js +2 -2
  252. package/dist/server/errors-envelope.cjs +14 -14
  253. package/dist/server/errors-envelope.js +3 -3
  254. package/dist/session-transcript-SKIRBEJE.js +5 -0
  255. package/dist/{session-transcript-7FWTO4BK.js.map → session-transcript-SKIRBEJE.js.map} +1 -1
  256. package/dist/session-transcript-TNAJ4O3M.cjs +50 -0
  257. package/dist/{session-transcript-FYRKWRWV.cjs.map → session-transcript-TNAJ4O3M.cjs.map} +1 -1
  258. package/dist/skills.cjs +8 -7
  259. package/dist/skills.js +6 -5
  260. package/dist/stream-object-QMNR3YFF.js +7 -0
  261. package/dist/{stream-object-NPJXDZXO.js.map → stream-object-QMNR3YFF.js.map} +1 -1
  262. package/dist/stream-object-T4DAMNVB.cjs +20 -0
  263. package/dist/{stream-object-3R3HZPQN.cjs.map → stream-object-T4DAMNVB.cjs.map} +1 -1
  264. package/dist/subagents-loader-3CXBQWWY.cjs +15 -0
  265. package/dist/{subagents-loader-FDXPBBRA.cjs.map → subagents-loader-3CXBQWWY.cjs.map} +1 -1
  266. package/dist/subagents-loader-WN2SB6PV.js +6 -0
  267. package/dist/{subagents-loader-5KQVYUNS.js.map → subagents-loader-WN2SB6PV.js.map} +1 -1
  268. package/dist/subagents-loader.cjs +6 -6
  269. package/dist/subagents-loader.js +4 -4
  270. package/dist/subscription/index.cjs +3 -3
  271. package/dist/subscription/index.js +2 -2
  272. package/dist/task-store.cjs +7 -7
  273. package/dist/task-store.js +4 -4
  274. package/dist/workflow.cjs +28 -27
  275. package/dist/workflow.js +7 -6
  276. package/package.json +1 -1
  277. package/dist/agent-GKX5FE5K.js +0 -47
  278. package/dist/agent-JA4ILE5O.cjs +0 -56
  279. package/dist/agent-session-store-EPUERCUU.cjs +0 -23
  280. package/dist/agent-session-store-TXP5ZVOD.js +0 -6
  281. package/dist/chunk-3NLOQEJR.js.map +0 -1
  282. package/dist/chunk-6FSQ3CHQ.js.map +0 -1
  283. package/dist/chunk-PBML2FHN.js.map +0 -1
  284. package/dist/chunk-TSK4VVBW.cjs.map +0 -1
  285. package/dist/chunk-UU7MAO2D.cjs.map +0 -1
  286. package/dist/chunk-XA3TSBAH.cjs.map +0 -1
  287. package/dist/chunk-XARLSCKA.js.map +0 -1
  288. package/dist/chunk-ZHPET3LZ.cjs.map +0 -1
  289. package/dist/compact-session-GF2CBKXB.js +0 -18
  290. package/dist/compact-session-UUCBTBCZ.cjs +0 -55
  291. package/dist/context-2G4375BZ.cjs +0 -22
  292. package/dist/context-GSQYVVMJ.js +0 -5
  293. package/dist/fs-session-store-MAZV5FXJ.cjs +0 -19
  294. package/dist/fs-session-store-ZNUYZHYI.js +0 -10
  295. package/dist/generate-object-6PWGH5DZ.cjs +0 -20
  296. package/dist/generate-object-IXMJ7FUX.js +0 -7
  297. package/dist/index-manager-X5IPG2JL.js +0 -11
  298. package/dist/index-manager-YFFEPISE.cjs +0 -20
  299. package/dist/judge-call-3QZO5H5N.js +0 -5
  300. package/dist/judge-call-J5EETJL3.cjs +0 -22
  301. package/dist/registry-KB3TS6BM.cjs +0 -46
  302. package/dist/registry-PPFMCM4A.js +0 -9
  303. package/dist/session-transcript-7FWTO4BK.js +0 -5
  304. package/dist/session-transcript-FYRKWRWV.cjs +0 -50
  305. package/dist/stream-object-3R3HZPQN.cjs +0 -20
  306. package/dist/stream-object-NPJXDZXO.js +0 -7
  307. package/dist/subagents-loader-5KQVYUNS.js +0 -6
  308. package/dist/subagents-loader-FDXPBBRA.cjs +0 -15
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/filesystem/types.ts","../../src/filesystem/local-filesystem.ts"],"names":["fsReadFile","fsWriteFile","fsStat"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Filesystem backend protocol — a pluggable file *storage* provider for agent\n * tools, the storage-side twin of {@link SandboxBackend} (execution-side).\n *\n * SE31 (a peer framework Workspaces comparison). Mirrors `SandboxBackend`'s shape: a small\n * set of abstract methods (`readFile` / `writeFile` / `stat` / `list`) with\n * `exists()` derived on the base class, a boundary `basePath`, a `readOnly`\n * flag, and typed errors. Unlike `SandboxBackend` (whose file ops shell out via\n * `execute`, requiring command execution and giving NO structured `stat`), a\n * `FilesystemBackend` serves a *filesystem-only* workspace with no sandbox and\n * exposes a real `stat().mtimeMs` — the primitive SE32's read-before-write\n * safety compares against. See ADR 0011.\n *\n * New backends (S3, GCS, in-memory) implement the four abstract methods; higher\n * level helpers derive on the base. This is the backend *seam* — it does NOT\n * ship agent-facing tools nor a bundled workspace (bring-your-own-tools stands).\n *\n * @public\n */\n\n/** Structured file metadata. `mtimeMs` is the read-before-write oracle (SE32). */\nexport interface FileStat {\n readonly size: number;\n readonly mtimeMs: number;\n readonly isFile: boolean;\n readonly isDirectory: boolean;\n}\n\n/** Options a write may carry. SE32 adds `expectedMtime` (stale-write guard). */\nexport interface WriteFileOptions {\n /**\n * SE32 — when set, the write fails with {@link StaleFileError} if the file's\n * current `mtimeMs` differs (someone changed it since it was last read).\n */\n readonly expectedMtime?: number;\n}\n\nexport interface FilesystemConfig {\n /** Boundary root. Every path is resolved within it; escapes are rejected. */\n readonly basePath?: string;\n /** When true, every write throws {@link FilesystemReadOnlyError}. */\n readonly readOnly?: boolean;\n}\n\n/** A path escaped the backend's `basePath` (traversal or symlink). */\nexport class FilesystemSecurityError extends Error {\n readonly code = \"filesystem_security\" as const;\n constructor(message: string) {\n super(message);\n this.name = \"FilesystemSecurityError\";\n }\n}\n\n/** A write was attempted on a read-only backend. */\nexport class FilesystemReadOnlyError extends Error {\n readonly code = \"filesystem_readonly\" as const;\n constructor(message: string) {\n super(message);\n this.name = \"FilesystemReadOnlyError\";\n }\n}\n\n/** A read/stat targeted a path that does not exist. */\nexport class FileNotFoundError extends Error {\n readonly code = \"filesystem_not_found\" as const;\n constructor(public readonly path: string) {\n super(`File not found: ${path}`);\n this.name = \"FileNotFoundError\";\n }\n}\n\n/**\n * A filesystem I/O operation failed for a reason other than not-found /\n * read-only / stale / security (e.g. `ENOTDIR` — a path component is a file, or\n * `EACCES` / `ENOSPC`). Carries the original error as `cause` so no raw,\n * untyped Node `SystemError` ever escapes the backend (Unbreakable Rule 8).\n */\nexport class FilesystemError extends Error {\n readonly code = \"filesystem_io\" as const;\n constructor(\n public readonly path: string,\n cause: unknown,\n ) {\n super(\n `Filesystem operation failed on \"${path}\": ${(cause as { message?: string })?.message ?? cause}`,\n {\n cause,\n },\n );\n this.name = \"FilesystemError\";\n }\n}\n\n/**\n * SE32 — a write's `expectedMtime` did not match the file's current mtime: the\n * file changed since it was last read, so the write would silently clobber.\n */\nexport class StaleFileError extends Error {\n readonly code = \"filesystem_stale\" as const;\n constructor(\n public readonly path: string,\n public readonly expectedMtime: number,\n public readonly actualMtime: number,\n ) {\n super(\n `Stale write to \"${path}\": expected mtime ${expectedMtime}, found ${actualMtime} ` +\n `(file changed since last read — re-read before writing)`,\n );\n this.name = \"StaleFileError\";\n }\n}\n\n/**\n * Pluggable filesystem backend. Implement the four abstract methods; `exists()`\n * and the `readOnly`/`basePath` accessors derive on the base class.\n *\n * @public\n */\nexport abstract class FilesystemBackend {\n protected readonly _basePath: string;\n protected readonly _readOnly: boolean;\n\n constructor(config: FilesystemConfig = {}) {\n this._basePath = config.basePath ?? process.cwd();\n this._readOnly = config.readOnly ?? false;\n }\n\n /** Read a boundary-relative file as UTF-8. Throws {@link FileNotFoundError}. */\n abstract readFile(path: string): Promise<string>;\n\n /**\n * Write UTF-8 content to a boundary-relative path (creating parents). Returns\n * the new {@link FileStat}. Throws {@link FilesystemReadOnlyError} on a\n * read-only backend and {@link StaleFileError} when `opts.expectedMtime`\n * mismatches (SE32).\n */\n abstract writeFile(path: string, content: string, opts?: WriteFileOptions): Promise<FileStat>;\n\n /** Structured metadata for a path. Throws {@link FileNotFoundError}. */\n abstract stat(path: string): Promise<FileStat>;\n\n /** Directory entry names (not recursive). Throws {@link FileNotFoundError}. */\n abstract list(path: string): Promise<string[]>;\n\n /** Derived — true iff `stat(path)` resolves (absent ⇒ false). */\n async exists(path: string): Promise<boolean> {\n try {\n await this.stat(path);\n return true;\n } catch (err) {\n if (err instanceof FileNotFoundError) return false;\n throw err;\n }\n }\n\n /** Throw {@link FilesystemReadOnlyError} when the backend is read-only. */\n protected assertWritable(): void {\n if (this._readOnly) {\n throw new FilesystemReadOnlyError(`Filesystem is read-only (basePath: ${this._basePath})`);\n }\n }\n\n get readOnly(): boolean {\n return this._readOnly;\n }\n\n get basePath(): string {\n return this._basePath;\n }\n}\n\n/**\n * A backend OR a per-request resolver of one. A resolver runs at tool-execution\n * time (the request scope), so multi-tenant / multi-role agents get a distinct\n * root or permission set per request without a shared mutable backend.\n *\n * @public\n */\nexport type FilesystemProvider<Ctx = unknown> =\n | FilesystemBackend\n | ((ctx: Ctx) => FilesystemBackend | Promise<FilesystemBackend>);\n\n/** Resolve a {@link FilesystemProvider} to a concrete backend for `ctx`. */\nexport async function resolveFilesystem<Ctx>(\n provider: FilesystemProvider<Ctx>,\n ctx: Ctx,\n): Promise<FilesystemBackend> {\n return provider instanceof FilesystemBackend ? provider : provider(ctx);\n}\n","/**\n * LocalFilesystem — a {@link FilesystemBackend} over the local process\n * filesystem (`node:fs/promises`), boundary-enforced against `basePath`.\n *\n * **This is NOT an isolation boundary** (same OS, same user). Its safety\n * affordances are path-boundary enforcement (traversal + symlink escape,\n * reusing the core `internal/security/path-guard` primitives) and the optional\n * `readOnly` flag. For untrusted code, run it inside a container/VM sandbox.\n *\n * The check-then-use gap between `assertNoSymlinkEscape` and the subsequent\n * `fs` call is a known TOCTOU: a local attacker could atomically swap an\n * in-boundary symlink after the check. Closing it needs `O_NOFOLLOW`, which\n * Node's `fs/promises` does not expose — accepted for same-user local contexts.\n *\n * SE31 (a peer framework Workspaces comparison). See ADR 0011.\n *\n * @public\n */\n\nimport {\n readFile as fsReadFile,\n stat as fsStat,\n writeFile as fsWriteFile,\n mkdir,\n readdir,\n} from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\n\nimport {\n assertNoSymlinkEscape,\n PathTraversalError,\n safePathJoin,\n} from \"../internal/security/path-guard.js\";\nimport {\n FileNotFoundError,\n type FileStat,\n FilesystemBackend,\n type FilesystemConfig,\n FilesystemError,\n FilesystemSecurityError,\n StaleFileError,\n type WriteFileOptions,\n} from \"./types.js\";\n\nexport class LocalFilesystem extends FilesystemBackend {\n constructor(config: FilesystemConfig = {}) {\n super(config);\n }\n\n async readFile(path: string): Promise<string> {\n const abs = this.resolve(path);\n try {\n return await fsReadFile(abs, \"utf-8\");\n } catch (err) {\n throw this.mapError(err, path);\n }\n }\n\n async writeFile(path: string, content: string, opts?: WriteFileOptions): Promise<FileStat> {\n // Security boundary FIRST (a traversal path on a read-only backend must\n // report the security error, not the read-only one — fail-clear).\n const abs = this.resolve(path);\n this.assertWritable();\n // SE32 — stale-write guard: if the caller passed the mtime it last read,\n // reject when the file changed underneath it (never a silent clobber).\n if (opts?.expectedMtime !== undefined) {\n await this.assertNotStale(path, abs, opts.expectedMtime);\n }\n try {\n await mkdir(dirname(abs), { recursive: true });\n await fsWriteFile(abs, content, \"utf-8\");\n } catch (err) {\n throw this.mapError(err, path);\n }\n return this.statAbs(abs, path);\n }\n\n async stat(path: string): Promise<FileStat> {\n const abs = this.resolve(path);\n return this.statAbs(abs, path);\n }\n\n async list(path: string): Promise<string[]> {\n const abs = this.resolve(path);\n try {\n return await readdir(abs);\n } catch (err) {\n throw this.mapError(err, path);\n }\n }\n\n private async statAbs(abs: string, relPath: string): Promise<FileStat> {\n try {\n const s = await fsStat(abs);\n return {\n size: s.size,\n mtimeMs: s.mtimeMs,\n isFile: s.isFile(),\n isDirectory: s.isDirectory(),\n };\n } catch (err) {\n throw this.mapError(err, relPath);\n }\n }\n\n /** SE32 — compare the on-disk mtime against the caller's expected value. */\n private async assertNotStale(relPath: string, abs: string, expectedMtime: number): Promise<void> {\n let current: number | undefined;\n try {\n current = (await fsStat(abs)).mtimeMs;\n } catch (err) {\n // A brand-new file (does not exist yet) cannot be stale — allow the write.\n if ((err as { code?: string }).code === \"ENOENT\") return;\n throw this.mapError(err, relPath);\n }\n if (current !== expectedMtime) {\n throw new StaleFileError(relPath, expectedMtime, current);\n }\n }\n\n /**\n * Resolve a boundary-relative path to an absolute one, rejecting lexical\n * traversal (`..`, absolute, NUL) and symlink escape — both reusing the core\n * path-guard primitives, remapped to {@link FilesystemSecurityError}.\n */\n private resolve(path: string): string {\n let abs: string;\n try {\n abs = safePathJoin(this._basePath, path);\n } catch (err) {\n if (err instanceof PathTraversalError) {\n throw new FilesystemSecurityError(`Path escapes basePath: ${path}`);\n }\n throw err;\n }\n try {\n assertNoSymlinkEscape(abs, this._basePath);\n } catch (err) {\n if (err instanceof PathTraversalError) {\n throw new FilesystemSecurityError(`Path escapes basePath via symlink: ${path}`);\n }\n throw err;\n }\n return abs;\n }\n\n private mapError(err: unknown, path: string): Error {\n if (\n err instanceof FilesystemSecurityError ||\n err instanceof FilesystemError ||\n err instanceof FileNotFoundError ||\n err instanceof StaleFileError\n ) {\n return err;\n }\n if ((err as { code?: string }).code === \"ENOENT\") return new FileNotFoundError(path);\n // ENOTDIR (a path component is a file), EACCES, ENOSPC, … — never leak a\n // raw untyped Node SystemError (Rule 8); wrap with the original as cause.\n return new FilesystemError(path, err);\n }\n}\n"]}
1
+ {"version":3,"sources":["../../src/filesystem/types.ts","../../src/filesystem/local-filesystem.ts"],"names":["fsReadFile","fsWriteFile","fsStat"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Filesystem backend protocol — a pluggable file *storage* provider for agent\n * tools, the storage-side twin of {@link SandboxBackend} (execution-side).\n *\n * SE31 (a peer framework Workspaces comparison). Mirrors `SandboxBackend`'s shape: a small\n * set of abstract methods (`readFile` / `writeFile` / `stat` / `list`) with\n * `exists()` derived on the base class, a boundary `basePath`, a `readOnly`\n * flag, and typed errors. Unlike `SandboxBackend` (whose file ops shell out via\n * `execute`, requiring command execution and giving NO structured `stat`), a\n * `FilesystemBackend` serves a *filesystem-only* workspace with no sandbox and\n * exposes a real `stat().mtimeMs` — the primitive SE32's read-before-write\n * safety compares against. See ADR 0011.\n *\n * New backends (S3, GCS, in-memory) implement the four abstract methods; higher\n * level helpers derive on the base. This is the backend *seam* — it does NOT\n * ship agent-facing tools nor a bundled workspace (bring-your-own-tools stands).\n *\n * @public\n */\n\n/** Structured file metadata. `mtimeMs` is the read-before-write oracle (SE32). */\nexport interface FileStat {\n readonly size: number;\n readonly mtimeMs: number;\n readonly isFile: boolean;\n readonly isDirectory: boolean;\n}\n\n/** Options a write may carry. SE32 adds `expectedMtime` (stale-write guard). */\nexport interface WriteFileOptions {\n /**\n * SE32 — when set, the write fails with {@link StaleFileError} if the file's\n * current `mtimeMs` differs (someone changed it since it was last read).\n */\n readonly expectedMtime?: number;\n}\n\nexport interface FilesystemConfig {\n /** Boundary root. Every path is resolved within it; escapes are rejected. */\n readonly basePath?: string;\n /** When true, every write throws {@link FilesystemReadOnlyError}. */\n readonly readOnly?: boolean;\n}\n\n/** A path escaped the backend's `basePath` (traversal or symlink). */\nexport class FilesystemSecurityError extends Error {\n readonly code = \"filesystem_security\" as const;\n constructor(message: string) {\n super(message);\n this.name = \"FilesystemSecurityError\";\n }\n}\n\n/** A write was attempted on a read-only backend. */\nexport class FilesystemReadOnlyError extends Error {\n readonly code = \"filesystem_readonly\" as const;\n constructor(message: string) {\n super(message);\n this.name = \"FilesystemReadOnlyError\";\n }\n}\n\n/** A read/stat targeted a path that does not exist. */\nexport class FileNotFoundError extends Error {\n readonly code = \"filesystem_not_found\" as const;\n constructor(public readonly path: string) {\n super(`File not found: ${path}`);\n this.name = \"FileNotFoundError\";\n }\n}\n\n/**\n * A filesystem I/O operation failed for a reason other than not-found /\n * read-only / stale / security (e.g. `ENOTDIR` — a path component is a file, or\n * `EACCES` / `ENOSPC`). Carries the original error as `cause` so no raw,\n * untyped Node `SystemError` ever escapes the backend (Unbreakable Rule 8).\n */\nexport class FilesystemError extends Error {\n readonly code = \"filesystem_io\" as const;\n constructor(\n public readonly path: string,\n cause: unknown,\n ) {\n super(\n `Filesystem operation failed on \"${path}\": ${(cause as { message?: string })?.message ?? cause}`,\n {\n cause,\n },\n );\n this.name = \"FilesystemError\";\n }\n}\n\n/**\n * SE32 — a write's `expectedMtime` did not match the file's current mtime: the\n * file changed since it was last read, so the write would silently clobber.\n */\nexport class StaleFileError extends Error {\n readonly code = \"filesystem_stale\" as const;\n constructor(\n public readonly path: string,\n public readonly expectedMtime: number,\n public readonly actualMtime: number,\n ) {\n super(\n `Stale write to \"${path}\": expected mtime ${expectedMtime}, found ${actualMtime} ` +\n `(file changed since last read — re-read before writing)`,\n );\n this.name = \"StaleFileError\";\n }\n}\n\n/**\n * Pluggable filesystem backend. Implement the four abstract methods; `exists()`\n * and the `readOnly`/`basePath` accessors derive on the base class.\n *\n * @public\n */\nexport abstract class FilesystemBackend {\n protected readonly _basePath: string;\n protected readonly _readOnly: boolean;\n\n constructor(config: FilesystemConfig = {}) {\n this._basePath = config.basePath ?? process.cwd();\n this._readOnly = config.readOnly ?? false;\n }\n\n /** Read a boundary-relative file as UTF-8. Throws {@link FileNotFoundError}. */\n abstract readFile(path: string): Promise<string>;\n\n /**\n * Write UTF-8 content to a boundary-relative path (creating parents). Returns\n * the new {@link FileStat}. Throws {@link FilesystemReadOnlyError} on a\n * read-only backend and {@link StaleFileError} when `opts.expectedMtime`\n * mismatches (SE32).\n */\n abstract writeFile(path: string, content: string, opts?: WriteFileOptions): Promise<FileStat>;\n\n /** Structured metadata for a path. Throws {@link FileNotFoundError}. */\n abstract stat(path: string): Promise<FileStat>;\n\n /** Directory entry names (not recursive). Throws {@link FileNotFoundError}. */\n abstract list(path: string): Promise<string[]>;\n\n /** Derived — true iff `stat(path)` resolves (absent ⇒ false). */\n async exists(path: string): Promise<boolean> {\n try {\n await this.stat(path);\n return true;\n } catch (err) {\n if (err instanceof FileNotFoundError) return false;\n throw err;\n }\n }\n\n /** Throw {@link FilesystemReadOnlyError} when the backend is read-only. */\n protected assertWritable(): void {\n if (this._readOnly) {\n throw new FilesystemReadOnlyError(`Filesystem is read-only (basePath: ${this._basePath})`);\n }\n }\n\n get readOnly(): boolean {\n return this._readOnly;\n }\n\n get basePath(): string {\n return this._basePath;\n }\n}\n\n/**\n * A backend OR a per-request resolver of one. A resolver runs at tool-execution\n * time (the request scope), so multi-tenant / multi-role agents get a distinct\n * root or permission set per request without a shared mutable backend.\n *\n * @public\n */\nexport type FilesystemProvider<Ctx = unknown> =\n | FilesystemBackend\n | ((ctx: Ctx) => FilesystemBackend | Promise<FilesystemBackend>);\n\n/** Resolve a {@link FilesystemProvider} to a concrete backend for `ctx`. */\nexport async function resolveFilesystem<Ctx>(\n provider: FilesystemProvider<Ctx>,\n ctx: Ctx,\n): Promise<FilesystemBackend> {\n return provider instanceof FilesystemBackend ? provider : provider(ctx);\n}\n","/**\n * LocalFilesystem — a {@link FilesystemBackend} over the local process\n * filesystem (`node:fs/promises`), boundary-enforced against `basePath`.\n *\n * **This is NOT an isolation boundary** (same OS, same user). Its safety\n * affordances are path-boundary enforcement (traversal + symlink escape,\n * reusing the core `internal/security/path-guard` primitives) and the optional\n * `readOnly` flag. For untrusted code, run it inside a container/VM sandbox.\n *\n * The check-then-use gap between `assertNoSymlinkEscape` and the subsequent\n * `fs` call is a known TOCTOU: a local attacker could atomically swap an\n * in-boundary symlink after the check. Closing it needs `O_NOFOLLOW`, which\n * Node's `fs/promises` does not expose — accepted for same-user local contexts.\n *\n * SE31 (a peer framework Workspaces comparison). See ADR 0011.\n *\n * @public\n */\n\nimport {\n readFile as fsReadFile,\n stat as fsStat,\n writeFile as fsWriteFile,\n mkdir,\n readdir,\n} from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\n\nimport {\n assertNoSymlinkEscape,\n PathTraversalError,\n safePathJoin,\n} from \"../internal/security/path-guard.js\";\nimport {\n FileNotFoundError,\n type FileStat,\n FilesystemBackend,\n type FilesystemConfig,\n FilesystemError,\n FilesystemSecurityError,\n StaleFileError,\n type WriteFileOptions,\n} from \"./types.js\";\n\nexport class LocalFilesystem extends FilesystemBackend {\n constructor(config: FilesystemConfig = {}) {\n super(config);\n }\n\n async readFile(path: string): Promise<string> {\n const abs = this.resolve(path);\n try {\n return await fsReadFile(abs, \"utf-8\");\n } catch (err) {\n throw this.mapError(err, path);\n }\n }\n\n async writeFile(path: string, content: string, opts?: WriteFileOptions): Promise<FileStat> {\n // Security boundary FIRST (a traversal path on a read-only backend must\n // report the security error, not the read-only one — fail-clear).\n const abs = this.resolve(path);\n this.assertWritable();\n // SE32 — stale-write guard: if the caller passed the mtime it last read,\n // reject when the file changed underneath it (never a silent clobber).\n if (opts?.expectedMtime !== undefined) {\n await this.assertNotStale(path, abs, opts.expectedMtime);\n }\n try {\n await mkdir(dirname(abs), { recursive: true });\n await fsWriteFile(abs, content, \"utf-8\");\n } catch (err) {\n throw this.mapError(err, path);\n }\n return this.statAbs(abs, path);\n }\n\n async stat(path: string): Promise<FileStat> {\n const abs = this.resolve(path);\n return this.statAbs(abs, path);\n }\n\n async list(path: string): Promise<string[]> {\n const abs = this.resolve(path);\n try {\n return await readdir(abs);\n } catch (err) {\n throw this.mapError(err, path);\n }\n }\n\n private async statAbs(abs: string, relPath: string): Promise<FileStat> {\n try {\n const s = await fsStat(abs);\n return {\n size: s.size,\n mtimeMs: s.mtimeMs,\n isFile: s.isFile(),\n isDirectory: s.isDirectory(),\n };\n } catch (err) {\n throw this.mapError(err, relPath);\n }\n }\n\n /** SE32 — compare the on-disk mtime against the caller's expected value. */\n private async assertNotStale(relPath: string, abs: string, expectedMtime: number): Promise<void> {\n let current: number | undefined;\n try {\n current = (await fsStat(abs)).mtimeMs;\n } catch (err) {\n // A brand-new file (does not exist yet) cannot be stale — allow the write.\n if ((err as { code?: string }).code === \"ENOENT\") return;\n throw this.mapError(err, relPath);\n }\n if (current !== expectedMtime) {\n throw new StaleFileError(relPath, expectedMtime, current);\n }\n }\n\n /**\n * Resolve a boundary-relative path to an absolute one, rejecting lexical\n * traversal (`..`, absolute, NUL) and symlink escape — both reusing the core\n * path-guard primitives, remapped to {@link FilesystemSecurityError}.\n */\n private resolve(path: string): string {\n let abs: string;\n try {\n abs = safePathJoin(this._basePath, path);\n } catch (err) {\n if (err instanceof PathTraversalError) {\n throw new FilesystemSecurityError(`Path escapes basePath: ${path}`);\n }\n throw err;\n }\n try {\n assertNoSymlinkEscape(abs, this._basePath);\n } catch (err) {\n if (err instanceof PathTraversalError) {\n throw new FilesystemSecurityError(`Path escapes basePath via symlink: ${path}`);\n }\n throw err;\n }\n return abs;\n }\n\n private mapError(err: unknown, path: string): Error {\n if (\n err instanceof FilesystemSecurityError ||\n err instanceof FilesystemError ||\n err instanceof FileNotFoundError ||\n err instanceof StaleFileError\n ) {\n return err;\n }\n if ((err as { code?: string }).code === \"ENOENT\") return new FileNotFoundError(path);\n // ENOTDIR (a path component is a file), EACCES, ENOSPC, … — never leak a\n // raw untyped Node SystemError (Rule 8); wrap with the original as cause.\n return new FilesystemError(path, err);\n }\n}\n"]}
@@ -0,0 +1,10 @@
1
+ export { FsSessionStore } from './chunk-J4RY5DTI.js';
2
+ import './chunk-R7TKOQMJ.js';
3
+ import './chunk-C4EU627W.js';
4
+ import './chunk-NACDF3PK.js';
5
+ import './chunk-2XLKLVVR.js';
6
+ import './chunk-CHVSMEKM.js';
7
+ import './chunk-HI4ZW62S.js';
8
+ import './chunk-4X3SBHPK.js';
9
+ //# sourceMappingURL=fs-session-store-2TF3ZWMT.js.map
10
+ //# sourceMappingURL=fs-session-store-2TF3ZWMT.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"fs-session-store-ZNUYZHYI.js"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"fs-session-store-2TF3ZWMT.js"}
@@ -0,0 +1,19 @@
1
+ 'use strict';
2
+
3
+ var chunkOI6RHLGC_cjs = require('./chunk-OI6RHLGC.cjs');
4
+ require('./chunk-T6QUCG7L.cjs');
5
+ require('./chunk-ECPL5RV6.cjs');
6
+ require('./chunk-SDJYLCJK.cjs');
7
+ require('./chunk-YLQQX5W2.cjs');
8
+ require('./chunk-2CFEET3Y.cjs');
9
+ require('./chunk-2YGIBOUH.cjs');
10
+ require('./chunk-SXSPMRSV.cjs');
11
+
12
+
13
+
14
+ Object.defineProperty(exports, "FsSessionStore", {
15
+ enumerable: true,
16
+ get: function () { return chunkOI6RHLGC_cjs.FsSessionStore; }
17
+ });
18
+ //# sourceMappingURL=fs-session-store-TL4RJTXZ.cjs.map
19
+ //# sourceMappingURL=fs-session-store-TL4RJTXZ.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"fs-session-store-MAZV5FXJ.cjs"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"fs-session-store-TL4RJTXZ.cjs"}
@@ -0,0 +1,20 @@
1
+ 'use strict';
2
+
3
+ var chunkK42QGAKM_cjs = require('./chunk-K42QGAKM.cjs');
4
+ require('./chunk-EUBGGYPH.cjs');
5
+ require('./chunk-WJVHMTKB.cjs');
6
+ require('./chunk-2YGIBOUH.cjs');
7
+ require('./chunk-SXSPMRSV.cjs');
8
+
9
+
10
+
11
+ Object.defineProperty(exports, "GenerateObjectError", {
12
+ enumerable: true,
13
+ get: function () { return chunkK42QGAKM_cjs.GenerateObjectError; }
14
+ });
15
+ Object.defineProperty(exports, "generateObjectImpl", {
16
+ enumerable: true,
17
+ get: function () { return chunkK42QGAKM_cjs.generateObjectImpl; }
18
+ });
19
+ //# sourceMappingURL=generate-object-E465DX5I.cjs.map
20
+ //# sourceMappingURL=generate-object-E465DX5I.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"generate-object-6PWGH5DZ.cjs"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"generate-object-E465DX5I.cjs"}
@@ -0,0 +1,7 @@
1
+ export { GenerateObjectError, generateObjectImpl } from './chunk-PLUCC4N5.js';
2
+ import './chunk-I732VEDW.js';
3
+ import './chunk-4VPXM6UU.js';
4
+ import './chunk-HI4ZW62S.js';
5
+ import './chunk-4X3SBHPK.js';
6
+ //# sourceMappingURL=generate-object-TVQCW2IZ.js.map
7
+ //# sourceMappingURL=generate-object-TVQCW2IZ.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"generate-object-IXMJ7FUX.js"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"generate-object-TVQCW2IZ.js"}
@@ -0,0 +1,12 @@
1
+ export { IndexManager } from './chunk-NOS7PTKP.js';
2
+ import './chunk-OXNYIMZZ.js';
3
+ import './chunk-FD2UT76F.js';
4
+ import './chunk-W4FV7JBH.js';
5
+ import './chunk-2XLKLVVR.js';
6
+ import './chunk-CHVSMEKM.js';
7
+ import './chunk-XWCTBGYK.js';
8
+ import './chunk-RIAM53CP.js';
9
+ import './chunk-HI4ZW62S.js';
10
+ import './chunk-4X3SBHPK.js';
11
+ //# sourceMappingURL=index-manager-EA6FGIQG.js.map
12
+ //# sourceMappingURL=index-manager-EA6FGIQG.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"index-manager-X5IPG2JL.js"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"index-manager-EA6FGIQG.js"}
@@ -0,0 +1,21 @@
1
+ 'use strict';
2
+
3
+ var chunkEQMLJ52C_cjs = require('./chunk-EQMLJ52C.cjs');
4
+ require('./chunk-2RW7K6FN.cjs');
5
+ require('./chunk-MUUQ2WFJ.cjs');
6
+ require('./chunk-QLAWEGTZ.cjs');
7
+ require('./chunk-YLQQX5W2.cjs');
8
+ require('./chunk-2CFEET3Y.cjs');
9
+ require('./chunk-YTO5BRBD.cjs');
10
+ require('./chunk-VKJ7V7EB.cjs');
11
+ require('./chunk-2YGIBOUH.cjs');
12
+ require('./chunk-SXSPMRSV.cjs');
13
+
14
+
15
+
16
+ Object.defineProperty(exports, "IndexManager", {
17
+ enumerable: true,
18
+ get: function () { return chunkEQMLJ52C_cjs.IndexManager; }
19
+ });
20
+ //# sourceMappingURL=index-manager-HGGL4DD5.cjs.map
21
+ //# sourceMappingURL=index-manager-HGGL4DD5.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"index-manager-YFFEPISE.cjs"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"index-manager-HGGL4DD5.cjs"}